Github-bot(留言 | 贡献) (Git更新:([https://github.com/TopRealm/InterfaceCodes/commit/382f0d5f77104964acdf3a9acbfe08e57b1685dc 382f0d5]) chore: change urls) |
小 (Git commit 315405d: feat: sync upstream with Qiuwen) |
||
(未显示2个用户的5个中间版本) | |||
第1行: | 第1行: | ||
/** |
/** |
||
* SPDX-License-Identifier: |
* SPDX-License-Identifier: CC-BY-SA-4.0 |
||
* _addText: '{{Gadget Header|license= |
* _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}' |
||
* |
* |
||
* @ |
* @source {@link https://github.com/TopRealm/YsArchives-Gadgets/tree/master/src/Wikiplus-highlight} |
||
* @license CC-BY-SA-4.0 {@link https://youshou.wiki/wiki/H:CC-BY-SA-4.0} |
|||
* @source <https://git.qiuwen.net.cn/InterfaceAdmin/Gadgets/src/branch/master/src/Gadgets/Wikiplus> |
|||
* @author Bhsd <https://github.com/bhsd-harry> |
|||
* @author 机智的小鱼君 <https://github.com/Dragon-Fish> |
|||
* @dependency mediawiki.storage, mediawiki.Title, mediawiki.util |
|||
*/ |
*/ |
||
/** |
/** |
||
* +--------------------------------------------------------+ |
* +------------------------------------------------------------+ |
||
* | === WARNING: GLOBAL GADGET FILE === | |
* | === WARNING: GLOBAL GADGET FILE === | |
||
* +--------------------------------------------------------+ |
* +------------------------------------------------------------+ |
||
* | All changes should be made in the repository, | |
* | All changes should be made in the repository, | |
||
* | otherwise they will be lost. | |
* | otherwise they will be lost. | |
||
* +--------------------------------------------------------+ |
* +------------------------------------------------------------+ |
||
* | Changes to this page may affect many users. | |
* | Changes to this page may affect many users. | |
||
* | |
* | Please discuss changes by opening an issue before editing. | |
||
* +--------------------------------------------------------+ |
* +------------------------------------------------------------+ |
||
*/ |
*/ |
||
/* <nowiki> */ |
/* <nowiki> */ |
||
/* Wikiplus-highlight:Wikiplus编辑器的CodeMirror语法高亮扩展 */ |
|||
(async function wikiplusHighlight() { |
|||
if (mw.libs.wphl && mw.libs.wphl.version) { |
|||
return; |
|||
} |
|||
mw.libs.wphl = mw.libs.wphl || {}; // 开始加载 |
|||
const version = '2.59.5'; |
|||
const newAddon = 0; |
|||
/** @type {typeof mw.storage} */ |
|||
const storage = |
|||
typeof mw.storage === 'object' && typeof mw.storage.getObject === 'function' |
|||
? mw.storage |
|||
: { |
|||
/** @override */ |
|||
getObject(key) { |
|||
const json = localStorage.getItem(key); |
|||
if (json === false) { |
|||
return false; |
|||
} |
|||
try { |
|||
return JSON.parse(json); |
|||
} catch { |
|||
return null; |
|||
} |
|||
}, |
|||
/** @override */ |
|||
setObject(key, value) { |
|||
try { |
|||
return localStorage.setItem(key, JSON.stringify(value)); |
|||
} catch { |
|||
return false; |
|||
} |
|||
}, |
|||
}; |
|||
Object.fromEntries = |
|||
Object.fromEntries || |
|||
((entries) => { |
|||
const /** @type {Record<string, T>} */ obj = {}; |
|||
for (const [key, value] of entries) { |
|||
obj[key] = value; |
|||
} |
|||
return obj; |
|||
}); |
|||
/** |
|||
* 解析版本号 |
|||
* |
|||
* @param {string} str 版本号 |
|||
*/ |
|||
const getVersion = (str = version) => str.split('.').map(Number); |
|||
/** |
|||
* 比较版本号 |
|||
* |
|||
* @param {string} a 版本号1 |
|||
* @param {string} b 版本号2 |
|||
* @return {boolean} `a`的版本号是否小于`b`的版本号 |
|||
*/ |
|||
const cmpVersion = (a, b) => { |
|||
const [a0, a1] = getVersion(a); |
|||
const [b0, b1] = getVersion(b); |
|||
return a0 < b0 || (a0 === b0 && a1 < b1); |
|||
}; |
|||
/** |
|||
* 获取I18N消息 |
|||
* |
|||
* @param {string} key 消息键,省略`wphl-`前缀 |
|||
* @param {string[]} args 替换`$1`等的参数 |
|||
*/ |
|||
const msg = (key, ...args) => mw.msg(`wphl-${key}`, ...args); |
|||
/** |
|||
* 生成JQuery的I18N消息 |
|||
* |
|||
* @param {string[]} args 替换`$1`等的参数 |
|||
*/ |
|||
const htmlMsg = (...args) => $($.parseHTML(msg(...args))); |
|||
/** |
|||
* 提示消息 |
|||
* |
|||
* @param {string[]} args 替换`$1`等的参数 |
|||
*/ |
|||
const notify = |
|||
(...args) => |
|||
() => { |
|||
const $p = $('<p>').html(msg(...args)); |
|||
mw.notify($p, {type: 'success', autoHideSeconds: 'long', tag: 'wikiplus-highlight'}); |
|||
return $p; |
|||
}; |
|||
// 插件和I18N依主版本号 |
|||
const majorVersion = getVersion().slice(0, 2).join('.'); |
|||
// 路径 |
|||
const CDN = '//fastly.jsdelivr.net'; |
|||
const CM_CDN = 'npm/codemirror@5.65.3'; |
|||
const MW_CDN = 'gh/bhsd-harry/codemirror-mediawiki@1.1.10'; |
|||
const PARSER_CDN = 'npm/wikiparser-node@0.11.0-b'; |
|||
const REPO_CDN = `npm/wikiplus-highlight@${majorVersion}`; |
|||
(() => { |
|||
config: { |
|||
"use strict"; |
|||
values: { |
|||
wgPageName: page, |
|||
// dist/Wikiplus-highlight/Wikiplus-highlight.js |
|||
wgNamespaceNumber: ns, |
|||
function _createForOfIteratorHelper(r, e) { |
|||
wgPageContentModel: contentmodel, |
|||
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; |
|||
wgServer: server, |
|||
if (!t) { |
|||
wgScriptPath: scriptPath, |
|||
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { |
|||
wgUserLanguage: userLang, |
|||
t && (r = t); |
|||
skin, |
|||
var n = 0, F = function() { |
|||
}, |
|||
}; |
|||
}, |
|||
return { s: F, n: function() { |
|||
} = mw; |
|||
return n >= r.length ? { done: true } : { done: false, value: r[n++] }; |
|||
// 和本地缓存有关的常数 |
|||
}, e: function(r2) { |
|||
const USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null; |
|||
throw r2; |
|||
const /** @type {Record<string, {time: number, config: mwConfig}>} */ ALL_SETTINGS_CACHE = |
|||
}, f: F }; |
|||
storage.getObject('InPageEditMwConfig') || {}; |
|||
} |
|||
const SITE_ID = `${server}${scriptPath}`; |
|||
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); |
|||
const /** @type {{time: number, config: mwConfig}} */ SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID] || {}; |
|||
} |
|||
const EXPIRED = !(SITE_SETTINGS.time > Date.now() - 86400 * 1000 * 30); |
|||
var o, a = true, u = false; |
|||
const /** @type {Record<string, string>} */ CONTENTMODEL = { |
|||
return { s: function() { |
|||
css: 'css', |
|||
t = t.call(r); |
|||
'sanitized-css': 'css', |
|||
}, n: function() { |
|||
javascript: 'javascript', |
|||
var r2 = t.next(); |
|||
json: 'javascript', |
|||
return a = r2.done, r2; |
|||
wikitext: 'mediawiki', |
|||
}, e: function(r2) { |
|||
}; |
|||
u = true, o = r2; |
|||
const MODE_LIST = USING_LOCAL |
|||
}, f: function() { |
|||
? { |
|||
try { |
|||
lib: 'ext.CodeMirror.lib', |
|||
a || null == t.return || t.return(); |
|||
css: 'ext.CodeMirror.lib.mode.css', |
|||
} finally { |
|||
javascript: 'ext.CodeMirror.lib.mode.javascript', |
|||
if (u) throw o; |
|||
lua: `${CM_CDN}/mode/lua/lua.min.js`, |
|||
} |
|||
mediawiki: EXPIRED ? 'ext.CodeMirror.data' : [], |
|||
} }; |
|||
htmlmixed: 'ext.CodeMirror.lib.mode.htmlmixed', |
|||
} |
|||
xml: [], |
|||
function _unsupportedIterableToArray(r, a) { |
|||
} |
|||
if (r) { |
|||
: { |
|||
if ("string" == typeof r) return _arrayLikeToArray(r, a); |
|||
lib: `${CM_CDN}/lib/codemirror.min.js`, |
|||
var t = {}.toString.call(r).slice(8, -1); |
|||
css: `${CM_CDN}/mode/css/css.min.js`, |
|||
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; |
|||
javascript: `${CM_CDN}/mode/javascript/javascript.min.js`, |
|||
} |
|||
lua: `${CM_CDN}/mode/lua/lua.min.js`, |
|||
} |
|||
mediawiki: [], |
|||
function _arrayLikeToArray(r, a) { |
|||
htmlmixed: `${CM_CDN}/mode/htmlmixed/htmlmixed.min.js`, |
|||
(null == a || a > r.length) && (a = r.length); |
|||
xml: `${CM_CDN}/mode/xml/xml.min.js`, |
|||
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; |
|||
}; |
|||
return n; |
|||
const ADDON_LIST = { |
|||
} |
|||
searchcursor: `${CM_CDN}/addon/search/searchcursor.min.js`, |
|||
function asyncGeneratorStep(n, t, e, r, o, a, c) { |
|||
search: `${REPO_CDN}/search.min.js`, |
|||
try { |
|||
markSelection: `${CM_CDN}/addon/selection/mark-selection.min.js`, |
|||
var i = n[a](c), u = i.value; |
|||
activeLine: `${CM_CDN}/addon/selection/active-line.min.js`, |
|||
} catch (n2) { |
|||
trailingspace: `${CM_CDN}/addon/edit/trailingspace.min.js`, |
|||
return void e(n2); |
|||
matchBrackets: `${CM_CDN}/addon/edit/matchbrackets.min.js`, |
|||
} |
|||
closeBrackets: `${CM_CDN}/addon/edit/closebrackets.min.js`, |
|||
i.done ? t(u) : Promise.resolve(u).then(r, o); |
|||
matchTags: `${REPO_CDN}/matchtags.min.js`, |
|||
} |
|||
fold: `${REPO_CDN}/fold.min.js`, |
|||
function _asyncToGenerator(n) { |
|||
wikiEditor: 'ext.wikiEditor', |
|||
return function() { |
|||
contextmenu: 'mediawiki.Title', |
|||
var t = this, e = arguments; |
|||
lint: `${CM_CDN}/addon/lint/lint.min.js`, |
|||
return new Promise(function(r, o) { |
|||
annotateScrollbar: `${CM_CDN}/addon/scroll/annotatescrollbar.min.js`, |
|||
var a = n.apply(t, e); |
|||
parser: `${PARSER_CDN}/extensions/base.min.js`, |
|||
function _next(n2) { |
|||
lintWikitext: `${REPO_CDN}/lint.min.js`, |
|||
asyncGeneratorStep(a, r, o, _next, _throw, "next", n2); |
|||
}; |
|||
} |
|||
const /** @type {addon[]} */ options = [ |
|||
function _throw(n2) { |
|||
{ |
|||
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n2); |
|||
option: 'styleSelectedText', |
|||
} |
|||
addon: 'search', |
|||
_next(void 0); |
|||
download: 'markSelection', |
|||
}); |
|||
only: true, |
|||
}; |
|||
/** @implements */ complex: () => !addons.has('wikiEditor'), |
|||
} |
|||
}, |
|||
var __getOwnPropNames = Object.getOwnPropertyNames; |
|||
{option: 'styleActiveLine', addon: 'activeLine'}, |
|||
var __esm = (fn, res) => function __init() { |
|||
{option: 'showTrailingSpace', addon: 'trailingspace'}, |
|||
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; |
|||
{ |
|||
}; |
|||
option: 'matchBrackets', |
|||
//! src/Wikiplus-highlight/modules/highlight.ts |
|||
/** @implements */ complex: (mode, json) => |
|||
var highlight_exports = {}; |
|||
mode === 'mediawiki' || json ? {bracketRegex: /[{}[\]]/u} : true, |
|||
var import_ext_gadget2; |
|||
}, |
|||
var init_highlight = __esm({ |
|||
{ |
|||
"src/Wikiplus-highlight/modules/highlight.ts"() { |
|||
option: 'autoCloseBrackets', |
|||
"use strict"; |
|||
addon: 'closeBrackets', |
|||
import_ext_gadget2 = require("ext.gadget.Util"); |
|||
/** @implements */ complex: (mode, json) => (mode === 'mediawiki' || json ? '()[]{}""' : true), |
|||
/** |
|||
}, |
|||
* @name Wikiplus-highlight Wikiplus编辑器的CodeMirror语法高亮扩展 |
|||
{option: 'matchTags', addon: ['matchTags', 'fold'], modes: new Set(['mediawiki', 'widget'])}, |
|||
* @author Bhsd <https://github.com/bhsd-harry> |
|||
{option: 'fold', modes: new Set(['mediawiki', 'widget'])}, |
|||
* @license GPL-3.0 |
|||
]; |
|||
*/ |
|||
const defaultAddons = ['search']; |
|||
((_window) => { |
|||
const defaultIndent = 4; |
|||
const { |
|||
const /** @type {Set<string>} */ addons = new Set(storage.getObject('Wikiplus-highlight-addons') || defaultAddons); |
|||
libs |
|||
let /** @type {number} */ indent = storage.getObject('Wikiplus-highlight-indent') || defaultIndent; |
|||
} = mw, { |
|||
/** @type {Record<string, string>} */ |
|||
wphl |
|||
const entity = {'"': 'quot', "'": 'apos', '<': 'lt', '>': 'gt', '&': 'amp', ' ': 'nbsp'}; |
|||
} = libs; |
|||
const /** @type {(func: (str: string) => string) => (doc: CodeMirror.Editor) => void} */ |
|||
if (wphl !== null && wphl !== void 0 && wphl.version) { |
|||
convert = (func) => (doc) => { |
|||
return; |
|||
doc.replaceSelections( |
|||
} |
|||
doc.getSelections().map((selection) => selection.split('\n').map(func).join('\n')), |
|||
const version = "3.0.7"; |
|||
'around' |
|||
libs["wphl"] = { |
|||
); |
|||
version, |
|||
}; |
|||
cmVersion: "2.9", |
|||
const escapeHTML = convert((str) => |
|||
...wphl |
|||
[...str] |
|||
}; |
|||
.map((c) => { |
|||
const CDN = "//testingcf.jsdelivr.net", MW_CDN = "npm/@bhsd/codemirror-mediawiki@".concat(libs["wphl"].cmVersion || "latest", "/dist/mw.min.js"), REPO_CDN = "npm/wikiplus-highlight"; |
|||
if (c in entity) { |
|||
(_window = window).CodeMirror6 || (_window.CodeMirror6 = new Promise((resolve) => { |
|||
return `&${entity[c]};`; |
|||
const script = document.createElement("script"); |
|||
} |
|||
script.addEventListener("load", () => { |
|||
const code = c.codePointAt(); |
|||
resolve(CodeMirror6); |
|||
return code < 256 ? `&#${code};` : `&#x${code.toString(16)};`; |
|||
}); |
|||
}) |
|||
script.type = "module"; |
|||
.join('') |
|||
script.src = "".concat(CDN, "/").concat(MW_CDN); |
|||
); |
|||
document.head.append(script); |
|||
const escapeURI = convert((str) => { |
|||
})); |
|||
if (str.includes('%')) { |
|||
const { |
|||
try { |
|||
wgPageName: page, |
|||
return decodeURIComponent(str); |
|||
wgNamespaceNumber: ns, |
|||
} catch {} |
|||
wgPageContentModel: contentmodel |
|||
} |
|||
} = mw.config.get(); |
|||
return encodeURIComponent(str); |
|||
const CONTENTMODELS = { |
|||
}); |
|||
"sanitized-css": "css", |
|||
const escapeHash = convert((str) => { |
|||
wikitext: "mediawiki" |
|||
try { |
|||
}, EXTS = { |
|||
return decodeURIComponent(str.replace(/\.([\da-f]{2})/giu, '%$1')); |
|||
css: "css", |
|||
} catch { |
|||
js: "javascript", |
|||
return str; |
|||
json: "json" |
|||
} |
|||
}, NAMESPACES = { |
|||
}); |
|||
828: "lua", |
|||
const /** @type {(cm: typeof CodeMirror) => boolean} */ isPc = ({keyMap}) => keyMap.default === keyMap.pcDefault; |
|||
274: "html" |
|||
const /** @type {(cm: typeof CodeMirror) => Record<string, (doc: CodeMirror.Editor) => void} */ extraKeys = ( |
|||
}; |
|||
CM |
|||
const getObject = (key) => { |
|||
) => { |
|||
return JSON.parse(String(localStorage.getItem(key))); |
|||
const ctrl = isPc(CM) ? 'Ctrl' : 'Cmd'; |
|||
}; |
|||
return {[`${ctrl}-/`]: escapeHTML, [`${ctrl}-\\`]: escapeURI, [`Shift-${ctrl}-\\`]: escapeHash}; |
|||
const getPageMode = /* @__PURE__ */ function() { |
|||
}; |
|||
var _ref = _asyncToGenerator(function* (value) { |
|||
/** |
|||
if (typeof _WikiplusPages === "object") { |
|||
* contextMenu插件 |
|||
const pages = Object.values(_WikiplusPages).filter(({ |
|||
* |
|||
sectionCache |
|||
* @param {CodeMirror.Editor} doc CodeMirror编辑区 |
|||
}) => { |
|||
* @param {string} mode 高亮模式 |
|||
return Object.values(sectionCache).includes(value); |
|||
*/ |
|||
}); |
|||
const handleContextMenu = (doc, mode) => { |
|||
if (pages.some(({ |
|||
if ((mode !== 'mediawiki' && mode !== 'widget') || !addons.has('contextmenu')) { |
|||
title |
|||
return; |
|||
}) => { |
|||
} |
|||
return !title.endsWith("/doc"); |
|||
const $wrapper = $(doc.getWrapperElement()).addClass('CodeMirror-contextmenu'); |
|||
})) { |
|||
const { |
|||
yield mw.loader.using("mediawiki.Title"); |
|||
functionSynonyms: [synonyms], |
|||
} |
|||
} = mw.config.get('extCodeMirrorConfig') || { |
|||
const modes = (0, import_ext_gadget2.uniqueArray)( |
|||
functionSynonyms: [{invoke: 'invoke', 调用: 'invoke', widget: 'widget', 小工具: 'widget'}], |
|||
// Replace `new Set()` to avoid polyfilling core-js |
|||
}; |
|||
pages.map(({ |
|||
/** |
|||
title |
|||
* 生成别名映射表 |
|||
}) => { |
|||
* |
|||
var _t$getExtension; |
|||
* @param {string} str 别名 |
|||
if (title.endsWith("/doc")) { |
|||
*/ |
|||
return "template"; |
|||
const getSysnonyms = (str) => |
|||
} |
|||
new Set( |
|||
const t = new mw.Title(title), namespace = t.getNamespaceId(); |
|||
Object.keys(synonyms) |
|||
if (namespace % 2) { |
|||
.filter((key) => synonyms[key] === str) |
|||
return "mediawiki"; |
|||
.map((key) => (key.startsWith('#') ? key : `#${key}`)) |
|||
} |
|||
); |
|||
const mode = EXTS[((_t$getExtension = t.getExtension()) === null || _t$getExtension === void 0 ? void 0 : _t$getExtension.toLowerCase()) || ""] || NAMESPACES[namespace]; |
|||
const invoke = getSysnonyms('invoke'); |
|||
if (mode) { |
|||
const widget = getSysnonyms('widget'); |
|||
return mode === "javascript" && (namespace === 8 || namespace === 2300) ? "gadget" : mode; |
|||
$wrapper.on('contextmenu', ({pageX, pageY}) => { |
|||
} |
|||
const pos = doc.coordsChar({left: pageX, top: pageY}); |
|||
return namespace === 10 || namespace === 2 ? "template" : "mediawiki"; |
|||
const {line, ch} = pos; |
|||
}) |
|||
const curType = doc.getTokenTypeAt(pos); |
|||
); |
|||
if (!/\bmw-(?:template-name|parserfunction)\b/u.test(curType)) { |
|||
if (modes.length === 1) { |
|||
return undefined; |
|||
const [mode] = modes; |
|||
} |
|||
if (mode === "gadget") { |
|||
const tokens = doc.getLineTokens(line); |
|||
return ["javascript", 8]; |
|||
for (let i = tokens.length - 1; i > 0; i--) { |
|||
} |
|||
const {type, end, string} = tokens[i]; |
|||
return mode === "template" ? ["mediawiki", 10] : [mode]; |
|||
if (tokens[i - 1].type === type) { |
|||
} else if (modes.length === 2) { |
|||
tokens[i - 1].end = end; |
|||
if (modes.includes("javascript") && modes.includes("gadget")) { |
|||
tokens[i - 1].string += string; |
|||
return ["javascript"]; |
|||
tokens.splice(i, 1); |
|||
} else if (modes.includes("mediawiki") && modes.includes("template")) { |
|||
} |
|||
return ["mediawiki"]; |
|||
} |
|||
} |
|||
const index = tokens.findIndex(({start, end}) => start < ch && end >= ch); |
|||
} |
|||
const text = tokens[index].string |
|||
} |
|||
.replace(/\u200E/gu, '') |
|||
if (ns !== 274 && contentmodel !== "Scribunto" || page.endsWith("/doc")) { |
|||
.replace(/_/gu, ' ') |
|||
return [CONTENTMODELS[contentmodel] || contentmodel, contentmodel === "javascript" ? ns : void 0]; |
|||
.trim(); |
|||
} |
|||
if (/\bmw-template-name\b/u.test(curType)) { |
|||
yield mw.loader.using("oojs-ui-windows"); |
|||
const title = new mw.Title(text); |
|||
if (yield OO.ui.confirm(mw.msg("cm-mw-contentmodel"), { |
|||
if (title.namespace !== 0 || text.startsWith(':')) { |
|||
actions: [{ |
|||
open(title.getUrl(), '_blank'); |
|||
label: ns === 274 ? "Widget" : "Lua" |
|||
} else { |
|||
}, { |
|||
open(mw.util.getUrl(`Template:${text}`), '_blank'); |
|||
label: "Wikitext", |
|||
} |
|||
action: "accept" |
|||
return false; |
|||
}] |
|||
} else if ( |
|||
})) { |
|||
index < 2 || |
|||
return ["mediawiki"]; |
|||
!/\bmw-parserfunction-delimiter\b/u.test(tokens[index - 1].type) || |
|||
} |
|||
!/\bmw-parserfunction-name\b/u.test(tokens[index - 2].type) |
|||
return [ns === 274 ? "html" : "lua"]; |
|||
) { |
|||
}); |
|||
return undefined; |
|||
return function getPageMode2(_x) { |
|||
} |
|||
return _ref.apply(this, arguments); |
|||
const parserFunction = tokens[index - 2].string.trim().toLowerCase(); |
|||
}; |
|||
if (invoke.has(parserFunction)) { |
|||
}(); |
|||
open(mw.util.getUrl(`Module:${text}`), '_blank'); |
|||
const renderEditor = /* @__PURE__ */ function() { |
|||
} else if (widget.has(parserFunction)) { |
|||
var _ref2 = _asyncToGenerator(function* ($target, setting) { |
|||
open(mw.util.getUrl(`Widget:${text}`, {action: 'edit'}), '_blank'); |
|||
const cm = yield (yield CodeMirror6).fromTextArea($target[0], ...setting ? ["json"] : yield getPageMode($target.val())); |
|||
} else { |
|||
if (cm.view) { |
|||
return undefined; |
|||
cm.view.dom.id = "Wikiplus-CodeMirror"; |
|||
} |
|||
} |
|||
return false; |
|||
document.querySelector("#Wikiplus-Quickedit-Jump > a").href = "#Wikiplus-CodeMirror"; |
|||
}); |
|||
if (!setting) { |
|||
}; |
|||
const settings = getObject("Wikiplus_Settings"), escToExitQuickEdit = settings && (settings["esc_to_exit_quickedit"] || settings["escToExitQuickEdit"]), submit = ( |
|||
const /** @type {Record<string, string>} */ i18n = storage.getObject('Wikiplus-highlight-i18n') || {}; |
|||
/** 提交编辑 @return true */ |
|||
let /** @type {() => JQuery<HTMLElement>} */ welcome; |
|||
() => { |
|||
if (!i18n['wphl-version']) { |
|||
document.querySelector("#Wikiplus-Quickedit-Submit").dispatchEvent(new MouseEvent("click")); |
|||
// 首次安装 |
|||
return true; |
|||
welcome = notify('welcome'); |
|||
} |
|||
} else if (cmpVersion(i18n['wphl-version'], version)) { |
|||
), submitMinor = ( |
|||
// 更新版本 |
|||
/** 提交小编辑 */ |
|||
welcome = notify(`welcome-${newAddon ? 'new-addon' : 'upgrade'}`, version, newAddon); |
|||
() => { |
|||
} |
|||
document.querySelector("#Wikiplus-Quickedit-MinorEdit").checked = true; |
|||
const /** @type {Record<string, string>} */ i18nLanguages = { |
|||
return submit(); |
|||
zh: 'zh-hans', |
|||
} |
|||
'zh-hans': 'zh-hans', |
|||
), escapeEdit = ( |
|||
'zh-cn': 'zh-hans', |
|||
/** 按下Esc键退出编辑 */ |
|||
'zh-my': 'zh-hans', |
|||
() => { |
|||
'zh-sg': 'zh-hans', |
|||
document.querySelector("#Wikiplus-Quickedit-Back").dispatchEvent(new MouseEvent("click")); |
|||
'zh-hant': 'zh-hant', |
|||
return true; |
|||
'zh-tw': 'zh-hant', |
|||
} |
|||
'zh-hk': 'zh-hant', |
|||
); |
|||
'zh-mo': 'zh-hant', |
|||
cm.extraKeys([{ |
|||
ka: 'ka', |
|||
key: "Mod-S", |
|||
}; |
|||
run: submit |
|||
const i18nLang = i18nLanguages[userLang] || 'en'; |
|||
}, { |
|||
const I18N_CDN = `${CDN}/${REPO_CDN}/i18n/${i18nLang}.json`; |
|||
key: "Shift-Mod-S", |
|||
const isLatest = i18n['wphl-version'] === majorVersion; |
|||
run: submitMinor |
|||
/** 加载 I18N */ |
|||
}, ...escToExitQuickEdit === true || escToExitQuickEdit === "true" ? [{ |
|||
const setI18N = async () => { |
|||
key: "Esc", |
|||
if (!isLatest || i18n['wphl-lang'] !== i18nLang) { |
|||
run: escapeEdit |
|||
Object.assign( |
|||
}] : []]); |
|||
i18n, |
|||
} |
|||
await $.ajax(`${I18N_CDN}`, { |
|||
const oldKey = "Wikiplus-highlight-addons", oldPrefs = getObject(oldKey), mapping = { |
|||
dataType: 'json', |
|||
activeLine: "highlightActiveLine", |
|||
cache: true, |
|||
trailingspace: "highlightTrailingWhitespace", |
|||
}) |
|||
matchBrackets: "bracketMatching", |
|||
); |
|||
closeBrackets: "closeBrackets", |
|||
storage.setObject('Wikiplus-highlight-i18n', i18n); |
|||
matchTags: "tagMatching", |
|||
} |
|||
fold: "codeFolding", |
|||
mw.messages.set(i18n); |
|||
wikiEditor: "wikiEditor", |
|||
}; |
|||
escape: "escape", |
|||
const i18nPromise = Promise.all([ |
|||
contextmenu: "openLinks", |
|||
// 提前加载I18N |
|||
lint: "lint" |
|||
mw.loader.using('mediawiki.util'), |
|||
}; |
|||
setI18N(), |
|||
localStorage.removeItem(oldKey); |
|||
]); |
|||
if (oldPrefs) { |
|||
/** |
|||
const obj = {}; |
|||
* 下载MW扩展脚本 |
|||
var _iterator = _createForOfIteratorHelper(oldPrefs), _step; |
|||
* |
|||
try { |
|||
* @param {string[]} exts CodeMirror扩展模块 |
|||
for (_iterator.s(); !(_step = _iterator.n()).done; ) { |
|||
*/ |
|||
const k = _step.value; |
|||
const getInternalScript = (exts) => (exts.length > 0 ? mw.loader.using(exts) : Promise.resolve()); |
|||
if (k in mapping) { |
|||
/** |
|||
obj[mapping[k]] = true; |
|||
* 下载外部脚本 |
|||
} |
|||
* |
|||
} |
|||
* @param {string[]} urls CodeMirror脚本网址 |
|||
} catch (err) { |
|||
*/ |
|||
_iterator.e(err); |
|||
const getExternalScript = (urls) => |
|||
} finally { |
|||
urls.length > 0 |
|||
_iterator.f(); |
|||
? $.ajax(`${CDN}/${urls.length > 1 ? 'combine/' : ''}${urls.join()}`, {dataType: 'script', cache: true}) |
|||
} |
|||
: Promise.resolve(); |
|||
cm.prefer(obj); |
|||
/** |
|||
} |
|||
* 下载脚本 |
|||
}); |
|||
* |
|||
return function renderEditor2(_x2, _x3) { |
|||
* @param {string[]} urls 脚本路径 |
|||
return _ref2.apply(this, arguments); |
|||
* @param {boolean|undefined} local 是否先从本地下载 |
|||
}; |
|||
*/ |
|||
}(); |
|||
const getScript = async (urls, local) => { |
|||
const observer = new MutationObserver((records) => { |
|||
const $editArea = $(records.flatMap(({ |
|||
const external = urls.filter((url) => url.includes('/')); |
|||
addedNodes |
|||
if (local === true) { |
|||
}) => { |
|||
await getInternalScript(internal); |
|||
return [...addedNodes]; |
|||
return getExternalScript(external); |
|||
})).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input"); |
|||
} else if (local === false) { |
|||
if ($editArea.length > 0) { |
|||
await getExternalScript(external); |
|||
void renderEditor($editArea, $editArea.attr("id") === "Wikiplus-Setting-Input"); |
|||
return getInternalScript(internal); |
|||
} |
|||
} |
|||
}); |
|||
return Promise.all([getInternalScript(internal), getExternalScript(external)]); |
|||
observer.observe(document.body, { |
|||
}; |
|||
childList: true |
|||
// 以下进入CodeMirror相关内容 |
|||
}); |
|||
let /** @type {CodeMirror.EditorFromTextArea} */ cm; |
|||
mw.loader.load("".concat(CDN, "/").concat(REPO_CDN, "@").concat(version, "/styles.min.css"), "text/css"); |
|||
/** |
|||
})(); |
|||
* 生成需要的插件列表 |
|||
} |
|||
}); |
|||
* @param {typeof CodeMirror} CM CodeMirror |
|||
//! src/Wikiplus-highlight/modules/api.ts |
|||
* @param {boolean} other 是否用于Wikiplus以外的textarea |
|||
var import_ext_gadget = require("ext.gadget.Util"); |
|||
*/ |
|||
var api = (0, import_ext_gadget.initMwApi)("Wikiplus-highlight/2.0"); |
|||
const getAddonScript = (CM, other = false) => { |
|||
//! src/Wikiplus-highlight/modules/checkDependencies.ts |
|||
const /** @type {string[]} */ addonScript = []; |
|||
var checkDependencies = /* @__PURE__ */ function() { |
|||
for (const {option, addon = option, download = Array.isArray(addon) ? option : addon, only} of options) { |
|||
var _ref3 = _asyncToGenerator(function* () { |
|||
if (!(only && other) && !(option in CM.optionHandlers) && intersect(addon, addons)) { |
|||
if (!mw.user.options.get("gadget-Wikiplus")) { |
|||
addonScript.push(ADDON_LIST[download]); |
|||
void api.postWithEditToken({ |
|||
} |
|||
action: "options", |
|||
} |
|||
change: "gadget-Wikiplus=1" |
|||
return addonScript; |
|||
}); |
|||
yield mw.loader.using("ext.gadget.Wikiplus"); |
|||
/** |
|||
} |
|||
* 交集 |
|||
}); |
|||
* |
|||
return function checkDependencies2() { |
|||
* @param {T[]|T} arr 集合1(可重) |
|||
return _ref3.apply(this, arguments); |
|||
* @param {Set<T>} set 集合2 |
|||
}; |
|||
* @template T |
|||
}(); |
|||
*/ |
|||
//! src/Wikiplus-highlight/Wikiplus-highlight.ts |
|||
const intersect = (arr, set) => (Array.isArray(arr) ? arr.some((ele) => set.has(ele)) : set.has(arr)); |
|||
(function() { |
|||
/** |
|||
var _WikiplusHighlight = _asyncToGenerator(function* () { |
|||
* 根据文本的高亮模式加载依赖项 |
|||
void checkDependencies(); |
|||
* |
|||
const { |
|||
* @param {string} type 高亮模式 |
|||
wgAction, |
|||
*/ |
|||
wgIsArticle |
|||
const initMode = (type) => { |
|||
} = mw.config.get(); |
|||
let /** @type {string[]} */ scripts = []; |
|||
if (wgAction !== "view" || !wgIsArticle) { |
|||
const loaded = typeof window.CodeMirror === 'function'; |
|||
return; |
|||
/** |
|||
} |
|||
* 代替`CodeMirror`的局部变量 |
|||
const { |
|||
* |
|||
"visualeditor-enable": isVeEnable |
|||
* @type {typeof CodeMirror} |
|||
} = mw.user.options.get(); |
|||
*/ |
|||
if (isVeEnable) { |
|||
const CM = loaded |
|||
yield mw.loader.using("ext.visualEditor.core"); |
|||
? window.CodeMirror |
|||
} |
|||
: {modes: {}, prototype: {}, commands: {}, optionHandlers: {}, helpers: {}}; |
|||
if (!("ontouchstart" in document)) { |
|||
// lib |
|||
yield Promise.resolve().then(() => (init_highlight(), highlight_exports)); |
|||
if (!loaded) { |
|||
} |
|||
scripts.push(MODE_LIST.lib); |
|||
}); |
|||
if (!USING_LOCAL) { |
|||
function WikiplusHighlight() { |
|||
mw.loader.load(`${CDN}/${CM_CDN}/lib/codemirror.min.css`, 'text/css'); |
|||
return _WikiplusHighlight.apply(this, arguments); |
|||
} |
|||
} |
|||
return WikiplusHighlight; |
|||
// modes |
|||
})()(); |
|||
if (type === 'mediawiki' && SITE_SETTINGS.config && SITE_SETTINGS.config.tags.html) { |
|||
// NamespaceHTML扩展自由度过高,所以这里一律当作允许<html>标签 |
|||
type = 'html'; |
|||
} |
|||
if ((type === 'mediawiki' || type === 'widget') && !CM.modes.mediawiki) { |
|||
// 总是外部样式表和外部脚本 |
|||
mw.loader.load(`${CDN}/${MW_CDN}/mediawiki.min.css`, 'text/css'); |
|||
scripts.push(`${MW_CDN}/mediawiki.min.js`); |
|||
} |
|||
if (type === 'widget' || type === 'html') { |
|||
for (const lang of ['css', 'javascript', 'mediawiki', 'htmlmixed', 'xml']) { |
|||
if (!CM.modes[lang]) { |
|||
scripts = scripts.concat(MODE_LIST[lang]); |
|||
} |
|||
} |
|||
} else { |
|||
scripts = scripts.concat(MODE_LIST[type]); |
|||
} |
|||
// addons |
|||
if (!CM.prototype.getSearchCursor && addons.has('search') && !addons.has('wikiEditor')) { |
|||
scripts.push(ADDON_LIST.searchcursor); |
|||
} |
|||
if (!CM.prototype.annotateScrollbar && type === 'mediawiki' && addons.has('lint')) { |
|||
scripts.push(ADDON_LIST.annotateScrollbar); |
|||
} |
|||
if (!CM.commands.find && addons.has('search') && !addons.has('wikiEditor')) { |
|||
scripts.push(ADDON_LIST.search); |
|||
} |
|||
if (!window.wikiparse && type === 'mediawiki' && addons.has('lint')) { |
|||
scripts.push(ADDON_LIST.parser); |
|||
} |
|||
if (!CM.optionHandlers.lint && type === 'mediawiki' && addons.has('lint')) { |
|||
mw.loader.load(`${CDN}/${CM_CDN}/addon/lint/lint.min.css`, 'text/css'); |
|||
scripts.push(ADDON_LIST.lint); |
|||
} |
|||
if (!(CM.helpers.lint && CM.helpers.lint.mediawiki) && type === 'mediawiki' && addons.has('lint')) { |
|||
scripts.push(ADDON_LIST.lintWikitext); |
|||
} |
|||
if (addons.has('wikiEditor')) { |
|||
const state = mw.loader.getState('ext.wikiEditor'); |
|||
if (!state) { |
|||
addons.delete('wikiEditor'); |
|||
} else if (state !== 'ready') { |
|||
scripts.push(ADDON_LIST.wikiEditor); |
|||
} |
|||
} |
|||
if (mw.loader.getState('mediawiki.Title') !== 'ready' && addons.has('contextmenu')) { |
|||
scripts.push(ADDON_LIST.contextmenu); |
|||
} |
|||
scripts.push(...getAddonScript(CM)); |
|||
return getScript(scripts, loaded ? undefined : USING_LOCAL); |
|||
}; |
|||
/** |
|||
* 更新缓存的设置数据 |
|||
* |
|||
* @param {mwConfig} config wikitext设置 |
|||
*/ |
|||
const updateCachedConfig = (config) => { |
|||
ALL_SETTINGS_CACHE[SITE_ID] = {config, time: Date.now()}; |
|||
storage.setObject('InPageEditMwConfig', ALL_SETTINGS_CACHE); |
|||
}; |
|||
/** |
|||
* 展开别名列表 |
|||
* |
|||
* @param {{aliases: string[], name: string}[]} words 原名 |
|||
*/ |
|||
const getAliases = (words) => words.flatMap(({aliases, name}) => aliases.map((alias) => ({alias, name}))); |
|||
/** |
|||
* 将别名信息转换为CodeMirror接受的设置 |
|||
* |
|||
* @param {{alias: string, name: string}[]} aliases 别名 |
|||
* @return {Record<string, string>} |
|||
*/ |
|||
const getConfig = (aliases) => Object.fromEntries(aliases.map(({alias, name}) => [alias.replace(/:$/u, ''), name])); |
|||
/** |
|||
* 高亮扩展标签内部 |
|||
* |
|||
* @param {mwConfig} config 设置 |
|||
*/ |
|||
const setPlainMode = (config) => { |
|||
const tags = ['indicator', 'poem', 'ref', 'tabs', 'tab', 'poll']; |
|||
for (const tag of tags) { |
|||
if (config.tags[tag]) { |
|||
config.tagModes[tag] = 'text/mediawiki'; |
|||
} |
|||
} |
|||
}; |
|||
/** |
|||
* 加载CodeMirror的mediawiki模块需要的设置数据 |
|||
* |
|||
* @param {string} type 高亮模式 |
|||
* @param {Promise<void>} initModePromise 使用本地CodeMirror扩展时大部分数据来自ext.CodeMirror.data模块 |
|||
*/ |
|||
const getMwConfig = async (type, initModePromise) => { |
|||
if (type !== 'mediawiki' && type !== 'widget') { |
|||
return undefined; |
|||
} |
|||
if (USING_LOCAL && EXPIRED) { |
|||
// 只在localStorage过期时才会重新加载ext.CodeMirror.data |
|||
await initModePromise; |
|||
} |
|||
let config = mw.config.get('extCodeMirrorConfig'); |
|||
if (!config && !EXPIRED && isLatest) { |
|||
({config} = SITE_SETTINGS); |
|||
setPlainMode(config); |
|||
mw.config.set('extCodeMirrorConfig', config); |
|||
} |
|||
const isIPE = config && Object.values(config.functionSynonyms[0]).includes(true); |
|||
// 情形1:config已更新,可能来自localStorage |
|||
if (config && config.redirect && config.img && config.variants && !isIPE) { |
|||
return config; |
|||
} |
|||
// 以下情形均需要发送API请求 |
|||
// 情形2:localStorage未过期但不包含新设置 |
|||
// 情形3:新加载的 ext.CodeMirror.data |
|||
// 情形4:`config === null` |
|||
const { |
|||
query: { |
|||
general: {variants}, |
|||
magicwords, |
|||
extensiontags, |
|||
functionhooks, |
|||
variables, |
|||
}, |
|||
} = await new mw.Api({ |
|||
ajax: { |
|||
headers: { |
|||
'Api-User-Agent': `Qiuwen/1.1 (Wikiplus-highlight/${version}; ${mw.config.get('wgWikiID')})`, |
|||
}, |
|||
}, |
|||
}).get({ |
|||
meta: 'siteinfo', |
|||
siprop: `general|magicwords${config && !isIPE ? '' : '|extensiontags|functionhooks|variables'}`, |
|||
formatversion: 2, |
|||
}); |
|||
const otherMagicwords = new Set(['msg', 'raw', 'msgnw', 'subst', 'safesubst']); |
|||
if (config && !isIPE) { |
|||
// 情形2或3 |
|||
const { |
|||
functionSynonyms: [insensitive], |
|||
} = config; |
|||
if (!insensitive.subst) { |
|||
const aliases = getAliases(magicwords.filter(({name}) => otherMagicwords.has(name))); |
|||
for (const {alias, name} of aliases) { |
|||
insensitive[alias.replace(/:$/u, '')] = name; |
|||
} |
|||
} |
|||
} else { |
|||
// 情形4:`config === null` |
|||
config = { |
|||
tagModes: { |
|||
pre: 'mw-tag-pre', |
|||
nowiki: 'mw-tag-nowiki', |
|||
ref: 'text/mediawiki', |
|||
}, |
|||
tags: Object.fromEntries(extensiontags.map((tag) => [tag.slice(1, -1), true])), |
|||
urlProtocols: mw.config.get('wgUrlProtocols'), |
|||
}; |
|||
const realMagicwords = new Set([...functionhooks, ...variables, ...otherMagicwords]); |
|||
const allMagicwords = magicwords.filter( |
|||
({name, aliases}) => aliases.some((alias) => /^__.+__$/u.test(alias)) || realMagicwords.has(name) |
|||
); |
|||
const sensitive = getAliases(allMagicwords.filter((word) => word['case-sensitive'])); |
|||
const insensitive = getAliases(allMagicwords.filter((word) => !word['case-sensitive'])).map( |
|||
({alias, name}) => ({alias: alias.toLowerCase(), name}) |
|||
); |
|||
config.doubleUnderscore = [ |
|||
getConfig(insensitive.filter(({alias}) => /^__.+__$/u.test(alias))), |
|||
getConfig(sensitive.filter(({alias}) => /^__.+__$/u.test(alias))), |
|||
]; |
|||
config.functionSynonyms = [ |
|||
getConfig(insensitive.filter(({alias}) => !/^__.+__|^#$/u.test(alias))), |
|||
getConfig(sensitive.filter(({alias}) => !/^__.+__|^#$/u.test(alias))), |
|||
]; |
|||
} |
|||
config.redirect = magicwords.find(({name}) => name === 'redirect').aliases; |
|||
config.img = getConfig(getAliases(magicwords.filter(({name}) => name.startsWith('img_')))); |
|||
config.variants = variants ? variants.map(({code}) => code) : []; |
|||
setPlainMode(config); |
|||
mw.config.set('extCodeMirrorConfig', config); |
|||
updateCachedConfig(config); |
|||
return config; |
|||
}; |
|||
/** 检查页面语言类型 */ |
|||
const getPageMode = async () => { |
|||
if (page.endsWith('/doc')) { |
|||
return 'mediawiki'; |
|||
} else if (ns !== 274 && ns !== 828) { |
|||
return CONTENTMODEL[contentmodel]; |
|||
} |
|||
const pageMode = ns === 274 ? 'Widget' : 'Lua'; |
|||
await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']); |
|||
const bool = await OO.ui.confirm(msg('contentmodel'), { |
|||
actions: [{label: pageMode}, {label: 'Wikitext', action: 'accept'}], |
|||
}); |
|||
return bool ? 'mediawiki' : pageMode.toLowerCase(); |
|||
}; |
|||
/** |
|||
* jQuery.textSelection overrides for CodeMirror. |
|||
* See jQuery.textSelection.js for method documentation |
|||
*/ |
|||
const cmTextSelection = { |
|||
/** @override */ getContents() { |
|||
return cm.getValue(); |
|||
}, |
|||
/** @override */ setContents(content) { |
|||
cm.setValue(content); |
|||
return this; |
|||
}, |
|||
/** @override */ getSelection() { |
|||
return cm.getSelection(); |
|||
}, |
|||
/** @override */ setSelection(option) { |
|||
cm.setSelection(cm.posFromIndex(option.start), 'end' in option ? cm.posFromIndex(option.end) : undefined); |
|||
cm.focus(); |
|||
return this; |
|||
}, |
|||
/** @override */ replaceSelection(value) { |
|||
cm.replaceSelection(value); |
|||
return this; |
|||
}, |
|||
/** @override */ getCaretPosition(option) { |
|||
const caretPos = cm.indexFromPos(cm.getCursor('from')); |
|||
const endPos = cm.indexFromPos(cm.getCursor('to')); |
|||
return option.startAndEnd ? [caretPos, endPos] : caretPos; |
|||
}, |
|||
/** @override */ scrollToCaretPosition() { |
|||
cm.scrollIntoView(); |
|||
return this; |
|||
}, |
|||
}; |
|||
/** |
|||
* 渲染编辑器 |
|||
* |
|||
* @param {JQuery<HTMLTextAreaElement>} $target 目标编辑框 |
|||
* @param {boolean} setting 是否是Wikiplus设置(使用json语法) |
|||
*/ |
|||
const renderEditor = async ($target, setting) => { |
|||
const mode = setting ? 'javascript' : await getPageMode(); |
|||
const initModePromise = initMode(mode); |
|||
const [mwConfig] = await Promise.all([getMwConfig(mode, initModePromise), initModePromise]); |
|||
if (!setting && addons.has('wikiEditor')) { |
|||
try { |
|||
if (typeof mw.addWikiEditor === 'function') { |
|||
mw.addWikiEditor($target); |
|||
} else { |
|||
const { |
|||
wikiEditor: { |
|||
modules: { |
|||
dialogs: {config}, |
|||
}, |
|||
}, |
|||
} = $; |
|||
$target.wikiEditor('addModule', { |
|||
...$.wikiEditor.modules.toolbar.config.getDefaultConfig(), |
|||
...config.getDefaultConfig(), |
|||
}); |
|||
config.replaceIcons($target); |
|||
} |
|||
} catch (error) { |
|||
addons.delete('wikiEditor'); |
|||
mw.notify('WikiEditor工具栏加载失败。', {type: 'error', tag: 'wikiplus-highlight'}); |
|||
console.error(error); |
|||
} |
|||
} |
|||
if (mode === 'mediawiki' && mwConfig.tags.html) { |
|||
mwConfig.tagModes.html = 'htmlmixed'; |
|||
await initMode('html'); // 若已经缓存过`mwConfig`,这一步什么都不会发生 |
|||
} else if (mode === 'widget' && !CodeMirror.mimeModes.widget) { |
|||
// 到这里CodeMirror已确定加载完毕 |
|||
CodeMirror.defineMIME('widget', {name: 'htmlmixed', tags: {noinclude: [[null, null, 'mediawiki']]}}); |
|||
} |
|||
// 储存初始高度 |
|||
const height = $target.height(); |
|||
if (cm) { |
|||
cm.toTextArea(); |
|||
} |
|||
const json = setting || contentmodel === 'json'; |
|||
cm = CodeMirror.fromTextArea( |
|||
$target[0], |
|||
$.extend( |
|||
{ |
|||
inputStyle: 'contenteditable', |
|||
lineNumbers: !/Android\b/u.test(navigator.userAgent), |
|||
lineWrapping: true, |
|||
mode, |
|||
mwConfig, |
|||
json, |
|||
}, |
|||
Object.fromEntries( |
|||
options.map(({option, addon = option, modes, complex = (mod) => !modes || modes.has(mod)}) => { |
|||
const mainAddon = Array.isArray(addon) ? addon[0] : addon; |
|||
return [option, addons.has(mainAddon) && complex(mode, json)]; |
|||
}) |
|||
), |
|||
mode === 'mediawiki' |
|||
? { |
|||
extraKeys: addons.has('escape') && extraKeys(CodeMirror), |
|||
} |
|||
: { |
|||
indentUnit: addons.has('indentWithSpace') ? indent : defaultIndent, |
|||
indentWithTabs: !addons.has('indentWithSpace'), |
|||
} |
|||
) |
|||
); |
|||
cm.setSize(null, height); |
|||
cm.getWrapperElement().id = 'Wikiplus-CodeMirror'; |
|||
if ($.fn.textSelection) { |
|||
$target.textSelection('register', cmTextSelection); |
|||
} |
|||
const ctrl = isPc(CodeMirror) ? 'Ctrl' : 'Cmd'; |
|||
if (addons.has('wikiEditor')) { |
|||
const context = $target.data('wikiEditorContext'); |
|||
cm.addKeyMap({ |
|||
/** 替代CodeMirror的搜索功能 */ [`${ctrl}-F`]() { |
|||
$.wikiEditor.modules.dialogs.api.openDialog(context, 'search-and-replace'); |
|||
}, |
|||
}); |
|||
} |
|||
handleContextMenu(cm, mode); |
|||
$('#Wikiplus-Quickedit-Jump').children('a').attr('href', '#Wikiplus-CodeMirror'); |
|||
if (!setting) { |
|||
// 普通Wikiplus编辑区 |
|||
const settings = storage.getObject('Wikiplus_Settings'); |
|||
const escToExitQuickEdit = (settings && settings.esc_to_exit_quickedit) || settings.escToExitQuickEdit; |
|||
const submit = /** 提交编辑 */ () => { |
|||
$('#Wikiplus-Quickedit-Submit').triggerHandler('click'); |
|||
}; |
|||
const submitMinor = /** 提交小编辑 */ () => { |
|||
$('#Wikiplus-Quickedit-MinorEdit').trigger('click'); |
|||
$('#Wikiplus-Quickedit-Submit').triggerHandler('click'); |
|||
}; |
|||
cm.addKeyMap( |
|||
$.extend( |
|||
{[`${ctrl}-S`]: submit, [`Shift-${ctrl}-S`]: submitMinor}, |
|||
escToExitQuickEdit === true || escToExitQuickEdit === 'true' |
|||
? { |
|||
/** 按下Esc键退出编辑 */ Esc() { |
|||
$('#Wikiplus-Quickedit-Back').triggerHandler('click'); |
|||
}, |
|||
} |
|||
: {} |
|||
) |
|||
); |
|||
} |
|||
cm.refresh(); |
|||
mw.hook('wiki-codemirror').fire(cm); |
|||
}; |
|||
const {body} = document; |
|||
// 监视 Wikiplus 编辑框 |
|||
const observer = new MutationObserver((records) => { |
|||
const $editArea = $(records.flatMap(({addedNodes}) => [...addedNodes])).find( |
|||
'#Wikiplus-Quickedit, #Wikiplus-Setting-Input' |
|||
); |
|||
if ($editArea.length > 0) { |
|||
renderEditor($editArea, $editArea.attr('id') === 'Wikiplus-Setting-Input'); |
|||
} |
|||
}); |
|||
observer.observe(body, {childList: true}); |
|||
$(body).on( |
|||
'keydown.wphl', |
|||
'.ui-dialog', |
|||
/** @this {HTMLBodyElement} */ |
|||
function (e) { |
|||
if (e.key === 'Escape') { |
|||
/** @type {{$textarea: JQuery<HTMLTextAreaElement>}} */ |
|||
const context = $(this).children('.ui-dialog-content').data('context'); |
|||
if (context && context.$textarea && context.$textarea.attr('id') === 'Wikiplus-Quickedit') { |
|||
e.stopPropagation(); |
|||
} |
|||
} |
|||
} |
|||
); |
|||
/** |
|||
* 是否是Wikiplus编辑区 |
|||
* |
|||
* @param {HTMLTextAreaElement} elem textarea元素 |
|||
*/ |
|||
const isWikiplus = (elem) => elem.id === 'Wikiplus-Quickedit' || elem.id === 'Wikiplus-Setting-Input'; |
|||
$.valHooks.textarea = { |
|||
/** @override */ get(elem) { |
|||
return isWikiplus(elem) && cm ? cm.getValue() : elem.value; |
|||
}, |
|||
/** @override */ set(elem, value) { |
|||
if (isWikiplus(elem) && cm) { |
|||
cm.setValue(value); |
|||
} else { |
|||
elem.value = value; |
|||
} |
|||
}, |
|||
}; |
|||
await i18nPromise; // 以下内容依赖I18N |
|||
// 设置对话框 |
|||
let /** @type {OOUI.MessageDialog} */ dialog; |
|||
let /** @type {OOUI.CheckboxMultiselectInputWidget} */ inputWidget; |
|||
let /** @type {OOUI.CheckboxMultioptionWidget} */ searchWidget; |
|||
let /** @type {OOUI.CheckboxMultioptionWidget} */ wikiEditorWidget; |
|||
let /** @type {OOUI.NumberInputWidget} */ indentWidget; |
|||
let /** @type {OOUI.FieldLayout} */ field; |
|||
let /** @type {OOUI.FieldLayout} */ indentField; |
|||
/** |
|||
* 显示/隐藏缩进大小选项 |
|||
* |
|||
* @param {string[]} value 加载的插件 |
|||
*/ |
|||
const toggleIndent = (value = [...addons]) => { |
|||
indentField.toggle(value.includes('indentWithSpace')); |
|||
}; |
|||
const portletContainer = { |
|||
minerva: 'page-actions-overflow', |
|||
moeskin: 'ca-more-actions', |
|||
}; |
|||
const $portlet = $( |
|||
mw.util.addPortletLink(portletContainer[skin] || 'p-cactions', '#', msg('portlet'), 'wphl-settings') |
|||
).on('click', async () => { |
|||
if (dialog) { |
|||
inputWidget.setValue([...addons]); |
|||
indentWidget.setValue(indent); |
|||
} else { |
|||
await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']); |
|||
dialog = new OO.ui.MessageDialog({id: 'Wikiplus-highlight-dialog'}); |
|||
const windowManager = new OO.ui.WindowManager(); |
|||
windowManager.$element.appendTo(body); |
|||
windowManager.addWindows([dialog]); |
|||
inputWidget = new OO.ui.CheckboxMultiselectInputWidget({ |
|||
options: [ |
|||
...options.map(({option, addon = option}) => { |
|||
const mainAddon = Array.isArray(addon) ? addon[0] : addon; |
|||
return {data: mainAddon, label: htmlMsg(`addon-${mainAddon.toLowerCase()}`)}; |
|||
}), |
|||
...['wikiEditor', 'escape', 'contextmenu', 'lint', 'indentWithSpace', 'otherEditors'].map( |
|||
(addon) => ({data: addon, label: htmlMsg(`addon-${addon.toLowerCase()}`)}) |
|||
), |
|||
], |
|||
value: [...addons], |
|||
}).on('change', toggleIndent); |
|||
const {checkboxMultiselectWidget} = inputWidget; |
|||
searchWidget = checkboxMultiselectWidget.findItemFromData('search'); |
|||
wikiEditorWidget = checkboxMultiselectWidget.findItemFromData('wikiEditor'); |
|||
indentWidget = new OO.ui.NumberInputWidget({min: 0, value: indent}); |
|||
field = new OO.ui.FieldLayout(inputWidget, { |
|||
label: msg('addon-label'), |
|||
notices: [msg('addon-notice')], |
|||
align: 'top', |
|||
}); |
|||
indentField = new OO.ui.FieldLayout(indentWidget, {label: msg('addon-indent')}); |
|||
toggleIndent(); |
|||
Object.assign(mw.libs.wphl, {widget: inputWidget, indentWidget}); |
|||
} |
|||
const wikiplusLoaded = typeof window.Wikiplus === 'object' || typeof window._WikiplusPages === 'object'; |
|||
searchWidget.setDisabled(!wikiplusLoaded); |
|||
wikiEditorWidget.setDisabled(!wikiplusLoaded || !mw.loader.getState('ext.wikiEditor')); |
|||
const data = await dialog.open({ |
|||
title: msg('addon-title'), |
|||
message: field.$element.add(indentField.$element).add($('<p>').html(msg('feedback'))), |
|||
actions: [ |
|||
{action: 'reject', label: mw.msg('ooui-dialog-message-reject')}, |
|||
{action: 'accept', label: mw.msg('ooui-dialog-message-accept'), flags: 'progressive'}, |
|||
], |
|||
size: i18nLang === 'en' || skin === 'minerva' ? 'medium' : 'small', |
|||
}).closing; |
|||
field.$element.detach(); |
|||
indentField.$element.detach(); |
|||
if (typeof data === 'object' && data.action === 'accept') { |
|||
const value = inputWidget.getValue(); |
|||
addons.clear(); |
|||
for (const addon of value) { |
|||
addons.add(addon); |
|||
} |
|||
indent = Number(indentWidget.getValue()); |
|||
storage.setObject('Wikiplus-highlight-addons', value); |
|||
storage.setObject('Wikiplus-highlight-indent', indent); |
|||
} |
|||
}); |
|||
if (skin === 'minerva') { |
|||
$portlet.find('.mw-ui-icon').addClass('mw-ui-icon-minerva-settings'); |
|||
} |
|||
// 发送欢迎提示 |
|||
if (typeof welcome === 'function') { |
|||
welcome() |
|||
.find('#wphl-settings-notify') |
|||
.click((e) => { |
|||
e.preventDefault(); |
|||
$('#wphl-settings').triggerHandler('click'); |
|||
}); |
|||
} |
|||
/** |
|||
* 处理非Wikiplus编辑器 |
|||
* |
|||
* @param {CodeMirror.Editor} doc CodeMirror编辑区 |
|||
*/ |
|||
const handleOtherEditors = async (doc) => { |
|||
if (!addons.has('otherEditors')) { |
|||
return; |
|||
} |
|||
let mode = doc.getOption('mode'); |
|||
mode = mode === 'text/mediawiki' ? 'mediawiki' : mode; |
|||
const addonScript = getAddonScript(CodeMirror, true); |
|||
const json = doc.getOption('json'); |
|||
const { |
|||
prototype, |
|||
optionHandlers, |
|||
helpers: {lint}, |
|||
} = CodeMirror; |
|||
if (!prototype.annotateScrollbar && mode === 'mediawiki' && addons.has('lint')) { |
|||
addonScript.push(ADDON_LIST.annotateScrollbar); |
|||
} |
|||
if (!window.wikiparse && mode === 'mediawiki' && addons.has('lint')) { |
|||
addonScript.push(ADDON_LIST.parser); |
|||
} |
|||
if (!optionHandlers.lint && mode === 'mediawiki' && addons.has('lint')) { |
|||
mw.loader.load(`${CDN}/${CM_CDN}/addon/lint/lint.min.css`, 'text/css'); |
|||
addonScript.push(ADDON_LIST.lint); |
|||
} |
|||
if (!(lint && lint.mediawiki) && mode === 'mediawiki' && addons.has('lint')) { |
|||
addonScript.push(ADDON_LIST.lintWikitext); |
|||
} |
|||
await getScript(addonScript); |
|||
for (const { |
|||
option, |
|||
addon = option, |
|||
modes, |
|||
complex = (/** @type {string} */ mod) => !modes || modes.has(mod), |
|||
} of options.filter(({only}) => !only)) { |
|||
const mainAddon = Array.isArray(addon) ? addon[0] : addon; |
|||
if (doc.getOption(option) === undefined && addons.has(mainAddon)) { |
|||
doc.setOption(option, complex(mode, json)); |
|||
} |
|||
} |
|||
if (mode === 'mediawiki' && addons.has('escape')) { |
|||
doc.addKeyMap(extraKeys(CodeMirror), true); |
|||
} else if (mode !== 'mediawiki' && addons.has('indentWithSpace')) { |
|||
doc.setOption('indentUnit', indent); |
|||
doc.setOption('indentWithTabs', false); |
|||
} |
|||
handleContextMenu(doc, mode); |
|||
}; |
|||
mw.hook('InPageEdit.quickEdit.codemirror').add( |
|||
/** @param {{cm: CodeMirror.Editor}} */ ({cm: doc}) => handleOtherEditors(doc) |
|||
); |
|||
mw.hook('inspector').add(/** @param {CodeMirror.Editor} doc */ (doc) => handleOtherEditors(doc)); |
|||
mw.hook('wiki-codemirror').add( |
|||
/** @param {CodeMirror.Editor} doc */ (doc) => { |
|||
if (!doc.getTextArea || !isWikiplus(doc.getTextArea())) { |
|||
handleOtherEditors(doc); |
|||
} |
|||
} |
|||
); |
|||
mw.loader.load(`${CDN}/${REPO_CDN}/styles.min.css`, 'text/css'); |
|||
Object.assign(mw.libs.wphl, { |
|||
version, |
|||
options, |
|||
addons, |
|||
i18n, |
|||
i18nLang, |
|||
storage, |
|||
$portlet, |
|||
CDN, |
|||
PARSER_CDN, |
|||
USING_LOCAL, |
|||
MODE_LIST, |
|||
ADDON_LIST, |
|||
msg, |
|||
htmlMsg, |
|||
escapeHTML, |
|||
handleContextMenu, |
|||
setI18N, |
|||
getAddonScript, |
|||
updateCachedConfig, |
|||
getMwConfig, |
|||
renderEditor, |
|||
handleOtherEditors, |
|||
isPc, |
|||
}); // 加载完毕 |
|||
})(); |
})(); |
||
/* </nowiki> */ |
/* </nowiki> */ |
||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL1dpa2lwbHVzLWhpZ2hsaWdodC9tb2R1bGVzL2hpZ2hsaWdodC50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L21vZHVsZXMvYXBpLnRzIiwgInNyYy9XaWtpcGx1cy1oaWdobGlnaHQvbW9kdWxlcy9jaGVja0RlcGVuZGVuY2llcy50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L1dpa2lwbHVzLWhpZ2hsaWdodC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbmFtZSBXaWtpcGx1cy1oaWdobGlnaHQgV2lraXBsdXPnvJbovpHlmajnmoRDb2RlTWlycm9y6K+t5rOV6auY5Lqu5omp5bGVXG4gKiBAYXV0aG9yIEJoc2QgPGh0dHBzOi8vZ2l0aHViLmNvbS9iaHNkLWhhcnJ5PlxuICogQGxpY2Vuc2UgR1BMLTMuMFxuICovXG5cbmltcG9ydCB7dW5pcXVlQXJyYXl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbigoKTogdm9pZCA9PiB7XG5cdGNvbnN0IHtsaWJzfSA9IG13LFxuXHRcdHt3cGhsfSA9IGxpYnM7XG5cdGlmICh3cGhsPy52ZXJzaW9uKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHZlcnNpb24gPSAnMy4wLjcnO1xuXHRsaWJzWyd3cGhsJ10gPSB7dmVyc2lvbiwgY21WZXJzaW9uOiAnMi45JywgLi4ud3BobH07IC8vIOW8gOWni+WKoOi9vVxuXG5cdC8vIOi3r+W+hFxuXHRjb25zdCBDRE4gPSAnLy90ZXN0aW5nY2YuanNkZWxpdnIubmV0Jyxcblx0XHRNV19DRE4gPSBgbnBtL0BiaHNkL2NvZGVtaXJyb3ItbWVkaWF3aWtpQCR7bGlic1snd3BobCddLmNtVmVyc2lvbiB8fCAnbGF0ZXN0J30vZGlzdC9tdy5taW4uanNgLFxuXHRcdFJFUE9fQ0ROID0gJ25wbS93aWtpcGx1cy1oaWdobGlnaHQnO1xuXG5cdHdpbmRvdy5Db2RlTWlycm9yNiB8fD0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblx0XHRzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdHJlc29sdmUoQ29kZU1pcnJvcjYpO1xuXHRcdH0pO1xuXHRcdHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG5cdFx0c2NyaXB0LnNyYyA9IGAke0NETn0vJHtNV19DRE59YDtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChzY3JpcHQpO1xuXHR9KTtcblxuXHRjb25zdCB7d2dQYWdlTmFtZTogcGFnZSwgd2dOYW1lc3BhY2VOdW1iZXI6IG5zLCB3Z1BhZ2VDb250ZW50TW9kZWw6IGNvbnRlbnRtb2RlbH0gPSBtdy5jb25maWcuZ2V0KCk7XG5cblx0Y29uc3QgQ09OVEVOVE1PREVMUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcblx0XHRcdCdzYW5pdGl6ZWQtY3NzJzogJ2NzcycsXG5cdFx0XHR3aWtpdGV4dDogJ21lZGlhd2lraScsXG5cdFx0fSxcblx0XHRFWFRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0Y3NzOiAnY3NzJyxcblx0XHRcdGpzOiAnamF2YXNjcmlwdCcsXG5cdFx0XHRqc29uOiAnanNvbicsXG5cdFx0fSxcblx0XHROQU1FU1BBQ0VTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuXHRcdFx0ODI4OiAnbHVhJyxcblx0XHRcdDI3NDogJ2h0bWwnLFxuXHRcdH07XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3QgZ2V0T2JqZWN0ID0gKGtleTogc3RyaW5nKTogYW55ID0+IHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShTdHJpbmcobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiDmo4Dmn6XpobXpnaLor63oqIDnsbvlnotcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIOmhtemdouWGheWuuVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Y29uc3QgZ2V0UGFnZU1vZGUgPSBhc3luYyAodmFsdWU6IHN0cmluZyk6IFByb21pc2U8W3N0cmluZywgKG51bWJlciB8IHVuZGVmaW5lZCk/XT4gPT4ge1xuXHRcdGlmICh0eXBlb2YgX1dpa2lwbHVzUGFnZXMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRjb25zdCBwYWdlcyA9IE9iamVjdC52YWx1ZXMoX1dpa2lwbHVzUGFnZXMpLmZpbHRlcigoe3NlY3Rpb25DYWNoZX0pID0+IHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC52YWx1ZXMoc2VjdGlvbkNhY2hlKS5pbmNsdWRlcyh2YWx1ZSk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0cGFnZXMuc29tZSgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAhdGl0bGUuZW5kc1dpdGgoJy9kb2MnKTtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ21lZGlhd2lraS5UaXRsZScpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbW9kZXMgPSB1bmlxdWVBcnJheShcblx0XHRcdFx0Ly8gUmVwbGFjZSBgbmV3IFNldCgpYCB0byBhdm9pZCBwb2x5ZmlsbGluZyBjb3JlLWpzXG5cdFx0XHRcdHBhZ2VzLm1hcCgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdGlmICh0aXRsZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ3RlbXBsYXRlJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdCA9IG5ldyBtdy5UaXRsZSh0aXRsZSksXG5cdFx0XHRcdFx0XHRuYW1lc3BhY2UgPSB0LmdldE5hbWVzcGFjZUlkKCk7XG5cdFx0XHRcdFx0aWYgKG5hbWVzcGFjZSAlIDIpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnbWVkaWF3aWtpJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgbW9kZSA9IEVYVFNbdC5nZXRFeHRlbnNpb24oKT8udG9Mb3dlckNhc2UoKSB8fCAnJ10gfHwgTkFNRVNQQUNFU1tuYW1lc3BhY2VdO1xuXHRcdFx0XHRcdGlmIChtb2RlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ2phdmFzY3JpcHQnICYmIChuYW1lc3BhY2UgPT09IDggfHwgbmFtZXNwYWNlID09PSAyMzAwKSA/ICdnYWRnZXQnIDogbW9kZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG5hbWVzcGFjZSA9PT0gMTAgfHwgbmFtZXNwYWNlID09PSAyID8gJ3RlbXBsYXRlJyA6ICdtZWRpYXdpa2knO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGlmIChtb2Rlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Y29uc3QgW21vZGVdID0gbW9kZXM7XG5cdFx0XHRcdGlmIChtb2RlID09PSAnZ2FkZ2V0Jykge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnLCA4XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ3RlbXBsYXRlJyA/IFsnbWVkaWF3aWtpJywgMTBdIDogW21vZGUhXTtcblx0XHRcdH0gZWxzZSBpZiAobW9kZXMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGlmIChtb2Rlcy5pbmNsdWRlcygnamF2YXNjcmlwdCcpICYmIG1vZGVzLmluY2x1ZGVzKCdnYWRnZXQnKSkge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnXTtcblx0XHRcdFx0fSBlbHNlIGlmIChtb2Rlcy5pbmNsdWRlcygnbWVkaWF3aWtpJykgJiYgbW9kZXMuaW5jbHVkZXMoJ3RlbXBsYXRlJykpIHtcblx0XHRcdFx0XHRyZXR1cm4gWydtZWRpYXdpa2knXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoKG5zICE9PSAyNzQgJiYgY29udGVudG1vZGVsICE9PSAnU2NyaWJ1bnRvJykgfHwgcGFnZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRyZXR1cm4gW0NPTlRFTlRNT0RFTFNbY29udGVudG1vZGVsXSB8fCBjb250ZW50bW9kZWwsIGNvbnRlbnRtb2RlbCA9PT0gJ2phdmFzY3JpcHQnID8gbnMgOiB1bmRlZmluZWRdO1xuXHRcdH1cblx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ29vanMtdWktd2luZG93cycpO1xuXHRcdGlmIChcblx0XHRcdGF3YWl0IE9PLnVpLmNvbmZpcm0obXcubXNnKCdjbS1tdy1jb250ZW50bW9kZWwnKSwge1xuXHRcdFx0XHRhY3Rpb25zOiBbe2xhYmVsOiBucyA9PT0gMjc0ID8gJ1dpZGdldCcgOiAnTHVhJ30sIHtsYWJlbDogJ1dpa2l0ZXh0JywgYWN0aW9uOiAnYWNjZXB0J31dLFxuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdHJldHVybiBbJ21lZGlhd2lraSddO1xuXHRcdH1cblx0XHRyZXR1cm4gW25zID09PSAyNzQgPyAnaHRtbCcgOiAnbHVhJ107XG5cdH07XG5cblx0LyoqXG5cdCAqIOa4suafk+e8lui+keWZqFxuXHQgKlxuXHQgKiBAcGFyYW0ge0pRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Pn0gJHRhcmdldCDnm67moIfnvJbovpHmoYZcblx0ICogQHBhcmFtIHtib29sZWFufSBzZXR0aW5nIOaYr+WQpuaYr1dpa2lwbHVz6K6+572u77yI5L2/55SoanNvbuivreazle+8iVxuXHQgKi9cblx0Y29uc3QgcmVuZGVyRWRpdG9yID0gYXN5bmMgKCR0YXJnZXQ6IEpRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Piwgc2V0dGluZzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdGNvbnN0IGNtID0gYXdhaXQgKFxuXHRcdFx0YXdhaXQgQ29kZU1pcnJvcjZcblx0XHQpLmZyb21UZXh0QXJlYSgkdGFyZ2V0WzBdISwgLi4uKHNldHRpbmcgPyAoWydqc29uJ10gYXMgW3N0cmluZ10pIDogYXdhaXQgZ2V0UGFnZU1vZGUoJHRhcmdldC52YWwoKSEpKSk7XG5cdFx0aWYgKGNtLnZpZXcpIHtcblx0XHRcdGNtLnZpZXcuZG9tLmlkID0gJ1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXHRcdH1cblxuXHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEFuY2hvckVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LUp1bXAgPiBhJykhLmhyZWYgPSAnI1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXG5cdFx0aWYgKCFzZXR0aW5nKSB7XG5cdFx0XHQvLyDmma7pgJpXaWtpcGx1c+e8lui+keWMulxuXHRcdFx0Y29uc3Qgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IGdldE9iamVjdCgnV2lraXBsdXNfU2V0dGluZ3MnKSxcblx0XHRcdFx0ZXNjVG9FeGl0UXVpY2tFZGl0ID0gc2V0dGluZ3MgJiYgKHNldHRpbmdzWydlc2NfdG9fZXhpdF9xdWlja2VkaXQnXSB8fCBzZXR0aW5nc1snZXNjVG9FeGl0UXVpY2tFZGl0J10pLFxuXHRcdFx0XHRzdWJtaXQgPSAvKiog5o+Q5Lqk57yW6L6RIEByZXR1cm4gdHJ1ZSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1TdWJtaXQnKSEuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1Ym1pdE1pbm9yID0gLyoqIOaPkOS6pOWwj+e8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI1dpa2lwbHVzLVF1aWNrZWRpdC1NaW5vckVkaXQnKSEuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Ym1pdCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlc2NhcGVFZGl0ID0gLyoqIOaMieS4i0VzY+mUrumAgOWHuue8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1CYWNrJykhLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9O1xuXHRcdFx0Y20uZXh0cmFLZXlzKFtcblx0XHRcdFx0e2tleTogJ01vZC1TJywgcnVuOiBzdWJtaXR9LFxuXHRcdFx0XHR7a2V5OiAnU2hpZnQtTW9kLVMnLCBydW46IHN1Ym1pdE1pbm9yfSxcblx0XHRcdFx0Li4uKGVzY1RvRXhpdFF1aWNrRWRpdCA9PT0gdHJ1ZSB8fCBlc2NUb0V4aXRRdWlja0VkaXQgPT09ICd0cnVlJ1xuXHRcdFx0XHRcdD8gW3trZXk6ICdFc2MnLCBydW46IGVzY2FwZUVkaXR9XVxuXHRcdFx0XHRcdDogW10pLFxuXHRcdFx0XSk7XG5cdFx0fVxuXG5cdFx0LyoqIEB0b2RvIOS7peS4i+i/h+a4oeS7o+eggea3u+WKoOS6jjIwMjQtMDItMDfvvIzlsIbkuo7kuIDmrrXml7bpl7TlkI7lvIPnlKggKi9cblx0XHRjb25zdCBvbGRLZXkgPSAnV2lraXBsdXMtaGlnaGxpZ2h0LWFkZG9ucycsXG5cdFx0XHRvbGRQcmVmczogc3RyaW5nW10gfCBudWxsID0gZ2V0T2JqZWN0KG9sZEtleSksXG5cdFx0XHRtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0XHRhY3RpdmVMaW5lOiAnaGlnaGxpZ2h0QWN0aXZlTGluZScsXG5cdFx0XHRcdHRyYWlsaW5nc3BhY2U6ICdoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UnLFxuXHRcdFx0XHRtYXRjaEJyYWNrZXRzOiAnYnJhY2tldE1hdGNoaW5nJyxcblx0XHRcdFx0Y2xvc2VCcmFja2V0czogJ2Nsb3NlQnJhY2tldHMnLFxuXHRcdFx0XHRtYXRjaFRhZ3M6ICd0YWdNYXRjaGluZycsXG5cdFx0XHRcdGZvbGQ6ICdjb2RlRm9sZGluZycsXG5cdFx0XHRcdHdpa2lFZGl0b3I6ICd3aWtpRWRpdG9yJyxcblx0XHRcdFx0ZXNjYXBlOiAnZXNjYXBlJyxcblx0XHRcdFx0Y29udGV4dG1lbnU6ICdvcGVuTGlua3MnLFxuXHRcdFx0XHRsaW50OiAnbGludCcsXG5cdFx0XHR9O1xuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG9sZEtleSk7XG5cdFx0aWYgKG9sZFByZWZzKSB7XG5cdFx0XHRjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IGsgb2Ygb2xkUHJlZnMpIHtcblx0XHRcdFx0aWYgKGsgaW4gbWFwcGluZykge1xuXHRcdFx0XHRcdG9ialttYXBwaW5nW2tdIV0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNtLnByZWZlcihvYmopO1xuXHRcdH1cblx0fTtcblxuXHQvLyDnm5Hop4YgV2lraXBsdXMg57yW6L6R5qGGXG5cdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHJlY29yZHMpID0+IHtcblx0XHRjb25zdCAkZWRpdEFyZWEgPSAkKFxuXHRcdFx0cmVjb3Jkcy5mbGF0TWFwKCh7YWRkZWROb2Rlc30pID0+IHtcblx0XHRcdFx0cmV0dXJuIFsuLi5hZGRlZE5vZGVzXTtcblx0XHRcdH0pXG5cdFx0KS5maW5kPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LCAjV2lraXBsdXMtU2V0dGluZy1JbnB1dCcpO1xuXHRcdGlmICgkZWRpdEFyZWEubGVuZ3RoID4gMCkge1xuXHRcdFx0dm9pZCByZW5kZXJFZGl0b3IoJGVkaXRBcmVhLCAkZWRpdEFyZWEuYXR0cignaWQnKSA9PT0gJ1dpa2lwbHVzLVNldHRpbmctSW5wdXQnKTtcblx0XHR9XG5cdH0pO1xuXHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtjaGlsZExpc3Q6IHRydWV9KTtcblxuXHRtdy5sb2FkZXIubG9hZChgJHtDRE59LyR7UkVQT19DRE59QCR7dmVyc2lvbn0vc3R5bGVzLm1pbi5jc3NgLCAndGV4dC9jc3MnKTtcbn0pKCk7XG5cbmV4cG9ydCB7fTtcbiIsICJpbXBvcnQge2luaXRNd0FwaX0gZnJvbSAnZXh0LmdhZGdldC5VdGlsJztcblxuY29uc3QgYXBpOiBtdy5BcGkgPSBpbml0TXdBcGkoJ1dpa2lwbHVzLWhpZ2hsaWdodC8yLjAnKTtcblxuZXhwb3J0IHthcGl9O1xuIiwgImltcG9ydCB7YXBpfSBmcm9tICcuL2FwaSc7XG5cbmNvbnN0IGNoZWNrRGVwZW5kZW5jaWVzID0gYXN5bmMgKCkgPT4ge1xuXHRpZiAoIW13LnVzZXIub3B0aW9ucy5nZXQoJ2dhZGdldC1XaWtpcGx1cycpKSB7XG5cdFx0dm9pZCBhcGkucG9zdFdpdGhFZGl0VG9rZW4oe1xuXHRcdFx0YWN0aW9uOiAnb3B0aW9ucycsXG5cdFx0XHRjaGFuZ2U6ICdnYWRnZXQtV2lraXBsdXM9MScsXG5cdFx0fSBhcyBBcGlPcHRpb25zUGFyYW1zKTtcblxuXHRcdGF3YWl0IG13LmxvYWRlci51c2luZygnZXh0LmdhZGdldC5XaWtpcGx1cycpO1xuXHR9XG59O1xuXG5leHBvcnQge2NoZWNrRGVwZW5kZW5jaWVzfTtcbiIsICJpbXBvcnQgJy4vV2lraXBsdXMtaGlnaGxpZ2h0Lmxlc3MnO1xuaW1wb3J0IHtjaGVja0RlcGVuZGVuY2llc30gZnJvbSAnLi9tb2R1bGVzL2NoZWNrRGVwZW5kZW5jaWVzJztcblxuKGFzeW5jIGZ1bmN0aW9uIFdpa2lwbHVzSGlnaGxpZ2h0KCkge1xuXHR2b2lkIGNoZWNrRGVwZW5kZW5jaWVzKCk7XG5cdGNvbnN0IHt3Z0FjdGlvbiwgd2dJc0FydGljbGV9ID0gbXcuY29uZmlnLmdldCgpO1xuXHRpZiAod2dBY3Rpb24gIT09ICd2aWV3JyB8fCAhd2dJc0FydGljbGUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB7J3Zpc3VhbGVkaXRvci1lbmFibGUnOiBpc1ZlRW5hYmxlfSA9IG13LnVzZXIub3B0aW9ucy5nZXQoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuXHQvKiBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpcGx1cy9XaWtpcGx1cy9pc3N1ZXMvNjU+ICovXG5cdGlmIChpc1ZlRW5hYmxlKSB7XG5cdFx0YXdhaXQgbXcubG9hZGVyLnVzaW5nKCdleHQudmlzdWFsRWRpdG9yLmNvcmUnKTtcblx0fVxuXG5cdGlmICghKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50KSkge1xuXHRcdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL2hpZ2hsaWdodCcpO1xuXHR9XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsb0JBQUEsQ0FBQTtBQUFBLElBTUFDO0FBTkEsSUFBQUMsaUJBQUFDLE1BQUE7RUFBQSxnREFBQTtBQUFBO0FBTUFGLHlCQUEwQkcsUUFBQSxpQkFBQTtJQU4xQjs7Ozs7QUFRQSxLQUFDQyxhQUFZO0FBQ1osWUFBTTtRQUFDQztNQUFJLElBQUlDLElBQ2Q7UUFBQ0M7TUFBSSxJQUFJRjtBQUNWLFVBQUlFLFNBQUEsUUFBQUEsU0FBQSxVQUFBQSxLQUFNQyxTQUFTO0FBQ2xCO01BQ0Q7QUFDQSxZQUFNQSxVQUFVO0FBQ2hCSCxXQUFLLE1BQU0sSUFBSTtRQUFDRztRQUFTQyxXQUFXO1FBQU8sR0FBR0Y7TUFBSTtBQUdsRCxZQUFNRyxNQUFNLDRCQUNYQyxTQUFBLGtDQUFBQyxPQUEyQ1AsS0FBSyxNQUFNLEVBQUVJLGFBQWEsVUFBUSxpQkFBQSxHQUM3RUksV0FBVztBQUVaLE9BQUFULFVBQUFVLFFBQU9DLGdCQUFQWCxRQUFPVyxjQUFnQixJQUFJQyxRQUFTQyxhQUFZO0FBQy9DLGNBQU1DLFNBQVNDLFNBQVNDLGNBQWMsUUFB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TCxhQUFtQztBQUNuQyxTQUFLbUUsa0JBQWtCO0FBQ3ZCLFVBQU07TUFBQ007TUFBVUM7SUFBVyxJQUFJekosR0FBRzBCLE9BQU9DLElBQUk7QUFDOUMsUUFBSTZILGFBQWEsVUFBVSxDQUFDQyxhQUFhO0FBQ3hDO0lBQ0Q7QUFFQSxVQUFNO01BQUMsdUJBQXVCQztJQUFVLElBQUkxSixHQUFHb0osS0FBS0MsUUFBUTFILElBQUk7QUFHaEUsUUFBSStILFlBQVk7QUFDZixZQUFNMUosR0FBR3dELE9BQU9DLE1BQU0sdUJBQXVCO0lBQzlDO0FBRUEsUUFBSSxFQUFFLGtCQUFrQjVDLFdBQVc7QUFDbEMsWUFBTUgsUUFBQUMsUUFBQSxFQUFBZ0osS0FBQSxPQUFBaEssZUFBQSxHQUFBRixrQkFBQTtJQUNQO0VBQ0QsQ0FBQTtBQUFBLFdBakJnQm1LLG9CQUFBO0FBQUEsV0FBQUMsbUJBQUEvRSxNQUFBLE1BQUFDLFNBQUE7RUFBQTtBQUFBLFNBQUE2RTtBQUFBLEdBQUEsRUFpQmI7IiwKICAibmFtZXMiOiBbImhpZ2hsaWdodF9leHBvcnRzIiwgImltcG9ydF9leHRfZ2FkZ2V0MiIsICJpbml0X2hpZ2hsaWdodCIsICJfX2VzbSIsICJyZXF1aXJlIiwgIl93aW5kb3ciLCAibGlicyIsICJtdyIsICJ3cGhsIiwgInZlcnNpb24iLCAiY21WZXJzaW9uIiwgIkNETiIsICJNV19DRE4iLCAiY29uY2F0IiwgIlJFUE9fQ0ROIiwgIndpbmRvdyIsICJDb2RlTWlycm9yNiIsICJQcm9taXNlIiwgInJlc29sdmUiLCAic2NyaXB0IiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJ0eXBlIiwgInNyYyIsICJoZWFkIiwgImFwcGVuZCIsICJ3Z1BhZ2VOYW1lIiwgInBhZ2UiLCAid2dOYW1lc3BhY2VOdW1iZXIiLCAibnMiLCAid2dQYWdlQ29udGVudE1vZGVsIiwgImNvbnRlbnRtb2RlbCIsICJjb25maWciLCAiZ2V0IiwgIkNPTlRFTlRNT0RFTFMiLCAid2lraXRleHQiLCAiRVhUUyIsICJjc3MiLCAianMiLCAianNvbiIsICJOQU1FU1BBQ0VTIiwgImdldE9iamVjdCIsICJrZXkiLCAiSlNPTiIsICJwYXJzZSIsICJTdHJpbmciLCAibG9jYWxTdG9yYWdlIiwgImdldEl0ZW0iLCAiZ2V0UGFnZU1vZGUiLCAiX3JlZiIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJ2YWx1ZSIsICJfV2lraXBsdXNQYWdlcyIsICJwYWdlcyIsICJPYmplY3QiLCAidmFsdWVzIiwgImZpbHRlciIsICJzZWN0aW9uQ2FjaGUiLCAiaW5jbHVkZXMiLCAic29tZSIsICJ0aXRsZSIsICJlbmRzV2l0aCIsICJsb2FkZXIiLCAidXNpbmciLCAibW9kZXMiLCAidW5pcXVlQXJyYXkiLCAibWFwIiwgIl90JGdldEV4dGVuc2lvbiIsICJ0IiwgIlRpdGxlIiwgIm5hbWVzcGFjZSIsICJnZXROYW1lc3BhY2VJZCIsICJtb2RlIiwgImdldEV4dGVuc2lvbiIsICJ0b0xvd2VyQ2FzZSIsICJsZW5ndGgiLCAiT08iLCAidWkiLCAiY29uZmlybSIsICJtc2ciLCAiYWN0aW9ucyIsICJsYWJlbCIsICJhY3Rpb24iLCAiX3giLCAiYXBwbHkiLCAiYXJndW1lbnRzIiwgInJlbmRlckVkaXRvciIsICJfcmVmMiIsICIkdGFyZ2V0IiwgInNldHRpbmciLCAiY20iLCAiZnJvbVRleHRBcmVhIiwgInZhbCIsICJ2aWV3IiwgImRvbSIsICJpZCIsICJxdWVyeVNlbGVjdG9yIiwgImhyZWYiLCAic2V0dGluZ3MiLCAiZXNjVG9FeGl0UXVpY2tFZGl0IiwgInN1Ym1pdCIsICJkaXNwYXRjaEV2ZW50IiwgIk1vdXNlRXZlbnQiLCAic3VibWl0TWlub3IiLCAiY2hlY2tlZCIsICJlc2NhcGVFZGl0IiwgImV4dHJhS2V5cyIsICJydW4iLCAib2xkS2V5IiwgIm9sZFByZWZzIiwgIm1hcHBpbmciLCAiYWN0aXZlTGluZSIsICJ0cmFpbGluZ3NwYWNlIiwgIm1hdGNoQnJhY2tldHMiLCAiY2xvc2VCcmFja2V0cyIsICJtYXRjaFRhZ3MiLCAiZm9sZCIsICJ3aWtpRWRpdG9yIiwgImVzY2FwZSIsICJjb250ZXh0bWVudSIsICJsaW50IiwgInJlbW92ZUl0ZW0iLCAib2JqIiwgIl9pdGVyYXRvciIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcCIsICJzIiwgIm4iLCAiZG9uZSIsICJrIiwgImVyciIsICJlIiwgImYiLCAicHJlZmVyIiwgIl94MiIsICJfeDMiLCAib2JzZXJ2ZXIiLCAiTXV0YXRpb25PYnNlcnZlciIsICJyZWNvcmRzIiwgIiRlZGl0QXJlYSIsICIkIiwgImZsYXRNYXAiLCAiYWRkZWROb2RlcyIsICJmaW5kIiwgImF0dHIiLCAib2JzZXJ2ZSIsICJib2R5IiwgImNoaWxkTGlzdCIsICJsb2FkIiwgImltcG9ydF9leHRfZ2FkZ2V0IiwgImFwaSIsICJpbml0TXdBcGkiLCAiY2hlY2tEZXBlbmRlbmNpZXMiLCAiX3JlZjMiLCAidXNlciIsICJvcHRpb25zIiwgInBvc3RXaXRoRWRpdFRva2VuIiwgImNoYW5nZSIsICJ3Z0FjdGlvbiIsICJ3Z0lzQXJ0aWNsZSIsICJpc1ZlRW5hYmxlIiwgInRoZW4iLCAiV2lraXBsdXNIaWdobGlnaHQiLCAiX1dpa2lwbHVzSGlnaGxpZ2h0Il0KfQo= |
2024年5月31日 (五) 16:02的最新版本
/**
* SPDX-License-Identifier: CC-BY-SA-4.0
* _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}'
*
* @source {@link https://github.com/TopRealm/YsArchives-Gadgets/tree/master/src/Wikiplus-highlight}
* @license CC-BY-SA-4.0 {@link https://youshou.wiki/wiki/H:CC-BY-SA-4.0}
*/
/**
* +------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* +------------------------------------------------------------+
* | All changes should be made in the repository, |
* | otherwise they will be lost. |
* +------------------------------------------------------------+
* | Changes to this page may affect many users. |
* | Please discuss changes by opening an issue before editing. |
* +------------------------------------------------------------+
*/
/* <nowiki> */
(() => {
"use strict";
// dist/Wikiplus-highlight/Wikiplus-highlight.js
function _createForOfIteratorHelper(r, e) {
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
if (!t) {
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
t && (r = t);
var n = 0, F = function() {
};
return { s: F, n: function() {
return n >= r.length ? { done: true } : { done: false, value: r[n++] };
}, e: function(r2) {
throw r2;
}, f: F };
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var o, a = true, u = false;
return { s: function() {
t = t.call(r);
}, n: function() {
var r2 = t.next();
return a = r2.done, r2;
}, e: function(r2) {
u = true, o = r2;
}, f: function() {
try {
a || null == t.return || t.return();
} finally {
if (u) throw o;
}
} };
}
function _unsupportedIterableToArray(r, a) {
if (r) {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
var t = {}.toString.call(r).slice(8, -1);
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
}
function _arrayLikeToArray(r, a) {
(null == a || a > r.length) && (a = r.length);
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
return n;
}
function asyncGeneratorStep(n, t, e, r, o, a, c) {
try {
var i = n[a](c), u = i.value;
} catch (n2) {
return void e(n2);
}
i.done ? t(u) : Promise.resolve(u).then(r, o);
}
function _asyncToGenerator(n) {
return function() {
var t = this, e = arguments;
return new Promise(function(r, o) {
var a = n.apply(t, e);
function _next(n2) {
asyncGeneratorStep(a, r, o, _next, _throw, "next", n2);
}
function _throw(n2) {
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n2);
}
_next(void 0);
});
};
}
var __getOwnPropNames = Object.getOwnPropertyNames;
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
//! src/Wikiplus-highlight/modules/highlight.ts
var highlight_exports = {};
var import_ext_gadget2;
var init_highlight = __esm({
"src/Wikiplus-highlight/modules/highlight.ts"() {
"use strict";
import_ext_gadget2 = require("ext.gadget.Util");
/**
* @name Wikiplus-highlight Wikiplus编辑器的CodeMirror语法高亮扩展
* @author Bhsd <https://github.com/bhsd-harry>
* @license GPL-3.0
*/
((_window) => {
const {
libs
} = mw, {
wphl
} = libs;
if (wphl !== null && wphl !== void 0 && wphl.version) {
return;
}
const version = "3.0.7";
libs["wphl"] = {
version,
cmVersion: "2.9",
...wphl
};
const CDN = "//testingcf.jsdelivr.net", MW_CDN = "npm/@bhsd/codemirror-mediawiki@".concat(libs["wphl"].cmVersion || "latest", "/dist/mw.min.js"), REPO_CDN = "npm/wikiplus-highlight";
(_window = window).CodeMirror6 || (_window.CodeMirror6 = new Promise((resolve) => {
const script = document.createElement("script");
script.addEventListener("load", () => {
resolve(CodeMirror6);
});
script.type = "module";
script.src = "".concat(CDN, "/").concat(MW_CDN);
document.head.append(script);
}));
const {
wgPageName: page,
wgNamespaceNumber: ns,
wgPageContentModel: contentmodel
} = mw.config.get();
const CONTENTMODELS = {
"sanitized-css": "css",
wikitext: "mediawiki"
}, EXTS = {
css: "css",
js: "javascript",
json: "json"
}, NAMESPACES = {
828: "lua",
274: "html"
};
const getObject = (key) => {
return JSON.parse(String(localStorage.getItem(key)));
};
const getPageMode = /* @__PURE__ */ function() {
var _ref = _asyncToGenerator(function* (value) {
if (typeof _WikiplusPages === "object") {
const pages = Object.values(_WikiplusPages).filter(({
sectionCache
}) => {
return Object.values(sectionCache).includes(value);
});
if (pages.some(({
title
}) => {
return !title.endsWith("/doc");
})) {
yield mw.loader.using("mediawiki.Title");
}
const modes = (0, import_ext_gadget2.uniqueArray)(
// Replace `new Set()` to avoid polyfilling core-js
pages.map(({
title
}) => {
var _t$getExtension;
if (title.endsWith("/doc")) {
return "template";
}
const t = new mw.Title(title), namespace = t.getNamespaceId();
if (namespace % 2) {
return "mediawiki";
}
const mode = EXTS[((_t$getExtension = t.getExtension()) === null || _t$getExtension === void 0 ? void 0 : _t$getExtension.toLowerCase()) || ""] || NAMESPACES[namespace];
if (mode) {
return mode === "javascript" && (namespace === 8 || namespace === 2300) ? "gadget" : mode;
}
return namespace === 10 || namespace === 2 ? "template" : "mediawiki";
})
);
if (modes.length === 1) {
const [mode] = modes;
if (mode === "gadget") {
return ["javascript", 8];
}
return mode === "template" ? ["mediawiki", 10] : [mode];
} else if (modes.length === 2) {
if (modes.includes("javascript") && modes.includes("gadget")) {
return ["javascript"];
} else if (modes.includes("mediawiki") && modes.includes("template")) {
return ["mediawiki"];
}
}
}
if (ns !== 274 && contentmodel !== "Scribunto" || page.endsWith("/doc")) {
return [CONTENTMODELS[contentmodel] || contentmodel, contentmodel === "javascript" ? ns : void 0];
}
yield mw.loader.using("oojs-ui-windows");
if (yield OO.ui.confirm(mw.msg("cm-mw-contentmodel"), {
actions: [{
label: ns === 274 ? "Widget" : "Lua"
}, {
label: "Wikitext",
action: "accept"
}]
})) {
return ["mediawiki"];
}
return [ns === 274 ? "html" : "lua"];
});
return function getPageMode2(_x) {
return _ref.apply(this, arguments);
};
}();
const renderEditor = /* @__PURE__ */ function() {
var _ref2 = _asyncToGenerator(function* ($target, setting) {
const cm = yield (yield CodeMirror6).fromTextArea($target[0], ...setting ? ["json"] : yield getPageMode($target.val()));
if (cm.view) {
cm.view.dom.id = "Wikiplus-CodeMirror";
}
document.querySelector("#Wikiplus-Quickedit-Jump > a").href = "#Wikiplus-CodeMirror";
if (!setting) {
const settings = getObject("Wikiplus_Settings"), escToExitQuickEdit = settings && (settings["esc_to_exit_quickedit"] || settings["escToExitQuickEdit"]), submit = (
/** 提交编辑 @return true */
() => {
document.querySelector("#Wikiplus-Quickedit-Submit").dispatchEvent(new MouseEvent("click"));
return true;
}
), submitMinor = (
/** 提交小编辑 */
() => {
document.querySelector("#Wikiplus-Quickedit-MinorEdit").checked = true;
return submit();
}
), escapeEdit = (
/** 按下Esc键退出编辑 */
() => {
document.querySelector("#Wikiplus-Quickedit-Back").dispatchEvent(new MouseEvent("click"));
return true;
}
);
cm.extraKeys([{
key: "Mod-S",
run: submit
}, {
key: "Shift-Mod-S",
run: submitMinor
}, ...escToExitQuickEdit === true || escToExitQuickEdit === "true" ? [{
key: "Esc",
run: escapeEdit
}] : []]);
}
const oldKey = "Wikiplus-highlight-addons", oldPrefs = getObject(oldKey), mapping = {
activeLine: "highlightActiveLine",
trailingspace: "highlightTrailingWhitespace",
matchBrackets: "bracketMatching",
closeBrackets: "closeBrackets",
matchTags: "tagMatching",
fold: "codeFolding",
wikiEditor: "wikiEditor",
escape: "escape",
contextmenu: "openLinks",
lint: "lint"
};
localStorage.removeItem(oldKey);
if (oldPrefs) {
const obj = {};
var _iterator = _createForOfIteratorHelper(oldPrefs), _step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
const k = _step.value;
if (k in mapping) {
obj[mapping[k]] = true;
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
cm.prefer(obj);
}
});
return function renderEditor2(_x2, _x3) {
return _ref2.apply(this, arguments);
};
}();
const observer = new MutationObserver((records) => {
const $editArea = $(records.flatMap(({
addedNodes
}) => {
return [...addedNodes];
})).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input");
if ($editArea.length > 0) {
void renderEditor($editArea, $editArea.attr("id") === "Wikiplus-Setting-Input");
}
});
observer.observe(document.body, {
childList: true
});
mw.loader.load("".concat(CDN, "/").concat(REPO_CDN, "@").concat(version, "/styles.min.css"), "text/css");
})();
}
});
//! src/Wikiplus-highlight/modules/api.ts
var import_ext_gadget = require("ext.gadget.Util");
var api = (0, import_ext_gadget.initMwApi)("Wikiplus-highlight/2.0");
//! src/Wikiplus-highlight/modules/checkDependencies.ts
var checkDependencies = /* @__PURE__ */ function() {
var _ref3 = _asyncToGenerator(function* () {
if (!mw.user.options.get("gadget-Wikiplus")) {
void api.postWithEditToken({
action: "options",
change: "gadget-Wikiplus=1"
});
yield mw.loader.using("ext.gadget.Wikiplus");
}
});
return function checkDependencies2() {
return _ref3.apply(this, arguments);
};
}();
//! src/Wikiplus-highlight/Wikiplus-highlight.ts
(function() {
var _WikiplusHighlight = _asyncToGenerator(function* () {
void checkDependencies();
const {
wgAction,
wgIsArticle
} = mw.config.get();
if (wgAction !== "view" || !wgIsArticle) {
return;
}
const {
"visualeditor-enable": isVeEnable
} = mw.user.options.get();
if (isVeEnable) {
yield mw.loader.using("ext.visualEditor.core");
}
if (!("ontouchstart" in document)) {
yield Promise.resolve().then(() => (init_highlight(), highlight_exports));
}
});
function WikiplusHighlight() {
return _WikiplusHighlight.apply(this, arguments);
}
return WikiplusHighlight;
})()();
})();
/* </nowiki> */
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL1dpa2lwbHVzLWhpZ2hsaWdodC9tb2R1bGVzL2hpZ2hsaWdodC50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L21vZHVsZXMvYXBpLnRzIiwgInNyYy9XaWtpcGx1cy1oaWdobGlnaHQvbW9kdWxlcy9jaGVja0RlcGVuZGVuY2llcy50cyIsICJzcmMvV2lraXBsdXMtaGlnaGxpZ2h0L1dpa2lwbHVzLWhpZ2hsaWdodC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbmFtZSBXaWtpcGx1cy1oaWdobGlnaHQgV2lraXBsdXPnvJbovpHlmajnmoRDb2RlTWlycm9y6K+t5rOV6auY5Lqu5omp5bGVXG4gKiBAYXV0aG9yIEJoc2QgPGh0dHBzOi8vZ2l0aHViLmNvbS9iaHNkLWhhcnJ5PlxuICogQGxpY2Vuc2UgR1BMLTMuMFxuICovXG5cbmltcG9ydCB7dW5pcXVlQXJyYXl9IGZyb20gJ2V4dC5nYWRnZXQuVXRpbCc7XG5cbigoKTogdm9pZCA9PiB7XG5cdGNvbnN0IHtsaWJzfSA9IG13LFxuXHRcdHt3cGhsfSA9IGxpYnM7XG5cdGlmICh3cGhsPy52ZXJzaW9uKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHZlcnNpb24gPSAnMy4wLjcnO1xuXHRsaWJzWyd3cGhsJ10gPSB7dmVyc2lvbiwgY21WZXJzaW9uOiAnMi45JywgLi4ud3BobH07IC8vIOW8gOWni+WKoOi9vVxuXG5cdC8vIOi3r+W+hFxuXHRjb25zdCBDRE4gPSAnLy90ZXN0aW5nY2YuanNkZWxpdnIubmV0Jyxcblx0XHRNV19DRE4gPSBgbnBtL0BiaHNkL2NvZGVtaXJyb3ItbWVkaWF3aWtpQCR7bGlic1snd3BobCddLmNtVmVyc2lvbiB8fCAnbGF0ZXN0J30vZGlzdC9tdy5taW4uanNgLFxuXHRcdFJFUE9fQ0ROID0gJ25wbS93aWtpcGx1cy1oaWdobGlnaHQnO1xuXG5cdHdpbmRvdy5Db2RlTWlycm9yNiB8fD0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblx0XHRzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcblx0XHRcdHJlc29sdmUoQ29kZU1pcnJvcjYpO1xuXHRcdH0pO1xuXHRcdHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG5cdFx0c2NyaXB0LnNyYyA9IGAke0NETn0vJHtNV19DRE59YDtcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChzY3JpcHQpO1xuXHR9KTtcblxuXHRjb25zdCB7d2dQYWdlTmFtZTogcGFnZSwgd2dOYW1lc3BhY2VOdW1iZXI6IG5zLCB3Z1BhZ2VDb250ZW50TW9kZWw6IGNvbnRlbnRtb2RlbH0gPSBtdy5jb25maWcuZ2V0KCk7XG5cblx0Y29uc3QgQ09OVEVOVE1PREVMUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcblx0XHRcdCdzYW5pdGl6ZWQtY3NzJzogJ2NzcycsXG5cdFx0XHR3aWtpdGV4dDogJ21lZGlhd2lraScsXG5cdFx0fSxcblx0XHRFWFRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0Y3NzOiAnY3NzJyxcblx0XHRcdGpzOiAnamF2YXNjcmlwdCcsXG5cdFx0XHRqc29uOiAnanNvbicsXG5cdFx0fSxcblx0XHROQU1FU1BBQ0VTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuXHRcdFx0ODI4OiAnbHVhJyxcblx0XHRcdDI3NDogJ2h0bWwnLFxuXHRcdH07XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3QgZ2V0T2JqZWN0ID0gKGtleTogc3RyaW5nKTogYW55ID0+IHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShTdHJpbmcobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiDmo4Dmn6XpobXpnaLor63oqIDnsbvlnotcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIOmhtemdouWGheWuuVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlfVxuXHQgKi9cblx0Y29uc3QgZ2V0UGFnZU1vZGUgPSBhc3luYyAodmFsdWU6IHN0cmluZyk6IFByb21pc2U8W3N0cmluZywgKG51bWJlciB8IHVuZGVmaW5lZCk/XT4gPT4ge1xuXHRcdGlmICh0eXBlb2YgX1dpa2lwbHVzUGFnZXMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRjb25zdCBwYWdlcyA9IE9iamVjdC52YWx1ZXMoX1dpa2lwbHVzUGFnZXMpLmZpbHRlcigoe3NlY3Rpb25DYWNoZX0pID0+IHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC52YWx1ZXMoc2VjdGlvbkNhY2hlKS5pbmNsdWRlcyh2YWx1ZSk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChcblx0XHRcdFx0cGFnZXMuc29tZSgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAhdGl0bGUuZW5kc1dpdGgoJy9kb2MnKTtcblx0XHRcdFx0fSlcblx0XHRcdCkge1xuXHRcdFx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ21lZGlhd2lraS5UaXRsZScpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbW9kZXMgPSB1bmlxdWVBcnJheShcblx0XHRcdFx0Ly8gUmVwbGFjZSBgbmV3IFNldCgpYCB0byBhdm9pZCBwb2x5ZmlsbGluZyBjb3JlLWpzXG5cdFx0XHRcdHBhZ2VzLm1hcCgoe3RpdGxlfSkgPT4ge1xuXHRcdFx0XHRcdGlmICh0aXRsZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ3RlbXBsYXRlJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdCA9IG5ldyBtdy5UaXRsZSh0aXRsZSksXG5cdFx0XHRcdFx0XHRuYW1lc3BhY2UgPSB0LmdldE5hbWVzcGFjZUlkKCk7XG5cdFx0XHRcdFx0aWYgKG5hbWVzcGFjZSAlIDIpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnbWVkaWF3aWtpJztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgbW9kZSA9IEVYVFNbdC5nZXRFeHRlbnNpb24oKT8udG9Mb3dlckNhc2UoKSB8fCAnJ10gfHwgTkFNRVNQQUNFU1tuYW1lc3BhY2VdO1xuXHRcdFx0XHRcdGlmIChtb2RlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ2phdmFzY3JpcHQnICYmIChuYW1lc3BhY2UgPT09IDggfHwgbmFtZXNwYWNlID09PSAyMzAwKSA/ICdnYWRnZXQnIDogbW9kZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG5hbWVzcGFjZSA9PT0gMTAgfHwgbmFtZXNwYWNlID09PSAyID8gJ3RlbXBsYXRlJyA6ICdtZWRpYXdpa2knO1xuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHRcdGlmIChtb2Rlcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0Y29uc3QgW21vZGVdID0gbW9kZXM7XG5cdFx0XHRcdGlmIChtb2RlID09PSAnZ2FkZ2V0Jykge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnLCA4XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbW9kZSA9PT0gJ3RlbXBsYXRlJyA/IFsnbWVkaWF3aWtpJywgMTBdIDogW21vZGUhXTtcblx0XHRcdH0gZWxzZSBpZiAobW9kZXMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGlmIChtb2Rlcy5pbmNsdWRlcygnamF2YXNjcmlwdCcpICYmIG1vZGVzLmluY2x1ZGVzKCdnYWRnZXQnKSkge1xuXHRcdFx0XHRcdHJldHVybiBbJ2phdmFzY3JpcHQnXTtcblx0XHRcdFx0fSBlbHNlIGlmIChtb2Rlcy5pbmNsdWRlcygnbWVkaWF3aWtpJykgJiYgbW9kZXMuaW5jbHVkZXMoJ3RlbXBsYXRlJykpIHtcblx0XHRcdFx0XHRyZXR1cm4gWydtZWRpYXdpa2knXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoKG5zICE9PSAyNzQgJiYgY29udGVudG1vZGVsICE9PSAnU2NyaWJ1bnRvJykgfHwgcGFnZS5lbmRzV2l0aCgnL2RvYycpKSB7XG5cdFx0XHRyZXR1cm4gW0NPTlRFTlRNT0RFTFNbY29udGVudG1vZGVsXSB8fCBjb250ZW50bW9kZWwsIGNvbnRlbnRtb2RlbCA9PT0gJ2phdmFzY3JpcHQnID8gbnMgOiB1bmRlZmluZWRdO1xuXHRcdH1cblx0XHRhd2FpdCBtdy5sb2FkZXIudXNpbmcoJ29vanMtdWktd2luZG93cycpO1xuXHRcdGlmIChcblx0XHRcdGF3YWl0IE9PLnVpLmNvbmZpcm0obXcubXNnKCdjbS1tdy1jb250ZW50bW9kZWwnKSwge1xuXHRcdFx0XHRhY3Rpb25zOiBbe2xhYmVsOiBucyA9PT0gMjc0ID8gJ1dpZGdldCcgOiAnTHVhJ30sIHtsYWJlbDogJ1dpa2l0ZXh0JywgYWN0aW9uOiAnYWNjZXB0J31dLFxuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdHJldHVybiBbJ21lZGlhd2lraSddO1xuXHRcdH1cblx0XHRyZXR1cm4gW25zID09PSAyNzQgPyAnaHRtbCcgOiAnbHVhJ107XG5cdH07XG5cblx0LyoqXG5cdCAqIOa4suafk+e8lui+keWZqFxuXHQgKlxuXHQgKiBAcGFyYW0ge0pRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Pn0gJHRhcmdldCDnm67moIfnvJbovpHmoYZcblx0ICogQHBhcmFtIHtib29sZWFufSBzZXR0aW5nIOaYr+WQpuaYr1dpa2lwbHVz6K6+572u77yI5L2/55SoanNvbuivreazle+8iVxuXHQgKi9cblx0Y29uc3QgcmVuZGVyRWRpdG9yID0gYXN5bmMgKCR0YXJnZXQ6IEpRdWVyeTxIVE1MVGV4dEFyZWFFbGVtZW50Piwgc2V0dGluZzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdGNvbnN0IGNtID0gYXdhaXQgKFxuXHRcdFx0YXdhaXQgQ29kZU1pcnJvcjZcblx0XHQpLmZyb21UZXh0QXJlYSgkdGFyZ2V0WzBdISwgLi4uKHNldHRpbmcgPyAoWydqc29uJ10gYXMgW3N0cmluZ10pIDogYXdhaXQgZ2V0UGFnZU1vZGUoJHRhcmdldC52YWwoKSEpKSk7XG5cdFx0aWYgKGNtLnZpZXcpIHtcblx0XHRcdGNtLnZpZXcuZG9tLmlkID0gJ1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXHRcdH1cblxuXHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEFuY2hvckVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LUp1bXAgPiBhJykhLmhyZWYgPSAnI1dpa2lwbHVzLUNvZGVNaXJyb3InO1xuXG5cdFx0aWYgKCFzZXR0aW5nKSB7XG5cdFx0XHQvLyDmma7pgJpXaWtpcGx1c+e8lui+keWMulxuXHRcdFx0Y29uc3Qgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IGdldE9iamVjdCgnV2lraXBsdXNfU2V0dGluZ3MnKSxcblx0XHRcdFx0ZXNjVG9FeGl0UXVpY2tFZGl0ID0gc2V0dGluZ3MgJiYgKHNldHRpbmdzWydlc2NfdG9fZXhpdF9xdWlja2VkaXQnXSB8fCBzZXR0aW5nc1snZXNjVG9FeGl0UXVpY2tFZGl0J10pLFxuXHRcdFx0XHRzdWJtaXQgPSAvKiog5o+Q5Lqk57yW6L6RIEByZXR1cm4gdHJ1ZSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1TdWJtaXQnKSEuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1Ym1pdE1pbm9yID0gLyoqIOaPkOS6pOWwj+e8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PignI1dpa2lwbHVzLVF1aWNrZWRpdC1NaW5vckVkaXQnKSEuY2hlY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Ym1pdCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlc2NhcGVFZGl0ID0gLyoqIOaMieS4i0VzY+mUrumAgOWHuue8lui+kSAqLyAoKTogdHJ1ZSA9PiB7XG5cdFx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1dpa2lwbHVzLVF1aWNrZWRpdC1CYWNrJykhLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9O1xuXHRcdFx0Y20uZXh0cmFLZXlzKFtcblx0XHRcdFx0e2tleTogJ01vZC1TJywgcnVuOiBzdWJtaXR9LFxuXHRcdFx0XHR7a2V5OiAnU2hpZnQtTW9kLVMnLCBydW46IHN1Ym1pdE1pbm9yfSxcblx0XHRcdFx0Li4uKGVzY1RvRXhpdFF1aWNrRWRpdCA9PT0gdHJ1ZSB8fCBlc2NUb0V4aXRRdWlja0VkaXQgPT09ICd0cnVlJ1xuXHRcdFx0XHRcdD8gW3trZXk6ICdFc2MnLCBydW46IGVzY2FwZUVkaXR9XVxuXHRcdFx0XHRcdDogW10pLFxuXHRcdFx0XSk7XG5cdFx0fVxuXG5cdFx0LyoqIEB0b2RvIOS7peS4i+i/h+a4oeS7o+eggea3u+WKoOS6jjIwMjQtMDItMDfvvIzlsIbkuo7kuIDmrrXml7bpl7TlkI7lvIPnlKggKi9cblx0XHRjb25zdCBvbGRLZXkgPSAnV2lraXBsdXMtaGlnaGxpZ2h0LWFkZG9ucycsXG5cdFx0XHRvbGRQcmVmczogc3RyaW5nW10gfCBudWxsID0gZ2V0T2JqZWN0KG9sZEtleSksXG5cdFx0XHRtYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFx0XHRhY3RpdmVMaW5lOiAnaGlnaGxpZ2h0QWN0aXZlTGluZScsXG5cdFx0XHRcdHRyYWlsaW5nc3BhY2U6ICdoaWdobGlnaHRUcmFpbGluZ1doaXRlc3BhY2UnLFxuXHRcdFx0XHRtYXRjaEJyYWNrZXRzOiAnYnJhY2tldE1hdGNoaW5nJyxcblx0XHRcdFx0Y2xvc2VCcmFja2V0czogJ2Nsb3NlQnJhY2tldHMnLFxuXHRcdFx0XHRtYXRjaFRhZ3M6ICd0YWdNYXRjaGluZycsXG5cdFx0XHRcdGZvbGQ6ICdjb2RlRm9sZGluZycsXG5cdFx0XHRcdHdpa2lFZGl0b3I6ICd3aWtpRWRpdG9yJyxcblx0XHRcdFx0ZXNjYXBlOiAnZXNjYXBlJyxcblx0XHRcdFx0Y29udGV4dG1lbnU6ICdvcGVuTGlua3MnLFxuXHRcdFx0XHRsaW50OiAnbGludCcsXG5cdFx0XHR9O1xuXHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG9sZEtleSk7XG5cdFx0aWYgKG9sZFByZWZzKSB7XG5cdFx0XHRjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IGsgb2Ygb2xkUHJlZnMpIHtcblx0XHRcdFx0aWYgKGsgaW4gbWFwcGluZykge1xuXHRcdFx0XHRcdG9ialttYXBwaW5nW2tdIV0gPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNtLnByZWZlcihvYmopO1xuXHRcdH1cblx0fTtcblxuXHQvLyDnm5Hop4YgV2lraXBsdXMg57yW6L6R5qGGXG5cdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHJlY29yZHMpID0+IHtcblx0XHRjb25zdCAkZWRpdEFyZWEgPSAkKFxuXHRcdFx0cmVjb3Jkcy5mbGF0TWFwKCh7YWRkZWROb2Rlc30pID0+IHtcblx0XHRcdFx0cmV0dXJuIFsuLi5hZGRlZE5vZGVzXTtcblx0XHRcdH0pXG5cdFx0KS5maW5kPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KCcjV2lraXBsdXMtUXVpY2tlZGl0LCAjV2lraXBsdXMtU2V0dGluZy1JbnB1dCcpO1xuXHRcdGlmICgkZWRpdEFyZWEubGVuZ3RoID4gMCkge1xuXHRcdFx0dm9pZCByZW5kZXJFZGl0b3IoJGVkaXRBcmVhLCAkZWRpdEFyZWEuYXR0cignaWQnKSA9PT0gJ1dpa2lwbHVzLVNldHRpbmctSW5wdXQnKTtcblx0XHR9XG5cdH0pO1xuXHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtjaGlsZExpc3Q6IHRydWV9KTtcblxuXHRtdy5sb2FkZXIubG9hZChgJHtDRE59LyR7UkVQT19DRE59QCR7dmVyc2lvbn0vc3R5bGVzLm1pbi5jc3NgLCAndGV4dC9jc3MnKTtcbn0pKCk7XG5cbmV4cG9ydCB7fTtcbiIsICJpbXBvcnQge2luaXRNd0FwaX0gZnJvbSAnZXh0LmdhZGdldC5VdGlsJztcblxuY29uc3QgYXBpOiBtdy5BcGkgPSBpbml0TXdBcGkoJ1dpa2lwbHVzLWhpZ2hsaWdodC8yLjAnKTtcblxuZXhwb3J0IHthcGl9O1xuIiwgImltcG9ydCB7YXBpfSBmcm9tICcuL2FwaSc7XG5cbmNvbnN0IGNoZWNrRGVwZW5kZW5jaWVzID0gYXN5bmMgKCkgPT4ge1xuXHRpZiAoIW13LnVzZXIub3B0aW9ucy5nZXQoJ2dhZGdldC1XaWtpcGx1cycpKSB7XG5cdFx0dm9pZCBhcGkucG9zdFdpdGhFZGl0VG9rZW4oe1xuXHRcdFx0YWN0aW9uOiAnb3B0aW9ucycsXG5cdFx0XHRjaGFuZ2U6ICdnYWRnZXQtV2lraXBsdXM9MScsXG5cdFx0fSBhcyBBcGlPcHRpb25zUGFyYW1zKTtcblxuXHRcdGF3YWl0IG13LmxvYWRlci51c2luZygnZXh0LmdhZGdldC5XaWtpcGx1cycpO1xuXHR9XG59O1xuXG5leHBvcnQge2NoZWNrRGVwZW5kZW5jaWVzfTtcbiIsICJpbXBvcnQgJy4vV2lraXBsdXMtaGlnaGxpZ2h0Lmxlc3MnO1xuaW1wb3J0IHtjaGVja0RlcGVuZGVuY2llc30gZnJvbSAnLi9tb2R1bGVzL2NoZWNrRGVwZW5kZW5jaWVzJztcblxuKGFzeW5jIGZ1bmN0aW9uIFdpa2lwbHVzSGlnaGxpZ2h0KCkge1xuXHR2b2lkIGNoZWNrRGVwZW5kZW5jaWVzKCk7XG5cdGNvbnN0IHt3Z0FjdGlvbiwgd2dJc0FydGljbGV9ID0gbXcuY29uZmlnLmdldCgpO1xuXHRpZiAod2dBY3Rpb24gIT09ICd2aWV3JyB8fCAhd2dJc0FydGljbGUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB7J3Zpc3VhbGVkaXRvci1lbmFibGUnOiBpc1ZlRW5hYmxlfSA9IG13LnVzZXIub3B0aW9ucy5nZXQoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuXHQvKiBzZWUgPGh0dHBzOi8vZ2l0aHViLmNvbS9XaWtpcGx1cy9XaWtpcGx1cy9pc3N1ZXMvNjU+ICovXG5cdGlmIChpc1ZlRW5hYmxlKSB7XG5cdFx0YXdhaXQgbXcubG9hZGVyLnVzaW5nKCdleHQudmlzdWFsRWRpdG9yLmNvcmUnKTtcblx0fVxuXG5cdGlmICghKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50KSkge1xuXHRcdGF3YWl0IGltcG9ydCgnLi9tb2R1bGVzL2hpZ2hsaWdodCcpO1xuXHR9XG59KSgpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsb0JBQUEsQ0FBQTtBQUFBLElBTUFDO0FBTkEsSUFBQUMsaUJBQUFDLE1BQUE7RUFBQSxnREFBQTtBQUFBO0FBTUFGLHlCQUEwQkcsUUFBQSxpQkFBQTtJQU4xQjs7Ozs7QUFRQSxLQUFDQyxhQUFZO0FBQ1osWUFBTTtRQUFDQztNQUFJLElBQUlDLElBQ2Q7UUFBQ0M7TUFBSSxJQUFJRjtBQUNWLFVBQUlFLFNBQUEsUUFBQUEsU0FBQSxVQUFBQSxLQUFNQyxTQUFTO0FBQ2xCO01BQ0Q7QUFDQSxZQUFNQSxVQUFVO0FBQ2hCSCxXQUFLLE1BQU0sSUFBSTtRQUFDRztRQUFTQyxXQUFXO1FBQU8sR0FBR0Y7TUFBSTtBQUdsRCxZQUFNRyxNQUFNLDRCQUNYQyxTQUFBLGtDQUFBQyxPQUEyQ1AsS0FBSyxNQUFNLEVBQUVJLGFBQWEsVUFBUSxpQkFBQSxHQUM3RUksV0FBVztBQUVaLE9BQUFULFVBQUFVLFFBQU9DLGdCQUFQWCxRQUFPVyxjQUFnQixJQUFJQyxRQUFTQyxhQUFZO0FBQy9DLGNBQU1DLFNBQVNDLFNBQVNDLGNBQWMsUUFBUTtBQUM5Q0YsZUFBT0csaUJBQWlCLFFBQVEsTUFBTTtBQUNyQ0osa0JBQVFGLFdBQVc7UUFDcEIsQ0FBQztBQUNERyxlQUFPSSxPQUFPO0FBQ2RKLGVBQU9LLE1BQUEsR0FBQVgsT0FBU0YsS0FBRyxHQUFBLEVBQUFFLE9BQUlELE1BQU07QUFDN0JRLGlCQUFTSyxLQUFLQyxPQUFPUCxNQUFNO01BQzVCLENBQUM7QUFFRCxZQUFNO1FBQUNRLFlBQVlDO1FBQU1DLG1CQUFtQkM7UUFBSUMsb0JBQW9CQztNQUFZLElBQUl6QixHQUFHMEIsT0FBT0MsSUFBSTtBQUVsRyxZQUFNQyxnQkFBd0M7UUFDNUMsaUJBQWlCO1FBQ2pCQyxVQUFVO01BQ1gsR0FDQUMsT0FBK0I7UUFDOUJDLEtBQUs7UUFDTEMsSUFBSTtRQUNKQyxNQUFNO01BQ1AsR0FDQUMsYUFBcUM7UUFDcEMsS0FBSztRQUNMLEtBQUs7TUFDTjtBQUdELFlBQU1DLFlBQWFDLFNBQXFCO0FBQ3ZDLGVBQU9DLEtBQUtDLE1BQU1DLE9BQU9DLGFBQWFDLFFBQVFMLEdBQUcsQ0FBQyxDQUFDO01BQ3BEO0FBUUEsWUFBTU0sY0FBQSwyQkFBQTtBQUFBLFlBQUFDLE9BQUFDLGtCQUFjLFdBQU9DLE9BQTREO0FBQ3RGLGNBQUksT0FBT0MsbUJBQW1CLFVBQVU7QUFDdkMsa0JBQU1DLFFBQVFDLE9BQU9DLE9BQU9ILGNBQWMsRUFBRUksT0FBTyxDQUFDO2NBQUNDO1lBQVksTUFBTTtBQUN0RSxxQkFBT0gsT0FBT0MsT0FBT0UsWUFBWSxFQUFFQyxTQUFTUCxLQUFLO1lBQ2xELENBQUM7QUFDRCxnQkFDQ0UsTUFBTU0sS0FBSyxDQUFDO2NBQUNDO1lBQUssTUFBTTtBQUN2QixxQkFBTyxDQUFDQSxNQUFNQyxTQUFTLE1BQU07WUFDOUIsQ0FBQyxHQUNBO0FBQ0Qsb0JBQU12RCxHQUFHd0QsT0FBT0MsTUFBTSxpQkFBaUI7WUFDeEM7QUFDQSxrQkFBTUMsU0FBQSxHQUFRaEUsbUJBQUFpRTs7Y0FFYlosTUFBTWEsSUFBSSxDQUFDO2dCQUFDTjtjQUFLLE1BQU07QUFBQSxvQkFBQU87QUFDdEIsb0JBQUlQLE1BQU1DLFNBQVMsTUFBTSxHQUFHO0FBQzNCLHlCQUFPO2dCQUNSO0FBQ0Esc0JBQU1PLElBQUksSUFBSTlELEdBQUcrRCxNQUFNVCxLQUFLLEdBQzNCVSxZQUFZRixFQUFFRyxlQUFlO0FBQzlCLG9CQUFJRCxZQUFZLEdBQUc7QUFDbEIseUJBQU87Z0JBQ1I7QUFDQSxzQkFBTUUsT0FBT3BDLE9BQUsrQixrQkFBQUMsRUFBRUssYUFBYSxPQUFBLFFBQUFOLG9CQUFBLFNBQUEsU0FBZkEsZ0JBQWtCTyxZQUFZLE1BQUssRUFBRSxLQUFLbEMsV0FBVzhCLFNBQVM7QUFDaEYsb0JBQUlFLE1BQU07QUFDVCx5QkFBT0EsU0FBUyxpQkFBaUJGLGNBQWMsS0FBS0EsY0FBYyxRQUFRLFdBQVdFO2dCQUN0RjtBQUNBLHVCQUFPRixjQUFjLE1BQU1BLGNBQWMsSUFBSSxhQUFhO2NBQzNELENBQUM7WUFDRjtBQUNBLGdCQUFJTixNQUFNVyxXQUFXLEdBQUc7QUFDdkIsb0JBQU0sQ0FBQ0gsSUFBSSxJQUFJUjtBQUNmLGtCQUFJUSxTQUFTLFVBQVU7QUFDdEIsdUJBQU8sQ0FBQyxjQUFjLENBQUM7Y0FDeEI7QUFDQSxxQkFBT0EsU0FBUyxhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQ0EsSUFBSztZQUN4RCxXQUFXUixNQUFNVyxXQUFXLEdBQUc7QUFDOUIsa0JBQUlYLE1BQU1OLFNBQVMsWUFBWSxLQUFLTSxNQUFNTixTQUFTLFFBQVEsR0FBRztBQUM3RCx1QkFBTyxDQUFDLFlBQVk7Y0FDckIsV0FBV00sTUFBTU4sU0FBUyxXQUFXLEtBQUtNLE1BQU1OLFNBQVMsVUFBVSxHQUFHO0FBQ3JFLHVCQUFPLENBQUMsV0FBVztjQUNwQjtZQUNEO1VBQ0Q7QUFDQSxjQUFLN0IsT0FBTyxPQUFPRSxpQkFBaUIsZUFBZ0JKLEtBQUtrQyxTQUFTLE1BQU0sR0FBRztBQUMxRSxtQkFBTyxDQUFDM0IsY0FBY0gsWUFBWSxLQUFLQSxjQUFjQSxpQkFBaUIsZUFBZUYsS0FBSyxNQUFTO1VBQ3BHO0FBQ0EsZ0JBQU12QixHQUFHd0QsT0FBT0MsTUFBTSxpQkFBaUI7QUFDdkMsY0FBQSxNQUNPYSxHQUFHQyxHQUFHQyxRQUFReEUsR0FBR3lFLElBQUksb0JBQW9CLEdBQUc7WUFDakRDLFNBQVMsQ0FBQztjQUFDQyxPQUFPcEQsT0FBTyxNQUFNLFdBQVc7WUFBSyxHQUFHO2NBQUNvRCxPQUFPO2NBQVlDLFFBQVE7WUFBUSxDQUFDO1VBQ3hGLENBQUMsR0FDQTtBQUNELG1CQUFPLENBQUMsV0FBVztVQUNwQjtBQUNBLGlCQUFPLENBQUNyRCxPQUFPLE1BQU0sU0FBUyxLQUFLO1FBQ3BDLENBQUE7QUFBQSxlQUFBLFNBeERNbUIsYUFBQW1DLElBQUE7QUFBQSxpQkFBQWxDLEtBQUFtQyxNQUFBLE1BQUFDLFNBQUE7UUFBQTtNQUFBLEVBQUE7QUFnRU4sWUFBTUMsZUFBQSwyQkFBQTtBQUFBLFlBQUFDLFFBQUFyQyxrQkFBZSxXQUFPc0MsU0FBc0NDLFNBQW9DO0FBQ3JHLGdCQUFNQyxLQUFBLE9BQUssTUFDSjNFLGFBQ0w0RSxhQUFhSCxRQUFRLENBQUMsR0FBSSxHQUFJQyxVQUFXLENBQUMsTUFBTSxJQUFBLE1BQXVCekMsWUFBWXdDLFFBQVFJLElBQUksQ0FBRSxDQUFFO0FBQ3JHLGNBQUlGLEdBQUdHLE1BQU07QUFDWkgsZUFBR0csS0FBS0MsSUFBSUMsS0FBSztVQUNsQjtBQUVBNUUsbUJBQVM2RSxjQUFpQyw4QkFBOEIsRUFBR0MsT0FBTztBQUVsRixjQUFJLENBQUNSLFNBQVM7QUFFYixrQkFBTVMsV0FBMkN6RCxVQUFVLG1CQUFtQixHQUM3RTBELHFCQUFxQkQsYUFBYUEsU0FBUyx1QkFBdUIsS0FBS0EsU0FBUyxvQkFBb0IsSUFDcEdFOztjQUFrQ0EsTUFBWTtBQUM3Q2pGLHlCQUFTNkUsY0FBYyw0QkFBNEIsRUFBR0ssY0FBYyxJQUFJQyxXQUFXLE9BQU8sQ0FBQztBQUMzRix1QkFBTztjQUNSO2VBQ0FDOztjQUEyQkEsTUFBWTtBQUN0Q3BGLHlCQUFTNkUsY0FBZ0MsK0JBQStCLEVBQUdRLFVBQVU7QUFDckYsdUJBQU9KLE9BQU87Y0FDZjtlQUNBSzs7Y0FBK0JBLE1BQVk7QUFDMUN0Rix5QkFBUzZFLGNBQWMsMEJBQTBCLEVBQUdLLGNBQWMsSUFBSUMsV0FBVyxPQUFPLENBQUM7QUFDekYsdUJBQU87Y0FDUjs7QUFDRFosZUFBR2dCLFVBQVUsQ0FDWjtjQUFDaEUsS0FBSztjQUFTaUUsS0FBS1A7WUFBTSxHQUMxQjtjQUFDMUQsS0FBSztjQUFlaUUsS0FBS0o7WUFBVyxHQUNyQyxHQUFJSix1QkFBdUIsUUFBUUEsdUJBQXVCLFNBQ3ZELENBQUM7Y0FBQ3pELEtBQUs7Y0FBT2lFLEtBQUtGO1lBQVUsQ0FBQyxJQUM5QixDQUFBLENBQUMsQ0FDSjtVQUNGO0FBR0EsZ0JBQU1HLFNBQVMsNkJBQ2RDLFdBQTRCcEUsVUFBVW1FLE1BQU0sR0FDNUNFLFVBQWtDO1lBQ2pDQyxZQUFZO1lBQ1pDLGVBQWU7WUFDZkMsZUFBZTtZQUNmQyxlQUFlO1lBQ2ZDLFdBQVc7WUFDWEMsTUFBTTtZQUNOQyxZQUFZO1lBQ1pDLFFBQVE7WUFDUkMsYUFBYTtZQUNiQyxNQUFNO1VBQ1A7QUFDRDFFLHVCQUFhMkUsV0FBV2IsTUFBTTtBQUM5QixjQUFJQyxVQUFVO0FBQ2Isa0JBQU1hLE1BQTRCLENBQUM7QUFBQSxnQkFBQUMsWUFBQUMsMkJBQ25CZixRQUFBLEdBQUFnQjtBQUFBLGdCQUFBO0FBQWhCLG1CQUFBRixVQUFBRyxFQUFBLEdBQUEsRUFBQUQsUUFBQUYsVUFBQUksRUFBQSxHQUFBQyxRQUEwQjtBQUFBLHNCQUFmQyxJQUFBSixNQUFBMUU7QUFDVixvQkFBSThFLEtBQUtuQixTQUFTO0FBQ2pCWSxzQkFBSVosUUFBUW1CLENBQUMsQ0FBRSxJQUFJO2dCQUNwQjtjQUNEO1lBQUEsU0FBQUMsS0FBQTtBQUFBUCx3QkFBQVEsRUFBQUQsR0FBQTtZQUFBLFVBQUE7QUFBQVAsd0JBQUFTLEVBQUE7WUFBQTtBQUVBMUMsZUFBRzJDLE9BQU9YLEdBQUc7VUFDZDtRQUNELENBQUE7QUFBQSxlQUFBLFNBN0RNcEMsY0FBQWdELEtBQUFDLEtBQUE7QUFBQSxpQkFBQWhELE1BQUFILE1BQUEsTUFBQUMsU0FBQTtRQUFBO01BQUEsRUFBQTtBQWdFTixZQUFNbUQsV0FBVyxJQUFJQyxpQkFBa0JDLGFBQVk7QUFDbEQsY0FBTUMsWUFBWUMsRUFDakJGLFFBQVFHLFFBQVEsQ0FBQztVQUFDQztRQUFVLE1BQU07QUFDakMsaUJBQU8sQ0FBQyxHQUFHQSxVQUFVO1FBQ3RCLENBQUMsQ0FDRixFQUFFQyxLQUEwQiw4Q0FBOEM7QUFDMUUsWUFBSUosVUFBVWhFLFNBQVMsR0FBRztBQUN6QixlQUFLVyxhQUFhcUQsV0FBV0EsVUFBVUssS0FBSyxJQUFJLE1BQU0sd0JBQXdCO1FBQy9FO01BQ0QsQ0FBQztBQUNEUixlQUFTUyxRQUFROUgsU0FBUytILE1BQU07UUFBQ0MsV0FBVztNQUFJLENBQUM7QUFFakQ3SSxTQUFHd0QsT0FBT3NGLEtBQUEsR0FBQXhJLE9BQVFGLEtBQUcsR0FBQSxFQUFBRSxPQUFJQyxVQUFRLEdBQUEsRUFBQUQsT0FBSUosU0FBTyxpQkFBQSxHQUFtQixVQUFVO0lBQzFFLEdBQUc7RUFBQTtBQUFBLENBQUE7O0FDeE1ILElBQUE2SSxvQkFBd0JsSixRQUFBLGlCQUFBO0FBRXhCLElBQU1tSixPQUFBLEdBQWNELGtCQUFBRSxXQUFVLHdCQUF3Qjs7QUNBdEQsSUFBTUMsb0JBQUEsMkJBQUE7QUFBQSxNQUFBQyxRQUFBdkcsa0JBQW9CLGFBQVk7QUFDckMsUUFBSSxDQUFDNUMsR0FBR29KLEtBQUtDLFFBQVExSCxJQUFJLGlCQUFpQixHQUFHO0FBQzVDLFdBQUtxSCxJQUFJTSxrQkFBa0I7UUFDMUIxRSxRQUFRO1FBQ1IyRSxRQUFRO01BQ1QsQ0FBcUI7QUFFckIsWUFBTXZKLEdBQUd3RCxPQUFPQyxNQUFNLHFCQUFxQjtJQUM1QztFQUNELENBQUE7QUFBQSxTQUFBLFNBVE15RixxQkFBQTtBQUFBLFdBQUFDLE1BQUFyRSxNQUFBLE1BQUFDLFNBQUE7RUFBQTtBQUFBLEVBQUE7Ozs2Q0NDTCxhQUFtQztBQUNuQyxTQUFLbUUsa0JBQWtCO0FBQ3ZCLFVBQU07TUFBQ007TUFBVUM7SUFBVyxJQUFJekosR0FBRzBCLE9BQU9DLElBQUk7QUFDOUMsUUFBSTZILGFBQWEsVUFBVSxDQUFDQyxhQUFhO0FBQ3hDO0lBQ0Q7QUFFQSxVQUFNO01BQUMsdUJBQXVCQztJQUFVLElBQUkxSixHQUFHb0osS0FBS0MsUUFBUTFILElBQUk7QUFHaEUsUUFBSStILFlBQVk7QUFDZixZQUFNMUosR0FBR3dELE9BQU9DLE1BQU0sdUJBQXVCO0lBQzlDO0FBRUEsUUFBSSxFQUFFLGtCQUFrQjVDLFdBQVc7QUFDbEMsWUFBTUgsUUFBQUMsUUFBQSxFQUFBZ0osS0FBQSxPQUFBaEssZUFBQSxHQUFBRixrQkFBQTtJQUNQO0VBQ0QsQ0FBQTtBQUFBLFdBakJnQm1LLG9CQUFBO0FBQUEsV0FBQUMsbUJBQUEvRSxNQUFBLE1BQUFDLFNBQUE7RUFBQTtBQUFBLFNBQUE2RTtBQUFBLEdBQUEsRUFpQmI7IiwKICAibmFtZXMiOiBbImhpZ2hsaWdodF9leHBvcnRzIiwgImltcG9ydF9leHRfZ2FkZ2V0MiIsICJpbml0X2hpZ2hsaWdodCIsICJfX2VzbSIsICJyZXF1aXJlIiwgIl93aW5kb3ciLCAibGlicyIsICJtdyIsICJ3cGhsIiwgInZlcnNpb24iLCAiY21WZXJzaW9uIiwgIkNETiIsICJNV19DRE4iLCAiY29uY2F0IiwgIlJFUE9fQ0ROIiwgIndpbmRvdyIsICJDb2RlTWlycm9yNiIsICJQcm9taXNlIiwgInJlc29sdmUiLCAic2NyaXB0IiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJ0eXBlIiwgInNyYyIsICJoZWFkIiwgImFwcGVuZCIsICJ3Z1BhZ2VOYW1lIiwgInBhZ2UiLCAid2dOYW1lc3BhY2VOdW1iZXIiLCAibnMiLCAid2dQYWdlQ29udGVudE1vZGVsIiwgImNvbnRlbnRtb2RlbCIsICJjb25maWciLCAiZ2V0IiwgIkNPTlRFTlRNT0RFTFMiLCAid2lraXRleHQiLCAiRVhUUyIsICJjc3MiLCAianMiLCAianNvbiIsICJOQU1FU1BBQ0VTIiwgImdldE9iamVjdCIsICJrZXkiLCAiSlNPTiIsICJwYXJzZSIsICJTdHJpbmciLCAibG9jYWxTdG9yYWdlIiwgImdldEl0ZW0iLCAiZ2V0UGFnZU1vZGUiLCAiX3JlZiIsICJfYXN5bmNUb0dlbmVyYXRvciIsICJ2YWx1ZSIsICJfV2lraXBsdXNQYWdlcyIsICJwYWdlcyIsICJPYmplY3QiLCAidmFsdWVzIiwgImZpbHRlciIsICJzZWN0aW9uQ2FjaGUiLCAiaW5jbHVkZXMiLCAic29tZSIsICJ0aXRsZSIsICJlbmRzV2l0aCIsICJsb2FkZXIiLCAidXNpbmciLCAibW9kZXMiLCAidW5pcXVlQXJyYXkiLCAibWFwIiwgIl90JGdldEV4dGVuc2lvbiIsICJ0IiwgIlRpdGxlIiwgIm5hbWVzcGFjZSIsICJnZXROYW1lc3BhY2VJZCIsICJtb2RlIiwgImdldEV4dGVuc2lvbiIsICJ0b0xvd2VyQ2FzZSIsICJsZW5ndGgiLCAiT08iLCAidWkiLCAiY29uZmlybSIsICJtc2ciLCAiYWN0aW9ucyIsICJsYWJlbCIsICJhY3Rpb24iLCAiX3giLCAiYXBwbHkiLCAiYXJndW1lbnRzIiwgInJlbmRlckVkaXRvciIsICJfcmVmMiIsICIkdGFyZ2V0IiwgInNldHRpbmciLCAiY20iLCAiZnJvbVRleHRBcmVhIiwgInZhbCIsICJ2aWV3IiwgImRvbSIsICJpZCIsICJxdWVyeVNlbGVjdG9yIiwgImhyZWYiLCAic2V0dGluZ3MiLCAiZXNjVG9FeGl0UXVpY2tFZGl0IiwgInN1Ym1pdCIsICJkaXNwYXRjaEV2ZW50IiwgIk1vdXNlRXZlbnQiLCAic3VibWl0TWlub3IiLCAiY2hlY2tlZCIsICJlc2NhcGVFZGl0IiwgImV4dHJhS2V5cyIsICJydW4iLCAib2xkS2V5IiwgIm9sZFByZWZzIiwgIm1hcHBpbmciLCAiYWN0aXZlTGluZSIsICJ0cmFpbGluZ3NwYWNlIiwgIm1hdGNoQnJhY2tldHMiLCAiY2xvc2VCcmFja2V0cyIsICJtYXRjaFRhZ3MiLCAiZm9sZCIsICJ3aWtpRWRpdG9yIiwgImVzY2FwZSIsICJjb250ZXh0bWVudSIsICJsaW50IiwgInJlbW92ZUl0ZW0iLCAib2JqIiwgIl9pdGVyYXRvciIsICJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsICJfc3RlcCIsICJzIiwgIm4iLCAiZG9uZSIsICJrIiwgImVyciIsICJlIiwgImYiLCAicHJlZmVyIiwgIl94MiIsICJfeDMiLCAib2JzZXJ2ZXIiLCAiTXV0YXRpb25PYnNlcnZlciIsICJyZWNvcmRzIiwgIiRlZGl0QXJlYSIsICIkIiwgImZsYXRNYXAiLCAiYWRkZWROb2RlcyIsICJmaW5kIiwgImF0dHIiLCAib2JzZXJ2ZSIsICJib2R5IiwgImNoaWxkTGlzdCIsICJsb2FkIiwgImltcG9ydF9leHRfZ2FkZ2V0IiwgImFwaSIsICJpbml0TXdBcGkiLCAiY2hlY2tEZXBlbmRlbmNpZXMiLCAiX3JlZjMiLCAidXNlciIsICJvcHRpb25zIiwgInBvc3RXaXRoRWRpdFRva2VuIiwgImNoYW5nZSIsICJ3Z0FjdGlvbiIsICJ3Z0lzQXJ0aWNsZSIsICJpc1ZlRW5hYmxlIiwgInRoZW4iLCAiV2lraXBsdXNIaWdobGlnaHQiLCAiX1dpa2lwbHVzSGlnaGxpZ2h0Il0KfQo=