Jump to content
Wikipedia The Free Encyclopedia

User:Eejit43/scripts/script-updater.js

From Wikipedia, the free encyclopedia
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump.
This code will be executed when previewing this page.
Documentation for this user script can be added at User:Eejit43/scripts/script-updater.
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.
 // <pre>
 // Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/script-updater.ts

 "use strict";(()=>{varg=newmw.Api;asyncfunctiony(d){return(awaitg.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:d})).query.pages[0].revisions?.[0].slots.main.content.trim()}mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{if(mw.config.get("wgUserName")!=="Eejit43"||mw.config.get("wgPageName")!=="User:Eejit43")return;letd=document.querySelector(".mw-editsection").cloneNode(!0),u=document.createElement("a");u.href="#",u.style.fontWeight="bold",u.textContent="Sync from GitHub",u.addEventListener("click",p=>{p.preventDefault();lete=newOO.ui.WindowManager;document.body.append(e.$element[0]);lets=newl;e.addWindows([s]),s.open()}),d.querySelector("a").replaceWith(u),document.querySelector("h2#My_user_scripts + .mw-editsection").after(d);classlextendsOO.ui.ProcessDialog{REPO_OWNER="Eejit43";REPO_NAME="wikipedia-scripts";SCRIPT_MESSAGE=" (via [[User:Eejit43/scripts/script-updater.js|script]])";content;scriptsMultiselect;actionsMultiselect;latestCommitHash;scripts;scriptDataUpdaters={"article-cleaner":w,"redirect-helper":O};constructor(){super({size:"medium"}),l.static.name="ScriptUpdaterDialog",l.static.title="script-updater",l.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}]}getSetupProcess=()=>l.super.prototype.getSetupProcess.call(this).next(()=>this.wrapAsyncMethod(this.loadScriptData).then(e=>{if(e){leti=newOO.ui.MessageWidget({type:"error",label:e});this.content=newOO.ui.PanelLayout({padded:!0,expanded:!1}),this.content.$element.append(i.$element),this.$body.append(this.content.$element),this.getActions().setAbilities({save:!1});return}this.content=newOO.ui.PanelLayout({padded:!0,expanded:!1}),this.scriptsMultiselect=newOO.ui.CheckboxMultiselectWidget({items:this.scripts.map(i=>newOO.ui.CheckboxMultioptionWidget({data:i.name,label:i.name}))}),this.scriptsMultiselect.$element[0].style.columnCount="2";lets=newOO.ui.FieldLayout(this.scriptsMultiselect,{label:newOO.ui.HtmlSnippet("<b>Scripts to update:</b>"),align:"top"});this.actionsMultiselect=newOO.ui.CheckboxMultiselectWidget({items:[{id:"documentation",name:"Update script documentation"},{id:"script",name:"Update script code"},{id:"talk",name:"Create talk redirect",selectedDefault:!1}].map(({id:i,name:r,selectedDefault:a})=>newOO.ui.CheckboxMultioptionWidget({data:i,label:r,selected:a??!0}))});letn=newOO.ui.FieldLayout(this.actionsMultiselect,{label:newOO.ui.HtmlSnippet("<b>Actions to take (if applicable):</b>"),align:"top"}),m=newOO.ui.ButtonGroupWidget({items:Object.entries(this.scriptDataUpdaters).map(([i,r])=>{leta=newOO.ui.ButtonWidget({label:i,flags:["progressive"]});returna.on("click",async()=>{mw.notify(`Fetching ${i} data...`,{tag:"update-script-data-notification"});leto=awaitr();mw.notify(`Successfully fetched ${i} data, opening diff...`,{type:"success",tag:"update-script-data-notification"}),awaitnewPromise(c=>setTimeout(c,500)),this.openDiff(`User:Eejit43/scripts/${i}.json`,o)}),a})}),t=newOO.ui.FieldLayout(m,{label:newOO.ui.HtmlSnippet("<b>Script data updaters:</b>"),align:"top"});this.content.$element.append(s.$element),this.content.$element.append(n.$element),this.content.$element.append(t.$element),this.$body.append(this.content.$element)}));getActionProcess=e=>e==="cancel"?newOO.ui.Process(()=>{this.close()}):e==="save"?newOO.ui.Process(()=>{lets=this.scriptsMultiselect.findSelectedItemsData().map(n=>this.scripts.find(m=>m.name===n));this.close(),(async()=>(mw.notify("Syncing scripts...",{tag:"sync-scripts-notification"}),awaitPromise.all(s.map(n=>this.handleScript(n))),awaitthis.editOrCreate("User:Eejit43/scripts-info",[this.mapScripts(this.scripts.filter(n=>!n.personal&&!n.fork)),"","=== Forks ===",this.mapScripts(this.scripts.filter(n=>n.fork)),"","=== Personal scripts ===",this.mapScripts(this.scripts.filter(n=>n.personal))].join(`
 `),"Syncing script list from GitHub"),mw.notify(`Synced ${s.length} script${s.length===1?"":"s"} from GitHub!`,{type:"success",tag:"sync-scripts-notification"})))()}):l.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>l.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});wrapAsyncMethod(e){lets=$.Deferred();returne().then(n=>s.resolve(n)),s.promise()}loadScriptData=async()=>{lete=awaitfetch(`https://api.github.com/repos/${this.REPO_OWNER}/${this.REPO_NAME}/commits`);if(!e.ok)return`Failed to fetch latest commit hash from GitHub: ${e.statusText} (${e.status})`;this.latestCommitHash=(awaite.json())[0].sha;lets=awaitfetch(`https://raw.githubusercontent.com/${this.REPO_OWNER}/${this.REPO_NAME}/${this.latestCommitHash}/scripts.json`);if(!s.ok)return`Failed to fetch script data from GitHub: ${s.statusText} (${s.status})`;letn=awaits.json();this.scripts=Object.entries(n).map(([m,t])=>({name:m,...t}))};asynchandleScript(e){lets=this.actionsMultiselect.findSelectedItemsData(),n=`User:Eejit43/scripts/${e.name}`,m=`User talk:Eejit43/scripts/${e.name}`,t=`${n}.js`,i=["{{User:Eejit43/script-documentation",e.image===!1?`| image = ${e.image}`:null,e["in-development"]?`| in-development = ${e["in-development"]}`:null,e["use-instead"]?`| use-instead = ${e["use-instead"].includes("User:")?e["use-instead"]:`[[User:Eejit43/scripts/${e["use-instead"]}|${e["use-instead"]}]]`}`:null,e["image-caption"]?`| image-caption = ${e["image-caption"]}`:null,e["other-authors"]?`| other-authors = ${e["other-authors"].map(a=>`[[User:${a}|${a}]]`).join(", ")}`:null,`| description-short = ${e["short-description"]}`,`| description = ${e.description}`,e.usage?`| usage = ${e.usage}`:null,e.configuration?`| configuration = ${e.configuration}`:null,e.changelog?`| changelog = 
 ${Object.entries(e.changelog).map(([a,o])=>`* '''{{start date and age|${a}}}:'''${Array.isArray(o)?`
 ${o.map(c=>`** ${c}`).join(`
 `)}`:` ${o}`}`).join(`
 `)}`:null,`| skin-support = {{User:Eejit43/script-documentation/skin-support|${Object.entries(e["skin-support"]).map(([a,o])=>`${a}=${o}`).join("|")}}}`,e["source-multiple"]?`| source-multiple = ${e["source-multiple"]}`:null,`| released = {{start date and age|${e.released}}}`,`| updated = {{start date and age|${e.updated}}}`,"}}"].filter(Boolean),r=null;if(s.includes("script")){leta=awaitfetch(`https://raw.githubusercontent.com/${this.REPO_OWNER}/${this.REPO_NAME}/${this.latestCommitHash}/dist/${e.name}.js`);if(a.ok)r=awaita.text();elsereturnmw.notify(`Failed to fetch "${e.name}.js" from GitHub: ${a.statusText} (${a.status})`,{type:"error",tag:"sync-scripts-notification"})}e.personal||(s.includes("documentation")&&awaitthis.editOrCreate(n,i.join(`
 `),"Syncing script documentation from GitHub"),s.includes("talk")&&awaitthis.editOrCreate(m,"#REDIRECT [[User talk:Eejit43]]","Redirecting script documentation talk page to main user talk page")),r&&awaitthis.editOrCreate(t,r,"Syncing script from GitHub")}mapScripts(e){returne.map(s=>`* [[User:Eejit43/scripts/${s.name}${s.personal?".js":""}|${s.name}]] - ${s["short-description"]||s.description}${s["in-development"]?' (<span style="color: #bd2828">in development</span>)':""}${s["use-instead"]?' (<span style="color: #bd2828">deprecated</span>)':""}`).join(`
 `)}asynceditOrCreate(e,s,n){n+=this.SCRIPT_MESSAGE,awaitg.edit(e,()=>({text:s,summary:n,watchlist:"watch"})).catch(async(m,t)=>{if(m==="nocreate-missing")awaitg.create(e,{summary:n,watchlist:"watch"},s).catch((i,r)=>{mw.notify(`Error creating ${e}: ${r?.error?.info??"Unknown error"} (${i})`,{type:"error"})});else{mw.notify(`Error editing or creating ${e}: ${t?.error?.info??"Unknown error"} (${m})`,{type:"error"});return}})}openDiff(e,s){letn={wpTextbox1:s,wpSummary:`Updating data${this.SCRIPT_MESSAGE}`,wpDiff:"1",wpWatchthis:"1",wpUltimateParam:"1"},m=newURL(`${mw.config.get("wgScriptPath")}/index.php`,window.location.origin);m.searchParams.set("title",e),m.searchParams.set("action","submit");lett=document.createElement("form");t.action=m.toString(),t.method="POST",t.target="_blank";for(let[i,r]ofObject.entries(n)){leta=document.createElement("input");a.type="hidden",a.name=i,a.value=r,t.append(a)}document.body.append(t),t.submit(),t.remove()}}Object.assign(l.prototype,OO.ui.ProcessDialog.prototype)});asyncfunctionw(){letu=(awaity("Wikipedia:AutoWikiBrowser/Template redirects")??"").matchAll(/\* {{tl\|.+/g).toArray().map(l=>{letp=l[0].matchAll(/{{tl\|(.+?)}}/g).toArray();return{from:p.slice(0,-1).map(e=>e[1]),to:p.at(-1)[1]}});returnJSON.stringify(u)}functionh(d,u){letl=[];for(letp=0;p<d.length;p+=u){lete=d.slice(p,p+u);l.push(e)}returnl}asyncfunctionb(d){letu=0,l=[],p={continue:{}};for(;"continue"inp&&u<10;)p=awaitg.get({...d,...p.continue}),l.push(p),u++;returnl}asyncfunctionO(){letd=awaitg.get({action:"query",list:"categorymembers",cmtitle:"Category:Redirect templates",cmlimit:"max",formatversion:"2"}),u=awaitg.get({action:"query",list:"categorymembers",cmtitle:"Category:Template redirects with possibilities",cmlimit:"max",formatversion:"2"}),l=d.query.categorymembers.filter(t=>t.title.startsWith("Template:R ")&&t.title!=="Template:R template index").map(t=>({name:t.title.split(":")[1],redirect:!1})),p=u.query.categorymembers.filter(t=>t.title.startsWith("Template:R ")&&t.title!=="Template:R with possibilities").map(t=>({name:t.title.split(":")[1],redirect:!0})),e=[...l,...p].sort((t,i)=>t.name.startsWith("R comics")||t.name.startsWith("R ME")?1:i.name.startsWith("R comics")||i.name.startsWith("R ME")?-1:t.name.localeCompare(i.name)),s=Object.fromEntries(e.map(t=>[t.name,{redirect:t.redirect,parameters:{},aliases:[]}]));awaitPromise.all(h(e,50).map(asynct=>{leti=awaitg.get({action:"templatedata",titles:t.map(r=>`Template:${r.name}`),formatversion:"2"});for(letrofObject.values(i.pages)){leta=Object.fromEntries(Object.entries(r.params).map(([o,c])=>[o,{aliases:c.aliases,label:c.label?.en??null,description:c.description?.en??null,type:c.type,required:c.required,suggested:c.suggested,default:c.default?.en??null,example:c.example?.en??null}]));s[r.title.split(":")[1]].parameters=a}})),awaitPromise.all(h(l,50).map(asynct=>{letr=(awaitb({action:"query",titles:t.map(a=>`Template:${a.name}`),prop:"redirects",rdnamespace:10,rdlimit:"max",formatversion:"2"})).flatMap(a=>a.query.pages);for(letaofr){leto=a.redirects?.map(c=>c.title.split(":")[1]).filter(c=>!p.some(f=>f.name===c)).sort((c,f)=>c.localeCompare(f))??[];s[a.title.split(":")[1]].aliases.push(...o)}}));letn=[];awaitPromise.all(h(p,50).map(asynct=>{leti=awaitg.get({action:"query",titles:t.map(r=>`Template:${r.name}`),prop:"linkshere",lhnamespace:10,lhlimit:"max",formatversion:"2"});for(letrofi.query.pages){leta=r.linkshere?.filter(o=>o.redirect).map(o=>o.title.split(":")[1]).filter(o=>!o.endsWith("/doc")&&!o.endsWith("/sandbox")).sort((o,c)=>o.localeCompare(c))??[];n.push(...a),s[r.title.split(":")[1]].aliases=a}}));letm=Object.entries(s).map(([t,i])=>{letr={...i.redirect?{redirect:!0}:{},parameters:i.parameters,aliases:i.aliases.sort((a,o)=>a.localeCompare(o))};return[t,r]});for(lettofn)for(let[,i]ofm)!i.redirect&&i.aliases.includes(t)&&(i.aliases=i.aliases.filter(r=>r!==t));returnJSON.stringify(Object.fromEntries(m))}})();

 // </pre>
 //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zY3JpcHRzL3NjcmlwdC11cGRhdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpLWFwaSc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuL2dsb2JhbC10eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZUNvbnRlbnQodGl0bGU6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICAgIChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6IHRpdGxlLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9ucz8uWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICAgIEFwaVF1ZXJ5QmFja2xpbmtzcHJvcFBhcmFtcyxcbiAgICBBcGlRdWVyeUNhdGVnb3J5TWVtYmVyc1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhcmFtcyxcbiAgICBUZW1wbGF0ZURhdGFBcGlUZW1wbGF0ZURhdGFQYXJhbXMsXG59IGZyb20gJ3R5cGVzLW1lZGlhd2lraS1hcGknO1xuaW1wb3J0IHR5cGUgeyBBcGlSZXNwb25zZSB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9tdy9BcGknO1xuaW1wb3J0IHR5cGUge1xuICAgIENhdGVnb3J5TWVtYmVyc1Jlc3VsdCxcbiAgICBMaW5rc0hlcmVSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFF1ZXJ5Q29udGludWF0aW9uLFxuICAgIFJlZGlyZWN0c1Jlc3VsdCxcbiAgICBUZW1wbGF0ZURhdGFSZXN1bHQsXG59IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgeyBhcGksIGdldFBhZ2VDb250ZW50IH0gZnJvbSAnLi4vdXRpbGl0eSc7XG5cbmludGVyZmFjZSBTY3JpcHQge1xuICAgICduYW1lJzogc3RyaW5nO1xuICAgICdpbi1kZXZlbG9wbWVudCc/OiBib29sZWFuO1xuICAgICd1c2UtaW5zdGVhZCc/OiBzdHJpbmc7XG4gICAgJ2ltYWdlJz86IGZhbHNlO1xuICAgICdpbWFnZS1jYXB0aW9uJz86IHN0cmluZztcbiAgICAnc2hvcnQtZGVzY3JpcHRpb24nOiBzdHJpbmc7XG4gICAgJ2Rlc2NyaXB0aW9uJzogc3RyaW5nO1xuICAgICd1c2FnZSc/OiBzdHJpbmc7XG4gICAgJ2NvbmZpZ3VyYXRpb24nPzogc3RyaW5nO1xuICAgICdjaGFuZ2Vsb2cnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICAgICdvdGhlci1hdXRob3JzJz86IHN0cmluZ1tdO1xuICAgICdmb3JrJz86IHRydWU7XG4gICAgJ3BlcnNvbmFsJz86IHRydWU7XG4gICAgJ3NraW4tc3VwcG9ydCc6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICAgICdzb3VyY2UtbXVsdGlwbGUnPzogdHJ1ZTtcbiAgICAncmVsZWFzZWQnOiBzdHJpbmc7XG4gICAgJ3VwZGF0ZWQnOiBzdHJpbmc7XG59XG5cbm13LmxvYWRlci51c2luZyhbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJ10sICgpID0+IHtcbiAgICBpZiAobXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpICE9PSAnRWVqaXQ0MycgfHwgbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpICE9PSAnVXNlcjpFZWppdDQzJykgcmV0dXJuO1xuXG4gICAgY29uc3QgZnVsbExpbmtFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm13LWVkaXRzZWN0aW9uJykhLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MU3BhbkVsZW1lbnQ7XG5cbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGxpbmsuaHJlZiA9ICcjJztcbiAgICBsaW5rLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgbGluay50ZXh0Q29udGVudCA9ICdTeW5jIGZyb20gR2l0SHViJztcbiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIGNvbnN0IHNjcmlwdFVwZGF0ZXJEaWFsb2cgPSBuZXcgU2NyaXB0VXBkYXRlckRpYWxvZygpO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3NjcmlwdFVwZGF0ZXJEaWFsb2ddKTtcblxuICAgICAgICBzY3JpcHRVcGRhdGVyRGlhbG9nLm9wZW4oKTtcbiAgICB9KTtcblxuICAgIGZ1bGxMaW5rRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdhJykhLnJlcGxhY2VXaXRoKGxpbmspO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDIjTXlfdXNlcl9zY3JpcHRzICsgLm13LWVkaXRzZWN0aW9uJykhLmFmdGVyKGZ1bGxMaW5rRWxlbWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHRoYXQgbWFuYWdlcyB1cGRhdGluZyBzY3JpcHRzLlxuICAgICAqL1xuICAgIGNsYXNzIFNjcmlwdFVwZGF0ZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSRVBPX09XTkVSID0gJ0Vlaml0NDMnO1xuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJFUE9fTkFNRSA9ICd3aWtpcGVkaWEtc2NyaXB0cyc7XG5cbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTQ1JJUFRfTUVTU0FHRSA9ICcgKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3NjcmlwdC11cGRhdGVyLmpzfHNjcmlwdF1dKSc7XG5cbiAgICAgICAgcHJpdmF0ZSBjb250ZW50ITogT08udWkuUGFuZWxMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgc2NyaXB0c011bHRpc2VsZWN0ITogT08udWkuQ2hlY2tib3hNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBhY3Rpb25zTXVsdGlzZWxlY3QhOiBPTy51aS5DaGVja2JveE11bHRpc2VsZWN0V2lkZ2V0O1xuXG4gICAgICAgIHByaXZhdGUgbGF0ZXN0Q29tbWl0SGFzaCE6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBzY3JpcHRzITogU2NyaXB0W107XG5cbiAgICAgICAgcHJpdmF0ZSBzY3JpcHREYXRhVXBkYXRlcnMgPSB7XG4gICAgICAgICAgICAnYXJ0aWNsZS1jbGVhbmVyJzogZ2V0QXJ0aWNsZUNsZWFuZXJEYXRhLFxuICAgICAgICAgICAgJ3JlZGlyZWN0LWhlbHBlcic6IGdldFJlZGlyZWN0SGVscGVyRGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHN1cGVyKHsgc2l6ZTogJ21lZGl1bScgfSk7XG5cbiAgICAgICAgICAgIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3RhdGljLm5hbWUgPSAnU2NyaXB0VXBkYXRlckRpYWxvZyc7XG4gICAgICAgICAgICBTY3JpcHRVcGRhdGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdzY3JpcHQtdXBkYXRlcic7XG4gICAgICAgICAgICBTY3JpcHRVcGRhdGVyRGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgIHsgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9LFxuICAgICAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBBc3luY01ldGhvZCh0aGlzLmxvYWRTY3JpcHREYXRhKS50aGVuKChlcnJvcj86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnZXJyb3InLCBsYWJlbDogZXJyb3IgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChtZXNzYWdlRWxlbWVudC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZCh0aGlzLmNvbnRlbnQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFjdGlvbnMoKS5zZXRBYmlsaXRpZXMoeyBzYXZlOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHRzTXVsdGlzZWxlY3QgPSBuZXcgT08udWkuQ2hlY2tib3hNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogdGhpcy5zY3JpcHRzLm1hcCgoc2NyaXB0KSA9PiBuZXcgT08udWkuQ2hlY2tib3hNdWx0aW9wdGlvbldpZGdldCh7IGRhdGE6IHNjcmlwdC5uYW1lLCBsYWJlbDogc2NyaXB0Lm5hbWUgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHRzTXVsdGlzZWxlY3QuJGVsZW1lbnRbMF0uc3R5bGUuY29sdW1uQ291bnQgPSAnMic7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0c011bHRpc2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc2NyaXB0c011bHRpc2VsZWN0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KCc8Yj5TY3JpcHRzIHRvIHVwZGF0ZTo8L2I+JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uc011bHRpc2VsZWN0ID0gbmV3IE9PLnVpLkNoZWNrYm94TXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnZG9jdW1lbnRhdGlvbicsIG5hbWU6ICdVcGRhdGUgc2NyaXB0IGRvY3VtZW50YXRpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ3NjcmlwdCcsIG5hbWU6ICdVcGRhdGUgc2NyaXB0IGNvZGUnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogJ3RhbGsnLCBuYW1lOiAnQ3JlYXRlIHRhbGsgcmVkaXJlY3QnLCBzZWxlY3RlZERlZmF1bHQ6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyBpZCwgbmFtZSwgc2VsZWN0ZWREZWZhdWx0IH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPTy51aS5DaGVja2JveE11bHRpb3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiBuYW1lLCBzZWxlY3RlZDogc2VsZWN0ZWREZWZhdWx0ID8/IHRydWUgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zTXVsdGlzZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5hY3Rpb25zTXVsdGlzZWxlY3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoJzxiPkFjdGlvbnMgdG8gdGFrZSAoaWYgYXBwbGljYWJsZSk6PC9iPicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b25Hcm91cCA9IG5ldyBPTy51aS5CdXR0b25Hcm91cFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogT2JqZWN0LmVudHJpZXModGhpcy5zY3JpcHREYXRhVXBkYXRlcnMpLm1hcCgoW25hbWUsIHVwZGF0ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRmV0Y2hpbmcgJHtuYW1lfSBkYXRhLi4uYCwgeyB0YWc6ICd1cGRhdGUtc2NyaXB0LWRhdGEtbm90aWZpY2F0aW9uJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdXBkYXRlcigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgU3VjY2Vzc2Z1bGx5IGZldGNoZWQgJHtuYW1lfSBkYXRhLCBvcGVuaW5nIGRpZmYuLi5gLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICd1cGRhdGUtc2NyaXB0LWRhdGEtbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7IC8vIEFsbG93IHRoZSBub3RpZmljYXRpb24gdG8gYmUgc2hvd25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5EaWZmKGBVc2VyOkVlaml0NDMvc2NyaXB0cy8ke25hbWV9Lmpzb25gLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidXR0b247XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0RGF0YVVwZGF0ZXJzTXVsdGlzZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoYnV0dG9uR3JvdXAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoJzxiPlNjcmlwdCBkYXRhIHVwZGF0ZXJzOjwvYj4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChzY3JpcHRzTXVsdGlzZWxlY3RMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuJGVsZW1lbnQuYXBwZW5kKGFjdGlvbnNNdWx0aXNlbGVjdExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC4kZWxlbWVudC5hcHBlbmQoc2NyaXB0RGF0YVVwZGF0ZXJzTXVsdGlzZWxlY3RMYXlvdXQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZCh0aGlzLmNvbnRlbnQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnc2F2ZScpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTY3JpcHRzID0gKHRoaXMuc2NyaXB0c011bHRpc2VsZWN0LmZpbmRTZWxlY3RlZEl0ZW1zRGF0YSgpIGFzIHN0cmluZ1tdKS5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2NyaXB0TmFtZSkgPT4gdGhpcy5zY3JpcHRzLmZpbmQoKHNjcmlwdCkgPT4gc2NyaXB0Lm5hbWUgPT09IHNjcmlwdE5hbWUpISxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdTeW5jaW5nIHNjcmlwdHMuLi4nLCB7IHRhZzogJ3N5bmMtc2NyaXB0cy1ub3RpZmljYXRpb24nIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChzZWxlY3RlZFNjcmlwdHMubWFwKChzY3JpcHQpID0+IHRoaXMuaGFuZGxlU2NyaXB0KHNjcmlwdCkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXI6RWVqaXQ0My9zY3JpcHRzLWluZm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBTY3JpcHRzKHRoaXMuc2NyaXB0cy5maWx0ZXIoKHNjcmlwdCkgPT4gIXNjcmlwdC5wZXJzb25hbCAmJiAhc2NyaXB0LmZvcmspKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PT0gRm9ya3MgPT09JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBTY3JpcHRzKHRoaXMuc2NyaXB0cy5maWx0ZXIoKHNjcmlwdCkgPT4gc2NyaXB0LmZvcmspKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PT0gUGVyc29uYWwgc2NyaXB0cyA9PT0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFNjcmlwdHModGhpcy5zY3JpcHRzLmZpbHRlcigoc2NyaXB0KSA9PiBzY3JpcHQucGVyc29uYWwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTeW5jaW5nIHNjcmlwdCBsaXN0IGZyb20gR2l0SHViJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgU3luY2VkICR7c2VsZWN0ZWRTY3JpcHRzLmxlbmd0aH0gc2NyaXB0JHtzZWxlY3RlZFNjcmlwdHMubGVuZ3RoID09PSAxID8gJycgOiAncyd9IGZyb20gR2l0SHViIWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTY3JpcHRVcGRhdGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdyYXBzIGFuIGFzeW5jIG1ldGhvZCBpbnRvIGEgalF1ZXJ5IERlZmVycmVkIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIHdyYXAuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHdyYXBBc3luY01ldGhvZChtZXRob2Q6ICgpID0+IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICB2b2lkIG1ldGhvZCgpLnRoZW4oKHJlc3VsdCkgPT4gZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBkYXRhIGZvciBhbGwgc2NyaXB0cy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgbG9hZFNjcmlwdERhdGEgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXRlc3RDb21taXRIYXNoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke3RoaXMuUkVQT19PV05FUn0vJHt0aGlzLlJFUE9fTkFNRX0vY29tbWl0c2ApO1xuICAgICAgICAgICAgaWYgKCFsYXRlc3RDb21taXRIYXNoUmVzcG9uc2Uub2spXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBGYWlsZWQgdG8gZmV0Y2ggbGF0ZXN0IGNvbW1pdCBoYXNoIGZyb20gR2l0SHViOiAke2xhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtsYXRlc3RDb21taXRIYXNoUmVzcG9uc2Uuc3RhdHVzfSlgO1xuXG4gICAgICAgICAgICB0aGlzLmxhdGVzdENvbW1pdEhhc2ggPSAoKGF3YWl0IGxhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5qc29uKCkpIGFzIHsgc2hhOiBzdHJpbmcgfVtdKVswXS5zaGE7XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdERhdGFSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgIGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHt0aGlzLlJFUE9fT1dORVJ9LyR7dGhpcy5SRVBPX05BTUV9LyR7dGhpcy5sYXRlc3RDb21taXRIYXNofS9zY3JpcHRzLmpzb25gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghc2NyaXB0RGF0YVJlc3BvbnNlLm9rKVxuICAgICAgICAgICAgICAgIHJldHVybiBgRmFpbGVkIHRvIGZldGNoIHNjcmlwdCBkYXRhIGZyb20gR2l0SHViOiAke3NjcmlwdERhdGFSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtzY3JpcHREYXRhUmVzcG9uc2Uuc3RhdHVzfSlgO1xuXG4gICAgICAgICAgICBjb25zdCBzY3JpcHREYXRhID0gKGF3YWl0IHNjcmlwdERhdGFSZXNwb25zZS5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIE9taXQ8U2NyaXB0LCAnbmFtZSc+PjtcblxuICAgICAgICAgICAgdGhpcy5zY3JpcHRzID0gT2JqZWN0LmVudHJpZXMoc2NyaXB0RGF0YSkubWFwKChbc2NyaXB0TmFtZSwgc2NyaXB0XSkgPT4gKHsgbmFtZTogc2NyaXB0TmFtZSwgLi4uc2NyaXB0IH0pKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyBhbmQgZWRpdHMvY3JlYXRlcyBwYWdlcyBmb3IgYSBnaXZlbiBzY3JpcHQuXG4gICAgICAgICAqIEBwYXJhbSBzY3JpcHQgVGhlIHNjcmlwdCB0byBoYW5kbGUuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVNjcmlwdChzY3JpcHQ6IFNjcmlwdCkge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uc1RvVGFrZSA9IHRoaXMuYWN0aW9uc011bHRpc2VsZWN0LmZpbmRTZWxlY3RlZEl0ZW1zRGF0YSgpIGFzICgnZG9jdW1lbnRhdGlvbicgfCAnc2NyaXB0JyB8ICd0YWxrJylbXTtcblxuICAgICAgICAgICAgY29uc3Qgc3VicGFnZU5hbWUgPSBgVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc3VicGFnZVRhbGtOYW1lID0gYFVzZXIgdGFsazpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0TmFtZSA9IGAke3N1YnBhZ2VOYW1lfS5qc2A7XG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxTdWJwYWdlSW5mbyA9IFtcbiAgICAgICAgICAgICAgICAne3tVc2VyOkVlaml0NDMvc2NyaXB0LWRvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgICAgIHNjcmlwdC5pbWFnZSA9PT0gZmFsc2UgPyBgfCBpbWFnZSAgICAgICAgICAgICA9ICR7c2NyaXB0LmltYWdlfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNjcmlwdFsnaW4tZGV2ZWxvcG1lbnQnXSA/IGB8IGluLWRldmVsb3BtZW50ICAgID0gJHtzY3JpcHRbJ2luLWRldmVsb3BtZW50J119YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0Wyd1c2UtaW5zdGVhZCddXG4gICAgICAgICAgICAgICAgICAgID8gYHwgdXNlLWluc3RlYWQgICAgICAgPSAke3NjcmlwdFsndXNlLWluc3RlYWQnXS5pbmNsdWRlcygnVXNlcjonKSA/IHNjcmlwdFsndXNlLWluc3RlYWQnXSA6IGBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzLyR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddfXwke3NjcmlwdFsndXNlLWluc3RlYWQnXX1dXWB9YFxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0WydpbWFnZS1jYXB0aW9uJ10gPyBgfCBpbWFnZS1jYXB0aW9uICAgICA9ICR7c2NyaXB0WydpbWFnZS1jYXB0aW9uJ119YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0WydvdGhlci1hdXRob3JzJ11cbiAgICAgICAgICAgICAgICAgICAgPyBgfCBvdGhlci1hdXRob3JzICAgICA9ICR7c2NyaXB0WydvdGhlci1hdXRob3JzJ10ubWFwKChhdXRob3IpID0+IGBbW1VzZXI6JHthdXRob3J9fCR7YXV0aG9yfV1dYCkuam9pbignLCAnKX1gXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICBgfCBkZXNjcmlwdGlvbi1zaG9ydCA9ICR7c2NyaXB0WydzaG9ydC1kZXNjcmlwdGlvbiddfWAsXG4gICAgICAgICAgICAgICAgYHwgZGVzY3JpcHRpb24gICAgICAgPSAke3NjcmlwdC5kZXNjcmlwdGlvbn1gLFxuICAgICAgICAgICAgICAgIHNjcmlwdC51c2FnZSA/IGB8IHVzYWdlICAgICAgICAgICAgID0gJHtzY3JpcHQudXNhZ2V9YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0LmNvbmZpZ3VyYXRpb24gPyBgfCBjb25maWd1cmF0aW9uICAgICA9ICR7c2NyaXB0LmNvbmZpZ3VyYXRpb259YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0LmNoYW5nZWxvZ1xuICAgICAgICAgICAgICAgICAgICA/IGB8IGNoYW5nZWxvZyAgICAgICAgID0gXFxuJHtPYmplY3QuZW50cmllcyhzY3JpcHQuY2hhbmdlbG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtkYXRlLCBkZXNjcmlwdGlvbl0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCogJycne3tzdGFydCBkYXRlIGFuZCBhZ2V8JHtkYXRlfX19OicnJyR7QXJyYXkuaXNBcnJheShkZXNjcmlwdGlvbikgPyBgXFxuJHtkZXNjcmlwdGlvbi5tYXAoKGxpbmUpID0+IGAqKiAke2xpbmV9YCkuam9pbignXFxuJyl9YCA6IGAgJHtkZXNjcmlwdGlvbn1gfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpfWBcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGB8IHNraW4tc3VwcG9ydCAgICAgID0ge3tVc2VyOkVlaml0NDMvc2NyaXB0LWRvY3VtZW50YXRpb24vc2tpbi1zdXBwb3J0fCR7T2JqZWN0LmVudHJpZXMoc2NyaXB0Wydza2luLXN1cHBvcnQnXSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW3NraW4sIHN0YXR1c10pID0+IGAke3NraW59PSR7c3RhdHVzfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCd8Jyl9fX1gLFxuICAgICAgICAgICAgICAgIHNjcmlwdFsnc291cmNlLW11bHRpcGxlJ10gPyBgfCBzb3VyY2UtbXVsdGlwbGUgICA9ICR7c2NyaXB0Wydzb3VyY2UtbXVsdGlwbGUnXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBgfCByZWxlYXNlZCAgICAgICAgICA9IHt7c3RhcnQgZGF0ZSBhbmQgYWdlfCR7c2NyaXB0LnJlbGVhc2VkfX19YCxcbiAgICAgICAgICAgICAgICBgfCB1cGRhdGVkICAgICAgICAgICA9IHt7c3RhcnQgZGF0ZSBhbmQgYWdlfCR7c2NyaXB0LnVwZGF0ZWR9fX1gLFxuICAgICAgICAgICAgICAgICd9fScsXG4gICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICAgICAgbGV0IHNjcmlwdENvbnRlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYWN0aW9uc1RvVGFrZS5pbmNsdWRlcygnc2NyaXB0JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRDb250ZW50UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke3RoaXMuUkVQT19PV05FUn0vJHt0aGlzLlJFUE9fTkFNRX0vJHt0aGlzLmxhdGVzdENvbW1pdEhhc2h9L2Rpc3QvJHtzY3JpcHQubmFtZX0uanNgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHNjcmlwdENvbnRlbnRSZXNwb25zZS5vaykgc2NyaXB0Q29udGVudCA9IGF3YWl0IHNjcmlwdENvbnRlbnRSZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBcIiR7c2NyaXB0Lm5hbWV9LmpzXCIgZnJvbSBHaXRIdWI6ICR7c2NyaXB0Q29udGVudFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3NjcmlwdENvbnRlbnRSZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlcnJvcicsIHRhZzogJ3N5bmMtc2NyaXB0cy1ub3RpZmljYXRpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc2NyaXB0LnBlcnNvbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbnNUb1Rha2UuaW5jbHVkZXMoJ2RvY3VtZW50YXRpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoc3VicGFnZU5hbWUsIGZ1bGxTdWJwYWdlSW5mby5qb2luKCdcXG4nKSwgJ1N5bmNpbmcgc2NyaXB0IGRvY3VtZW50YXRpb24gZnJvbSBHaXRIdWInKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb25zVG9UYWtlLmluY2x1ZGVzKCd0YWxrJykpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFnZVRhbGtOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgJyNSRURJUkVDVCBbW1VzZXIgdGFsazpFZWppdDQzXV0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1JlZGlyZWN0aW5nIHNjcmlwdCBkb2N1bWVudGF0aW9uIHRhbGsgcGFnZSB0byBtYWluIHVzZXIgdGFsayBwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNjcmlwdENvbnRlbnQpIGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHNjcmlwdE5hbWUsIHNjcmlwdENvbnRlbnQsICdTeW5jaW5nIHNjcmlwdCBmcm9tIEdpdEh1YicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcHMgc2NyaXB0cyB0byBhIGJ1bGxldGVkIGxpc3QuXG4gICAgICAgICAqIEBwYXJhbSBzY3JpcHRzIFRoZSBzY3JpcHRzIHRvIG1hcC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1hcHBlZCBzY3JpcHRzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBtYXBTY3JpcHRzKHNjcmlwdHM6IFNjcmlwdFtdKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NyaXB0c1xuICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChzY3JpcHQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBgKiBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzLyR7c2NyaXB0Lm5hbWV9JHtzY3JpcHQucGVyc29uYWwgPyAnLmpzJyA6ICcnfXwke3NjcmlwdC5uYW1lfV1dIC0gJHtzY3JpcHRbJ3Nob3J0LWRlc2NyaXB0aW9uJ10gfHwgc2NyaXB0LmRlc2NyaXB0aW9ufSR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Wydpbi1kZXZlbG9wbWVudCddID8gJyAoPHNwYW4gc3R5bGU9XCJjb2xvcjogI2JkMjgyOFwiPmluIGRldmVsb3BtZW50PC9zcGFuPiknIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgIH0ke3NjcmlwdFsndXNlLWluc3RlYWQnXSA/ICcgKDxzcGFuIHN0eWxlPVwiY29sb3I6ICNiZDI4MjhcIj5kZXByZWNhdGVkPC9zcGFuPiknIDogJyd9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIGEgcGFnZSwgb3IgY3JlYXRlcyBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBwYWdlIHRvIGVkaXQuXG4gICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIGNvbnRlbnQgdG8gc2V0LlxuICAgICAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5ICh3aWxsIGFwcGVuZCBzY3JpcHQgbm90aWNlKS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZWRpdE9yQ3JlYXRlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgc3VtbWFyeTogc3RyaW5nKSB7XG4gICAgICAgICAgICBzdW1tYXJ5ICs9IHRoaXMuU0NSSVBUX01FU1NBR0U7XG5cbiAgICAgICAgICAgIGF3YWl0IGFwaVxuICAgICAgICAgICAgICAgIC5lZGl0KHRpdGxlLCAoKSA9PiAoeyB0ZXh0LCBzdW1tYXJ5LCB3YXRjaGxpc3Q6ICd3YXRjaCcgfSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGFzeW5jIChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAnbm9jcmVhdGUtbWlzc2luZycpXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGkuY3JlYXRlKHRpdGxlLCB7IHN1bW1hcnksIHdhdGNobGlzdDogJ3dhdGNoJyB9LCB0ZXh0KS5jYXRjaCgoZXJyb3JDb2RlLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciBjcmVhdGluZyAke3RpdGxlfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yPy5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlcnJvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yPy5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9wZW5zIGEgZGlmZiBmb3IgdGhlIGdpdmVuIHBhZ2UgdGl0bGUgYW5kIGNvbnRlbnQuXG4gICAgICAgICAqIEBwYXJhbSBwYWdlVGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBwYWdlIHRvIG9wZW4gYSBkaWZmIGZvci5cbiAgICAgICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gc2V0IGZvciB0aGUgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgb3BlbkRpZmYocGFnZVRpdGxlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSB7XG4gICAgICAgICAgICAgICAgd3BUZXh0Ym94MTogY29udGVudCxcbiAgICAgICAgICAgICAgICB3cFN1bW1hcnk6IGBVcGRhdGluZyBkYXRhJHt0aGlzLlNDUklQVF9NRVNTQUdFfWAsXG4gICAgICAgICAgICAgICAgd3BEaWZmOiAnMScsIC8vIEFueSB0cnV0aHkgdmFsdWUgbWFrZXMgdGhpcyB3b3JrXG4gICAgICAgICAgICAgICAgd3BXYXRjaHRoaXM6ICcxJyxcbiAgICAgICAgICAgICAgICB3cFVsdGltYXRlUGFyYW06ICcxJywgLy8gTWFya3MgdGhlIGVuZCBvZiBmb3JtIGRhdGFcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1VcmwgPSBuZXcgVVJMKGAke213LmNvbmZpZy5nZXQoJ3dnU2NyaXB0UGF0aCcpfS9pbmRleC5waHBgLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgICAgICAgIGZvcm1Vcmwuc2VhcmNoUGFyYW1zLnNldCgndGl0bGUnLCBwYWdlVGl0bGUpO1xuICAgICAgICAgICAgZm9ybVVybC5zZWFyY2hQYXJhbXMuc2V0KCdhY3Rpb24nLCAnc3VibWl0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG4gICAgICAgICAgICBmb3JtLmFjdGlvbiA9IGZvcm1VcmwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGZvcm0ubWV0aG9kID0gJ1BPU1QnO1xuICAgICAgICAgICAgZm9ybS50YXJnZXQgPSAnX2JsYW5rJztcblxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZm9ybURhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGlkZGVuRmllbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgICAgIGhpZGRlbkZpZWxkLnR5cGUgPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICBoaWRkZW5GaWVsZC5uYW1lID0ga2V5O1xuICAgICAgICAgICAgICAgIGhpZGRlbkZpZWxkLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChoaWRkZW5GaWVsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGZvcm0pO1xuICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgICAgIGZvcm0ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFNjcmlwdFVwZGF0ZXJEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG59KTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzY3JpcHQgZGF0YSBmb3IgYXJ0aWNsZS1jbGVhbmVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcnRpY2xlQ2xlYW5lckRhdGEoKSB7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBnZXRQYWdlQ29udGVudCgnV2lraXBlZGlhOkF1dG9XaWtpQnJvd3Nlci9UZW1wbGF0ZSByZWRpcmVjdHMnKSkgPz8gJyc7XG5cbiAgICBjb25zdCByZXBsYWNlbWVudHMgPSBjb250ZW50XG4gICAgICAgIC5tYXRjaEFsbCgvXFwqIHt7dGxcXHwuKy9nKVxuICAgICAgICAudG9BcnJheSgpXG4gICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGxpbmVbMF0ubWF0Y2hBbGwoL3t7dGxcXHwoLis/KX19L2cpLnRvQXJyYXkoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogdGVtcGxhdGVzLnNsaWNlKDAsIC0xKS5tYXAoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZVsxXSksIHRvOiB0ZW1wbGF0ZXMuYXQoLTEpIVsxXSB9O1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXBsYWNlbWVudHMpO1xufVxuXG4vKipcbiAqIENodW5rcyBhbiBhcnJheSBpbnRvIHNtYWxsZXIgYXJyYXlzIG9mIGEgc3BlY2lmaWVkIHNpemUuXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIGNodW5rLlxuICogQHBhcmFtIGNodW5rU2l6ZSBUaGUgc2l6ZSBvZiBlYWNoIGNodW5rLlxuICovXG5mdW5jdGlvbiBjaHVua0FycmF5PFQ+KGFycmF5OiBUW10sIGNodW5rU2l6ZTogbnVtYmVyKTogVFtdW10ge1xuICAgIGNvbnN0IGNodW5rZWQgPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4ICs9IGNodW5rU2l6ZSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCArIGNodW5rU2l6ZSk7XG5cbiAgICAgICAgY2h1bmtlZC5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2h1bmtlZDtcbn1cblxuLyoqXG4gKiBHZXRzIGEgY29udGludWVkIHF1ZXJ5IHJlc3VsdCBmcm9tIHRoZSBBUEksIHJldHVybmluZyBhbiBhcnJheSBvZiByZXN1bHRzLlxuICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb250aW51ZWRRdWVyeShxdWVyeTogQXBpUXVlcnlQYXJhbXMpOiBQcm9taXNlPEFwaVJlc3BvbnNlW10+IHtcbiAgICBsZXQgaXRlcmF0aW9uID0gMDtcblxuICAgIGNvbnN0IHJldHVyblZhbHVlID0gW107XG5cbiAgICBsZXQgcmVzcG9uc2UgPSB7IGNvbnRpbnVlOiB7fSB9IGFzIEFwaVJlc3BvbnNlICYgUXVlcnlDb250aW51YXRpb247XG5cbiAgICB3aGlsZSAoJ2NvbnRpbnVlJyBpbiByZXNwb25zZSAmJiBpdGVyYXRpb24gPCAxMCkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGFwaS5nZXQoeyAuLi5xdWVyeSwgLi4ucmVzcG9uc2UuY29udGludWUgfSBhcyBBcGlRdWVyeVBhcmFtcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXG4gICAgICAgIHJldHVyblZhbHVlLnB1c2gocmVzcG9uc2UpO1xuXG4gICAgICAgIGl0ZXJhdGlvbisrO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzY3JpcHQgZGF0YSBmb3IgcmVkaXJlY3QtaGVscGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWRpcmVjdEhlbHBlckRhdGEoKSB7XG4gICAgY29uc3QgYWxsUmVkaXJlY3RUZW1wbGF0ZXMgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgbGlzdDogJ2NhdGVnb3J5bWVtYmVycycsXG4gICAgICAgIGNtdGl0bGU6ICdDYXRlZ29yeTpSZWRpcmVjdCB0ZW1wbGF0ZXMnLFxuICAgICAgICBjbWxpbWl0OiAnbWF4JyxcbiAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5Q2F0ZWdvcnlNZW1iZXJzUGFyYW1zKSkgYXMgQ2F0ZWdvcnlNZW1iZXJzUmVzdWx0O1xuICAgIGNvbnN0IGFsbFBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgbGlzdDogJ2NhdGVnb3J5bWVtYmVycycsXG4gICAgICAgIGNtdGl0bGU6ICdDYXRlZ29yeTpUZW1wbGF0ZSByZWRpcmVjdHMgd2l0aCBwb3NzaWJpbGl0aWVzJyxcbiAgICAgICAgY21saW1pdDogJ21heCcsXG4gICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUNhdGVnb3J5TWVtYmVyc1BhcmFtcykpIGFzIENhdGVnb3J5TWVtYmVyc1Jlc3VsdDtcblxuICAgIGNvbnN0IHJlZGlyZWN0VGVtcGxhdGVzID0gYWxsUmVkaXJlY3RUZW1wbGF0ZXMucXVlcnkuY2F0ZWdvcnltZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUuc3RhcnRzV2l0aCgnVGVtcGxhdGU6UiAnKSAmJiBwYWdlLnRpdGxlICE9PSAnVGVtcGxhdGU6UiB0ZW1wbGF0ZSBpbmRleCcpXG4gICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7IG5hbWU6IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXSwgcmVkaXJlY3Q6IGZhbHNlIH0pKTtcbiAgICBjb25zdCBwb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzID0gYWxsUG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcy5xdWVyeS5jYXRlZ29yeW1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gcGFnZS50aXRsZS5zdGFydHNXaXRoKCdUZW1wbGF0ZTpSICcpICYmIHBhZ2UudGl0bGUgIT09ICdUZW1wbGF0ZTpSIHdpdGggcG9zc2liaWxpdGllcycpXG4gICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7IG5hbWU6IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXSwgcmVkaXJlY3Q6IHRydWUgfSkpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tYXJyYXktc29ydFxuICAgIGNvbnN0IGFsbFRlbXBsYXRlcyA9IFsuLi5yZWRpcmVjdFRlbXBsYXRlcywgLi4ucG9zc2libGVSZWRpcmVjdFRlbXBsYXRlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAvLyBGb3JjZSBjb21pY3MgYW5kIE1pZGRsZSBFYXJ0aCB0ZW1wbGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgICAgICBpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoJ1IgY29taWNzJykgfHwgYS5uYW1lLnN0YXJ0c1dpdGgoJ1IgTUUnKSkgcmV0dXJuIDE7XG4gICAgICAgIGVsc2UgaWYgKGIubmFtZS5zdGFydHNXaXRoKCdSIGNvbWljcycpIHx8IGIubmFtZS5zdGFydHNXaXRoKCdSIE1FJykpIHJldHVybiAtMTtcbiAgICAgICAgZWxzZSByZXR1cm4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbmFsRGF0YSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgYWxsVGVtcGxhdGVzLm1hcCgocGFnZSkgPT4gW3BhZ2UubmFtZSwgeyByZWRpcmVjdDogcGFnZS5yZWRpcmVjdCwgcGFyYW1ldGVyczoge30sIGFsaWFzZXM6IFtdIGFzIHN0cmluZ1tdIH1dKSxcbiAgICApO1xuXG4gICAgLy8gRmV0Y2ggdGhlIFRlbXBsYXRlRGF0YSBmb3IgYWxsIHRlbXBsYXRlc1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjaHVua0FycmF5KGFsbFRlbXBsYXRlcywgNTApLm1hcChhc3luYyAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlRGF0YVF1ZXJ5UmVzdWx0ID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3RlbXBsYXRlZGF0YScsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiBjaHVuay5tYXAoKHBhZ2UpID0+IGBUZW1wbGF0ZToke3BhZ2UubmFtZX1gKSxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBUZW1wbGF0ZURhdGFBcGlUZW1wbGF0ZURhdGFQYXJhbXMpKSBhcyBUZW1wbGF0ZURhdGFSZXN1bHQ7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBPYmplY3QudmFsdWVzKHRlbXBsYXRlRGF0YVF1ZXJ5UmVzdWx0LnBhZ2VzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFBhcmFtZXRlcnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHBhZ2UucGFyYW1zKS5tYXAoKFtuYW1lLCBkYXRhXSkgPT4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBkYXRhLmFsaWFzZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGRhdGEubGFiZWw/LmVuID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEuZGVzY3JpcHRpb24/LmVuID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBkYXRhLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZDogZGF0YS5zdWdnZXN0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZGF0YS5kZWZhdWx0Py5lbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGU6IGRhdGEuZXhhbXBsZT8uZW4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBmaW5hbERhdGFbcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdXS5wYXJhbWV0ZXJzID0gZm9ybWF0dGVkUGFyYW1ldGVycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEZpbmQgYWxpYXNlcyBvZiByZWRpcmVjdCB0ZW1wbGF0ZXNcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2h1bmtBcnJheShyZWRpcmVjdFRlbXBsYXRlcywgNTApLm1hcChhc3luYyAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFsbFJlZGlyZWN0c1F1ZXJ5UmVzdWx0ID0gKGF3YWl0IGdldENvbnRpbnVlZFF1ZXJ5KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiBjaHVuay5tYXAoKHBhZ2UpID0+IGBUZW1wbGF0ZToke3BhZ2UubmFtZX1gKSxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmVkaXJlY3RzJyxcbiAgICAgICAgICAgICAgICByZG5hbWVzcGFjZTogMTAsXG4gICAgICAgICAgICAgICAgcmRsaW1pdDogJ21heCcsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlCYWNrbGlua3Nwcm9wUGFyYW1zKSkgYXMgUmVkaXJlY3RzUmVzdWx0W107XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0c1F1ZXJ5UmVzdWx0UGFnZXMgPSBhbGxSZWRpcmVjdHNRdWVyeVJlc3VsdC5mbGF0TWFwKChyZXN1bHQpID0+IHJlc3VsdC5xdWVyeS5wYWdlcyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiByZWRpcmVjdHNRdWVyeVJlc3VsdFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkUmVkaXJlY3RzID1cbiAgICAgICAgICAgICAgICAgICAgcGFnZS5yZWRpcmVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChyZWRpcmVjdCkgPT4gcmVkaXJlY3QudGl0bGUuc3BsaXQoJzonKVsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHJlZGlyZWN0KSA9PiAhcG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUubmFtZSA9PT0gcmVkaXJlY3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkgPz8gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW5pY29ybi9uby1hcnJheS1zb3J0XG5cbiAgICAgICAgICAgICAgICBmaW5hbERhdGFbcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdXS5hbGlhc2VzLnB1c2goLi4ubWFwcGVkUmVkaXJlY3RzKTsgLy8gRGF0YSBtaWdodCBleGlzdCBmcm9tIHByZXZpb3VzIHF1ZXJpZXMsIHNvIHVwZGF0ZSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBGaW5kIGFsaWFzZXMgb2YgcG9zc2libGUgcmVkaXJlY3QgdGVtcGxhdGVzXG4gICAgY29uc3QgYWxsQWxpYXNlc09mUG9zc2libGVUZW1wbGF0ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2h1bmtBcnJheShwb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzLCA1MCkubWFwKGFzeW5jIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlua3NRdWVyeVJlc3VsdCA9IChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiBjaHVuay5tYXAoKHBhZ2UpID0+IGBUZW1wbGF0ZToke3BhZ2UubmFtZX1gKSxcbiAgICAgICAgICAgICAgICBwcm9wOiAnbGlua3NoZXJlJyxcbiAgICAgICAgICAgICAgICBsaG5hbWVzcGFjZTogMTAsXG4gICAgICAgICAgICAgICAgbGhsaW1pdDogJ21heCcsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlCYWNrbGlua3Nwcm9wUGFyYW1zKSkgYXMgTGlua3NIZXJlUmVzdWx0O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgbGlua3NRdWVyeVJlc3VsdC5xdWVyeS5wYWdlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlZGlyZWN0cyA9XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UubGlua3NoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICA/LmZpbHRlcigocGFnZSkgPT4gcGFnZS5yZWRpcmVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlLmVuZHNXaXRoKCcvZG9jJykgJiYgIXBhZ2UuZW5kc1dpdGgoJy9zYW5kYm94JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSA/PyBbXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL25vLWFycmF5LXNvcnRcblxuICAgICAgICAgICAgICAgIGFsbEFsaWFzZXNPZlBvc3NpYmxlVGVtcGxhdGVzLnB1c2goLi4ubWFwcGVkUmVkaXJlY3RzKTtcblxuICAgICAgICAgICAgICAgIGZpbmFsRGF0YVtwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV1dLmFsaWFzZXMgPSBtYXBwZWRSZWRpcmVjdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXBwZWRGaW5hbERhdGEgPSBPYmplY3QuZW50cmllcyhmaW5hbERhdGEpLm1hcCgoW25hbWUsIHRlbXBsYXRlRGF0YV0pID0+IHtcbiAgICAgICAgY29uc3QgZmluYWxUZW1wbGF0ZURhdGEgPSB7XG4gICAgICAgICAgICAuLi4odGVtcGxhdGVEYXRhLnJlZGlyZWN0ID8geyByZWRpcmVjdDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogdGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBhbGlhc2VzOiB0ZW1wbGF0ZURhdGEuYWxpYXNlcy5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vbm8tYXJyYXktc29ydFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBbbmFtZSwgZmluYWxUZW1wbGF0ZURhdGFdIGFzIGNvbnN0O1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBwb3NzaWJsZVRlbXBsYXRlQWxpYXMgb2YgYWxsQWxpYXNlc09mUG9zc2libGVUZW1wbGF0ZXMpXG4gICAgICAgIGZvciAoY29uc3QgWywgZGF0YV0gb2YgbWFwcGVkRmluYWxEYXRhKVxuICAgICAgICAgICAgaWYgKCFkYXRhLnJlZGlyZWN0ICYmIGRhdGEuYWxpYXNlcy5pbmNsdWRlcyhwb3NzaWJsZVRlbXBsYXRlQWxpYXMpKVxuICAgICAgICAgICAgICAgIGRhdGEuYWxpYXNlcyA9IGRhdGEuYWxpYXNlcy5maWx0ZXIoKGFsaWFzKSA9PiBhbGlhcyAhPT0gcG9zc2libGVUZW1wbGF0ZUFsaWFzKTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMobWFwcGVkRmluYWxEYXRhKSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7bUJBR08sSUFBTUEsRUFBTSxJQUFJLEdBQUcsSUFNMUIsZUFBc0JDLEVBQWVDLEVBQWUsQ0FDaEQsT0FDSyxNQUFNRixFQUFJLElBQUksQ0FDWCxPQUFRLFFBQ1IsY0FBZSxJQUNmLEtBQU0sWUFDTixPQUFRLFVBQ1IsUUFBUyxPQUNULE9BQVFFLENBQ1osQ0FBbUMsR0FDckMsTUFBTSxNQUFNLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxNQUFNLEtBQUssUUFBUSxLQUFLLENBQzVELENDaUJBLEdBQUcsT0FBTyxNQUFNLENBQUMsaUJBQWtCLGVBQWdCLGtCQUFtQixpQkFBaUIsRUFBRyxJQUFNLENBQzVGLEdBQUksR0FBRyxPQUFPLElBQUksWUFBWSxJQUFNLFdBQWEsR0FBRyxPQUFPLElBQUksWUFB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LEVBQW9CLENBQ3RCLEdBQUlELEVBQWEsU0FBVyxDQUFFLFNBQVUsRUFBSyxFQUFJLENBQUMsRUFDbEQsV0FBWUEsRUFBYSxXQUN6QixRQUFTQSxFQUFhLFFBQVEsS0FBSyxDQUFDLEVBQUdWLElBQU0sRUFBRSxjQUFjQSxDQUFDLENBQUMsQ0FDbkUsRUFFQSxNQUFPLENBQUNuRSxFQUFNOEUsQ0FBaUIsQ0FDbkMsQ0FBQyxFQUVELFFBQVdDLEtBQXlCTCxFQUNoQyxPQUFXLENBQUMsQ0FBRXBFLENBQUksSUFBS3NFLEVBQ2YsQ0FBQ3RFLEVBQUssVUFBWUEsRUFBSyxRQUFRLFNBQVN5RSxDQUFxQixJQUM3RHpFLEVBQUssUUFBVUEsRUFBSyxRQUFRLE9BQVEwRSxHQUFVQSxJQUFVRCxDQUFxQixHQUV6RixPQUFPLEtBQUssVUFBVSxPQUFPLFlBQVlILENBQWUsQ0FBQyxDQUM3RCIsCiAgIm5hbWVzIjogWyJhcGkiLCAiZ2V0UGFnZUNvbnRlbnQiLCAidGl0bGUiLCAiZnVsbExpbmtFbGVtZW50IiwgImxpbmsiLCAiZXZlbnQiLCAid2luZG93TWFuYWdlciIsICJzY3JpcHRVcGRhdGVyRGlhbG9nIiwgIlNjcmlwdFVwZGF0ZXJEaWFsb2ciLCAiZ2V0QXJ0aWNsZUNsZWFuZXJEYXRhIiwgImdldFJlZGlyZWN0SGVscGVyRGF0YSIsICJlcnJvciIsICJtZXNzYWdlRWxlbWVudCIsICJzY3JpcHQiLCAic2NyaXB0c011bHRpc2VsZWN0TGF5b3V0IiwgImlkIiwgIm5hbWUiLCAic2VsZWN0ZWREZWZhdWx0IiwgImFjdGlvbnNNdWx0aXNlbGVjdExheW91dCIsICJidXR0b25Hcm91cCIsICJ1cGRhdGVyIiwgImJ1dHRvbiIsICJkYXRhIiwgInJlc29sdmUiLCAic2NyaXB0RGF0YVVwZGF0ZXJzTXVsdGlzZWxlY3RMYXlvdXQiLCAiYWN0aW9uIiwgInNlbGVjdGVkU2NyaXB0cyIsICJzY3JpcHROYW1lIiwgIm1ldGhvZCIsICJkZWZlcnJlZCIsICJyZXN1bHQiLCAibGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlIiwgInNjcmlwdERhdGFSZXNwb25zZSIsICJzY3JpcHREYXRhIiwgImFjdGlvbnNUb1Rha2UiLCAic3VicGFnZU5hbWUiLCAic3VicGFnZVRhbGtOYW1lIiwgImZ1bGxTdWJwYWdlSW5mbyIsICJhdXRob3IiLCAiZGF0ZSIsICJkZXNjcmlwdGlvbiIsICJsaW5lIiwgInNraW4iLCAic3RhdHVzIiwgInNjcmlwdENvbnRlbnQiLCAic2NyaXB0Q29udGVudFJlc3BvbnNlIiwgInNjcmlwdHMiLCAidGl0bGUiLCAidGV4dCIsICJzdW1tYXJ5IiwgImFwaSIsICJlcnJvckNvZGUiLCAiZXJyb3JJbmZvIiwgInBhZ2VUaXRsZSIsICJjb250ZW50IiwgImZvcm1EYXRhIiwgImZvcm1VcmwiLCAiZm9ybSIsICJrZXkiLCAidmFsdWUiLCAiaGlkZGVuRmllbGQiLCAicmVwbGFjZW1lbnRzIiwgImdldFBhZ2VDb250ZW50IiwgInRlbXBsYXRlcyIsICJ0ZW1wbGF0ZSIsICJjaHVua0FycmF5IiwgImFycmF5IiwgImNodW5rU2l6ZSIsICJjaHVua2VkIiwgImluZGV4IiwgImNodW5rIiwgImdldENvbnRpbnVlZFF1ZXJ5IiwgInF1ZXJ5IiwgIml0ZXJhdGlvbiIsICJyZXR1cm5WYWx1ZSIsICJyZXNwb25zZSIsICJhbGxSZWRpcmVjdFRlbXBsYXRlcyIsICJhbGxQb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzIiwgInJlZGlyZWN0VGVtcGxhdGVzIiwgInBhZ2UiLCAicG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcyIsICJhbGxUZW1wbGF0ZXMiLCAiYSIsICJiIiwgImZpbmFsRGF0YSIsICJ0ZW1wbGF0ZURhdGFRdWVyeVJlc3VsdCIsICJmb3JtYXR0ZWRQYXJhbWV0ZXJzIiwgInJlZGlyZWN0c1F1ZXJ5UmVzdWx0UGFnZXMiLCAibWFwcGVkUmVkaXJlY3RzIiwgInJlZGlyZWN0IiwgImFsbEFsaWFzZXNPZlBvc3NpYmxlVGVtcGxhdGVzIiwgImxpbmtzUXVlcnlSZXN1bHQiLCAibWFwcGVkRmluYWxEYXRhIiwgInRlbXBsYXRlRGF0YSIsICJmaW5hbFRlbXBsYXRlRGF0YSIsICJwb3NzaWJsZVRlbXBsYXRlQWxpYXMiLCAiYWxpYXMiXQp9Cg==

AltStyle によって変換されたページ (->オリジナル) /