User:Eejit43/scripts/script-updater.js

This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 03:53, 26 January 2024 (Syncing script from GitHub (via script)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// Note: This script was compiled from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/script-updater.ts

"use strict";mw.loader.using(["mediawiki.util"],()=>{if(mw.config.get("wgUserName")!=="Eejit43"||mw.config.get("wgPageName")!=="User:Eejit43")return;const s="Eejit43",n="wikipedia-scripts";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Sync user scripts from GitHub","sync-scripts").addEventListener("click",async y=>{y.preventDefault();const m=await fetch(`https://api.github.com/repos/${s}/${n}/commits`);if(!m.ok)return mw.notify(`Failed to fetch latest commit hash from GitHub: ${m.statusText} (${m.status})`,{type:"error",tag:"sync-scripts-notification"});const l=(await m.json())[0].sha,p=await fetch(`https://raw.githubusercontent.com/${s}/${n}/${l}/scripts.json`);if(!p.ok)return mw.notify(`Failed to fetch script data from GitHub: ${p.statusText} (${p.status})`,{type:"error",tag:"sync-scripts-notification"});const a=await p.json();mw.notify("Syncing scripts...",{autoHide:!1,tag:"sync-scripts-notification"}),await Promise.all(a.map(async t=>{const e=`User:Eejit43/scripts/${t.name}`,o=`User talk:Eejit43/scripts/${t.name}`,u=`${e}.js`,f=`${e}.css`,$=["{{User:Eejit43/script-documentation",t["use-instead"]?`| use-instead       = [[User:Eejit43/scripts/${t["use-instead"]}|${t["use-instead"]}]]`:null,t["image-size"]?`| image-size        = ${t["image-size"]}`:null,t["image-caption"]?`| image-caption     = ${t["image-caption"]}`:null,t["other-authors"]?`| other-authors     = ${t["other-authors"].map(i=>`[[User:${i}|${i}]]`).join(", ")}`:null,`| description-short = ${t["short-description"]}`,`| description       = ${t.description}`,t.usage?`| usage             = ${t.usage}`:null,t.changelog?`| changelog         = ${Object.entries(t.changelog).map(([i,h])=>`'''{{start date and age|${i}}}:''' ${h}`).join(`
`)}`:null,`| skin-support      = {{User:Eejit43/skin-support|${Object.entries(t["skin-support"]).map(([i,h])=>`${i}=${h}`).join("|")}}}`,`| released          = {{start date and age|${t.released}}}`,`| updated           = {{start date and age|${t.updated}}}`,"}}"].filter(Boolean);let c=null;const g=await fetch(`https://raw.githubusercontent.com/${s}/${n}/${l}/dist/scripts/${t.name}.js`);if(g.ok)c=await g.text();else return mw.notify(`Failed to fetch "${t.name}.js" from GitHub: ${g.statusText} (${g.status})`,{type:"error",tag:"sync-scripts-notification"});let w=null;if(t.css){const i=await fetch(`https://raw.githubusercontent.com/${s}/${n}/${l}/dist/styles/${t.name}.css`);i.ok?w=await i.text():mw.notify(`Failed to fetch "${t.name}.css" from GitHub: ${i.statusText} (${i.status})`,{type:"error",tag:"sync-scripts-notification"})}t.personal||(await r(e,$.join(`
`),"Syncing script documentation from GitHub"),await r(o,"#REDIRECT [[User talk:Eejit43]]","Redirecting script documentation talk page to main user talk page")),c&&await r(u,`// <nowiki>
// Note: This script was compiled from TypeScript. For a more readable version, see https://github.com/${s}/${n}/blob/main/scripts/${t.name}.ts

${c}
// </nowiki>`,"Syncing script from GitHub"),t.css&&w&&await r(f,`/* <nowiki> */
/* Note: This script was compiled from modern CSS. For a more readable version, see https://github.com/${s}/${n}/blob/main/styles/${t.name}.css */

${w}
/* </nowiki> */`,"Syncing styles from GitHub")})),await r("User:Eejit43/scripts-info",[d(a.filter(t=>!t.personal&&!t.fork)),"","=== Forks ===",d(a.filter(t=>t.fork)),"","=== Personal scripts ===",d(a.filter(t=>t.personal))].join(`
`),"Syncing script list from GitHub"),mw.notify(`Synced ${a.length} scripts from GitHub!`,{type:"success",tag:"sync-scripts-notification"});function d(t){return t.map(e=>`* [[User:Eejit43/scripts/${e.name}${e.personal?".js":""}|${e.name}]] - ${e["short-description"]||e.description}${e["use-instead"]?' (<span style="color: #bd2828">deprecated</span>)':""}`).join(`
`)}async function r(t,e,o){o+=" (via [[User:Eejit43/scripts/script-updater.js|script]])",await new mw.Api().edit(t,()=>({text:e,summary:o,watchlist:"watch"})).catch(async(u,f)=>{if(u==="nocreate-missing")await new mw.Api().create(t,{summary:o,watchlist:"watch"},e).catch(($,c)=>{mw.notify(`Error creating ${t}: ${c?.error.info??"Unknown error"} (${$})`,{type:"error"})});else{mw.notify(`Error editing or creating ${t}: ${f?.error.info??"Unknown error"} (${u})`,{type:"error"});return}})}})});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9zY3JpcHQtdXBkYXRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgTWVkaWFXaWtpRGF0YUVycm9yIH0gZnJvbSAnLi4vZ2xvYmFsLXR5cGVzJztcblxuaW50ZXJmYWNlIFNjcmlwdCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgICd1c2UtaW5zdGVhZCc/OiBzdHJpbmc7XG4gICAgJ2ltYWdlLXNpemUnPzogc3RyaW5nO1xuICAgICdpbWFnZS1jYXB0aW9uJz86IHN0cmluZztcbiAgICAnc2hvcnQtZGVzY3JpcHRpb24nOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICB1c2FnZT86IHN0cmluZztcbiAgICBjaGFuZ2Vsb2c/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICdvdGhlci1hdXRob3JzJz86IHN0cmluZ1tdO1xuICAgIGZvcms/OiB0cnVlO1xuICAgIHBlcnNvbmFsPzogdHJ1ZTtcbiAgICAnc2tpbi1zdXBwb3J0JzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgcmVsZWFzZWQ6IHN0cmluZztcbiAgICB1cGRhdGVkOiBzdHJpbmc7XG4gICAgY3NzPzogdHJ1ZTtcbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnXSwgKCkgPT4ge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgIT09ICdFZWppdDQzJyB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgIT09ICdVc2VyOkVlaml0NDMnKSByZXR1cm47XG5cbiAgICBjb25zdCByZXBvT3duZXIgPSAnRWVqaXQ0Myc7XG4gICAgY29uc3QgcmVwb05hbWUgPSAnd2lraXBlZGlhLXNjcmlwdHMnO1xuXG4gICAgY29uc3QgbGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsobXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsICcjJywgJ1N5bmMgdXNlciBzY3JpcHRzIGZyb20gR2l0SHViJywgJ3N5bmMtc2NyaXB0cycpITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBsYXRlc3RDb21taXRIYXNoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke3JlcG9Pd25lcn0vJHtyZXBvTmFtZX0vY29tbWl0c2ApO1xuICAgICAgICBpZiAoIWxhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5vaylcbiAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoYEZhaWxlZCB0byBmZXRjaCBsYXRlc3QgY29tbWl0IGhhc2ggZnJvbSBHaXRIdWI6ICR7bGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2xhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5zdGF0dXN9KWAsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHRhZzogJ3N5bmMtc2NyaXB0cy1ub3RpZmljYXRpb24nLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbGF0ZXN0Q29tbWl0SGFzaCA9ICgoYXdhaXQgbGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlLmpzb24oKSkgYXMgeyBzaGE6IHN0cmluZyB9W10pWzBdLnNoYTtcblxuICAgICAgICBjb25zdCBzY3JpcHREYXRhUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7cmVwb093bmVyfS8ke3JlcG9OYW1lfS8ke2xhdGVzdENvbW1pdEhhc2h9L3NjcmlwdHMuanNvbmApO1xuICAgICAgICBpZiAoIXNjcmlwdERhdGFSZXNwb25zZS5vaylcbiAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoYEZhaWxlZCB0byBmZXRjaCBzY3JpcHQgZGF0YSBmcm9tIEdpdEh1YjogJHtzY3JpcHREYXRhUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7c2NyaXB0RGF0YVJlc3BvbnNlLnN0YXR1c30pYCwgeyB0eXBlOiAnZXJyb3InLCB0YWc6ICdzeW5jLXNjcmlwdHMtbm90aWZpY2F0aW9uJyB9KTtcblxuICAgICAgICBjb25zdCBzY3JpcHREYXRhID0gKGF3YWl0IHNjcmlwdERhdGFSZXNwb25zZS5qc29uKCkpIGFzIFNjcmlwdFtdO1xuXG4gICAgICAgIG13Lm5vdGlmeSgnU3luY2luZyBzY3JpcHRzLi4uJywgeyBhdXRvSGlkZTogZmFsc2UsIHRhZzogJ3N5bmMtc2NyaXB0cy1ub3RpZmljYXRpb24nIH0pO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgc2NyaXB0RGF0YS5tYXAoYXN5bmMgKHNjcmlwdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnBhZ2VOYW1lID0gYFVzZXI6RWVqaXQ0My9zY3JpcHRzLyR7c2NyaXB0Lm5hbWV9YDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJwYWdlVGFsa05hbWUgPSBgVXNlciB0YWxrOkVlaml0NDMvc2NyaXB0cy8ke3NjcmlwdC5uYW1lfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0TmFtZSA9IGAke3N1YnBhZ2VOYW1lfS5qc2A7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVOYW1lID0gYCR7c3VicGFnZU5hbWV9LmNzc2A7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmdWxsU3VicGFnZUluZm8gPSBbXG4gICAgICAgICAgICAgICAgICAgICd7e1VzZXI6RWVqaXQ0My9zY3JpcHQtZG9jdW1lbnRhdGlvbicsIC8vXG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdFsndXNlLWluc3RlYWQnXSA/IGB8IHVzZS1pbnN0ZWFkICAgICAgID0gW1tVc2VyOkVlaml0NDMvc2NyaXB0cy8ke3NjcmlwdFsndXNlLWluc3RlYWQnXX18JHtzY3JpcHRbJ3VzZS1pbnN0ZWFkJ119XV1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0WydpbWFnZS1zaXplJ10gPyBgfCBpbWFnZS1zaXplICAgICAgICA9ICR7c2NyaXB0WydpbWFnZS1zaXplJ119YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdFsnaW1hZ2UtY2FwdGlvbiddID8gYHwgaW1hZ2UtY2FwdGlvbiAgICAgPSAke3NjcmlwdFsnaW1hZ2UtY2FwdGlvbiddfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzY3JpcHRbJ290aGVyLWF1dGhvcnMnXSA/IGB8IG90aGVyLWF1dGhvcnMgICAgID0gJHtzY3JpcHRbJ290aGVyLWF1dGhvcnMnXS5tYXAoKGF1dGhvcikgPT4gYFtbVXNlcjoke2F1dGhvcn18JHthdXRob3J9XV1gKS5qb2luKCcsICcpfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBgfCBkZXNjcmlwdGlvbi1zaG9ydCA9ICR7c2NyaXB0WydzaG9ydC1kZXNjcmlwdGlvbiddfWAsXG4gICAgICAgICAgICAgICAgICAgIGB8IGRlc2NyaXB0aW9uICAgICAgID0gJHtzY3JpcHQuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnVzYWdlID8gYHwgdXNhZ2UgICAgICAgICAgICAgPSAke3NjcmlwdC51c2FnZX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmNoYW5nZWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBgfCBjaGFuZ2Vsb2cgICAgICAgICA9ICR7T2JqZWN0LmVudHJpZXMoc2NyaXB0LmNoYW5nZWxvZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtkYXRlLCBkZXNjcmlwdGlvbl0pID0+IGAnJyd7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke2RhdGV9fX06JycnICR7ZGVzY3JpcHRpb259YClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGB8IHNraW4tc3VwcG9ydCAgICAgID0ge3tVc2VyOkVlaml0NDMvc2tpbi1zdXBwb3J0fCR7T2JqZWN0LmVudHJpZXMoc2NyaXB0Wydza2luLXN1cHBvcnQnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtza2luLCBzdGF0dXNdKSA9PiBgJHtza2lufT0ke3N0YXR1c31gKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ3wnKX19fWAsXG4gICAgICAgICAgICAgICAgICAgIGB8IHJlbGVhc2VkICAgICAgICAgID0ge3tzdGFydCBkYXRlIGFuZCBhZ2V8JHtzY3JpcHQucmVsZWFzZWR9fX1gLFxuICAgICAgICAgICAgICAgICAgICBgfCB1cGRhdGVkICAgICAgICAgICA9IHt7c3RhcnQgZGF0ZSBhbmQgYWdlfCR7c2NyaXB0LnVwZGF0ZWR9fX1gLFxuICAgICAgICAgICAgICAgICAgICAnfX0nLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHNjcmlwdENvbnRlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0Q29udGVudFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke3JlcG9Pd25lcn0vJHtyZXBvTmFtZX0vJHtsYXRlc3RDb21taXRIYXNofS9kaXN0L3NjcmlwdHMvJHtzY3JpcHQubmFtZX0uanNgKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Q29udGVudFJlc3BvbnNlLm9rKSBzY3JpcHRDb250ZW50ID0gYXdhaXQgc2NyaXB0Q29udGVudFJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoYEZhaWxlZCB0byBmZXRjaCBcIiR7c2NyaXB0Lm5hbWV9LmpzXCIgZnJvbSBHaXRIdWI6ICR7c2NyaXB0Q29udGVudFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3NjcmlwdENvbnRlbnRSZXNwb25zZS5zdGF0dXN9KWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICdzeW5jLXNjcmlwdHMtbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVDb250ZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0LmNzcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUNvbnRlbnRSZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHtyZXBvT3duZXJ9LyR7cmVwb05hbWV9LyR7bGF0ZXN0Q29tbWl0SGFzaH0vZGlzdC9zdHlsZXMvJHtzY3JpcHQubmFtZX0uY3NzYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ29udGVudFJlc3BvbnNlLm9rKSBzdHlsZUNvbnRlbnQgPSBhd2FpdCBzdHlsZUNvbnRlbnRSZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRmFpbGVkIHRvIGZldGNoIFwiJHtzY3JpcHQubmFtZX0uY3NzXCIgZnJvbSBHaXRIdWI6ICR7c3R5bGVDb250ZW50UmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7c3R5bGVDb250ZW50UmVzcG9uc2Uuc3RhdHVzfSlgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICdzeW5jLXNjcmlwdHMtbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghc2NyaXB0LnBlcnNvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVkaXRPckNyZWF0ZShzdWJwYWdlTmFtZSwgZnVsbFN1YnBhZ2VJbmZvLmpvaW4oJ1xcbicpLCAnU3luY2luZyBzY3JpcHQgZG9jdW1lbnRhdGlvbiBmcm9tIEdpdEh1YicpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlZGl0T3JDcmVhdGUoc3VicGFnZVRhbGtOYW1lLCAnI1JFRElSRUNUIFtbVXNlciB0YWxrOkVlaml0NDNdXScsICdSZWRpcmVjdGluZyBzY3JpcHQgZG9jdW1lbnRhdGlvbiB0YWxrIHBhZ2UgdG8gbWFpbiB1c2VyIHRhbGsgcGFnZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzY3JpcHRDb250ZW50KVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYC8vIDxub3dpa2k+XFxuLy8gTm90ZTogVGhpcyBzY3JpcHQgd2FzIGNvbXBpbGVkIGZyb20gVHlwZVNjcmlwdC4gRm9yIGEgbW9yZSByZWFkYWJsZSB2ZXJzaW9uLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb093bmVyfS8ke3JlcG9OYW1lfS9ibG9iL21haW4vc2NyaXB0cy8ke3NjcmlwdC5uYW1lfS50c1xcblxcbiR7c2NyaXB0Q29udGVudH1cXG4vLyA8L25vd2lraT5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1N5bmNpbmcgc2NyaXB0IGZyb20gR2l0SHViJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChzY3JpcHQuY3NzICYmIHN0eWxlQ29udGVudClcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZWRpdE9yQ3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYC8qIDxub3dpa2k+ICovXFxuLyogTm90ZTogVGhpcyBzY3JpcHQgd2FzIGNvbXBpbGVkIGZyb20gbW9kZXJuIENTUy4gRm9yIGEgbW9yZSByZWFkYWJsZSB2ZXJzaW9uLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb093bmVyfS8ke3JlcG9OYW1lfS9ibG9iL21haW4vc3R5bGVzLyR7c2NyaXB0Lm5hbWV9LmNzcyAqL1xcblxcbiR7c3R5bGVDb250ZW50fVxcbi8qIDwvbm93aWtpPiAqL2AsXG4gICAgICAgICAgICAgICAgICAgICAgICAnU3luY2luZyBzdHlsZXMgZnJvbSBHaXRIdWInLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgZWRpdE9yQ3JlYXRlKFxuICAgICAgICAgICAgJ1VzZXI6RWVqaXQ0My9zY3JpcHRzLWluZm8nLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIG1hcFNjcmlwdHMoc2NyaXB0RGF0YS5maWx0ZXIoKHNjcmlwdCkgPT4gIXNjcmlwdC5wZXJzb25hbCAmJiAhc2NyaXB0LmZvcmspKSwgLy9cbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAnPT09IEZvcmtzID09PScsXG4gICAgICAgICAgICAgICAgbWFwU2NyaXB0cyhzY3JpcHREYXRhLmZpbHRlcigoc2NyaXB0KSA9PiBzY3JpcHQuZm9yaykpLFxuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICc9PT0gUGVyc29uYWwgc2NyaXB0cyA9PT0nLFxuICAgICAgICAgICAgICAgIG1hcFNjcmlwdHMoc2NyaXB0RGF0YS5maWx0ZXIoKHNjcmlwdCkgPT4gc2NyaXB0LnBlcnNvbmFsKSksXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgJ1N5bmNpbmcgc2NyaXB0IGxpc3QgZnJvbSBHaXRIdWInLFxuICAgICAgICApO1xuXG4gICAgICAgIG13Lm5vdGlmeShgU3luY2VkICR7c2NyaXB0RGF0YS5sZW5ndGh9IHNjcmlwdHMgZnJvbSBHaXRIdWIhYCwgeyB0eXBlOiAnc3VjY2VzcycsIHRhZzogJ3N5bmMtc2NyaXB0cy1ub3RpZmljYXRpb24nIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIHNjcmlwdHMgdG8gYSBidWxsZXRlZCBsaXN0LlxuICAgICAgICAgKiBAcGFyYW0gc2NyaXB0cyBUaGUgc2NyaXB0cyB0byBtYXAuXG4gICAgICAgICAqIEByZXR1cm5zIFRoZSBtYXBwZWQgc2NyaXB0cy5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1hcFNjcmlwdHMoc2NyaXB0czogU2NyaXB0W10pIHtcbiAgICAgICAgICAgIHJldHVybiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHNjcmlwdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGAqIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX0ke3NjcmlwdC5wZXJzb25hbCA/ICcuanMnIDogJyd9fCR7c2NyaXB0Lm5hbWV9XV0gLSAke3NjcmlwdFsnc2hvcnQtZGVzY3JpcHRpb24nXSB8fCBzY3JpcHQuZGVzY3JpcHRpb259JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRbJ3VzZS1pbnN0ZWFkJ10gPyAnICg8c3BhbiBzdHlsZT1cImNvbG9yOiAjYmQyODI4XCI+ZGVwcmVjYXRlZDwvc3Bhbj4pJyA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIGEgcGFnZSwgb3IgY3JlYXRlcyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBwYWdlIHRvIGVkaXQuXG4gICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIGNvbnRlbnQgdG8gc2V0LlxuICAgICAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5ICh3aWxsIGFwcGVuZCBzY3JpcHQgbm90aWNlKS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgc3VtbWFyeSArPSAnICh2aWEgW1tVc2VyOkVlaml0NDMvc2NyaXB0cy9zY3JpcHQtdXBkYXRlci5qc3xzY3JpcHRdXSknO1xuICAgICAgICAgICAgYXdhaXQgbmV3IG13LkFwaSgpXG4gICAgICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnksIHdhdGNobGlzdDogJ3dhdGNoJyB9KSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goYXN5bmMgKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAnbm9jcmVhdGUtbWlzc2luZycpXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgbXcuQXBpKCkuY3JlYXRlKHRpdGxlLCB7IHN1bW1hcnksIHdhdGNobGlzdDogJ3dhdGNoJyB9LCB0ZXh0KS5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGVkaXRpbmcgb3IgY3JlYXRpbmcgJHt0aXRsZX06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiYUFvQkEsR0FBRyxPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRyxJQUFNLENBQ3RDLEdBQUksR0FBRyxPQUFPLElBQUksWUFBWSxJQUFNLFdBQWEsR0FBRyxPQUFPLElBQUksWUFBWSxJQUFNLGVBQWdCLE9BRWpHLE1BQU1BLEVBQVksVUFDWkMsRUFBVyxvQkFFSixHQUFHLEtBQUssZUFBZSxHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQWMsSUFBSyxnQ0FBaUMsY0FBYyxFQUVoSixpQkFBaUIsUUFBUyxNQUFPQyxHQUFVLENBQzVDQSxFQUFNLGVBQWUsRUFFckIsTUFBTUMsRUFBMkIsTUFBTSxNQUFNLGdDQUFnQ0gsQ0FBUyxJQUFJQyxDQUFRLFVBQVUsRUFDNUcsR0FBSSxDQUFDRSxFQUF5QixHQUMxQixPQUFPLEdBQUcsT0FBTyxtREFBbURBLEVBQXlCLFVBQVUsS0FBS0EsRUFBeUIsTUFBTSxJQUFLLENBQzVJLEtBQU0sUUFDTixJQUFLLDJCQUNU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QUFJLEdBQUcsSUFBSSxFQUNaLEtBQUtGLEVBQU8sS0FBTyxDQUFFLEtBQUFDLEVBQU0sUUFBQUMsRUFBUyxVQUFXLE9BQVEsRUFBRSxFQUN6RCxNQUFNLE1BQU9DLEVBQW1CQyxJQUFrQyxDQUMvRCxHQUFJRCxJQUFjLG1CQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxPQUFPSCxFQUFPLENBQUUsUUFBQUUsRUFBUyxVQUFXLE9BQVEsRUFBR0QsQ0FBSSxFQUFFLE1BQU0sQ0FBQ0UsRUFBbUJDLElBQWtDLENBQ2hJLEdBQUcsT0FBTyxrQkFBa0JKLENBQUssS0FBS0ksR0FBVyxNQUFNLE1BQVEsZUFBZSxLQUFLRCxDQUFTLElBQUssQ0FBRSxLQUFNLE9BQVEsQ0FBQyxDQUV0SCxDQUFDLE1BQ0EsQ0FDRCxHQUFHLE9BQU8sNkJBQTZCSCxDQUFLLEtBQUtJLEdBQVcsTUFBTSxNQUFRLGVBQWUsS0FBS0QsQ0FBUyxJQUFLLENBQUUsS0FBTSxPQUFRLENBQUMsRUFDN0gsTUFDSixDQUNKLENBQUMsQ0FDVCxDQUNKLENBQUMsQ0FDTCxDQUFDIiwKICAibmFtZXMiOiBbInJlcG9Pd25lciIsICJyZXBvTmFtZSIsICJldmVudCIsICJsYXRlc3RDb21taXRIYXNoUmVzcG9uc2UiLCAibGF0ZXN0Q29tbWl0SGFzaCIsICJzY3JpcHREYXRhUmVzcG9uc2UiLCAic2NyaXB0RGF0YSIsICJzY3JpcHQiLCAic3VicGFnZU5hbWUiLCAic3VicGFnZVRhbGtOYW1lIiwgInNjcmlwdE5hbWUiLCAic3R5bGVOYW1lIiwgImZ1bGxTdWJwYWdlSW5mbyIsICJhdXRob3IiLCAiZGF0ZSIsICJkZXNjcmlwdGlvbiIsICJza2luIiwgInN0YXR1cyIsICJzY3JpcHRDb250ZW50IiwgInNjcmlwdENvbnRlbnRSZXNwb25zZSIsICJzdHlsZUNvbnRlbnQiLCAic3R5bGVDb250ZW50UmVzcG9uc2UiLCAiZWRpdE9yQ3JlYXRlIiwgIm1hcFNjcmlwdHMiLCAic2NyaXB0cyIsICJ0aXRsZSIsICJ0ZXh0IiwgInN1bW1hcnkiLCAiZXJyb3JDb2RlIiwgImVycm9ySW5mbyJdCn0K

// </nowiki>