<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.boywiki.org/media/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=UpgradeTest1</id>
	<title>BoyWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.boywiki.org/media/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=UpgradeTest1"/>
	<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/Special:Contributions/UpgradeTest1"/>
	<updated>2026-06-14T22:37:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8323</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8323"/>
		<updated>2021-12-22T01:29:41Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://www.boywiki.org/media/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/wiki/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
} else {&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=File:Noel,_Ivan._Final_non_sad_goodbye_to_my_friends.mp4&amp;diff=8322</id>
		<title>File:Noel, Ivan. Final non sad goodbye to my friends.mp4</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=File:Noel,_Ivan._Final_non_sad_goodbye_to_my_friends.mp4&amp;diff=8322"/>
		<updated>2021-12-22T01:25:08Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=File:Noel,_Ivan._Final_non_sad_goodbye_to_my_friends.mp4&amp;diff=8321</id>
		<title>File:Noel, Ivan. Final non sad goodbye to my friends.mp4</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=File:Noel,_Ivan._Final_non_sad_goodbye_to_my_friends.mp4&amp;diff=8321"/>
		<updated>2021-12-22T01:24:32Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description=A message by Ivan Noel&lt;br /&gt;
|date=2021-07-22&lt;br /&gt;
|source={{own}}&lt;br /&gt;
|author=[[User:Pochemu|Pochemu]]&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Filedesc&amp;diff=8320</id>
		<title>Template:Filedesc</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Filedesc&amp;diff=8320"/>
		<updated>2021-12-22T01:21:32Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;{{int:filedesc}}&amp;lt;noinclude&amp;gt; {{documentation|Commons:Localization/useful MediaWiki messages/doc}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{int:filedesc}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation|Commons:Localization/useful MediaWiki messages/doc}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8319</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8319"/>
		<updated>2021-12-22T00:52:31Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://www.boywiki.org/media/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/wiki/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    console.log(&amp;quot;orgitems=&amp;quot; + $orgItems);&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      console.log(&amp;quot;if yes&amp;quot;);&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;1&amp;quot;);&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    console.log(&amp;quot;2b &amp;quot; + has_information);&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;4&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    console.log(&amp;quot;5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
    console.log(&amp;quot;6&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  console.log(&amp;quot;cre1&amp;quot;);&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
} else {&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8318</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8318"/>
		<updated>2021-12-22T00:41:03Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://www.boywiki.org/media/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/wiki/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    console.log(&amp;quot;orgitems=&amp;quot; + $orgItems);&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      console.log(&amp;quot;if yes&amp;quot;);&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;1&amp;quot;);&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    console.log(&amp;quot;4&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
    console.log(&amp;quot;5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
    console.log(&amp;quot;6&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  console.log(&amp;quot;cre1&amp;quot;);&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
} else {&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8317</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8317"/>
		<updated>2021-12-22T00:38:02Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://www.boywiki.org/media/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/wiki/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  console.log(&amp;quot;cre1&amp;quot;);&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
  console.log(&amp;quot;cre1x&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
} else {&lt;br /&gt;
  console.log(&amp;quot;cre2&amp;quot;);&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
  console.log(&amp;quot;cre2x&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8316</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8316"/>
		<updated>2021-12-22T00:23:17Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://www.boywiki.org/media/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/wiki/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
} else {&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8315</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8315"/>
		<updated>2021-12-22T00:06:25Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://www.boywiki.org/media/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/w/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    console.log(&amp;quot;StockPhoto.init()&amp;quot;);&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
} else {&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8314</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8314"/>
		<updated>2021-12-21T23:16:43Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://www.boywiki.org/media/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/w/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
} else {&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-state-default-symbol&amp;diff=8313</id>
		<title>MediaWiki:Label-gadget-state-default-symbol</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-state-default-symbol&amp;diff=8313"/>
		<updated>2021-12-21T23:14:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;d&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;d&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-translate&amp;diff=8312</id>
		<title>MediaWiki:Label-gadget-translate</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-translate&amp;diff=8312"/>
		<updated>2021-12-21T23:13:36Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;Translate&amp;amp;nbsp;this&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Translate&amp;amp;nbsp;this&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-discuss&amp;diff=8311</id>
		<title>MediaWiki:Label-gadget-discuss</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-discuss&amp;diff=8311"/>
		<updated>2021-12-21T23:12:53Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;{{int:Talkpagelinktext}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{int:Talkpagelinktext}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-documentation&amp;diff=8310</id>
		<title>MediaWiki:Label-gadget-documentation</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Label-gadget-documentation&amp;diff=8310"/>
		<updated>2021-12-21T23:12:23Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;documentation&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;documentation&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Help:Gadget-Stockphoto&amp;diff=8309</id>
		<title>Help:Gadget-Stockphoto</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Help:Gadget-Stockphoto&amp;diff=8309"/>
		<updated>2021-12-21T23:07:35Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;&amp;lt;languages /&amp;gt; {{Gadget-help|name=Stockphoto|script=Stockphoto|doc=Help:Gadget-Stockphoto|talk=MediaWiki talk:Gadget-Stockphoto.js}} &amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt; The buttons as seen by anonymous users&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt; &amp;lt;!--T:2--&amp;gt; &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Stockphoto&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; is a gadget, enabled by default for all (even anonymous) users.  &amp;lt;!--T:3--&amp;gt; It is meant to help wit...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
{{Gadget-help|name=Stockphoto|script=Stockphoto|doc=Help:Gadget-Stockphoto|talk=MediaWiki talk:Gadget-Stockphoto.js}}&lt;br /&gt;
[[File:Wikimedia Commons - Stockphoto gadget.png|thumb|400px|&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt; The buttons as seen by anonymous users&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Stockphoto&#039;&#039;&#039;&#039;&#039; is a [[&amp;lt;tvar|pefpage&amp;gt;Special:Preferences#mw-prefsection-gadgets&amp;lt;/&amp;gt;|gadget]], enabled by default for all (even anonymous) users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
It is meant to help with media reuse, by adding on file pages buttons helping with credit lines, licensing requirements and code generation.&lt;br /&gt;
&lt;br /&gt;
== Overview == &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Buttons === &amp;lt;!--T:5--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
[[File:Wikimedia Commons - Stockphoto gadget - Use this file on the web.png|thumb|400px|&amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt; The “Use this file on the web” dialog&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt; Several buttons provide credit lines and code snippets&amp;lt;/translate&amp;gt;:&lt;br /&gt;
;&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt; Download&amp;lt;/translate&amp;gt;&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt; Opens a dialog, providing: &amp;quot;Page URL&amp;quot;, &amp;quot;File URL&amp;quot;, credit line (with or without HTML), &amp;quot;Download image file&amp;quot; (providing links to various resolutions)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;translate&amp;gt;&amp;lt;!--T:10--&amp;gt; Use this file on the web&amp;lt;/translate&amp;gt;&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt; Opens a dialog, providing: &amp;quot;Page URL&amp;quot;, &amp;quot;File URL&amp;quot;, credit line (with or without HTML), code snippets in [[:en:BBcode|BBcode]] or HTML to embed the file with the appropriate licensing information.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt; Use this file on a wiki&amp;lt;/translate&amp;gt;&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt; Provides wiki code snippets to use the file on a wiki (e.g. Wikipedia)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt; Email a link&amp;lt;/translate&amp;gt;&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt; Starts an e-mail with a link to the file and a credit line&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;&amp;lt;translate&amp;gt;&amp;lt;!--T:16--&amp;gt; Information&amp;lt;/translate&amp;gt;&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:17--&amp;gt; Redirects to [[&amp;lt;tvar|reuse&amp;gt;Special:MyLanguage/Commons:Reusing content outside Wikimedia&amp;lt;/&amp;gt;|Commons:Reusing content outside Wikimedia]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;=== Appearance === &amp;lt;!--T:18--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt; Anonymous users see the gadget as big buttons on the right of the file, logged-in as a thin bar just above the image.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;=== How does it work? === &amp;lt;!--T:20--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:21--&amp;gt; The gadget relies on [[&amp;lt;tvar|specpage&amp;gt;Commons:Machine-readable data&amp;lt;/&amp;gt;|machine-readable data]] defined by Commons templates.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;== How to turn this feature off == &amp;lt;!--T:31--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{anchor|turnoff}}&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:22--&amp;gt; To turn it &#039;&#039;temporarily&#039;&#039; off, click on the red x (&amp;lt;tvar|illustration&amp;gt;[[File:Emblem-unreadable.svg|20px|x]]&amp;lt;/&amp;gt;) near the buttons. To turn it on again, reload the page and look for a link &#039;&#039;Reuse this file&#039;&#039; directly below the heading/file title.&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:23--&amp;gt; To turn it &#039;&#039;completely&#039;&#039; off,  go to [[&amp;lt;tvar|prefpage&amp;gt;Special:Preferences#mw-prefsection-gadgets&amp;lt;/&amp;gt;|section &amp;lt;tvar|sectionname&amp;gt;{{Localized mw message|Prefs-gadgets}}&amp;lt;/&amp;gt; in your &amp;lt;tvar|prefname&amp;gt;{{Localized mw message|Mypreferences}}&amp;lt;/&amp;gt;]], remove the checkmark ☑ in front of “StockPhoto” and save or {{&amp;lt;tvar|params&amp;gt;DeactivateGadget|page={{FULLPAGENAME}}#turnoff|name=Stockphoto|message=&amp;lt;/&amp;gt;just click here and follow the instructions}}.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;== Background == &amp;lt;!--T:24--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
[[File:GPaumier_multimedia_usability_draft_mock-ups_Oct09.pdf|page=8|thumb|300px|&amp;lt;translate&amp;gt;&amp;lt;!--T:25--&amp;gt; Early design mockups&amp;lt;/translate&amp;gt;]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:26--&amp;gt; The tool was coded by Magnus Manske and introduced in October 2011. The design  was taken from early mockups created by Guillaume Paumier as part of the Wikimedia Foundation Multimedia usability initiative.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;== See also == &amp;lt;!--T:27--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt; [[&amp;lt;tvar|1&amp;gt;Special:MyLanguage/Commons:Machine-readable data&amp;lt;/&amp;gt;|Commons:Machine-readable data]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt; [&amp;lt;tvar|1&amp;gt;https://web.archive.org/web/20130328143112/http://www.gpaumier.org/blog/2010/10/04/reuse-buttons-wikimedia-commons/&amp;lt;/&amp;gt; Recap by Guillaume Paumier]&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:30--&amp;gt; [&amp;lt;tvar|1&amp;gt;http://thread.gmane.org/gmane.org.wikimedia.commons/5639/&amp;lt;/&amp;gt; Problems using pictures from Commons in Blogger - making it more of a stock photo repository] (Commons-l discussion the tool originated from)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Stockphoto gadget]]&lt;br /&gt;
[[Category:Commons gadgets enabled by default]]&lt;br /&gt;
&amp;lt;languages/&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:GetFallback&amp;diff=8308</id>
		<title>Template:GetFallback</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:GetFallback&amp;diff=8308"/>
		<updated>2021-12-21T23:06:45Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;{{#switch: {{#if: {{{1|}}} |{{{1}}}|{{int:Lang}}}} | af | fy | li | nl-informal | vls | zea = nl | arz = ar | be-x-old = be-tarask &amp;lt;!-- same language; be-x-old is used on be-x-old.wikipedia but be-tarask is the preferred code --&amp;gt; | crh-cyrl | crh-latn = crh | ckb | mzn | glk = fa | als | bar | de-formal | de-at | de-ch | frr | ksh = de | hif-deva | hif-latn = hif | ike-cans | ike-latn = ike | kk-arab | kk-cyrl | kk-latn | kk-cn | kk-kz | kk-tr = kk | ku-latn | ku-arab =...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch: {{#if: {{{1|}}} |{{{1}}}|{{int:Lang}}}}&lt;br /&gt;
| af | fy | li | nl-informal | vls | zea = nl&lt;br /&gt;
| arz = ar&lt;br /&gt;
| be-x-old = be-tarask &amp;lt;!-- same language; be-x-old is used on be-x-old.wikipedia but be-tarask is the preferred code --&amp;gt;&lt;br /&gt;
| crh-cyrl | crh-latn = crh&lt;br /&gt;
| ckb | mzn | glk = fa&lt;br /&gt;
| als | bar | de-formal | de-at | de-ch | frr | ksh = de&lt;br /&gt;
| hif-deva | hif-latn = hif&lt;br /&gt;
| ike-cans | ike-latn = ike&lt;br /&gt;
| kk-arab | kk-cyrl | kk-latn | kk-cn | kk-kz | kk-tr = kk&lt;br /&gt;
| ku-latn | ku-arab = ku&lt;br /&gt;
| mg | br | co | frp | ht | ty | wa = fr&lt;br /&gt;
| nds = nds-nl&lt;br /&gt;
| nds-nl | pdt = nds&lt;br /&gt;
| pt-br = pt&lt;br /&gt;
| ruq-cyrl | ruq-grek | ruq-latn = ruq&lt;br /&gt;
| sr-ec | sr-el = sr&lt;br /&gt;
| tg-cyrl | tg-latn = tg&lt;br /&gt;
| tt-cyrl | tt-latn = tt&lt;br /&gt;
| vec = it&lt;br /&gt;
| zh | zh-cn | zh-my | zh-sg = zh-hans&lt;br /&gt;
| zh-hk | zh-mo | zh-tw = zh-hant&lt;br /&gt;
| szl | csb = pl&lt;br /&gt;
| en-gb = en &lt;br /&gt;
| #default = {{#if: {{{default|}}} | {{{default|}}} | en }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Localisation templates]]&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-section-Other&amp;diff=8307</id>
		<title>MediaWiki:Gadget-section-Other</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-section-Other&amp;diff=8307"/>
		<updated>2021-12-21T23:04:30Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;Interface: Other&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Interface: Other&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:Int&amp;diff=8306</id>
		<title>Module:Int</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:Int&amp;diff=8306"/>
		<updated>2021-12-21T22:58:54Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;-- This is a helper module for Template:int local this = {}  function this.renderIntMessage(frame) 	local args = frame.args 	local pargs = (frame:getParent() or {}).args 	local arguments = {} 	for k, v in pairs(pargs) do 		local n = tonumber(k) or 0 		if (n &amp;gt;= 2) then 			arguments[n - 1] = mw.text.trim(v) 		end 	end  	local msg = mw.message.new(mw.text.trim(args[1]), arguments) 	local lang 	if args.lang and args.lang ~= &amp;#039;&amp;#039; and mw.language.isValidCode(args.lang) then...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This is a helper module for [[Template:int]]&lt;br /&gt;
local this = {}&lt;br /&gt;
&lt;br /&gt;
function this.renderIntMessage(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local pargs = (frame:getParent() or {}).args&lt;br /&gt;
	local arguments = {}&lt;br /&gt;
	for k, v in pairs(pargs) do&lt;br /&gt;
		local n = tonumber(k) or 0&lt;br /&gt;
		if (n &amp;gt;= 2) then&lt;br /&gt;
			arguments[n - 1] = mw.text.trim(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local msg = mw.message.new(mw.text.trim(args[1]), arguments)&lt;br /&gt;
	local lang&lt;br /&gt;
	if args.lang and args.lang ~= &#039;&#039; and mw.language.isValidCode(args.lang) then&lt;br /&gt;
		lang = args.lang&lt;br /&gt;
	else&lt;br /&gt;
		lang = mw.getCurrentFrame():preprocess(&#039;{{PAGELANGUAGE}}&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (msg:exists() and not msg:isDisabled()) or lang == &#039;qqx&#039; then&lt;br /&gt;
		local msgstr = msg:inLanguage(lang):plain()&lt;br /&gt;
		return frame:preprocess(msgstr)&lt;br /&gt;
	else&lt;br /&gt;
		return args.missing ~= &#039;&#039;&lt;br /&gt;
			and args.missing&lt;br /&gt;
			or &#039;⧼&#039; .. args[1] .. &#039;⧽&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return this&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Int&amp;diff=8305</id>
		<title>Template:Int</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Int&amp;diff=8305"/>
		<updated>2021-12-21T22:58:27Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;&amp;lt;onlyinclude&amp;gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:Int|renderIntMessage|{{{1}}}|missing={{{missing|}}}|lang={{{lang|}}}}}&amp;lt;/onlyinclude&amp;gt; {{Documentation}} &amp;lt;!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! --&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:Int|renderIntMessage|{{{1}}}|missing={{{missing|}}}|lang={{{lang|}}}}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage and interwikis in Wikidata, not here! --&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Fullurl&amp;diff=8304</id>
		<title>Template:Fullurl</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Fullurl&amp;diff=8304"/>
		<updated>2021-12-21T22:52:25Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;{{#if:{{{protocol|}}}|{{{protocol|}}}:}}{{fullurl:{{FULLPAGENAMEE}}}}&amp;lt;noinclude&amp;gt;   {{Documentation}}   &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{{protocol|}}}|{{{protocol|}}}:}}{{fullurl:{{FULLPAGENAMEE}}}}&amp;lt;noinclude&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Documentation/i18n/en&amp;diff=8303</id>
		<title>Template:Documentation/i18n/en</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Documentation/i18n/en&amp;diff=8303"/>
		<updated>2021-12-21T22:51:49Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;&amp;lt;languages/&amp;gt; &amp;lt;onlyinclude&amp;gt;{{Documentation/layout | lang = {{{lang|{{#invoke:Caller title|lang|base=Template:Documentation/i18n}}}}} &amp;lt;!-- {{Documentation}} parameters: --&amp;gt; |1={{{1|}}} |heading={{{heading|{{{2|}}}}}} |content={{{content|}}} &amp;lt;!-- $1 is automatically replaced by Template:Documentation/layout using {{tmpl}} --&amp;gt; | text = This documentation is transcluded from $1. &amp;lt;!-- DEPRECATED - New translations for these messages go in Dat...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;{{Documentation/layout&lt;br /&gt;
| lang = {{{lang|{{#invoke:Caller title|lang|base=Template:Documentation/i18n}}}}}&lt;br /&gt;
&amp;lt;!-- {{Documentation}} parameters: --&amp;gt;&lt;br /&gt;
|1={{{1|}}}&lt;br /&gt;
|heading={{{heading|{{{2|}}}}}}&lt;br /&gt;
|content={{{content|}}}&lt;br /&gt;
&amp;lt;!-- $1 is automatically replaced by [[Template:Documentation/layout]] using {{tmpl}} --&amp;gt;&lt;br /&gt;
| text = This documentation is [[w:Wikipedia:Transclusion|transcluded]] from $1.&lt;br /&gt;
&amp;lt;!-- DEPRECATED - New translations for these messages go in [[Data:I18n/Documentation.tab]]: --&amp;gt;&lt;br /&gt;
|edit=edit&lt;br /&gt;
|history=history&lt;br /&gt;
|view=view&lt;br /&gt;
|documentation=Documentation&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{translated tag|documentation}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:No_globals&amp;diff=8302</id>
		<title>Module:No globals</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:No_globals&amp;diff=8302"/>
		<updated>2021-12-21T22:47:21Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local mt = getmetatable(_G) or {}&lt;br /&gt;
function mt.__index (t, k)&lt;br /&gt;
	if k ~= &#039;arg&#039; then&lt;br /&gt;
		error(&#039;Tried to read nil global &#039; .. tostring(k), 2)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
function mt.__newindex(t, k, v)&lt;br /&gt;
	if k ~= &#039;arg&#039; then&lt;br /&gt;
		error(&#039;Tried to write global &#039; .. tostring(k), 2)&lt;br /&gt;
	end&lt;br /&gt;
	rawset(t, k, v)&lt;br /&gt;
end&lt;br /&gt;
setmetatable(_G, mt)&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:Information&amp;diff=8300</id>
		<title>Module:Information</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:Information&amp;diff=8300"/>
		<updated>2021-12-21T22:47:21Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[  &lt;br /&gt;
  __  __           _       _        ___        __                            _   _             &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _|_ _|_ __  / _| ___  _ __ _ __ ___   __ _| |_(_) ___  _ __  &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_)| || &#039;_ \| |_ / _ \| &#039;__| &#039;_ ` _ \ / _` | __| |/ _ \| &#039;_ \ &lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_ | || | | |  _| (_) | |  | | | | | | (_| | |_| | (_) | | | |&lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)___|_| |_|_|  \___/|_|  |_| |_| |_|\__,_|\__|_|\___/|_| |_|&lt;br /&gt;
                                                                                               &lt;br /&gt;
This module is intended to be the engine behind &amp;quot;Template:Information&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Please do not modify this code without applying the changes first at&lt;br /&gt;
&amp;quot;Module:Information/sandbox&amp;quot; and testing at &amp;quot;Module:Information/testcases&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Authors and maintainers:&lt;br /&gt;
* User:Jarekt - original version &lt;br /&gt;
]]&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- === Dependencies ======================&lt;br /&gt;
-- =======================================&lt;br /&gt;
require(&#039;Module:No globals&#039;) -- used for debugging purposes as it detects cases of unintended global variables&lt;br /&gt;
local ISOdate = require(&#039;Module:ISOdate&#039;)._ISOdate -- date localization&lt;br /&gt;
local core    = require(&#039;Module:Core&#039;)&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === Internal functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
&lt;br /&gt;
local function langWrapper(text, textLang) &lt;br /&gt;
-- code equivalent to https://commons.wikimedia.org/wiki/Template:Description&lt;br /&gt;
	local language = mw.language.new( textLang )&lt;br /&gt;
	local dir      = language:getDir()  &lt;br /&gt;
	local LangName = language:ucfirst(mw.language.fetchLanguageName( textLang, textLang))&lt;br /&gt;
	local str = mw.ustring.format(&#039;&amp;lt;span class=&amp;quot;language %s&amp;quot;&amp;gt;&amp;lt;b&amp;gt;%s:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&#039;, textLang, LangName)&lt;br /&gt;
    return mw.ustring.format(&#039;&amp;lt;div class=&amp;quot;description mw-content-%s&amp;quot; dir=&amp;quot;%s&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s %s&amp;lt;/div&amp;gt;&#039;, dir, dir, textLang, str, text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
local function getBareLabel(id, userLang) &lt;br /&gt;
-- code equivalent to require(&amp;quot;Module:Wikidata label&amp;quot;)._getLabel with Wikidata=- option&lt;br /&gt;
	local label, link&lt;br /&gt;
	-- build language fallback list&lt;br /&gt;
	local langList = mw.language.getFallbacksFor(userLang)&lt;br /&gt;
	table.insert(langList, 1, userLang)&lt;br /&gt;
	for _, lang in ipairs(langList) do  -- loop over language fallback list looking for label in the specific language&lt;br /&gt;
		label = mw.wikibase.getLabelByLang(id, lang)&lt;br /&gt;
		if label then break end                    -- label found and we are done&lt;br /&gt;
	end	&lt;br /&gt;
	return label or id&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
local function message(name, lang)&lt;br /&gt;
	return mw.message.new( &#039;wm-license-information-&#039;..name ):inLanguage(lang):plain()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ====================================================================&lt;br /&gt;
-- === This function is just responsible for producing HTML of the  ===&lt;br /&gt;
-- === template. At this stage all the fields are already filed     ===&lt;br /&gt;
-- ====================================================================&lt;br /&gt;
local function Build_html(args)&lt;br /&gt;
	local lang = args.lang -- user&#039;s language&lt;br /&gt;
	local dir  = mw.language.new( lang ):getDir()    -- get text direction&lt;br /&gt;
	local desTag = mw.ustring.format(&#039;&amp;lt;span class=&amp;quot;summary fn&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;, args.pagename)&lt;br /&gt;
	local prmTag = mw.ustring.format(&amp;quot;&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;([[%s|%s]])&amp;lt;/small&amp;gt;&amp;quot;, message(&#039;permission-reusing-link&#039;, lang), &lt;br /&gt;
								 message(&#039;permission-reusing-text&#039;, lang))&lt;br /&gt;
&lt;br /&gt;
	-- field specific preferences&lt;br /&gt;
	local params = {&lt;br /&gt;
		{field=&#039;description&#039;    , id=&#039;fileinfotpl_desc&#039;, tag2=desTag, td=&#039;class=&amp;quot;description&amp;quot;&#039;},&lt;br /&gt;
		{field=&#039;other_fields_1&#039;},&lt;br /&gt;
		{field=&#039;date&#039;           , id=&#039;fileinfotpl_date&#039;, td=mw.ustring.format(&#039;lang=&amp;quot;%s&amp;quot;&#039;, lang)},&lt;br /&gt;
		{field=&#039;source&#039;         , id=&#039;fileinfotpl_src&#039;}, &lt;br /&gt;
		{field=&#039;author&#039;         , id=&#039;fileinfotpl_aut&#039;},&lt;br /&gt;
		{field=&#039;permission&#039;     , id=&#039;fileinfotpl_perm&#039;, tag2=prmTag },&lt;br /&gt;
		{field=&#039;other_versions&#039; , id=&#039;fileinfotpl_ver&#039;,  tag=&#039;other-versions&#039;}, &lt;br /&gt;
		{field=&#039;other_fields&#039;},&lt;br /&gt;
	}&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, param in ipairs(params) do&lt;br /&gt;
		local field, tag, cell1, cell2, id&lt;br /&gt;
		field = args[param.field]&lt;br /&gt;
		if param.id then -- skip &amp;quot;other fields&amp;quot; parameter&lt;br /&gt;
			if type(field) == &#039;string&#039; then  -- add &amp;quot;id&amp;quot; to first &amp;lt;td&amp;gt; cell only if the field is present&lt;br /&gt;
				id = mw.ustring.format(&#039;id=&amp;quot;%s&amp;quot; &#039;, param.id)&lt;br /&gt;
			elseif type(field) == &#039;table&#039; then&lt;br /&gt;
				-- the field was initially not present, it contains only our&lt;br /&gt;
				-- warning text; flatten it so that mw.ustring.format() gets a string&lt;br /&gt;
				field = field.missing&lt;br /&gt;
			end&lt;br /&gt;
			if field or (args.demo and param.tag) then  -- skip the row if still no field&lt;br /&gt;
				tag   = message(param.tag or param.field, lang) .. (param.tag2 or &#039;&#039;)&lt;br /&gt;
				cell1 = mw.ustring.format(&#039;&amp;lt;td %sclass=&amp;quot;fileinfo-paramfield&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/td&amp;gt;\n&#039;, id or &#039;&#039;, lang, tag)&lt;br /&gt;
				cell2 = mw.ustring.format(&#039;&amp;lt;td %s&amp;gt;\n%s&amp;lt;/td&amp;gt;&#039;, param.td or &#039;&#039;, field or &#039;&#039;)&lt;br /&gt;
				field = mw.ustring.format(&#039;&amp;lt;tr style=&amp;quot;vertical-align: top&amp;quot;&amp;gt;\n%s%s\n&amp;lt;/tr&amp;gt;\n\n&#039;, cell1, cell2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(results, field)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- add table and outer layers&lt;br /&gt;
	local style = mw.ustring.format(&#039;class=&amp;quot;fileinfotpl-type-information toccolours vevent &#039;..&lt;br /&gt;
		&#039;mw-content-%s&amp;quot; style=&amp;quot;width: 100%%; direction: %s;&amp;quot; cellpadding=&amp;quot;4&amp;quot;&#039;, dir, dir)&lt;br /&gt;
	results = mw.ustring.format(&#039;&amp;lt;table %s&amp;gt;\n\n%s\n&amp;lt;/table&amp;gt;\n&#039;, style, table.concat(results))&lt;br /&gt;
	results = mw.ustring.format(&#039;&amp;lt;div class=&amp;quot;hproduct commons-file-information-table&amp;quot;&amp;gt;\n%s\n&amp;lt;/div&amp;gt;&#039;, results)&lt;br /&gt;
	return results&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === External functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- === Version of the function to be called from other LUA codes&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- _information function creates a wikicode for {{Information}} template based on&lt;br /&gt;
-- passed arguments (through &amp;quot;args&amp;quot;) and data extracted from SDC. Allowed fields of &lt;br /&gt;
-- &amp;quot;args&amp;quot; are : &#039;description&#039;, &#039;date&#039;, &#039;permission&#039;, &#039;author&#039;, &#039;other_versions&#039;,  &lt;br /&gt;
-- &#039;source&#039;,&#039;other_fields&#039;, &#039;other_fields_1&#039;, &#039;demo&#039; and &#039;lang&#039;&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: p._SDC_Description, p._SDC_Source, p._SDC_Author, p._SDC_Date, &lt;br /&gt;
--    Build_html, Module:ISOdate (_date)&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._information(args)&lt;br /&gt;
&lt;br /&gt;
	local cats = &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- ============================================================================================&lt;br /&gt;
	-- === add [[Category:Pages using Information template with incorrect parameter]] if needed ===&lt;br /&gt;
	-- ============================================================================================&lt;br /&gt;
	local page = mw.title.getCurrentTitle()&lt;br /&gt;
	local lang = args.lang&lt;br /&gt;
	local namespace = page.namespace   -- get page namespace&lt;br /&gt;
	if namespace==6 or namespace==10 then&lt;br /&gt;
		local allowedFields = {&#039;description&#039;, &#039;date&#039;, &#039;permission&#039;, &#039;author&#039;, &#039;other_versions&#039;,  &lt;br /&gt;
				&#039;source&#039;,&#039;other_fields&#039;, &#039;other_fields_1&#039;, &#039;demo&#039;, &#039;lang&#039;, &#039;strict&#039;}&lt;br /&gt;
		local set, badField = {}, {}&lt;br /&gt;
		for _, field in ipairs(allowedFields) do set[field] = true end&lt;br /&gt;
		for field, _ in pairs( args ) do &lt;br /&gt;
			if not set[field] then&lt;br /&gt;
				table.insert(badField, field)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if #badField&amp;gt;0 then&lt;br /&gt;
			cats = mw.ustring.format(&#039;\n;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Error in [[Template:Information|{{Information}}&#039;..&lt;br /&gt;
				&#039; template]]: unknown parameter &amp;quot;%s&amp;quot;.&amp;lt;/span&amp;gt;&#039;,  table.concat(badField,&#039;&amp;quot;, &amp;quot;&#039;))&lt;br /&gt;
			cats = cats .. &#039;\n[[Category:Pages using Information template with incorrect parameter]]&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.date then&lt;br /&gt;
		-- apply ISODate to function to date string to convert date in ISO format to translated date string&lt;br /&gt;
		args.date = ISOdate(args.date, lang, &#039;&#039;, &#039;dtstart&#039;, &#039;100-999&#039;)      &lt;br /&gt;
	end &lt;br /&gt;
	args.pagename = page.text&lt;br /&gt;
&lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	-- === harvest structured data                      === &lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	local entity = mw.wikibase.getEntity()&lt;br /&gt;
	if namespace==6 and entity then -- file namespace&lt;br /&gt;
		-- call SDC functions only when needed&lt;br /&gt;
		local icon = true&lt;br /&gt;
		-- local field is missing -&amp;gt; get it from SDC&lt;br /&gt;
		args.description = args.description or p._SDC_Description(entity, lang, icon)  &lt;br /&gt;
		args.source      = args.source      or p._SDC_Source(entity, lang, icon)&lt;br /&gt;
		args.author      = args.author      or p._SDC_Author(entity, lang, icon) &lt;br /&gt;
		args.date        = args.date        or p._SDC_Date(entity, lang, icon)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	-- === add tracking templates and categories        === &lt;br /&gt;
	-- ====================================================&lt;br /&gt;
	-- add the template tag (all official infoboxes transclude {{Infobox template tag}} so files without that tag do not have an infobox&lt;br /&gt;
	mw.getCurrentFrame():expandTemplate{ title = &#039;Infobox template tag&#039; } &lt;br /&gt;
&lt;br /&gt;
	-- files are required to have at least the 3 fields below&lt;br /&gt;
	if args.strict~=false then&lt;br /&gt;
		local reqFields = {description=&#039;Media lacking a description&#039;, author=&#039;Media lacking author information&#039;, source=&#039;Images without source&#039;}&lt;br /&gt;
		for field, errCat in pairs(reqFields) do &lt;br /&gt;
			if args[field] and mw.ustring.match(args[field],&amp;quot;^[%s%p]+$&amp;quot;) then &lt;br /&gt;
				args[field]=nil; &lt;br /&gt;
			end -- ignore punctuation only fields&lt;br /&gt;
			if not args[field] then&lt;br /&gt;
				-- code equivalent to Template:Source missing, Template:Author missing, Template:Description missing&lt;br /&gt;
				local tag1 = &#039;class=&amp;quot;boilerplate metadata&amp;quot; id=&amp;quot;cleanup&amp;quot; style=&amp;quot;text-align: center; background: #ffe; &#039;..&lt;br /&gt;
					&#039;margin: .75em 15%; padding: .5em; border: 1px solid #e3e3b0;&#039;&lt;br /&gt;
				local tag2 = message(field..&#039;-missing&#039;, lang)&lt;br /&gt;
				local tag3 = message(field..&#039;-missing-request&#039;, lang)&lt;br /&gt;
				local dir  = mw.language.new( lang ):getDir()    -- get text direction&lt;br /&gt;
				args[field] = {missing =  mw.ustring.format(&#039;&amp;lt;div %s direction: %s;&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s\n%s\n&amp;lt;/div&amp;gt;&#039;, tag1, dir, lang, tag2, tag3)}&lt;br /&gt;
				cats = cats .. &#039;\n[[Category:&#039;.. errCat ..&#039;]]&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if namespace~=6  then &lt;br /&gt;
		cats = &#039;&#039; -- categories are added only to files&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Build_html(args) .. cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- interface for other Lua codes to 5 functions for extracting description, source,&lt;br /&gt;
-- author, date and location information from SDC. &lt;br /&gt;
-- INPUTS:&lt;br /&gt;
--  - &amp;quot;entity&amp;quot; - structure created by mw.wikibase.getEntity function&lt;br /&gt;
--  - &amp;quot;lang&amp;quot;  - users language&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: langWrapper&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Description(entity, lang, icon)&lt;br /&gt;
	-- create {{en|1=...}} template with SDC&#039;s caption&lt;br /&gt;
	local description, _&lt;br /&gt;
	if entity and entity.labels then -- get label in users language or one of that language fallback list&lt;br /&gt;
		local label = core.langSwitch(entity.labels, lang) &lt;br /&gt;
		local labels, D = {}, {}&lt;br /&gt;
		if label then -- show either matching language&lt;br /&gt;
			labels[lang] = label&lt;br /&gt;
		else -- or if missing then show all&lt;br /&gt;
			labels = entity.labels&lt;br /&gt;
		end&lt;br /&gt;
		for _, label in pairs(labels) do -- add {{en|1=....}} like wrapper&lt;br /&gt;
			if icon and #D==0 then -- add editAtSDC icon to the first description&lt;br /&gt;
				label.value = label.value .. core.editAtSDC(&#039;ooui-php-4&#039;, lang)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(D, langWrapper(label.value, label.language, lang))&lt;br /&gt;
		end &lt;br /&gt;
		description = table.concat(D, &#039;\n&#039;) &lt;br /&gt;
	end&lt;br /&gt;
	return description&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: Module:Wikidata_date &amp;quot;_date&amp;quot; function, Module:ISOdate &amp;quot;_ISOdate&amp;quot; function&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Date(entity, lang, icon)&lt;br /&gt;
	-- get creation date from  P571 (inception)&lt;br /&gt;
	-- Code can handle YYYY-MM-DD, YYYY-MM, and YYYY dates without any additional resources&lt;br /&gt;
	-- But can load [[Module:Wikidata date]] if needed&lt;br /&gt;
	local Date&lt;br /&gt;
	if entity and entity.claims and entity.claims.P571 then&lt;br /&gt;
		local snak = entity.claims.P571[1].mainsnak&lt;br /&gt;
		if (snak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
			local v = snak.datavalue.value&lt;br /&gt;
			if v and (v.calendarmodel==&#039;http://www.wikidata.org/entity/Q1985727&#039;) and (mw.ustring.sub(v.time,1,1)==&#039;+&#039;) then &lt;br /&gt;
				if v.precision &amp;gt;= 11 then            -- day&lt;br /&gt;
					Date = mw.ustring.sub(v.time,2,11)   -- date in YYYY-MM-DD format&lt;br /&gt;
				elseif v.precision == 10 then        -- month&lt;br /&gt;
					Date = mw.ustring.sub(v.time,2,8)    -- date in YYYY-MM format&lt;br /&gt;
				elseif v.precision == 9 then         -- year&lt;br /&gt;
					Date = mw.ustring.sub(v.time,2,5)    -- date in YYYY format&lt;br /&gt;
				end&lt;br /&gt;
				if Date then -- translate&lt;br /&gt;
					Date = ISOdate(Date, lang, &#039;&#039;, &#039;dtstart&#039;, &#039;100-999&#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if entity.claims.P571[1].qualifiers then                  -- non-trivial case: call heavy cavalery&lt;br /&gt;
			local getDate = require(&amp;quot;Module:Wikidata date&amp;quot;)._date -- lazy loading: load only if needed&lt;br /&gt;
			local result  = getDate(entity, &#039;P571&#039;, lang)         -- display the date in user&#039;s language&lt;br /&gt;
			Date = result.str&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if icon and Date then&lt;br /&gt;
		Date = Date .. core.editAtSDC(&#039;P571&#039;, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return Date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: none&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Source(entity, lang, icon)&lt;br /&gt;
	-- get source from P7482 (source of file)&lt;br /&gt;
	-- Code can handle {{Own}} template and URLs &lt;br /&gt;
	local source, label&lt;br /&gt;
	if entity and entity.claims and entity.claims.P7482 then&lt;br /&gt;
		local statement = entity.claims.P7482[1]&lt;br /&gt;
		-- get URL is source  is &amp;quot; file available on the internet (Q74228490) &amp;quot; &lt;br /&gt;
		if statement.mainsnak.datavalue.value.id==&#039;Q74228490&#039; and statement.qualifiers and statement.qualifiers.P973 then&lt;br /&gt;
			source = statement.qualifiers.P973[1].datavalue.value -- described at URL&lt;br /&gt;
			if statement.qualifiers.P137 then -- &amp;quot;operator&amp;quot;&lt;br /&gt;
				local id = statement.qualifiers.P137[1].datavalue.value.id&lt;br /&gt;
				label = getBareLabel(id, lang)&lt;br /&gt;
				source  = &#039;[&#039; .. source ..&#039; &#039; .. label ..&#039;]&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add {{tl|own}} if source is &amp;quot;original creation by uploader (Q66458942)&amp;quot; &lt;br /&gt;
		if statement.mainsnak.datavalue.value.id==&#039;Q66458942&#039; then&lt;br /&gt;
			label = mw.message.new( &#039;Wm-license-own-work&#039;):inLanguage(lang):plain()&lt;br /&gt;
			source = mw.ustring.format(&#039;&amp;lt;span class=&amp;quot;int-own-work&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;,lang, label)&lt;br /&gt;
		end&lt;br /&gt;
		-- add {{tl|Own work by the original uploader}} if source is &amp;quot; Own work by the original uploader (Q87402110)&amp;quot; &lt;br /&gt;
		if statement.mainsnak.datavalue.value.id==&#039;Q87402110&#039; then&lt;br /&gt;
			label  = getBareLabel(&#039;Q87402110&#039;, lang)&lt;br /&gt;
			source = mw.ustring.format(&#039;&amp;lt;span class=&amp;quot;int-own-work&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;,lang, label)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if icon and source then&lt;br /&gt;
		source = source .. core.editAtSDC(&#039;P7482&#039;, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return source&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: Module:Core &amp;quot;getLabel&amp;quot; function&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Author(entity, lang, icon)&lt;br /&gt;
	-- get author from P170 (creator)&lt;br /&gt;
	-- Code can handle usuall cases of &amp;quot;[[User:Example|Example]]&amp;quot; as well as users with Wikidata Item IDs&lt;br /&gt;
	local author&lt;br /&gt;
	if entity and entity.claims and entity.claims.P170 then&lt;br /&gt;
		local creators = {}&lt;br /&gt;
		for _,statement in ipairs(entity.claims.P170) do&lt;br /&gt;
			if statement.mainsnak.snaktype == &amp;quot;value&amp;quot; then  -- Creator has item ID    &lt;br /&gt;
				local val = statement.mainsnak.datavalue.value.id&lt;br /&gt;
				table.insert(creators, core.getLabel(val, lang))&lt;br /&gt;
			elseif statement.mainsnak.snaktype == &amp;quot;somevalue&amp;quot; then -- Creator defined by username&lt;br /&gt;
				if statement.qualifiers then -- author name string (P2093) &lt;br /&gt;
				    local qual = {}&lt;br /&gt;
					local properties = {P2093=&#039;authorStr&#039;, P4174=&#039;username&#039;, P3831=&#039;role&#039;, P2699=&#039;url&#039;}&lt;br /&gt;
					for prop, field in pairs( properties ) do&lt;br /&gt;
						if statement.qualifiers[prop] then&lt;br /&gt;
							qual[field] = statement.qualifiers[prop][1].datavalue.value&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					local role = &#039;&#039;&lt;br /&gt;
					if qual.role and entity.claims.P170[2] then -- add role only is multiple creators&lt;br /&gt;
						role = &#039;&amp;amp;nbsp;(&#039; .. core.getLabel(qual.role.id, lang) .. &#039;)&#039;&lt;br /&gt;
					end&lt;br /&gt;
					if qual.username and qual.authorStr then         --    author name string (P2093) &amp;amp; Wikimedia username (P4174) &lt;br /&gt;
						table.insert(creators, &#039;[[User:&#039;..qual.username..&#039;|&#039;..qual.authorStr..&#039;]]&#039;..role)&lt;br /&gt;
					elseif qual.username and not qual.authorStr then -- no author name string (P2093) &amp;amp; Wikimedia username (P4174) &lt;br /&gt;
						table.insert(creators, &#039;[[User:&#039;..qual.username..&#039;|&#039;..qual.username..&#039;]]&#039;..role)&lt;br /&gt;
					elseif qual.url and qual.authorStr then          --    author name string (P2093) &amp;amp; URL (P2699) &lt;br /&gt;
						table.insert(creators, &#039;[&#039;..qual.url..&#039; &#039;..qual.authorStr..&#039;]&#039;..role)&lt;br /&gt;
					elseif qual.url and not qual.authorStr then      -- no author name string (P2093) &amp;amp; URL (P2699) &lt;br /&gt;
						table.insert(creators, qual.url..role)&lt;br /&gt;
					elseif  qual.authorStr then                      --    author name string (P2093) &lt;br /&gt;
						table.insert(creators, qual.authorStr..role)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end -- end for&lt;br /&gt;
		author = table.concat(creators, &#039;, &#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if icon and author then&lt;br /&gt;
		author = author .. core.editAtSDC(&#039;P170&#039;, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return author&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: Module:Code &amp;quot;getLabel&amp;quot; function&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p._SDC_Location(entity, lang, icon)&lt;br /&gt;
	-- get location  P276 (location)&lt;br /&gt;
	local location, prop&lt;br /&gt;
	if entity and entity.claims and entity.claims.P1071 then&lt;br /&gt;
		local snak = entity.claims.P1071[1].mainsnak&lt;br /&gt;
		if (snak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
			location = core.getLabel(snak.datavalue.value.id, lang)&lt;br /&gt;
			prop = &#039;P1071&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if entity and entity.claims and entity.claims.P276 then&lt;br /&gt;
		local snak = entity.claims.P276[1].mainsnak&lt;br /&gt;
		if (snak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
			location = core.getLabel(snak.datavalue.value.id, lang)&lt;br /&gt;
			prop = &#039;P276&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if icon and location then&lt;br /&gt;
		location = location .. core.editAtSDC(prop, lang)&lt;br /&gt;
	end&lt;br /&gt;
	return location&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- === Version of the functions to be called from template namespace&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- information function creates a wikicode for {{Information}} template based on&lt;br /&gt;
-- passed arguments (through &amp;quot;frame&amp;quot;) and data extracted from SDC. Allowed template&lt;br /&gt;
-- arguments are : &#039;description&#039;, &#039;date&#039;, &#039;permission&#039;, &#039;author&#039;, &#039;other_versions&#039;,  &lt;br /&gt;
-- &#039;source&#039;,&#039;other_fields&#039;, &#039;other_fields_1&#039;, &#039;demo&#039; and &#039;lang&#039;. All inputs do not &lt;br /&gt;
-- depend on capitalization and all &amp;quot;_&amp;quot; can be replaced with spaces.&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: p._information&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function p.information(frame)&lt;br /&gt;
	local args = core.getArgs(frame)&lt;br /&gt;
	args.strict = true&lt;br /&gt;
	return p._information(args)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- interface for templates to 5 functions for extracting description, source,&lt;br /&gt;
-- author, date and location information from SDC. &lt;br /&gt;
-- INPUTS (templaate parameters):&lt;br /&gt;
--  * &amp;quot;mid&amp;quot;   - pageID defining a file. Optional, defaulting to the current file.&lt;br /&gt;
--  * &amp;quot;lang&amp;quot;  - users language. Optional defaulting to the language of the user&lt;br /&gt;
--  * &amp;quot;icon&amp;quot;  - add &amp;quot;Edit this at Wikidata&amp;quot; icon? boolean ( &#039;true&#039;/&#039;false&#039;, &#039;yes&#039;/&#039;no&#039;, 1/0&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Dependencies: getEntity&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
local function parseFrame(frame)&lt;br /&gt;
	local args = core.getArgs(frame)&lt;br /&gt;
	local entity = mw.wikibase.getEntity( args.mid )&lt;br /&gt;
	local icon   = core.yesno(args.icon, true)&lt;br /&gt;
	return {entity, args.lang, icon}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Description(frame)&lt;br /&gt;
	return p._SDC_Description(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Source(frame)&lt;br /&gt;
	return p._SDC_Source(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Author(frame)&lt;br /&gt;
	return p._SDC_Author(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Date(frame)&lt;br /&gt;
	return p._SDC_Date(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.SDC_Location(frame)&lt;br /&gt;
	return p._SDC_Location(unpack(parseFrame(frame)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- List of exported functions&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- information&lt;br /&gt;
-- SDC_Description&lt;br /&gt;
-- SDC_Source&lt;br /&gt;
-- SDC_Author&lt;br /&gt;
-- SDC_Date&lt;br /&gt;
-- SDC_Location&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:ISOdate&amp;diff=8298</id>
		<title>Module:ISOdate</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:ISOdate&amp;diff=8298"/>
		<updated>2021-12-21T22:47:21Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[  &lt;br /&gt;
  __  __           _       _        ___ ____   ___      _       _       &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _|_ _/ ___| / _ \  __| | __ _| |_ ___ &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_)| |\___ \| | | |/ _` |/ _` | __/ _ \&lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_ | | ___) | |_| | (_| | (_| | ||  __/&lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)___|____/ \___/ \__,_|\__,_|\__\___|&lt;br /&gt;
     &lt;br /&gt;
This module is intended for processing of date strings.&lt;br /&gt;
&lt;br /&gt;
Please do not modify this code without applying the changes first at Module:ISOdate/sandbox and testing &lt;br /&gt;
at Module:ISOdate/sandbox/testcases and Module talk:ISOdate/sandbox/testcases.&lt;br /&gt;
&lt;br /&gt;
Authors and maintainers:&lt;br /&gt;
* User:Parent5446 - original version of the function mimicking template:ISOdate&lt;br /&gt;
* User:Jarekt - original version of the functions mimicking template:Date and template:ISOyear&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- =======================================&lt;br /&gt;
-- === Dependencies ======================&lt;br /&gt;
-- =======================================&lt;br /&gt;
local D = require(&#039;Module:DateI18n&#039;)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
ISOyear&lt;br /&gt;
 &lt;br /&gt;
This function returns year part of date string.&lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:ISOdate|ISOyear|target_string}}&lt;br /&gt;
 &lt;br /&gt;
Parameters&lt;br /&gt;
    1: The date string &lt;br /&gt;
 &lt;br /&gt;
Error Handling:&lt;br /&gt;
   If the string does not look like it contain the year than the function will not return anything.&lt;br /&gt;
   That is the preferred treatment for the template:Creator which is the main (only?) template calling it.&lt;br /&gt;
]]&lt;br /&gt;
function p.ISOyear( frame )&lt;br /&gt;
	 return p._ISOyear( frame.args[1] )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._ISOyear( input )&lt;br /&gt;
	if not input then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	input = mw.text.trim( input )&lt;br /&gt;
    &lt;br /&gt;
	-- if empty string then return it&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then&lt;br /&gt;
		return input&lt;br /&gt;
	end&lt;br /&gt;
    &lt;br /&gt;
	-- if number then return it&lt;br /&gt;
	if tonumber( input ) then&lt;br /&gt;
		return mw.ustring.format( &#039;%04i&#039;, input )&lt;br /&gt;
	end&lt;br /&gt;
    &lt;br /&gt;
	-- otherwise use regular expression match&lt;br /&gt;
	input = mw.ustring.match( input, &#039;^+?(-?%d%d?%d?%d?)-&#039; )&lt;br /&gt;
	if input and tonumber( input ) then&lt;br /&gt;
		return mw.ustring.format( &#039;%04i&#039;, input )&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
ISOdate&lt;br /&gt;
 &lt;br /&gt;
This function is the core part of the ISOdate template. &lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:ISOdate|ISOdate|target_string|lang=}}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
     1: The date string &lt;br /&gt;
  lang: The language to display it in&lt;br /&gt;
  form: Language format (genitive, etc.) for some languages&lt;br /&gt;
 class: CSS class for the &amp;lt;time&amp;gt; node&lt;br /&gt;
&lt;br /&gt;
 Error Handling:&lt;br /&gt;
   If the string does not look like it contain the proper ISO date than the function will return the original string.&lt;br /&gt;
   &lt;br /&gt;
   That is the preferred treatment for the template:Information (and similar templates) which calling it.&lt;br /&gt;
]]&lt;br /&gt;
function p.ISOdate(frame)&lt;br /&gt;
	local datestr, succeded&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	if not (args.lang and mw.language.isSupportedLanguage(args.lang)) then &lt;br /&gt;
		args.lang = frame:callParserFunction( &amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot; ) -- get user&#039;s chosen language &lt;br /&gt;
	end&lt;br /&gt;
	datestr, succeded = p._ISOdate(&lt;br /&gt;
		mw.text.trim(args[1]),&lt;br /&gt;
		args.lang,                  -- language&lt;br /&gt;
		args.case  or &#039;&#039;,           -- allows to specify grammatical case for the month for languages that use them&lt;br /&gt;
		args.class or &#039;dtstart&#039;,    -- allows to set the html class of the time node where the date is included. &lt;br /&gt;
		args.trim_year or &#039;100-999&#039; -- by default pad one and 2 digit years to be 4 digit long, while keeping 3 digit years as is	&lt;br /&gt;
	)&lt;br /&gt;
	return datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._ISOdate(datestr, lang, case, class, trim_year)&lt;br /&gt;
&lt;br /&gt;
	-- pattern: regexp - regular expresion to test; dlen - number of date elements; tail = which element is a &amp;quot;tail&amp;quot; if any&lt;br /&gt;
	-- regexp hints:&lt;br /&gt;
	--  1) Strings starting with &amp;quot;^&amp;quot; and ending with &amp;quot;$&amp;quot; indicate whole string match&lt;br /&gt;
	--  2) optional tail part copied as-is and following the main parsed part of the date have to be separated from the date by a whitespace, so &amp;quot;(\s.+)?&amp;quot;&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		-- strings starting with YYYY-MM-DD HH:MM:SS. Year 4 digits (if we know seconds than it was within the last 100 years), the rest 1-2&lt;br /&gt;
		-- date and time can be separated by space or &amp;quot;T&amp;quot; and there could be a &amp;quot;Z&amp;quot; on the end indicating &amp;quot;Zulu&amp;quot; time zone&lt;br /&gt;
		{dlen=6, tail=7, regexp=&amp;quot;^+?(%d%d%d%d)-(%d%d?)-(%d%d?)[ T](%d%d?):(%d%d?):(%d%d?)Z?(%s.*)&amp;quot;}, &lt;br /&gt;
		{dlen=6, tail=0, regexp=&amp;quot;^+?(%d%d%d%d)-(%d%d?)-(%d%d?)[ T](%d%d?):(%d%d?):(%d%d?)Z?$&amp;quot;}, &lt;br /&gt;
		-- strings starting with YYYY-MM-DD HH:MM. Year 4 digits, the rest 1-2&lt;br /&gt;
		-- (if one knows hour and minute than it was probably after a year 1000)&lt;br /&gt;
		{dlen=5, tail=6, regexp=&amp;quot;^+?(%d%d%d%d)-(%d%d?)-(%d%d?)[ T](%d%d?):(%d%d?)(%s.+)&amp;quot;},&lt;br /&gt;
		{dlen=5, tail=0, regexp=&amp;quot;^+?(%d%d%d%d)-(%d%d?)-(%d%d?)[ T](%d%d?):(%d%d?)$&amp;quot;},&lt;br /&gt;
		-- strings starting with YYYY-MM-DD. Year 1-4 digits, the rest 1-2&lt;br /&gt;
		{dlen=3, tail=4, regexp=&amp;quot;^+?(%d%d?%d?%d?)-(%d%d?)-(%d%d?)(%s.+)&amp;quot;},&lt;br /&gt;
		{dlen=3, tail=0, regexp=&amp;quot;^+?(%d%d?%d?%d?)-(%d%d?)-(%d%d?)$&amp;quot;},&lt;br /&gt;
		-- strings starting with YYYY-MM. Year 3-4 digits, month 2 digits&lt;br /&gt;
		-- (want to avoit converting to dates strings like 10-5 = 5&lt;br /&gt;
		{dlen=2, tail=3, regexp=&amp;quot;^+?(%d%d%d%d?)-(%d%d)(%s.+)&amp;quot;}, &lt;br /&gt;
		-- if whole string is in YYYY-MM form: If Year 1-4 digits, month 1-2 digits&lt;br /&gt;
		{dlen=2, tail=0, regexp=&amp;quot;^+?(%d%d?%d?%d?)-(%d%d?)$&amp;quot;}, &lt;br /&gt;
		-- string starts with a number -&amp;gt; it has to be 3 or 4 digit long to be a year&lt;br /&gt;
		{dlen=1, tail=2, regexp=&amp;quot;^+?(%d%d%d%d?)(%s.+)&amp;quot;},	&lt;br /&gt;
		 -- if whole string is a number (1-4 digit long) than it will be interpreted as a year&lt;br /&gt;
		{dlen=1, tail=0, regexp=&amp;quot;^+?(%d%d?%d?%d?)$&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- create datevec based on which variables are provided&lt;br /&gt;
	local datevec, tail, formatNum&lt;br /&gt;
	datevec, tail, formatNum = p.test_date_formats(datestr or &#039;&#039;, patterns)&lt;br /&gt;
	if datevec[1]==&#039;&#039; or datevec[1]==nil then&lt;br /&gt;
		-- quickly return if datestr does not look like date (it could be a template)&lt;br /&gt;
		return datestr, false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- call p._Date function to format date string&lt;br /&gt;
	local succeded, datestr2&lt;br /&gt;
	succeded, datestr2 = pcall( D._Date, datevec, lang, case, class, trim_year)&lt;br /&gt;
	if succeded and datestr2~=&#039;&#039; then&lt;br /&gt;
		return mw.text.trim( datestr2 .. tail), true&lt;br /&gt;
	else -- in case of errors return the original string&lt;br /&gt;
		return datestr, false&lt;br /&gt;
	end	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ISOdate_extended(frame)&lt;br /&gt;
	-- pattern: regexp - regular expresion to test; dlen - number of date elements; tail = which element is a &amp;quot;tail&amp;quot; if any&lt;br /&gt;
	-- regexp hints:&lt;br /&gt;
	--  1) Strings starting with &amp;quot;^&amp;quot; and ending with &amp;quot;$&amp;quot; indicate whole string match&lt;br /&gt;
	--  2) optional tail part copied as-is and following the main parsed part of the date have to be separated from the date by a whitespace, so &amp;quot;(\s.+)?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local datestr, succeded&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	if not (args.lang and mw.language.isSupportedLanguage(args.lang)) then &lt;br /&gt;
		args.lang = frame:callParserFunction( &amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot; ) -- get user&#039;s chosen language &lt;br /&gt;
	end&lt;br /&gt;
	datestr, succeded = p._ISOdate(&lt;br /&gt;
		mw.text.trim(args[1]),&lt;br /&gt;
		args.lang,                  -- language&lt;br /&gt;
		args.case  or &#039;&#039;,           -- allows to specify grammatical case for the month for languages that use them&lt;br /&gt;
		args.class or &#039;dtstart&#039;,    -- allows to set the html class of the time node where the date is included. &lt;br /&gt;
		args.trim_year or &#039;100-999&#039; -- by default pad one and 2 digit years to be 4 digit long, while keeping 3 digit years as is	&lt;br /&gt;
	)&lt;br /&gt;
	if succeded then&lt;br /&gt;
		return datestr&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		-- Exended set of recognized formats: like MM/DD/YYYY&lt;br /&gt;
		{dlen=3, tail=4, regexp=&amp;quot;^(%d%d?)[-./](%d%d?)[-./](%d%d%d%d)(%s.+)&amp;quot;},&lt;br /&gt;
		{dlen=3, tail=0, regexp=&amp;quot;^(%d%d?)[-./](%d%d?)[-./](%d%d%d%d)$&amp;quot;},&lt;br /&gt;
		{dlen=3, tail=0, regexp=&amp;quot;^(%d%d?)%s(%w+)%s(%d%d%d%d)$&amp;quot;},&lt;br /&gt;
		{dlen=3, tail=0, regexp=&amp;quot;^(%w+)%s(%d%d?),%s(%d%d%d%d)$&amp;quot;},&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local datevec, tail, formatNum, category = &#039;&#039;&lt;br /&gt;
	datevec, tail, formatNum = p.test_date_formats(frame.args[1], patterns)&lt;br /&gt;
	if formatNum==1 or formatNum==2 then&lt;br /&gt;
		vec = datevec;&lt;br /&gt;
		if tonumber(datevec[1])&amp;gt;12 then&lt;br /&gt;
			frame.args[1] = string.format(&#039;%04i-%02i-%02i&#039;, datevec[3], datevec[2], datevec[1] )&lt;br /&gt;
			category = &#039;[[Category:Date in DD/MM/YYYY format]]&#039;&lt;br /&gt;
			return mw.text.trim( p.ISOdate(frame) .. tail);&lt;br /&gt;
		elseif tonumber(datevec[2])&amp;gt;12 then&lt;br /&gt;
			frame.args[1] = string.format(&#039;%04i-%02i-%02i&#039;, datevec[3], datevec[1], datevec[2] )&lt;br /&gt;
			category = &#039;[[Category:Date in MM/DD/YYYY format]]&#039;&lt;br /&gt;
			return mw.text.trim( p.ISOdate(frame) .. tail);&lt;br /&gt;
		end&lt;br /&gt;
	elseif (formatNum==3 or formatNum==4) and (datevec[3]==&#039;&#039; or datevec[3]~=nil) then&lt;br /&gt;
		local str = mw.getCurrentFrame():callParserFunction( &amp;quot;#time&amp;quot;, { &#039;Y-m-d&#039;, datestr} )&lt;br /&gt;
		local vec = {str:match( &amp;quot;^(%d%d?%d?%d?)-(%d%d?)-(%d%d?)$&amp;quot; )}&lt;br /&gt;
		if vec and vec[1]~=nil then&lt;br /&gt;
			frame.args[1] = string.format(&#039;%04i-%02i-%02i&#039;, vec[1], vec[2], vec[3] )&lt;br /&gt;
			category = &#039;[[Category:Date in word format]]&#039;&lt;br /&gt;
			return p.ISOdate(frame);&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
	return datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.test_date_formats(datestr, patterns)&lt;br /&gt;
	-- pattern: regexp - regular expresion to test; dlen - number of date elements; tail = which element is a &amp;quot;tail&amp;quot; if any&lt;br /&gt;
&lt;br /&gt;
	local datevec = {&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;}&lt;br /&gt;
	local tail = &#039;&#039;&lt;br /&gt;
	local vec, pat&lt;br /&gt;
	local formatNum = 0&lt;br /&gt;
	for i, pat in ipairs( patterns ) do&lt;br /&gt;
		vec = {datestr:match( pat.regexp )}&lt;br /&gt;
		if vec and vec[1]~=nil then&lt;br /&gt;
			for j=1,pat.dlen do&lt;br /&gt;
				datevec[j] = vec[j]&lt;br /&gt;
			end&lt;br /&gt;
			if pat.tail&amp;gt;0 and vec[pat.tail]~=nil then&lt;br /&gt;
				tail = mw.ustring.gsub(&#039; &#039; .. vec[pat.tail], &#039; +&#039;, &#039; &#039;)&lt;br /&gt;
			end&lt;br /&gt;
			formatNum = i&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return datevec, tail, formatNum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:DateI18n&amp;diff=8296</id>
		<title>Module:DateI18n</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:DateI18n&amp;diff=8296"/>
		<updated>2021-12-21T22:47:21Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[  &lt;br /&gt;
  __  __           _       _        ____        _       ___ _  ___        &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _|  _ \  __ _| |_ ___|_ _/ |( _ ) _ __  &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_) | | |/ _` | __/ _ \| || |/ _ \| &#039;_ \ &lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_| |_| | (_| | ||  __/| || | (_) | | | |&lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)____/ \__,_|\__\___|___|_|\___/|_| |_|&lt;br /&gt;
  &lt;br /&gt;
This module is intended for processing of date strings.&lt;br /&gt;
&lt;br /&gt;
Please do not modify this code without applying the changes first at Module:Date/sandbox and testing &lt;br /&gt;
at Module:Date/sandbox/testcases and Module talk:Date/sandbox/testcases.&lt;br /&gt;
&lt;br /&gt;
Authors and maintainers:&lt;br /&gt;
* User:Parent5446 - original version of the function mimicking template:ISOdate&lt;br /&gt;
* User:Jarekt - original version of the functions mimicking template:Date &lt;br /&gt;
]]&lt;br /&gt;
require(&#039;Module:No globals&#039;)&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === Internal functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
&lt;br /&gt;
-- Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
-- It works similarly to Module:Yesno&lt;br /&gt;
local function yesno(val, default)&lt;br /&gt;
	if type(val) == &#039;boolean&#039; then&lt;br /&gt;
		return val&lt;br /&gt;
	elseif type(val) == &#039;number&#039; then&lt;br /&gt;
		if val == 1 then &lt;br /&gt;
			return true&lt;br /&gt;
		elseif val == 0 then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(val) == &#039;string&#039; then&lt;br /&gt;
	    val = string.lower(val)  -- put in lower case&lt;br /&gt;
	    if val == &#039;no&#039;  or val == &#039;n&#039; or val == &#039;false&#039; or tonumber(val) == 0 then&lt;br /&gt;
	        return false&lt;br /&gt;
	    elseif val == &#039;yes&#039; or val == &#039;y&#039; or val == &#039;true&#039;  or tonumber(val) == 1 then&lt;br /&gt;
	        return true&lt;br /&gt;
	    end&lt;br /&gt;
    end&lt;br /&gt;
    return default&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
-- String replacement that ignores part of the string in &amp;quot;...&amp;quot;&lt;br /&gt;
local function strReplace(String, old, new)&lt;br /&gt;
	if String:find(&#039;&amp;quot;&#039;) then&lt;br /&gt;
		local T={}&lt;br /&gt;
		for i, str in ipairs(mw.text.split( String, &#039;&amp;quot;&#039;, true )) do&lt;br /&gt;
			if i%2==1 then&lt;br /&gt;
				str = str:gsub(old, new)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(T, str)&lt;br /&gt;
		end&lt;br /&gt;
		return table.concat(T,&#039;&amp;quot;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return String:gsub(old, new)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
-- process datevec&lt;br /&gt;
-- INPUT:&lt;br /&gt;
--  * datevec - Array of {year,month,day,hour,minute,second, tzhour, tzmin} containing broken &lt;br /&gt;
--    down date-time component strings or numbers&lt;br /&gt;
-- OUTPUT:&lt;br /&gt;
--  * datecode - a code specifying content of the array where Y&#039; is year, &#039;M&#039; is month, &#039;D&#039; is day,&lt;br /&gt;
--     &#039;h&#039; is hour, &#039;m&#039; minute, &#039;s&#039; is second. output has to be one of YMDhms, YMDhm, YMD, YM, Y, MDhms, MDhm, MD, M&lt;br /&gt;
--  * datenum - same array but holding only numbers or nuls&lt;br /&gt;
local function parserDatevec(datevec)&lt;br /&gt;
	-- create datecode based on which variables are provided and check for out-of-bound values&lt;br /&gt;
	local maxval = {  1/0, 12, 31, 23, 59, 60,  23, 59 } -- max values (or 1/0=+inf) for year, month, day, hour, minute, second, tzhour, tzmin&lt;br /&gt;
	local minval = { -1/0, 01, 01, 00, 00, 00, -23, 00 } -- min values (or -1/0=-inf) for year, month, ...&lt;br /&gt;
	local codes = { &#039;Y&#039;, &#039;M&#039;, &#039;D&#039;, &#039;h&#039;, &#039;m&#039;, &#039;s&#039;, &#039;&#039;, &#039;&#039; } -- WARNING: &#039;M&#039; alone would be ambiguous if it does not follow &#039;Y&#039; or &#039;h&#039;&lt;br /&gt;
	local datecode = &#039;&#039; -- a string signifying which combination of variables was provided&lt;br /&gt;
	local datenum = {} -- date-time encoded as a vector = [year, month, ... , second, tzhour, tzmin]&lt;br /&gt;
	for i = 1, 8 do&lt;br /&gt;
        local c, val = codes[i], datevec[i]&lt;br /&gt;
        if c == &#039;M&#039; and type(val) == &#039;string&#039; and val ~= &#039;&#039; and not tonumber(val) then&lt;br /&gt;
            -- When the month is not a number, check if it&#039;s a month name in the project&#039;s language.&lt;br /&gt;
            val = mw.getContentLanguage():formatDate(&#039;n&#039;, val)&lt;br /&gt;
        end&lt;br /&gt;
        val = tonumber(val)&lt;br /&gt;
        if val and val &amp;gt;= minval[i] and val &amp;lt;= maxval[i] then -- These tests work with infinite min/max values.&lt;br /&gt;
            if c == &#039;m&#039; then -- Field for minute accepted only if it follows another valid &#039;M&#039;,  &#039;D&#039; or &#039;h&#039; field.&lt;br /&gt;
               if not string.find(&#039;MDh&#039;, datecode:sub(-1)) then&lt;br /&gt;
                   c = &#039;&#039;; val = nil -- field for minute is invalid&lt;br /&gt;
               end&lt;br /&gt;
            elseif c == &#039;s&#039; then -- Field for leap second &#039;60&#039; is valid only at end of 23:59 UTC, on 30 June or 31 December of specific years.&lt;br /&gt;
               if val == 60 and not( -- Leap second are are added (or dropped) on specific dates planned only some months before.&lt;br /&gt;
                   datenum[1] and -- A year is specified (to check it would require constantly maintaining a table of dates).&lt;br /&gt;
                   (datenum[2] == 6 and datenum[3] == 30 or datenum[2] == 12 and datenum[3] == 31) and&lt;br /&gt;
                   datenum[4] == 23 and datenum[5] == 59&lt;br /&gt;
               ) then&lt;br /&gt;
                   c = &#039;&#039;; val = nil -- Field for second is invalid in this case, don&#039;t add the field.&lt;br /&gt;
               end&lt;br /&gt;
            end&lt;br /&gt;
			datecode = datecode .. c&lt;br /&gt;
            datenum[i] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return datecode, datenum&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
-- process datevec&lt;br /&gt;
-- INPUT:&lt;br /&gt;
--  * datecode - a code specifying content of the array where Y&#039; is year, &#039;M&#039; is month,&lt;br /&gt;
--     &#039;D&#039; is day, &#039;H&#039; is hour, &#039;i&#039; minute, &#039;s&#039; is second.&lt;br /&gt;
--     Output has to be one of YMDhms, YMDhm, YMD, YM, Y, MDhms, MDhm, MD, M.&lt;br /&gt;
--  * datenum - Array of {year,month,day,hour,minute,second, tzhour, tzmin} as numbers or nuls&lt;br /&gt;
-- OUTPUT:&lt;br /&gt;
--  * timeStamp - date string in the format taken by mw.language:formatDate lua function and {{#time}} parser function&lt;br /&gt;
--       https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.language:formatDate&lt;br /&gt;
--       https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time&lt;br /&gt;
--  * datecode - with possible corrections&lt;br /&gt;
local function getTimestamp(datecode, datenum)&lt;br /&gt;
	-- create timestamp string (for example 2000-02-20 02:20:20) based on which variables were provided&lt;br /&gt;
	local timeStamp&lt;br /&gt;
    -- date starting by a year&lt;br /&gt;
	if datecode == &#039;YMDhms&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i %02i:%02i:%02i&#039;, datenum[1], datenum[2], datenum[3], datenum[4], datenum[5], datenum[6] )&lt;br /&gt;
	elseif datecode == &#039;YMDhm&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i %02i:%02i&#039;, datenum[1], datenum[2], datenum[3], datenum[4], datenum[5] )&lt;br /&gt;
	elseif datecode:sub(1,3)==&#039;YMD&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i&#039;, datenum[1], datenum[2], datenum[3] )&lt;br /&gt;
		datecode = &#039;YMD&#039; -- &#039;YMDhms&#039;, &#039;YMDhm&#039; and &#039;YMD&#039; are the only supported format starting with &#039;YMD&#039;; all others will be converted to &#039;YMD&#039;.&lt;br /&gt;
	elseif datecode:sub(1,2) == &#039;YM&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i&#039;, datenum[1], datenum[2] )&lt;br /&gt;
	elseif datecode:sub(1,1)==&#039;Y&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i&#039;, datenum[1] )&lt;br /&gt;
		datecode = &#039;Y&#039; &lt;br /&gt;
    -- date starting by a month (the implied year is 2000)&lt;br /&gt;
	elseif datecode== &#039;MDhms&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i %02i:%02i:%02i&#039;, 2000, datenum[2], datenum[3], datenum[4], datenum[5], datenum[6] )&lt;br /&gt;
	elseif datecode == &#039;MDhm&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i %02i:%02i&#039;, 2000, datenum[2], datenum[3], datenum[4], datenum[5] )&lt;br /&gt;
	elseif datecode:sub(1,2) == &#039;MD&#039; then&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i&#039;, 2000, datenum[2], datenum[3] )&lt;br /&gt;
		datecode = &#039;MD&#039; -- &#039;MDhms&#039;, &#039;MDhm&#039; and &#039;MD&#039; are the only supported format starting with &#039;MD&#039;; all others will be converted to &#039;MD&#039;&lt;br /&gt;
	elseif datecode:sub(1,1) == &#039;M&#039; then -- Ambiguous: could mean minutes, but here means month (when parsed as a name/abbrev, not as a number).&lt;br /&gt;
		timeStamp = string.format(&#039;%04i-%02i-%02i&#039;, 2000, datenum[2], 1 )&lt;br /&gt;
    -- other possible but unrecognized formats (e.g. &#039;DHis&#039;, &#039;DHi&#039;, &#039;D&#039;, &#039;His&#039;, &#039;Hi&#039;);&lt;br /&gt;
    -- note that &#039;Dh&#039;, &#039;D&#039;, &#039;h&#039;, &#039;s&#039; may eventually work, but not &#039;m&#039; for minute only, which is ambiguous with &#039;M&#039; for month only.&lt;br /&gt;
	else&lt;br /&gt;
		timeStamp = nil -- format not supported&lt;br /&gt;
	end&lt;br /&gt;
	return timeStamp, datecode&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
-- trim leading zeros in years prior to year 1000&lt;br /&gt;
-- INPUT:&lt;br /&gt;
--  * datestr   - translated date string &lt;br /&gt;
--  * lang      - language of translation&lt;br /&gt;
-- OUTPUT:&lt;br /&gt;
--  * datestr - updated date string &lt;br /&gt;
&lt;br /&gt;
local function trimYear(datestr, year, lang)&lt;br /&gt;
	local yearStr0, yearStr1, yearStr2, zeroStr&lt;br /&gt;
	yearStr0 = string.format(&#039;%04i&#039;, year ) -- 4 digit year in standard form &amp;quot;0123&amp;quot;&lt;br /&gt;
	yearStr1 = mw.language.new(lang):formatDate( &#039;Y&#039;, yearStr0) -- same as calling {{#time}} parser function&lt;br /&gt;
	--yearStr1 = mw.getCurrentFrame():callParserFunction( &amp;quot;#time&amp;quot;, { &#039;Y&#039;, yearStr0, lang } ) -- translate to a language &lt;br /&gt;
	if yearStr0==yearStr1 then -- most of languages use standard form of year &lt;br /&gt;
		yearStr2 = tostring(year)&lt;br /&gt;
	else -- some languages use different characters for numbers&lt;br /&gt;
		yearStr2 = yearStr1&lt;br /&gt;
		zeroStr = mw.ustring.sub(yearStr1,1,1) -- get &amp;quot;0&amp;quot; in whatever language&lt;br /&gt;
		for i=1,3 do -- trim leading zeros&lt;br /&gt;
			if mw.ustring.sub(yearStr2,1,1)==zeroStr then&lt;br /&gt;
				yearStr2 = mw.ustring.sub(yearStr2, 2, 5-i)&lt;br /&gt;
			else&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return string.gsub(datestr, yearStr1, yearStr2 ) -- in datestr replace long year with trimmed one&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
-- Look up proper format string to be passed to {{#time}} parser function&lt;br /&gt;
-- INPUTS:&lt;br /&gt;
--  * datecode: YMDhms, YMDhm, YMD, YM, Y, MDhms, MDhm, MD, or M&lt;br /&gt;
--  * day     : Number between 1 and 31 (not needed for most languages)&lt;br /&gt;
--  * lang    : language&lt;br /&gt;
-- OUTPUT:&lt;br /&gt;
--  * dFormat : input to {{#time}} function&lt;br /&gt;
local function getDateFormat(datecode, day, lang)&lt;br /&gt;
	local function parseFormat(dFormat, day)&lt;br /&gt;
		if dFormat:find(&#039;default&#039;) and #dFormat&amp;gt;10 then&lt;br /&gt;
			-- Special (and messy) case of dFormat code depending on a day number, where data is a&lt;br /&gt;
			-- JSON-encoded table {”default”:”*”,”dDD”:”*”} including fields for specific 2-digit days.&lt;br /&gt;
			-- Change curly double quotes (possibly used for easier editing in tabular data) in dFormat&lt;br /&gt;
			-- to straight ASCII double quotes (required for parsing of this JSON-encoded table).&lt;br /&gt;
			local D = mw.text.jsonDecode(mw.ustring.gsub(dFormat, &#039;[„“‟”]&#039;, &#039;&amp;quot;&#039;)) --com = mw.dumpObject(D)&lt;br /&gt;
			-- If the desired day is not in that JSON table, then use its &amp;quot;default&amp;quot; case.&lt;br /&gt;
			dFormat = D[string.format(&#039;d%02i&#039;, day)] or D.default&lt;br /&gt;
            -- Change ASCII single quotes to ASCII double quotes used for {{#time}} marking.&lt;br /&gt;
            -- Apostrophes needed in plain-text must not use ASCII single quotes but curly apostrophe&lt;br /&gt;
            -- e.g. { ‟default”: ‟j”, ‟d01”: ‟j’&#039;o&#039;” }, not { ‟default”: ‟j”, ‟d01”: ‟j&#039;&#039;o&#039;” }.&lt;br /&gt;
		end&lt;br /&gt;
		dFormat = dFormat:gsub(&amp;quot;&#039;&amp;quot;, &#039;&amp;quot;&#039;)&lt;br /&gt;
		return dFormat&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local T = {}&lt;br /&gt;
	local tab = mw.ext.data.get(&#039;DateI18n.tab&#039;, lang)&lt;br /&gt;
	for _, row in pairs(tab.data) do -- convert the output into a dictionary table&lt;br /&gt;
		local id, _, msg = unpack(row)&lt;br /&gt;
		T[id] = msg&lt;br /&gt;
	end&lt;br /&gt;
    -- Compatibility of legacy data using &#039;HMS&#039; or &#039;HM&#039;, where &#039;M&#039; is ambiguous&lt;br /&gt;
    T.YMDhms = T.YMDhms or T.YMDHMS&lt;br /&gt;
    T.YMDhm = T.YMDhm or T.YMDHM&lt;br /&gt;
    datecode = datecode == &#039;YMDHMS&#039; and &#039;YMDhms&#039; or datecode == &#039;YMDHM&#039; and &#039;YMDhm&#039; or datecode&lt;br /&gt;
&lt;br /&gt;
	local dFormat = T[datecode]&lt;br /&gt;
	if dFormat == &#039;default&#039; and (datecode == &#039;YMDhms&#039; or datecode == &#039;YMDhm&#039;)  then &lt;br /&gt;
		-- For most languages adding hour:minute:second is done by adding &amp;quot;, HH:ii:ss to the &lt;br /&gt;
		-- day precission date, those languages are skipped in DateI18n.tab and default to &lt;br /&gt;
		-- English which stores word &amp;quot;default&amp;quot;&lt;br /&gt;
		dFormat = parseFormat(T[&#039;YMD&#039;], day).. &#039;, H:i&#039;&lt;br /&gt;
		if datecode == &#039;YMDhms&#039; then&lt;br /&gt;
			dFormat = dFormat .. &#039;:s&#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		dFormat = parseFormat(dFormat, day)&lt;br /&gt;
	end&lt;br /&gt;
	return dFormat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------------&lt;br /&gt;
-- Look up proper format string to be passed to {{#time}} parser function&lt;br /&gt;
-- INPUTS:&lt;br /&gt;
--  * month : month number&lt;br /&gt;
--  * case  : gramatic case abbriviation, like &amp;quot;ins&amp;quot;, &amp;quot;loc&amp;quot;&lt;br /&gt;
--  * lang  : language&lt;br /&gt;
-- OUTPUT:&lt;br /&gt;
--  * dFormat : input to {{#time}} function&lt;br /&gt;
local function MonthCase(month, case, lang)&lt;br /&gt;
	local T = {{},{},{},{},{},{},{},{},{},{},{},{}}&lt;br /&gt;
	local tab = mw.ext.data.get(&#039;I18n/MonthCases.tab&#039;, lang)&lt;br /&gt;
	for _, row in pairs(tab.data) do&lt;br /&gt;
		local mth, cs, msg = unpack(row)&lt;br /&gt;
		T[mth][cs] = msg&lt;br /&gt;
	end&lt;br /&gt;
	return T[month][case]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === External functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[ ========================================================================================&lt;br /&gt;
Date&lt;br /&gt;
 &lt;br /&gt;
This function is the core part of the ISOdate template. &lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
  local Date = require(&#039;Module:DateI18n&#039;)._Date&lt;br /&gt;
  local dateStr = Date({2020, 12, 30, 12, 20, 11}, lang)&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
  * {year,month,day,hour,minute,second, tzhour, tzmin}: broken down date-time component strings or numbers&lt;br /&gt;
		tzhour, tzmin are timezone offsets from UTC, hours and minutes&lt;br /&gt;
  * lang: The language to display it in&lt;br /&gt;
  * case: Language format (genitive, etc.) for some languages&lt;br /&gt;
  * class: CSS class for the &amp;lt;time&amp;gt; node, use &amp;quot;&amp;quot; for no metadata at all&lt;br /&gt;
]]&lt;br /&gt;
function p._Date(datevec, lang, case, class, trim_year)	&lt;br /&gt;
	-- make sure inputs are in the right format&lt;br /&gt;
	if not lang or not mw.language.isValidCode( lang ) then&lt;br /&gt;
		lang = mw.getCurrentFrame():callParserFunction( &amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot; ) -- get user&#039;s chosen language&lt;br /&gt;
	end&lt;br /&gt;
	if lang == &#039;be-tarask&#039; then&lt;br /&gt;
		lang = &#039;be-x-old&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- process datevec and extract timeStamp and datecode strings as well as numeric datenum array&lt;br /&gt;
	local datecode,  datenum  = parserDatevec(datevec)&lt;br /&gt;
	local year, month, day = datenum[1], datenum[2], datenum[3]&lt;br /&gt;
	local timeStamp, datecode = getTimestamp(datecode, datenum)&lt;br /&gt;
	if not timeStamp then -- something went wrong in parserDatevec&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- Commons [[Data:DateI18n.tab]] page stores prefered formats for diferent &lt;br /&gt;
	-- languages and datecodes (specifying year-month-day or just year of month-day, etc)&lt;br /&gt;
	-- Look up country specific format input to {{#time}} function&lt;br /&gt;
	local dFormat = getDateFormat(datecode, day, lang)&lt;br /&gt;
&lt;br /&gt;
	-- By default the gramatical case is not specified (case==&#039;&#039;) allowing the format to be specified &lt;br /&gt;
	-- in [[Data:DateI18n.tab]]. You can overwrite the default grammatical case of the month by &lt;br /&gt;
	-- specifying &amp;quot;case&amp;quot; variable. This is needed mostly by Slavic languages to create more complex &lt;br /&gt;
	-- phrases as it is done in [[c:Module:Complex date]]&lt;br /&gt;
	case = case or &#039;&#039;&lt;br /&gt;
	if (lang==&#039;qu&#039; or lang==&#039;qug&#039;) and case==&#039;nom&#039; then&lt;br /&gt;
		-- Special case related to Quechua and Kichwa languages. The form in the I18n is&lt;br /&gt;
		--  Genitive case with suffix &amp;quot;pi&amp;quot; added to month names provided by {#time}}&lt;br /&gt;
		-- in Nominative case that &amp;quot;pi&amp;quot; should be removed&lt;br /&gt;
		-- see https://commons.wikimedia.org/wiki/Template_talk:Date#Quechua from 2014&lt;br /&gt;
		dFormat = dFormat:gsub(&#039;F&amp;quot;pi&amp;quot;&#039;, &#039;F&#039;)&lt;br /&gt;
	elseif case == &#039;gen&#039; then&lt;br /&gt;
		dFormat = strReplace(dFormat, &amp;quot;F&amp;quot;, &amp;quot;xg&amp;quot;)&lt;br /&gt;
	elseif case == &#039;nom&#039; then&lt;br /&gt;
		dFormat = strReplace(dFormat, &amp;quot;xg&amp;quot;, &amp;quot;F&amp;quot;)&lt;br /&gt;
	elseif case ~= &#039;&#039; then&lt;br /&gt;
		-- see is page [[Data:I18n/MonthCases.tab]] on Commons have name of the month &lt;br /&gt;
		-- in specific gramatic case in desired language. If we have it than replace &lt;br /&gt;
		-- &amp;quot;F&amp;quot; and xg&amp;quot; in dFormat&lt;br /&gt;
		local monthMsg = MonthCase(month, case, lang)&lt;br /&gt;
		if  monthMsg and monthMsg ~= &#039;&#039; then -- make sure it exists&lt;br /&gt;
			dFormat = strReplace(dFormat, &#039;F&#039;,  &#039;&amp;quot;&#039;..monthMsg..&#039;&amp;quot;&#039;) -- replace default month with month name we already looked up&lt;br /&gt;
			dFormat = strReplace(dFormat, &#039;xg&#039;, &#039;&amp;quot;&#039;..monthMsg..&#039;&amp;quot;&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    -- Translate the date using specified format.&lt;br /&gt;
	-- See https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.language:formatDate and &lt;br /&gt;
	-- https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions##time for explanation of the format&lt;br /&gt;
	local langObj = mw.language.new(lang)&lt;br /&gt;
	local datestr = langObj:formatDate(dFormat, timeStamp) -- same as using {{#time}} parser function&lt;br /&gt;
	&lt;br /&gt;
	-- Special case related to Thai solar calendar: prior to 1940 new-year was at different time of year,&lt;br /&gt;
	-- so just year (datecode == &#039;Y&#039;) is ambiguous and is replaced by &amp;quot;YYYY or YYYY&amp;quot; phrase&lt;br /&gt;
	if lang==&#039;th&#039; and datecode==&#039;Y&#039; and year&amp;lt;=1940 then&lt;br /&gt;
		datestr = string.format(&#039;%04i หรือ %04i&#039;, year+542, year+543 ) &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- If year &amp;lt; 1000 than either keep the date padded to the length of 4 digits or trim it.&lt;br /&gt;
	-- Decide if the year will stay padded with zeros (for years in 0-999 range).&lt;br /&gt;
	if year and year &amp;lt; 1000 then&lt;br /&gt;
		trim_year = yesno(trim_year, &#039;100-999&#039;)&lt;br /&gt;
		if type(trim_year) == &#039;string&#039; then&lt;br /&gt;
			-- If `trim_year` not a simple boolean, then it&#039;s a range of dates.&lt;br /&gt;
			-- For example &#039;100-999&#039; means to pad 1-or-2-digit years to be 4-digit long, while keeping 3-digit years as is.&lt;br /&gt;
			local YMin, YMax = trim_year:match( &#039;(%d+)-(%d+)&#039; )&lt;br /&gt;
			trim_year = YMin and year &amp;gt;= tonumber(YMin) and year &amp;lt;= tonumber(YMax)&lt;br /&gt;
		end&lt;br /&gt;
		if trim_year then&lt;br /&gt;
			datestr = trimYear(datestr, year, lang) -- in datestr replace long year with trimmed one&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Append a timezone if present (after the hour and minute of the day).&lt;br /&gt;
	if datenum[7] and (datecode.sub(1, 5) == &#039;YMDhm&#039; or datecode.sub(1, 4) == &#039;MDhm&#039;) then&lt;br /&gt;
		-- Use {{#time}} parser function to create timezone string, so that we use the correct character set.&lt;br /&gt;
		local sign = (datenum[7]&amp;lt;0) and &#039;−&#039; or &#039;+&#039;&lt;br /&gt;
		timeStamp = string.format(&amp;quot;2000-01-01 %02i:%02i:00&amp;quot;, math.abs(datenum[7]), datenum[8] or 0)&lt;br /&gt;
		local timezone = langObj:formatDate(&#039;H:i&#039;, timeStamp) -- same as using {{#time}} parser function&lt;br /&gt;
		datestr = string.format(&amp;quot;%s %s%s&amp;quot;, datestr, sign, timezone )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- HTML formating of date string and tagging for microformats (only for absolute dates with a year).&lt;br /&gt;
	if class and class ~= &#039;&#039; and datecode.sub(1,1) == &#039;Y&#039; then --&lt;br /&gt;
		datestr =&lt;br /&gt;
            (&#039;&amp;lt;time class=&amp;quot;%s&amp;quot; datetime=&amp;quot;%s&amp;quot; lang=&amp;quot;%s&amp;quot; dir=&amp;quot;%s&amp;quot; style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;%s&amp;lt;/time&amp;gt;&#039;)&lt;br /&gt;
            :format(class, timeStamp, lang, langObj:getDir(), datestr)&lt;br /&gt;
	end&lt;br /&gt;
	return datestr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ ========================================================================================&lt;br /&gt;
Date&lt;br /&gt;
 &lt;br /&gt;
This function is the core part of the ISOdate template. &lt;br /&gt;
 &lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:DateI18n|Date|year=|month=|day=|hour=|minute=|second=|tzhour=|tzmin=|lang=en}}&lt;br /&gt;
 &lt;br /&gt;
Parameters:&lt;br /&gt;
  * year, month, day, hour, minute, second: broken down date-time component strings&lt;br /&gt;
  * tzhour, tzmin: timezone offset from UTC, hours and minutes&lt;br /&gt;
  * lang: The language to display it in&lt;br /&gt;
  * case: Language format (genitive, etc.) for some languages&lt;br /&gt;
  * class: CSS class for the &amp;lt;time&amp;gt; node, use &amp;quot;&amp;quot; for no metadata at all&lt;br /&gt;
]]&lt;br /&gt;
function p.Date(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	for name, value in pairs( frame.args ) do &lt;br /&gt;
		name = string.gsub( string.lower(name), &#039; &#039;, &#039;_&#039;)&lt;br /&gt;
		args[name] = value&lt;br /&gt;
	end&lt;br /&gt;
	return p._Date(	&lt;br /&gt;
		{ args.year, args.month, args.day, args.hour, args.minute, args.second, args.tzhour, args.tzmin },&lt;br /&gt;
		args.lang,                  -- language&lt;br /&gt;
		args.case,                  -- allows to specify grammatical case for the month for languages that use them&lt;br /&gt;
		args.class or &#039;dtstart&#039;,    -- allows to set the html class of the time node where the date is included. This is useful for microformats.&lt;br /&gt;
		args.trim_year or &#039;100-999&#039; -- by default pad one and 2 digit years to be 4 digit long, while keeping 3 digit years as is&lt;br /&gt;
	)	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:Core&amp;diff=8294</id>
		<title>Module:Core</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:Core&amp;diff=8294"/>
		<updated>2021-12-21T22:47:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[  &lt;br /&gt;
  __  __           _       _         ____               &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _ / ___|___  _ __ ___ &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_) |   / _ \| &#039;__/ _ \&lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_| |__| (_) | | |  __/&lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)\____\___/|_|  \___|&lt;br /&gt;
                                                        &lt;br /&gt;
Core is a meta-module that consists of common and useful Lua functions that can &lt;br /&gt;
be used in many Lua scripts. It was writen as a core of several Lua &lt;br /&gt;
modules for creating file infobox templates on Commons. Many of the functions&lt;br /&gt;
are bare-bones versions of full functions found in other modules.&lt;br /&gt;
&lt;br /&gt;
Authors and maintainers:&lt;br /&gt;
* User:Jarekt  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local core = {}&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Based on frame structure create &amp;quot;args&amp;quot; table with all the input parameters:&lt;br /&gt;
 * table keys - equivalent to template parameters are converted to lower case &lt;br /&gt;
                so they will not be case-sensitive.&lt;br /&gt;
                Also underscored are treated the same way as speces. &lt;br /&gt;
 * table values - input values are trimmed (whitespaces removed from the beggining &lt;br /&gt;
                and the end) and empty string are converted to nils. &lt;br /&gt;
If &amp;quot;lang&amp;quot; is not provided than we substitute user&#039;s prefered language.&lt;br /&gt;
&lt;br /&gt;
This function collects inputs from both frame and frame&#039;s parent. See &lt;br /&gt;
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#frame:getParent .&lt;br /&gt;
If both structures have the same field than value from &amp;quot;frame&amp;quot; takes priority.&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
	1) frame - frame objects see below for details&lt;br /&gt;
	https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#frame-object&lt;br /&gt;
&lt;br /&gt;
See also: Module:Arguments on enWiki - which is much larger single purpose module&lt;br /&gt;
]]&lt;br /&gt;
function core.getArgs(frame)&lt;br /&gt;
	local function normalize_input_args(input_args, output_args)&lt;br /&gt;
		for name, value in pairs( input_args ) do &lt;br /&gt;
			value = mw.text.trim(value) -- trim whitespaces from the beggining and the end of the string&lt;br /&gt;
			if value ~= &#039;&#039; then -- nuke empty strings&lt;br /&gt;
				if type(name)==&#039;string&#039; then &lt;br /&gt;
					name = string.gsub( string.lower(name), &#039; &#039;, &#039;_&#039;)&lt;br /&gt;
				end&lt;br /&gt;
				output_args[name] = value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return output_args&lt;br /&gt;
	end&lt;br /&gt;
	local args = {}&lt;br /&gt;
	args = normalize_input_args(frame:getParent().args, args)&lt;br /&gt;
	args = normalize_input_args(frame.args, args)&lt;br /&gt;
	if (args.lang and mw.language.isSupportedLanguage(args.lang)) then &lt;br /&gt;
		args.lang = string.lower(args.lang)&lt;br /&gt;
	else&lt;br /&gt;
		args.lang = frame:callParserFunction(&amp;quot;int&amp;quot;,&amp;quot;lang&amp;quot;)  -- get user&#039;s chosen language&lt;br /&gt;
	end&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Simplified code equivalent to https://commons.wikimedia.org/wiki/Template:LangSwitch&lt;br /&gt;
&lt;br /&gt;
Example usage:&lt;br /&gt;
  text = langSwitch({en=&#039;text in english&#039;, pl=&#039;tekst po polsku&#039;}, lang)&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
  1: args - table with translations by language&lt;br /&gt;
  2: lang - desired language (often user&#039;s native language)&lt;br /&gt;
  &lt;br /&gt;
Outputs:&lt;br /&gt;
  1: label - returned label&lt;br /&gt;
  2: lang  - language of the label (langSwitchWithLang only)&lt;br /&gt;
]]&lt;br /&gt;
function core.langSwitchWithLang(args, lang)&lt;br /&gt;
	local langList = mw.language.getFallbacksFor(lang)&lt;br /&gt;
	table.insert(langList,1,lang)&lt;br /&gt;
	for i,language in ipairs(langList) do&lt;br /&gt;
		if args[language] then&lt;br /&gt;
			return args[language], language&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function core.langSwitch(args, lang)&lt;br /&gt;
	local label, lang = core.langSwitchWithLang(args, lang)&lt;br /&gt;
	return label&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
display a language followed by a message. Like &amp;quot;English: Hello&amp;quot; with extensive HTML marking&lt;br /&gt;
Code equivalent to https://commons.wikimedia.org/wiki/Template:Description &lt;br /&gt;
Inputs:&lt;br /&gt;
  1) text_lang - language code for the above text, also used as a name of the CSS formating class&lt;br /&gt;
  2) text - description text to display&lt;br /&gt;
  3) args -  additional optional arguments. Numbers in perenthesis are parameter numbers in the original template.&lt;br /&gt;
	   * hover    - (3) hover aka mouseover aka tooltip text&lt;br /&gt;
	   * lang_tag - (4) standard code for lang tag in HTML (optional, default is same as text_lang)&lt;br /&gt;
	   * ext      - (5) extension text shown after the language name before colon (optional, default is empty)&lt;br /&gt;
       * inline - Optional, default is false. When set to true, forces the template to be displayed &lt;br /&gt;
            inline, so that it does not break the current paragraph (that makes possible to put several &lt;br /&gt;
	        descriptions side by side on a single line)	   &lt;br /&gt;
]]&lt;br /&gt;
function core.langWrapper(text_lang, text, args) &lt;br /&gt;
	local dir, space, colon, lang_name, hover&lt;br /&gt;
	local inline    = core.yesno(args.inline, false) and &#039;inline&#039; or nil &lt;br /&gt;
	if 	mw.language.isKnownLanguageTag(text_lang) then -- supported language&lt;br /&gt;
		local langObj = mw.language.new( text_lang )&lt;br /&gt;
		dir       = langObj:getDir()          -- text direction&lt;br /&gt;
		space     = mw.message.new( &amp;quot;Word-separator&amp;quot; ):inLanguage(text_lang):plain() &lt;br /&gt;
		colon     = mw.message.new( &amp;quot;Colon&amp;quot; ):inLanguage(text_lang):plain() &lt;br /&gt;
		hover     = mw.language.fetchLanguageName( text_lang, args.user_lang or &#039;en&#039;)&lt;br /&gt;
		lang_name = mw.language.fetchLanguageName( text_lang, text_lang)&lt;br /&gt;
		lang_name = langObj:ucfirst(lang_name)&lt;br /&gt;
	else -- unsuported language&lt;br /&gt;
		local RTL_LUT = {[&#039;fa-af&#039;]=1, prd=1, ydd=1}&lt;br /&gt;
		dir   = (RTL_LUT[text_lang]==1 or text_lang:gsub(&#039;-arab&#039;, &#039;&#039;)~=text_lang) and &#039;rtl&#039; or &#039;ltr&#039;&lt;br /&gt;
		space = &#039; &#039;&lt;br /&gt;
		colon = &#039;:&#039;&lt;br /&gt;
		hover = args.hover&lt;br /&gt;
		lang_name = text_lang or &#039;Unknown&#039;&lt;br /&gt;
	end&lt;br /&gt;
	lang_name = args.lang_name or lang_name-- user provided args.lang_name takes presedent&lt;br /&gt;
	lang_name = &#039;&amp;lt;b&amp;gt;&#039; .. lang_name .. (args.ext or &#039;&#039;) .. colon .. &#039;&amp;lt;/b&amp;gt;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- create HTML&lt;br /&gt;
	local ltag = mw.html.create(&#039;span&#039;)  -- bold language name string&lt;br /&gt;
		:addClass(&#039;language&#039;)  -- class: &amp;quot;language&amp;quot; &lt;br /&gt;
		:addClass(text_lang)   -- class:  &amp;quot;en&amp;quot;, &amp;quot;de&amp;quot; etc.	&lt;br /&gt;
		:attr(&#039;title&#039;, hover)  -- add hover aka mouseover aka tooltip text&lt;br /&gt;
		:wikitext(lang_name)&lt;br /&gt;
	local dtag = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		:addClass(&#039;description&#039;)      -- div.description is tracked by mw:Extension:CommonsMetadata&lt;br /&gt;
		:addClass(&#039;mw-content-&#039;..dir) -- mw-content-rtl and mw-content-ltr are defined in mediawiki-code (https://gerrit.wikimedia.org/r/c/mediawiki/core/+/208332)&lt;br /&gt;
		:addClass(text_lang)          -- not sure where &amp;quot;en&amp;quot;, &amp;quot;de&amp;quot; etc. are defined&lt;br /&gt;
		:attr(&#039;dir&#039;, dir)&lt;br /&gt;
		:attr(&#039;lang&#039;, text_lang)&lt;br /&gt;
		:css(&#039;display&#039;, inline) &lt;br /&gt;
		:wikitext(tostring(ltag) .. space .. text)&lt;br /&gt;
	return tostring(dtag)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
Inputs:&lt;br /&gt;
  1) val - value to be evaluated, outputs as a function of values:&lt;br /&gt;
		true  : true  (boolean), 1 (number), or strings: &amp;quot;yes&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;1&amp;quot;&lt;br /&gt;
		false : false (boolean), 0 (number), or strings: &amp;quot;no&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;0&amp;quot;&lt;br /&gt;
  2) default - value to return otherwise&lt;br /&gt;
See Also: It works similarly to Module:Yesno&lt;br /&gt;
]]&lt;br /&gt;
function core.yesno(val, default)&lt;br /&gt;
	if type(val) == &#039;boolean&#039; then&lt;br /&gt;
		return val&lt;br /&gt;
	elseif type(val) == &#039;number&#039; then&lt;br /&gt;
		val = tostring(val)&lt;br /&gt;
	end&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		local LUT = {&lt;br /&gt;
			yes=true , y=true , [&#039;true&#039;] =true , t=true , [&#039;1&#039;]=true , on =true,&lt;br /&gt;
			no =false, n=false, [&#039;false&#039;]=false, f=false, [&#039;0&#039;]=false, off=false }&lt;br /&gt;
	    val = LUT[mw.ustring.lower(val)]  -- put in lower case&lt;br /&gt;
	    if (val~=nil) then&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
    end&lt;br /&gt;
    return default&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Read Commons Data:SOMENAME.tab dataset and look for message identified by a &lt;br /&gt;
&amp;quot;key&amp;quot; in a language &amp;quot;lang&amp;quot;. See editAtWikidata for an example. It uses&lt;br /&gt;
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.ext.data&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
 1) dataset - name of commons page in &amp;quot;data&amp;quot; namespace. for example &amp;quot;I18n/EditAt.tab&amp;quot; &lt;br /&gt;
	for c:Data:I18n/EditAt.tab&lt;br /&gt;
 2) key - which message to pull&lt;br /&gt;
 3) lang - desired language of the message&lt;br /&gt;
Output: message as a string&lt;br /&gt;
]]&lt;br /&gt;
function core.formatMessage(dataset, key, lang)&lt;br /&gt;
	for _, row in pairs(mw.ext.data.get(dataset, lang).data) do&lt;br /&gt;
		local id, msg = unpack(row)&lt;br /&gt;
		if id == key then&lt;br /&gt;
			return mw.message.newRawMessage(msg):plain()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	error(&#039;Invalid message key &amp;quot;&#039; .. key .. &#039;&amp;quot;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Assembles the &amp;quot;Edit at Wikidata&amp;quot; pen icon with a link to Wikidata page or specific &lt;br /&gt;
property and returns it as wikitext string.&lt;br /&gt;
Inputs:&lt;br /&gt;
  1) entityID - wikidata entity object for a given page (output of wikibase.getEntity( id ))&lt;br /&gt;
  2) propertyID - string like &#039;P31&#039; so the link will point to that specific property. Use &amp;quot;&amp;quot; &lt;br /&gt;
     to link to the whole page. &lt;br /&gt;
  3) lang - language of the &amp;quot;Edit at Wikidata&amp;quot;  message&lt;br /&gt;
Dependencies: Data:I18n/EditAt.tab&lt;br /&gt;
See Also: en:Module:EditAtWikidata&lt;br /&gt;
]]&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
function core.editAtWikidata(entityID, propertyID, lang)&lt;br /&gt;
	local msg  = core.formatMessage(&#039;I18n/EditAt.tab&#039;, &#039;EditAtWikidata&#039;, lang)&lt;br /&gt;
	local link = &#039;https://www.wikidata.org/wiki/&#039; .. entityID .. (propertyID == &amp;quot;&amp;quot; and &amp;quot;&amp;quot; or (&amp;quot;#&amp;quot; .. propertyID))&lt;br /&gt;
	return &amp;quot;&amp;amp;nbsp;[[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=&amp;quot;..msg..&amp;quot;|link=&amp;quot;..link..&amp;quot;|&amp;quot;..msg..&amp;quot;]]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Assembles the &amp;quot;Edit at SDC&amp;quot; pen icon with a link to a property in SDC part of the current file &lt;br /&gt;
page, and returns it as wikitext string.&lt;br /&gt;
Inputs:&lt;br /&gt;
  2) propertyID - string like &#039;P31&#039; so the link will point to that specific property. Use &#039;ooui-php-4&#039; &lt;br /&gt;
     to link to the label section. &lt;br /&gt;
  3) lang - language of the &amp;quot;Edit at Wikidata&amp;quot;  message&lt;br /&gt;
Dependencies: Data:I18n/EditAt.tab&lt;br /&gt;
See Also: en:Module:EditAtWikidata&lt;br /&gt;
]]&lt;br /&gt;
function core.editAtSDC(propertyID, lang)&lt;br /&gt;
	local msg  = core.formatMessage(&#039;I18n/EditAt.tab&#039;, &#039;EditAtSDC&#039;, lang)&lt;br /&gt;
	local link =  mw.title.getCurrentTitle():fullUrl() .. (propertyID == &amp;quot;&amp;quot; and &amp;quot;&amp;quot; or (&amp;quot;#&amp;quot; .. propertyID))&lt;br /&gt;
	return &amp;quot;&amp;amp;nbsp;[[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=&amp;quot;..msg..&amp;quot;|link=&amp;quot;..link..&amp;quot;|&amp;quot;..msg..&amp;quot;]]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
This function returns a label translated to desired language, created based on wikidata&lt;br /&gt;
Code equivalent to require(&amp;quot;Module:Wikidata label&amp;quot;)._getLabel&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
	1: item - wikidata&#039;s item&#039;s q-id or entity class&lt;br /&gt;
	2: userLang - desired language of the label&lt;br /&gt;
]]&lt;br /&gt;
function core.getLabel(item, userLang) &lt;br /&gt;
	local label, link&lt;br /&gt;
	-- build language fallback list&lt;br /&gt;
	local langList = mw.language.getFallbacksFor(userLang)&lt;br /&gt;
	table.insert(langList, 1, userLang) &lt;br /&gt;
	-- get label&lt;br /&gt;
	for _, lang in ipairs(langList) do  -- loop over language fallback list looking for label in the specific language&lt;br /&gt;
		label = mw.wikibase.getLabelByLang(item, lang)&lt;br /&gt;
		if label then break end                    -- label found and we are done&lt;br /&gt;
	end	&lt;br /&gt;
	label = label or item -- fallback value&lt;br /&gt;
	-- get link&lt;br /&gt;
	for _, lang in ipairs(langList) do  -- loop over language fallback list looking for label in the specific language&lt;br /&gt;
		link =  mw.wikibase.getSitelink(item, lang .. &#039;wiki&#039;)&lt;br /&gt;
		if link then&lt;br /&gt;
			link = mw.ustring.format(&#039;w:%s:%s&#039;, lang, link)&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	link = link or &#039;d:&#039;..item -- fallback value&lt;br /&gt;
	-- look for description&lt;br /&gt;
	local desc = mw.wikibase.getDescription(item)&lt;br /&gt;
	if desc then  -- add description if we have one&lt;br /&gt;
		desc  = mw.text.nowiki(desc) -- add description as hover text&lt;br /&gt;
		label = &#039;&amp;lt;span title=&amp;quot;&#039; .. desc .. &#039;&amp;quot;&amp;gt;&#039; .. label .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
   return &#039;[[&#039;..link..&#039;|&#039;..label..&#039;]]&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
Core component of many &amp;quot;get property value&amp;quot; functions&lt;br /&gt;
Example: (core.parse_statements(entity:getBestStatements( prop ), nil) or {nil})[1] would &lt;br /&gt;
return the first best statement&lt;br /&gt;
Inputs:&lt;br /&gt;
 1: statements - can be provided by:&lt;br /&gt;
   * entity:getBestStatements( prop )&lt;br /&gt;
   * entity:getAllStatements( prop )&lt;br /&gt;
   * mw.wikibase.getBestStatements( item, prop )&lt;br /&gt;
   * mw.wikibase.getAllStatements( item, prop )&lt;br /&gt;
 2: lang - language code (like &amp;quot;en&amp;quot;), if provided than item IDs will be &lt;br /&gt;
     changed to a label&lt;br /&gt;
Output:&lt;br /&gt;
 * table of strings or nil&lt;br /&gt;
]]&lt;br /&gt;
function core.parseStatements(statements, lang)&lt;br /&gt;
	local output = {}&lt;br /&gt;
	for _, statement in ipairs(statements) do&lt;br /&gt;
		if (statement.mainsnak.snaktype == &amp;quot;value&amp;quot;) and (statement.rank ~= &#039;deprecated&#039;)  then&lt;br /&gt;
			local val = statement.mainsnak.datavalue.value&lt;br /&gt;
			if val.id then &lt;br /&gt;
				val = val.id&lt;br /&gt;
				if lang ~= nil then&lt;br /&gt;
					val = core.getLabel(val, lang)&lt;br /&gt;
				end&lt;br /&gt;
			elseif val.text then&lt;br /&gt;
				val = val.text&lt;br /&gt;
			elseif val.amount then&lt;br /&gt;
				val = tonumber(val.amount)&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(output, val)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #output==0 then return nil end&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return core&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Information&amp;diff=8292</id>
		<title>Template:Information</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Information&amp;diff=8292"/>
		<updated>2021-12-21T22:47:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{heavily used template}}&amp;lt;/noinclude&amp;gt;&amp;lt;!--  &lt;br /&gt;
--&amp;gt;{{#invoke:Information|information&lt;br /&gt;
 | lang   = {{#if:{{{lang|}}} | {{{lang}}} | {{int:Lang}} }}&lt;br /&gt;
 | demo   = {{{demo|&amp;lt;noinclude&amp;gt;1&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Infobox_template_tag&amp;diff=8290</id>
		<title>Template:Infobox template tag</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Infobox_template_tag&amp;diff=8290"/>
		<updated>2021-12-21T22:47:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-translatelabel&amp;diff=8288</id>
		<title>Template:Gadget-translatelabel</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-translatelabel&amp;diff=8288"/>
		<updated>2021-12-21T22:47:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}} will be the name of a gadget description page, like MediaWiki:Gadget-QuickDelete &lt;br /&gt;
--&amp;gt;&amp;lt;onlyinclude&amp;gt;{{#switch: {{int:Lang}}&lt;br /&gt;
| en =&lt;br /&gt;
| en-gb = &amp;lt;!-- do nothing for English (assume English exists) --&amp;gt;&lt;br /&gt;
| #default = &amp;lt;!-- default for switch &lt;br /&gt;
 --&amp;gt; {{#ifexist: {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}/{{int:Lang}}&lt;br /&gt;
  |&amp;lt;!-- do nothing: language version exists --&amp;gt;&lt;br /&gt;
  |{{#ifeq: {{GetFallback|{{int:Lang}}}}|en&lt;br /&gt;
   |&amp;lt;!-- language version falls back to en --&amp;gt; {{Gadget-translation|{{int:lang}}|base={{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}}}&lt;br /&gt;
   |{{#ifexist: {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}/{{GetFallback|{{int:Lang}}}}&lt;br /&gt;
    |&amp;lt;!-- do nothing, fallback version exists --&amp;gt;&lt;br /&gt;
    |&amp;lt;!-- fallback doesn&#039;t exist, request translation for that --&amp;gt; {{Gadget-translation|{{GetFallback|{{int:Lang}}}}|base={{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}}}&lt;br /&gt;
   }}&lt;br /&gt;
  }}&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-state/deprecation&amp;diff=8286</id>
		<title>Template:Gadget-state/deprecation</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-state/deprecation&amp;diff=8286"/>
		<updated>2021-12-21T22:47:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#ifeq:{{Gadget-state|type=deprecationState|gadget={{#titleparts:{{PAGENAME:{{{self|&amp;lt;noinclude&amp;gt;MediaWiki:Gadget-diffGreenBlue/de&amp;lt;/noinclude&amp;gt;}}}}}|1}}}}&lt;br /&gt;
    |true&lt;br /&gt;
    |&amp;amp;nbsp;&amp;lt;sup&amp;gt;&amp;lt;abbr title=&amp;quot;{{int:label-gadget-deprecation-tooltip}}&amp;quot;&amp;gt;×&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-state/default&amp;diff=8284</id>
		<title>Template:Gadget-state/default</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-state/default&amp;diff=8284"/>
		<updated>2021-12-21T22:47:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#ifeq:{{Gadget-state|type=defaultState|gadget={{#titleparts:{{PAGENAME:{{{self|&amp;lt;noinclude&amp;gt;MediaWiki:Gadget-UploadWizard/de&amp;lt;/noinclude&amp;gt;}}}}}|1}}}}&lt;br /&gt;
    |true&lt;br /&gt;
    |&amp;amp;nbsp;&amp;lt;sup&amp;gt;&amp;lt;abbr title=&amp;quot;{{int:label-gadget-state-default-tooltip}}&amp;quot;&amp;gt;{{int:label-gadget-state-default-symbol}}&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-state&amp;diff=8282</id>
		<title>Template:Gadget-state</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-state&amp;diff=8282"/>
		<updated>2021-12-21T22:47:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#switch: {{{1|{{{type}}}}}}&lt;br /&gt;
 | defaultState = {{#switch: {{{2|{{{gadget}}}}}}&lt;br /&gt;
   | Gadget-CollapsibleTemplates&lt;br /&gt;
   | Gadget-HotCat&lt;br /&gt;
   | Gadget-ImprovedUploadForm&lt;br /&gt;
   | Gadget-LanguageSelect&lt;br /&gt;
   | Gadget-ZoomViewer&lt;br /&gt;
   | Gadget-Slideshow&lt;br /&gt;
   | Gadget-UploadWizard&lt;br /&gt;
   | Gadget-MyUploads&lt;br /&gt;
   | Gadget-RotateLink&lt;br /&gt;
   | Gadget-RenameLink&lt;br /&gt;
   | Gadget-Stockphoto&lt;br /&gt;
   | Gadget-PictureOfTheYearEnhancements&lt;br /&gt;
   | Gadget-WikiMiniAtlas&lt;br /&gt;
   | Gadget-Long-Image-Names-in-Categories&lt;br /&gt;
   | Gadget-WatchlistNotice&lt;br /&gt;
   | Gadget-AjaxQuickDelete&lt;br /&gt;
   | Gadget-fastcci = true&lt;br /&gt;
   |#default = false&lt;br /&gt;
 }}&lt;br /&gt;
 | deprecationState = {{#switch: {{{2|{{{gadget}}}}}}&lt;br /&gt;
   | Gadget-DisableImageAnnotator&lt;br /&gt;
   | Gadget-diffGreenBlue = true&lt;br /&gt;
   |#default = false&lt;br /&gt;
 }}&lt;br /&gt;
 | alsoActivates = {{#switch: {{{2|{{{gadget}}}}}}&lt;br /&gt;
   | Gadget-RenameLink&lt;br /&gt;
   | Gadget-QuickDelete = AjaxQuickDelete&lt;br /&gt;
   | Gadget-ThumbnailPurger = ExtraTabs2&lt;br /&gt;
   |#default=&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
[[Category:Helper templates]]&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-langdir&amp;diff=8280</id>
		<title>Template:Gadget-langdir</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-langdir&amp;diff=8280"/>
		<updated>2021-12-21T22:47:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{{2|}}}&lt;br /&gt;
|lang=&amp;quot;{{{2|}}}&amp;quot; dir=&amp;quot;{{dir|{{{2|}}}}}&amp;quot;&lt;br /&gt;
|{{#ifeq:{{#titleparts:{{{1|}}}||-1}}|{{{1|}}}&lt;br /&gt;
 |lang=&amp;quot;en&amp;quot; dir=&amp;quot;ltr&amp;quot;&lt;br /&gt;
 |lang=&amp;quot;{{#titleparts:{{{1|}}}||-1}}&amp;quot; dir=&amp;quot;{{dir|{{#titleparts:{{{1|}}}||-1}}}}&amp;quot;&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-desc&amp;diff=8278</id>
		<title>Template:Gadget-desc</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-desc&amp;diff=8278"/>
		<updated>2021-12-21T22:47:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;{{anchorencode:mw-prefsection-gadgets-{{BASEPAGENAME:{{#titleparts:{{{self|}}}|1}}}}}}&amp;quot; {{Gadget-langdir|{{{self|}}}|{{{lang|}}}}}&amp;quot;&amp;gt;{{#if:{{{name|}}}&lt;br /&gt;
  |&amp;lt;bdi&amp;gt;&#039;&#039;{{{name|}}}&#039;&#039;&amp;lt;/bdi&amp;gt;:{{#if:{{{self|}}}&lt;br /&gt;
    |{{Gadget-state/default|self={{{self}}}}}{{Gadget-state/deprecation|self={{{self}}}}}&lt;br /&gt;
  }}&amp;amp;#32;&lt;br /&gt;
}}{{{desc|{{{1}}}}}}&amp;lt;/span&amp;gt; &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{doc|}}}{{{example|}}}{{{talk|}}}&lt;br /&gt;
|&amp;lt;small&amp;gt;&amp;amp;#91;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{doc|}}}|[[{{{doc}}}|&amp;lt;bdi&amp;gt;{{int:label-gadget-documentation}}&amp;lt;/bdi&amp;gt;]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{example|}}}|{{#if:{{{doc|}}}|&amp;amp;nbsp;/&amp;amp;nbsp;}}[[{{{example}}}|&amp;lt;bdi&amp;gt;{{int:label-gadget-example}}&amp;lt;/bdi&amp;gt;]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{talk|}}}|{{#if:{{{doc|}}}{{{example|}}}|&amp;amp;nbsp;/&amp;amp;nbsp;}}[[{{{talk}}}|&amp;lt;bdi&amp;gt;{{int:label-gadget-discuss}}&amp;lt;/bdi&amp;gt;]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;amp;#93;&amp;lt;/small&amp;gt;&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;amp;nbsp;{{#if:{{{self|}}}|{{#if:{{Gadget-translatelabel|{{{self|}}}}}&lt;br /&gt;
|&amp;lt;small&amp;gt;&amp;amp;#91;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;bdi&amp;gt;{{Gadget-translatelabel|{{{self|}}}}}&amp;lt;/bdi&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;amp;#93;&amp;lt;/small&amp;gt;}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.css&amp;diff=8276</id>
		<title>MediaWiki:Gadget-Stockphoto.css</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.css&amp;diff=8276"/>
		<updated>2021-12-21T22:47:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.stockphoto-layout-vertical {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	min-width: 160px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_buttonrow {&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.stockphoto_buttonrow {&lt;br /&gt;
	color: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto-layout-vertical .stockphoto_buttonrow {&lt;br /&gt;
	display: flex;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto-layout-horizontal .stockphoto_buttonrow {&lt;br /&gt;
	margin-left: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_buttonrow_icon {&lt;br /&gt;
	opacity: 0.7;&lt;br /&gt;
	transform: opacity 0.3 ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto-layout-vertical .stockphoto_buttonrow_icon {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	flex: 0;&lt;br /&gt;
	margin: 0 10px 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto-layout-horizontal .stockphoto_buttonrow_icon {&lt;br /&gt;
	padding-right: .2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_buttonrow:hover .stockphoto_buttonrow_icon {&lt;br /&gt;
	opacity: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_buttonrow_text {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	flex: 1;&lt;br /&gt;
	vertical-align: middle;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto-layout-vertical .stockphoto_buttonrow_text a {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_buttonrow_text small {&lt;br /&gt;
	display: block; /* new line */&lt;br /&gt;
	font-size: inherit; /* undo small size */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto-layout-horizontal-small .stockphoto_buttonrow_text small {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_dialog_row {&lt;br /&gt;
	display: block;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_dialog_row input[type=&amp;quot;text&amp;quot;],&lt;br /&gt;
.stockphoto_dialog_row textarea {&lt;br /&gt;
	width: 99%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_attribution_preview {&lt;br /&gt;
	margin: 0 1em 1em 0;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input#stockphoto_attribution {&lt;br /&gt;
	width: 88%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_dialog_row textarea {&lt;br /&gt;
	min-height: 80px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
textarea#stockphoto_html {&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.stockphoto_note {&lt;br /&gt;
	display: block;&lt;br /&gt;
	margin-top: -5px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	font-size: smaller;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8274</id>
		<title>MediaWiki:Gadget-Stockphoto.js</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto.js&amp;diff=8274"/>
		<updated>2021-12-21T22:47:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
 * StockPhoto - shows download and attribution buttons&lt;br /&gt;
 *&lt;br /&gt;
 * Revision: 2020-10-16&lt;br /&gt;
 * Dependencies: mediawiki.util, mediawiki.user&lt;br /&gt;
 * Source: https://commons.wikimedia.org/wiki/MediaWiki:Gadget-Stockphoto.js&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2010-09/10 by Magnus Manske&lt;br /&gt;
 * Copyright 2011-2020 Timo Tijhof&lt;br /&gt;
 *&lt;br /&gt;
 * Permission is hereby granted, free of charge, to any person obtaining&lt;br /&gt;
 * a copy of this software and associated documentation files (the&lt;br /&gt;
 * &amp;quot;Software&amp;quot;), to deal in the Software without restriction, including&lt;br /&gt;
 * without limitation the rights to use, copy, modify, merge, publish,&lt;br /&gt;
 * distribute, sublicense, and/or sell copies of the Software, and to&lt;br /&gt;
 * permit persons to whom the Software is furnished to do so, subject to&lt;br /&gt;
 * the following conditions:&lt;br /&gt;
 *&lt;br /&gt;
 * The above copyright notice and this permission notice shall be&lt;br /&gt;
 * included in all copies or substantial portions of the Software.&lt;br /&gt;
 *&lt;br /&gt;
 * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND,&lt;br /&gt;
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF&lt;br /&gt;
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND&lt;br /&gt;
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE&lt;br /&gt;
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION&lt;br /&gt;
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION&lt;br /&gt;
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;br /&gt;
 */&lt;br /&gt;
/* eslint-env browser */&lt;br /&gt;
/* global $, mw */&lt;br /&gt;
(function () {&lt;br /&gt;
&#039;use strict&#039;;&lt;br /&gt;
&lt;br /&gt;
var stockPhoto, modalLoad;&lt;br /&gt;
&lt;br /&gt;
if (&lt;br /&gt;
  // Already loaded&lt;br /&gt;
  window.stockPhoto&lt;br /&gt;
  // Unsupported skin&lt;br /&gt;
  || !/^(?:vector|monobook|timeless)$/.test(mw.config.get(&#039;skin&#039;))&lt;br /&gt;
  // Not a file page&lt;br /&gt;
  || mw.config.get(&#039;wgCanonicalNamespace&#039;) !== &#039;File&#039;&lt;br /&gt;
  // Not regular view&lt;br /&gt;
  || mw.config.get(&#039;wgAction&#039;) !== &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
  // Do not load&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @param {string} opt.pageName&lt;br /&gt;
 * @param {string} opt.originalUrl&lt;br /&gt;
 * @param {jQuery} opt.dom Keys $aut, $src, $attr, $credit, $licenseAut, $creator&lt;br /&gt;
 * @param {jQuery} opt.$licenses&lt;br /&gt;
 */&lt;br /&gt;
function File(opt) {&lt;br /&gt;
  var re, file = this;&lt;br /&gt;
&lt;br /&gt;
  // Strip namespace prefix and file suffix.&lt;br /&gt;
  // Use spaces for underscore.&lt;br /&gt;
  file.title = opt.pageName.replace(/^[^:]+:|\.[^.]+$/g, &#039;&#039;).replace(/_+/g, &#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  file.url = opt.originalUrl;&lt;br /&gt;
&lt;br /&gt;
  file.backlink = &#039;https://commons.wikimedia.org/wiki/&#039; + mw.util.wikiUrlencode(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.audio_only.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
  file.audio = re.test(opt.pageName);&lt;br /&gt;
&lt;br /&gt;
  this.gfdlNote = false;&lt;br /&gt;
  this.attrRequired = true;&lt;br /&gt;
  this.computeMetadata(opt.dom, opt.$licenses);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicenseLabel = function (short) {&lt;br /&gt;
  if (/^cc[- ]/i.test(short)) {&lt;br /&gt;
    // CC-BY-SA-3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    // CC BY-SA 3.0 -&amp;gt; CC BY-SA 3.0&lt;br /&gt;
    return short.toUpperCase()&lt;br /&gt;
      .replace(/^(CC)-/, &#039;$1 &#039;)&lt;br /&gt;
      .replace(/[- ]([\d.]+)$/, &#039; $1&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  return short;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicensePrio = function (short) {&lt;br /&gt;
  // 1. Public domain or CC 0&lt;br /&gt;
  return /^(public domain|cc0)/i.test(short) ? 1 :&lt;br /&gt;
    // 2. Creative Commons, e.g. &amp;quot;CC-BY-SA-#&amp;quot; (most templates),&lt;br /&gt;
    // or &amp;quot;CC BY-SA #&amp;quot; (some templates)&lt;br /&gt;
    /^cc[- ]by(-sa)?[- ]\d/i.test(short) ? 2 :&lt;br /&gt;
    // 3. Eveything else (e.g. GFDL)&lt;br /&gt;
    3;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set #author, #attribution, and #licenses&lt;br /&gt;
File.prototype.computeMetadata = function (dom, $licenses) {&lt;br /&gt;
  var credit, creditHtml, attribution, licenses,&lt;br /&gt;
    via = stockPhoto.i18n.via_wikimedia_commons,&lt;br /&gt;
    file = this,&lt;br /&gt;
    author = dom.$aut.text().trim(),&lt;br /&gt;
    source = dom.$src.text().trim();&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;author&#039;&lt;br /&gt;
  if (dom.$aut.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (author.match(/^[Uu]nknown$/)) {&lt;br /&gt;
    author = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  author = author.replace(/\s*\(talk\)$/i, &#039;&#039;);&lt;br /&gt;
  if (author.indexOf(&#039;Original uploader was&#039;) !== -1) {&lt;br /&gt;
    author = author.replace(/\s*Original uploader was\s*/g, &#039;&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  if (author.slice(0, 3) === &#039;[&amp;amp;#9660;]&#039;) {&lt;br /&gt;
    author = author.slice(3); // ▼ (Black Down-Pointing Triangle)&lt;br /&gt;
    author = author.split(&#039;Description&#039;)[0].trim();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Clean up &#039;source&#039;&lt;br /&gt;
  if (dom.$src.find(&#039;.boilerplate&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  if (dom.$src.find(&#039;.int-own-work&#039;).length) {&lt;br /&gt;
    source = &#039;&#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Fallback&lt;br /&gt;
  if (!author &amp;amp;&amp;amp; source.length &amp;lt; 50) {&lt;br /&gt;
    author = source;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Parse licenses&lt;br /&gt;
  licenses = [];&lt;br /&gt;
  $licenses.each(function () {&lt;br /&gt;
    var $tpl = $(this),&lt;br /&gt;
      short = $tpl.find(&#039;.licensetpl_short&#039;).text().trim();&lt;br /&gt;
    if (!short) { return; }&lt;br /&gt;
    licenses.push({&lt;br /&gt;
      link: $tpl.find(&#039;.licensetpl_link&#039;).text().trim(),&lt;br /&gt;
      short: short,&lt;br /&gt;
      label: file.getLicenseLabel(short),&lt;br /&gt;
      prio: file.getLicensePrio(short),&lt;br /&gt;
      link_req: $tpl.find(&#039;.licensetpl_link_req&#039;).text().trim(),&lt;br /&gt;
      attr_req: $tpl.find(&#039;.licensetpl_attr_req&#039;).text().trim()&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Use prefered if possible (like CommonsMetadata API)&lt;br /&gt;
  licenses.sort(function (a, b) { return a.prio - b.prio; });&lt;br /&gt;
  if (licenses[0] &amp;amp;&amp;amp; licenses[0].prio &amp;lt; 3) {&lt;br /&gt;
    licenses.splice(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.licenses = licenses.map(function (v) {&lt;br /&gt;
    if (v.attr_req === &#039;false&#039;) {&lt;br /&gt;
      file.attrRequired = false;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.short.indexOf(&#039;GFDL&#039;) !== -1) {&lt;br /&gt;
      file.gfdlNote = true;&lt;br /&gt;
    }&lt;br /&gt;
    if (v.link_req === &#039;true&#039; &amp;amp;&amp;amp; v.link) {&lt;br /&gt;
      return {&lt;br /&gt;
        html: &#039;&amp;lt;a href=&amp;quot;&#039; + v.link + &#039;&amp;quot;&amp;gt;&#039; + mw.html.escape(v.label) + &#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
        txt: v.label + &#039; &amp;lt;&#039; + v.link + &#039;&amp;gt;&#039;&lt;br /&gt;
      };&lt;br /&gt;
    } else {&lt;br /&gt;
      return { html: mw.html.escape(v.label), txt: v.label };&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  // Determine the credit line&lt;br /&gt;
  if (dom.$credit.length) {&lt;br /&gt;
    // Custom credit line&lt;br /&gt;
    credit = dom.$credit.text();&lt;br /&gt;
    creditHtml = dom.$credit.html();&lt;br /&gt;
  }&lt;br /&gt;
  if (!credit) {&lt;br /&gt;
    // No custom credit line&lt;br /&gt;
    // Default credit line: attribution + (if required) license + via promo&lt;br /&gt;
    if (dom.$attr.length) {&lt;br /&gt;
      attribution = dom.$attr.text();&lt;br /&gt;
    } else if (dom.$licenseAut.length) {&lt;br /&gt;
      attribution = dom.$licenseAut.text();&lt;br /&gt;
    } else if (dom.$creator.length) {&lt;br /&gt;
      attribution = dom.$creator.text();&lt;br /&gt;
    }&lt;br /&gt;
    if (!attribution) {&lt;br /&gt;
      // No custom attribution&lt;br /&gt;
      // Default attribution: author or (short) source.&lt;br /&gt;
      // If no author/source, point to the file description page instead.&lt;br /&gt;
      attribution = (author || stockPhoto.i18n.see_page_for_author);&lt;br /&gt;
    }&lt;br /&gt;
    credit = attribution + file.getLicense() + &#039;, &#039; + via;&lt;br /&gt;
    creditHtml = mw.html.element(&#039;a&#039;, {&lt;br /&gt;
      href: file.backlink&lt;br /&gt;
    }, attribution) + file.getLicense(true) + &#039;, &#039; + mw.html.escape(via);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  file.credit = credit;&lt;br /&gt;
  file.creditHtml = creditHtml;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
File.prototype.getLicense = function (useHtml) {&lt;br /&gt;
  var l1, l2,&lt;br /&gt;
  licenses = this.licenses.map(function (l) {&lt;br /&gt;
    return useHtml ? l.html : l.txt;&lt;br /&gt;
  });&lt;br /&gt;
  if (!licenses.length) {&lt;br /&gt;
    return &#039;, &#039; + stockPhoto.i18n.see_page_for_license;&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length === 1) {&lt;br /&gt;
    return &#039;, &#039; + licenses[0];&lt;br /&gt;
  }&lt;br /&gt;
  if (licenses.length &amp;gt;= 2) {&lt;br /&gt;
    l2 = licenses.pop();&lt;br /&gt;
    l1 = licenses.pop();&lt;br /&gt;
    licenses.push(l1 + &#039; &#039; + stockPhoto.i18n.or + &#039; &#039; + l2);&lt;br /&gt;
  }&lt;br /&gt;
  return &#039; (&#039; + licenses.join(&#039;, &#039;) + &#039;)&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
stockPhoto = {&lt;br /&gt;
  ui_icon_download: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/Gnome-document-save.svg/50px-Gnome-document-save.svg.png&#039;,&lt;br /&gt;
  ui_icon_web: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Gnome-emblem-web.svg/50px-Gnome-emblem-web.svg.png&#039;,&lt;br /&gt;
  ui_icon_wiki: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Tango_style_Wikipedia_Icon.svg/50px-Tango_style_Wikipedia_Icon.svg.png&#039;,&lt;br /&gt;
  ui_icon_email: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Gnome-mail-send.svg/50px-Gnome-mail-send.svg.png&#039;,&lt;br /&gt;
  ui_icon_help: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Dialog-information_on.svg/50px-Dialog-information_on.svg.png&#039;,&lt;br /&gt;
  ui_icon_remove: &#039;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Emblem-unreadable.svg/20px-Emblem-unreadable.svg.png&#039;,&lt;br /&gt;
  information_template_hints: [&#039;fileinfotpl_desc&#039;, &#039;fileinfotpl_src&#039;],&lt;br /&gt;
  audio_only: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;],&lt;br /&gt;
  horizontal_ui: [&#039;midi&#039;, &#039;ogg&#039;, &#039;flac&#039;, &#039;pdf&#039;, &#039;djvu&#039;],&lt;br /&gt;
  ogg_icon: &#039;/w/resources/assets/file-type-icons/fileicon-ogg.png&#039;,&lt;br /&gt;
&lt;br /&gt;
  init: function () {&lt;br /&gt;
    var $enable, $orgItems, has_information, $imgBox, xoff, yoff, horizontal, html, $base, re;&lt;br /&gt;
    // Original filetoc items&lt;br /&gt;
    $orgItems = $(&#039;#filetoc&#039;).find(&#039;a[href=&amp;quot;#file&amp;quot;], a[href=&amp;quot;#filehistory&amp;quot;], a[href=&amp;quot;#filelinks&amp;quot;], a[href=&amp;quot;#metadata&amp;quot;], a[href=&amp;quot;#globalusage&amp;quot;]&#039;).parent();&lt;br /&gt;
    if ($.cookie(&#039;StockPhotoDisabled&#039;)) {&lt;br /&gt;
      $enable = $(&#039;&amp;lt;li&amp;gt;&#039;)&lt;br /&gt;
      .append($(&#039;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;).text(stockPhoto.i18n.reuse))&lt;br /&gt;
      .click(function (e){&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        $(this).remove();&lt;br /&gt;
        $.cookie(&#039;StockPhotoDisabled&#039;, null, {&lt;br /&gt;
          path: &#039;/&#039;&lt;br /&gt;
        });&lt;br /&gt;
        stockPhoto.init();&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($enable);&lt;br /&gt;
      $orgItems = $orgItems.add($enable);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    if (!$(&#039;#file&#039;).length) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    has_information = stockPhoto.information_template_hints.some(function (v) {&lt;br /&gt;
      return document.querySelector(&#039;#&#039; + v);&lt;br /&gt;
    });&lt;br /&gt;
    // No {{Information}}&lt;br /&gt;
    if (!has_information) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Has one or more problemtags&lt;br /&gt;
    // Changed to also include renames and normal deletes&lt;br /&gt;
    if (document.querySelector(&#039;.nuke&#039;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // * &amp;quot;.multipageimage&amp;quot;: For paged tiff files.&lt;br /&gt;
    // * &amp;quot;#file img&amp;quot;: For all other images (e.g. JPEG, PNG, SVG, etc.).&lt;br /&gt;
    // * &amp;quot;#file .mediaContainer&amp;quot;: For TMH-media (video files, audio files). We cannot use &#039;mwEmbedPlayer&#039; or &#039;mwPlayerContainer&#039; as those might not exist yet.&lt;br /&gt;
    $imgBox = $(&#039;.multipageimage, #file img,#file .mediaContainer&#039;);&lt;br /&gt;
    xoff = $imgBox.width() + 40;&lt;br /&gt;
    yoff = $(&#039;#file&#039;).position().top + 5;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.small_horizontal_layout = (&lt;br /&gt;
      // Small for logged-in&lt;br /&gt;
      !mw.user.isAnon()&lt;br /&gt;
      // Small for media with short height&lt;br /&gt;
      || ($imgBox.height() &amp;lt; 300)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    re = new RegExp(&#039;\\.(?:&#039; + stockPhoto.horizontal_ui.map(mw.RegExp.escape).join(&#039;|&#039;) + &#039;)$&#039;, &#039;i&#039;);&lt;br /&gt;
&lt;br /&gt;
    horizontal = (&lt;br /&gt;
      // Anything small&lt;br /&gt;
      stockPhoto.small_horizontal_layout&lt;br /&gt;
      || re.test(mw.config.get(&#039;wgTitle&#039;))&lt;br /&gt;
      // Window width&lt;br /&gt;
      || (document.documentElement.clientWidth &amp;lt; 1030)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    // Initialize values&lt;br /&gt;
    stockPhoto.share_this(-1);&lt;br /&gt;
    html = &#039;&amp;lt;div class=&amp;quot;&#039;;&lt;br /&gt;
    html += (horizontal ? &#039;stockphoto-layout-horizontal&#039; : &#039;stockphoto-layout-vertical&#039;);&lt;br /&gt;
    html += (stockPhoto.small_horizontal_layout ? &#039; stockphoto-layout-horizontal-small&#039; : &#039;&#039;);&lt;br /&gt;
    html += &#039;&amp;quot;&#039;;&lt;br /&gt;
    if (!horizontal) {&lt;br /&gt;
      if (document.querySelector(&#039;body.rtl&#039;)) {&lt;br /&gt;
        html += &#039; style=&amp;quot;right: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        html += &#039; style=&amp;quot;left: &#039; + xoff + &#039;px; top:&#039; + yoff + &#039;px;&amp;quot;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    html += &#039;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
    $base = $(html).append(&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_download, stockPhoto.call_download, stockPhoto.i18n.download, stockPhoto.i18n.all_sizes),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_web, stockPhoto.call_web, stockPhoto.i18n.use_this_file_web_short, stockPhoto.i18n.on_a_website),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_wiki, stockPhoto.call_wiki, stockPhoto.i18n.use_this_file_wiki_short, stockPhoto.i18n.on_a_wiki),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_email,&lt;br /&gt;
        &#039;mailto:?subject=&#039; + encodeURIComponent(stockPhoto.file.title) + &#039;&amp;amp;body=&#039; +&lt;br /&gt;
          encodeURIComponent(stockPhoto.file.backlink + &#039;\n\n&#039; + stockPhoto.file.credit),&lt;br /&gt;
        stockPhoto.i18n.email_link_short, stockPhoto.i18n.to_this_file),&lt;br /&gt;
      stockPhoto.add_button_row(stockPhoto.ui_icon_help,&lt;br /&gt;
        mw.util.getUrl(&#039;Special:MyLanguage/Commons:Reusing_content_outside_Wikimedia&#039;),&lt;br /&gt;
        stockPhoto.i18n.information, stockPhoto.i18n.about_reusing),&lt;br /&gt;
      $(&#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow&amp;quot;&amp;gt;&amp;lt;a title=&amp;quot;&#039; + stockPhoto.i18n.remove_icons + &#039;&amp;quot; class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&#039; + stockPhoto.ui_icon_remove + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&#039;)&lt;br /&gt;
        .click(function () {&lt;br /&gt;
          $.cookie(&#039;StockPhotoDisabled&#039;, true, {&lt;br /&gt;
            expires: 60, // days&lt;br /&gt;
            path: &#039;/&#039;&lt;br /&gt;
          });&lt;br /&gt;
          $base.remove();&lt;br /&gt;
          $orgItems.show();&lt;br /&gt;
        })&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      $orgItems.hide();&lt;br /&gt;
      $(&#039;#filetoc&#039;).append($base);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&#039;#filetoc&#039;).after($base);&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  add_button_row: function (icon_url, fn, txt, html) {&lt;br /&gt;
    var ret,&lt;br /&gt;
      size = 50;&lt;br /&gt;
    if (stockPhoto.small_horizontal_layout) {&lt;br /&gt;
      size = 20;&lt;br /&gt;
    }&lt;br /&gt;
    // HiDPI &amp;quot;Retina&amp;quot; icon&lt;br /&gt;
    var realSize = size;&lt;br /&gt;
    if (window.devicePixelRatio &amp;gt; 1.0) {&lt;br /&gt;
        realSize *= 2;&lt;br /&gt;
    }&lt;br /&gt;
    icon_url = icon_url.replace(&#039;/50px-&#039;, &#039;/&#039; + realSize + &#039;px-&#039;);&lt;br /&gt;
&lt;br /&gt;
    ret = document.createElement(typeof fn === &#039;string&#039; ? &#039;a&#039; : &#039;span&#039;);&lt;br /&gt;
    ret.className = &#039;stockphoto_buttonrow&#039;;&lt;br /&gt;
    ret.title = txt + &#039; &#039; + html;&lt;br /&gt;
    if (typeof fn === &#039;string&#039;) {&lt;br /&gt;
      ret.href = fn;&lt;br /&gt;
    } else {&lt;br /&gt;
      ret.role = &#039;button&#039;;&lt;br /&gt;
      ret.tabIndex = 0;&lt;br /&gt;
      ret.onclick = fn;&lt;br /&gt;
    }&lt;br /&gt;
    ret.innerHTML = &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_icon&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + size + &#039;&amp;quot; height=&amp;quot;&#039; + size + &#039;&amp;quot; src=&amp;quot;&#039; + icon_url + &#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
      &#039;&amp;lt;span class=&amp;quot;stockphoto_buttonrow_text&amp;quot;&amp;gt;&amp;lt;a&amp;gt;&#039; + txt + &#039;&amp;lt;/a&amp;gt;&amp;lt;small&amp;gt;&#039; + html + &#039;&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    return ret;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  stockphoto_get_thumbnail_url: function (width) {&lt;br /&gt;
    var thumb_url, alt_title, last;&lt;br /&gt;
    if (stockPhoto.file.audio) {&lt;br /&gt;
      return stockPhoto.ogg_icon;&lt;br /&gt;
    }&lt;br /&gt;
    alt_title = mw.config.get(&#039;wgCanonicalNamespace&#039;) + &#039;:&#039; + mw.config.get(&#039;wgTitle&#039;);&lt;br /&gt;
    $(&#039;#file img&#039;).each(function () {&lt;br /&gt;
      var i = this.alt;&lt;br /&gt;
      if (i &amp;amp;&amp;amp; i !== alt_title) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
      thumb_url = this.src.split(&#039;/&#039;);&lt;br /&gt;
    });&lt;br /&gt;
    // Special case of mwEmbed rewrite&lt;br /&gt;
    if (!thumb_url &amp;amp;&amp;amp; $(&#039;.mwEmbedPlayer img&#039;).length) {&lt;br /&gt;
      return $(&#039;.mwEmbedPlayer img&#039;).attr(&#039;src&#039;);&lt;br /&gt;
    }&lt;br /&gt;
    if (!thumb_url || !thumb_url.length)&lt;br /&gt;
      return;&lt;br /&gt;
&lt;br /&gt;
    last = thumb_url.pop().replace(/^\d+px-/, width + &#039;px-&#039;);&lt;br /&gt;
    thumb_url.push(last);&lt;br /&gt;
    thumb_url = thumb_url.join(&#039;/&#039;);&lt;br /&gt;
    return thumb_url;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  is_audio_video_asset: function (url) {&lt;br /&gt;
    return /(ogv|ogg|oga|ebm|wav)$/.test(url.slice(-3));&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  make_html_textarea: function () {&lt;br /&gt;
    var width, type, height, thumb_url, t;&lt;br /&gt;
&lt;br /&gt;
    width = $(&#039;#stockphoto_html_select&#039;).val();&lt;br /&gt;
    type = $(&#039;input[name=&amp;quot;stockphoto_code_type&amp;quot;]:checked&#039;).val();&lt;br /&gt;
&lt;br /&gt;
    // Iframe share for mwEmbed player&lt;br /&gt;
    if (stockPhoto.is_audio_video_asset(stockPhoto.file.backlink) &amp;amp;&amp;amp; type === &#039;html&#039;) {&lt;br /&gt;
      // Get the ratio (from html or from mwEmbed player)&lt;br /&gt;
      height = $(&#039;.mwEmbedPlayer&#039;).length&lt;br /&gt;
        ? width * $(&#039;.mwEmbedPlayer&#039;).height() / $(&#039;.mwEmbedPlayer&#039;).width()&lt;br /&gt;
        : width * $(&#039;#file img,#file video&#039;).height() / $(&#039;#file img,#file video&#039;).width();&lt;br /&gt;
&lt;br /&gt;
      if (height === 0) {&lt;br /&gt;
        // For audio that has zero height&lt;br /&gt;
        height = 20;&lt;br /&gt;
      }&lt;br /&gt;
      $(&#039;#stockphoto_html&#039;).text(&#039;&amp;lt;iframe src=&amp;quot;&#039; + stockPhoto.file.backlink +&lt;br /&gt;
        &#039;?embedplayer=yes&amp;quot; width=&amp;quot;&#039; + width + &#039;&amp;quot; height=&amp;quot;&#039;+ height + &#039;&amp;quot; frameborder=&amp;quot;0&amp;quot; &amp;gt;&amp;lt;/iframe&amp;gt;&#039;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    thumb_url = stockPhoto.stockphoto_get_thumbnail_url(width);&lt;br /&gt;
&lt;br /&gt;
    if (type === &#039;html&#039;) {&lt;br /&gt;
      t = &#039;&amp;lt;a title=&amp;quot;&#039; + mw.html.escape(stockPhoto.file.credit) +&lt;br /&gt;
        &#039;&amp;quot; href=&amp;quot;&#039; + stockPhoto.file.backlink + &#039;&amp;quot;&amp;gt;&amp;lt;img width=&amp;quot;&#039; + width + &#039;&amp;quot; alt=&amp;quot;&#039; +&lt;br /&gt;
        mw.html.escape(stockPhoto.file.title) + &#039;&amp;quot; src=&amp;quot;&#039; + thumb_url + &#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
    } else if (type === &#039;bbcode&#039;) {&lt;br /&gt;
      t = &#039;[url=&#039; + stockPhoto.file.backlink + &#039;][img]&#039; +&lt;br /&gt;
        thumb_url + &#039;[/img][/url]\n[url=&#039; + stockPhoto.file.backlink + &#039;]&#039; +&lt;br /&gt;
        stockPhoto.file.title + &#039;[/url]\n&#039; + stockPhoto.file.credit;&lt;br /&gt;
    }&lt;br /&gt;
    $(&#039;#stockphoto_html&#039;).text(t);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  // Event &#039;change&#039; on input#stockphoto_attribution_html&lt;br /&gt;
  refresh_attribution: function () {&lt;br /&gt;
    $(&#039;#stockphoto_attribution&#039;).val(stockPhoto.file[this.checked ? &#039;creditHtml&#039; : &#039;credit&#039;]);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  createDialogRow: function (label, prefill, id, prepend, append) {&lt;br /&gt;
    var idtext = id ? (&#039;id=&amp;quot;&#039; + id + &#039;&amp;quot;&#039;) : &#039;&#039;;&lt;br /&gt;
    return &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&#039; + label + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039; + (prepend || &#039;&#039;) + &#039;&amp;lt;input type=&amp;quot;text&amp;quot; readonly &#039; + idtext + &#039; onclick=&amp;quot;select()&amp;quot; value=&amp;quot;&#039; + mw.html.escape(prefill) + &#039;&amp;quot;&amp;gt;&#039; + (append || &#039;&#039;) + &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  share_this: function (ui_mode) {&lt;br /&gt;
    var widths, html, dtitle, dl_links, best_fit,&lt;br /&gt;
      pixelStr, widthSearchMatch, imageWidth, power, i;&lt;br /&gt;
&lt;br /&gt;
    stockPhoto.file = new File({&lt;br /&gt;
      pageName: mw.config.get(&#039;wgPageName&#039;),&lt;br /&gt;
      originalUrl: $(&#039;div.fullMedia a&#039;).prop(&#039;href&#039;) || &#039;&#039;,&lt;br /&gt;
      dom: {&lt;br /&gt;
        $src: $(&#039;#fileinfotpl_src + td&#039;),&lt;br /&gt;
        $aut: $(&#039;#fileinfotpl_aut + td&#039;),&lt;br /&gt;
        $attr: $(&#039;.licensetpl_attr&#039;).eq(0),&lt;br /&gt;
        $credit: $(&#039;#fileinfotpl_credit + td&#039;),&lt;br /&gt;
        $creator: $(&#039;#creator&#039;),&lt;br /&gt;
        $licenseAut: $(&#039;.licensetpl_aut&#039;).eq(0)&lt;br /&gt;
      },&lt;br /&gt;
      $licenses: $(&#039;.licensetpl&#039;)&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    // Grab width in pixel from DOM, and trim it down&lt;br /&gt;
    // This does not yet work for SVGs or videos&lt;br /&gt;
    widths = [];&lt;br /&gt;
    try {&lt;br /&gt;
      pixelStr = $(&#039;.fileInfo&#039;).contents().get(0).data;&lt;br /&gt;
      widthSearchMatch = /([0-9 ,.\u00a0]+)\s*×/.exec(pixelStr);&lt;br /&gt;
      imageWidth = parseInt(widthSearchMatch[1].replace(/[ ,.\u00a0]/g, &#039;&#039;), 10);&lt;br /&gt;
      if (isNaN(imageWidth)) {&lt;br /&gt;
        throw new Error(&#039;Cannot parse&#039;);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Calculate to which power of two we should go&lt;br /&gt;
      power = Math.floor(Math.log(imageWidth) / Math.log(2));&lt;br /&gt;
&lt;br /&gt;
      // Push 6 width to array&lt;br /&gt;
      for (i = 0; i &amp;lt; 5; i++) {&lt;br /&gt;
        widths.push(Math.pow(2, power-i));&lt;br /&gt;
      }&lt;br /&gt;
      widths = widths.reverse();&lt;br /&gt;
&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
      widths = [640, 800, 1024];&lt;br /&gt;
    }&lt;br /&gt;
    if (ui_mode === -1) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad = modalLoad || mw.loader.using(&#039;jquery.ui&#039;);&lt;br /&gt;
    html = &#039;&#039;;&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.page_url, stockPhoto.file.backlink);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.file_url, stockPhoto.file.url);&lt;br /&gt;
    html += stockPhoto.createDialogRow(stockPhoto.i18n.attribution, stockPhoto.file.credit,&lt;br /&gt;
      &#039;stockphoto_attribution&#039;,&lt;br /&gt;
      &#039;&amp;lt;blockquote class=&amp;quot;stockphoto_attribution_preview&amp;quot; onclick=&amp;quot;nextSibling.select();return false;&amp;quot;&amp;gt;&#039; + stockPhoto.file.creditHtml + &#039;&amp;lt;/blockquote&amp;gt;&#039;,&lt;br /&gt;
      &#039; &amp;lt;input id=&amp;quot;stockphoto_attribution_html&amp;quot; type=&amp;quot;checkbox&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;label for=&amp;quot;stockphoto_attribution_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt;&#039;&lt;br /&gt;
    );&lt;br /&gt;
    if (stockPhoto.file.gfdlNote) {&lt;br /&gt;
      html += &#039;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.gfdl_warning + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    if (!stockPhoto.file.attrRequired) {&lt;br /&gt;
      html += &#039;&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;stockphoto_note&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.no_attr + &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    switch (ui_mode) {&lt;br /&gt;
    case 1:&lt;br /&gt;
&lt;br /&gt;
      dtitle = stockPhoto.i18n.download_this_file;&lt;br /&gt;
      if (stockPhoto.file.url) {&lt;br /&gt;
        html += &#039;&amp;lt;div&amp;gt;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.download_image_file + &#039;:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
        dl_links = [];&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (stockPhoto.file.audio) {&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.stockphoto_get_thumbnail_url(v) + &#039;&amp;quot; download&amp;gt;&#039; + v + &#039;px&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        });&lt;br /&gt;
        dl_links.push(&#039;&amp;lt;a href=&amp;quot;&#039; + stockPhoto.file.url + &#039;&amp;quot; download&amp;gt;&#039; + stockPhoto.i18n.full_resolution + &#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
        if (dl_links.length) {&lt;br /&gt;
          html += dl_links.join(&#039; | &#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
          html += &#039;&amp;lt;i&amp;gt;&#039; + stockPhoto.i18n.not_available + &#039;&amp;lt;/i&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 2:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_web;&lt;br /&gt;
      html += &#039;&amp;lt;div class=&amp;quot;stockphoto_dialog_row&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;float: right;&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;html&amp;quot; id=&amp;quot;stockphoto_code_type_html&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot; checked&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_html&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.html + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
      html += &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; name=&amp;quot;stockphoto_code_type&amp;quot; value=&amp;quot;bbcode&amp;quot; id=&amp;quot;stockphoto_code_type_bbcode&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&amp;lt;label for=&amp;quot;stockphoto_code_type_bbcode&amp;quot;&amp;gt;&#039; + stockPhoto.i18n.bbcode + &#039;&amp;lt;/label&amp;gt; &#039;;&lt;br /&gt;
&lt;br /&gt;
      html += &#039;&amp;lt;select id=&amp;quot;stockphoto_html_select&amp;quot; onchange=&amp;quot;stockPhoto.make_html_textarea();&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
      best_fit = 75;&lt;br /&gt;
      if (stockPhoto.file.audio) {&lt;br /&gt;
        best_fit = 120;&lt;br /&gt;
        html += &#039;&amp;lt;option value=&amp;quot;120&amp;quot;&amp;gt;120&#039; + stockPhoto.i18n.px_wide_icon + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
      } else {&lt;br /&gt;
        widths.forEach(function (v) {&lt;br /&gt;
          if (v &amp;lt;= $(&#039;#file img&#039;).width()) {&lt;br /&gt;
            best_fit = v;&lt;br /&gt;
          }&lt;br /&gt;
          html += &#039;&amp;lt;option value=&amp;quot;&#039; + v + &#039;&amp;quot;&amp;gt;&#039; + v + stockPhoto.i18n.px_wide + &#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
      html += &#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;b&amp;gt;&#039; + stockPhoto.i18n.embed_this_file + &#039;&amp;lt;/b&amp;gt;&amp;lt;textarea onclick=&amp;quot;select()&amp;quot; id=&amp;quot;stockphoto_html&amp;quot; readonly&amp;gt;&#039;;&lt;br /&gt;
      html += &#039;&amp;lt;/textarea&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
&lt;br /&gt;
    case 3:&lt;br /&gt;
      dtitle = stockPhoto.i18n.use_this_file_wiki;&lt;br /&gt;
&lt;br /&gt;
      html = stockPhoto.createDialogRow(stockPhoto.i18n.thumbnail, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|thumb|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
      html += stockPhoto.createDialogRow(stockPhoto.i18n.image, &#039;[[File:&#039; + mw.config.get(&#039;wgTitle&#039;) + &#039;|&#039; + stockPhoto.file.title + &#039;]]&#039;);&lt;br /&gt;
&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    modalLoad.done(function () {&lt;br /&gt;
      $(&#039;&amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;).html(html).dialog({&lt;br /&gt;
        modal: true,&lt;br /&gt;
        width: 610,&lt;br /&gt;
        height: &#039;auto&#039;,&lt;br /&gt;
        title: dtitle,&lt;br /&gt;
        close: function () {&lt;br /&gt;
          $(this).remove();&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
      $(&#039;#stockphoto_html_select&#039;).val(best_fit);&lt;br /&gt;
&lt;br /&gt;
      stockPhoto.make_html_textarea();&lt;br /&gt;
      $(&#039;#stockphoto_attribution_html&#039;).on(&#039;change&#039;, stockPhoto.refresh_attribution);&lt;br /&gt;
    });&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_download: function () {&lt;br /&gt;
    stockPhoto.share_this(1);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_web: function () {&lt;br /&gt;
    stockPhoto.share_this(2);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  call_wiki: function () {&lt;br /&gt;
    stockPhoto.share_this(3);&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
  i18n: {&lt;br /&gt;
    // Download:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    download: &#039;Download&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    all_sizes: &#039;all sizes&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    download_this_file: &#039;Download this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use web:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_web_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_website: &#039;on the web&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_web: &#039;Use this file on the web&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Use wiki:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    use_this_file_wiki_short: &#039;Use this file&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    on_a_wiki: &#039;on a wiki&#039;,&lt;br /&gt;
    // - Dialog title&lt;br /&gt;
    use_this_file_wiki: &#039;Use this file on a wiki&#039;,&lt;br /&gt;
    thumbnail: &#039;Thumbnail&#039;,&lt;br /&gt;
    image: &#039;Image&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Email:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    email_link_short: &#039;Email a link&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    to_this_file: &#039;to this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Reuse:&lt;br /&gt;
    // - Button label&lt;br /&gt;
    information: &#039;Information&#039;,&lt;br /&gt;
    // - Button caption&lt;br /&gt;
    about_reusing: &#039;about reusing&#039;,&lt;br /&gt;
&lt;br /&gt;
    // Disable (button caption)&lt;br /&gt;
    remove_icons: &#039;Remove these icons&#039;,&lt;br /&gt;
    // Enable (button label)&lt;br /&gt;
    reuse: &#039;Reuse this file&#039;,&lt;br /&gt;
&lt;br /&gt;
    via_wikimedia_commons: &#039;via Wikimedia Commons&#039;,&lt;br /&gt;
    see_page_for_author: &#039;See page for author&#039;,&lt;br /&gt;
    see_page_for_license: &#039;see page for license&#039;,&lt;br /&gt;
    page_url: &#039;Page URL&#039;,&lt;br /&gt;
    file_url: &#039;File URL&#039;,&lt;br /&gt;
    attribution: &#039;Attribution&#039;,&lt;br /&gt;
    no_attr: &#039;Attribution not legally required&#039;,&lt;br /&gt;
    or: &#039;or&#039;,&lt;br /&gt;
    gfdl_warning: &#039;Using this file might require attaching a full copy of the &amp;lt;a href=&amp;quot;//en.wikipedia.org/wiki/GNU_Free_Documentation_License&amp;quot;&amp;gt;GFDL&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
    download_image_file: &#039;Download image file&#039;,&lt;br /&gt;
    full_resolution: &#039;Full resolution&#039;,&lt;br /&gt;
    not_available: &#039;not available&#039;,&lt;br /&gt;
    share_this_file: &#039;Share this file&#039;,&lt;br /&gt;
    embed_this_file: &#039;Embed this file&#039;,&lt;br /&gt;
    html: &#039;HTML&#039;,&lt;br /&gt;
    bbcode: &#039;BBCode&#039;,&lt;br /&gt;
    px_wide_icon: &#039;px wide (icon)&#039;,&lt;br /&gt;
    px_wide: &#039;px wide&#039;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Export&lt;br /&gt;
window.stockPhoto = stockPhoto;&lt;br /&gt;
&lt;br /&gt;
if (mw.config.get(&#039;wgUserLanguage&#039;) === &#039;en&#039;) {&lt;br /&gt;
  $(stockPhoto.init);&lt;br /&gt;
} else {&lt;br /&gt;
  $.ajax({&lt;br /&gt;
    url: mw.config.get(&#039;wgScript&#039;) + &#039;?title=&#039; + mw.util.wikiUrlencode(&#039;MediaWiki:Gadget-Stockphoto.js/&#039; + mw.config.get(&#039;wgUserLanguage&#039;)) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
    dataType: &#039;script&#039;,&lt;br /&gt;
    // For performance, use &#039;crossDomain&#039; to trigger &amp;lt;script&amp;gt; instead of XHR.&lt;br /&gt;
    // Browsers do cache scripts, but not XHR.&lt;br /&gt;
    crossDomain: true,&lt;br /&gt;
    cache: true&lt;br /&gt;
  }).then(stockPhoto.init);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// on subpages [[MediaWiki:stockPhoto.js/langcode]]:&lt;br /&gt;
// stockPhoto.i18n = { ... }&lt;br /&gt;
}());&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto&amp;diff=8272</id>
		<title>MediaWiki:Gadget-Stockphoto</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=MediaWiki:Gadget-Stockphoto&amp;diff=8272"/>
		<updated>2021-12-21T22:47:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{gadget-desc|self=MediaWiki:Gadget-Stockphoto|name=StockPhoto|Add buttons to file description pages that make it easier to reuse, share and attribute images.|skin=vector and monobook|doc=Special:MyLanguage/Help:Gadget-Stockphoto|talk=MediaWiki talk:Gadget-Stockphoto.js}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-translation&amp;diff=8270</id>
		<title>Template:Gadget-translation</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-translation&amp;diff=8270"/>
		<updated>2021-12-21T22:43:49Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;[{{fullurl:{{TALKPAGENAME:{{{base|{{{2|{{#titleparts:{{FULLPAGENAME}}|1}}}}}}}}}}/{{{1|{{int:lang}}}}}|action=edit&amp;amp;preload={{urlencode:{{{base|{{{2|{{#titleparts:{{FULLPAGENAME}}|1}}}}}}}}}}&amp;amp;editintro=Template:Gadget-translation-editintro&amp;amp;preloadtitle={{urlencode:Localization of 1}}}}}}}} for {{{1|{{int:lang}}}}}}}&amp;amp;section=new}} {{int:label-gadget-translate}}]&amp;lt;noinclude&amp;gt; {{documentation}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[{{fullurl:{{TALKPAGENAME:{{{base|{{{2|{{#titleparts:{{FULLPAGENAME}}|1}}}}}}}}}}/{{{1|{{int:lang}}}}}|action=edit&amp;amp;preload={{urlencode:{{{base|{{{2|{{#titleparts:{{FULLPAGENAME}}|1}}}}}}}}}}&amp;amp;editintro=Template:Gadget-translation-editintro&amp;amp;preloadtitle={{urlencode:Localization of [[{{{base|{{{2|{{#titleparts:{{FULLPAGENAME}}|1}}}}}}}}]] for {{{1|{{int:lang}}}}}}}&amp;amp;section=new}} {{int:label-gadget-translate}}]&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Gadget-translatelabel&amp;diff=8269</id>
		<title>Template:Gadget-translatelabel</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Gadget-translatelabel&amp;diff=8269"/>
		<updated>2021-12-21T22:43:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;&amp;lt;!-- {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}} will be the name of a gadget description page, like MediaWiki:Gadget-QuickDelete  --&amp;gt;&amp;lt;onlyinclude&amp;gt;{{#switch: {{int:Lang}} | en = | en-gb = &amp;lt;!-- do nothing for English (assume English exists) --&amp;gt; | #default = &amp;lt;!-- default for switch   --&amp;gt; {{#ifexist: {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}/{{int:Lang}}   |&amp;lt;!-- do nothing: language version exists --&amp;gt;   |{{#ifeq: {{GetFallback|{{int:Lang}}}}|en    |&amp;lt;!-- language version fal...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}} will be the name of a gadget description page, like MediaWiki:Gadget-QuickDelete &lt;br /&gt;
--&amp;gt;&amp;lt;onlyinclude&amp;gt;{{#switch: {{int:Lang}}&lt;br /&gt;
| en =&lt;br /&gt;
| en-gb = &amp;lt;!-- do nothing for English (assume English exists) --&amp;gt;&lt;br /&gt;
| #default = &amp;lt;!-- default for switch &lt;br /&gt;
 --&amp;gt; {{#ifexist: {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}/{{int:Lang}}&lt;br /&gt;
  |&amp;lt;!-- do nothing: language version exists --&amp;gt;&lt;br /&gt;
  |{{#ifeq: {{GetFallback|{{int:Lang}}}}|en&lt;br /&gt;
   |&amp;lt;!-- language version falls back to en --&amp;gt; {{Gadget-translation|{{int:lang}}|base={{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}}}&lt;br /&gt;
   |{{#ifexist: {{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}/{{GetFallback|{{int:Lang}}}}&lt;br /&gt;
    |&amp;lt;!-- do nothing, fallback version exists --&amp;gt;&lt;br /&gt;
    |&amp;lt;!-- fallback doesn&#039;t exist, request translation for that --&amp;gt; {{Gadget-translation|{{GetFallback|{{int:Lang}}}}|base={{#titleparts:{{{1|{{FULLPAGENAME}}}}}|1}}}}&lt;br /&gt;
   }}&lt;br /&gt;
  }}&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:Caller_title&amp;diff=8268</id>
		<title>Module:Caller title</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:Caller_title&amp;diff=8268"/>
		<updated>2021-12-21T22:39:50Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;local p = {}  function p.title(frame) 	return frame:getParent():getTitle() end  function p.lang(frame) 	local base = frame.args.base 	local title = p.title(frame) 	if base ~= title then 		local parts = mw.text.split(p.title(frame), &amp;#039;/&amp;#039;, true) 		return parts[#parts] 	else 		-- we’re on the base page of the translation (directly, it’s not translated from somewhere), 		-- so we have no subpage language code, but we use PAGELANGUAGE 		return frame:preprocess(&amp;#039;{{PAGELANGU...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.title(frame)&lt;br /&gt;
	return frame:getParent():getTitle()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.lang(frame)&lt;br /&gt;
	local base = frame.args.base&lt;br /&gt;
	local title = p.title(frame)&lt;br /&gt;
	if base ~= title then&lt;br /&gt;
		local parts = mw.text.split(p.title(frame), &#039;/&#039;, true)&lt;br /&gt;
		return parts[#parts]&lt;br /&gt;
	else&lt;br /&gt;
		-- we’re on the base page of the translation (directly, it’s not translated from somewhere),&lt;br /&gt;
		-- so we have no subpage language code, but we use PAGELANGUAGE&lt;br /&gt;
		return frame:preprocess(&#039;{{PAGELANGUAGE}}&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=File:Test_Template_Info-Icon.svg&amp;diff=8267</id>
		<title>File:Test Template Info-Icon.svg</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=File:Test_Template_Info-Icon.svg&amp;diff=8267"/>
		<updated>2021-12-21T22:38:02Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:Error&amp;diff=8266</id>
		<title>Module:Error</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:Error&amp;diff=8266"/>
		<updated>2021-12-21T22:33:43Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;-- This module implements {{error}}.  local p = {}  local function _error(args)     local tag = mw.ustring.lower(tostring(args.tag))      -- Work out what html tag we should use.     if not (tag == &amp;#039;p&amp;#039; or tag == &amp;#039;span&amp;#039; or tag == &amp;#039;div&amp;#039;) then         tag = &amp;#039;strong&amp;#039;     end      -- Generate the html.     return tostring(mw.html.create(tag)         :addClass(&amp;#039;error&amp;#039;)         :wikitext(tostring(args.message or args[1] or error(&amp;#039;no message specified&amp;#039;, 2)))     ) end  function...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements {{error}}.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function _error(args)&lt;br /&gt;
    local tag = mw.ustring.lower(tostring(args.tag))&lt;br /&gt;
&lt;br /&gt;
    -- Work out what html tag we should use.&lt;br /&gt;
    if not (tag == &#039;p&#039; or tag == &#039;span&#039; or tag == &#039;div&#039;) then&lt;br /&gt;
        tag = &#039;strong&#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Generate the html.&lt;br /&gt;
    return tostring(mw.html.create(tag)&lt;br /&gt;
        :addClass(&#039;error&#039;)&lt;br /&gt;
        :wikitext(tostring(args.message or args[1] or error(&#039;no message specified&#039;, 2)))&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.error(frame)&lt;br /&gt;
    local args&lt;br /&gt;
    if type(frame.args) == &#039;table&#039; then&lt;br /&gt;
        -- We&#039;re being called via #invoke. The args are passed through to the module&lt;br /&gt;
        -- from the template page, so use the args that were passed into the template.&lt;br /&gt;
        args = frame.args&lt;br /&gt;
    else&lt;br /&gt;
        -- We&#039;re being called from another module or from the debug console, so assume&lt;br /&gt;
        -- the args are passed in directly.&lt;br /&gt;
        args = frame&lt;br /&gt;
    end&lt;br /&gt;
    -- If the message parameter is present but blank, change it to nil so that Lua will&lt;br /&gt;
    -- consider it false.&lt;br /&gt;
    if args.message == &amp;quot;&amp;quot; then&lt;br /&gt;
        args.message = nil&lt;br /&gt;
    end&lt;br /&gt;
    return _error(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Error&amp;diff=8265</id>
		<title>Template:Error</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Error&amp;diff=8265"/>
		<updated>2021-12-21T22:32:34Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;{{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}&amp;lt;noinclude&amp;gt; {{documentation}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Error|error|{{{message|{{{1}}}}}}|tag={{{tag|}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Data:I18n/Documentation.tab&amp;diff=8264</id>
		<title>Data:I18n/Documentation.tab</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Data:I18n/Documentation.tab&amp;diff=8264"/>
		<updated>2021-12-21T22:30:19Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;{     &amp;quot;license&amp;quot;: &amp;quot;CC0-1.0&amp;quot;,     &amp;quot;description&amp;quot;: {         &amp;quot;en&amp;quot;: &amp;quot;Translation table for the shared Module:Documentation&amp;quot;,         &amp;quot;hu&amp;quot;: &amp;quot;Fordítási táblázat a megosztott Documentation modulhoz&amp;quot;,         &amp;quot;tr&amp;quot;: &amp;quot;Paylaşılan Module:Documentation için çeviri tablosu&amp;quot;,         &amp;quot;zh&amp;quot;: &amp;quot;「模块:Documentation」的翻译表&amp;quot;     },     &amp;quot;sources&amp;quot;: &amp;quot;Module mw:Module:Documentation, see bot documentation.&amp;quot;,     &amp;quot;schema&amp;quot;: {         &amp;quot;fields&amp;quot;: [             {...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
    &amp;quot;license&amp;quot;: &amp;quot;CC0-1.0&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: {&lt;br /&gt;
        &amp;quot;en&amp;quot;: &amp;quot;Translation table for the shared Module:Documentation&amp;quot;,&lt;br /&gt;
        &amp;quot;hu&amp;quot;: &amp;quot;Fordítási táblázat a megosztott Documentation modulhoz&amp;quot;,&lt;br /&gt;
        &amp;quot;tr&amp;quot;: &amp;quot;Paylaşılan Module:Documentation için çeviri tablosu&amp;quot;,&lt;br /&gt;
        &amp;quot;zh&amp;quot;: &amp;quot;「模块:Documentation」的翻译表&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;sources&amp;quot;: &amp;quot;Module [[mw:Module:Documentation]], see [[mw:WP:TNT|bot documentation]].&amp;quot;,&lt;br /&gt;
    &amp;quot;schema&amp;quot;: {&lt;br /&gt;
        &amp;quot;fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;name&amp;quot;: &amp;quot;id&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;name&amp;quot;: &amp;quot;message&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;localized&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;data&amp;quot;: [&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;cfg-error-msg-type&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;message: type error in message cfg.$1 ($2 expected, got $3)&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;mesaj: cfg.$1 mesajında hata türü ($2 beklendi, $3 alındı)&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;消息：cfg.$1参数类型错误（需要$2，得到$3）&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;cfg-error-msg-empty&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;message: no value found for key $1 in message cfg.$2&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;mesaj: mesaj cfg.$2 içinde $1 anahtar değeri bulunamadı&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;消息：cfg.$2 无法找到$1的键值&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;template-namespace-heading&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;توثيق القالب&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;টেমপ্লেট নথি&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Skabelondokumentation&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;Vorlagendokumentation&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;Τεκμηρίωση προτύπου&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Template documentation&amp;quot;,&lt;br /&gt;
                &amp;quot;fi&amp;quot;: &amp;quot;Mallineen ohje&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Documentation du modèle&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;साँचा परिचय&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Sablondokumentáció&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Dokumentasi templat&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Dokumentasion ti plantilia&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;テンプレートの解説&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;Documentatio formulae&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Dokumentacja szablonu&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;Documentação da predefinição&amp;quot;,&lt;br /&gt;
                &amp;quot;ro&amp;quot;: &amp;quot;Documentație format&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Документация шаблона&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Dokumentacija predloge&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Şablon belgelemesi&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Документація шаблону&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;模板文档&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;module-namespace-heading&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;توثيق الوحدة&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;মডিউল নথি&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Moduldokumentation&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;Moduldokumentation&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Module documentation&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Documentation du module&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;मॉड्यूल परिचय&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Moduldokumentáció&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Dokumentasi modul&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Dokumentasion ti modulo&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;モジュールの解説&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Dokumentacja modułu&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Документация модуля&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Dokumentacija modula&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Modül belgelemesi&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Документація модуля&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;模块文档&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;file-namespace-heading&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;ملخص&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;সারাংশ&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Sammendrag&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;Σύνοψη&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Summary&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Résumé&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Összefoglaló&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Ringkasan&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Pakabuklan&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;要約&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;Summarium&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Podsumowanie&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;Sumário&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Описание&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Povzetek&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Özet&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Статистика про файл&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;简介&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;other-namespaces-heading&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;توثيق&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;নথি&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Dokumentation&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;Dokumentation&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;Τεκμηρίωση&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Documentation&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Documentation&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Dokumentáció&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Dokumentasi&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Dokumentasion&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;解説&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;Documentatio&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Dokumentacja&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;Documentação&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Документация&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Dokumentacija&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Belgeleme&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Документація&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;文档&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;view-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;عرض&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;দেখুন&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;vis&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;anzeigen&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;προβολή&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;view&amp;quot;,&lt;br /&gt;
                &amp;quot;fi&amp;quot;: &amp;quot;näytä&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;voir&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;देखें&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;megtekintés&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;lihat&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;kitaen&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;閲覧&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;considerabit&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;zobacz&amp;quot;,&lt;br /&gt;
                &amp;quot;ro&amp;quot;: &amp;quot;lectură&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;просмотр&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;predogled&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;gör&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;查看&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;edit-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;عدِّل&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;সম্পাদনা&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;redigér&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;bearbeiten&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;επεξεργασία&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;edit&amp;quot;,&lt;br /&gt;
                &amp;quot;fi&amp;quot;: &amp;quot;muokkaa&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;modifier&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;संपादन&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;szerkesztés&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;sunting&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;urnosen&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;編集&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;recense&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;edytuj&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;editar&amp;quot;,&lt;br /&gt;
                &amp;quot;ro&amp;quot;: &amp;quot;modificare&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;править&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;uredi&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;düzenle&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;редагувати&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;编辑&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;history-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;تاريخ&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;ইতিহাস&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;historik&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;Versionen&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;ιστορικό&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;history&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;historique&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;इतिहास&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;laptörténet&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;riwayat&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;pakasaritaan&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;履歴&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;historia&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;historia&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;histórico&amp;quot;,&lt;br /&gt;
                &amp;quot;ro&amp;quot;: &amp;quot;istoric&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;история&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;zgodovina&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;geçmiş&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;історія&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;历史&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;purge-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;محو الاختزان&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;শোধন&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;opfrisk&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;Cache löschen&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;εκκαθάριση&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;purge&amp;quot;,&lt;br /&gt;
                &amp;quot;fi&amp;quot;: &amp;quot;päivitä&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;rafraichir&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;पर्ज&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;frissítés&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;hapus singgahan&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;purgaen&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;キャッシュ破棄&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;purga&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;purgar&amp;quot;,&lt;br /&gt;
                &amp;quot;ro&amp;quot;: &amp;quot;actualizare format&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;обновить&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;osveži&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;temizle&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;очистити кеш&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;清除缓存&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;create-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;أنشئ&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;তৈরি করুন&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;opret&amp;quot;,&lt;br /&gt;
                &amp;quot;de&amp;quot;: &amp;quot;erstellen&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;δημιουργία&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;create&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;créer&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;létrehozás&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;buat&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;agpartuat&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;作成&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;crea&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;utwórz&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;criar&amp;quot;,&lt;br /&gt;
                &amp;quot;ro&amp;quot;: &amp;quot;creare&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;создать&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;ustvari&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;oluştur&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;створити&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;创建&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-pagetype-template&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;صفحة [[w:ar:ويكيبيديا:ملاعب القوالب ومختبراتها|ملعب القالب]]&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;টেমপ্লেট খেলাঘর পাতা&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;skabelonsandkassesiden&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;[[wikipedia:Wikipedia:Template test cases|template sandbox]] page&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;sablon homokozója&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;panid a [[w:ilo:Wikipedia:Pangsubok a kaskaso ti plantilia|pagipadasan ti plantilia]]&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;[[w:ja:Wikipedia:テンプレートのサンドボックスとテストケース|テンプレートのサンドボックス]] ページ&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;[[wikipedia:Wikipedia:Template test cases|peskovnik predloge]]&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;[[wikipedia:tr:Vikipedi:Şablon deneme tahtası ve sınama|şablon deneme]] sayfası&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;[[wikipedia:Wikipedia:Template test cases|模板沙盒]]页面&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-pagetype-module&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;صفحة ملعب الوحدة&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;মডিউল খেলাঘর পাতা&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;modulsandkassesiden&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;[[wikipedia:Wikipedia:Template test cases|module sandbox]] page&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;modul homokozója&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;panid a [[w:ilo:Wikipedia:Pangsubok a kaskaso ti plantilia|pagipadasan ti modulo]]&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;[[w:ja:Wikipedia:テンプレートのサンドボックスとテストケース|モジュールのサンドボックス]] ページ&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;[[wikipedia:Wikipedia:Template test cases|peskovnik modula]]&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;[[wikipedia:tr:Vikipedi:Şablon deneme tahtası ve sınama|modül deneme]] sayfası&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;[[wikipedia:Wikipedia:Template test cases|模块沙盒]]页面&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-pagetype-other&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;صفحة ملعب&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;খেলাঘর পাতা&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;sandkassesiden&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;sandbox page&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;lap homokozója&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;pagipadasan ti panid&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;サンドボックス ページ&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;peskovnik strani&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;deneme sayfası&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;沙盒页面&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;هذه $1 لصفحة $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;এটি $2-এর জন্য $1।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Dette er $1 for $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;This is the $1 for $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Ez a(z) $2 $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Daytoy ket isu ti  $1 para iti $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;このページは $2 の$1です。&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;To je stran za $1 $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Bu $1, $2 içindir.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;此为$2的$1。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-diff-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;هذه $1 لصفحة $2 ($3).&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;এটি $2-এর জন্য $1 ($3)।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Dette er $1 for $2 ($3).&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;This is the $1 for $2 ($3).&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Ez a(z) $2 $1 ($3).&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Daytoy ket isu ti $1 para iti $2 ($3).&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;このページは $2 の$1です ($3)。&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;To je stran za $1 $2 ($3).&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Bu $1, $2 içindir ($3).&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;此为$2 ($3) 的$1。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-compare-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;فرق&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;পার্থক্য&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;forskel&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;eltérés&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;dip&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;差分&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;fark&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;差异&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-testcases-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;انظر أيضاً الصفحات الفرعية لـ $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;এছাড়া $1-এর জন্য সঙ্গী উপপাতা দেখুন।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Se også følgesiden for $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;See also the companion subpage for $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Lásd még a kapcsolódó $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Kitaen pay ti kakuyog a subpanid para iti $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Glej pridruženo podstran za $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;$1 için tamamlayıcı alt sayfasına da bakın.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;请见$1的对应子页面。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-testcases-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;مختبر&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;পরীক্ষা পাতা&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;test cases&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;teszteseteket&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;pangsubok a kaskaso&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;テストケース&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;testne primere&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;test senaryoları&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;测试样例&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-testcases-run-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;انظر أيضاً الصفحات الفرعية لـ $1 ($2).&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;এছাড়া $1-এর জন্য সঙ্গী উপপাতা দেখুন ($2)।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Se også følgesiden for $1 ($2).&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;See also the companion subpage for $1 ($2).&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Lásd még a kapcsolódó $1 ($2).&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Kitaen pay ti kakuyog a subpanid para iti $1 ($2).&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Glej pridruženo podstran za $1 ($2).&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;$1 için tamamlayıcı alt sayfasına da bakın ($2).&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;请见$1 ($2)的对应子页面。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-notice-testcases-run-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;تشغيل&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;চালান&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;kør&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;run&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;futtatás&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;patarayen&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;実行&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;çalıştır&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;运行&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;transcluded-from-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;[[w:ar:ويكيبيديا:توثيق قالب|التوثيق]] في الأعلى [[w:ar:ويكيبيديا:تضمين|مضمن]] من $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;উপর্যুক্ত নথিটি $1 থেকে প্রতিলিপ্ত।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;[[w:da:Wikipedia:Skabelondokumentation|Dokumentationen]] ovenfor er [[w:da:Wikipedia:Transklusion|transkluderet]] fra $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;Η παραπάνω τεκμηρίωση ενσωματώνεται από τη σελίδα $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;The above [[wikipedia:Wikipedia:Template documentation|documentation]] is [[wikipedia:Wikipedia:Transclusion|transcluded]] from $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;La [[w:fr:Aide:Documentation de modèle|documentation]] ci-dessus est [[w:fr:Aide:Inclusion|traduite]] de $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;ऊपर दिए गए [[w:hi:विकिपीडिया:Template documentation|निर्देश]] $1 से [[w:hi:विकिपीडिया:Transclusion|लिए गए]] है।&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;A fenti [[w:hu:Sablondokumentáció|dokumentáció]] a(z) $1 lapról van beillesztve.&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;[[w:id:Wikipedia:Dokumentasi templat|Dokumentasi]] di atas [[Wikipedia:Wikipedia:Transclusion|ditransklusikan]] dari $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Ti [[w:ilo:Wikipedia:Dokumentasion ti plantilia|dokumentasion]] dita ngato ket [[w:ilo:Wikipedia:Panagilak-am|nailak-am]] manipud iti $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;上記の[[w:ja:Help:テンプレートの説明文|解説]]は $1 から[[wikipedia:Wikipedia:Transclusion|参照読み込み]]されています。&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;[[wikipedia:Wikipedia:Template documentation|Documentatio]] pristina [[wikipedia:Wikipedia:Transclusion|transclusa]] est ex $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Powyższa [[w:pl:Pomoc:Schemat opisu szablonu|dokumentacja]] jest [[w:pl:Pomoc:Transkluzja|dołączona]] ze strony $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;A [[w:pt:Wikipédia:Documentação da predefinição|documentação]] acima foi [[w:pt:Wikipédia:Transclusão|transcluída]] de $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ro&amp;quot;: &amp;quot;Această documentație este adusă de la pagina $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Нижеуказанная [[Wikipedia:Wikipedia:Template documentation|документация]] [[Wikipedia:Wikipedia:Transclusion|включена]] со страницы $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Zgornja [[w:sl:Wikipedija:Dokumentacija predloge|dokumentacija]] je [[wikipedia:Wikipedia:Transclusion|vključena]] iz $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Yukarıdaki [[wikipedia:tr:Vikipedi:Şablon belgelemesi|belgeleme]] $1 sayfasının [[wikipedia:tr:Vikipedi:Yansıtma|yansıtılmasıdır]].&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Нижчевказану [[w:uk:Вікіпедія:Документація шаблонів|документацію]] [[Wikipedia:Wikipedia:Transclusion|включено]] зі сторінки $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;上述[[wikipedia:Wikipedia:Template documentation|文档]]由$1[[wikipedia:Wikipedia:Transclusion|转录]]。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;create-module-doc-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;يمكنك أن تنشىء صفحة توثيق لهذه [[w:ar:ويكيبيديا:لوا|الوحدة]] ($1).&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;আপনি চাইলে এই [[w:bn:উইকিপিডিয়া:লুয়া|স্ক্রিবুন্তো মডিউলের]] জন্য একটি নথির পাতা তৈরি করতে পারেন ($1)।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Hvis du ønsker en dokumentationsside for dette [[w:da:Wikipedia:Lua|Scribuntomodul]], så $1 den her.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;You might want to $1 a documentation page for this [[wikipedia:Wikipedia:Lua|Scribunto module]].&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Amiben segíthetsz: [[w:hu:Wikipédia:Lua|Scribunto-modul]] dokumentációs allapjának $1a&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Mabalinmo ti $1 iti panid ti dokumentasion para iti daytoy a [[w:ilo:Wikipedia:Lua|modulo ti Scribunto]].&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Bu [[wikipedia:tr:Vikipedi:Lua|Scribunto modülü]] için bir belge sayfası $1 isteyebilirsiniz.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;你或许想为此[[wikipedia:Wikipedia:Lua|Scribunto模块]]$1文档页。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;experiment-blurb-template&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;يمكن للمحررين تجريب تعديلاتهم على القالب في صفحات $1 و $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;ব্যবহারকারীগণ $1 এবং $2 এই টেমপ্লেট সংক্রান্ত পরীক্ষা-নিরীক্ষা করতে পারেন।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Brugere kan eksperimentere i denne skabelons undersider $1 og $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;Οι συντάκτες μπορούν να πειραματίζονται στο $1 και στις $2 του προτύπου.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Editors can experiment in this template’s $1 and $2 pages.&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Les éditeurs peuvent expérimenter dans le $1 et dans la $2 de ce modèle.&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;संपादक इस साँचे के $1 व $2 पन्नों में प्रयोग कर सकते है।&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;A szerkesztők a sablon $1 és $2 lapjain kísérletezhetnek.&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Penyunting dapat melakukan uji coba pada halaman $1 dan $2 templat ini.&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Mabalin dagiti editor ti agipadas kadagiti panid ti $1 ken $2 iti daytoy a plantilia.&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;編集者はこのテンプレートの$1 および$2 のページで実験できます。&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;Quaesumus auctores experturos esse in $1 ac $2 subpaginis formulae huius.&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Można eksperymentować w $1 tego szablonu oraz stronie $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;Editores podem experimentar na $1 desta predefinição e $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Редакторы могут поэкспериментировать в $1 или $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Urejevalci lahko preizkušate urejanja v $1 in $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Kullanıcılar denemelerini bu şablonun $1 ve $2 sayfalarında yapabilir.&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Редактори можуть поекспериментувати у $1 та $2 сторінці.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;编者可以在此模板的$1和$2页面测试实验。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;experiment-blurb-module&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;يمكن للمحررين تجريب تعديلاتهم على الوحدة في صفحات $1 و $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;সম্পাদনাকারীগণ $1 এবং $2 এই মডিউল সংক্রান্ত পরীক্ষা-নিরীক্ষা করতে পারেন।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Brugere kan eksperimentere i dette moduls undersider $1 og $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Editors can experiment in this module’s $1 and $2 pages.&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Les éditeurs peuvent expérimenter dans le $1 et dans la $2 de ce module.&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;A szerkesztők a modul $1 és $2 lapjain kísérletezhetnek.&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Penyunting dapat melakukan uji coba pada halaman $1 dan $2 modul ini.&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Mabalin dagiti editor ti agipadas kadagiti panid ti $1 ken $2 iti daytoy a modulo.&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;編集者はこのモジュールの $1 および $2 のページで実験できます。&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;Quaesumus auctores experturos esse in $1 ac $2 subpaginis moduli huius.&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Редакторы могут поэкспериментировать в $1 или $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Urejevalci lahko preizkušate urejanja v $1 in $2.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Kullanıcılar denemelerini bu modülün $1 ve $2 sayfalarında yapabilir.&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Редактори можуть поекспериментувати у $1 та $2 сторінці.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;编者可以在此模块的$1和$2页面测试实验。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;ملعب&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;খেলাঘর&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;sandkasse&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;αμμοδοχείο&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;sandbox&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;bac à sable&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;प्रयोगस्थल&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;homokozó&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;bak pasir&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;pagipadasan&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;サンドボックス&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;harenarii&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;brudnopisie&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;песочнице&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;peskovniku predloge&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;deneme tahtası&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;пісочниці&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;沙盒&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-edit-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;عدِّل&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;সম্পাদনা&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;redigér&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;επεξεργασία&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;edit&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;modifier&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;szerkesztés&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;sunting&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;urnosen&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;編集&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;recense&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;edytuj&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;ред.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;uredi&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;değiştir&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;ред.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;编辑&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;sandbox-create-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;أنشئ&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;তৈরি করুন&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;opret&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;δημιουργία&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;create&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;créer&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;létrehozás&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;buat&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;agpartuat&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;作成&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;crea&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;utwórz&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;criar&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;создать&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;ustvari&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;oluştur&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;створити&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;创建&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;compare-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;فرق&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;পার্থক্য&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;forskel&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;διαφ&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;diff&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;eltérések&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;dip&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;差分&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;confer&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;różnica&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;різниця&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;primerjava&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;fark&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;різниця&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;差异&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;mirror-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;مرآة&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;আয়না&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;kopiér&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;αντίγραφο&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;mirror&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;mirroir&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;tükrözés&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;cermin&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;kapada&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;ミラー&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;effinge&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;зеркало&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;ayna&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;дзеркало&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;镜像&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;testcases-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;مختبر&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;পরীক্ষা পাতায়&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;testcases&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;page de test&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;प्रयोग&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;tesztesetek&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;kasus uji&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;pangsubok&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;テストケース&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;testificandorum&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;testowania zastosowania&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;páginas de testcases&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;тестовый&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;strani testniprimeri&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;test senaryoları&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;тестовій&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;测试样例&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;testcases-edit-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;عدِّل&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;সম্পাদনা&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;redigér&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;επεξεργασία&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;edit&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;modifier&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;szerkesztés&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;sunting&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;urnosen&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;編集&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;recense&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;edytuj&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;ред.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;uredi&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;düzenle&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;ред.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;编辑&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;testcases-create-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;أنشئ&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;তৈরি করুন&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;opret&amp;quot;,&lt;br /&gt;
                &amp;quot;el&amp;quot;: &amp;quot;δημιουργία&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;create&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;créer&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;létrehozás&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;buat&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;agpartuat&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;作成&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;crea&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;utwórz&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;criar&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;создать&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;ustvari&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;oluştur&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;створити&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;创建&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;add-categories-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;من فضلك أضف التصنيفات في الصفحة الفرعية للقالب $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;দয়া করে $1 উপপাতায় বিষয়শ্রেণী যোগ করুন।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Tilføj venligst kategorier til $1-undersiden.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Please add categories to the $1 subpage.&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Merci d’ajouter les catégories à la sous-page $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;कृपया $1 उपपृष्ठ पर श्रेणियाँ व विकियों के बिच की कड़ियाँ जोड़े।&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;A kategóriákat a $1 allapon add meg.&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Mohon tambahkan kategori pada subhalaman $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Pangngaasi nga ikabil dagiti kategoria iti subpanid ti $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;カテゴリは $1 下位ページに追加してください。&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;Lubet categorias et nexus in $1 subpaginam addere.&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Kategorie szablonu należy dodawać na podstronie $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;Por favor, adicione categorias na subpágina $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Пожалуйста, добавляйте категории на подстраницу, которая имеет окончание $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Prosimo, da dodate kategorije in medjezikovne povezave v $1 podstran.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Lütfen kategorileri $1 altsayfasına ekleyin.&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Будь ласка, додавайте категорії до підсторінки, яка має закінчення $1.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;请于$1子页面添加分类。&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;subpages-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;$1।&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;$1।&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;$1&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;$1&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;$1&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;$1.&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;$1&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;subpages-link-display&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;الصفحات الفرعية لـ $1&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;এই $1 উপপাতাসমূহ&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;Undersider til $1&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;Subpages of this $1&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Sous-pages de $1&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;इस $1 के उपपृष्ठ&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;Ezen $1 allapjai&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;Subhalaman $1 ini&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Dagiti subpanid daytoy a $1&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;この$1の下位ページ&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;Subpaginae $1 huius&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;Podstrony $1&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;Subpáginas desta $1&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;Посмотреть все подстраницы $1&amp;quot;,&lt;br /&gt;
                &amp;quot;sl&amp;quot;: &amp;quot;Podstrani te predloge&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Bu $1 altsayfalarıdır&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;Переглянути усі підсторінки $1&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;此$1的子页面&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;template-pagetype&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;قالب&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;টেমপ্লেটের&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;denne skabelon&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;template&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;ce modèle&amp;quot;,&lt;br /&gt;
                &amp;quot;hi&amp;quot;: &amp;quot;साँचे&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;sablon&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;templat&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;plantilia&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;テンプレート&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;formulae&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;tego szablonu&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;predefinição&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;этого шаблона&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;şablonun&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;цього шаблону&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;模板&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;module-pagetype&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;وحدة&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;মডিউলের&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;dette modul&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;module&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;ce module&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;modul&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;modul&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;modulo&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;モジュール&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;moduli&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;tego modułu&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;modülün&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;模块&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;default-pagetype&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;ar&amp;quot;: &amp;quot;صفحة&amp;quot;,&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;পাতার&amp;quot;,&lt;br /&gt;
                &amp;quot;da&amp;quot;: &amp;quot;denne side&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;page&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;cette page&amp;quot;,&lt;br /&gt;
                &amp;quot;hu&amp;quot;: &amp;quot;lap&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;halaman&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;panid&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;ページ&amp;quot;,&lt;br /&gt;
                &amp;quot;la&amp;quot;: &amp;quot;paginae&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;tej strony&amp;quot;,&lt;br /&gt;
                &amp;quot;pt-br&amp;quot;: &amp;quot;página&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;этой страницы&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;sayfanın&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;цієї сторінки&amp;quot;,&lt;br /&gt;
                &amp;quot;zh&amp;quot;: &amp;quot;页面&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        [&lt;br /&gt;
            &amp;quot;print-blurb&amp;quot;,&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;bn&amp;quot;: &amp;quot;এই টেমপ্লেটের একটি [[w:bn:সাহায্য:বই/অভিজ্ঞদের জন্য#বইয়ের বিন্যাসের উৎকর্ষসাধন করা|মুদ্রণ সংস্করণ]] $1-এ বিদ্যমান। আপনি যদি এই টেমপ্লেটে পরিবর্তন করেন, তাহলে সেই সাথে মুদ্রণ সংস্করণ হালনাগাদ করুন।&amp;quot;,&lt;br /&gt;
                &amp;quot;en&amp;quot;: &amp;quot;A [[wikipedia:Help:Books/for experts#Improving the book layout|print version]] of this template exists at $1. If you make a change to this template, please update the print version as well.&amp;quot;,&lt;br /&gt;
                &amp;quot;fr&amp;quot;: &amp;quot;Une [[wikipedia:Help:Books/for experts#Improving the book layout|version imprimable]] de ce patron existe à $1. Si vous faites un changement à ce patron, merci de mettre à jour la version imprimée également.&amp;quot;,&lt;br /&gt;
                &amp;quot;ilo&amp;quot;: &amp;quot;Ti [[wikipedia:Help:Books/for experts#Improving the book layout|maimaldit a bersion]] iti daytoy a plantilia ket adda idiay $1. No baliwam daytoy a plantilia, pangngaasi a baliwan met ti maimaldit a bersion.&amp;quot;,&lt;br /&gt;
                &amp;quot;ja&amp;quot;: &amp;quot;このテンプレートの[[w:ja:Help:ブック/上級者向けヘルプ#ブックの見た目を改善する|印刷用バージョン]]は $1 にあります。このテンプレートを変更した場合は、印刷用バージョンも同様に更新してください。&amp;quot;,&lt;br /&gt;
                &amp;quot;pl&amp;quot;: &amp;quot;[[wikipedia:Help:Books/for experts#Improving the book layout|Wersja do druku]] tego szablonu istnieje na podstronie $1. Jeżeli wprowadzasz zmiany w tym szablonie, zaktualizuj także wersję do druku.&amp;quot;,&lt;br /&gt;
                &amp;quot;ru&amp;quot;: &amp;quot;[[Help:Books/for experts#Improving the book layout|Версия для печати]] данного шаблона также присутствует по адресу $1. Если вы меняете данный шаблон, то пожалуйста, обновите также версию для печати.&amp;quot;,&lt;br /&gt;
                &amp;quot;tr&amp;quot;: &amp;quot;Bu şablonun bir [[wikipedia:tr:Yardım:Kitaplar/Uzmanlar|baskı sürümü]] $1 altında mevcuttur. Bu şablonu değiştirirseniz, lütfen baskı sürümünü de güncelleyin.&amp;quot;,&lt;br /&gt;
                &amp;quot;uk&amp;quot;: &amp;quot;[[Help:Books/for experts#Improving the book layout|Версія для друку]] даного шаблону також присутня за адресою $1. Якщо ви змінюєте даний шаблон, то будь ласка, оновіть також версію для друку.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:No_globals&amp;diff=8263</id>
		<title>Module:No globals</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:No_globals&amp;diff=8263"/>
		<updated>2021-12-21T22:29:09Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;local mt = getmetatable(_G) or {} function mt.__index (t, k) 	if k ~= &amp;#039;arg&amp;#039; then 		error(&amp;#039;Tried to read nil global &amp;#039; .. tostring(k), 2) 	end 	return nil end function mt.__newindex(t, k, v) 	if k ~= &amp;#039;arg&amp;#039; then 		error(&amp;#039;Tried to write global &amp;#039; .. tostring(k), 2) 	end 	rawset(t, k, v) end setmetatable(_G, mt)&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local mt = getmetatable(_G) or {}&lt;br /&gt;
function mt.__index (t, k)&lt;br /&gt;
	if k ~= &#039;arg&#039; then&lt;br /&gt;
		error(&#039;Tried to read nil global &#039; .. tostring(k), 2)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
function mt.__newindex(t, k, v)&lt;br /&gt;
	if k ~= &#039;arg&#039; then&lt;br /&gt;
		error(&#039;Tried to write global &#039; .. tostring(k), 2)&lt;br /&gt;
	end&lt;br /&gt;
	rawset(t, k, v)&lt;br /&gt;
end&lt;br /&gt;
setmetatable(_G, mt)&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:TNTFallback&amp;diff=8262</id>
		<title>Module:TNTFallback</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:TNTFallback&amp;diff=8262"/>
		<updated>2021-12-21T22:27:16Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;-------------------------------------------------------------------------------- -- This module implements a wrapper for Module:TNT that allows returning -- a fallback message; used by {{Documentation}}. -- -- @module TNTFallback -- @alias  p -- @author User:ExE Boss -- @require Module:No globals -- @require Module:TNT --------------------------------------------------------------------------------  require(&amp;quot;Module:No globals&amp;quot;); local TNT = require(&amp;quot;Modul...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
-- This module implements a wrapper for [[Module:TNT]] that allows returning&lt;br /&gt;
-- a fallback message; used by {{Documentation}}.&lt;br /&gt;
--&lt;br /&gt;
-- @module TNTFallback&lt;br /&gt;
-- @alias  p&lt;br /&gt;
-- @author [[User:ExE Boss]]&lt;br /&gt;
-- @require [[Module:No globals]]&lt;br /&gt;
-- @require [[Module:TNT]]&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
require(&amp;quot;Module:No globals&amp;quot;);&lt;br /&gt;
local TNT = require(&amp;quot;Module:TNT&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
local p = {};&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Based on [[Module:TNT]]&#039;s `msg` function,&lt;br /&gt;
-- but takes an optional `fallback` parameter.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function p.msg(frame)&lt;br /&gt;
	local dataset, key;&lt;br /&gt;
	local params = { n = 0 };&lt;br /&gt;
	local lang = nil;&lt;br /&gt;
	local fallback = nil;&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(frame.args) do&lt;br /&gt;
		if (k == 1) then&lt;br /&gt;
			dataset = v;&lt;br /&gt;
		elseif (k == 2) then&lt;br /&gt;
			key = v;&lt;br /&gt;
		elseif (type(k) == &amp;quot;number&amp;quot; and k &amp;gt; 2) then&lt;br /&gt;
			local i = k - 2;&lt;br /&gt;
			params[i] = v;&lt;br /&gt;
			params.n = math.max(params.n, i);&lt;br /&gt;
		elseif ((k == &amp;quot;lang&amp;quot;) and (v ~= &amp;quot;_&amp;quot;)) then&lt;br /&gt;
			lang = v;&lt;br /&gt;
		elseif ((k == &amp;quot;fallback&amp;quot;) and (v ~= &amp;quot;&amp;quot;)) then&lt;br /&gt;
			fallback = v;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result;&lt;br /&gt;
	if (lang) then&lt;br /&gt;
		result = TNT.formatInLanguage(lang, dataset, key, unpack(params, 1, params.n));&lt;br /&gt;
	else&lt;br /&gt;
		result = TNT.format(dataset, key, unpack(params, 1, params.n));&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (fallback and (&lt;br /&gt;
		-- not translated&lt;br /&gt;
		(result and result == TNT.formatInLanguage(&amp;quot;en&amp;quot;, dataset, key, unpack(params, 1, params.n)))&lt;br /&gt;
		-- no message&lt;br /&gt;
		or (not result)&lt;br /&gt;
	)) then&lt;br /&gt;
		if (not lang) then&lt;br /&gt;
			if (frame:callParserFunction(&amp;quot;int:lang&amp;quot;) ~= &amp;quot;en&amp;quot;) then&lt;br /&gt;
				return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();&lt;br /&gt;
			end&lt;br /&gt;
		elseif (lang ~= &amp;quot;en&amp;quot;) then&lt;br /&gt;
			return mw.message.newRawMessage(fallback, unpack(params, 1, params.n)):plain();&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Transclude&amp;diff=8261</id>
		<title>Template:Transclude</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Transclude&amp;diff=8261"/>
		<updated>2021-12-21T22:26:26Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;{{#switch: {{NAMESPACE: {{{1}}} }}  |#default = {{FULLPAGENAME: {{{1}}} }} &amp;lt;!-- eg &amp;quot;User:Foo&amp;quot; --&amp;gt;  |{{ns:0}} =      {{#ifeq: {{NAMESPACE: {{{1}}} }} | {{NAMESPACE: Template{{{1}}} }}       | Template:{{{1}}}            &amp;lt;!-- no leading colon, eg &amp;quot;Foo&amp;quot; --&amp;gt;       | {{PAGENAME: {{{1}}} }}      &amp;lt;!-- leading colon, eg &amp;quot;:Foo&amp;quot;, so we want the article --&amp;gt;     }} }}&amp;lt;noinclude&amp;gt; {{documentation}} &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch: {{NAMESPACE: {{{1}}} }}&lt;br /&gt;
 |#default = {{FULLPAGENAME: {{{1}}} }} &amp;lt;!-- eg &amp;quot;User:Foo&amp;quot; --&amp;gt;&lt;br /&gt;
 |{{ns:0}} = &lt;br /&gt;
    {{#ifeq: {{NAMESPACE: {{{1}}} }} | {{NAMESPACE: Template{{{1}}} }}&lt;br /&gt;
      | Template:{{{1}}}            &amp;lt;!-- no leading colon, eg &amp;quot;Foo&amp;quot; --&amp;gt;&lt;br /&gt;
      | {{PAGENAME: {{{1}}} }}      &amp;lt;!-- leading colon, eg &amp;quot;:Foo&amp;quot;, so we want the article --&amp;gt;&lt;br /&gt;
    }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Template:Documentation/styles.css&amp;diff=8260</id>
		<title>Template:Documentation/styles.css</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Template:Documentation/styles.css&amp;diff=8260"/>
		<updated>2021-12-21T22:23:10Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;.template-documentation { 	margin-top: 1em; 	clear: both; 	border: 2px dotted #666; 	padding: 0.6em; 	background-color: #ecfcf4; } .template-documentation:after { 	content: &amp;quot;&amp;quot;; 	display: block; 	clear: both; } .template-documentation-heading { 	padding-bottom: 3px; 	border-bottom: 1px solid #a2a9b1; 	margin-bottom: 1ex; } .template-documentation-title { 	font-size: 150%; } .template-documentation-transcludedfrom { 	font-size: smaller; 	font-style: italic; }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.template-documentation {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	border: 2px dotted #666;&lt;br /&gt;
	padding: 0.6em;&lt;br /&gt;
	background-color: #ecfcf4;&lt;br /&gt;
}&lt;br /&gt;
.template-documentation:after {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
	display: block;&lt;br /&gt;
	clear: both;&lt;br /&gt;
}&lt;br /&gt;
.template-documentation-heading {&lt;br /&gt;
	padding-bottom: 3px;&lt;br /&gt;
	border-bottom: 1px solid #a2a9b1;&lt;br /&gt;
	margin-bottom: 1ex;&lt;br /&gt;
}&lt;br /&gt;
.template-documentation-title {&lt;br /&gt;
	font-size: 150%;&lt;br /&gt;
}&lt;br /&gt;
.template-documentation-transcludedfrom {&lt;br /&gt;
	font-size: smaller;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:TNT&amp;diff=8259</id>
		<title>Module:TNT</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:TNT&amp;diff=8259"/>
		<updated>2021-12-21T22:14:32Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;-- -- INTRO:   (!!! DO NOT RENAME THIS PAGE !!!) --    This module allows any template or module to be copy/pasted between --    wikis without any translation changes. All translation text is stored --    in the global  Data:*.tab  pages on Commons, and used everywhere. -- -- SEE:   https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules -- -- ATTENTION: --    Please do NOT rename this module - it has to be identical on all wikis. --    This code is maintained...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- INTRO:   (!!! DO NOT RENAME THIS PAGE !!!)&lt;br /&gt;
--    This module allows any template or module to be copy/pasted between&lt;br /&gt;
--    wikis without any translation changes. All translation text is stored&lt;br /&gt;
--    in the global  Data:*.tab  pages on Commons, and used everywhere.&lt;br /&gt;
--&lt;br /&gt;
-- SEE:   https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules&lt;br /&gt;
--&lt;br /&gt;
-- ATTENTION:&lt;br /&gt;
--    Please do NOT rename this module - it has to be identical on all wikis.&lt;br /&gt;
--    This code is maintained at https://www.mediawiki.org/wiki/Module:TNT&lt;br /&gt;
--    Please do not modify it anywhere else, as it may get copied and override your changes.&lt;br /&gt;
--    Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT&lt;br /&gt;
--&lt;br /&gt;
-- DESCRIPTION:&lt;br /&gt;
--    The &amp;quot;msg&amp;quot; function uses a Commons dataset to translate a message&lt;br /&gt;
--    with a given key (e.g. source-table), plus optional arguments&lt;br /&gt;
--    to the wiki markup in the current content language.&lt;br /&gt;
--    Use lang=xx to set language.  Example:&lt;br /&gt;
--&lt;br /&gt;
--    {{#invoke:TNT | msg&lt;br /&gt;
--     | I18n/Template:Graphs.tab  &amp;lt;!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab --&amp;gt;&lt;br /&gt;
--     | source-table              &amp;lt;!-- uses a translation message with id = &amp;quot;source-table&amp;quot; --&amp;gt;&lt;br /&gt;
--     | param1 }}                 &amp;lt;!-- optional parameter --&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
--&lt;br /&gt;
--    The &amp;quot;doc&amp;quot; function will generate the &amp;lt;templatedata&amp;gt; parameter documentation for templates.&lt;br /&gt;
--    This way all template parameters can be stored and localized in a single Commons dataset.&lt;br /&gt;
--    NOTE: &amp;quot;doc&amp;quot; assumes that all documentation is located in Data:Templatedata/* on Commons.&lt;br /&gt;
--&lt;br /&gt;
--    {{#invoke:TNT | doc | Graph:Lines }}&lt;br /&gt;
--        uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab&lt;br /&gt;
--        if the current page is Template:Graph:Lines/doc&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local i18nDataset = &#039;I18n/Module:TNT.tab&#039;&lt;br /&gt;
&lt;br /&gt;
-- Forward declaration of the local functions&lt;br /&gt;
local sanitizeDataset, loadData, link, formatMessage&lt;br /&gt;
&lt;br /&gt;
function p.msg(frame)&lt;br /&gt;
	local dataset, id&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local lang = nil&lt;br /&gt;
	for k, v in pairs(frame.args) do&lt;br /&gt;
		if k == 1 then&lt;br /&gt;
			dataset = mw.text.trim(v)&lt;br /&gt;
		elseif k == 2 then&lt;br /&gt;
			id = mw.text.trim(v)&lt;br /&gt;
		elseif type(k) == &#039;number&#039; then&lt;br /&gt;
			table.insert(params, mw.text.trim(v))&lt;br /&gt;
		elseif k == &#039;lang&#039; and v ~= &#039;_&#039; then&lt;br /&gt;
			lang = mw.text.trim(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return formatMessage(dataset, id, params, lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Identical to p.msg() above, but used from other lua modules&lt;br /&gt;
-- Parameters:  name of dataset, message key, optional arguments&lt;br /&gt;
-- Example with 2 params:  format(&#039;I18n/Module:TNT&#039;, &#039;error_bad_msgkey&#039;, &#039;my-key&#039;, &#039;my-dataset&#039;)&lt;br /&gt;
function p.format(dataset, key, ...)&lt;br /&gt;
	local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
	checkType(&#039;format&#039;, 1, dataset, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;format&#039;, 2, key, &#039;string&#039;)&lt;br /&gt;
	return formatMessage(dataset, key, {...})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Identical to p.msg() above, but used from other lua modules with the language param&lt;br /&gt;
-- Parameters:  language code, name of dataset, message key, optional arguments&lt;br /&gt;
-- Example with 2 params:  formatInLanguage(&#039;es&#039;, I18n/Module:TNT&#039;, &#039;error_bad_msgkey&#039;, &#039;my-key&#039;, &#039;my-dataset&#039;)&lt;br /&gt;
function p.formatInLanguage(lang, dataset, key, ...)&lt;br /&gt;
	local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
	checkType(&#039;formatInLanguage&#039;, 1, lang, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;formatInLanguage&#039;, 2, dataset, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;formatInLanguage&#039;, 3, key, &#039;string&#039;)&lt;br /&gt;
	return formatMessage(dataset, key, {...}, lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Obsolete function that adds a &#039;c:&#039; prefix to the first param.&lt;br /&gt;
-- &amp;quot;Sandbox/Sample.tab&amp;quot; -&amp;gt; &#039;c:Data:Sandbox/Sample.tab&#039;&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
	return link(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.doc(frame)&lt;br /&gt;
	local dataset = &#039;Templatedata/&#039; .. sanitizeDataset(frame.args[1])&lt;br /&gt;
	return frame:extensionTag(&#039;templatedata&#039;, p.getTemplateData(dataset)) ..&lt;br /&gt;
		   formatMessage(i18nDataset, &#039;edit_doc&#039;, {link(dataset)})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getTemplateData(dataset)&lt;br /&gt;
	-- TODO: add &#039;_&#039; parameter once lua starts reindexing properly for &amp;quot;all&amp;quot; languages&lt;br /&gt;
	local data = loadData(dataset)&lt;br /&gt;
	local names = {}&lt;br /&gt;
	for _, field in pairs(data.schema.fields) do&lt;br /&gt;
		table.insert(names, field.name)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local paramOrder = {}&lt;br /&gt;
	for _, row in pairs(data.data) do&lt;br /&gt;
		local newVal = {}&lt;br /&gt;
		local name = nil&lt;br /&gt;
		for pos, val in pairs(row) do&lt;br /&gt;
			local columnName = names[pos]&lt;br /&gt;
			if columnName == &#039;name&#039; then&lt;br /&gt;
				name = val&lt;br /&gt;
			else&lt;br /&gt;
				newVal[columnName] = val&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if name then&lt;br /&gt;
			params[name] = newVal&lt;br /&gt;
			table.insert(paramOrder, name)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Work around json encoding treating {&amp;quot;1&amp;quot;:{...}} as an [{...}]&lt;br /&gt;
	params[&#039;zzz123&#039;]=&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	local json = mw.text.jsonEncode({&lt;br /&gt;
		params=params,&lt;br /&gt;
		paramOrder=paramOrder,&lt;br /&gt;
		description=data.description&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	json = string.gsub(json,&#039;&amp;quot;zzz123&amp;quot;:&amp;quot;&amp;quot;,?&#039;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return json&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Local functions&lt;br /&gt;
&lt;br /&gt;
sanitizeDataset = function(dataset)&lt;br /&gt;
	if not dataset then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	dataset = mw.text.trim(dataset)&lt;br /&gt;
	if dataset == &#039;&#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif string.sub(dataset,-4) ~= &#039;.tab&#039; then&lt;br /&gt;
		return dataset .. &#039;.tab&#039;&lt;br /&gt;
	else&lt;br /&gt;
		return dataset&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
loadData = function(dataset, lang)&lt;br /&gt;
	dataset = sanitizeDataset(dataset)&lt;br /&gt;
	if not dataset then&lt;br /&gt;
		error(formatMessage(i18nDataset, &#039;error_no_dataset&#039;, {}))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Give helpful error to thirdparties who try and copy this module.&lt;br /&gt;
	if not mw.ext or not mw.ext.data or not mw.ext.data.get then&lt;br /&gt;
		error(&#039;Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:&#039; .. dataset)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = mw.ext.data.get(dataset, lang)&lt;br /&gt;
&lt;br /&gt;
	if data == false then&lt;br /&gt;
		if dataset == i18nDataset then&lt;br /&gt;
			-- Prevent cyclical calls&lt;br /&gt;
			error(&#039;Missing Commons dataset &#039; .. i18nDataset)&lt;br /&gt;
		else&lt;br /&gt;
			error(formatMessage(i18nDataset, &#039;error_bad_dataset&#039;, {link(dataset)}))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given a dataset name, convert it to a title with the &#039;commons:data:&#039; prefix&lt;br /&gt;
link = function(dataset)&lt;br /&gt;
	return &#039;c:Data:&#039; .. mw.text.trim(dataset or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
formatMessage = function(dataset, key, params, lang)&lt;br /&gt;
	for _, row in pairs(loadData(dataset, lang).data) do&lt;br /&gt;
		local id, msg = unpack(row)&lt;br /&gt;
		if id == key then&lt;br /&gt;
			local result = mw.message.newRawMessage(msg, unpack(params or {}))&lt;br /&gt;
			return result:plain()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if dataset == i18nDataset then&lt;br /&gt;
		-- Prevent cyclical calls&lt;br /&gt;
		error(&#039;Invalid message key &amp;quot;&#039; .. key .. &#039;&amp;quot;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		error(formatMessage(i18nDataset, &#039;error_bad_msgkey&#039;, {key, link(dataset)}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
	<entry>
		<id>https://www.boywiki.org/media/index.php?title=Module:Languages&amp;diff=8258</id>
		<title>Module:Languages</title>
		<link rel="alternate" type="text/html" href="https://www.boywiki.org/media/index.php?title=Module:Languages&amp;diff=8258"/>
		<updated>2021-12-21T22:13:20Z</updated>

		<summary type="html">&lt;p&gt;UpgradeTest1: Created page with &amp;quot;--[=[ Not globally exposed. Internal function only.  language_subpages( frame, transform, options ) Parameters     frame:     The frame that was passed to the method invoked. The first argument or the page argument will be respected.     transform: A transform function. Example: function( basepagename, subpagename, code, langname ) end     options:   An object with options. Example: { abort= { on=function() end, time=0.8 }  }         Following options are available:...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[=[&lt;br /&gt;
Not globally exposed. Internal function only.&lt;br /&gt;
&lt;br /&gt;
language_subpages( frame, transform, options )&lt;br /&gt;
Parameters&lt;br /&gt;
    frame:     The frame that was passed to the method invoked. The first argument or the page argument will be respected.&lt;br /&gt;
    transform: A transform function. Example: function( basepagename, subpagename, code, langname ) end&lt;br /&gt;
    options:   An object with options. Example: { abort= { on=function() end, time=0.8 }  }&lt;br /&gt;
        Following options are available:&lt;br /&gt;
        abort: Aborts iterating over the subpages if one of the conditions is met. If the process is aborted, nil is returned!&lt;br /&gt;
            on: Function to be called if an abort-condition was met.&lt;br /&gt;
            cycles: The maximum number of subpages to run over.&lt;br /&gt;
            time: Maximum time to spend running over the subpages.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
function language_subpages( frame, transform, options )&lt;br /&gt;
    local args, pargs, options = frame.args, ( frame:getParent() or {} ).args or {}, options or {};&lt;br /&gt;
    local title = args.page or args[1] or pargs.page or pargs[1] or &amp;quot;&amp;quot;;&lt;br /&gt;
    local abort = options.abort or {};&lt;br /&gt;
    local at, clock = type( abort.on ), os.clock();&lt;br /&gt;
    local ac = function()&lt;br /&gt;
        if  at == &#039;function&#039; or ( at == &#039;table&#039; and getmetatable(abort.on).__call ) then&lt;br /&gt;
            abort.on();&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local tt = type( transform );&lt;br /&gt;
    local page = require( &#039;Module:Page&#039; );&lt;br /&gt;
&lt;br /&gt;
    title = page.clean(title);&lt;br /&gt;
&lt;br /&gt;
    if tt == &#039;function&#039; or ( tt == &#039;table&#039; and getmetatable(transform).__call ) then&lt;br /&gt;
        local fetch, pages, langcode, langname = mw.language.fetchLanguageName, {};&lt;br /&gt;
--[==[&lt;br /&gt;
&lt;br /&gt;
     / \&lt;br /&gt;
    / | \&lt;br /&gt;
   /  ·  \&lt;br /&gt;
   ¯¯¯¯¯¯¯&lt;br /&gt;
   Page.subpages() no longer works because it attempted to parse the HTML content generated by&lt;br /&gt;
   calling the parser function &amp;quot;Special:Prefixindex:&amp;quot; which is no longer expanded in Lua but&lt;br /&gt;
   converted to a &amp;quot;stripped tag&amp;quot; (containing a unique identifier surrounded by ASCII DEL characters)&lt;br /&gt;
   representing the tag name and its parameters.&lt;br /&gt;
   The actual expansion of stripped tags can no longer be performed in Lua.&lt;br /&gt;
   Now unstripping these tags just kills ALL these tags (except &amp;quot;wiki&amp;quot; tags) instead of performing&lt;br /&gt;
   their expansion by running the extension code. Only MediaWiki can unstrip these tags in texts after&lt;br /&gt;
   they have been returned by Lua.&lt;br /&gt;
   For this reason, page.subpages() is now completely empty (Module:Page no longer works).&lt;br /&gt;
   This cannot be bypassed, except by using a Scribunto extension library if lifting the limits set by mw.unstrip.&lt;br /&gt;
   Note that &amp;quot;Special:Prefixindex:&amp;quot; is also costly, even if it just requires a single database query to&lt;br /&gt;
   get all subpages, instead of one costly #ifexist or one costly mw.title() property reading per&lt;br /&gt;
   tested subpage to know if it exists.&lt;br /&gt;
   For now there&#039;s still no reliable way to get a list of subpages, or performing queries similar to&lt;br /&gt;
   the [[Special:Prefixindex]] page or list members of a category like when viewing a category page.&lt;br /&gt;
   Ideally, there should exist a method for such queries on Title objects returned by the mw.title library;&lt;br /&gt;
   but for now there&#039;s none.&lt;br /&gt;
   In Lua now, the only expansion possible with an immediate effect is the expansion of standard templates,&lt;br /&gt;
   all special tags or special pages, or parser function extensions do not work (Only the #expr parser&lt;br /&gt;
   function is supported by using an external Scribunto library).&lt;br /&gt;
--]==]&lt;br /&gt;
        for pg in page.subpages( title, { ignoreNS=true } ) do&lt;br /&gt;
            if abort.cycles then&lt;br /&gt;
                abort.cycles = abort.cycles - 1&lt;br /&gt;
                if 0 == abort.cycles then return ac()  end&lt;br /&gt;
            end&lt;br /&gt;
            if abort.time then&lt;br /&gt;
                if (os.clock() - clock) &amp;gt; abort.time then return ac()  end&lt;br /&gt;
            end&lt;br /&gt;
            if mw.ustring.len( pg ) &amp;lt;= 12 then&lt;br /&gt;
                langcode = string.lower( pg );&lt;br /&gt;
                langname = fetch( langcode );&lt;br /&gt;
                if langname ~= &#039;&#039; then&lt;br /&gt;
                    table.insert( pages, transform( title, pg, langcode, langname ) );&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return pages;&lt;br /&gt;
    end&lt;br /&gt;
    return {};&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function cloneArgs(frame)&lt;br /&gt;
    local args, pargs = {}, {}&lt;br /&gt;
    for k,v in pairs( frame.args ) do args[k] = v end&lt;br /&gt;
    if frame:getParent() then&lt;br /&gt;
        for k,v in pairs( frame:getParent().args ) do pargs[k] = v end&lt;br /&gt;
    end&lt;br /&gt;
    return args, pargs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local p = {};&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:languages|internal|Template:Adjective}}&lt;br /&gt;
]=]&lt;br /&gt;
function p.internal(frame)&lt;br /&gt;
    return table.concat(&lt;br /&gt;
        language_subpages( frame,&lt;br /&gt;
            function( title, page, code, name )&lt;br /&gt;
                return mw.ustring.format(&lt;br /&gt;
                    &#039;&amp;lt;bdi class=&amp;quot;language lang-%s&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;[[%s/%s|%s]]&amp;lt;/bdi&amp;gt;&#039;,&lt;br /&gt;
                    code, code,&lt;br /&gt;
                    title, page,&lt;br /&gt;
                    name&lt;br /&gt;
                );&lt;br /&gt;
            end&lt;br /&gt;
        ),&lt;br /&gt;
        &#039;&amp;amp;nbsp;&amp;lt;b&amp;gt;·&amp;lt;/b&amp;gt;&amp;amp;#32;&#039;&lt;br /&gt;
    );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:languages|external|Template:Adjective}}&lt;br /&gt;
]=]&lt;br /&gt;
function p.external(frame)&lt;br /&gt;
    return table.concat(&lt;br /&gt;
        language_subpages( frame,&lt;br /&gt;
            function( title, page, code, name )&lt;br /&gt;
                return mw.ustring.format(&lt;br /&gt;
                    &#039;&amp;lt;bdi class=&amp;quot;language lang-%s&amp;quot; lang=&amp;quot;%s&amp;quot;&amp;gt;[%s/%s %s]&amp;lt;/bdi&amp;gt;&#039;,&lt;br /&gt;
                    code, code,&lt;br /&gt;
                    tostring( mw.uri.fullUrl( title ) ), page:gsub( &#039; &#039;, &#039;_&#039; ),&lt;br /&gt;
                    name&lt;br /&gt;
                );&lt;br /&gt;
            end&lt;br /&gt;
        ),&lt;br /&gt;
        &#039;&amp;amp;nbsp;&amp;lt;b&amp;gt;·&amp;lt;/b&amp;gt;&amp;amp;#32;&#039;&lt;br /&gt;
    );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
forEachLanguage&lt;br /&gt;
&lt;br /&gt;
This function iterates over all language codes known to MediaWiki based on a maintained list&lt;br /&gt;
replacing patterns in a pattern-string for each language&lt;br /&gt;
&lt;br /&gt;
Usage&lt;br /&gt;
{{#invoke:Languages|forEachLanguage&lt;br /&gt;
  |pattern=patternstring&lt;br /&gt;
  |before=string to insert before iteration&lt;br /&gt;
  |after=string added after iteration&lt;br /&gt;
  |sep=separator string between iterations&lt;br /&gt;
  |inLang=langcode used for $lnTrP and $lnTrUC1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern: A pattern string which is processed for each language and which is concatenated at the end and returned as one string&lt;br /&gt;
    before: A string that is inserted before the concatenated result&lt;br /&gt;
    after: A string that is inserted after the concatenated result&lt;br /&gt;
    sep: A string that is inserted between each line created from the pattern while iterating (like ProcessedPattern_sep_ProcessedPattern_sep_ProcessedPattern)&lt;br /&gt;
    inLang: Langcode to use for $lnTrP and $lnTrUC1&lt;br /&gt;
    preprocess: if set to a non-empty value, the output will be preprocessed before being returned.&lt;br /&gt;
&lt;br /&gt;
Warning&lt;br /&gt;
    The output is still not prepreprocessed by default: so parser functions and magic keywords generated by the pattern are still not executed and replaced,&lt;br /&gt;
    and template transclusions are still not expanded (see examples in other functions in this module).&lt;br /&gt;
    When using this function directly from a MediaWiki page or template, this means it is only possible to use patterns generating basic MediaWiki formatting&lt;br /&gt;
    or HTML tags. It you want the output to be preprocessed (in the given frame), set the preprocess parameter to a non-empty string.&lt;br /&gt;
    &lt;br /&gt;
Patterns&lt;br /&gt;
    $lc - language code such as en or de&lt;br /&gt;
    $lnP - language name in own language (autonym)&lt;br /&gt;
    $lnUC1 - language name in own language (autonym), first letter upper case&lt;br /&gt;
    $lnTrP - language name translated to the language requested by language code passed to inLang&lt;br /&gt;
    $lnTrUC1 - language name translated to the language requested by language code passed to inLang, first letter upper case&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
    {{#invoke:Languages|forEachLanguage|pattern=&amp;lt;span lang=&amp;quot;$lc&amp;quot; xml:lang=&amp;quot;$lc&amp;quot; class=&amp;quot;language lang-$lc&amp;quot;&amp;gt;[[Page/$lc|$lnP]]&amp;lt;/span&amp;gt;}}&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
-- =p.forEachLanguage({ args= { pattern = &amp;quot;$lc - $lnTrP\n&amp;quot;, inLang = &amp;quot;en&amp;quot; } })&lt;br /&gt;
function p.forEachLanguage(frame)&lt;br /&gt;
    local l = require(&amp;quot;Module:Languages/List&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    local lang    = mw.language&lt;br /&gt;
    local line&lt;br /&gt;
    local pattern = frame.args.pattern   or frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    local prefix  = frame.args.before    or frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
    local postfix = frame.args.after     or frame.args[3] or &amp;quot;&amp;quot;&lt;br /&gt;
    local sep     = frame.args.sep       or frame.args.separator or frame.args[4] or &amp;quot;&amp;quot;&lt;br /&gt;
    local inLang  = frame.args.inLang    or frame.args[5] or nil&lt;br /&gt;
    local preprocess = frame.args.preprocess or frame.args[6] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    local langNameUCFirstReq           = not not pattern:find( &amp;quot;$lnUC1&amp;quot;, 1, true )&lt;br /&gt;
    local langNameReq                  = not not pattern:find( &amp;quot;$lnP&amp;quot;, 1, true ) or langNameUCFirstReq&lt;br /&gt;
    local langNameTranslatedUCFirstReq = not not pattern:find( &amp;quot;$lnTrUC1&amp;quot;, 1, true )&lt;br /&gt;
    local langNameTranslatedReq        = not not pattern:find( &amp;quot;$lnTrP&amp;quot;, 1, true ) or langNameTranslatedUCFirstReq&lt;br /&gt;
    local contentLangInstance = mw.language.getContentLanguage()&lt;br /&gt;
    local inLangLangInstance&lt;br /&gt;
    local l = mw.language.fetchLanguageNames() -- autonyms&lt;br /&gt;
    local lTr&lt;br /&gt;
    local lcIdList = require(&#039;Module:Languages/List&#039;).getSortedList( l )&lt;br /&gt;
&lt;br /&gt;
    if langNameTranslatedReq then&lt;br /&gt;
        inLangLangInstance = --[==[&lt;br /&gt;
            mw.getLanguage( inLang ) -- Quota hit in :ucfirst() if using too many langInstances&lt;br /&gt;
            --]==] contentLangInstance&lt;br /&gt;
        lTr = mw.language.fetchLanguageNames( inLang ) -- translated names&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, lcId in pairs( lcIdList ) do&lt;br /&gt;
        local subst = lcId:gsub(&#039;%%&#039;, &#039;%%%%&#039;)&lt;br /&gt;
        line = pattern:gsub( &amp;quot;%$lc&amp;quot;, subst )&lt;br /&gt;
        local langName, langInstance&lt;br /&gt;
        -- autonym (name of lcId in locale lcId)&lt;br /&gt;
        if langNameReq then&lt;br /&gt;
            langName = l[lcId]&lt;br /&gt;
            subst = langName:gsub(&#039;%%&#039;, &#039;%%%%&#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnP&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
        if langNameUCFirstReq then&lt;br /&gt;
            langInstance = --[==[&lt;br /&gt;
                mw.getLanguage( lcId ) -- Quota hit in :ucfirst() if using too many langInstances&lt;br /&gt;
                --]==] contentLangInstance&lt;br /&gt;
            langName = langInstance:ucfirst( langName )&lt;br /&gt;
            subst = langName:gsub(&#039;%%&#039;, &#039;%%%%&#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnUC1&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- translated name (name of lcId in locale inLang)&lt;br /&gt;
        if langNameTranslatedReq then&lt;br /&gt;
            langName = lTr[lcId]&lt;br /&gt;
            subst = langName:gsub(&#039;%%&#039;, &#039;%%%%&#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnTrP&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
        if langNameTranslatedUCFirstReq then&lt;br /&gt;
            langName = inLangLangInstance:ucfirst( langName )&lt;br /&gt;
            subst = langName:gsub(&#039;%%&#039;, &#039;%%%%&#039;)&lt;br /&gt;
            line = line:gsub( &amp;quot;%$lnTrUC1&amp;quot;, subst )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        table.insert(ret, line)&lt;br /&gt;
    end&lt;br /&gt;
    ret = prefix .. table.concat( ret, sep ) .. postfix&lt;br /&gt;
    if preprocess ~= &#039;&#039; then&lt;br /&gt;
        ret = frame:preprocess(ret)&lt;br /&gt;
    end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Lle]] (Language Links external, to be substituted, language names written exactly as #language would provide them)&lt;br /&gt;
 Warning: may expands too many costly #ifexist without limitation (if not substituted into a separate &amp;quot;/lang&amp;quot; template)&lt;br /&gt;
]=]&lt;br /&gt;
function p.lle(frame)&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        p.forEachLanguage({&lt;br /&gt;
            args = {&lt;br /&gt;
                pattern = &#039;{{subst:#ifexist:{{{1}}}/$lc|[{{subst:fullurl:{{{1}}}/$lc}} &amp;lt;bdi class=&amp;quot;language lang-$lc&amp;quot; lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;lt;!--\n--&amp;gt;}}&#039;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Ll]] (Language Links internal, to be substituted, language names written exactly as #language would provide them)&lt;br /&gt;
 Warning: may expands too many costly #ifexist without limitation (if not substituted into a separate &amp;quot;/lang&amp;quot; template)&lt;br /&gt;
]=]&lt;br /&gt;
function p.ll(frame)&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        p.forEachLanguage({&lt;br /&gt;
            args = {&lt;br /&gt;
                pattern = &#039;{{subst:#ifexist:{{{1}}}/$lc|[[{{{1}}}/$lc|&amp;lt;bdi class=&amp;quot;language lang-$lc&amp;quot; lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&amp;lt;!--\n--&amp;gt;}}&#039;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------&lt;br /&gt;
--- Different approaches for [[Template:Lang links]] ---&lt;br /&gt;
--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
 Provide logic for [[Template:Lang links]]&lt;br /&gt;
 Using a cute Hybrid-Method:&lt;br /&gt;
    First check the subpages which is quite fast; if there are too many fall back to checking for each language page individually&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&#039;Commons:Picture of the Year/2010&#039; }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&#039;Main Page&#039; }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&#039;Template:No_source_since&#039; }, getParent=function() end })&lt;br /&gt;
-- =p.langLinksNonExpensive({ args= { page=&#039;MediaWiki:Gadget-HotCat&#039; }, getParent=function() end })&lt;br /&gt;
function p.langLinksNonExpensive(frame)&lt;br /&gt;
    local args, pargs = frame.args, ( frame:getParent() or {} ).args or {};&lt;br /&gt;
    local title = args.page or args[1] or pargs.page or pargs[1] or &amp;quot;&amp;quot;;&lt;br /&gt;
    local contentLangInstance = mw.language.getContentLanguage();&lt;br /&gt;
    local pages2&lt;br /&gt;
    if frame.preprocess == nil then&lt;br /&gt;
        frame = mw.getCurrentFrame()&lt;br /&gt;
    end&lt;br /&gt;
--[==[&lt;br /&gt;
    local options = {&lt;br /&gt;
        abort = {&lt;br /&gt;
            time = 3.5,&lt;br /&gt;
            on = function()&lt;br /&gt;
                pages2 = p.forEachLanguage({&lt;br /&gt;
                    args = {&lt;br /&gt;
                       pattern = &#039;{{#ifexist:&#039; .. title .. &#039;/$lc|[[&#039; .. title .. &#039;/$lc|&amp;lt;bdi lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;}}&#039;&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
            end&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    local pages = language_subpages( frame,&lt;br /&gt;
        function( title, page, code, langname )&lt;br /&gt;
            return mw.ustring.format(&lt;br /&gt;
                &#039;[[%s/%s|&amp;lt;bdi lang=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/bdi&amp;gt;]]&amp;lt;/span&amp;gt;&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&#039;,&lt;br /&gt;
                title, page, code, langname&lt;br /&gt;
            )&lt;br /&gt;
        end, options );&lt;br /&gt;
    return pages2 and frame:preprocess(pages2) or table.concat(pages, &#039;&#039;);&lt;br /&gt;
--]==]&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        p.forEachLanguage( {&lt;br /&gt;
            args = {&lt;br /&gt;
                pattern = &#039;{{#ifexist:&#039; .. title .. &#039;/$lc|[[&#039; .. title .. &#039;/$lc|&amp;lt;bdi lang=&amp;quot;$lc&amp;quot;&amp;gt;$lnP&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;}}&#039;&lt;br /&gt;
            }&lt;br /&gt;
        })&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
----------------- [[Template:Autolang]] -----------------&lt;br /&gt;
---------------------------------------------------------&lt;br /&gt;
--[[&lt;br /&gt;
  Works like {{autotranslate}} just allowing an unlimited number of arguments, even named arguments.&lt;br /&gt;
  It&#039;s doing Magic! No arguments should be passed to {{#invoke:}}&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function p.autolang(frame)&lt;br /&gt;
    local args, pargs = cloneArgs( frame )&lt;br /&gt;
    if nil == args.useargs then&lt;br /&gt;
        if not args.base then args = pargs end&lt;br /&gt;
    elseif &#039;both&#039; == args.useargs then&lt;br /&gt;
        for k,v in pairs(args) do pargs[k] = v end&lt;br /&gt;
        args = pargs&lt;br /&gt;
    elseif &#039;parent&#039; == args.useargs then&lt;br /&gt;
        args = pargs&lt;br /&gt;
        if pargs.base and not args.base then&lt;br /&gt;
            args.base = pargs.base&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local base = args.base&lt;br /&gt;
    local userlang = frame:preprocess( &#039;{{Int:Lang}}&#039; )&lt;br /&gt;
    local tl, tlns = &#039;Template:&#039;, 10&lt;br /&gt;
    local tlb, fallback1, currenttemplate&lt;br /&gt;
    local fallback, contentlang = mw.text.split( userlang, &#039;-&#039;, true )[1], mw.language.getContentLanguage():getCode()&lt;br /&gt;
&lt;br /&gt;
    local createReturn = function(title)&lt;br /&gt;
        local ret&lt;br /&gt;
        local tlargs = {}&lt;br /&gt;
         -- When LUA is invoked, templates are already expanded. This must be respected.&lt;br /&gt;
        return frame:expandTemplate{ title = title, args = args }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not base then&lt;br /&gt;
        return (&amp;quot;&#039;autolang&#039; in [[Module:Languages]] was called but the &#039;base&#039; parameter could not be found.&amp;quot; ..&lt;br /&gt;
            &amp;quot;The base parameter specifies the template that&#039;s subpages will be sought for a suitable translation.&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    tlb = tl .. base .. &#039;/&#039;&lt;br /&gt;
&lt;br /&gt;
    currenttemplate = tlb .. userlang&lt;br /&gt;
    local ok, exists = pcall( function()&lt;br /&gt;
        return mw.title.new( currenttemplate, tlns ).exists&lt;br /&gt;
    end )&lt;br /&gt;
    if ok and exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fallback1 = frame:preprocess( &#039;{{Fallback|1=&#039; .. base .. &#039;|2=&#039; .. userlang .. &#039;}}&#039; )&lt;br /&gt;
    if fallback1 ~= contentlang then&lt;br /&gt;
        return createReturn(tlb .. fallback1)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    currenttemplate = tlb .. fallback&lt;br /&gt;
    local ok, exists = pcall( function()&lt;br /&gt;
        return mw.title.new( currenttemplate, tlns ).exists&lt;br /&gt;
    end )&lt;br /&gt;
    if ok and exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    currenttemplate = tlb .. contentlang&lt;br /&gt;
    local ok, exists = pcall( function()&lt;br /&gt;
        return mw.title.new( currenttemplate, tlns ).exists&lt;br /&gt;
    end )&lt;br /&gt;
    if ok and exists then&lt;br /&gt;
        return createReturn(currenttemplate)&lt;br /&gt;
    end&lt;br /&gt;
    return createReturn(tl .. base)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:languages|isKnownLanguageTag|gsw}} -&amp;gt; 1&lt;br /&gt;
{{#invoke:languages|isKnownLanguageTag|doesNotExist}} -&amp;gt;&lt;br /&gt;
]=]&lt;br /&gt;
function p.isKnownLanguageTag(frame)&lt;br /&gt;
    return mw.language.isKnownLanguageTag( frame.args[1] or frame.args.tag or frame.args.code or &#039;&#039; ) and &#039;1&#039; or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.file_languages(frame)&lt;br /&gt;
    local M_link = require( &#039;Module:Link&#039; )&lt;br /&gt;
    local contentLangInstance = mw.language.getContentLanguage()&lt;br /&gt;
    local pattern = frame.args.pattern or &#039;%s (%s)&#039;&lt;br /&gt;
    local original = frame.args.original or mw.title.getCurrentTitle().text&lt;br /&gt;
    local ext_start, _ = string.find( original, &#039;\.%w+$&#039; )&lt;br /&gt;
    local file_ext = string.sub( original, ext_start )&lt;br /&gt;
    original = string.sub( original, 0, ext_start - 1 )&lt;br /&gt;
    return frame:preprocess(&lt;br /&gt;
        &#039;&amp;lt;gallery&amp;gt;\n&#039; ..&lt;br /&gt;
        (table.concat(&lt;br /&gt;
            M_link.forEachLink(&lt;br /&gt;
                p.forEachLanguage({&lt;br /&gt;
                    args = { pattern = &#039;[[$lc]]&#039; }&lt;br /&gt;
                }),&lt;br /&gt;
                function( linkInfo )&lt;br /&gt;
                    local filename = mw.ustring.format( pattern, original, linkInfo.text ) .. file_ext&lt;br /&gt;
                    local ok, exists = pcall( function()&lt;br /&gt;
                            return mw.title.new( filename, 6 ).exists&lt;br /&gt;
                        end )&lt;br /&gt;
                    if ok and exists then&lt;br /&gt;
                        return mw.ustring.format( &#039;%s|%s&#039;,&lt;br /&gt;
                            filename,&lt;br /&gt;
                            mw.language.fetchLanguageName( linkInfo.text )&lt;br /&gt;
                        )&lt;br /&gt;
                    else&lt;br /&gt;
                        return nil&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            ), &#039;\n&#039;&lt;br /&gt;
        )) ..&lt;br /&gt;
        &#039;\n&amp;lt;/gallery&amp;gt;&#039;&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.runTests()&lt;br /&gt;
    return p.langLinksNonExpensive({&lt;br /&gt;
        args = {&lt;br /&gt;
            page = &#039;Module:Languages/testcases/test&#039;&lt;br /&gt;
        },&lt;br /&gt;
        getParent = function() end&lt;br /&gt;
    }) ==&lt;br /&gt;
        &#039;[[Module:Languages/testcases/test/de|&amp;lt;bdi lang=&amp;quot;de&amp;quot;&amp;gt;Deutsch&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&#039; ..&lt;br /&gt;
        &#039;[[Module:Languages/testcases/test/en|&amp;lt;bdi lang=&amp;quot;en&amp;quot;&amp;gt;English&amp;lt;/bdi&amp;gt;]]&amp;amp;nbsp;&amp;lt;b&amp;gt;∙&amp;lt;/b&amp;gt;&amp;amp;#32;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>UpgradeTest1</name></author>
	</entry>
</feed>