MediaWiki:Common.js

From Geometry Dash Expanded Wiki
Revision as of 00:28, 16 October 2026 by Bot994 (talk | contribs) (Allow Restore default filters to expand to its label width)
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Use the physical device width instead of Vector legacy's 1120px canvas. */
(function () {
    var viewport = document.querySelector('meta[name="viewport"]');
    if (!viewport) {
        viewport = document.createElement('meta');
        viewport.name = 'viewport';
        document.head.appendChild(viewport);
    }
    viewport.content = 'width=device-width, initial-scale=1';
}());

/* Any JavaScript here will be loaded for all users on every page load. */

/***************************/
/* Interface Modification **/
/***************************/

/* [[MediaWiki:Custom-Category:Games]] */
$(function () {
    var config = {
        targetCategory: 'Games (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Games',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Gameplay]] */
$(function () {
    var config = {
        targetCategory: 'Gameplay (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Gameplay',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Rewards]] */
$(function () {
    var config = {
        targetCategory: 'Rewards (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Rewards',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Rooms]] */
$(function () {
    var config = {
        targetCategory: 'Rooms (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Rooms',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:LevelEditing]] */
$(function () {
    var config = {
        targetCategory: 'Level editing (base content)',
        sourceContent: 'MediaWiki:Custom-Category:LevelEditing',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:AccountFeatures]] */
$(function () {
    var config = {
        targetCategory: 'Account features (base content)',
        sourceContent: 'MediaWiki:Custom-Category:AccountFeatures',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the content list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-Category:Updates]] */
$(function () {
    var config = {
        targetCategory: 'Updates (base content)',
        sourceContent: 'MediaWiki:Custom-Category:Updates',
        insertionPoint: '#mw-normal-catlinks'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-page-list" style="font-weight:normal;">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the page list from ' + config.sourceContent);
    });
});

/***************************/

/* [[MediaWiki:Custom-MainLevels]] */
$(function () {
    var config = {
        targetCategory: 'Main levels (base content)',
        sourceContent: 'MediaWiki:Custom-MainLevels',
        insertionPoint: '#mw-content-text'
    };

    // Initial checks: Run only on page views (not edit mode) and for existing pages
    if (mw.config.get('wgAction') !== 'view' || mw.config.get('wgArticleId') === 0) return;

    // Category check: Verify if the article belongs to the target category
    var categories = mw.config.get('wgCategories');
    if (categories.indexOf(config.targetCategory) === -1) return;

    // Load and inject content
    var api = new mw.Api();
    api.get({
        action: 'parse',
        page: config.sourceContent,
        prop: 'text',
        disablelimitreport: true,
        disableeditsection: true
    }).done(function (data) {
        if (data && data.parse && data.parse.text) {
            var insertHtml = data.parse.text['*'];
            // Wrap in a div for styling and append
            $(config.insertionPoint).append(
                $('<div id="custom-category-footer">')
                .html(insertHtml)
            );
        }
    }).fail(function () {
        console.error('Failed to load the footer from ' + config.sourceContent);
    });
});

/***************************/

/* [[Template:USERNAME]] */
$(function () { 
	mw.config.get('wgUserName');
	if (mw.config.get('wgUserName') !== null) ('span.username-insert').text(mw.config.get('wgUserName'));
});

/***************************/

/* [[Template:Discord]] (DiscordCompact.js v0.0.2 - https://support.wiki.gg/wiki/DiscordCompact) */
$(function () {
	var widget = $("#content #discord-compact-widget");
    // Cancel when no widget detected
    if (!widget.length) return;
    // Ensure that ID is not blank
	var id = widget.attr("data-id");
	if (id === "") throw new Error("DiscordCompact has a blank server id!");
	// Ensure that ID consists only of numbers with 17 character minimum
	if (!new RegExp("^[0-9]{17}[0-9]+$").test(id)) throw new Error("DiscordCompact has an invalid server id!");
	var apiBase = "https://discord.com/api/guilds/" + id;
	// Get information about the server, such as online member count and invite url, as well as limits of the server existing at all or having widgets disabled
	$.ajax(apiBase + "/widget.json").fail(function(req) {
        if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status);
		switch (req.responseJSON.code) {
            case 10004:
                throw new Error("DiscordCompact has a valid server id, but no such server exists!");
            case 50004:
                throw new Error("DiscordCompact has a valid server id, but that server has widgets disabled!");
            default:
                throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.json (status: " + req.status + "; code: " + req.responseJSON.code + ")");
        }
	}).done(function(res) {
		const inviteURL = res.instant_invite;
        // Warn when unable to retrieve invite URL
        if (inviteURL == null) console.warn("DiscordCompact cannot get an invite URL; does this server have an invite channel set in Widget settings?");
        // Generate widget image
        $.ajax({url: apiBase + "/widget.png?style=banner2", xhrFields: {responseType: "blob"}}).fail(function(req) {
            if (!req.responseJSON) throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status);
            throw new Error("DiscordCompact encountered an unknown error whilst fetching widget.png! (status: " + req.status + "; code: " + req.responseJSON.code + ")");
        }).done(function(blob) {
            // Convert the image data into base64, preventing having to make the client request it a second time
            const imageReader = new FileReader();
            imageReader.readAsDataURL(blob);
            imageReader.onloadend = function() {
                const b64Data = imageReader.result;
                // Convert the widget into a selectable link
                widget.replaceWith(function() {
                    return $("<a>", {
                        id: widget.attr("id"),
                        class: widget.attr("class"),
                        style: widget.attr("style"),
                        alt: "Discord server widget",
                        href: inviteURL
                    });
                });
                // Select the widget
                widget = $("#discord-compact-widget");
                // CSS
                widget.css("display", "block");
                widget.css("max-height", "76px");
                widget.css("max-width", "320px");
                // Create image
                const widgetImage = document.createElement("img");
                widgetImage.src = b64Data;
                widgetImage.style.width = "100%";
                widgetImage.style.height = "100%";
                widgetImage.style.borderRadius = "4px";
                widget.append(widgetImage);
                // Prevent image dragging
                widget.on("dragstart", function(e) {e.preventDefault();});
                // Console message
                console.log("DiscordCompact loaded successfully!");
            };
        });
	});
});

/***************************/

/* [[Template:Discord]] (DiscordWidget.js - https://support.wiki.gg/wiki/DiscordWidget) */
$(function () {
	'use strict';
	var mconfig = mw.config.get([
		'wgContentLanguage',
		'wgUserLanguage',
		'wgUserName'
	]);
	if (window.DiscordIntegratorLoaded) {
		return;
	}
	window.DiscordIntegratorLoaded = true;
	// Main object, @static
	var DiscordIntegrator = {
		// Initialising
		init: function() {
			mw.hook('wikipage.content').add($.proxy(this.insertToContent, this));
		},
		//Finding the designated places in content in which to place the widget and placing it
		insertToContent: function($content) {
			$content.find('.DiscordIntegrator:not(.loaded)').each($.proxy(function(cabbage, el) {
				el = $(el);
				el.html(this.generateContent(el.data())).addClass('loaded');
			}, this));
		},
		// Determines the theme of the widget, @param {string} config Configured theme, @return {string} 'light' or 'dark' depending on the wiki theme and configuration
		determineTheme: function(config) {
			// If explicitly configured to light or dark
			if (config === 'dark') {
				return 'dark';
			}
			if (config === 'light') {
				return 'light';
			}
			// If not configured, try to determine based on wiki theme (set by themeToggle):
			return $(':root').hasClass('view-dark') ? 'dark' : 'light';
		},
		// Generate widget content from an object, @return {string} content of the widget
		generateContent: function(config) {
			if (!config.id || !String(config.id).match(/\d{17,19}/)) {
				return "Error: ID of the widget is malformed or not supplied, please see <a href='https://support.wiki.gg/wiki/DiscordWidget' title='the instructions'>the instructions</a> for how to find your server's ID. Please make sure you are not inserting <strong>the DiscordIntegrator template</strong> when asked for <strong>your widget ID</strong>.";
			}
			if (
				(
					config.loggedIn === true ||
					Boolean(config['logged-in']) === true &&
					config['logged-in'] !== 'false' &&
					config['logged-in'] !== '{{{loggedIn}}}'
				) && !mconfig.wgUserName
			) {
				return "Please <a href='/Special:UserLogin' title='log in'>log in</a> to see this widget.";
			}
			var username = config.username === '@disabled' ?
				'' :
				config.username === '@function' &&
				typeof window.DiscordIntegratorGetUsername === 'function' ?
					window.DiscordIntegratorGetUsername() :
					config.username || mconfig.wgUserName;
			return mw.html.element('iframe', {
				src: 'https://discord.com/widget?id=' + config.id +
					'&theme=' + this.determineTheme(config.theme) +
					'&username=' + encodeURIComponent(username),
				width: config.width || '100%',
				height: config.height || '400px',
				style: 'max-width:100%;',
				allowtransparency: 'true',
				frameborder: '0',
				title: "Discord server widget"
			});
		}
	};
	DiscordIntegrator.init();
});

/***************************/

/* CSS classes for daytime periods */
$(function() {
    'use strict';
    var currentTime = new Date().getHours();
	if (0 <= currentTime && currentTime < 6) {
		if (document.body) {document.body.classList.add('night');}
	}
	else if (6 <= currentTime && currentTime < 12) {
		if (document.body) {document.body.classList.add('morning');}
	}
	else if (12 <= currentTime && currentTime < 18) {
		if (document.body) {document.body.classList.add('afternoon');}
	}
	else {
		if (document.body) {document.body.classList.add('evening');}
	}
});

/* Geometry Dash Expanded Wiki footer: source attribution, licensing, and local contact. */
mw.loader.using('mediawiki.util').then(function () {
$(function () {
    var footer = document.querySelector('#footer');
    var information = document.querySelector('#footer-info');
    if (!footer || !information || document.getElementById('footer-info-ewiki-sources')) return;
    function link(text, href) {
        var element = document.createElement('a');
        element.textContent = text;
        element.href = href;
        return element;
    }
    var sources = document.createElement('li');
    sources.id = 'footer-info-ewiki-sources';
    sources.append('Imported material is adapted from the ',
        link('Official Wiki', 'https://geometrydash.wiki.gg/'),
        ' and, where applicable, the ',
        link('Geometry Dash Fandom', 'https://geometry-dash.fandom.com/'),
        ' and ', link('Geometry Dash Fan Fandom', 'https://geometry-dash-fan.fandom.com/'),
        ' wikis. Source and contributor links are recorded in import edit summaries.');
    var license = document.createElement('li');
    license.id = 'footer-info-ewiki-license';
    license.append('Imported wiki text retains its original licensing, including ',
        link('Creative Commons Attribution-ShareAlike 4.0', 'https://creativecommons.org/licenses/by-sa/4.0/'),
        '. Images and separately licensed code may have different terms. ',
        link('Sources and licensing', mw.util.getUrl('Project:Copyrights')), '.');
    var independent = document.createElement('li');
    independent.id = 'footer-info-ewiki-independent';
    independent.textContent = 'Geometry Dash Expanded Wiki is an independent community wiki and is not affiliated with wiki.gg or RobTop Games.';
    information.append(sources, license, independent);
    var places = document.querySelector('#footer-places');
    if (places && !document.getElementById('footer-places-ewiki-contact')) {
        var contact = document.createElement('li');
        contact.id = 'footer-places-ewiki-contact';
        contact.appendChild(link('Contact Geometry Dash Expanded Wiki', 'mailto:admin@geometrydashwiki.com'));
        places.appendChild(contact);
    }
    var footerIcons = document.getElementById('footer-icons');
    if (footerIcons) {
        if (!document.getElementById('footer-ewiki-licenseico')) {
            var licenseBadge = document.createElement('li');
            licenseBadge.id = 'footer-ewiki-licenseico';
            var licenseLink = link('', 'https://creativecommons.org/licenses/by-sa/4.0/');
            licenseLink.className = 'gd-footer-badge';
            licenseLink.title = 'Creative Commons Attribution-ShareAlike 4.0';
            var licenseImage = document.createElement('img');
            licenseImage.src = '/resources/assets/licenses/cc-by-sa.png';
            licenseImage.alt = 'Creative Commons Attribution-ShareAlike';
            licenseImage.width = 132; licenseImage.height = 47;
            licenseLink.appendChild(licenseImage); licenseBadge.appendChild(licenseLink);
            footerIcons.prepend(licenseBadge);
        }
        var poweredLink = footerIcons.querySelector('#footer-poweredbyico a');
        if (poweredLink) {
            poweredLink.className = 'gd-footer-badge';
            var poweredImage = document.createElement('img');
            poweredImage.src = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA4OSAzMSI+Cgk8cGF0aCBmaWxsPSIjZmZmIiBkPSJtNDEuOTE2IDI0LjQxLS4wMS04LjE0NmgtMS4xMjNsLTIuODY1IDUuMzk0LTIuOTE3LTUuMzk0aC0xLjEyNXY4LjE0NmgxLjN2LTUuMzNsMi40MTQgNC4zOTloLjYxMWwyLjQxNS00LjQ3LjAxIDUuMzk1aDEuMjl6bTYuOTE5LTMuMDcyYTMuNyAzLjcgMCAwIDAtLjM2My0xLjY4MkEyLjY4IDIuNjggMCAwIDAgNDYgMTguMTI0YTIuNzYgMi43NiAwIDAgMC0yLjUyNSAxLjU0MyAzLjUgMy41IDAgMCAwLS4zNzIgMS42MzRjLS4wMS41Ny4xMjMgMS4xMy4zODMgMS42NDIuMjQ1LjQ3NS42MjIuODY5IDEuMDg2IDEuMTM1YTMuNDMgMy40MyAwIDAgMCAyLjkzMi4xNTEgMi40IDIuNCAwIDAgMCAuOTU1LS43NTZsLS43MDMtLjg5NmExLjk0IDEuOTQgMCAwIDEtMS41MjQuNjc1IDEuODQgMS44NCAwIDAgMS0xLjIxMy0uNCAxLjcyIDEuNzIgMCAwIDEtLjYwNC0xLjA4OWg0LjM5N3EuMDIxLS4yOC4wMjEtLjQzem0tMi44MzYtMi4wNDlhMS40OCAxLjQ4IDAgMCAxIDEuMDcuNDE5Yy4yOTUuMjk0LjQ3Ny42OC41MTYgMS4wOTRoLTMuMTgyYy4wNDMtLjQxNy4yMzEtLjgwNi41My0xLjFBMS41IDEuNSAwIDAgMSA0NiAxOS4yODltOC4wNjEtMy41MTh2My4xODlhMi4xIDIuMSAwIDAgMC0uNzg3LS42MyAyLjQgMi40IDAgMCAwLTEuMDE4LS4yMDkgMi42OSAyLjY5IDAgMCAwLTIuNDYzIDEuNTEzIDMuOTcgMy45NyAwIDAgMCAwIDMuMzM0IDIuNjggMi42OCAwIDAgMCAyLjQ2MyAxLjUyNGMuMzY0LjAwNC43MjQtLjA3MSAxLjA1Ni0uMjIxYTIuMDYgMi4wNiAwIDAgMCAuODAzLS42NjR2LjgwM2gxLjI2di04LjYzaC0xLjMxOXptLTEuNjQ2IDcuNDc1Yy0uMy4wMDUtLjU5NS0uMDc3LS44NS0uMjM1YTEuNjUgMS42NSAwIDAgMS0uNTk5LS42ODEgMi41IDIuNSAwIDAgMSAwLTIuMDQ5Yy4xMzItLjI3OC4zNC0uNTE0LjU5OC0uNjgxYTEuNjMgMS42MyAwIDAgMSAxLjcgMGMuMjYuMTY3LjQ2Ny40MDMuNTk5LjY4MWEyLjUgMi41IDAgMCAxIDAgMi4wNDkgMS42NiAxLjY2IDAgMCAxLS41OTguNjgxIDEuNTYgMS41NiAwIDAgMS0uODUuMjM1bTQuNDcxIDEuMTYzaDEuMzF2LTYuMjE1aC0xLjMxMXptNC45NjMtNi4yODRhNC4zIDQuMyAwIDAgMC0xLjMxMy4xOTggMy4xIDMuMSAwIDAgMC0xLjA1NS41N2wuNTE1IDEuMDU1YTIuMiAyLjIgMCAwIDEgLjc3Mi0uNDU0Yy4yOTctLjEwOC42MTEtLjE2My45MjgtLjE2M2ExLjQyIDEuNDIgMCAwIDEgMS4wNDUuMzUyIDEuMzUgMS4zNSAwIDAgMSAuMzUyIDEuMDAxdi4wOTNoLTEuNDU0YTIuNiAyLjYgMCAwIDAtMS43NjkuNTA3IDEuNzIgMS43MiAwIDAgMC0uNTYxIDEuMzQ0IDEuNzYgMS43NiAwIDAgMCAuOTg2IDEuNjI0Yy4zNDQuMTY0LjcyMi4yNDQgMS4xMDIuMjM0LjM3LjAxLjczOC0uMDY0IDEuMDc1LS4yMTZhMS41NyAxLjU3IDAgMCAwIC42ODgtLjYyMnYuNzYyaDEuMjR2LTMuNjQ0YTIuNyAyLjcgMCAwIDAtLjY1Ni0xLjk4NCAyLjU1IDIuNTUgMCAwIDAtMS44OTUtLjY1OG0tLjE3OSA1LjMwN2ExLjIgMS4yIDAgMCAxLS43ODYtLjIzNC43Ny43NyAwIDAgMS0uMjg0LS42M3EwLS44MiAxLjEzNC0uODJoMS4zNTJ2LjcxNWExLjMzIDEuMzMgMCAwIDEtLjU0LjcxNiAxLjU3IDEuNTcgMCAwIDEtLjg3Ny4yNXptMTMuNzYtNy4xNy0xLjg3NiA2LjIyNy0xLjg1Ny02LjIyN2gtMS4yNjJsLTEuOSA2LjE5Mi0xLjgyNi02LjE5MmgtMS40MTdsMi40MzUgOC4xNDdoMS40NTdsMS44NDctNi4wMjkgMS44MTYgNi4wMjloMS40NWwyLjQzNS04LjE0N3ptMi4xMzEgOC4xNDdoMS4zMTJ2LTYuMjE1SDc3LjU2em03LjA1NCAwaDEuNTk1TDgzLjY0NyAyMC44bDIuMzQ2LTIuNjA3aC0xLjU3OWwtMi43MiAyLjc5NFYxNS43OGgtMS4zMXY4LjYzMWgxLjMxdi0xLjY0MmwuOTc3LTEuMDI0em0yLjE4MyAwaDEuMzEydi02LjIxNWgtMS4zMTN2Ni4yMTV6bS0yOS4yNTItNy4wMzZhLjgyLjgyIDAgMCAwIC42MDQtLjIzNS44LjggMCAwIDAgLjIzNS0uNTg2LjcuNyAwIDAgMC0uMjQyLS41NDUuODYuODYgMCAwIDAtLjU5OC0uMjE3Ljg0Ljg0IDAgMCAwLS41OTguMjI3Ljc4Ljc4IDAgMCAwLS4xNzguODc0LjguOCAwIDAgMCAuMTc4LjI1OC44NC44NCAwIDAgMCAuNTk4LjIyN3ptMjAuNjc2IDBhLjgyLjgyIDAgMCAwIC42MDQtLjIzNS44LjggMCAwIDAgLjIzNS0uNTg2LjcuNyAwIDAgMC0uMjQyLS41NDUuODYuODYgMCAwIDAtLjU5OC0uMjE3Ljg0Ljg0IDAgMCAwLS41OTguMjI3Ljc4Ljc4IDAgMCAwIDAgMS4xMzIuODQuODQgMCAwIDAgLjU5OC4yMjd6bTkuMjM2IDBhLjgyLjgyIDAgMCAwIC42MDQtLjIzNS44LjggMCAwIDAgLjIzNC0uNTg2LjcuNyAwIDAgMC0uMjQxLS41NDUuODYuODYgMCAwIDAtLjU5OC0uMjE3Ljg0Ljg0IDAgMCAwLS41OTguMjI3Ljc4Ljc4IDAgMCAwIDAgMS4xMzIuODQuODQgMCAwIDAgLjU5OC4yMjd6TTM2LjEzNiA5LjkxNmMuNDE2LjAwNy44My0uMDUzIDEuMjI3LS4xNzdhMi41IDIuNSAwIDAgMCAuODg5LS40OTggMi4xNCAyLjE0IDAgMCAwIC41NDQtLjc2MiAyLjUgMi41IDAgMCAwIC4xODQtLjk3NCAyLjYgMi42IDAgMCAwLS4xNy0uOTY4IDEuOSAxLjkgMCAwIDAtLjUyNS0uNzQ1IDIuNCAyLjQgMCAwIDAtLjg4Ni0uNDc3IDQuMiA0LjIgMCAwIDAtMS4yNTgtLjE3aC0yLjI3OXY3LjU3NGgxLjA4N1Y5LjkxNnptLTEuMTg3LTMuOTE0aDEuMTg4Yy4yNjEtLjAwNS41MjIuMDMuNzczLjEwMy4yMDIuMDU5LjM4OS4xNi41NDkuMjk4LjE0NS4xMjguMjU3LjI4OS4zMjcuNDY5LjA3NS4yMDIuMTEyLjQxNi4xMDguNjMuMDAxLjIxNi0uMDM5LjQyOS0uMTE3LjYzYTEuMyAxLjMgMCAwIDEtLjMzNi40ODdjLS4xNi4xNDItLjM0OC4yNS0uNTUxLjMxNy0uMjQ0LjA4LS41LjEyLS43NTcuMTE3aC0xLjE4NHptNS45OTMgMS40N2MtLjMwOC4xMi0uNTg2LjMxLS44MTMuNTUtLjIzLjI1LS40MDYuNTQ2LS41MTUuODY4YTMuNzQgMy43NCAwIDAgMCAwIDIuMjg4Yy4xMS4zMjMuMjg0LjYxOS41MTUuODcuMjI3LjI0Mi41MDQuNDMuODEzLjU1MWEzLjA1IDMuMDUgMCAwIDAgMi4xMzQgMGMuMzA2LS4xMjIuNTgyLS4zMS44MDctLjU1YTIuNSAyLjUgMCAwIDAgLjUxMi0uODcxIDMuNzQgMy43NCAwIDAgMCAwLTIuMjg4IDIuNSAyLjUgMCAwIDAtLjUxMi0uODY4IDIuMiAyLjIgMCAwIDAtLjgwNy0uNTUgMy4wNSAzLjA1IDAgMCAwLTIuMTM0IDBtLS4wOTUgNC4wMjNhMi40IDIuNCAwIDAgMS0uMzgzLTEuNDU3IDIuNDMgMi40MyAwIDAgMSAuMzgzLTEuNDU2IDEuMzUgMS4zNSAwIDAgMSAxLjE2My0uNTIyIDEuMzMgMS4zMyAwIDAgMSAxLjE1LjUyMmMuMjc3LjQzMy40MS45NDMuMzggMS40NTZhMi40MyAyLjQzIDAgMCAxLS4zOCAxLjQ1NyAxLjM0IDEuMzQgMCAwIDEtMS4xNS41MTcgMS4zNSAxLjM1IDAgMCAxLTEuMTYzLS41MTdtNS45NjUgMS4yMjRoLjc1NWEuMjM1LjIzNSAwIDAgMCAuMjI4LS4xOWwxLjE2NS0zLjUzMXEuMDQxLS4xMjUuMDY4LS4yNTRsLjA1My0uMjU2cS4wMjcuMTI3LjA1OS4yNTNjLjAzMi4xMjYuMDQ1LjE2OC4wNzIuMjUybDEuMTQ2IDMuNTM2YS4yMS4yMSAwIDAgMCAuMi4xOWguNzkybDEuNzMxLTUuMzU2aC0uNzU1YS4zLjMgMCAwIDAtLjI5LjJsLTEuMDAzIDMuMzRhOSA5IDAgMCAwLS4xNjQuNzU2IDEzIDEzIDAgMCAwLS4xOTYtLjc1NEw0OS42IDcuNTQzYS4yNy4yNyAwIDAgMC0uMS0uMTQuMy4zIDAgMCAwLS4xODMtLjA1NWgtLjQzYS4yNzUuMjc1IDAgMCAwLS4yNzUuMTk1bC0xLjA4NyAzLjM2LS4xMTIuMzg2cS0uMDUyLjE4NS0uMS4zN2ExMyAxMyAwIDAgMC0uMTUzLS43NTRsLS45ODYtMy4zNDFhLjMuMyAwIDAgMC0uMTAzLS4xNDIuMzIuMzIgMCAwIDAtLjE5OS0uMDU5aC0uNzl6bTguMjQtNS4yMzVjLS4zLjEzLS41Ny4zMjEtLjc5MS41NjJhMi41IDIuNSAwIDAgMC0uNDk5Ljg0IDMgMyAwIDAgMC0uMTc0IDEuMDQyYy0uMDA4LjQxOS4wNTcuODM2LjE5MiAxLjIzMi4xMTQuMzMzLjI5Ny42NC41MzYuODk4LjIzLjI0LjUxLjQyOS44Mi41NDhhMi44IDIuOCAwIDAgMCAxLjAyNy4xODhxLjI5NCAwIC41ODYtLjA0Ny4yOTctLjA0Ni41NzgtLjE1YTIuNyAyLjcgMCAwIDAgLjUyMy0uMjU4cS4yNDMtLjE1NS40MjctLjM3OGwtLjI4NS0uMzYzYS4yLjIgMCAwIDAtLjE4NC0uMDk1LjQ0LjQ0IDAgMCAwLS4yMjIuMDggNSA1IDAgMCAxLS4zMDguMTc0cS0uMjEuMTA2LS40MzMuMTc1YTIgMiAwIDAgMS0uNTk5LjA3OSAxLjggMS44IDAgMCAxLS42Ny0uMTE4IDEuMyAxLjMgMCAwIDEtLjUxNi0uMzU4IDEuNyAxLjcgMCAwIDEtLjMzNy0uNjA0IDMgMyAwIDAgMS0uMTQtLjg1NWgzLjUzNmEuMi4yIDAgMCAwIC4xODctLjA3OS42NS42NSAwIDAgMCAuMDUtLjMxMiAyLjkgMi45IDAgMCAwLS4xNjgtMS4wMjEgMi4wNCAyLjA0IDAgMCAwLTEuMTgyLTEuMjIgMi41IDIuNSAwIDAgMC0uODk3LS4xNjIgMi42IDIuNiAwIDAgMC0xLjA1Ny4yMDJtMS42MzQuNjM2YTEuMjEgMS4yMSAwIDAgMSAuNjgxLjc1MXEuMDk0LjI4Ni4wOS41ODdoLTIuODQ2YTEuODIgMS44MiAwIDAgMSAuNDctMS4wNTYgMS41OCAxLjU4IDAgMCAxIDEuNjA1LS4yODJtMy43OTQgNC41OTlWOS4zNThxLjA5MS0uMjQzLjIyLS40Ny4xMS0uMTk1LjI3NC0uMzQ5LjE1Mi0uMTQxLjM0Ni0uMjE1Yy4xNDEtLjA1Mi4yOTEtLjA3Ny40NDEtLjA3NHEuMTYxLS4wMDEuMzE5LjAzMS4xMDguMDI3LjIyLjAzMmEuMTYuMTYgMCAwIDAgLjE2OC0uMTQybC4wNy0uNzVhLjguOCAwIDAgMC0uMjczLS4xMTYgMS40IDEuNCAwIDAgMC0uMzMtLjAzOCAxLjM1IDEuMzUgMCAwIDAtLjg4Ni4zMDYgMi40IDIuNCAwIDAgMC0uNjIyLjgzOWwtLjA2NC0uNzgxYS4zNi4zNiAwIDAgMC0uMDgyLS4yMTEuMzMuMzMgMCAwIDAtLjIyNC0uMDZoLS41NzR2NS4zNTloMS4wMDJ6bTMuNzk4LTUuMjM1Yy0uMy4xMy0uNTcuMzIxLS43OTIuNTYyYTIuNSAyLjUgMCAwIDAtLjQ5OC44NCAzIDMgMCAwIDAtLjE3NSAxLjA0MiAzLjYgMy42IDAgMCAwIC4xOTIgMS4yMzJjLjExNC4zMzMuMjk3LjY0LjUzNi44OTguMjMuMjQuNTEuNDI5LjgyMS41NDhhMi44IDIuOCAwIDAgMCAxLjAyNi4xODhxLjI5NCAwIC41ODYtLjA0Ny4yOTYtLjA0Ni41NzgtLjE1YTIuNyAyLjcgMCAwIDAgLjUyMy0uMjU4IDEuOSAxLjkgMCAwIDAgLjQyNy0uMzc4bC0uMjg1LS4zNjNhLjIuMiAwIDAgMC0uMTg0LS4wOTUuNDQuNDQgMCAwIDAtLjIyMS4wOCA1IDUgMCAwIDEtLjMwOS4xNzRxLS4yMS4xMDYtLjQzMi4xNzVhMiAyIDAgMCAxLS42LjA3OSAxLjggMS44IDAgMCAxLS42Ny0uMTE4IDEuMyAxLjMgMCAwIDEtLjUxNS0uMzU4IDEuNyAxLjcgMCAwIDEtLjMzOC0uNjA0IDMgMyAwIDAgMS0uMTQtLjg1NWgzLjUzNmEuMi4yIDAgMCAwIC4xODgtLjA3OWMuMDQtLjEuMDU2LS4yMDguMDQ0LS4zMTVhMi45IDIuOSAwIDAgMC0uMTY5LTEuMDIyIDIuMSAyLjEgMCAwIDAtLjQ2OS0uNzUxIDIgMiAwIDAgMC0uNzEzLS40NyAyLjUgMi41IDAgMCAwLS44OTctLjE2IDIuNiAyLjYgMCAwIDAtMS4wNTMuMjA1em0xLjYzMy42MzZhMS4yIDEuMiAwIDAgMSAuNjgxLjc1MXEuMDk0LjI4Ni4wOS41ODdoLTIuODQ3YTEuODIgMS44MiAwIDAgMSAuNDctMS4wNTYgMS41OCAxLjU4IDAgMCAxIDEuNjA0LS4yODJ6bTcuMjU5IDQuNTk5VjQuOTM2aC0xLjAwM1Y3Ljg4YTEuODMgMS44MyAwIDAgMC0xLjQ0Ni0uNjEyIDIuMSAyLjEgMCAwIDAtLjk2NS4yMTRjLS4yODIuMTQtLjUzLjM0LS43MjguNTg2YTIuNyAyLjcgMCAwIDAtLjQ1OS44ODQgMy43IDMuNyAwIDAgMC0uMTU4IDEuMTA2Yy0uMDA2LjM5Ni4wNDIuNzkuMTQyIDEuMTczLjA4LjMwOS4yMi42LjQxLjg1Ny4xNjYuMjI0LjM4NS40MDQuNjM3LjUyNS4yNi4xMjEuNTQ0LjE4MS44MzIuMTc3cS4yNy4wMDUuNTMyLS4wNi4yNDUtLjA2LjQ3LS4xODEuMjIyLS4xMi40MTUtLjI4NS4xOTgtLjE3LjM2NS0uMzcybC4wOS42MjlhLjI0Ni4yNDYgMCAwIDAgLjI2My4yaC42MDN6bS0yLjk2Ni0uODQyYTEgMSAwIDAgMS0uNDExLS4zNDQgMS43IDEuNyAwIDAgMS0uMjYtLjU5OSAzLjcgMy43IDAgMCAxLS4wODktLjg3NiAyLjQ2IDIuNDYgMCAwIDEgLjM5LTEuNDk5IDEuMyAxLjMgMCAwIDEgMS4xMTUtLjUyIDEuNiAxLjYgMCAwIDEgLjY2NS4xMzZjLjIyMi4xMDcuNDEzLjI2OC41NTQuNDY5djIuNTYyYTIuMiAyLjIgMCAwIDEtLjYyMi41NzggMS41IDEuNSAwIDAgMS0uNzg3LjIwMyAxLjM1IDEuMzUgMCAwIDEtLjU1NS0uMTFtNy43NDcuODQyYS4yMzQuMjM0IDAgMCAwIC4yNTMtLjIxMWwuMDQ4LS40NmMuMTcuMjIzLjM4MS40MS42MjUuNTQ3LjI3My4xNC41NzcuMjA5Ljg4NC4xOThhMi4wNiAyLjA2IDAgMCAwIDEuNjgyLS43OTVjLjIwOS0uMjczLjM2NS0uNTgyLjQ2LS45MTMuMTEtLjM4NC4xNjUtLjc4Mi4xNi0xLjE4MmE0IDQgMCAwIDAtLjE0LTEuMDk1IDIuNCAyLjQgMCAwIDAtLjQwMy0uODIgMS44IDEuOCAwIDAgMC0uNjQxLS41MiAxLjkgMS45IDAgMCAwLS44NDctLjE4MiAyIDIgMCAwIDAtLjk2OC4yMjcgMi43IDIuNyAwIDAgMC0uNzU4LjYxMnYtMy4xOWgtMS4wMDR2Ny43ODR6bTIuNzMtNC4xOTJjLjI2My40Mi4zODUuOTEzLjM0NyAxLjQwNy4wNC41NDktLjA5NyAxLjEtLjM5IDEuNTYyYTEuMzMgMS4zMyAwIDAgMS0xLjEyNS41MTcgMS42IDEuNiAwIDAgMS0uNjU1LS4xMzUgMS40NiAxLjQ2IDAgMCAxLS41NTQtLjQ2OVY4Ljg2MWEyLjMgMi4zIDAgMCAxIC42MTItLjU4N2MuMjM1LS4xMzkuNTA1LS4yMS43NzktLjIwMmExLjE3IDEuMTcgMCAwIDEgLjk4Ny40NTVtNy4wNzQtMS4xNjRoLS43OTZhLjMuMyAwIDAgMC0uMjkuMmwtMS4zNCAzLjI2MnEtLjA0OC4xMTctLjA5LjI0NWwtLjA3OS4yNDVhNCA0IDAgMCAwLS4xNDItLjQ4bC0xLjM4Ny0zLjI3MmEuMy4zIDAgMCAwLS4zMDEtLjJoLS44NzNsMi4yMDUgNS4wMjktLjk4MiAyLjEyNmguNzQ3YS4zNS4zNSAwIDAgMCAuMjI4LS4wNjEuNDQuNDQgMCAwIDAgLjExNy0uMTc3eiIvPgoJPHBhdGggZmlsbD0idXJsKCNwKSIgZD0iTTguMjg0IDYuMTE2QTQuNTUgNC41NSAwIDAgMCA5LjYxIDkuMjRhMy41IDMuNSAwIDAgMCAyLjMxNC45MjMgMS4wNyAxLjA3IDAgMCAwIC43MzYtLjMzIDMuNTEgMy41MSAwIDAgMCAuODIxLTMuMzczYy0uNjIzLTIuMTYtMi4zNS0zLjM1LTQuNDU3LTQuMzg0YTkuNCA5LjQgMCAwIDAtLjc0MSA0LjAzOHoiIG9wYWNpdHk9Ii42NSIvPgoJPHBhdGggZmlsbD0idXJsKCNpKSIgZD0iTTUuMTU1IDkuMjVhNC41IDQuNSAwIDAgMCAyLjQyMiAyLjM3NGMuODA2LjI5MyAxLjY5LjI4IDIuNDg4LS4wMzcuMjU0LS4xMTcuNDUyLS4zMjcuNTU1LS41ODZhMy41MSAzLjUxIDAgMCAwLS41Mi0zLjQzYy0xLjQxLTEuNzUtMy40NS0yLjE5LTUuNzk1LTIuMzM1YTkuNCA5LjQgMCAwIDAgLjg1IDQuMDEzIiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjaCkiIGQ9Ik0zLjQ2NSAxMy4zNDVhNC40OCA0LjQ4IDAgMCAwIDMuMTQzIDEuMjYyIDMuNSAzLjUgMCAwIDAgMi4yODYtLjk5IDEuMSAxLjEgMCAwIDAgLjI4OC0uNzU2QTMuNTIgMy41MiAwIDAgMCA3LjM5IDkuODljLTEuOTYtMS4wOC00LjAyLS43MDUtNi4yNDMuMDdhOS40IDkuNCAwIDAgMCAyLjMxOCAzLjM4NCIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2cpIiBkPSJNMy40NjIgMTcuNzgxYzEuMDkuNDI5IDIuMy40MTQgMy4zODMtLjA0MWEzLjUyIDMuNTIgMCAwIDAgMS43MzQtMS43OTMgMS4xIDEuMSAwIDAgMC0uMDItLjgxIDMuNDkgMy40OSAwIDAgMC0yLjc4Ni0yLjA1NGMtMi4yMzEtLjIzNi0zLjk4MS44OTctNS43NDcgMi40NjJhOS40IDkuNCAwIDAgMCAzLjQzNiAyLjIzNiIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2YpIiBkPSJNNS4xNDggMjEuODc3YTQuNSA0LjUgMCAwIDAgMy4xMS0xLjMzOCAzLjUzIDMuNTMgMCAwIDAgLjkyLTIuMzIzIDEuMSAxLjEgMCAwIDAtLjMyOC0uNzQgMy40OCAzLjQ4IDAgMCAwLTMuMzU3LS44MjhjLTIuMTUuNjMzLTMuMzQgMi4zNi00LjM2NSA0LjQ4NGE5LjMgOS4zIDAgMCAwIDQuMDIuNzQ1IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjZSkiIGQ9Ik04LjI2NyAyNS4wMTlhNC41IDQuNSAwIDAgMCAyLjM2NC0yLjQzOGMuMjkyLS44MS4yOC0xLjctLjAzNi0yLjVhMS4wOCAxLjA4IDAgMCAwLS41ODYtLjU1OCAzLjQ5IDMuNDkgMCAwIDAtMy40MTcuNTI2Yy0xLjc0IDEuNDEtMi4xOCAzLjQ2LTIuMzI1IDUuODIxYTkuMyA5LjMgMCAwIDAgNC0uODUxIiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjZCkiIGQ9Ik0xMi4zNDUgMjYuNzJhNC41MyA0LjUzIDAgMCAwIDEuMjU0LTMuMTU3IDMuNTMgMy41MyAwIDAgMC0uOTg3LTIuMjk2IDEuMDggMS4wOCAwIDAgMC0uNzUyLS4yOSAzLjQ5IDMuNDkgMCAwIDAtMi45NTIgMS44Yy0xLjA3IDEuOTctLjY5NyA0LjA0LjA3IDYuMjdhOS4zIDkuMyAwIDAgMCAzLjM2Ny0yLjMyNyIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2MpIiBkPSJNMTYuNzY0IDI2LjcyNGMuNDI3LTEuMS40MTItMi4zMi0uMDQxLTMuNGEzLjUyIDMuNTIgMCAwIDAtMS43ODUtMS43NDMgMS4wOCAxLjA4IDAgMCAwLS44MDYuMDJjLS41NTQuMjUtMS4wMy42MzktMS4zOTIgMS4xM3MtLjU4NCAxLjA3LS42NTQgMS42N2MtLjIzNCAyLjI0Ljg5NSA0IDIuNDU1IDUuNzY3YTkuMzUgOS4zNSAwIDAgMCAyLjIyMy0zLjQ0NCIgb3BhY2l0eT0iLjY1Ii8+Cgk8cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMjAuODQgMjUuMDMxYy0uMDIyLTEuMTgtLjUtMi4zLTEuMzMyLTMuMTI1YTMuNSAzLjUgMCAwIDAtMi4zMTQtLjkyNCAxLjA3IDEuMDcgMCAwIDAtLjczNi4zMyAzLjUxIDMuNTEgMCAwIDAtLjgyMSAzLjM3MmMuNjMgMi4xNiAyLjM1IDMuMzUgNC40NjQgNC4zODRhOS40IDkuNCAwIDAgMCAuNzM5LTQuMDM3IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Ik0yMy45NjYgMjEuODk3YTQuNSA0LjUgMCAwIDAtMi40MjEtMi4zNzUgMy41IDMuNSAwIDAgMC0yLjQ4OS4wMzcgMS4wOCAxLjA4IDAgMCAwLS41NTUuNTg2IDMuNTEgMy41MSAwIDAgMCAuNTI1IDMuNDMyYzEuNDEgMS43NSAzLjQ1IDIuMTkgNS43OTUgMi4zMzVhOS40IDkuNCAwIDAgMC0uODU1LTQuMDE1IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbykiIGQ9Ik0yNS42NTkgMTcuODAxYTQuNDggNC40OCAwIDAgMC0zLjE0Mi0xLjI2M2MtLjg1Ny4wNC0xLjY3LjM5MS0yLjI4NS45OWExLjEgMS4xIDAgMCAwLS4yODkuNzU2IDMuNTIgMy41MiAwIDAgMCAxLjc5MiAyLjk3YzEuOTYgMS4wOCA0LjAyLjcwNCA2LjI0NC0uMDdhOS40IDkuNCAwIDAgMC0yLjMyLTMuMzgzIiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbikiIGQ9Ik0yNS42NjMgMTMuMzY1YTQuNDggNC40OCAwIDAgMC0zLjM4Ny4wNDEgMy41MiAzLjUyIDAgMCAwLTEuNzM0IDEuNzkzYy0uMDk4LjI2My0uMDkuNTUzLjAyMS44MWEzLjQ5IDMuNDkgMCAwIDAgMi43ODYgMi4wNTZjMi4yMy4yMzQgMy45OC0uOSA1Ljc0Ni0yLjQ2M2E5LjMgOS4zIDAgMCAwLTMuNDMyLTIuMjM3IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbSkiIGQ9Ik0yMy45NzcgOS4yNjZhNC41IDQuNSAwIDAgMC0zLjEwOSAxLjMzOCAzLjUzIDMuNTMgMCAwIDAtLjkyIDIuMzI1Yy4wMTEuMjguMTI5LjU0NS4zMy43NGEzLjQ4IDMuNDggMCAwIDAgMy4zNTcuODI4YzIuMTUtLjYzMyAzLjM0LTIuMzYgNC4zNjQtNC40ODVhOS4zIDkuMyAwIDAgMC00LjAyMi0uNzQ2IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjbCkiIGQ9Ik0yMC44NTggNi4xMjdhNC41MiA0LjUyIDAgMCAwLTIuMzY0IDIuNDMyYy0uMjkyLjgxLS4yNzkgMS43LjAzNiAyLjUuMTE2LjI1Ni4zMjYuNDU2LjU4Ny41NTlhMy40OSAzLjQ5IDAgMCAwIDMuNDE3LS41MjdjMS43NC0xLjQxIDIuMTgtMy40NiAyLjMyNC01LjgyYTkuMyA5LjMgMCAwIDAtNCAuODU2IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjaykiIGQ9Ik0xNi43OCA0LjQyNmE0LjU1IDQuNTUgMCAwIDAtMS4yNTcgMy4xNTdjLjAzOC44Ni4zODggMS42OC45ODUgMi4yOTYuMjA0LjE5LjQ3NC4yOTUuNzUzLjI5YTMuNDkgMy40OSAwIDAgMCAyLjk1Ny0xLjhjMS4wNy0xLjk3LjY5Ni00LjA0LS4wNy02LjI3MmE5LjMgOS4zIDAgMCAwLTMuMzY4IDIuMzI5IiBvcGFjaXR5PSIuNjUiLz4KCTxwYXRoIGZpbGw9InVybCgjaikiIGQ9Ik0xMi4zNjQgNC40MjJhNC41NSA0LjU1IDAgMCAwIC4wNDEgMy40MDEgMy41IDMuNSAwIDAgMCAxLjc4NSAxLjc0MWMuMjYuMDk4LjU1LjA5LjgwNS0uMDJhMy41NCAzLjU0IDAgMCAwIDEuMzkzLTEuMTNjLjM2LS40OS41ODQtMS4wNy42NTQtMS42Ny4yMzUtMi4yNC0uODk1LTQtMi40NTUtNS43NjdhOS4zNSA5LjM1IDAgMCAwLTIuMjIzIDMuNDQ1IiBvcGFjaXR5PSIuNjUiLz4KCTxkZWZzPgoJCTxsaW5lYXJHcmFkaWVudCBpZD0icCIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMjEiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJoIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImciIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iZiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIxIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9Im8iIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0ibiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPGxpbmVhckdyYWRpZW50IGlkPSJtIiB4MT0iLTIuMzUiIHgyPSIyOS4zMTIiIHkxPSIzMC4zMiIgeTI9IjEuMDA0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJCTxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBBMDBCMiIvPgoJCQk8c3RvcCBvZmZzZXQ9Ii41IiBzdG9wLWNvbG9yPSJyZWQiLz4KCQkJPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZGQzAwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSItMi4zNSIgeDI9IjI5LjMxMiIgeTE9IjMwLjMyIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iayIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIxIiB5Mj0iMS4wMDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQkJPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMEEwMEIyIi8+CgkJCTxzdG9wIG9mZnNldD0iLjUiIHN0b3AtY29sb3I9InJlZCIvPgoJCQk8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkZDMDAiLz4KCQk8L2xpbmVhckdyYWRpZW50PgoJCTxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9Ii0yLjM1IiB4Mj0iMjkuMzEyIiB5MT0iMzAuMzIiIHkyPSIxLjAwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCQk8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMwQTAwQjIiLz4KCQkJPHN0b3Agb2Zmc2V0PSIuNSIgc3RvcC1jb2xvcj0icmVkIi8+CgkJCTxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0ZGRkMwMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+Cgk8L2RlZnM+Cjwvc3ZnPgo=";
            poweredImage.alt = 'Powered by MediaWiki';
            poweredImage.width = 132; poweredImage.height = 46;
            poweredLink.replaceChildren(poweredImage);
        }
    }
});

});

/* Staff content classification: persisted as dedicated hidden categories. */
(function () {
    'use strict';
    if (mw.config.get('wgNamespaceNumber') !== 0 || mw.config.get('wgAction') !== 'view') { return; }
    var heading = document.getElementById('firstHeading');
    if (!heading || document.getElementById('gd-content-status')) { return; }
    var selectedLanguage = /(?:^|;\s*)gdwiki-language=(eng|spa|rus|pol)(?:;|$)/.exec(document.cookie);
    var spanish = selectedLanguage ? selectedLanguage[1] === 'spa' : (mw.config.get('wgExpandedActiveLanguage') === 'spa' || mw.config.get('wgUserLanguage') === 'es');
    var labels = {"community content (undeveloped/unreviewed)": "contenido de la comunidad (sin desarrollar/sin revisar)", "community content": "contenido de la comunidad", "base content": "contenido base", "Change content classification": "Cambiar la clasificación del contenido", "Content classification": "Clasificación del contenido", "Cancel": "Cancelar", "Saving...": "Guardando…", "Classification changed in this draft. Save changes to publish it.": "La clasificación se ha cambiado en este borrador. Guarda los cambios para publicarla.", "Could not change classification in this draft. No changes were published.": "No se pudo cambiar la clasificación del borrador. No se ha publicado ningún cambio.", "Content classification saved.": "Clasificación del contenido guardada.", "Could not save. Reload the page and try again.": "No se pudo guardar. Recarga la página e inténtalo de nuevo."};
    function tr(text) {return spanish ? (labels[text] || text) : text;}
    var states = [
        {key: 'pending', label: tr('community content (undeveloped/unreviewed)'), category: 'Wiki content status - pending review'},
        {key: 'reviewed', label: tr('community content'), category: 'Wiki content status - reviewed community'},
        {key: 'base', label: tr('base content'), category: 'Wiki content status - base'}
    ];
    var categories = mw.config.get('wgCategories') || [];
    var selected = states.filter(function (state) { return categories.indexOf(state.category) !== -1; })[0];
    if (!selected) {
        selected = categories.some(function (name) { return /\(base content\)$/i.test(name); }) ? states[2] : states[0];
    }
    var staff = (mw.config.get('wgUserGroups') || []).some(function (group) {
        return ['sysop', 'bureaucrat'].indexOf(group) !== -1;
    });
    var badge = document.createElement(staff ? 'button' : 'span');
    badge.id = 'gd-content-status';
    badge.className = 'gd-content-status';
    badge.textContent = selected.label;
    badge.dataset.status = selected.key;
    if (staff) {
        badge.type = 'button';
        badge.setAttribute('aria-haspopup', 'dialog');
        badge.setAttribute('aria-expanded', 'false');
        badge.title = tr('Change content classification');
    }
    heading.appendChild(badge);
    document.documentElement.classList.add('gd-content-status-ready');
    // Non-staff badges have no click handler or interactive controls.
    if (!staff) { return; }
    var panel;
    badge.addEventListener('click', function () {
        if (panel) { close(); return; }
        panel = document.createElement('div');
        panel.className = 'gd-content-status-menu';
        panel.setAttribute('role', 'dialog');
        panel.setAttribute('aria-label', tr('Content classification'));
        var title = document.createElement('strong');
        title.textContent = tr('Content classification');
        panel.appendChild(title);
        states.forEach(function (state) {
            var button = document.createElement('button');
            button.type = 'button';
            button.textContent = state.label;
            button.disabled = state.key === selected.key;
            button.addEventListener('click', function () { save(state); });
            panel.appendChild(button);
        });
        var cancel = document.createElement('button');
        cancel.type = 'button'; cancel.textContent = tr('Cancel');
        cancel.addEventListener('click', close); panel.appendChild(cancel);
        document.body.appendChild(panel);
        var rect = badge.getBoundingClientRect();
        panel.style.left = Math.max(8, Math.min(rect.left, window.innerWidth - panel.offsetWidth - 8)) + 'px';
        panel.style.top = Math.max(8, Math.min(rect.bottom + 8, window.innerHeight - panel.offsetHeight - 8)) + 'px';
        badge.setAttribute('aria-expanded', 'true');
        panel.addEventListener('keydown', function (event) { if (event.key === 'Escape') { close(); } });
        cancel.focus();
    });
    function close() {
        if (panel) { panel.remove(); panel = null; }
        badge.setAttribute('aria-expanded', 'false'); badge.focus();
    }
    function applyBadge(state) {
        selected = state; badge.textContent = state.label; badge.dataset.status = state.key;
    }
    function replaceStatusCategory(text, state) {
        return text.replace(/\[\[\s*Category\s*:\s*Wiki[ _]content[ _]status[ _]-[ _](?:pending[ _]review|reviewed[ _]community|base)\s*(?:\|[^\]]*)?\]\]/gi, '').replace(/\s+$/, '') + '\n[[Category:' + state.category + ']]\n';
    }
    var publishedState = selected;
    mw.hook('ve.activationComplete').add(function () { publishedState = selected; });
    mw.hook('ve.deactivationComplete').add(function () {
        applyBadge(publishedState); close();
    });
    function save(state) {
        var editorActive = document.documentElement.classList.contains('ve-active');
        var target = window.ve && ve.init && ve.init.target;
        var surface = editorActive && target && target.getSurface && target.getSurface();
        var textbox = document.getElementById('wpTextbox1');
        if (editorActive || textbox) {
            try {
                if (surface && surface.getMode() === 'visual') {
                    var model = surface.getModel();
                    var fragment = model.getFragment();
                    var items = model.getDocument().getMetaList().getItemsInGroup('mwCategory').slice();
                    items.forEach(function (item) {
                        var category = item.getAttribute('category').replace(/_/g, ' ').replace(/^Category:/i, '');
                        if (states.some(function (entry) { return entry.category === category; })) {
                            fragment.removeMeta(item);
                        }
                    });
                    fragment.insertMeta({type: 'mwCategory', attributes: {category: 'Category:' + state.category, sortkey: ''}});
                } else if (surface && surface.getMode() === 'source') {
                    var sourceModel = surface.getModel();
                    var text = sourceModel.getDocument().data.getText(true);
                    sourceModel.getFragment().selectAll().insertContent(replaceStatusCategory(text, state));
                } else if (textbox) {
                    textbox.value = replaceStatusCategory(textbox.value, state);
                    textbox.dispatchEvent(new Event('input', {bubbles: true}));
                    textbox.dispatchEvent(new Event('change', {bubbles: true}));
                } else {
                    throw new Error('Editor is not ready');
                }
                applyBadge(state); close();
                mw.notify(tr('Classification changed in this draft. Save changes to publish it.'));
            } catch (error) {
                mw.notify(tr('Could not change classification in this draft. No changes were published.'), {type: 'error'});
            }
            return;
        }
        var currentPanel = panel;
        Array.prototype.forEach.call(currentPanel.querySelectorAll('button'), function (button) { button.disabled = true; });
        var status = document.createElement('p'); status.setAttribute('role', 'status');
        status.textContent = tr('Saving...'); currentPanel.appendChild(status);
        mw.loader.using('mediawiki.api').then(function () {
            var api = new mw.Api();
            return api.get({action: 'query', prop: 'revisions', rvprop: 'ids|timestamp|content', rvslots: 'main',
                titles: mw.config.get('wgPageName'), curtimestamp: 1, formatversion: 2}).then(function (data) {
                var page = data.query.pages[0];
                if (page.missing || !page.revisions) { throw new Error('Page could not be read.'); }
                var revision = page.revisions[0];
                var text = revision.slots.main.content;
                text = text.replace(/\[\[\s*Category\s*:\s*Wiki[ _]content[ _]status[ _]-[ _](?:pending[ _]review|reviewed[ _]community|base)\s*(?:\|[^\]]*)?\]\]/gi, '');
                text = text.replace(/\s+$/, '') + '\n[[Category:' + state.category + ']]\n';
                return api.postWithEditToken({action: 'edit', title: page.title, text: text,
                    baserevid: revision.revid, basetimestamp: revision.timestamp, starttimestamp: data.curtimestamp,
                    nocreate: 1, assertuser: mw.config.get('wgUserName'), watchlist: 'nochange',
                    summary: 'Set content classification: ' + state.label}).then(function () {
                        selected = state; badge.textContent = state.label; badge.dataset.status = state.key;
                        close(); mw.notify(tr('Content classification saved.'));
                    });
            });
        }).catch(function () {
            if (panel !== currentPanel) { return; }
            status.textContent = tr('Could not save. Reload the page and try again.');
            Array.prototype.forEach.call(currentPanel.querySelectorAll('button'), function (button) {
                button.disabled = button.textContent === selected.label;
            });
        });
    }
}());

/* Expanded Wiki Wraith browser-tab icon. */
(function () {
    document.querySelectorAll('link[rel="icon"], link[rel="shortcut icon"]').forEach(function (link) { link.remove(); });
    var icon = document.createElement('link');
    icon.rel = 'icon';
    icon.type = 'image/x-icon';
    icon.href = "https://geometrydashwiki.com/images/7/74/ExpandedWiki.ico";
    document.head.appendChild(icon);
}());
/* Keep Togglebox click targets attached to their wrapped headings. */
mw.hook('wikipage.content').add(function ($content) {
    mw.loader.using('jquery.makeCollapsible').then(function () {
        $content.find('.tabber.mw-collapsible').each(function () {
            var $box = $(this);
            $box.makeCollapsible();
            var $heading = $box.children('.mw-heading').first();
            var $toggle = $box.children('.mw-collapsible-toggle').first();
            if ($heading.length && $toggle.length) { $heading.append($toggle); }
        });
    });
});

/* Multiple-file uploads on Special:Upload. */
(function () {
    'use strict';
    if (mw.config.get('wgCanonicalSpecialPageName') !== 'Upload') { return; }
    mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
        $(function () {
            var source = document.getElementById('wpUploadFile');
            var form = source && source.closest('form');
            if (!form || document.getElementById('expanded-multiple-upload')) { return; }
            if (new URLSearchParams(location.search).has('wpForReUpload')) { return; }
            var sourceRow = source.closest('tr') || source.parentElement;
            var toggle = document.createElement(sourceRow.tagName === 'TR' ? 'tr' : 'div');
            toggle.id = 'expanded-multiple-upload';
            var label = document.createElement(sourceRow.tagName === 'TR' ? 'td' : 'span');
            label.textContent = 'Upload multiple files: ';
            var controls = document.createElement(sourceRow.tagName === 'TR' ? 'td' : 'span');
            toggle.append(label, controls);
            ['Yes', 'No'].forEach(function (name) {
                var item = document.createElement('label');
                var radio = document.createElement('input');
                radio.type = 'radio'; radio.name = 'expandedMultiple'; radio.value = name;
                radio.checked = name === 'No';
                item.append(radio, document.createTextNode(' ' + name + ' '));
                controls.appendChild(item);
            });
            sourceRow.before(toggle);
            var multi = document.createElement('input');
            multi.type = 'file'; multi.multiple = true; multi.hidden = true;
            multi.setAttribute('aria-label', 'Source filenames');
            source.after(multi);
            var destination = document.getElementById('wpDestFile');
            var destinationRow = destination && (destination.closest('tr') || destination.parentElement);
            var nativeSubmit = form.querySelector('[name="wpUpload"]');
            if (!nativeSubmit) { toggle.remove(); multi.remove(); return; }
            var button = nativeSubmit.cloneNode(true);
            button.id = 'expanded-upload-files'; button.removeAttribute('name');
            if (button.tagName === 'INPUT') { button.value = 'Upload files'; }
            else { button.textContent = 'Upload files'; }
            function setVisible(element, visible) {
                element.hidden = !visible;
                element.style.setProperty('display', visible ? '' : 'none', 'important');
            }
            setVisible(button, false);
            nativeSubmit.after(button);
            var results = document.createElement('div');
            results.setAttribute('aria-live', 'polite'); form.after(results);
            var busy = false;
            controls.addEventListener('change', function () {
                var enabled = controls.querySelector('input:checked').value === 'Yes';
                setVisible(source, !enabled); setVisible(multi, enabled);
                if (destinationRow) { setVisible(destinationRow, !enabled); }
                setVisible(nativeSubmit, !enabled); setVisible(button, enabled);
            });
            form.addEventListener('submit', function (event) {
                if (controls.querySelector('input:checked').value === 'Yes') {
                    event.preventDefault(); button.click();
                }
            });
            window.addEventListener('beforeunload', function (event) {
                if (busy) { event.preventDefault(); event.returnValue = ''; }
            });
            button.addEventListener('click', async function (event) {
                event.preventDefault();
                if (busy) { return; }
                var files = Array.from(multi.files);
                if (!files.length) { mw.notify('Choose at least one file.', {type: 'error'}); return; }
                var license = document.getElementById('wpLicense');
                var option = license && license.options[license.selectedIndex];
                if (!option || !option.value || option.value === '-') {
                    mw.notify('Choose a license before uploading.', {type: 'error'}); return;
                }
                var licenseText = option.title;
                if (!licenseText || licenseText.indexOf('{{') < 0) {
                    if (!/^[\w :.-]+$/.test(option.value)) {
                        mw.notify('Could not read the selected license.', {type: 'error'}); return;
                    }
                    licenseText = '{{' + option.value + '}}';
                }
                var description = document.getElementById('wpUploadDescription');
                var text = (description ? description.value : '') + '\n\n== Licensing ==\n' + licenseText;
                var watch = document.getElementById('wpWatchthis');
                var ignore = document.getElementById('wpIgnoreWarning');
                var params = {text: text, watchlist: watch && watch.checked ? 'watch' : 'nochange',
                    assertuser: mw.config.get('wgUserName')};
                if (ignore && ignore.checked) { params.ignorewarnings = 1; }
                busy = true; button.disabled = true;
                var inputs = Array.from(form.querySelectorAll('input, select, textarea, button'));
                var disabled = inputs.map(function (el) { return el.disabled; });
                inputs.forEach(function (el) { el.disabled = true; });
                results.replaceChildren();
                var status = document.createElement('p'); results.appendChild(status);
                var list = document.createElement('ul'); results.appendChild(list);
                var ready = 0, failed = 0;
                var api = new mw.Api();
                try {
                    for (var i = 0; i < files.length; i++) {
                        var file = files[i];
                        status.textContent = 'Uploading ' + (i + 1) + '/' + files.length + ': ' + file.name;
                        var row = document.createElement('li');
                        row.textContent = file.name + ': uploading…'; list.appendChild(row);
                        try {
                            var data = await new Promise(function (resolve, reject) {
                                api.upload(file, Object.assign({}, params, {filename: file.name}))
                                    .done(resolve).fail(function (code, details) {
                                        reject({code: code, details: details});
                                    });
                            });
                            var upload = data.upload;
                            if (!upload || upload.result !== 'Success') {
                                throw {code: 'upload-warning', details: data};
                            }
                            row.replaceChildren(document.createTextNode('Uploaded: '));
                            var link = document.createElement('a');
                            link.href = mw.util.getUrl('File:' + upload.filename);
                            link.textContent = upload.filename; row.appendChild(link); ready++;
                        } catch (error) {
                            failed++;
                            var details = error.details || {};
                            var warnings = details.upload && details.upload.warnings;
                            var message = details.error && details.error.info;
                            row.textContent = file.name + ': Failed — ' +
                                (warnings ? JSON.stringify(warnings) : message || error.code || 'Upload failed.');
                        }
                    }
                    status.textContent = 'Upload complete: ' + ready + ' uploaded, ' + failed + ' failed.';
                } finally {
                    inputs.forEach(function (el, index) { el.disabled = disabled[index]; });
                    busy = false; button.disabled = false;
                }
            });
        });
    });
}());
/* Use native browser audio controls in infoboxes. */
(function () {
    function nativeInfoboxAudio() {
        document.querySelectorAll('.portable-infobox td[data-source="audio"], .portable-infobox td[data-source="fullaudio"], .expanded-ve-infobox div[data-source="audio"] > .pi-data-value, .expanded-ve-infobox div[data-source="fullaudio"] > .pi-data-value').forEach(function (cell) {
            if (cell.querySelector('audio.expanded-native-audio')) { return; }
            var original = cell.querySelector('audio');
            if (!original) { return; }
            var sources = Array.prototype.slice.call(original.querySelectorAll('source'));
            if (!original.getAttribute('src') && !sources.length) { return; }
            var audio = document.createElement('audio');
            audio.className = 'expanded-native-audio';
            audio.controls = true;
            audio.preload = 'metadata';
            audio.setAttribute('aria-label', (cell.getAttribute('data-source') || cell.parentElement.getAttribute('data-source')) === 'fullaudio' ? 'Full audio' : 'Audio');
            if (original.getAttribute('src')) { audio.src = original.getAttribute('src'); }
            sources.forEach(function (source) {
                var copy = document.createElement('source');
                copy.src = source.getAttribute('src');
                if (source.getAttribute('type')) { copy.type = source.getAttribute('type'); }
                audio.appendChild(copy);
            });
            original.pause();
            cell.replaceChildren(audio);
        });
    }
    mw.hook('wikipage.content').add(nativeInfoboxAudio);
    $(function () {
        nativeInfoboxAudio();
        var content = document.getElementById('mw-content-text');
        if (content) {
            new MutationObserver(nativeInfoboxAudio).observe(content, { childList: true, subtree: true });
        }
    });
}());
if (mw.config.get('wgPageName') === 'Main_Page' && mw.config.get('wgAction') === 'view') {
  var mainPageHeading = document.getElementById('firstHeading');
  if (mainPageHeading) { mainPageHeading.style.setProperty('display', 'none', 'important'); }
}

/* Unified recovery shortcut: core drafts and VisualEditor session autosave. */
mw.loader.using(['mediawiki.storage', 'mediawiki.util']).then(function () {
$(function () {
    'use strict';
    var item = mw.util.addPortletLink('p-personal', mw.util.getUrl('Special:EditRecovery'),
        '\u2692', 'pt-expanded-edit-recovery', 'Restore unsaved edits');
    if (!item) return;
    var checking = false;
    var panel;
    function visualDraft() {
        try {
            var state = JSON.parse(mw.storage.session.get('ve-docstate'));
            var request = state && state.request;
            if (!request || !request.pageName || !/^(source|visual)$/.test(request.mode)) return null;
            if (!mw.storage.session.get('ve-dochtml')) return null;
            return request;
        } catch (error) { return null; }
    }
    function placeRecovery() {
        var controls = document.querySelector('#p-personal .gd-header-controls');
        if (controls && item.parentNode !== controls) controls.insertBefore(item, controls.firstChild);
    }
    item.querySelector('a').setAttribute('aria-label', 'Edit recovery');
    var personal = document.getElementById('p-personal');
    if (personal) new MutationObserver(placeRecovery).observe(personal, {childList:true, subtree:true});
    placeRecovery();
    function showVisualDraft(draft) {
        if (mw.config.get('wgCanonicalSpecialPageName') !== 'EditRecovery') return;
        if (!panel) {
            panel = document.createElement('section');
            panel.id = 'expanded-visual-edit-recovery';
            panel.style.cssText = 'padding:1rem;margin:1rem 0;border:1px solid currentColor;border-radius:12px;';
            var heading = document.createElement('h2');
            heading.textContent = 'VisualEditor and source-mode drafts';
            panel.appendChild(heading);
            var description = document.createElement('p');
            description.textContent = 'These drafts are kept separately from classic-editor drafts. Reopen the same editor to restore your unsaved changes.';
            panel.appendChild(description);
            var list = document.createElement('ul');
            panel.appendChild(list);
            document.getElementById('mw-content-text').appendChild(panel);
        }
        var list = panel.querySelector('ul');
        list.replaceChildren();
        panel.hidden = !draft;
        if (!draft) return;
        var params = {veaction: draft.mode === 'source' ? 'editsource' : 'edit'};
        if (draft.section !== null && draft.section !== undefined && draft.section !== '') params.section = draft.section;
        var li = document.createElement('li');
        var link = document.createElement('a');
        link.href = mw.util.getUrl(draft.pageName, params);
        link.textContent = draft.pageName.replace(/_/g, ' ') + ' — Recover ' + (draft.mode === 'source' ? 'source-mode' : 'visual') + ' draft';
        // Same-tab navigation preserves VisualEditor's session storage.
        li.appendChild(link);
        list.appendChild(li);
    }
    function coreDrafts() {
        if (!window.indexedDB || !indexedDB.databases) return Promise.resolve([]);
        return indexedDB.databases().then(function (databases) {
            var name = mw.config.get('wgDBname') + '_editRecovery';
            if (!databases.some(function (db) {return db.name === name;})) return [];
            return new Promise(function (resolve) {
                var open = indexedDB.open(name);
                open.onerror = function () { resolve([]); };
                open.onblocked = function () { resolve([]); };
                open.onsuccess = function () {
                    var db = open.result;
                    if (!db.objectStoreNames.contains('unsaved-page-data')) { db.close(); resolve([]); return; }
                    var read = db.transaction('unsaved-page-data', 'readonly').objectStore('unsaved-page-data').getAll();
                    read.onsuccess = function () {
                        var drafts = read.result.filter(function (draft) { return draft.expiry > Date.now() / 1000; });
                        db.close(); resolve(drafts);
                    };
                    read.onerror = function () { db.close(); resolve([]); };
                };
            });
        }).catch(function () { return []; });
    }
    function refresh() {
        if (checking) return;
        checking = true;
        var visual = visualDraft();
        showVisualDraft(visual);
        coreDrafts().then(function (drafts) {
            var count = drafts.length + (visual ? 1 : 0);
            item.hidden = !count;
            item.style.setProperty('display', count ? 'inline-flex' : 'none', 'important');
            item.classList.toggle('expanded-recovery-pending', !!count);
            item.querySelector('a').textContent = '\u2692';
            item.querySelector('a').title = count ? count + ' unsaved draft(s) available for recovery' : 'No unsaved drafts';
            checking = false;
        }, function () { checking = false; });
    }
    item.hidden = true;
    item.style.setProperty('display', 'none', 'important');
    refresh();
    // Autosave writes do not emit storage events in the tab that made them.
    setInterval(function () { if (!document.hidden) refresh(); }, 3000);
    window.addEventListener('focus', refresh);
    window.addEventListener('storage', refresh);
    document.addEventListener('visibilitychange', refresh);
});

});

/* Accurate article totals. */
$(function () {
    var counter = document.querySelector('.expanded-article-count a');
    if (!counter) { return; }
    mw.loader.using('mediawiki.api').then(function () {
        var api = new mw.Api(), count = 0;
        function next(continuation) {
            return api.get(Object.assign({action: 'query', list: 'allpages', apnamespace: 0,
                apfilterredir: 'nonredirects', aplimit: 'max', formatversion: 2}, continuation || {}))
                .then(function (data) {
                    count += data.query.allpages.length;
                    if (data.continue) { return next(data.continue); }
                    counter.textContent = count.toLocaleString();
                    counter.title = 'Non-redirect article pages in the main namespace';
                });
        }
        next().catch(function () {});
    });
});

/* Public account information on user pages; labels support English, Spanish and Russian. */
$(function () {
    if (mw.config.get('wgNamespaceNumber') !== 2 || mw.config.get('wgTitle').indexOf('/') !== -1) { return; }
    var target = document.querySelector('#mw-content-text');
    if (!target || document.querySelector('.expanded-user-info')) { return; }
    var language = (mw.config.get('wgUserLanguage') || 'en').split('-')[0];
    var labels = {
        en: ['Member of groups', 'Number of edits', 'Registration time'],
        es: ['Miembro de los grupos', 'Número de ediciones', 'Fecha de registro'],
        ru: ['Группы участника', 'Количество правок', 'Дата регистрации']
    };
    var text = labels[language] || labels.en;
    mw.loader.using('mediawiki.api').then(function () {
        var api = new mw.Api();
        return api.get({action: 'query', list: 'users', ususers: mw.config.get('wgTitle'),
            usprop: 'groups|implicitgroups|registration|editcount', formatversion: 2}).then(function (data) {
            var user = data.query.users[0];
            if (user.missing || user.invalid || !user.userid) { return; }
            var groups = [...new Set((user.groups || []).concat(user.implicitgroups || []))].filter(function (g) { return g !== '*'; });
            return api.get({action: 'query', meta: 'allmessages', ammessages: groups.map(function (g) {return 'group-' + g;}).join('|'),
                amlang: mw.config.get('wgUserLanguage') || 'en', formatversion: 2}).then(function (messages) {
                var groupMessages = {}; messages.query.allmessages.forEach(function (m) { groupMessages[m.name] = m; });
                var names = groups.map(function (g) { var message = groupMessages['group-' + g]; return message && !message.missing ? message.content : g; });
                var card = document.createElement('div'); card.className = 'expanded-user-info';
                function line(label, value) {
                    var row = document.createElement('p'), heading = document.createElement('strong');
                    heading.textContent = label + ': '; row.appendChild(heading); row.appendChild(document.createTextNode(value)); card.appendChild(row);
                }
                var groupText = typeof Intl.ListFormat === 'function' ? new Intl.ListFormat(language, {type: 'conjunction'}).format(names) : names.join(', ');
                line(text[0], groupText);
                var row = document.createElement('p'), heading = document.createElement('strong'), link = document.createElement('a');
                heading.textContent = text[1] + ': '; link.href = mw.util.getUrl('Special:Contributions/' + user.name);
                link.textContent = Number(user.editcount || 0).toLocaleString(language); row.appendChild(heading); row.appendChild(link); card.appendChild(row);
                if (user.registration) {
                    line(text[2], new Intl.DateTimeFormat(language, {year:'numeric', month:'short', day:'numeric', hour:'numeric', minute:'2-digit',timeZone:'UTC',timeZoneName:'short'}).format(new Date(user.registration)));
                }
                target.insertBefore(card, target.firstChild);
            });
        });
    }).catch(function () {});
});
/* Load template UI colours with the editor script while site.styles refreshes. */
(function () {
    if (document.getElementById("gd-ve-template-theme")) return;
    var style = document.createElement("style");
    style.id = "gd-ve-template-theme";
    style.textContent = "\n/* VisualEditor template contexts, insertion, editing and parameter help. */\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-popup {\n background:#98562f; color:#fff; border:3px solid #fff; border-radius:12px;\n box-shadow:inset 0 0 0 2px #171717,0 0 0 2px #171717,0 4px 12px #0006;\n}\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-body,\nhtml.ve-active .ve-ui-mwTransclusionContextItem { background:#98562f; color:#fff; border-radius:9px; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .ve-ui-linearContextItem-head { background:#b17d60; color:#fff; padding:10px 12px; border-radius:9px 9px 0 0; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .ve-ui-linearContextItem-body { padding:10px 12px; color:#fff; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem a { color:#23eeee; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-labelElement-label { color:#fff; }\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-iconElement-icon { background-color:#fff; }\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-anchor:before { border-bottom-color:#fff; border-top-color:#fff; }\nhtml.ve-active .oo-ui-popupWidget:has(.ve-ui-mwTransclusionContextItem) .oo-ui-popupWidget-anchor:after { border-bottom-color:#b17d60; border-top-color:#98562f; }\nhtml.ve-active .oo-ui-window:has(> .oo-ui-window-frame > .ve-ui-mwTemplateDialog) > .oo-ui-window-frame {\n border:3px solid #fff; border-radius:14px; overflow:hidden; box-sizing:border-box;\n box-shadow:0 0 0 3px #171717,0 10px 35px #0008;\n}\nhtml.ve-active .ve-ui-mwTemplateDialog,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-window-body,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-window-foot,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-panelLayout,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-bookletLayout-stackLayout,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTwoPaneTransclusionDialogLayout-stackLayout {\n background:#98562f; color:#fff; font-family:\"Nunito\",Arial,sans-serif;\n}\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-window-head,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-processDialog-navigation { background:#b17d60; color:#fff; border-color:#c99972; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-processDialog-title { color:#fff; font-family:Pusab,\"Nunito\",Arial,sans-serif; text-shadow:1px 1px #111,-1px -1px #111; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTwoPaneTransclusionDialogLayout-outlinePanel,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTwoPaneTransclusionDialogLayout-sidebar-container,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-menuLayout-menu { background:#7c4327; color:#fff; border-color:#c99972; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTransclusionOutlineTemplateWidget,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTransclusionOutlineParameterWidget { background:transparent; color:#fff; border-color:#b77f58; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTransclusionOutlineParameterWidget:hover { background:#98562f; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-optionWidget-selected { background-color:#a56b47; color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-labelElement-label,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwParameterPage-label,\nhtml.ve-active .ve-ui-mwTemplateDialog h2,\nhtml.ve-active .ve-ui-mwTemplateDialog h3 { color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwParameterPage-undocumentedLabel,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwTemplatePage-description { color:#ffe38b; }\nhtml.ve-active .ve-ui-mwTemplateDialog a { color:#20eeee; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-inputWidget-input { background:#713d24 !important; color:#fff !important; border:1px solid #c99972 !important; border-radius:6px; box-shadow:none; font-family:\"Nunito\",Arial,sans-serif; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-inputWidget-input::placeholder { color:#dfc6b8 !important; opacity:1; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-inputWidget-input:focus { border-color:#ffcc00 !important; outline:2px solid #ffcc00; outline-offset:1px; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-iconElement-icon,\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-indicatorElement-indicator { background-color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-checkboxInputWidget input + span { border-color:#fff; background:#713d24; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-checkboxInputWidget input:checked + span { background:#86c914; border-color:#a6e334; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button,\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {\n background:#12d9df !important; color:#fff !important; border:2px solid #fff !important; border-radius:8px;\n box-shadow:inset 0 0 0 1px #171717,0 0 0 1px #171717; padding:.35rem .8rem;\n}\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-buttonElement-framed .oo-ui-labelElement-label,\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-buttonElement-framed .oo-ui-labelElement-label { color:#fff; font-family:Pusab,\"Nunito\",Arial,sans-serif; text-shadow:1px 1px #111,-1px -1px #111; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-flaggedElement-primary > .oo-ui-buttonElement-button { background:#93dc17 !important; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-processDialog-actions-safe .oo-ui-buttonElement-button { background:#12d9df !important; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-widget-disabled > .oo-ui-buttonElement-button { background:#947560 !important; opacity:.65; cursor:default; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-buttonElement-button:focus-visible,\nhtml.ve-active .ve-ui-mwTransclusionContextItem .oo-ui-buttonElement-button:focus-visible { outline:3px solid #ffcc00; outline-offset:3px; }\nhtml.ve-active .ve-ui-mwTemplateDialog .oo-ui-messageWidget { background:#7c4327; border-color:#c99972; color:#fff; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwFloatingHelpElement .oo-ui-popupWidget-popup,\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwFloatingHelpElement .oo-ui-popupWidget-body { background:#98562f; color:#fff; border-color:#c99972; }\nhtml.ve-active .ve-ui-mwTemplateDialog .ve-ui-mwFloatingHelpElement > .oo-ui-buttonElement > .oo-ui-buttonElement-button { background:#12d9df; color:#fff; border-color:#fff; }\n";
    document.head.appendChild(style);
}());
/* Captioned profile gallery tabs */
(function () {
    'use strict';
    var style = document.createElement('style');
    style.id = 'expanded-profile-gallery-style';
    style.textContent = "#bodyContent .portable-infobox .expanded-profile-gallery {width:100%;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs {display:flex;margin:1rem;border-radius:2rem;overflow:hidden;background:#ca946c;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button {flex:1;min-width:0;padding:.5rem .7rem;border:0;background:transparent;color:white;font:inherit;font-weight:bold;cursor:pointer;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button[aria-selected=\"true\"] {background:#d3a582;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button:focus-visible {outline:2px solid white;outline-offset:-3px;}\n#bodyContent .portable-infobox .expanded-profile-gallery-panel[hidden] {display:none!important;}\n#bodyContent .portable-infobox .expanded-profile-gallery-panel img {display:block;width:100%;height:auto;max-width:100%;border-radius:0;}";
    document.head.appendChild(style);
    var serial = 0;
    function enhance(root) {
        (root || document).querySelectorAll('.portable-infobox .pi-image .gallery').forEach(function (gallery) {
            if (gallery.dataset.profileTabs) return;
            var boxes = Array.from(gallery.querySelectorAll('.gallerybox'));
            if (boxes.length < 2) return;
            gallery.dataset.profileTabs = '1';
            var wrap = document.createElement('div');
            wrap.className = 'expanded-profile-gallery';
            var tabs = document.createElement('div');
            tabs.className = 'expanded-profile-gallery-tabs';
            tabs.setAttribute('role', 'tablist');
            tabs.setAttribute('aria-label', 'Profile images');
            wrap.appendChild(tabs);
            var buttons = [], panels = [];
            function select(index, focus) {
                buttons.forEach(function (button, i) {
                    button.setAttribute('aria-selected', String(i === index));
                    button.tabIndex = i === index ? 0 : -1;
                    panels[i].hidden = i !== index;
                });
                if (focus) buttons[index].focus();
            }
            boxes.forEach(function (box, i) {
                var id = 'expanded-profile-image-' + (++serial);
                var caption = box.querySelector('.gallerytext');
                var button = document.createElement('button');
                button.type = 'button'; button.id = id + '-tab';
                button.textContent = caption && caption.textContent.trim() || 'Image ' + (i + 1);
                button.setAttribute('role', 'tab'); button.setAttribute('aria-controls', id);
                var panel = document.createElement('div');
                panel.id = id; panel.className = 'expanded-profile-gallery-panel';
                panel.setAttribute('role', 'tabpanel'); panel.setAttribute('aria-labelledby', button.id);
                var thumb = box.querySelector('.thumb');
                if (thumb) while (thumb.firstChild) panel.appendChild(thumb.firstChild);
                var image = panel.querySelector('img');
                var link = panel.querySelector('a.mw-file-description');
                if (image && link) {
                    var path = new URL(link.href, location.href).pathname;
                    var file = decodeURIComponent(path).match(/\/File:(.+)$/);
                    if (file) {
                        image.removeAttribute('srcset');
                        image.src = mw.util.getUrl('Special:Redirect/file/' + file[1]);
                    }
                }
                button.addEventListener('click', function () { select(i, false); });
                button.addEventListener('keydown', function (event) {
                    var next;
                    if (event.key === 'ArrowRight') next = (i + 1) % boxes.length;
                    if (event.key === 'ArrowLeft') next = (i + boxes.length - 1) % boxes.length;
                    if (event.key === 'Home') next = 0;
                    if (event.key === 'End') next = boxes.length - 1;
                    if (next !== undefined) { event.preventDefault(); select(next, true); }
                });
                buttons.push(button); panels.push(panel); tabs.appendChild(button); wrap.appendChild(panel);
            });
            select(0, false); gallery.replaceWith(wrap);
        });
    }
    mw.loader.using('mediawiki.util').then(function () {
        enhance(document);
        mw.hook('wikipage.content').add(function (content) { enhance(content[0] || content); });
    });
}());
/* Keep modern gallery styles in sync with site controls. */
(function(){var s=document.createElement("style");s.id="expanded-gallery-consistency";s.textContent="/* Consistent gallery cards across current and legacy MediaWiki gallery markup. */\n#bodyContent .gallery .gallerybox {flex-direction:column;box-sizing:border-box;min-width:0;}\n#bodyContent .gallery .gallerybox > .thumb {display:flex;align-items:center;justify-content:center;flex:1 1 auto;width:100%!important;height:auto!important;border:0;background:none;}\n#bodyContent .gallery .gallerybox > .thumb > span,\n#bodyContent .gallery .gallerybox > .thumb > a {display:block;width:100%;}\n#bodyContent .gallery .gallerybox > .thumb img {width:100%;height:auto;max-width:100%;object-fit:contain;}\n#bodyContent .gallery .gallerybox > .gallerytext,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper .gallerytext {display:block;flex:0 0 auto;width:auto;margin:1rem 0 0;padding:0 1rem;border:0;outline:0;box-shadow:none;border-radius:var(--custom-border-radius-small);line-height:inherit;text-align:center;font-size:.8rem;color:var(--wiki-content-text-color);background:var(--wiki-content-background-color--secondary);}\n#bodyContent .gallery .gallerybox > .gallerytextwrapper {position:static;display:block!important;flex:0 0 auto;width:100%!important;height:auto;max-height:none;margin:0;padding:0;background:none;}\n#bodyContent .gallery .gallerybox > .gallerytext:empty,\n#bodyContent .gallery .gallerybox > .gallerytextwrapper:has(> .gallerytext:empty) {display:none!important;}\n#bodyContent figure[typeof~=\"mw:File/Thumb\"]:has(> figcaption:empty),\n#bodyContent figure[typeof~=\"mw:File/Frame\"]:has(> figcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent figure > figcaption:empty {display:none!important;}\n#bodyContent .thumbinner:has(> .thumbcaption:empty) {padding:0;border:0;outline:0;box-shadow:none;background:transparent;}\n#bodyContent .thumbcaption:empty {display:none!important;}\n#bodyContent figure:has(> figcaption:empty) > a::after {display:none!important;content:none!important;}\n#bodyContent figure:has(> figcaption:empty) img {background:transparent;border:0;border-radius:0;outline:0;box-shadow:none;}\n";document.head.appendChild(s);}());
/* VisualEditor toolbar layout and find panel repair. */
(function(){var s=document.createElement("style");s.id="expanded-editor-toolbar-fix";s.textContent="\n/* Editor toolbar dialogs must span the toolbar, not shrink as flex items. */\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar > .oo-ui-windowManager {flex:0 0 100%!important;width:100%!important;min-width:0;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog {width:100%!important;max-width:100%;box-sizing:border-box;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar > .oo-ui-toolbar-bar {background:#98562f;color:#fff;border:2px solid #fff;border-radius:10px;box-shadow:0 0 0 2px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle {color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-iconElement-icon,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-indicatorElement-indicator {background-color:transparent!important;filter:brightness(0) invert(1);}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-tool-link:hover,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-handle:hover {background:#b17d60;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-popupToolGroup-tools {background:#98562f;color:#fff;border-color:#c99972;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-frame,\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-window-body {background:#98562f;color:#fff;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-inputWidget-input {background:#713d24;color:#fff;border:1px solid #c99972;border-radius:5px;font-family:Nunito,Arial,sans-serif;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-flaggedElement-primary .oo-ui-buttonElement-button {background:#93dc17;color:#fff;border:2px solid #fff;border-radius:7px;box-shadow:inset 0 0 0 1px #171717;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .oo-ui-widget-disabled .oo-ui-buttonElement-button {background:#947560;opacity:.65;}\n\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface {display:block!important;width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-surface > .ve-ce-surface {width:100%!important;min-width:0;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar.ve-ui-toolbar-floating {top:var(--wikigg-header-scroll-height,64px)!important;}\n\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {background:#b17d60;color:#fff;border-color:#c99972;}\nhtml.ve-active body.skin-vector-legacy .ve-ui-toolbar .ve-ui-toolbarDialog .oo-ui-buttonElement-active .oo-ui-buttonElement-button {background:#c27b35;}\n";document.head.appendChild(s);}());
/* Editor checkbox hit targets and discoverable native Find and Replace. */
(function(){
'use strict';
var style=document.createElement('style');style.id='expanded-editor-controls';style.textContent="\n/* Align native checkbox hit targets with their visible squares. */\n.oo-ui-checkboxInputWidget.oo-ui-checkboxInputWidget {position:relative!important;display:inline-block!important;flex:0 0 auto!important;width:1.25rem!important;height:1.25rem!important;min-width:1.25rem!important;min-height:1.25rem!important;box-sizing:border-box;vertical-align:middle;}\n.oo-ui-checkboxInputWidget.oo-ui-checkboxInputWidget input[type=\"checkbox\"] {position:absolute!important;inset:0!important;display:block!important;width:100%!important;height:100%!important;margin:0!important;padding:0!important;opacity:0!important;z-index:2;pointer-events:auto!important;transform:none!important;cursor:pointer;}\n.oo-ui-checkboxInputWidget.oo-ui-checkboxInputWidget input[type=\"checkbox\"] + span {position:absolute!important;inset:0!important;width:100%!important;height:100%!important;margin:0!important;box-sizing:border-box!important;pointer-events:none!important;}\n.ve-ui-toolbar > .oo-ui-toolbar-bar > .oo-ui-windowManager {flex:0 0 100%!important;width:100%!important;min-width:0;box-sizing:border-box;}\n.ve-ui-toolbar .ve-ui-toolbarDialog {width:100%!important;max-width:100%;box-sizing:border-box;}\n.ve-ui-surface {display:block!important;min-width:0;}\n.ve-ui-surface > .ve-ce-surface {width:100%!important;min-width:0;}\n.ve-ui-toolbar.ve-ui-toolbar-floating {top:var(--wikigg-header-scroll-height,64px)!important;}\n.expanded-editor-search-group {display:inline-flex;align-items:center;flex:0 0 auto;margin:.2rem;}\n.expanded-editor-search-group button {padding:.45rem .65rem;border:2px solid #fff;border-radius:7px;background:#12d9df;color:#fff;box-shadow:inset 0 0 0 1px #171717;font:700 14px/1.5 Nunito,Arial,sans-serif;cursor:pointer;white-space:nowrap;}\n.expanded-editor-search-group button:focus-visible {outline:2px solid #ffcc00;outline-offset:2px;}\n.wikiEditor-ui-toolbar .expanded-search-labelled .oo-ui-labelElement-label {display:inline!important;width:auto!important;min-width:0!important;height:auto!important;white-space:nowrap;}\n";document.head.appendChild(style);
function update(){
 document.querySelectorAll('.ve-ui-toolbar').forEach(function(toolbar){
  if(toolbar.querySelector('.expanded-editor-search-group'))return;
  var nativeLink=toolbar.querySelector('.oo-ui-tool-name-findAndReplace .oo-ui-tool-link');
  var tools=toolbar.querySelector(':scope > .oo-ui-toolbar-bar > .oo-ui-toolbar-tools');
  if(!nativeLink||!tools)return;
  var group=document.createElement('div');group.className='expanded-editor-search-group';
  var button=document.createElement('button');button.type='button';button.textContent='Find and replace';button.setAttribute('aria-haspopup','dialog');button.title='Find and replace (Ctrl+F)';
  button.addEventListener('click',function(){var target=window.ve&&ve.init&&ve.init.target;var surface=target&&target.getSurface();if(surface&&surface.executeCommand('findAndReplace'))return;nativeLink.dispatchEvent(new MouseEvent('mousedown',{bubbles:true,button:0,buttons:1}));nativeLink.dispatchEvent(new MouseEvent('mouseup',{bubbles:true,button:0}));});group.appendChild(button);tools.appendChild(group);
 });
 document.querySelectorAll('.wikiEditor-ui-toolbar a[title="Search and replace"]').forEach(function(button){
  if(button.parentElement.classList.contains('expanded-search-labelled'))return;
  var label=button.querySelector('.oo-ui-labelElement-label');if(label){label.textContent='Find and replace';button.parentElement.classList.add('expanded-search-labelled');}
 });
}
var queued=false;new MutationObserver(function(){if(!queued){queued=true;requestAnimationFrame(function(){queued=false;update();});}}).observe(document.body,{childList:true,subtree:true});update();
}());
/* Confirm Escape exits, including unchanged VisualEditor/source sessions. */
(function () {
    'use strict';
    var pending = false;
    function visible(element) {
        var rect = element.getBoundingClientRect();
        var style = getComputedStyle(element);
        return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden';
    }
    function openLayer() {
        return Array.from(document.querySelectorAll('.oo-ui-dialog.oo-ui-window-active.oo-ui-window-ready, .oo-ui-popupToolGroup-active, .oo-ui-popupWidget-popup, .oo-ui-menuSelectWidget:not(.oo-ui-element-hidden), .cm-tooltip-autocomplete, .ui-dialog, [role="dialog"][aria-modal="true"]')).some(visible);
    }
    document.addEventListener('keydown', function (event) {
        if (event.key !== 'Escape' || event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) return;
        if (pending) {
            if (!openLayer()) { event.preventDefault(); event.stopImmediatePropagation(); }
            return;
        }
        if (openLayer()) return;
        var target = window.ve && ve.init && (ve.init.articleTarget || ve.init.target);
        if (!target || !target.active || !document.documentElement.classList.contains('ve-active')) return;
        event.preventDefault();
        event.stopImmediatePropagation();
        pending = true;
        var focus = document.activeElement;
        function finish(accepted) {
            pending = false;
            if (accepted) {
                if (typeof target.tryTeardown === 'function') target.tryTeardown(true, 'escape-confirmed');
                else if (typeof target.deactivate === 'function') target.deactivate(true, 'escape-confirmed');
            } else if (focus && focus.isConnected && typeof focus.focus === 'function') {
                focus.focus({preventScroll:true});
            }
        }
        var answer;
        try {
            answer = OO.ui.confirm('Are you sure you want to exit the editor?', {
                title: 'Exit editor?',
                actions: [
                    {action:'reject', label:'Keep editing', flags:'safe'},
                    {action:'accept', label:'Exit editor', flags:['primary','destructive']}
                ]
            });
        } catch (error) {
            answer = window.confirm('Are you sure you want to exit the editor?');
        }
        Promise.resolve(answer).then(finish, function () { pending = false; });
    }, true);
}());
/* Contain wide comparison tables throughout the wiki. */
(function () {
    'use strict';
    function containTables() {
        document.querySelectorAll('#mw-content-text .mw-parser-output table.wikitable').forEach(function (table) {
            if (table.closest('.portable-infobox, .infobox, .ve-ce-surface, [contenteditable="true"]')) return;
            if (table.parentElement.classList.contains('expanded-wide-table')) return;
            if (table.parentElement.closest('table.wikitable')) return;
            var wrapper = document.createElement('div');
            wrapper.className = 'expanded-wide-table';
            wrapper.style.cssText = 'display:block;width:100%;max-width:100%;min-width:0;overflow-x:auto;box-sizing:border-box;';
            wrapper.tabIndex = 0;
            wrapper.setAttribute('role', 'region');
            wrapper.setAttribute('aria-label', table.caption ? table.caption.textContent.trim() : 'Scrollable comparison table');
            table.parentNode.insertBefore(wrapper, table);
            wrapper.appendChild(table);
        });
    }
    $(containTables);
    mw.hook('wikipage.content').add(containTables);
    var scheduled = false;
    $(function () {
        var root = document.getElementById('mw-content-text');
        if (!root) return;
        new MutationObserver(function () {
            if (scheduled) return;
            scheduled = true;
            requestAnimationFrame(function () { scheduled = false; containTables(); });
        }).observe(root, {childList:true, subtree:true});
    });
}());
/* Editor popup theme: load alongside editor customisations. */
(function(){var s=document.createElement("style");s.id="expanded-editor-popup-theme";s.textContent="\n/* Theme editor popovers as well as modal dialogs; preserve native sizing. */\nhtml.ve-active .oo-ui-popupWidget .oo-ui-popupWidget-popup {\n background:#98562f !important; color:#fff !important;\n border:3px solid #fff !important; border-radius:14px !important;\n outline:3px solid #171717; box-shadow:0 4px 12px #0008 !important;\n font-family:Nunito,Arial,sans-serif;\n}\nhtml.ve-active .oo-ui-popupWidget .oo-ui-popupWidget-body,\nhtml.ve-active .oo-ui-popupWidget .oo-ui-popupWidget-footer { background:#98562f !important; color:#fff !important; }\nhtml.ve-active .oo-ui-popupWidget .oo-ui-popupWidget-head { background:#b17d60 !important; color:#fff !important; border-radius:10px 10px 0 0; }\nhtml.ve-active .oo-ui-popupWidget .oo-ui-popupWidget-body p,\nhtml.ve-active .oo-ui-popupWidget .oo-ui-popupWidget-body li,\nhtml.ve-active .oo-ui-popupWidget .oo-ui-labelElement-label { color:#fff !important; }\nhtml.ve-active .oo-ui-popupWidget a:not(.oo-ui-buttonElement-button) { color:#00ffff !important; }\nhtml.ve-active .oo-ui-popupWidget .oo-ui-iconElement-icon,\nhtml.ve-active .oo-ui-popupWidget .oo-ui-indicatorElement-indicator { background-color:transparent !important; }\nhtml.ve-active .oo-ui-popupToolGroup-tools,\nhtml.ve-active .oo-ui-menuSelectWidget { background:#98562f !important; color:#fff !important; border-color:#fff !important; }\nhtml.ve-active .oo-ui-popupToolGroup-tools .oo-ui-tool-title,\nhtml.ve-active .oo-ui-menuOptionWidget { color:#fff !important; }\nhtml.ve-active .oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,\nhtml.ve-active .oo-ui-popupToolGroup-tools .oo-ui-tool-link:hover,\nhtml.ve-active .ve-ui-toolbar .oo-ui-tool-active > .oo-ui-tool-link { background:#b17d60 !important; color:#fff !important; }\nhtml.ve-active .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:before { border-bottom-color:#fff !important; }\nhtml.ve-active .oo-ui-popupWidget-anchored-top .oo-ui-popupWidget-anchor:after { border-bottom-color:#98562f !important; }\nhtml.ve-active .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:before { border-top-color:#fff !important; }\nhtml.ve-active .oo-ui-popupWidget-anchored-bottom .oo-ui-popupWidget-anchor:after { border-top-color:#98562f !important; }\n";document.head.appendChild(s);}());
/* Header dropdown sizing. */
(function(){var s=document.createElement("style");s.id="expanded-header-dropdown-sizing";s.textContent="\n/* Space the language selector after the logo and match Appearance's 32px height. */\n#p-personal > #gd-language-menu { left:72px !important; top:11px !important; height:32px !important; }\n#p-personal > #gd-language-menu > summary { height:32px !important; min-height:32px !important; box-sizing:border-box; padding-top:0 !important; padding-bottom:0 !important; }\n#p-personal > #gd-language-menu .gd-language-options { top:38px; }\n@media(max-width:720px) {\n #p-personal > #gd-language-menu {left:64px !important;}\n #p-personal > #gd-language-menu > summary {width:auto; min-width:44px;}\n #p-personal > #gd-language-menu .gd-language-options {top:52px;}\n}\n";document.head.appendChild(s);}());
(function(){var s=document.createElement("style");s.id="expanded-mobile-utilities-style";s.textContent="/* Mobile utility menu retains the original preference link and Echo widgets. */\n#gd-mobile-utilities[hidden] {display:none !important;}\n@media(min-width:721px) {#gd-mobile-utilities {display:none !important;}}\n@media(max-width:720px) {\n #p-personal #gd-mobile-utilities {position:relative;flex:0 0 auto;}\n #p-personal #gd-mobile-utilities > summary {display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:40px;height:32px;padding:0;list-style:none;font:700 28px/1 Arial,sans-serif;color:#fff;cursor:pointer;}\n #p-personal #gd-mobile-utilities > summary::after {display:none !important;}\n #p-personal #gd-mobile-utilities > summary::-webkit-details-marker {display:none;}\n #p-personal #gd-mobile-utilities:not([open]) > .gd-mobile-utilities-panel {display:none !important;}\n #p-personal #gd-mobile-utilities > .gd-mobile-utilities-panel {position:fixed;right:8px;top:58px;z-index:1001;display:flex;align-items:center;gap:12px;padding:12px;background:#03052f;border:2px solid #fff;border-radius:12px;box-shadow:0 5px 18px #0008;overflow:visible;}\n #p-personal .gd-mobile-utilities-panel > .gd-header-notification {display:flex !important;float:none;margin:0 !important;}\n #p-personal .gd-mobile-utilities-panel > .gd-header-icon {display:flex !important;align-items:center;justify-content:center;min-width:40px;min-height:40px;}\n #p-personal #gd-mobile-utilities.gd-mobile-utilities-unread > summary::before {content:'';position:absolute;top:3px;right:4px;width:8px;height:8px;background:#ffcf00;border:1px solid #03052f;border-radius:50%;}\n}\n";document.head.appendChild(s);}());
/* Group preferences and the original Echo widgets on narrow screens. */
$(function () {
    'use strict';
    var media = window.matchMedia('(max-width:720px)');
    var menu, panel, summary;
    var moved = [];
    var scheduled = false;
    function update() {
        var controls = document.querySelector('#p-personal .gd-header-controls');
        if (!controls) return;
        if (!media.matches) {
            moved.forEach(function (entry) {
                if (entry.marker.parentNode) entry.marker.parentNode.insertBefore(entry.node, entry.marker);
                entry.marker.remove();
            });
            moved = [];
            if (menu) { menu.open = false; menu.hidden = true; }
            return;
        }
        var candidates = Array.from(controls.children).filter(function (node) {
            return node.matches('a.gd-header-icon') && /Special:(?:Preferences|MyLanguage\/Preferences)/i.test(decodeURIComponent(node.href)) ||
                node.id === 'pt-notifications-alert' || node.id === 'pt-notifications-notice';
        });
        if (!menu && candidates.length) {
            menu = document.createElement('details');
            menu.id = 'gd-mobile-utilities';
            menu.className = 'gd-header-menu';
            summary = document.createElement('summary');
            summary.textContent = '\u22ef';
            summary.title = 'More: preferences and notifications';
            summary.setAttribute('aria-label', 'More: preferences and notifications');
            panel = document.createElement('div');
            panel.className = 'gd-mobile-utilities-panel';
            panel.setAttribute('role', 'group');
            panel.setAttribute('aria-label', 'Preferences and notifications');
            menu.append(summary, panel);
            var account = controls.querySelector('.gd-account-group');
            controls.insertBefore(menu, account || null);
        }
        if (!menu) return;
        candidates.forEach(function (node) {
            var marker = document.createComment('Mobile utility original position');
            node.parentNode.insertBefore(marker, node);
            moved.push({node:node, marker:marker});
            panel.appendChild(node);
        });
        menu.hidden = !moved.length;
        var unread = Array.from(panel.querySelectorAll('[data-counter-num]')).some(function (node) {
            return Number(node.getAttribute('data-counter-num')) > 0;
        });
        menu.classList.toggle('gd-mobile-utilities-unread', unread);
        summary.setAttribute('aria-label', 'More: preferences and notifications' + (unread ? ' (unread notifications)' : ''));
    }
    function schedule() {
        if (scheduled) return;
        scheduled = true;
        requestAnimationFrame(function () { scheduled = false; update(); });
    }
    var personal = document.getElementById('p-personal');
    if (personal) new MutationObserver(schedule).observe(personal, {childList:true, subtree:true, attributes:true, attributeFilter:['data-counter-num']});
    media.addEventListener('change', update);
    document.addEventListener('click', function (event) {
        if (menu && menu.open && !menu.contains(event.target) &&
            !event.target.closest('.mw-echo-ui-overlay, .oo-ui-popupWidget')) menu.open = false;
    });
    document.addEventListener('keydown', function (event) {
        if (event.key === 'Escape' && menu && menu.open) { menu.open = false; summary.focus(); }
    });
    update();
});
(function(){var s=document.createElement("style");s.id="expanded-mobile-header-correction";s.textContent="/* Mobile-only spacing and control resets; desktop is deliberately untouched. */\n@media(max-width:720px) {\n #p-personal { --gd-mobile-control-height:32px; --gd-mobile-control-gap:12px; }\n #p-personal .gd-header-bar-logo {left:12px !important;}\n #p-personal > #gd-language-menu {left:56px !important;top:11px !important;}\n #p-personal .gd-header-controls {gap:var(--gd-mobile-control-gap) !important;max-width:calc(100vw - 112px) !important;}\n #p-personal .gd-header-controls > .gd-header-menu > summary,\n #p-personal .gd-account-menu > summary,\n #p-personal > #gd-language-menu > summary {\n  height:var(--gd-mobile-control-height) !important;min-height:var(--gd-mobile-control-height) !important;\n  max-height:var(--gd-mobile-control-height) !important;box-sizing:border-box;margin:0 !important;\n  padding-top:0 !important;padding-bottom:0 !important;\n }\n #p-personal .gd-header-controls > .gd-header-menu:not(.gd-account-menu):not(#gd-mobile-utilities) > summary {\n  width:auto !important;min-width:32px !important;max-width:none !important;\n  padding-left:8px !important;padding-right:8px !important;font-size:14px !important;gap:6px;\n }\n /* The previous generic mobile rule turned every menu into a moon. */\n #p-personal .gd-header-controls > .gd-header-menu > summary::before {content:none !important;display:none !important;}\n #p-personal #gd-mobile-utilities > summary {width:32px !important;min-width:32px !important;max-width:32px !important;padding:0 !important;font:700 28px/1 Arial,sans-serif !important;}\n #p-personal #gd-mobile-utilities.gd-mobile-utilities-unread > summary::before {content:'' !important;display:block !important;}\n #p-personal .gd-header-controls > *,\n #p-personal .gd-account-group,\n #p-personal .gd-account-talk-link,\n #p-personal .gd-account-menu {border-left:0 !important;border-right:0 !important;}\n #p-personal .gd-account-group {gap:0;}\n #p-personal .gd-account-talk-link {height:32px !important;min-height:32px !important;padding:0 4px !important;}\n #p-personal #gd-mobile-utilities .gd-mobile-utilities-panel {gap:0 !important;}\n #p-personal #gd-mobile-utilities .gd-mobile-utilities-panel > * {border:0 !important;margin:0 !important;padding:0 !important;min-height:40px;box-sizing:content-box;}\n #p-personal #gd-mobile-utilities .gd-mobile-utilities-panel > * + * {border-left:1px solid #ffffff40 !important;margin-left:12px !important;padding-left:12px !important;}\n}\n";document.head.appendChild(s);}());
(function(){var s=document.createElement("style");s.id="expanded-infobox-gallery-fixes";s.textContent="\n/* Keep gallery captions on one line and let longer labels use more space. */\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs {align-items:stretch;overflow-x:auto !important;overflow-y:hidden !important;scrollbar-width:thin;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button {flex:1 0 auto !important;min-width:max-content !important;white-space:nowrap !important;overflow-wrap:normal !important;word-break:normal !important;line-height:1.25 !important;padding:.35rem .55rem !important;}\n";document.head.appendChild(s);}());

(function(){
var style=document.createElement('style');style.id='expanded-gallery-layout-v2';style.textContent="\n#bodyContent .portable-infobox > .pi-title {margin:0!important;min-height:0!important;padding:.5rem 1rem!important;line-height:1.4!important;}\n#bodyContent .portable-infobox .expanded-profile-gallery {display:flow-root;padding-top:1rem;box-sizing:border-box;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs {display:flex;margin:0 1rem 1rem!important;overflow:hidden!important;align-items:stretch;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs button {display:flex!important;align-items:center!important;justify-content:center!important;flex:1 0 auto!important;min-width:max-content!important;margin:0!important;padding:.5rem .7rem!important;line-height:1.4!important;white-space:nowrap!important;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs.expanded-gallery-stacked {flex-direction:column!important;}\n#bodyContent .portable-infobox .expanded-profile-gallery-tabs.expanded-gallery-stacked button {flex:none!important;min-width:0!important;width:100%!important;white-space:normal!important;}\n";document.head.appendChild(style);
function arrange(){document.querySelectorAll('.expanded-profile-gallery-tabs').forEach(function(t){t.classList.remove('expanded-gallery-stacked');var needed=Array.from(t.children).reduce(function(n,b){return n+b.getBoundingClientRect().width;},0);t.classList.toggle('expanded-gallery-stacked',needed>t.clientWidth+1);});}
var pending=false;function schedule(){if(pending)return;pending=true;requestAnimationFrame(function(){pending=false;arrange();});}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',schedule);else schedule();
window.addEventListener('resize',schedule);new MutationObserver(schedule).observe(document.body||document.documentElement,{childList:true,subtree:true});if(document.fonts)document.fonts.ready.then(schedule);
}());
(function(){var s=document.createElement('style');s.id='expanded-gallery-title-width-fix';s.textContent="\n/* Preserve the infobox's full-width title: its parent has 1rem side padding. */\n#bodyContent .portable-infobox > .pi-title {margin:0 -1rem!important;width:auto!important;}\n";document.head.appendChild(s);}());
(function(){var s=document.createElement('style');s.id='expanded-restore-filter-width-fix';s.textContent="\n/* Let Restore default filters use its complete label width. */\n#bodyContent .mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-filters .mw-rcfilters-ui-row {grid-template-columns:minmax(0,1fr) max-content!important;}\n#bodyContent .mw-rcfilters-ui-filterTagMultiselectWidget-resetButton .oo-ui-buttonElement-button {white-space:nowrap!important;}\n@media(max-width:720px){\n#bodyContent .mw-rcfilters-ui-filterTagMultiselectWidget-wrapper-filters .mw-rcfilters-ui-row {grid-template-columns:minmax(0,1fr)!important;}\n#bodyContent .mw-rcfilters-ui-filterTagMultiselectWidget-cell-reset {grid-column:1!important;}\n#bodyContent .mw-rcfilters-ui-filterTagMultiselectWidget-resetButton .oo-ui-buttonElement-button {white-space:normal!important;}\n}\n";document.head.appendChild(s);}());