// <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";(()=>{var g=new mw.Api;async function y(d){return(await g.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;let d=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();let e=new OO.ui.WindowManager;document.body.append(e.$element[0]);let s=new l;e.addWindows([s]),s.open()}),d.querySelector("a").replaceWith(u),document.querySelector("h2#My_user_scripts + .mw-editsection").after(d);class l extends OO.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){let i=new OO.ui.MessageWidget({type:"error",label:e});this.content=new OO.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=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.scriptsMultiselect=new OO.ui.CheckboxMultiselectWidget({items:this.scripts.map(i=>new OO.ui.CheckboxMultioptionWidget({data:i.name,label:i.name}))}),this.scriptsMultiselect.$element[0].style.columnCount="2";let s=new OO.ui.FieldLayout(this.scriptsMultiselect,{label:new OO.ui.HtmlSnippet("<b>Scripts to update:</b>"),align:"top"});this.actionsMultiselect=new OO.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})=>new OO.ui.CheckboxMultioptionWidget({data:i,label:r,selected:a??!0}))});let n=new OO.ui.FieldLayout(this.actionsMultiselect,{label:new OO.ui.HtmlSnippet("<b>Actions to take (if applicable):</b>"),align:"top"}),m=new OO.ui.ButtonGroupWidget({items:Object.entries(this.scriptDataUpdaters).map(([i,r])=>{let a=new OO.ui.ButtonWidget({label:i,flags:["progressive"]});return a.on("click",async()=>{mw.notify(`Fetching ${i} data...`,{tag:"update-script-data-notification"});let o=await r();mw.notify(`Successfully fetched ${i} data, opening diff...`,{type:"success",tag:"update-script-data-notification"}),await new Promise(c=>setTimeout(c,500)),this.openDiff(`User:Eejit43/scripts/${i}.json`,o)}),a})}),t=new OO.ui.FieldLayout(m,{label:new OO.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"?new OO.ui.Process(()=>{this.close()}):e==="save"?new OO.ui.Process(()=>{let s=this.scriptsMultiselect.findSelectedItemsData().map(n=>this.scripts.find(m=>m.name===n));this.close(),(async()=>(mw.notify("Syncing scripts...",{tag:"sync-scripts-notification"}),await Promise.all(s.map(n=>this.handleScript(n))),await this.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){let s=$.Deferred();return e().then(n=>s.resolve(n)),s.promise()}loadScriptData=async()=>{let e=await fetch(`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=(await e.json())[0].sha;let s=await fetch(`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})`;let n=await s.json();this.scripts=Object.entries(n).map(([m,t])=>({name:m,...t}))};async handleScript(e){let s=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")){let a=await fetch(`https://raw.githubusercontent.com/${this.REPO_OWNER}/${this.REPO_NAME}/${this.latestCommitHash}/dist/${e.name}.js`);if(a.ok)r=await a.text();else return mw.notify(`Failed to fetch "${e.name}.js" from GitHub: ${a.statusText} (${a.status})`,{type:"error",tag:"sync-scripts-notification"})}e.personal||(s.includes("documentation")&&await this.editOrCreate(n,i.join(`
`),"Syncing script documentation from GitHub"),s.includes("talk")&&await this.editOrCreate(m,"#REDIRECT [[User talk:Eejit43]]","Redirecting script documentation talk page to main user talk page")),r&&await this.editOrCreate(t,r,"Syncing script from GitHub")}mapScripts(e){return e.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(`
`)}async editOrCreate(e,s,n){n+=this.SCRIPT_MESSAGE,await g.edit(e,()=>({text:s,summary:n,watchlist:"watch"})).catch(async(m,t)=>{if(m==="nocreate-missing")await g.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){let n={wpTextbox1:s,wpSummary:`Updating data${this.SCRIPT_MESSAGE}`,wpDiff:"1",wpUltimateParam:"1"},m=new URL(`${mw.config.get("wgScriptPath")}/index.php`,window.___location.origin);m.searchParams.set("title",e),m.searchParams.set("action","submit");let t=document.createElement("form");t.action=m.toString(),t.method="POST",t.target="_blank";for(let[i,r]of Object.entries(n)){let a=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)});async function w(){let u=(await y("Wikipedia:AutoWikiBrowser/Template redirects")??"").matchAll(/\* {{tl\|.+/g).toArray().map(l=>{let p=l[0].matchAll(/{{tl\|(.+?)}}/g).toArray();return{from:p.slice(0,-1).map(e=>e[1]),to:p.at(-1)[1]}});return JSON.stringify(u)}function h(d,u){let l=[];for(let p=0;p<d.length;p+=u){let e=d.slice(p,p+u);l.push(e)}return l}async function b(d){let u=0,l=[],p={continue:{}};for(;"continue"in p&&u<10;)p=await g.get({...d,...p.continue}),l.push(p),u++;return l}async function O(){let d=await g.get({action:"query",list:"categorymembers",cmtitle:"Category:Redirect templates",cmlimit:"max",formatversion:"2"}),u=await g.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:[]}]));await Promise.all(h(e,50).map(async t=>{let i=await g.get({action:"templatedata",titles:t.map(r=>`Template:${r.name}`),formatversion:"2"});for(let r of Object.values(i.pages)){let a=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}})),await Promise.all(h(l,50).map(async t=>{let r=(await b({action:"query",titles:t.map(a=>`Template:${a.name}`),prop:"redirects",rdnamespace:10,rdlimit:"max",formatversion:"2"})).flatMap(a=>a.query.pages);for(let a of r){let o=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)}}));let n=[];await Promise.all(h(p,50).map(async t=>{let i=await g.get({action:"query",titles:t.map(r=>`Template:${r.name}`),prop:"linkshere",lhnamespace:10,lhlimit:"max",formatversion:"2"});for(let r of i.query.pages){let a=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}}));let m=Object.entries(s).map(([t,i])=>{let r={...i.redirect?{redirect:!0}:{},parameters:i.parameters,aliases:i.aliases.sort((a,o)=>a.localeCompare(o))};return[t,r]});for(let t of n)for(let[,i]of m)!i.redirect&&i.aliases.includes(t)&&(i.aliases=i.aliases.filter(r=>r!==t));return JSON.stringify(Object.fromEntries(m))}})();
// </pre>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zY3JpcHRzL3NjcmlwdC11cGRhdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi9nbG9iYWwtdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwYWdlLlxuICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSB0byBmZXRjaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnM/LlswXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgICBBcGlRdWVyeUJhY2tsaW5rc3Byb3BQYXJhbXMsXG4gICAgQXBpUXVlcnlDYXRlZ29yeU1lbWJlcnNQYXJhbXMsXG4gICAgQXBpUXVlcnlQYXJhbXMsXG4gICAgVGVtcGxhdGVEYXRhQXBpVGVtcGxhdGVEYXRhUGFyYW1zLFxufSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IEFwaVJlc3BvbnNlIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL213L0FwaSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQ2F0ZWdvcnlNZW1iZXJzUmVzdWx0LFxuICAgIExpbmtzSGVyZVJlc3VsdCxcbiAgICBNZWRpYVdpa2lEYXRhRXJyb3IsXG4gICAgUXVlcnlDb250aW51YXRpb24sXG4gICAgUmVkaXJlY3RzUmVzdWx0LFxuICAgIFRlbXBsYXRlRGF0YVJlc3VsdCxcbn0gZnJvbSAnLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB7IGFwaSwgZ2V0UGFnZUNvbnRlbnQgfSBmcm9tICcuLi91dGlsaXR5JztcblxuaW50ZXJmYWNlIFNjcmlwdCB7XG4gICAgJ25hbWUnOiBzdHJpbmc7XG4gICAgJ2luLWRldmVsb3BtZW50Jz86IGJvb2xlYW47XG4gICAgJ3VzZS1pbnN0ZWFkJz86IHN0cmluZztcbiAgICAnaW1hZ2UnPzogZmFsc2U7XG4gICAgJ2ltYWdlLWNhcHRpb24nPzogc3RyaW5nO1xuICAgICdzaG9ydC1kZXNjcmlwdGlvbic6IHN0cmluZztcbiAgICAnZGVzY3JpcHRpb24nOiBzdHJpbmc7XG4gICAgJ3VzYWdlJz86IHN0cmluZztcbiAgICAnY29uZmlndXJhdGlvbic/OiBzdHJpbmc7XG4gICAgJ2NoYW5nZWxvZyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG4gICAgJ290aGVyLWF1dGhvcnMnPzogc3RyaW5nW107XG4gICAgJ2ZvcmsnPzogdHJ1ZTtcbiAgICAncGVyc29uYWwnPzogdHJ1ZTtcbiAgICAnc2tpbi1zdXBwb3J0JzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgJ3NvdXJjZS1tdWx0aXBsZSc/OiB0cnVlO1xuICAgICdyZWxlYXNlZCc6IHN0cmluZztcbiAgICAndXBkYXRlZCc6IHN0cmluZztcbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgKCkgPT4ge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgIT09ICdFZWppdDQzJyB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgIT09ICdVc2VyOkVlaml0NDMnKSByZXR1cm47XG5cbiAgICBjb25zdCBmdWxsTGlua0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubXctZWRpdHNlY3Rpb24nKSEuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxTcGFuRWxlbWVudDtcblxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGluay5ocmVmID0gJyMnO1xuICAgIGxpbmsuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICBsaW5rLnRleHRDb250ZW50ID0gJ1N5bmMgZnJvbSBHaXRIdWInO1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0VXBkYXRlckRpYWxvZyA9IG5ldyBTY3JpcHRVcGRhdGVyRGlhbG9nKCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2NyaXB0VXBkYXRlckRpYWxvZ10pO1xuXG4gICAgICAgIHNjcmlwdFVwZGF0ZXJEaWFsb2cub3BlbigpO1xuICAgIH0pO1xuXG4gICAgZnVsbExpbmtFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EnKSEucmVwbGFjZVdpdGgobGluayk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMiNNeV91c2VyX3NjcmlwdHMgKyAubXctZWRpdHNlY3Rpb24nKSEuYWZ0ZXIoZnVsbExpbmtFbGVtZW50KTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdGhhdCBtYW5hZ2VzIHVwZGF0aW5nIHNjcmlwdHMuXG4gICAgICovXG4gICAgY2xhc3MgU2NyaXB0VXBkYXRlckRpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJFUE9fT1dORVIgPSAnRWVqaXQ0Myc7XG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUkVQT19OQU1FID0gJ3dpa2lwZWRpYS1zY3JpcHRzJztcblxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNDUklQVF9NRVNTQUdFID0gJyAodmlhIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvc2NyaXB0LXVwZGF0ZXIuanN8c2NyaXB0XV0pJztcblxuICAgICAgICBwcml2YXRlIGNvbnRlbnQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzY3JpcHRzTXVsdGlzZWxlY3QhOiBPTy51aS5DaGVja2JveE11bHRpc2VsZWN0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGFjdGlvbnNNdWx0aXNlbGVjdCE6IE9PLnVpLkNoZWNrYm94TXVsdGlzZWxlY3RXaWRnZXQ7XG5cbiAgICAgICAgcHJpdmF0ZSBsYXRlc3RDb21taXRIYXNoITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHNjcmlwdHMhOiBTY3JpcHRbXTtcblxuICAgICAgICBwcml2YXRlIHNjcmlwdERhdGFVcGRhdGVycyA9IHtcbiAgICAgICAgICAgICdhcnRpY2xlLWNsZWFuZXInOiBnZXRBcnRpY2xlQ2xlYW5lckRhdGEsXG4gICAgICAgICAgICAncmVkaXJlY3QtaGVscGVyJzogZ2V0UmVkaXJlY3RIZWxwZXJEYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoeyBzaXplOiAnbWVkaXVtJyB9KTtcblxuICAgICAgICAgICAgU2NyaXB0VXBkYXRlckRpYWxvZy5zdGF0aWMubmFtZSA9ICdTY3JpcHRVcGRhdGVyRGlhbG9nJztcbiAgICAgICAgICAgIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3RhdGljLnRpdGxlID0gJ3NjcmlwdC11cGRhdGVyJztcbiAgICAgICAgICAgIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0sXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdzYXZlJywgbGFiZWw6ICdSdW4nLCBmbGFnczogWydwcmltYXJ5JywgJ3Byb2dyZXNzaXZlJ10gfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU2NyaXB0VXBkYXRlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcEFzeW5jTWV0aG9kKHRoaXMubG9hZFNjcmlwdERhdGEpLnRoZW4oKGVycm9yPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdlcnJvcicsIGxhYmVsOiBlcnJvciB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuJGVsZW1lbnQuYXBwZW5kKG1lc3NhZ2VFbGVtZW50LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aW9ucygpLnNldEFiaWxpdGllcyh7IHNhdmU6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdHNNdWx0aXNlbGVjdCA9IG5ldyBPTy51aS5DaGVja2JveE11bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnNjcmlwdHMubWFwKChzY3JpcHQpID0+IG5ldyBPTy51aS5DaGVja2JveE11bHRpb3B0aW9uV2lkZ2V0KHsgZGF0YTogc2NyaXB0Lm5hbWUsIGxhYmVsOiBzY3JpcHQubmFtZSB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdHNNdWx0aXNlbGVjdC4kZWxlbWVudFswXS5zdHlsZS5jb2x1bW5Db3VudCA9ICcyJztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRzTXVsdGlzZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zY3JpcHRzTXVsdGlzZWxlY3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoJzxiPlNjcmlwdHMgdG8gdXBkYXRlOjwvYj4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zTXVsdGlzZWxlY3QgPSBuZXcgT08udWkuQ2hlY2tib3hNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdkb2N1bWVudGF0aW9uJywgbmFtZTogJ1VwZGF0ZSBzY3JpcHQgZG9jdW1lbnRhdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnc2NyaXB0JywgbmFtZTogJ1VwZGF0ZSBzY3JpcHQgY29kZScgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAndGFsaycsIG5hbWU6ICdDcmVhdGUgdGFsayByZWRpcmVjdCcsIHNlbGVjdGVkRGVmYXVsdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0ubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IGlkLCBuYW1lLCBzZWxlY3RlZERlZmF1bHQgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9PLnVpLkNoZWNrYm94TXVsdGlvcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IG5hbWUsIHNlbGVjdGVkOiBzZWxlY3RlZERlZmF1bHQgPz8gdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbnNNdWx0aXNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmFjdGlvbnNNdWx0aXNlbGVjdCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldCgnPGI+QWN0aW9ucyB0byB0YWtlIChpZiBhcHBsaWNhYmxlKTo8L2I+JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkdyb3VwID0gbmV3IE9PLnVpLkJ1dHRvbkdyb3VwV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBPYmplY3QuZW50cmllcyh0aGlzLnNjcmlwdERhdGFVcGRhdGVycykubWFwKChbbmFtZSwgdXBkYXRlcl0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBGZXRjaGluZyAke25hbWV9IGRhdGEuLi5gLCB7IHRhZzogJ3VwZGF0ZS1zY3JpcHQtZGF0YS1ub3RpZmljYXRpb24nIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB1cGRhdGVyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBTdWNjZXNzZnVsbHkgZmV0Y2hlZCAke25hbWV9IGRhdGEsIG9wZW5pbmcgZGlmZi4uLmAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogJ3VwZGF0ZS1zY3JpcHQtZGF0YS1ub3RpZmljYXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTsgLy8gQWxsb3cgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBzaG93blxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkRpZmYoYFVzZXI6RWVqaXQ0My9zY3JpcHRzLyR7bmFtZX0uanNvbmAsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHREYXRhVXBkYXRlcnNNdWx0aXNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChidXR0b25Hcm91cCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldCgnPGI+U2NyaXB0IGRhdGEgdXBkYXRlcnM6PC9iPicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuJGVsZW1lbnQuYXBwZW5kKHNjcmlwdHNNdWx0aXNlbGVjdExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC4kZWxlbWVudC5hcHBlbmQoYWN0aW9uc011bHRpc2VsZWN0TGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChzY3JpcHREYXRhVXBkYXRlcnNNdWx0aXNlbGVjdExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnY2FuY2VsJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFNjcmlwdHMgPSAodGhpcy5zY3JpcHRzTXVsdGlzZWxlY3QuZmluZFNlbGVjdGVkSXRlbXNEYXRhKCkgYXMgc3RyaW5nW10pLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzY3JpcHROYW1lKSA9PiB0aGlzLnNjcmlwdHMuZmluZCgoc2NyaXB0KSA9PiBzY3JpcHQubmFtZSA9PT0gc2NyaXB0TmFtZSkhLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1N5bmNpbmcgc2NyaXB0cy4uLicsIHsgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHNlbGVjdGVkU2NyaXB0cy5tYXAoKHNjcmlwdCkgPT4gdGhpcy5oYW5kbGVTY3JpcHQoc2NyaXB0KSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlcjpFZWppdDQzL3NjcmlwdHMtaW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFNjcmlwdHModGhpcy5zY3JpcHRzLmZpbHRlcigoc2NyaXB0KSA9PiAhc2NyaXB0LnBlcnNvbmFsICYmICFzY3JpcHQuZm9yaykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz09PSBGb3JrcyA9PT0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFNjcmlwdHModGhpcy5zY3JpcHRzLmZpbHRlcigoc2NyaXB0KSA9PiBzY3JpcHQuZm9yaykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz09PSBQZXJzb25hbCBzY3JpcHRzID09PScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwU2NyaXB0cyh0aGlzLnNjcmlwdHMuZmlsdGVyKChzY3JpcHQpID0+IHNjcmlwdC5wZXJzb25hbCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N5bmNpbmcgc2NyaXB0IGxpc3QgZnJvbSBHaXRIdWInLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBTeW5jZWQgJHtzZWxlY3RlZFNjcmlwdHMubGVuZ3RofSBzY3JpcHQke3NlbGVjdGVkU2NyaXB0cy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30gZnJvbSBHaXRIdWIhYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICdzeW5jLXNjcmlwdHMtbm90aWZpY2F0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZSByZXR1cm4gU2NyaXB0VXBkYXRlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogV3JhcHMgYW4gYXN5bmMgbWV0aG9kIGludG8gYSBqUXVlcnkgRGVmZXJyZWQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gd3JhcC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgd3JhcEFzeW5jTWV0aG9kKG1ldGhvZDogKCkgPT4gUHJvbWlzZTx1bmtub3duPikge1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIHZvaWQgbWV0aG9kKCkudGhlbigocmVzdWx0KSA9PiBkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIGRhdGEgZm9yIGFsbCBzY3JpcHRzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBsb2FkU2NyaXB0RGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdENvbW1pdEhhc2hSZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7dGhpcy5SRVBPX09XTkVSfS8ke3RoaXMuUkVQT19OQU1FfS9jb21taXRzYCk7XG4gICAgICAgICAgICBpZiAoIWxhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5vaylcbiAgICAgICAgICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBmZXRjaCBsYXRlc3QgY29tbWl0IGhhc2ggZnJvbSBHaXRIdWI6ICR7bGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2xhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5zdGF0dXN9KWA7XG5cbiAgICAgICAgICAgIHRoaXMubGF0ZXN0Q29tbWl0SGFzaCA9ICgoYXdhaXQgbGF0ZXN0Q29tbWl0SGFzaFJlc3BvbnNlLmpzb24oKSkgYXMgeyBzaGE6IHN0cmluZyB9W10pWzBdLnNoYTtcblxuICAgICAgICAgICAgY29uc3Qgc2NyaXB0RGF0YVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke3RoaXMuUkVQT19PV05FUn0vJHt0aGlzLlJFUE9fTkFNRX0vJHt0aGlzLmxhdGVzdENvbW1pdEhhc2h9L3NjcmlwdHMuanNvbmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFzY3JpcHREYXRhUmVzcG9uc2Uub2spXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBGYWlsZWQgdG8gZmV0Y2ggc2NyaXB0IGRhdGEgZnJvbSBHaXRIdWI6ICR7c2NyaXB0RGF0YVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3NjcmlwdERhdGFSZXNwb25zZS5zdGF0dXN9KWA7XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdERhdGEgPSAoYXdhaXQgc2NyaXB0RGF0YVJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgT21pdDxTY3JpcHQsICduYW1lJz4+O1xuXG4gICAgICAgICAgICB0aGlzLnNjcmlwdHMgPSBPYmplY3QuZW50cmllcyhzY3JpcHREYXRhKS5tYXAoKFtzY3JpcHROYW1lLCBzY3JpcHRdKSA9PiAoeyBuYW1lOiBzY3JpcHROYW1lLCAuLi5zY3JpcHQgfSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIGFuZCBlZGl0cy9jcmVhdGVzIHBhZ2VzIGZvciBhIGdpdmVuIHNjcmlwdC5cbiAgICAgICAgICogQHBhcmFtIHNjcmlwdCBUaGUgc2NyaXB0IHRvIGhhbmRsZS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU2NyaXB0KHNjcmlwdDogU2NyaXB0KSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zVG9UYWtlID0gdGhpcy5hY3Rpb25zTXVsdGlzZWxlY3QuZmluZFNlbGVjdGVkSXRlbXNEYXRhKCkgYXMgKCdkb2N1bWVudGF0aW9uJyB8ICdzY3JpcHQnIHwgJ3RhbGsnKVtdO1xuXG4gICAgICAgICAgICBjb25zdCBzdWJwYWdlTmFtZSA9IGBVc2VyOkVlaml0NDMvc2NyaXB0cy8ke3NjcmlwdC5uYW1lfWA7XG4gICAgICAgICAgICBjb25zdCBzdWJwYWdlVGFsa05hbWUgPSBgVXNlciB0YWxrOkVlaml0NDMvc2NyaXB0cy8ke3NjcmlwdC5uYW1lfWA7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHROYW1lID0gYCR7c3VicGFnZU5hbWV9LmpzYDtcblxuICAgICAgICAgICAgY29uc3QgZnVsbFN1YnBhZ2VJbmZvID0gW1xuICAgICAgICAgICAgICAgICd7e1VzZXI6RWVqaXQ0My9zY3JpcHQtZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgc2NyaXB0LmltYWdlID09PSBmYWxzZSA/IGB8IGltYWdlICAgICAgICAgICAgID0gJHtzY3JpcHQuaW1hZ2V9YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0Wydpbi1kZXZlbG9wbWVudCddID8gYHwgaW4tZGV2ZWxvcG1lbnQgICAgPSAke3NjcmlwdFsnaW4tZGV2ZWxvcG1lbnQnXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ3VzZS1pbnN0ZWFkJ11cbiAgICAgICAgICAgICAgICAgICAgPyBgfCB1c2UtaW5zdGVhZCAgICAgICA9ICR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddLmluY2x1ZGVzKCdVc2VyOicpID8gc2NyaXB0Wyd1c2UtaW5zdGVhZCddIDogYFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHRbJ3VzZS1pbnN0ZWFkJ119fCR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddfV1dYH1gXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ2ltYWdlLWNhcHRpb24nXSA/IGB8IGltYWdlLWNhcHRpb24gICAgID0gJHtzY3JpcHRbJ2ltYWdlLWNhcHRpb24nXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ290aGVyLWF1dGhvcnMnXVxuICAgICAgICAgICAgICAgICAgICA/IGB8IG90aGVyLWF1dGhvcnMgICAgID0gJHtzY3JpcHRbJ290aGVyLWF1dGhvcnMnXS5tYXAoKGF1dGhvcikgPT4gYFtbVXNlcjoke2F1dGhvcn18JHthdXRob3J9XV1gKS5qb2luKCcsICcpfWBcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGB8IGRlc2NyaXB0aW9uLXNob3J0ID0gJHtzY3JpcHRbJ3Nob3J0LWRlc2NyaXB0aW9uJ119YCxcbiAgICAgICAgICAgICAgICBgfCBkZXNjcmlwdGlvbiAgICAgICA9ICR7c2NyaXB0LmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICAgICAgc2NyaXB0LnVzYWdlID8gYHwgdXNhZ2UgICAgICAgICAgICAgPSAke3NjcmlwdC51c2FnZX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHQuY29uZmlndXJhdGlvbiA/IGB8IGNvbmZpZ3VyYXRpb24gICAgID0gJHtzY3JpcHQuY29uZmlndXJhdGlvbn1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHQuY2hhbmdlbG9nXG4gICAgICAgICAgICAgICAgICAgID8gYHwgY2hhbmdlbG9nICAgICAgICAgPSBcXG4ke09iamVjdC5lbnRyaWVzKHNjcmlwdC5jaGFuZ2Vsb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoW2RhdGUsIGRlc2NyaXB0aW9uXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKiAnJyd7e3N0YXJ0IGRhdGUgYW5kIGFnZXwke2RhdGV9fX06JycnJHtBcnJheS5pc0FycmF5KGRlc2NyaXB0aW9uKSA/IGBcXG4ke2Rlc2NyaXB0aW9uLm1hcCgobGluZSkgPT4gYCoqICR7bGluZX1gKS5qb2luKCdcXG4nKX1gIDogYCAke2Rlc2NyaXB0aW9ufWB9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignXFxuJyl9YFxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgYHwgc2tpbi1zdXBwb3J0ICAgICAgPSB7e1VzZXI6RWVqaXQ0My9zY3JpcHQtZG9jdW1lbnRhdGlvbi9za2luLXN1cHBvcnR8JHtPYmplY3QuZW50cmllcyhzY3JpcHRbJ3NraW4tc3VwcG9ydCddKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbc2tpbiwgc3RhdHVzXSkgPT4gYCR7c2tpbn09JHtzdGF0dXN9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ3wnKX19fWAsXG4gICAgICAgICAgICAgICAgc2NyaXB0Wydzb3VyY2UtbXVsdGlwbGUnXSA/IGB8IHNvdXJjZS1tdWx0aXBsZSAgID0gJHtzY3JpcHRbJ3NvdXJjZS1tdWx0aXBsZSddfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGB8IHJlbGVhc2VkICAgICAgICAgID0ge3tzdGFydCBkYXRlIGFuZCBhZ2V8JHtzY3JpcHQucmVsZWFzZWR9fX1gLFxuICAgICAgICAgICAgICAgIGB8IHVwZGF0ZWQgICAgICAgICAgID0ge3tzdGFydCBkYXRlIGFuZCBhZ2V8JHtzY3JpcHQudXBkYXRlZH19fWAsXG4gICAgICAgICAgICAgICAgJ319JyxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICBsZXQgc2NyaXB0Q29udGVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb25zVG9UYWtlLmluY2x1ZGVzKCdzY3JpcHQnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnRSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7dGhpcy5SRVBPX09XTkVSfS8ke3RoaXMuUkVQT19OQU1FfS8ke3RoaXMubGF0ZXN0Q29tbWl0SGFzaH0vZGlzdC8ke3NjcmlwdC5uYW1lfS5qc2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Q29udGVudFJlc3BvbnNlLm9rKSBzY3JpcHRDb250ZW50ID0gYXdhaXQgc2NyaXB0Q29udGVudFJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoIFwiJHtzY3JpcHQubmFtZX0uanNcIiBmcm9tIEdpdEh1YjogJHtzY3JpcHRDb250ZW50UmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7c2NyaXB0Q29udGVudFJlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJywgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzY3JpcHQucGVyc29uYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uc1RvVGFrZS5pbmNsdWRlcygnZG9jdW1lbnRhdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShzdWJwYWdlTmFtZSwgZnVsbFN1YnBhZ2VJbmZvLmpvaW4oJ1xcbicpLCAnU3luY2luZyBzY3JpcHQgZG9jdW1lbnRhdGlvbiBmcm9tIEdpdEh1YicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbnNUb1Rha2UuaW5jbHVkZXMoJ3RhbGsnKSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJwYWdlVGFsa05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnI1JFRElSRUNUIFtbVXNlciB0YWxrOkVlaml0NDNdXScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVkaXJlY3Rpbmcgc2NyaXB0IGRvY3VtZW50YXRpb24gdGFsayBwYWdlIHRvIG1haW4gdXNlciB0YWxrIHBhZ2UnLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NyaXB0Q29udGVudCkgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoc2NyaXB0TmFtZSwgc2NyaXB0Q29udGVudCwgJ1N5bmNpbmcgc2NyaXB0IGZyb20gR2l0SHViJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBzY3JpcHRzIHRvIGEgYnVsbGV0ZWQgbGlzdC5cbiAgICAgICAgICogQHBhcmFtIHNjcmlwdHMgVGhlIHNjcmlwdHMgdG8gbWFwLlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWFwcGVkIHNjcmlwdHMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIG1hcFNjcmlwdHMoc2NyaXB0czogU2NyaXB0W10pIHtcbiAgICAgICAgICAgIHJldHVybiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHNjcmlwdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGAqIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX0ke3NjcmlwdC5wZXJzb25hbCA/ICcuanMnIDogJyd9fCR7c2NyaXB0Lm5hbWV9XV0gLSAke3NjcmlwdFsnc2hvcnQtZGVzY3JpcHRpb24nXSB8fCBzY3JpcHQuZGVzY3JpcHRpb259JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRbJ2luLWRldmVsb3BtZW50J10gPyAnICg8c3BhbiBzdHlsZT1cImNvbG9yOiAjYmQyODI4XCI+aW4gZGV2ZWxvcG1lbnQ8L3NwYW4+KScgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddID8gJyAoPHNwYW4gc3R5bGU9XCJjb2xvcjogI2JkMjgyOFwiPmRlcHJlY2F0ZWQ8L3NwYW4+KScgOiAnJ31gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRWRpdHMgYSBwYWdlLCBvciBjcmVhdGVzIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhlIHBhZ2UgdG8gZWRpdC5cbiAgICAgICAgICogQHBhcmFtIHRleHQgVGhlIHBhZ2UgY29udGVudCB0byBzZXQuXG4gICAgICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBlZGl0IHN1bW1hcnkgKHdpbGwgYXBwZW5kIHNjcmlwdCBub3RpY2UpLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBlZGl0T3JDcmVhdGUodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBzdW1tYXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHN1bW1hcnkgKz0gdGhpcy5TQ1JJUFRfTUVTU0FHRTtcblxuICAgICAgICAgICAgYXdhaXQgYXBpXG4gICAgICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnksIHdhdGNobGlzdDogJ3dhdGNoJyB9KSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goYXN5bmMgKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jcmVhdGUodGl0bGUsIHsgc3VtbWFyeSwgd2F0Y2hsaXN0OiAnd2F0Y2gnIH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciBlZGl0aW5nIG9yIGNyZWF0aW5nICR7dGl0bGV9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogT3BlbnMgYSBkaWZmIGZvciB0aGUgZ2l2ZW4gcGFnZSB0aXRsZSBhbmQgY29udGVudC5cbiAgICAgICAgICogQHBhcmFtIHBhZ2VUaXRsZSBUaGUgdGl0bGUgb2YgdGhlIHBhZ2UgdG8gb3BlbiBhIGRpZmYgZm9yLlxuICAgICAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBzZXQgZm9yIHRoZSBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBvcGVuRGlmZihwYWdlVGl0bGU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB3cFRleHRib3gxOiBjb250ZW50LFxuICAgICAgICAgICAgICAgIHdwU3VtbWFyeTogYFVwZGF0aW5nIGRhdGEke3RoaXMuU0NSSVBUX01FU1NBR0V9YCxcbiAgICAgICAgICAgICAgICB3cERpZmY6ICcxJywgLy8gQW55IHRydXRoeSB2YWx1ZSBtYWtlcyB0aGlzIHdvcmtcbiAgICAgICAgICAgICAgICB3cFVsdGltYXRlUGFyYW06ICcxJywgLy8gTWFya3MgdGhlIGVuZCBvZiBmb3JtIGRhdGFcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1VcmwgPSBuZXcgVVJMKGAke213LmNvbmZpZy5nZXQoJ3dnU2NyaXB0UGF0aCcpfS9pbmRleC5waHBgLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgICAgICAgIGZvcm1Vcmwuc2VhcmNoUGFyYW1zLnNldCgndGl0bGUnLCBwYWdlVGl0bGUpO1xuICAgICAgICAgICAgZm9ybVVybC5zZWFyY2hQYXJhbXMuc2V0KCdhY3Rpb24nLCAnc3VibWl0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG4gICAgICAgICAgICBmb3JtLmFjdGlvbiA9IGZvcm1VcmwudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGZvcm0ubWV0aG9kID0gJ1BPU1QnO1xuICAgICAgICAgICAgZm9ybS50YXJnZXQgPSAnX2JsYW5rJztcblxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZm9ybURhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGlkZGVuRmllbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgICAgIGhpZGRlbkZpZWxkLnR5cGUgPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICBoaWRkZW5GaWVsZC5uYW1lID0ga2V5O1xuICAgICAgICAgICAgICAgIGhpZGRlbkZpZWxkLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChoaWRkZW5GaWVsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGZvcm0pO1xuICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgICAgIGZvcm0ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFNjcmlwdFVwZGF0ZXJEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG59KTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzY3JpcHQgZGF0YSBmb3IgYXJ0aWNsZS1jbGVhbmVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcnRpY2xlQ2xlYW5lckRhdGEoKSB7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBnZXRQYWdlQ29udGVudCgnV2lraXBlZGlhOkF1dG9XaWtpQnJvd3Nlci9UZW1wbGF0ZSByZWRpcmVjdHMnKSkgPz8gJyc7XG5cbiAgICBjb25zdCByZXBsYWNlbWVudHMgPSBjb250ZW50XG4gICAgICAgIC5tYXRjaEFsbCgvXFwqIHt7dGxcXHwuKy9nKVxuICAgICAgICAudG9BcnJheSgpXG4gICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGxpbmVbMF0ubWF0Y2hBbGwoL3t7dGxcXHwoLis/KX19L2cpLnRvQXJyYXkoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogdGVtcGxhdGVzLnNsaWNlKDAsIC0xKS5tYXAoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZVsxXSksIHRvOiB0ZW1wbGF0ZXMuYXQoLTEpIVsxXSB9O1xuICAgICAgICB9KTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZXBsYWNlbWVudHMpO1xufVxuXG4vKipcbiAqIENodW5rcyBhbiBhcnJheSBpbnRvIHNtYWxsZXIgYXJyYXlzIG9mIGEgc3BlY2lmaWVkIHNpemUuXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIGNodW5rLlxuICogQHBhcmFtIGNodW5rU2l6ZSBUaGUgc2l6ZSBvZiBlYWNoIGNodW5rLlxuICovXG5mdW5jdGlvbiBjaHVua0FycmF5PFQ+KGFycmF5OiBUW10sIGNodW5rU2l6ZTogbnVtYmVyKTogVFtdW10ge1xuICAgIGNvbnN0IGNodW5rZWQgPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4ICs9IGNodW5rU2l6ZSkge1xuICAgICAgICBjb25zdCBjaHVuayA9IGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCArIGNodW5rU2l6ZSk7XG5cbiAgICAgICAgY2h1bmtlZC5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2h1bmtlZDtcbn1cblxuLyoqXG4gKiBHZXRzIGEgY29udGludWVkIHF1ZXJ5IHJlc3VsdCBmcm9tIHRoZSBBUEksIHJldHVybmluZyBhbiBhcnJheSBvZiByZXN1bHRzLlxuICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb250aW51ZWRRdWVyeShxdWVyeTogQXBpUXVlcnlQYXJhbXMpOiBQcm9taXNlPEFwaVJlc3BvbnNlW10+IHtcbiAgICBsZXQgaXRlcmF0aW9uID0gMDtcblxuICAgIGNvbnN0IHJldHVyblZhbHVlID0gW107XG5cbiAgICBsZXQgcmVzcG9uc2UgPSB7IGNvbnRpbnVlOiB7fSB9IGFzIEFwaVJlc3BvbnNlICYgUXVlcnlDb250aW51YXRpb247XG5cbiAgICB3aGlsZSAoJ2NvbnRpbnVlJyBpbiByZXNwb25zZSAmJiBpdGVyYXRpb24gPCAxMCkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGFwaS5nZXQoeyAuLi5xdWVyeSwgLi4ucmVzcG9uc2UuY29udGludWUgfSBhcyBBcGlRdWVyeVBhcmFtcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuXG4gICAgICAgIHJldHVyblZhbHVlLnB1c2gocmVzcG9uc2UpO1xuXG4gICAgICAgIGl0ZXJhdGlvbisrO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzY3JpcHQgZGF0YSBmb3IgcmVkaXJlY3QtaGVscGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWRpcmVjdEhlbHBlckRhdGEoKSB7XG4gICAgY29uc3QgYWxsUmVkaXJlY3RUZW1wbGF0ZXMgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgbGlzdDogJ2NhdGVnb3J5bWVtYmVycycsXG4gICAgICAgIGNtdGl0bGU6ICdDYXRlZ29yeTpSZWRpcmVjdCB0ZW1wbGF0ZXMnLFxuICAgICAgICBjbWxpbWl0OiAnbWF4JyxcbiAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5Q2F0ZWdvcnlNZW1iZXJzUGFyYW1zKSkgYXMgQ2F0ZWdvcnlNZW1iZXJzUmVzdWx0O1xuICAgIGNvbnN0IGFsbFBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgbGlzdDogJ2NhdGVnb3J5bWVtYmVycycsXG4gICAgICAgIGNtdGl0bGU6ICdDYXRlZ29yeTpUZW1wbGF0ZSByZWRpcmVjdHMgd2l0aCBwb3NzaWJpbGl0aWVzJyxcbiAgICAgICAgY21saW1pdDogJ21heCcsXG4gICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUNhdGVnb3J5TWVtYmVyc1BhcmFtcykpIGFzIENhdGVnb3J5TWVtYmVyc1Jlc3VsdDtcblxuICAgIGNvbnN0IHJlZGlyZWN0VGVtcGxhdGVzID0gYWxsUmVkaXJlY3RUZW1wbGF0ZXMucXVlcnkuY2F0ZWdvcnltZW1iZXJzXG4gICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUuc3RhcnRzV2l0aCgnVGVtcGxhdGU6UiAnKSAmJiBwYWdlLnRpdGxlICE9PSAnVGVtcGxhdGU6UiB0ZW1wbGF0ZSBpbmRleCcpXG4gICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7IG5hbWU6IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXSwgcmVkaXJlY3Q6IGZhbHNlIH0pKTtcbiAgICBjb25zdCBwb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzID0gYWxsUG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcy5xdWVyeS5jYXRlZ29yeW1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gcGFnZS50aXRsZS5zdGFydHNXaXRoKCdUZW1wbGF0ZTpSICcpICYmIHBhZ2UudGl0bGUgIT09ICdUZW1wbGF0ZTpSIHdpdGggcG9zc2liaWxpdGllcycpXG4gICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7IG5hbWU6IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXSwgcmVkaXJlY3Q6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgYWxsVGVtcGxhdGVzID0gWy4uLnJlZGlyZWN0VGVtcGxhdGVzLCAuLi5wb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEZvcmNlIGNvbWljcyBhbmQgTWlkZGxlIEVhcnRoIHRlbXBsYXRlcyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgICAgIGlmIChhLm5hbWUuc3RhcnRzV2l0aCgnUiBjb21pY3MnKSB8fCBhLm5hbWUuc3RhcnRzV2l0aCgnUiBNRScpKSByZXR1cm4gMTtcbiAgICAgICAgZWxzZSBpZiAoYi5uYW1lLnN0YXJ0c1dpdGgoJ1IgY29taWNzJykgfHwgYi5uYW1lLnN0YXJ0c1dpdGgoJ1IgTUUnKSkgcmV0dXJuIC0xO1xuICAgICAgICBlbHNlIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZmluYWxEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBhbGxUZW1wbGF0ZXMubWFwKChwYWdlKSA9PiBbcGFnZS5uYW1lLCB7IHJlZGlyZWN0OiBwYWdlLnJlZGlyZWN0LCBwYXJhbWV0ZXJzOiB7fSwgYWxpYXNlczogW10gYXMgc3RyaW5nW10gfV0pLFxuICAgICk7XG5cbiAgICAvLyBGZXRjaCB0aGUgVGVtcGxhdGVEYXRhIGZvciBhbGwgdGVtcGxhdGVzXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNodW5rQXJyYXkoYWxsVGVtcGxhdGVzLCA1MCkubWFwKGFzeW5jIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVEYXRhUXVlcnlSZXN1bHQgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAndGVtcGxhdGVkYXRhJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGNodW5rLm1hcCgocGFnZSkgPT4gYFRlbXBsYXRlOiR7cGFnZS5uYW1lfWApLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIFRlbXBsYXRlRGF0YUFwaVRlbXBsYXRlRGF0YVBhcmFtcykpIGFzIFRlbXBsYXRlRGF0YVJlc3VsdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIE9iamVjdC52YWx1ZXModGVtcGxhdGVEYXRhUXVlcnlSZXN1bHQucGFnZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1ldGVycyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocGFnZS5wYXJhbXMpLm1hcCgoW25hbWUsIGRhdGFdKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IGRhdGEuYWxpYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZGF0YS5sYWJlbD8uZW4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5kZXNjcmlwdGlvbj8uZW4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkOiBkYXRhLnN1Z2dlc3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBkYXRhLmRlZmF1bHQ/LmVuID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZTogZGF0YS5leGFtcGxlPy5lbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZpbmFsRGF0YVtwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV1dLnBhcmFtZXRlcnMgPSBmb3JtYXR0ZWRQYXJhbWV0ZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gRmluZCBhbGlhc2VzIG9mIHJlZGlyZWN0IHRlbXBsYXRlc1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjaHVua0FycmF5KHJlZGlyZWN0VGVtcGxhdGVzLCA1MCkubWFwKGFzeW5jIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxsUmVkaXJlY3RzUXVlcnlSZXN1bHQgPSAoYXdhaXQgZ2V0Q29udGludWVkUXVlcnkoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGNodW5rLm1hcCgocGFnZSkgPT4gYFRlbXBsYXRlOiR7cGFnZS5uYW1lfWApLFxuICAgICAgICAgICAgICAgIHByb3A6ICdyZWRpcmVjdHMnLFxuICAgICAgICAgICAgICAgIHJkbmFtZXNwYWNlOiAxMCxcbiAgICAgICAgICAgICAgICByZGxpbWl0OiAnbWF4JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUJhY2tsaW5rc3Byb3BQYXJhbXMpKSBhcyBSZWRpcmVjdHNSZXN1bHRbXTtcblxuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RzUXVlcnlSZXN1bHRQYWdlcyA9IGFsbFJlZGlyZWN0c1F1ZXJ5UmVzdWx0LmZsYXRNYXAoKHJlc3VsdCkgPT4gcmVzdWx0LnF1ZXJ5LnBhZ2VzKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHJlZGlyZWN0c1F1ZXJ5UmVzdWx0UGFnZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRSZWRpcmVjdHMgPVxuICAgICAgICAgICAgICAgICAgICBwYWdlLnJlZGlyZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKHJlZGlyZWN0KSA9PiByZWRpcmVjdC50aXRsZS5zcGxpdCgnOicpWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocmVkaXJlY3QpID0+ICFwb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzLnNvbWUoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSByZWRpcmVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSA/PyBbXTtcblxuICAgICAgICAgICAgICAgIGZpbmFsRGF0YVtwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV1dLmFsaWFzZXMucHVzaCguLi5tYXBwZWRSZWRpcmVjdHMpOyAvLyBEYXRhIG1pZ2h0IGV4aXN0IGZyb20gcHJldmlvdXMgcXVlcmllcywgc28gdXBkYXRlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEZpbmQgYWxpYXNlcyBvZiBwb3NzaWJsZSByZWRpcmVjdCB0ZW1wbGF0ZXNcbiAgICBjb25zdCBhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjaHVua0FycmF5KHBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMsIDUwKS5tYXAoYXN5bmMgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5rc1F1ZXJ5UmVzdWx0ID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGNodW5rLm1hcCgocGFnZSkgPT4gYFRlbXBsYXRlOiR7cGFnZS5uYW1lfWApLFxuICAgICAgICAgICAgICAgIHByb3A6ICdsaW5rc2hlcmUnLFxuICAgICAgICAgICAgICAgIGxobmFtZXNwYWNlOiAxMCxcbiAgICAgICAgICAgICAgICBsaGxpbWl0OiAnbWF4JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUJhY2tsaW5rc3Byb3BQYXJhbXMpKSBhcyBMaW5rc0hlcmVSZXN1bHQ7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBsaW5rc1F1ZXJ5UmVzdWx0LnF1ZXJ5LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkUmVkaXJlY3RzID1cbiAgICAgICAgICAgICAgICAgICAgcGFnZS5saW5rc2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8uZmlsdGVyKChwYWdlKSA9PiBwYWdlLnJlZGlyZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuZW5kc1dpdGgoJy9kb2MnKSAmJiAhcGFnZS5lbmRzV2l0aCgnL3NhbmRib3gnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpID8/IFtdO1xuXG4gICAgICAgICAgICAgICAgYWxsQWxpYXNlc09mUG9zc2libGVUZW1wbGF0ZXMucHVzaCguLi5tYXBwZWRSZWRpcmVjdHMpO1xuXG4gICAgICAgICAgICAgICAgZmluYWxEYXRhW3BhZ2UudGl0bGUuc3BsaXQoJzonKVsxXV0uYWxpYXNlcyA9IG1hcHBlZFJlZGlyZWN0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1hcHBlZEZpbmFsRGF0YSA9IE9iamVjdC5lbnRyaWVzKGZpbmFsRGF0YSkubWFwKChbbmFtZSwgdGVtcGxhdGVEYXRhXSkgPT4ge1xuICAgICAgICBjb25zdCBmaW5hbFRlbXBsYXRlRGF0YSA9IHtcbiAgICAgICAgICAgIC4uLih0ZW1wbGF0ZURhdGEucmVkaXJlY3QgPyB7IHJlZGlyZWN0OiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyxcbiAgICAgICAgICAgIGFsaWFzZXM6IHRlbXBsYXRlRGF0YS5hbGlhc2VzLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIFtuYW1lLCBmaW5hbFRlbXBsYXRlRGF0YV0gYXMgY29uc3Q7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHBvc3NpYmxlVGVtcGxhdGVBbGlhcyBvZiBhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlcylcbiAgICAgICAgZm9yIChjb25zdCBbLCBkYXRhXSBvZiBtYXBwZWRGaW5hbERhdGEpXG4gICAgICAgICAgICBpZiAoIWRhdGEucmVkaXJlY3QgJiYgZGF0YS5hbGlhc2VzLmluY2x1ZGVzKHBvc3NpYmxlVGVtcGxhdGVBbGlhcykpXG4gICAgICAgICAgICAgICAgZGF0YS5hbGlhc2VzID0gZGF0YS5hbGlhc2VzLmZpbHRlcigoYWxpYXMpID0+IGFsaWFzICE9PSBwb3NzaWJsZVRlbXBsYXRlQWxpYXMpO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KE9iamVjdC5mcm9tRW50cmllcyhtYXBwZWRGaW5hbERhdGEpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OzttQkFHTyxJQUFNQSxFQUFNLElBQUksR0FBRyxJQU0xQixlQUFzQkMsRUFBZUMsRUFBZSxDQUNoRCxPQUNLLE1BQU1GLEVBQUksSUFBSSxDQUNYLE9BQVEsUUFDUixjQUFlLElBQ2YsS0FBTSxZQUNOLE9BQVEsVUFDUixRQUFTLE9BQ1QsT0FBUUUsQ0FDWixDQUFtQyxHQUNyQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FDNUQsQ0NpQkEsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGlCQUFpQixFQUFHLElBQU0sQ0FDNUYsR0FBSSxHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sV0FBYSxHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sZUFBZ0IsT0FFakcsSUFBTUMsRUFBa0IsU0FBUyxjQUFjLGlCQUFpQixFQUFHLFVBQVUsRUFBSSxFQUUzRUMsRUFBTyxTQUFTLGNBQWMsR0FBRyxFQUN2Q0EsRUFBSyxLQUFPLElBQ1pBLEVBQUssTUFBTSxXQUFhLE9BQ3hCQSxFQUFLLFlBQWMsbUJBQ25CQSxFQUFLLGlCQUFpQixRQUFVQyxHQUFVLENBQ3RDQSxFQUFNLGVBQWUsRUFFckIsSUFBTUMsRUFBZ0Is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RSxDQUFJLElBQUtzRSxFQUNmLENBQUN0RSxFQUFLLFVBQVlBLEVBQUssUUFBUSxTQUFTeUUsQ0FBcUIsSUFDN0R6RSxFQUFLLFFBQVVBLEVBQUssUUFBUSxPQUFRMEUsR0FBVUEsSUFBVUQsQ0FBcUIsR0FFekYsT0FBTyxLQUFLLFVBQVUsT0FBTyxZQUFZSCxDQUFlLENBQUMsQ0FDN0QiLAogICJuYW1lcyI6IFsiYXBpIiwgImdldFBhZ2VDb250ZW50IiwgInRpdGxlIiwgImZ1bGxMaW5rRWxlbWVudCIsICJsaW5rIiwgImV2ZW50IiwgIndpbmRvd01hbmFnZXIiLCAic2NyaXB0VXBkYXRlckRpYWxvZyIsICJTY3JpcHRVcGRhdGVyRGlhbG9nIiwgImdldEFydGljbGVDbGVhbmVyRGF0YSIsICJnZXRSZWRpcmVjdEhlbHBlckRhdGEiLCAiZXJyb3IiLCAibWVzc2FnZUVsZW1lbnQiLCAic2NyaXB0IiwgInNjcmlwdHNNdWx0aXNlbGVjdExheW91dCIsICJpZCIsICJuYW1lIiwgInNlbGVjdGVkRGVmYXVsdCIsICJhY3Rpb25zTXVsdGlzZWxlY3RMYXlvdXQiLCAiYnV0dG9uR3JvdXAiLCAidXBkYXRlciIsICJidXR0b24iLCAiZGF0YSIsICJyZXNvbHZlIiwgInNjcmlwdERhdGFVcGRhdGVyc011bHRpc2VsZWN0TGF5b3V0IiwgImFjdGlvbiIsICJzZWxlY3RlZFNjcmlwdHMiLCAic2NyaXB0TmFtZSIsICJtZXRob2QiLCAiZGVmZXJyZWQiLCAicmVzdWx0IiwgImxhdGVzdENvbW1pdEhhc2hSZXNwb25zZSIsICJzY3JpcHREYXRhUmVzcG9uc2UiLCAic2NyaXB0RGF0YSIsICJhY3Rpb25zVG9UYWtlIiwgInN1YnBhZ2VOYW1lIiwgInN1YnBhZ2VUYWxrTmFtZSIsICJmdWxsU3VicGFnZUluZm8iLCAiYXV0aG9yIiwgImRhdGUiLCAiZGVzY3JpcHRpb24iLCAibGluZSIsICJza2luIiwgInN0YXR1cyIsICJzY3JpcHRDb250ZW50IiwgInNjcmlwdENvbnRlbnRSZXNwb25zZSIsICJzY3JpcHRzIiwgInRpdGxlIiwgInRleHQiLCAic3VtbWFyeSIsICJhcGkiLCAiZXJyb3JDb2RlIiwgImVycm9ySW5mbyIsICJwYWdlVGl0bGUiLCAiY29udGVudCIsICJmb3JtRGF0YSIsICJmb3JtVXJsIiwgImZvcm0iLCAia2V5IiwgInZhbHVlIiwgImhpZGRlbkZpZWxkIiwgInJlcGxhY2VtZW50cyIsICJnZXRQYWdlQ29udGVudCIsICJ0ZW1wbGF0ZXMiLCAidGVtcGxhdGUiLCAiY2h1bmtBcnJheSIsICJhcnJheSIsICJjaHVua1NpemUiLCAiY2h1bmtlZCIsICJpbmRleCIsICJjaHVuayIsICJnZXRDb250aW51ZWRRdWVyeSIsICJxdWVyeSIsICJpdGVyYXRpb24iLCAicmV0dXJuVmFsdWUiLCAicmVzcG9uc2UiLCAiYWxsUmVkaXJlY3RUZW1wbGF0ZXMiLCAiYWxsUG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcyIsICJyZWRpcmVjdFRlbXBsYXRlcyIsICJwYWdlIiwgInBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMiLCAiYWxsVGVtcGxhdGVzIiwgImEiLCAiYiIsICJmaW5hbERhdGEiLCAidGVtcGxhdGVEYXRhUXVlcnlSZXN1bHQiLCAiZm9ybWF0dGVkUGFyYW1ldGVycyIsICJyZWRpcmVjdHNRdWVyeVJlc3VsdFBhZ2VzIiwgIm1hcHBlZFJlZGlyZWN0cyIsICJyZWRpcmVjdCIsICJhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlcyIsICJsaW5rc1F1ZXJ5UmVzdWx0IiwgIm1hcHBlZEZpbmFsRGF0YSIsICJ0ZW1wbGF0ZURhdGEiLCAiZmluYWxUZW1wbGF0ZURhdGEiLCAicG9zc2libGVUZW1wbGF0ZUFsaWFzIiwgImFsaWFzIl0KfQo=