Add emoji URL support, and Twemoji fallback for displaying slugs in wp-admin, when the browser doesn't natively support emoji.
Props pento, SergeyBiryukov and boonebgorges. Fixes #31328 Built from https://develop.svn.wordpress.org/trunk@31734 git-svn-id: http://core.svn.wordpress.org/trunk@31715 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
46e2a65cf1
commit
03ade8c011
|
@ -117,7 +117,7 @@ inlineEditPost = {
|
||||||
},
|
},
|
||||||
|
|
||||||
edit : function(id) {
|
edit : function(id) {
|
||||||
var t = this, fields, editRow, rowData, status, pageOpt, pageLevel, nextPage, pageLoop = true, nextLevel, cur_format, f;
|
var t = this, fields, editRow, rowData, status, pageOpt, pageLevel, nextPage, pageLoop = true, nextLevel, cur_format, f, val;
|
||||||
t.revert();
|
t.revert();
|
||||||
|
|
||||||
if ( typeof(id) === 'object' ) {
|
if ( typeof(id) === 'object' ) {
|
||||||
|
@ -155,7 +155,11 @@ inlineEditPost = {
|
||||||
});
|
});
|
||||||
|
|
||||||
for ( f = 0; f < fields.length; f++ ) {
|
for ( f = 0; f < fields.length; f++ ) {
|
||||||
$(':input[name="' + fields[f] + '"]', editRow).val( $('.'+fields[f], rowData).text() );
|
val = $('.'+fields[f], rowData);
|
||||||
|
// Deal with Twemoji
|
||||||
|
val.find( 'img' ).replaceWith( function() { return this.alt; } );
|
||||||
|
val = val.text();
|
||||||
|
$(':input[name="' + fields[f] + '"]', editRow).val( val );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $( '.comment_status', rowData ).text() === 'open' ) {
|
if ( $( '.comment_status', rowData ).text() === 'open' ) {
|
||||||
|
@ -181,11 +185,14 @@ inlineEditPost = {
|
||||||
|
|
||||||
//flat taxonomies
|
//flat taxonomies
|
||||||
$('.tags_input', rowData).each(function(){
|
$('.tags_input', rowData).each(function(){
|
||||||
var terms = $(this).text(),
|
var terms = $(this),
|
||||||
taxname = $(this).attr('id').replace('_' + id, ''),
|
taxname = $(this).attr('id').replace('_' + id, ''),
|
||||||
textarea = $('textarea.tax_input_' + taxname, editRow),
|
textarea = $('textarea.tax_input_' + taxname, editRow),
|
||||||
comma = inlineEditL10n.comma;
|
comma = inlineEditL10n.comma;
|
||||||
|
|
||||||
|
terms.find( 'img' ).replaceWith( function() { return this.alt; } );
|
||||||
|
terms = terms.text();
|
||||||
|
|
||||||
if ( terms ) {
|
if ( terms ) {
|
||||||
if ( ',' !== comma ) {
|
if ( ',' !== comma ) {
|
||||||
terms = terms.replace(/,/g, comma);
|
terms = terms.replace(/,/g, comma);
|
||||||
|
@ -265,6 +272,9 @@ inlineEditPost = {
|
||||||
if ( -1 !== r.indexOf( '<tr' ) ) {
|
if ( -1 !== r.indexOf( '<tr' ) ) {
|
||||||
$(inlineEditPost.what+id).siblings('tr.hidden').addBack().remove();
|
$(inlineEditPost.what+id).siblings('tr.hidden').addBack().remove();
|
||||||
$('#edit-'+id).before(r).remove();
|
$('#edit-'+id).before(r).remove();
|
||||||
|
if ( WPEmoji ) {
|
||||||
|
WPEmoji.parse( $( inlineEditPost.what + id ).get( 0 ) );
|
||||||
|
}
|
||||||
$(inlineEditPost.what+id).hide().fadeIn();
|
$(inlineEditPost.what+id).hide().fadeIn();
|
||||||
} else {
|
} else {
|
||||||
r = r.replace( /<.[^<>]*?>/g, '' );
|
r = r.replace( /<.[^<>]*?>/g, '' );
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -45,7 +45,7 @@ inlineEditTax = {
|
||||||
},
|
},
|
||||||
|
|
||||||
edit : function(id) {
|
edit : function(id) {
|
||||||
var editRow, rowData,
|
var editRow, rowData, val,
|
||||||
t = this;
|
t = this;
|
||||||
t.revert();
|
t.revert();
|
||||||
|
|
||||||
|
@ -58,8 +58,15 @@ inlineEditTax = {
|
||||||
|
|
||||||
$(t.what+id).hide().before(editRow).before('<tr class="hidden"></tr>');
|
$(t.what+id).hide().before(editRow).before('<tr class="hidden"></tr>');
|
||||||
|
|
||||||
$(':input[name="name"]', editRow).val( $('.name', rowData).text() );
|
val = $('.name', rowData);
|
||||||
$(':input[name="slug"]', editRow).val( $('.slug', rowData).text() );
|
val.find( 'img' ).replaceWith( function() { return this.alt; } );
|
||||||
|
val = val.text();
|
||||||
|
$(':input[name="name"]', editRow).val( val );
|
||||||
|
|
||||||
|
val = $('.slug', rowData);
|
||||||
|
val.find( 'img' ).replaceWith( function() { return this.alt; } );
|
||||||
|
val = val.text();
|
||||||
|
$(':input[name="slug"]', editRow).val( val );
|
||||||
|
|
||||||
$(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();
|
$(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();
|
||||||
$('.ptitle', editRow).eq(0).focus();
|
$('.ptitle', editRow).eq(0).focus();
|
||||||
|
@ -110,6 +117,10 @@ inlineEditTax = {
|
||||||
// Update the value in the Parent dropdown.
|
// Update the value in the Parent dropdown.
|
||||||
$( '#parent' ).find( 'option[value=' + option_value + ']' ).text( row.find( '.row-title' ).text() );
|
$( '#parent' ).find( 'option[value=' + option_value + ']' ).text( row.find( '.row-title' ).text() );
|
||||||
|
|
||||||
|
if ( WPEmoji ) {
|
||||||
|
WPEmoji.parse( row.get( 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
row.hide().fadeIn();
|
row.hide().fadeIn();
|
||||||
} else {
|
} else {
|
||||||
$('#edit-'+id+' .inline-edit-save .error').html(r).show();
|
$('#edit-'+id+' .inline-edit-save .error').html(r).show();
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
var inlineEditTax;!function(a){inlineEditTax={init:function(){var b=this,c=a("#inline-edit");b.type=a("#the-list").attr("data-wp-lists").substr(5),b.what="#"+b.type+"-",a("#the-list").on("click","a.editinline",function(){return inlineEditTax.edit(this),!1}),c.keyup(function(a){return 27===a.which?inlineEditTax.revert():void 0}),a("a.cancel",c).click(function(){return inlineEditTax.revert()}),a("a.save",c).click(function(){return inlineEditTax.save(this)}),a("input, select",c).keydown(function(a){return 13===a.which?inlineEditTax.save(this):void 0}),a('#posts-filter input[type="submit"]').mousedown(function(){b.revert()})},toggle:function(b){var c=this;"none"===a(c.what+c.getId(b)).css("display")?c.revert():c.edit(b)},edit:function(b){var c,d,e=this;return e.revert(),"object"==typeof b&&(b=e.getId(b)),c=a("#inline-edit").clone(!0),d=a("#inline_"+b),a("td",c).attr("colspan",a(".widefat:first thead th:visible").length),a(e.what+b).hide().before(c).before('<tr class="hidden"></tr>'),a(':input[name="name"]',c).val(a(".name",d).text()),a(':input[name="slug"]',c).val(a(".slug",d).text()),a(c).attr("id","edit-"+b).addClass("inline-editor").show(),a(".ptitle",c).eq(0).focus(),!1},save:function(b){var c,d,e=a('input[name="taxonomy"]').val()||"";return"object"==typeof b&&(b=this.getId(b)),a("table.widefat .spinner").show(),c={action:"inline-save-tax",tax_type:this.type,tax_ID:b,taxonomy:e},d=a("#edit-"+b).find(":input").serialize(),c=d+"&"+a.param(c),a.post(ajaxurl,c,function(c){var d,e,f;a("table.widefat .spinner").hide(),c?-1!==c.indexOf("<tr")?(a(inlineEditTax.what+b).siblings("tr.hidden").addBack().remove(),e=a(c).attr("id"),a("#edit-"+b).before(c).remove(),e?(f=e.replace(inlineEditTax.type+"-",""),d=a("#"+e)):(f=b,d=a(inlineEditTax.what+b)),a("#parent").find("option[value="+f+"]").text(d.find(".row-title").text()),d.hide().fadeIn()):a("#edit-"+b+" .inline-edit-save .error").html(c).show():a("#edit-"+b+" .inline-edit-save .error").html(inlineEditL10n.error).show()}),!1},revert:function(){var b=a("table.widefat tr.inline-editor").attr("id");return b&&(a("table.widefat .spinner").hide(),a("#"+b).siblings("tr.hidden").addBack().remove(),b=b.substr(b.lastIndexOf("-")+1),a(this.what+b).show()),!1},getId:function(b){var c="TR"===b.tagName?b.id:a(b).parents("tr").attr("id"),d=c.split("-");return d[d.length-1]}},a(document).ready(function(){inlineEditTax.init()})}(jQuery);
|
var inlineEditTax;!function(a){inlineEditTax={init:function(){var b=this,c=a("#inline-edit");b.type=a("#the-list").attr("data-wp-lists").substr(5),b.what="#"+b.type+"-",a("#the-list").on("click","a.editinline",function(){return inlineEditTax.edit(this),!1}),c.keyup(function(a){return 27===a.which?inlineEditTax.revert():void 0}),a("a.cancel",c).click(function(){return inlineEditTax.revert()}),a("a.save",c).click(function(){return inlineEditTax.save(this)}),a("input, select",c).keydown(function(a){return 13===a.which?inlineEditTax.save(this):void 0}),a('#posts-filter input[type="submit"]').mousedown(function(){b.revert()})},toggle:function(b){var c=this;"none"===a(c.what+c.getId(b)).css("display")?c.revert():c.edit(b)},edit:function(b){var c,d,e,f=this;return f.revert(),"object"==typeof b&&(b=f.getId(b)),c=a("#inline-edit").clone(!0),d=a("#inline_"+b),a("td",c).attr("colspan",a(".widefat:first thead th:visible").length),a(f.what+b).hide().before(c).before('<tr class="hidden"></tr>'),e=a(".name",d),e.find("img").replaceWith(function(){return this.alt}),e=e.text(),a(':input[name="name"]',c).val(e),e=a(".slug",d),e.find("img").replaceWith(function(){return this.alt}),e=e.text(),a(':input[name="slug"]',c).val(e),a(c).attr("id","edit-"+b).addClass("inline-editor").show(),a(".ptitle",c).eq(0).focus(),!1},save:function(b){var c,d,e=a('input[name="taxonomy"]').val()||"";return"object"==typeof b&&(b=this.getId(b)),a("table.widefat .spinner").show(),c={action:"inline-save-tax",tax_type:this.type,tax_ID:b,taxonomy:e},d=a("#edit-"+b).find(":input").serialize(),c=d+"&"+a.param(c),a.post(ajaxurl,c,function(c){var d,e,f;a("table.widefat .spinner").hide(),c?-1!==c.indexOf("<tr")?(a(inlineEditTax.what+b).siblings("tr.hidden").addBack().remove(),e=a(c).attr("id"),a("#edit-"+b).before(c).remove(),e?(f=e.replace(inlineEditTax.type+"-",""),d=a("#"+e)):(f=b,d=a(inlineEditTax.what+b)),a("#parent").find("option[value="+f+"]").text(d.find(".row-title").text()),WPEmoji&&WPEmoji.parse(d.get(0)),d.hide().fadeIn()):a("#edit-"+b+" .inline-edit-save .error").html(c).show():a("#edit-"+b+" .inline-edit-save .error").html(inlineEditL10n.error).show()}),!1},revert:function(){var b=a("table.widefat tr.inline-editor").attr("id");return b&&(a("table.widefat .spinner").hide(),a("#"+b).siblings("tr.hidden").addBack().remove(),b=b.substr(b.lastIndexOf("-")+1),a(this.what+b).show()),!1},getId:function(b){var c="TR"===b.tagName?b.id:a(b).parents("tr").attr("id"),d=c.split("-");return d[d.length-1]}},a(document).ready(function(){inlineEditTax.init()})}(jQuery);
|
|
@ -712,7 +712,11 @@ jQuery(document).ready( function($) {
|
||||||
revert_slug = real_slug.val(),
|
revert_slug = real_slug.val(),
|
||||||
b = $('#edit-slug-buttons'),
|
b = $('#edit-slug-buttons'),
|
||||||
revert_b = b.html(),
|
revert_b = b.html(),
|
||||||
full = $('#editable-post-name-full').html();
|
full = $('#editable-post-name-full');
|
||||||
|
|
||||||
|
// Deal with Twemoji in the post-name
|
||||||
|
full.find( 'img' ).replaceWith( function() { return this.alt; } );
|
||||||
|
full = full.html();
|
||||||
|
|
||||||
$('#view-post-btn').hide();
|
$('#view-post-btn').hide();
|
||||||
b.html('<a href="#" class="save button button-small">'+postL10n.ok+'</a> <a class="cancel" href="#">'+postL10n.cancel+'</a>');
|
b.html('<a href="#" class="save button button-small">'+postL10n.ok+'</a> <a class="cancel" href="#">'+postL10n.cancel+'</a>');
|
||||||
|
@ -736,6 +740,11 @@ jQuery(document).ready( function($) {
|
||||||
box.removeClass('hidden');
|
box.removeClass('hidden');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( WPEmoji ) {
|
||||||
|
WPEmoji.parse( box.get( 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
b.html(revert_b);
|
b.html(revert_b);
|
||||||
real_slug.val(new_slug);
|
real_slug.val(new_slug);
|
||||||
$('#view-post-btn').show();
|
$('#view-post-btn').show();
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -49,6 +49,10 @@ jQuery(document).ready(function($) {
|
||||||
else
|
else
|
||||||
$( '.tags' ).prepend( res.responses[0].supplemental.parents ); // As the parent is not visible, Insert the version with Parent - Child - ThisTerm
|
$( '.tags' ).prepend( res.responses[0].supplemental.parents ); // As the parent is not visible, Insert the version with Parent - Child - ThisTerm
|
||||||
|
|
||||||
|
if ( WPEmoji ) {
|
||||||
|
WPEmoji.parse( $( '.tags' ).get( 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
$('.tags .no-items').remove();
|
$('.tags .no-items').remove();
|
||||||
|
|
||||||
if ( form.find('select#parent') ) {
|
if ( form.find('select#parent') ) {
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
jQuery(document).ready(function(a){a("#the-list").on("click",".delete-tag",function(){var b,c=a(this),d=c.parents("tr"),e=!0;return"undefined"!=showNotice&&(e=showNotice.warn()),e&&(b=c.attr("href").replace(/[^?]*\?/,"").replace(/action=delete/,"action=delete-tag"),a.post(ajaxurl,b,function(c){"1"==c?(a("#ajax-response").empty(),d.fadeOut("normal",function(){d.remove()}),a('select#parent option[value="'+b.match(/tag_ID=(\d+)/)[1]+'"]').remove(),a("a.tag-link-"+b.match(/tag_ID=(\d+)/)[1]).remove()):"-1"==c?(a("#ajax-response").empty().append('<div class="error"><p>'+tagsl10n.noPerm+"</p></div>"),d.children().css("backgroundColor","")):(a("#ajax-response").empty().append('<div class="error"><p>'+tagsl10n.broken+"</p></div>"),d.children().css("backgroundColor",""))}),d.children().css("backgroundColor","#f33")),!1}),a("#submit").click(function(){var b=a(this).parents("form");return validateForm(b)?(a.post(ajaxurl,a("#addtag").serialize(),function(c){var d,e,f,g,h;if(a("#ajax-response").empty(),d=wpAjax.parseAjaxResponse(c,"ajax-response"),d&&!d.errors){if(e=b.find("select#parent").val(),e>0&&a("#tag-"+e).length>0?a(".tags #tag-"+e).after(d.responses[0].supplemental.noparents):a(".tags").prepend(d.responses[0].supplemental.parents),a(".tags .no-items").remove(),b.find("select#parent")){for(f=d.responses[1].supplemental,g="",h=0;h<d.responses[1].position;h++)g+=" ";b.find("select#parent option:selected").after('<option value="'+f.term_id+'">'+g+f.name+"</option>")}a('input[type="text"]:visible, textarea:visible',b).val("")}}),!1):!1})});
|
jQuery(document).ready(function(a){a("#the-list").on("click",".delete-tag",function(){var b,c=a(this),d=c.parents("tr"),e=!0;return"undefined"!=showNotice&&(e=showNotice.warn()),e&&(b=c.attr("href").replace(/[^?]*\?/,"").replace(/action=delete/,"action=delete-tag"),a.post(ajaxurl,b,function(c){"1"==c?(a("#ajax-response").empty(),d.fadeOut("normal",function(){d.remove()}),a('select#parent option[value="'+b.match(/tag_ID=(\d+)/)[1]+'"]').remove(),a("a.tag-link-"+b.match(/tag_ID=(\d+)/)[1]).remove()):"-1"==c?(a("#ajax-response").empty().append('<div class="error"><p>'+tagsl10n.noPerm+"</p></div>"),d.children().css("backgroundColor","")):(a("#ajax-response").empty().append('<div class="error"><p>'+tagsl10n.broken+"</p></div>"),d.children().css("backgroundColor",""))}),d.children().css("backgroundColor","#f33")),!1}),a("#submit").click(function(){var b=a(this).parents("form");return validateForm(b)?(a.post(ajaxurl,a("#addtag").serialize(),function(c){var d,e,f,g,h;if(a("#ajax-response").empty(),d=wpAjax.parseAjaxResponse(c,"ajax-response"),d&&!d.errors){if(e=b.find("select#parent").val(),e>0&&a("#tag-"+e).length>0?a(".tags #tag-"+e).after(d.responses[0].supplemental.noparents):a(".tags").prepend(d.responses[0].supplemental.parents),WPEmoji&&WPEmoji.parse(a(".tags").get(0)),a(".tags .no-items").remove(),b.find("select#parent")){for(f=d.responses[1].supplemental,g="",h=0;h<d.responses[1].position;h++)g+=" ";b.find("select#parent option:selected").after('<option value="'+f.term_id+'">'+g+f.name+"</option>")}a('input[type="text"]:visible, textarea:visible',b).val("")}}),!1):!1})});
|
|
@ -785,21 +785,27 @@ function utf8_uri_encode( $utf8_string, $length = 0 ) {
|
||||||
$unicode .= chr($value);
|
$unicode .= chr($value);
|
||||||
$unicode_length++;
|
$unicode_length++;
|
||||||
} else {
|
} else {
|
||||||
if ( count( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3;
|
if ( count( $values ) == 0 ) {
|
||||||
|
if ( $value < 224 ) {
|
||||||
|
$num_octets = 2;
|
||||||
|
} elseif ( $value < 240 ) {
|
||||||
|
$num_octets = 3;
|
||||||
|
} else {
|
||||||
|
$num_octets = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$values[] = $value;
|
$values[] = $value;
|
||||||
|
|
||||||
if ( $length && ( $unicode_length + ($num_octets * 3) ) > $length )
|
if ( $length && ( $unicode_length + ($num_octets * 3) ) > $length )
|
||||||
break;
|
break;
|
||||||
if ( count( $values ) == $num_octets ) {
|
if ( count( $values ) == $num_octets ) {
|
||||||
if ($num_octets == 3) {
|
for ( $j = 0; $j < $num_octets; $j++ ) {
|
||||||
$unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]) . '%' . dechex($values[2]);
|
$unicode .= '%' . dechex( $values[ $j ] );
|
||||||
$unicode_length += 9;
|
|
||||||
} else {
|
|
||||||
$unicode .= '%' . dechex($values[0]) . '%' . dechex($values[1]);
|
|
||||||
$unicode_length += 6;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$unicode_length += $num_octets * 3;
|
||||||
|
|
||||||
$values = array();
|
$values = array();
|
||||||
$num_octets = 1;
|
$num_octets = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2879,13 +2879,7 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) {
|
||||||
|
|
||||||
$slug_provided = ! empty( $args['slug'] );
|
$slug_provided = ! empty( $args['slug'] );
|
||||||
if ( ! $slug_provided ) {
|
if ( ! $slug_provided ) {
|
||||||
$_name = trim( $name );
|
|
||||||
$existing_term = get_term_by( 'name', $_name, $taxonomy );
|
|
||||||
if ( $existing_term ) {
|
|
||||||
$slug = $existing_term->slug;
|
|
||||||
} else {
|
|
||||||
$slug = sanitize_title( $name );
|
$slug = sanitize_title( $name );
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$slug = $args['slug'];
|
$slug = $args['slug'];
|
||||||
}
|
}
|
||||||
|
@ -2910,20 +2904,14 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Terms with duplicate names are not allowed at the same level of a taxonomy hierarchy.
|
// Terms with duplicate names are not allowed at the same level of a taxonomy hierarchy.
|
||||||
if ( $exists = term_exists( $slug, $taxonomy ) ) {
|
if ( $existing_term = get_term_by( 'name', $name, $taxonomy ) ) {
|
||||||
$existing_term = get_term( $exists['term_id'], $taxonomy );
|
|
||||||
|
|
||||||
if ( $name === $existing_term->name ) {
|
|
||||||
|
|
||||||
if ( is_taxonomy_hierarchical( $taxonomy ) ) {
|
if ( is_taxonomy_hierarchical( $taxonomy ) ) {
|
||||||
$siblings = get_terms( $taxonomy, array( 'fields' => 'names', 'get' => 'all', 'parent' => $parent ) );
|
$siblings = get_terms( $taxonomy, array( 'fields' => 'names', 'get' => 'all', 'parent' => $parent ) );
|
||||||
if ( in_array( $name, $siblings ) ) {
|
if ( in_array( $name, $siblings ) ) {
|
||||||
return new WP_Error( 'term_exists', __( 'A term with the name and slug already exists with this parent.' ), $exists['term_id'] );
|
return new WP_Error( 'term_exists', __( 'A term with the name already exists with this parent.' ), $existing_term->term_id );
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return new WP_Error( 'term_exists', __( 'A term with the name and slug already exists in this taxonomy.' ), $exists['term_id'] );
|
return new WP_Error( 'term_exists', __( 'A term with the name already exists in this taxonomy.' ), $existing_term->term_id );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
*
|
*
|
||||||
* @global string $wp_version
|
* @global string $wp_version
|
||||||
*/
|
*/
|
||||||
$wp_version = '4.2-alpha-31733';
|
$wp_version = '4.2-alpha-31734';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
|
||||||
|
|
Loading…
Reference in New Issue