mic_none

User:Eejit43/scripts/redirect-helper.js Source: en.wikipedia.org/wiki/User:Eejit43/scripts/redirect-helper.js

// <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/redirect-helper/redirect-helper.ts

"use strict";(()=>{var B=Object.defineProperty;var x=(g,t)=>()=>(g&&(t=g(g=0)),t);var M=(g,t)=>{for(var i in t)B(g,i,{get:t[i],enumerable:!0})};async function w(g){return(await d.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:g})).query.pages[0].revisions?.[0].slots.main.content.trim()}var d,b=x(()=>{"use strict";d=new mw.Api});var O,R=x(()=>{"use strict";b();O=class extends OO.ui.TextInputWidget{validCategories=new Set;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue().split("|")[0],i=$.Deferred();t||i.resolve([]);let e=this.getValue().split("|")[1];if(e&&this.validCategories.has(t)){let s=[{data:`${t}|${e}`,label:`${t} (with sort key "${e}")`}];i.resolve(s),this.emit("showing-values",s)}let a=mw.Title.newFromText(t);return d.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:a?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(s=>{if(s?.query?.pages){let r=s.query.pages.filter(o=>!o.categories?.some(n=>n.title==="Category:Wikipedia soft redirected categories")).map(o=>{let n=o.title.split(":")[1];return this.validCategories.add(n),{data:n,label:n}});this.emit("showing-values",r),i.resolve(r)}else i.resolve([])}),i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype)});var P,I=x(()=>{"use strict";b();P=class g extends OO.ui.ProcessDialog{hasLoadedDiffStyles=!1;constructor(t){super(t),g.static.name="ChangesDialog",g.static.title="Changes to be made",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>{this.hasLoadedDiffStyles||(mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.hasLoadedDiffStyles=!0);let[t,i]=this.getData();return d.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":i,"tocontentmodel-main":"wikitext"}).then(e=>{let a=e.compare.body,s=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),r=new OO.ui.PanelLayout({padded:!0,expanded:!1});r.$element.append(a?`
<table class="diff diff-editfont-monospace">
    <colgroup>
        <col class="diff-marker">
        <col class="diff-content">
        <col class="diff-marker">
        <col class="diff-content">
    </colgroup>
    <tbody>
        ${a}
    </tbody>
</table>`:s.$element[0]),this.$body.append(r.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(P.prototype,OO.ui.ProcessDialog.prototype)});var S,L=x(()=>{"use strict";b();S=class g extends OO.ui.ProcessDialog{pageTitleParsed;constructor(t,i){super(t),this.pageTitleParsed=i,g.static.name="OutputPreviewDialog",g.static.title="Redirect categorization templates preview",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>d.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:this.getData()}).then(t=>{let i=t.parse.text,e=t.parse.categorieshtml,a=new OO.ui.PanelLayout({padded:!0,expanded:!1});a.$element.append(i,e),this.$body.append(a.$element)}));getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(S.prototype,OO.ui.ProcessDialog.prototype)});var v,E=x(()=>{"use strict";b();v=class extends OO.ui.TextInputWidget{pageTitleParsed;constructor(t,i){super(t),OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=i}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();if(!t)i.resolve([]);else if(t.includes("#")){let e=t.split("#")[0];d.get({action:"parse",page:e,prop:"sections",redirects:!0}).catch(()=>null).then(a=>{if(a){let s=a.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(s.map(r=>({data:`${a.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{let e=mw.Title.newFromText(t);d.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:e?.getNamespaceId()??0,gapprefix:e?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(a=>{a?.query?i.resolve(a.query.pages.filter(s=>s.title!==this.pageTitleParsed.getPrefixedText()).map(s=>({data:s.title,label:new OO.ui.HtmlSnippet(`${s.title}${s.pageprops&&"disambiguation"in s.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in s?" <i>(redirect)</i>":""}`)}))):i.resolve([])})}return i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};Object.assign(v.prototype,OO.ui.mixin.LookupElement.prototype)});var D={};M(D,{default:()=>k});var k,W=x(()=>{"use strict";b();R();I();L();E();k=class{REDIRECT_REGEX=/^#.*?:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;SCRIPT_MESSAGE=" (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;exists;defaultCreatedWatchMethod;needsCheck=!0;editorBox;syncWithSubjectPageButton;syncWithRootPageButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;watchCheckbox;watchCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a},s,r){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=s,this.defaultCreatedWatchMethod=r}async load(){this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&((await d.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect?await this.loadSyncWithSubjectPageButton():this.pageTitleParsed.getPrefixedText().includes("/")&&(await d.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getPrefixedText().split("/")[0]})).query.pages[0].redirect&&await this.loadSyncWithRootPageButton()),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithSubjectPageButton?.$element[0],this.syncWithRootPageButton?.$element[0],this.redirectInputLayout.$element[0],this.tagSelectLayout.$element[0],this.templateParametersEditor,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.exists&&this.loadExistingData()}async loadSyncWithSubjectPageButton(){let t=await w(this.pageTitleParsed.getSubjectPage().getPrefixedText())??"";this.syncWithSubjectPageButton=new OO.ui.ButtonWidget({label:"Sync with subject page",icon:"link",flags:["progressive"]}),this.syncWithSubjectPageButton.on("click",()=>{let i=this.REDIRECT_REGEX.exec(t)?.[1];if(!i)return mw.notify("Failed to parse subject page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(i)?.getTalkPage()?.getPrefixedText()??"");let e=["R from move",...this.redirectTemplates["R from move"].aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(t));this.tagSelect.setValue(e?["R from move"]:[])})}async loadSyncWithRootPageButton(){let t=this.pageTitleParsed.getPrefixedText().split("/"),i=t.slice(1).join("/"),e=await w(t[0])??"";this.syncWithRootPageButton=new OO.ui.ButtonWidget({label:"Sync with root page",icon:"link",flags:["progressive"]}),this.syncWithRootPageButton.on("click",()=>{let a=this.REDIRECT_REGEX.exec(e)?.[1];if(!a)return mw.notify("Failed to parse root page content!",{type:"error"});let s=mw.Title.newFromText(a)?.getPrefixedText();this.redirectInput.setValue(s?`${s}/${i}`:"");let r=["R from move",...this.redirectTemplates["R from move"].aliases].some(o=>new RegExp(`{{\\s*[${o[0].toLowerCase()}${o[0]}]${o.slice(1)}\\s*(\\||}})`).test(e));this.tagSelect.setValue(r?["R from move"]:[])})}loadInputElements(){this.redirectInput=new v({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}https://demo.azizisearch.com/lite/wikipedia/page/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([e,{redirect:a}])=>{if(!a)return{data:e,label:e};let s=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:s}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",e=>{let a=e.map(o=>o.getData()),s=a.toSorted((o,n)=>o.toLowerCase().localeCompare(n.toLowerCase()));if(a.join(";")!==s.join(";")){let o=e.at(-1);this.tagSelect.reorder(o,s.indexOf(o.getData()))}this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let o of this.templateEditorsInfo)o.details.style.display="none";let r=0;for(let o of this.tagSelect.getValue()){let n=this.templateEditorsInfo.find(p=>p.name===o);n&&(n.details.style.display="block",r++)}t.textContent=`Template parameters (${r>0?`for ${r} template${r>1?"s":""}`:"none to show"})`,i.style.display=r>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[e,a]of Object.entries(this.redirectTemplates)){let s=Object.entries(a.parameters);if(s.length===0)continue;let r=document.createElement("details");r.style.display="none";let o=document.createElement("summary");o.textContent=e,r.append(o);let n={name:e,details:r,parameters:[]};for(let[p,c]of s){let h=new OO.ui.TextInputWidget({placeholder:c.default?.toString(),required:c.required});h.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let l=new OO.ui.FieldLayout(h,{label:new OO.ui.HtmlSnippet(`${p}${!c.label||p.toLowerCase()===c.label.toLowerCase()?"":` (${c.label})`}${c.description?` (${c.description})`:""} (type: ${c.type}) ${c.suggested?" (suggested)":""}${c.example?` (example: "${c.example}")`:""}`),align:"inline"});r.append(l.$element[0]),n.parameters.push({name:p,aliases:c.aliases,editor:h})}this.templateParametersEditor.append(r),this.templateEditorsInfo.push(n)}let i=document.createElement("div");i.id="redirect-helper-no-templates-message",i.textContent="No templates with parameters to display!",this.templateParametersEditor.append(i),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{let e=this.defaultSortInput.getValue();e.length>0&&this.defaultSortInput.setValue(e.replaceAll("_"," ")),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.defaultSortSuggestButton=new OO.ui.ButtonWidget({icon:"robot",label:"Suggest",disabled:!0}),this.defaultSortSuggestButton.on("click",()=>{let e=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(["R from birth name","R from fictional character","R from band member","R from member","R from person","R from personal name","R from relative","R from spouse"].some(a=>this.tagSelect.getValue().includes(a))){if(!e.includes(" "))return mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"});let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;let s=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),r=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(s+", "+r+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let s of["An","A","The"])if(a.startsWith(s+" ")){a=a.slice(s.length+1)+", "+s;break}a===e?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(a)}}),this.defaultSortInputLayout=new OO.ui.ActionFieldLayout(this.defaultSortInput,this.defaultSortSuggestButton,{label:new OO.ui.HtmlSnippet(`Default sort key (DEFAULTSORT) (see <a href="${mw.util.getUrl("Wikipedia:Categorization#Sort keys")}" target="_blank">guideline</a>):`),classes:["redirect-input-layout"],align:"top"}),this.categorySelectInput=new O({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let e=this.categorySelectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}https://demo.azizisearch.com/lite/wikipedia/page/`),""),e=e.replace(/^Category:/,""),e.length>0&&this.categorySelectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",e=>{for(let a of e)this.categorySelect.addAllowedValue(a.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",e=>{let a=e.map(r=>r.getData()),s=a.toSorted((r,o)=>r.toLowerCase().localeCompare(o.toLowerCase()));if(a.join(";")!==s.join(";")){let r=e.at(-1);this.categorySelect.reorder(r,s.indexOf(r.getData()))}this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.categorySelectLayout=new OO.ui.FieldLayout(this.categorySelect,{label:"Categories:",classes:["redirect-input-layout"],align:"top"}),this.summaryInput=new OO.ui.ComboBoxInputWidget({options:[{data:"Resolve double redirect"},{data:"Resolve self redirect"},{data:"Remove incorrect rcats"}]}),this.summaryInputLayout=new OO.ui.FieldLayout(this.summaryInput,{id:"redirect-helper-summary-layout",label:"Summary:",classes:["redirect-input-layout"],align:"top"})}async loadSubmitElements(){let t=new OO.ui.WindowManager;document.body.append(t.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());let i=new S({size:"large"},this.pageTitleParsed);t.addWindows([i]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{i.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),i.open()});let e=new P({size:"large"});if(t.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.exists&&(this.pageContent=await w(this.pageTitle)??""),e.setData([this.pageContent,this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())]),e.open()}),this.pageTitleParsed.isTalkPage()||(this.talkData=await d.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getTalkPage().getPrefixedText()}),this.syncTalkCheckbox=new OO.ui.CheckboxInputWidget({selected:!!this.talkData.query.pages[0].redirect}),this.syncTalkCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.syncTalkCheckbox,{label:"Sync talk page",align:"inline"})]})),!this.exists){let a={};["nochange","preferences"].includes(this.defaultCreatedWatchMethod)?a.indeterminate=!0:this.defaultCreatedWatchMethod==="watch"?a.selected=!0:a.selected=!1,this.watchCheckbox=new OO.ui.CheckboxInputWidget(a),this.watchCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.watchCheckbox,{label:"Watch page",align:"inline"})]})}await this.checkShouldPromptPatrol()&&(this.patrolCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.patrolCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.patrolCheckbox,{label:"Mark as patrolled",align:"inline"})]})),this.submitLayout=new OO.ui.HorizontalLayout({id:"redirect-helper-submit-layout",items:[this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckboxLayout,this.watchCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)})}async checkShouldPromptPatrol(){let t=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(t?.click(),t?.click(),mw.config.get("wgNamespaceNumber")!==0)return!1;if(document.querySelector(".patrollink"))return!0;if(document.querySelector("#mwe-pt-mark-as-reviewed-button"))return!0;if(document.querySelector("#mwe-pt-mark-as-unreviewed-button"))return!1;{if(!mw.config.get("wgArticleId")||!(await mw.user.getRights()).includes("patrol"))return!1;let e=await d.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return e.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||e.pagetriagelist.result!=="success"||e.pagetriagelist.pages.length===0?!1:!Number.parseInt(e.pagetriagelist.pages[0]?.patrol_status)}}updateSummary(){let t=this.redirectInput.getValue().trim();if(!t)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){let i=this.oldRedirectTarget?.replaceAll("_"," ");i&&(i=i[0].toUpperCase()+i.slice(1));let e=t!==i,a=this.tagSelect.getValue().some(p=>!this.oldRedirectTags.includes(p))||this.oldRedirectTags.some(p=>!this.tagSelect.getValue().includes(p)),s=!1;if(this.oldRedirectTagData){let p=Object.entries(this.redirectTemplates).filter(([,c])=>Object.entries(c.parameters).length>0);for(let[c,h]of p){if(!this.oldRedirectTags.includes(c)||!this.tagSelect.getValue().includes(c))continue;let u=this.oldRedirectTagData[c]??Object.entries(h.parameters).map(([m])=>[m,""]),f=this.templateEditorsInfo.find(m=>m.name===c);for(let m of f.parameters){let y=u.find(A=>A[0]===m.name)?.[1]??"",T=m.editor.getValue().trim();if(y!==T){s=!0;break}}if(s)break}}let r=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),o=this.categorySelect.getValue().some(p=>!this.oldCategories.includes(p))||this.oldCategories.some(p=>!this.categorySelect.getValue().includes(p)),n=[];e&&n.push(`retarget to [[${t}]]`),a&&n.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),s&&n.push("change categorization template arguments"),r&&n.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),o&&n.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),n.length===0&&n.push("perform redirect cleanup"),n[0]=n[0][0].toUpperCase()+n[0].slice(1),n.length>1&&(n[n.length-1]=`and ${n.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=n.join(n.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${t}]]`}async loadExistingData(){this.exists&&(this.pageContent=await w(this.pageTitle)??""),this.oldRedirectTarget=this.REDIRECT_REGEX.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([i,e])=>[i,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?i:null).filter(Boolean).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()));let t=Object.entries(this.redirectTemplates).flatMap(([i,e])=>[i,...e.aliases]).map(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(this.pageContent)?i:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(t.map(i=>{let e=new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([o,n])=>[o,...n.aliases].includes(i))?.[0];if(!e?.[1])return null;let r=e[1].split("|").map((o,n)=>{if(!o.includes("="))return[(n+1).toString(),o.trim()];let[p,c]=o.split("=");return[p.trim(),c.trim()]});return[a,r]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2).trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(i=>i.slice(11,-2)).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()))??[],this.oldStrayText=[/{{short description\|.*?}}/i.exec(this.pageContent)?.[0],/{{DISPLAYTITLE:.*?}}/.exec(this.pageContent)?.[0],/{{italic title\|?.*?}}/i.exec(this.pageContent)?.[0],/{{title language\|.*?}}/.exec(this.pageContent)?.[0],/{{authority control(\|.*?)?}}/i.exec(this.pageContent)?.[0]].filter(Boolean).join(`
`),this.oldRedirectTarget?this.redirectInput.setValue(this.oldRedirectTarget.replaceAll("_"," ")):mw.notify("redirect-helper: Could not find redirect target!",{type:"error"}),this.tagSelect.setValue(this.oldRedirectTags);for(let[i,e]of Object.entries(this.oldRedirectTagData)){let a=this.templateEditorsInfo.find(s=>s.name===i);if(a)for(let[s,r]of e){let o=a.parameters.find(n=>[n.name,...n.aliases].includes(s));o&&o.editor.setValue(r)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(i),this.categorySelectInput.validCategories.add(i);this.categorySelect.setValue(this.oldCategories.map(i=>({data:i,label:i}))),this.updateSummary()}async validateSubmission(){let t=[],i=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(i)||t.push({title:i,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(i)}catch{t.length===0&&t.push({title:i,message:"is not a valid page title!"})}!this.parsedDestination&&t.length===0&&t.push({title:i,message:"is not a valid page title!"}),this.parsedDestination?.getPrefixedText()===this.pageTitleParsed.getPrefixedText()&&t.push({message:"cannot redirect to itself!"});let a=await d.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(l=>(l==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${l})!`}),null)),s=await d.get({action:"parse",page:i,prop:"sections",redirects:!0});if(s.parse.redirects.length>0){let l=s.parse.redirects[0].to+(s.parse.redirects[0].tofragment?`#${s.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(l)}" target="_blank">${l}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:l}]})}if(i.split("#").length>1)if(s.parse.sections.find(u=>u.line.replaceAll(/<\/?i>/g,"")===i.split("#")[1]))e.includes("R to anchor")&&t.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!",autoFixes:[{type:"add",tag:"R to section"},{type:"remove",tag:"R to anchor"}]}),e.includes("R to section")||t.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!",autoFixes:[{type:"add",tag:"R to section"}]});else{let u=await w(this.parsedDestination.getPrefixedText())??"";[...u.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(m=>m.split("|").map(y=>y.trim())).flat()??[],...u.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(m=>m.split("|").map(y=>y.trim()).filter(y=>!/^text\s*?=/.test(y))).flat()??[],...u.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(m=>m.trim())??[],...u.match(/EpisodeNumber += +\d+/g)?.map(m=>`ep${m.split("=")[1].trim()}`)??[]].includes(i.split("#")[1])?(e.includes("R to section")&&t.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!",autoFixes:[{type:"add",tag:"R to anchor"},{type:"remove",tag:"R to section"}]}),e.includes("R to anchor")||t.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R to anchor}}</code>!",autoFixes:[{type:"add",tag:"R to anchor"}]})):t.push({message:`is a redirect to <a href="${mw.util.getUrl(i)}" target="_blank">${i}</a>, but that section or anchor does not exist!`,autoFixes:[{type:"change-target",target:i.split("#")[0]}]})}if(i.split("#").length===1)for(let l of["R to section","R to anchor"])e.includes(l)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${l}}}</code>!`,autoFixes:[{type:"remove",tag:l}]});let r=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),o=!!a.query.pages[0].categories?.some(l=>l.title==="Category:Surnames"),n=["R to disambiguation page","R from incomplete disambiguation"],p=["R from ambiguous sort name","R from ambiguous term"],c=n.some(l=>e.includes(l)),h=p.some(l=>e.includes(l));r&&!c&&!h&&t.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),a.query.pages[0].pageprops&&!r&&((!o&&(c||h)||o&&c)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...n,...p].map(l=>({type:"remove",tag:l}))}),o&&!h&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),r&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&t.push({message:'is tagged with <code>{{R to disambiguation page}}</code>, but this title does not end with " (disambiguation)". Use <code>{{R from ambiguous term}}</code> or a similar categorization template instead!',autoFixes:[{type:"remove",tag:"R to disambiguation page"}]});for(let l of["R protected","R protected/semi","R protected/excon","R protected/template","R protected/full"])e.includes(l)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${l}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:l}]});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&t.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!",autoFixes:[{type:"add",tag:"R with Wikidata item"}]}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&t.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!",autoFixes:[{type:"remove",tag:"R with Wikidata item"}]});for(let l of e){if(!(l in this.redirectTemplates))continue;let u=this.redirectTemplates[l];for(let[f,m]of Object.entries(u.parameters)){let y=this.templateEditorsInfo.find(T=>T.name===l)?.parameters.find(T=>[T.name,...T.aliases].includes(f));y&&m.required&&!y.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${l}}}</code> but it is missing the required parameter <code>${f}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&t.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),t}async handleSubmitButtonClick(){let t=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(r=>r.parameters.map(o=>o.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.watchCheckbox,this.patrolCheckbox].filter(Boolean);for(let r of t)r.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let i=[];if(this.needsCheck?i=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),i.length>0){for(let r of document.querySelectorAll(".redirect-helper-warning"))r.remove();for(let{title:r,message:o,autoFixes:n}of i){let p=new OO.ui.HtmlSnippet(`${r?`<a href="${mw.util.getUrl(r)}" target="_blank">${r}</a>`:"This page"} ${o} Click again without making changes to submit anyway.`),c=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:p});if(n){let h=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});h.on("click",()=>{let l=this.tagSelect.getValue();for(let u of n)u.type==="add"&&!l.includes(u.tag)&&this.tagSelect.addTag(u.tag,u.tag),u.type==="remove"&&l.includes(u.tag)&&this.tagSelect.removeTagByData(u.tag),u.type==="change-target"&&this.redirectInput.setValue(u.target);c.$element[0].style.textDecoration="line-through 2px black",h.$element[0].remove()}),c.$element[0].querySelector(".oo-ui-labelElement-label").append(h.$element[0])}this.editorBox.$element[0].append(c.$element[0])}for(let r of t)r.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);let e=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),a=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.SCRIPT_MESSAGE;if(await this.editOrCreate(this.pageTitle,e,a)){if(mw.notify(`Redirect ${this.exists?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");let r=this.tagSelect.getValue().includes("R from move"),o=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),r?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),o,"Syncing redirect from subject page"+this.SCRIPT_MESSAGE))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let r=document.querySelector(".patrollink a"),o=document.querySelector("#mwe-pt-mark-as-reviewed-button");r?await d.postWithToken("patrol",{action:"patrol",rcid:new URL(r.href).searchParams.get("rcid")}).catch((p,c)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${c?.error?.info??"Unknown error"} (${p})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):o?(o.click(),mw.notify("Redirect patrolled successfully!",{type:"success"})):mw.notify("Page curation toolbar not found, redirect cannot be patrolled!",{type:"error"})}this.submitButton.setLabel("Complete, reloading..."),window.location.href=mw.util.getUrl(this.pageTitle,{redirect:"no"})}}createOutput(t,i,e,a,s){let r=mw.Title.newFromText(t),o=r?`${r.getNamespaceId()===14?":":""}${r.getPrefixedText()}${r.getFragment()?`#${r.getFragment()}`:""}`:t.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);let n=i.map(p=>{let c=this.templateEditorsInfo.find(u=>u.name===p);if(!c)return`{{${p}}}`;let h=c.parameters.findLastIndex((u,f)=>u.name===(f+1).toString()&&u.editor.getValue().trim()),l=c.parameters.map((u,f)=>{let m=u.editor.getValue().trim();return!m&&f>h?null:`|${u.name===(f+1).toString()?"":`${u.name}=`}${m}`}).filter(Boolean).join("");return`{{${p}${l}}}`});return[`#REDIRECT [[${o}]]
`,i.length>0?`{{Redirect category shell|
${n.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,s.length>0?s.map(p=>`[[Category:${p}]]`).join(`
`):null].filter(Boolean).join(`
`)}async editOrCreate(t,i,e){let a="preferences";return this.watchCheckbox&&(this.watchCheckbox.isIndeterminate()?a=this.defaultCreatedWatchMethod:this.watchCheckbox.isSelected()?a="watch":a="unwatch"),await d.edit(t,()=>({text:i,summary:e})).catch((s,r)=>s==="nocreate-missing"?d.create(t,{summary:e,watchlist:a},i).catch((o,n)=>(mw.notify(`Error creating ${t}: ${n?.error?.info??"Unknown error"} (${o})`,{type:"error"}),null)):(mw.notify(`Error editing or creating ${t}: ${r?.error?.info??"Unknown error"} (${s})`,{type:"error"}),null))}}});var C=`#create-redirect-button{margin-bottom:20px}#redirect-helper-box{margin-right:auto;margin-bottom:25px!important;margin-left:auto;background-color:#f5f5f5;width:700px;max-width:calc(100% - 50px);color:#202122}.redirect-input-layout label{font-weight:700}.redirect-helper-redirect-possibilities:after{content:" (redirect with possibilities)";font-style:italic}.redirect-helper-template-parameters-container,.redirect-helper-template-parameters-container details{margin-top:10px;margin-bottom:10px;border-radius:5px;background-color:#e2e2e2;padding:5px}.redirect-helper-template-parameters-container summary{cursor:pointer;font-weight:700}.redirect-helper-template-parameters-container details{margin-top:5px;margin-bottom:5px;background-color:#d1cece}#redirect-helper-no-templates-message{padding:5px}#redirect-helper-summary-layout{margin-top:15px;border-top:1px solid gray;padding-top:10px}#redirect-helper-submit-layout{margin-top:10px}#redirect-helper-submit-layout>*{margin-bottom:0}.redirect-helper-warning{margin-top:8px}.redirect-helper-autofix-button{margin-left:5px;font-size:12px}.redirect-helper-autofix-button a{padding:3px 4px!important;min-height:0!important;min-height:initial!important}
`;b();var F=["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"];mw.loader.using(F,async()=>{let{default:g}=await Promise.resolve().then(()=>(W(),D));class t{redirectTemplates;contentText;pageTitle;pageTitleParsed;createdWatchMethod;async run(){if(!this.passesPreChecks())return;this.redirectTemplates=await this.fetchRedirectTemplates();let e=document.querySelector("#mw-content-text");if(!e)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});this.contentText=e,this.pageTitle=mw.config.get("wgPageName");let a=mw.Title.newFromText(this.pageTitle);if(!a)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});this.pageTitleParsed=a;let s=window.redirectHelperConfiguration?.createdWatchMethod;this.createdWatchMethod=s&&["nochange","preferences","unwatch","watch"].includes(s)?s:"preferences",await this.checkPageAndLoad()}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgAction")==="view"||mw.config.get("wgAction")==="edit",(mw.config.get("wgRevisionId")||mw.config.get("wgCurRevisionId"))===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return JSON.parse(await w("User:Eejit43/scripts/redirect-helper.json")??"{}")}async checkPageAndLoad(){mw.util.addCSS(C);let e=await d.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),a={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(e.query.pages[0].missing){let s=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});s.on("click",()=>{s.$element[0].remove(),new g(a,!1,this.createdWatchMethod).load()}),this.contentText.prepend(s.$element[0])}else if(e.query.pages[0].redirect)new g(a,!0,this.createdWatchMethod).load();else{let s=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");s.addEventListener("click",r=>{r.preventDefault(),new g(a,!1,this.createdWatchMethod).load(),window.scrollTo({top:0,behavior:"smooth"}),s.remove()})}}}new t().run()});})();

// </pre>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9jYXRlZ29yeS1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2hhbmdlcy1kaWFsb2cudHMiLCAiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvb3V0cHV0LXByZXZpZXctZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLWRpYWxvZy50cyIsICIuLi9zdHlsZXMvcmVkaXJlY3QtaGVscGVyLmNzcyIsICIuLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuL2dsb2JhbC10eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZUNvbnRlbnQodGl0bGU6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICAgIChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6IHRpdGxlLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9ucz8uWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycywgQ2F0ZWdvcmllc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgeyBhcGkgfSBmcm9tICcuLi8uLi91dGlsaXR5JztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJy4vcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICBwdWJsaWMgdmFsaWRDYXRlZ29yaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCkuc3BsaXQoJ3wnKVswXTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgY29uc3Qgc29ydEtleSA9IHRoaXMuZ2V0VmFsdWUoKS5zcGxpdCgnfCcpWzFdO1xuXG4gICAgICAgIGlmIChzb3J0S2V5ICYmIHRoaXMudmFsaWRDYXRlZ29yaWVzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgZGF0YTogYCR7dmFsdWV9fCR7c29ydEtleX1gLCBsYWJlbDogYCR7dmFsdWV9ICh3aXRoIHNvcnQga2V5IFwiJHtzb3J0S2V5fVwiKWAgfV07XG5cbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICBnYXBuYW1lc3BhY2U6IDE0LFxuICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgIHByb3A6ICdjYXRlZ29yaWVzJyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IENhdGVnb3JpZXNSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkQ2F0ZWdvcmllcy5hZGQodGl0bGVXaXRob3V0TmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IEFwaUNvbXBhcmVQYWdlc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB7IGFwaSB9IGZyb20gJy4uLy4uL3V0aWxpdHknO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3Igc2hvd2luZyBjaGFuZ2VzIHRvIGJlIG1hZGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5nZXNEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcml2YXRlIGhhc0xvYWRlZERpZmZTdHlsZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdDaGFuZ2VzRGlhbG9nJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgfVxuXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzTG9hZGVkRGlmZlN0eWxlcykge1xuICAgICAgICAgICAgICAgIG13LmxvYWRlci5hZGRMaW5rVGFnKCdodHRwczovL3d3dy5tZWRpYXdpa2kub3JnL3cvbG9hZC5waHA/bW9kdWxlcz1tZWRpYXdpa2kuZGlmZi5zdHlsZXMmb25seT1zdHlsZXMnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaGFzTG9hZGVkRGlmZlN0eWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtvbGRUZXh0LCBuZXdUZXh0XSA9IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICByZXR1cm4gYXBpXG4gICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAnYWN0aW9uJzogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgICAgICAnZm9ybWF0dmVyc2lvbic6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Byb3AnOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb21zbG90cyc6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3Rvc2xvdHMnOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICd0b3RleHQtbWFpbic6IG5ld1RleHQsXG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7XG4gICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJpc29uID0gKHJlc3VsdCBhcyB7IGNvbXBhcmU6IHsgYm9keTogc3RyaW5nIH0gfSkuY29tcGFyZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG48dGFibGUgY2xhc3M9XCJkaWZmIGRpZmYtZWRpdGZvbnQtbW9ub3NwYWNlXCI+XG4gICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgIDwvY29sZ3JvdXA+XG4gICAgPHRib2R5PlxuICAgICAgICAke2NvbXBhcmlzb259XG4gICAgPC90Ym9keT5cbjwvdGFibGU+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9DaGFuZ2VzRWxlbWVudC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIENoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuT2JqZWN0LmFzc2lnbihDaGFuZ2VzRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpUGFyc2VQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgeyBhcGkgfSBmcm9tICcuLi8uLi91dGlsaXR5JztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHByZXZpZXdpbmcgdGVtcGxhdGUgb3V0cHV0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBPdXRwdXRQcmV2aWV3RGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy5uYW1lID0gJ091dHB1dFByZXZpZXdEaWFsb2cnO1xuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy50aXRsZSA9ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXMgcHJldmlldyc7XG4gICAgICAgIE91dHB1dFByZXZpZXdEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgIH1cblxuICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFwaVxuICAgICAgICAgICAgICAgIC5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFyc2UnLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRtb2RlbDogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogWyd0ZXh0JywgJ2NhdGVnb3JpZXNodG1sJ10sXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZERiKCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IHRleHQ6IHN0cmluZyB9IH0pLnBhcnNlLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IGNhdGVnb3JpZXNodG1sOiBzdHJpbmcgfSB9KS5wYXJzZS5jYXRlZ29yaWVzaHRtbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQodGFnc0NvbnRlbnQsIGNhdGVnb3JpZXNDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogT3V0cHV0UHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuT2JqZWN0LmFzc2lnbihPdXRwdXRQcmV2aWV3RGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpUGFyc2VQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzLCBQYWdlUGFyc2VSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHsgYXBpIH0gZnJvbSAnLi4vLi4vdXRpbGl0eSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwRWxlbWVudENvbmZpZyBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldC5Db25maWdPcHRpb25zLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LkNvbmZpZ09wdGlvbnMge31cblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgdGl0bGUgbG9va3VwIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLmluY2x1ZGVzKCcjJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdmFsdWUuc3BsaXQoJyMnKVswXTtcblxuICAgICAgICAgICAgYXBpLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogdGl0bGUsIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiBQYWdlUGFyc2VSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRTZWN0aW9ucyA9IHJlc3VsdC5wYXJzZSEuc2VjdGlvbnMuZmlsdGVyKChzZWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24ubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgodmFsdWUuc3BsaXQoJyMnKVsxXS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGAke3Jlc3VsdC5wYXJzZSEudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtyZXN1bHQucGFyc2UhLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgICAgICBhcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgcHJvcDogWydpbmZvJywgJ3BhZ2Vwcm9wcyddLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IHBhZ2Vwcm9wcz86IHsgZGlzYW1iaWd1YXRpb24/OiBzdHJpbmcgfTsgcmVkaXJlY3Q/OiBzdHJpbmcgfVtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUgIT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYWdlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhZ2UudGl0bGV9JHtwYWdlLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIHBhZ2UucGFnZXByb3BzID8gJyA8aT4oZGlzYW1iaWd1YXRpb24pPC9pPicgOiAnJ30keydyZWRpcmVjdCcgaW4gcGFnZSA/ICcgPGk+KHJlZGlyZWN0KTwvaT4nIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gICAgQXBpUGFyc2VQYXJhbXMsXG4gICAgQXBpUXVlcnlJbmZvUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIENhdGVnb3JpZXNSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFBhZ2VJbmZvUmVzdWx0LFxuICAgIFBhZ2VQYXJzZVJlc3VsdCxcbiAgICBQYWdlVHJpYWdlTGlzdFJlc3BvbnNlLFxuICAgIFBhZ2Vwcm9wc1Jlc3VsdCxcbn0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB7IGFwaSwgZ2V0UGFnZUNvbnRlbnQgfSBmcm9tICcuLi8uLi91dGlsaXR5JztcbmltcG9ydCB0eXBlIHsgV2F0Y2hNZXRob2QgfSBmcm9tICcuLi9hZmNyYy1oZWxwZXIvYWZjcmMtaGVscGVyJztcbmltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBDaGFuZ2VzRGlhbG9nIGZyb20gJy4vY2hhbmdlcy1kaWFsb2cnO1xuaW1wb3J0IE91dHB1dFByZXZpZXdEaWFsb2cgZnJvbSAnLi9vdXRwdXQtcHJldmlldy1kaWFsb2cnO1xuaW1wb3J0IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQgZnJvbSAnLi9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0JztcblxuZXhwb3J0IHR5cGUgUmVkaXJlY3RUZW1wbGF0ZURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB7IHJlZGlyZWN0PzogdHJ1ZTsgcGFyYW1ldGVyczogUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM7IGFsaWFzZXM6IHN0cmluZ1tdIH0+O1xuXG50eXBlIFJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzID0gUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICAgIGFsaWFzZXM6IHN0cmluZ1tdO1xuICAgICAgICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgICAgIHN1Z2dlc3RlZDogYm9vbGVhbjtcbiAgICAgICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgICAgIGV4YW1wbGU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwYXJhbWV0ZXJzOiB7IG5hbWU6IHN0cmluZzsgYWxpYXNlczogc3RyaW5nW107IGVkaXRvcjogT08udWkuVGV4dElucHV0V2lkZ2V0IH1bXTtcbn1cblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGRpYWxvZyBwb3J0aW9uIG9mIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0SGVscGVyRGlhbG9nIHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUkVESVJFQ1RfUkVHRVggPSAvXiMuKj86P1xccypcXFtcXFtcXHMqOj8oW15bXFxde3x9XSs/KVxccyooPzpcXHxbXltcXF17fH1dKz8pP11dXFxzKi9pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgU0NSSVBUX01FU1NBR0UgPSAnICh2aWEgW1t3OmVuOlVzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuICAgIHByaXZhdGUgZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICAvLyBVc2VkIGR1cmluZyBydW4oKVxuICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICBwcml2YXRlIGVkaXRvckJveCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgIHByaXZhdGUgc3luY1dpdGhTdWJqZWN0UGFnZUJ1dHRvbj86IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHN5bmNXaXRoUm9vdFBhZ2VCdXR0b24/OiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSByZWRpcmVjdElucHV0ITogUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHRhZ1NlbGVjdCE6IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICBwcml2YXRlIHRhZ1NlbGVjdExheW91dCE6IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yITogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG4gICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdCE6IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0O1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RJbnB1dCE6IENhdGVnb3J5SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRJbnB1dCE6IE9PLnVpLlRleHRJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXRMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHN1bW1hcnlJbnB1dCE6IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHN1Ym1pdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHNob3dDaGFuZ2VzQnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgc2hvd1ByZXZpZXdCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHN5bmNUYWxrQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgcHJpdmF0ZSB3YXRjaENoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHdhdGNoQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICBwcml2YXRlIHN1Ym1pdExheW91dCE6IE9PLnVpLkhvcml6b250YWxMYXlvdXQ7XG5cbiAgICBwcml2YXRlIHRhbGtEYXRhPzogUGFnZUluZm9SZXN1bHQ7XG5cbiAgICBwcml2YXRlIHBhZ2VDb250ZW50ID0gJyc7XG5cbiAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFyZ2V0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdzPzogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXVtdPjtcbiAgICBwcml2YXRlIG9sZERlZmF1bHRTb3J0Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgb2xkQ2F0ZWdvcmllcz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgb2xkU3RyYXlUZXh0Pzogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBwYXJzZWREZXN0aW5hdGlvbiE6IG13LlRpdGxlIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFRlbXBsYXRlcyxcbiAgICAgICAgICAgIGNvbnRlbnRUZXh0LFxuICAgICAgICAgICAgcGFnZVRpdGxlLFxuICAgICAgICAgICAgcGFnZVRpdGxlUGFyc2VkLFxuICAgICAgICB9OiB7IHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTsgY29udGVudFRleHQ6IEhUTUxEaXZFbGVtZW50OyBwYWdlVGl0bGU6IHN0cmluZzsgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSB9LFxuICAgICAgICBleGlzdHM6IGJvb2xlYW4sXG4gICAgICAgIGNyZWF0ZWRXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2QsXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSByZWRpcmVjdFRlbXBsYXRlcztcbiAgICAgICAgdGhpcy5jb250ZW50VGV4dCA9IGNvbnRlbnRUZXh0O1xuICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgdGhpcy5leGlzdHMgPSBleGlzdHM7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0Q3JlYXRlZFdhdGNoTWV0aG9kID0gY3JlYXRlZFdhdGNoTWV0aG9kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSByZWRpcmVjdC1oZWxwZXIgZGlhbG9nIGludG8gdGhlIHBhZ2UuXG4gICAgICovXG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLyogTG9hZCBlbGVtZW50cyAqL1xuICAgICAgICB0aGlzLmVkaXRvckJveCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IGlkOiAncmVkaXJlY3QtaGVscGVyLWJveCcsIHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlLCBmcmFtZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViamVjdFBhZ2VEYXRhID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgaWYgKHN1YmplY3RQYWdlRGF0YS5xdWVyeSEucGFnZXNbMF0ucmVkaXJlY3QpIGF3YWl0IHRoaXMubG9hZFN5bmNXaXRoU3ViamVjdFBhZ2VCdXR0b24oKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb290UGFnZURhdGEgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0UHJlZml4ZWRUZXh0KCkuc3BsaXQoJy8nKVswXSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgICAgIGlmIChyb290UGFnZURhdGEucXVlcnkhLnBhZ2VzWzBdLnJlZGlyZWN0KSBhd2FpdCB0aGlzLmxvYWRTeW5jV2l0aFJvb3RQYWdlQnV0dG9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFN1Ym1pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgLyogQWRkIGVsZW1lbnRzIHRvIHNjcmVlbiBhbmQgbG9hZCBkYXRhIChpZiBhcHBsaWNhYmxlKSAqL1xuICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQoXG4gICAgICAgICAgICAuLi4oW1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY1dpdGhTdWJqZWN0UGFnZUJ1dHRvbj8uJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jV2l0aFJvb3RQYWdlQnV0dG9uPy4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBIVE1MRWxlbWVudFtdKSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQodGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIGlmICh0aGlzLmV4aXN0cykgdm9pZCB0aGlzLmxvYWRFeGlzdGluZ0RhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgXCJTeW5jIHdpdGggc3ViamVjdCBwYWdlXCIgYnV0dG9uXCIgb24gdGFsayBwYWdlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTeW5jV2l0aFN1YmplY3RQYWdlQnV0dG9uKCkge1xuICAgICAgICBjb25zdCBzdWJqZWN0UGFnZUNvbnRlbnQgPSAoYXdhaXQgZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCkpKSA/PyAnJztcblxuICAgICAgICB0aGlzLnN5bmNXaXRoU3ViamVjdFBhZ2VCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTeW5jIHdpdGggc3ViamVjdCBwYWdlJywgaWNvbjogJ2xpbmsnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICB0aGlzLnN5bmNXaXRoU3ViamVjdFBhZ2VCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5SRURJUkVDVF9SRUdFWC5leGVjKHN1YmplY3RQYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbXcubm90aWZ5KCdGYWlsZWQgdG8gcGFyc2Ugc3ViamVjdCBwYWdlIGNvbnRlbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUobXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KT8uZ2V0VGFsa1BhZ2UoKT8uZ2V0UHJlZml4ZWRUZXh0KCkgPz8gJycpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0Zyb21Nb3ZlID0gWydSIGZyb20gbW92ZScsIC4uLnRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbJ1IgZnJvbSBtb3ZlJ10uYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdChcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdFBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZShpc0Zyb21Nb3ZlID8gWydSIGZyb20gbW92ZSddIDogW10pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgXCJTeW5jIHdpdGggcm9vdCBwYWdlXCIgYnV0dG9uIG9uIHN1YnBhZ2UgdGFsayBwYWdlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTeW5jV2l0aFJvb3RQYWdlQnV0dG9uKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGl0bGVTcGxpdCA9IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdWJwYWdlID0gY3VycmVudFRpdGxlU3BsaXQuc2xpY2UoMSkuam9pbignLycpO1xuXG4gICAgICAgIGNvbnN0IHJvb3RQYWdlQ29udGVudCA9IChhd2FpdCBnZXRQYWdlQ29udGVudChjdXJyZW50VGl0bGVTcGxpdFswXSkpID8/ICcnO1xuXG4gICAgICAgIHRoaXMuc3luY1dpdGhSb290UGFnZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N5bmMgd2l0aCByb290IHBhZ2UnLCBpY29uOiAnbGluaycsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgIHRoaXMuc3luY1dpdGhSb290UGFnZUJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLlJFRElSRUNUX1JFR0VYLmV4ZWMocm9vdFBhZ2VDb250ZW50KT8uWzFdO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBtdy5ub3RpZnkoJ0ZhaWxlZCB0byBwYXJzZSByb290IHBhZ2UgY29udGVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KT8uZ2V0UHJlZml4ZWRUZXh0KCk7XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh0YXJnZXRUaXRsZSA/IGAke3RhcmdldFRpdGxlfS8ke2N1cnJlbnRTdWJwYWdlfWAgOiAnJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzRnJvbU1vdmUgPSBbJ1IgZnJvbSBtb3ZlJywgLi4udGhpcy5yZWRpcmVjdFRlbXBsYXRlc1snUiBmcm9tIG1vdmUnXS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICByb290UGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKGlzRnJvbU1vdmUgPyBbJ1IgZnJvbSBtb3ZlJ10gOiBbXSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBpbnB1dCBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAvKiBSZWRpcmVjdCB0YXJnZXQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0ID0gbmV3IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ1RhcmdldCBwYWdlIG5hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5yZWRpcmVjdElucHV0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRhcmdldDonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgc2VsZWN0aW9uICovXG4gICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gY2xhc3M9XCJyZWRpcmVjdC1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllc1wiPiR7dGFnfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgdGhpcy50YWdTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRhZ3MgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IHNlbGVjdGVkVGFncy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3Muam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZFRhZ3MuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdG9ySW5mbyA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9IGBUZW1wbGF0ZSBwYXJhbWV0ZXJzICgke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/IGBmb3IgJHtzaG93blRlbXBsYXRlRWRpdG9yc30gdGVtcGxhdGUke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMSA/ICdzJyA6ICcnfWAgOiAnbm9uZSB0byBzaG93J30pYDtcblxuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3JlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHBhcmFtZXRlckRhdGEuZGVmYXVsdD8udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsLnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAncmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgIC8qIERFRkFVTFRTT1JUIGlucHV0ICovXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpY29uOiAncm9ib3QnLCBsYWJlbDogJ1N1Z2dlc3QnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLnJlcGxhY2UoLyBcXCguKlxcKSQvLCAnJyk7IC8vIFJlbW92ZSBkaXNhbWJpZ3VhdGlvblxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJpcnRoIG5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGZpY3Rpb25hbCBjaGFyYWN0ZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJhbmQgbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBtZW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHBlcnNvbicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcGVyc29uYWwgbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHNwb3VzZScsXG4gICAgICAgICAgICAgICAgXS5zb21lKCh0YWcpID0+IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEhhbmRsaW5nIGlzIG1vZGlmaWVkIGZyb20gZXZhZDM3J3MgXCJSYXRlclwiXG5cbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG13Lm5vdGlmeShcInJlZGlyZWN0LWhlbHBlciB3YXNuJ3QgYWJsZSB0byBkZXRlcm1pbmUgYSBzb3J0IGtleSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBwYWdlIHRpdGxlIVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRpb25hbFN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICgvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbmFsU3VmZml4ID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykgKyAxKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLCQvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL08nLywgJ08nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKGxhc3ROYW1lICsgJywgJyArIG90aGVyTmFtZXMgKyBnZW5lcmF0aW9uYWxTdWZmaXgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnTXIuJywgJ01pc3RlcicpLnJlcGxhY2VBbGwoJyYnLCAnQW5kJyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxlYWRpbmdBcnRpY2xlIG9mIFsnQW4nLCAnQScsICdUaGUnXSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUuc3RhcnRzV2l0aChsZWFkaW5nQXJ0aWNsZSArICcgJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKGxlYWRpbmdBcnRpY2xlLmxlbmd0aCArIDEpICsgJywgJyArIGxlYWRpbmdBcnRpY2xlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBuYW1lKVxuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgYERlZmF1bHQgc29ydCBrZXkgKERFRkFVTFRTT1JUKSAoc2VlIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdXaWtpcGVkaWE6Q2F0ZWdvcml6YXRpb24jU29ydCBrZXlzJyl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+Z3VpZGVsaW5lPC9hPik6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBDYXRlZ29yaWVzIHNlbGVjdGlvbiAqL1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENhdGVnb3JpZXMgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkQ2F0ZWdvcmllcy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENhdGVnb3JpZXMuam9pbignOycpICE9PSBzb3J0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkQ2F0ZWdvcmllcy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY2F0ZWdvcnlTZWxlY3QsIHtcbiAgICAgICAgICAgIGxhYmVsOiAnQ2F0ZWdvcmllczonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU3VtbWFyeSBpbnB1dCAqL1xuICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIGRvdWJsZSByZWRpcmVjdCcgfSwgLy9cbiAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIHNlbGYgcmVkaXJlY3QnIH0sXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVtb3ZlIGluY29ycmVjdCByY2F0cycgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3VtbWFyeUlucHV0LCB7XG4gICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1N1bW1hcnk6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBlbGVtZW50cyBpbiB0aGUgc3VibWl0IGJ1dHRvbiByb3cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkU3VibWl0RWxlbWVudHMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAvKiBTZXQgdXAgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N1Ym1pdCcsIGRpc2FibGVkOiB0cnVlLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkpO1xuXG4gICAgICAgIC8qIFNldCB1cCBzaG93IHByZXZpZXcgYnV0dG9uICovXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUHJldmlld0RpYWxvZyA9IG5ldyBPdXRwdXRQcmV2aWV3RGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbdGVtcGxhdGVQcmV2aWV3RGlhbG9nXSk7XG5cbiAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgcHJldmlldycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5zZXREYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cub3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiBTZXQgdXAgc2hvdyBjaGFuZ2VzIGJ1dHRvbiAqL1xuICAgICAgICBjb25zdCBzaG93Q2hhbmdlc0RpYWxvZyA9IG5ldyBDaGFuZ2VzRGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9KTtcbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtzaG93Q2hhbmdlc0RpYWxvZ10pO1xuXG4gICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IGNoYW5nZXMnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSAoYXdhaXQgZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpKSA/PyAnJztcblxuICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cuc2V0RGF0YShbXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU2V0IHVwIHN5bmMgdGFsayBjaGVja2JveCAqL1xuICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy50YWxrRGF0YSA9IChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiAhIXRoaXMudGFsa0RhdGEucXVlcnkhLnBhZ2VzWzBdLnJlZGlyZWN0IH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3luY1RhbGtDaGVja2JveCwgeyBsYWJlbDogJ1N5bmMgdGFsayBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2V0IHVwIHdhdGNoIHBhZ2UgY2hlY2tib3ggKi9cbiAgICAgICAgaWYgKCF0aGlzLmV4aXN0cykge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnOiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKFsnbm9jaGFuZ2UnLCAncHJlZmVyZW5jZXMnXS5pbmNsdWRlcyh0aGlzLmRlZmF1bHRDcmVhdGVkV2F0Y2hNZXRob2QpKSBjb25maWcuaW5kZXRlcm1pbmF0ZSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmRlZmF1bHRDcmVhdGVkV2F0Y2hNZXRob2QgPT09ICd3YXRjaCcpIGNvbmZpZy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGNvbmZpZy5zZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLndhdGNoQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldChjb25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLndhdGNoQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMud2F0Y2hDaGVja2JveCwgeyBsYWJlbDogJ1dhdGNoIHBhZ2UnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXQgdXAgcGF0cm9sIGNoZWNrYm94ICovXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7XG4gICAgICAgICAgICAgICAgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnBhdHJvbENoZWNrYm94LCB7IGxhYmVsOiAnTWFyayBhcyBwYXRyb2xsZWQnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXQgdXAgbGF5b3V0ICovXG4gICAgICAgIHRoaXMuc3VibWl0TGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoe1xuICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCcsXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaENoZWNrYm94TGF5b3V0LFxuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBPTy51aS5XaWRnZXRbXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgdG8gcGF0cm9sIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VUcmlhZ2VNYXJrQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PignI213ZS1wdC1tYXJrIC5td2UtcHQtdG9vbC1pY29uJyk7XG4gICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcblxuICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluaycpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXVucmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IGF3YWl0IG13LnVzZXIuZ2V0UmlnaHRzKCk7XG4gICAgICAgICAgICBpZiAoIXVzZXJQZXJtaXNzaW9ucy5pbmNsdWRlcygncGF0cm9sJykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzcG9uc2UgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncGFnZXRyaWFnZWxpc3QnLFxuICAgICAgICAgICAgICAgIHBhZ2VfaWQ6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBQYWdlVHJpYWdlQXBpUGFnZVRyaWFnZUxpc3RQYXJhbXMpKSBhcyBQYWdlVHJpYWdlTGlzdFJlc3BvbnNlO1xuXG4gICAgICAgICAgICBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnVzZXJfbmFtZSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5yZXN1bHQgIT09ICdzdWNjZXNzJyB8fCBwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuICFOdW1iZXIucGFyc2VJbnQocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnBhdHJvbF9zdGF0dXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc3VtbWFyeSBpbnB1dCBwbGFjZWhvbGRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZVN1bW1hcnkoKSB7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VmFsdWUgPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCFyZWRpcmVjdFZhbHVlKSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgZWxzZSBpZiAodGhpcy5leGlzdHMpIHtcbiAgICAgICAgICAgIGxldCBvbGRUYXJnZXQgPSB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0Py5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgICAgIGlmIChvbGRUYXJnZXQpIG9sZFRhcmdldCA9IG9sZFRhcmdldFswXS50b1VwcGVyQ2FzZSgpICsgb2xkVGFyZ2V0LnNsaWNlKDEpO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRDaGFuZ2VkID0gcmVkaXJlY3RWYWx1ZSAhPT0gb2xkVGFyZ2V0O1xuXG4gICAgICAgICAgICBjb25zdCB0YWdzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+ICF0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnIGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLnNvbWUoKHRhZykgPT4gIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSk7XG5cbiAgICAgICAgICAgIGxldCB0YWdBcmd1bWVudHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdzV2l0aFBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChbLCBkYXRhXSkgPT4gT2JqZWN0LmVudHJpZXMoZGF0YS5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0YWcsIGRhdGFdIG9mIHRhZ3NXaXRoUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdXYXNTZWxlY3RlZCA9IHRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ1dhc1NlbGVjdGVkIHx8ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFRhZ0RhdGEgPSB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YVt0YWddID8/IE9iamVjdC5lbnRyaWVzKGRhdGEucGFyYW1ldGVycykubWFwKChbbmFtZV0pID0+IFtuYW1lLCAnJ10pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kVGFnRWRpdG9yRGF0YSA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUubmFtZSA9PT0gdGFnKSE7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZm91bmRUYWdFZGl0b3JEYXRhLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZEFyZ3VtZW50ID0gb2xkVGFnRGF0YS5maW5kKChhcmd1bWVudCkgPT4gYXJndW1lbnRbMF0gPT09IHBhcmFtZXRlci5uYW1lKT8uWzFdID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QXJndW1lbnQgPSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQXJndW1lbnQgIT09IG5ld0FyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQXJndW1lbnRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnQXJndW1lbnRzQ2hhbmdlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0U29ydENoYW5nZWQgPSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkgIT09IHRoaXMub2xkRGVmYXVsdFNvcnQhLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5vbGRDYXRlZ29yaWVzIS5pbmNsdWRlcyhjYXRlZ29yeSBhcyBzdHJpbmcpKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyEuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoY2F0ZWdvcnkpKTtcblxuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0Q2hhbmdlZCkgY2hhbmdlcy5wdXNoKGByZXRhcmdldCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWApO1xuICAgICAgICAgICAgaWYgKHRhZ3NDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHRoaXMub2xkUmVkaXJlY3RUYWdzIS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXNgLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGFnQXJndW1lbnRzQ2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgYXJndW1lbnRzJyk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnRDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJykubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBkZWZhdWx0IHNvcnQga2V5YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXNDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGRDYXRlZ29yaWVzIS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGNhdGVnb3JpZXNgLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgY2hhbmdlcy5wdXNoKCdwZXJmb3JtIHJlZGlyZWN0IGNsZWFudXAnKTtcblxuICAgICAgICAgICAgY2hhbmdlc1swXSA9IGNoYW5nZXNbMF1bMF0udG9VcHBlckNhc2UoKSArIGNoYW5nZXNbMF0uc2xpY2UoMSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAxKSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV0gPSBgYW5kICR7Y2hhbmdlcy5hdCgtMSl9YDtcblxuICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gY2hhbmdlcy5qb2luKGNoYW5nZXMubGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgICB9IGVsc2UgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gYENyZWF0ZSByZWRpcmVjdCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgZXhpc3RpbmcgcGFnZSBkYXRhLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4aXN0aW5nRGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gKGF3YWl0IGdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKSkgPz8gJyc7XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhcmdldCA9IHRoaXMuUkVESVJFQ1RfUkVHRVguZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzFdO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzID0gKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAubWFwKChbdGFnLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRlc3QodGhpcy5wYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cbiAgICAgICAgKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlZGlyZWN0VGFncyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAuZmxhdE1hcCgoW3RhZywgdGFnRGF0YV0pID0+IFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10pXG4gICAgICAgICAgICAubWFwKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyB0YWdPclJlZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBvcmlnaW5hbFJlZGlyZWN0VGFnc1xuICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnWzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdbMF19XSR7dGFnLnNsaWNlKDEpfVxcXFx8PyguKj8pXFxcXHMqfX1gKS5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdUYWcgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maW5kKChbdGVtcGxhdGUsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZyksXG4gICAgICAgICAgICAgICAgICAgICk/LlswXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFyZ3VtZW50cyA9IG1hdGNoPy5bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxBcmd1bWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEFyZ3VtZW50cyA9IG1hdGNoWzFdLnNwbGl0KCd8JykubWFwKChhcmd1bWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQuaW5jbHVkZXMoJz0nKSkgcmV0dXJuIFsoaW5kZXggKyAxKS50b1N0cmluZygpLCBhcmd1bWVudC50cmltKCldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gYXJndW1lbnQuc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lLnRyaW0oKSwgdmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdUYWcsIGZvcm1hdHRlZEFyZ3VtZW50c107XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ1tdW11dW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbGREZWZhdWx0U29ydCA9XG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgLm1hdGNoKC97e0RFRkFVTFRTT1JUOi4qP319L2cpXG4gICAgICAgICAgICAgICAgPy5hdCgtMSlcbiAgICAgICAgICAgICAgICA/LnNsaWNlKDE0LCAtMilcbiAgICAgICAgICAgICAgICAudHJpbSgpID8/ICcnO1xuXG4gICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyA9XG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgLm1hdGNoKC9cXFtcXFtbQ2NdYXRlZ29yeTouKz9dXS9nKVxuICAgICAgICAgICAgICAgID8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc2xpY2UoMTEsIC0yKSlcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSkgPz8gW107XG5cbiAgICAgICAgdGhpcy5vbGRTdHJheVRleHQgPSBbXG4gICAgICAgICAgICAve3tzaG9ydCBkZXNjcmlwdGlvblxcfC4qP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL3t7RElTUExBWVRJVExFOi4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3tpdGFsaWMgdGl0bGVcXHw/Lio/fX0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3t0aXRsZSBsYW5ndWFnZVxcfC4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3thdXRob3JpdHkgY29udHJvbChcXHwuKj8pP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgaWYgKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0LnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgZWxzZSBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogQ291bGQgbm90IGZpbmQgcmVkaXJlY3QgdGFyZ2V0IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFncyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kVGVtcGxhdGVFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICAgICAgaWYgKCFmb3VuZFRlbXBsYXRlRWRpdG9yKSBjb250aW51ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgYXJndW1lbnRdIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlckVkaXRvciA9IGZvdW5kVGVtcGxhdGVFZGl0b3IucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+XG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRQYXJhbWV0ZXJFZGl0b3IpIGZvdW5kUGFyYW1ldGVyRWRpdG9yLmVkaXRvci5zZXRWYWx1ZShhcmd1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbGREZWZhdWx0U29ydCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHRoaXMub2xkRGVmYXVsdFNvcnQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5vbGRDYXRlZ29yaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShjYXRlZ29yeSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQudmFsaWRDYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKHsgZGF0YTogY2F0ZWdvcnksIGxhYmVsOiBjYXRlZ29yeSB9KSkpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgY2hlY2tzIG9uIHRoZSBwcm92aWRlZCBkYXRhIGFuZCByZXR1cm5zIHRoZSBlcnJvcnMgKGlmIGFueSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVN1Ym1pc3Npb24oKSB7XG4gICAgICAgIGNvbnN0IGVycm9yczoge1xuICAgICAgICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgICBhdXRvRml4ZXM/OiAoeyB0eXBlOiAnYWRkJyB8ICdyZW1vdmUnOyB0YWc6IHN0cmluZyB9IHwgeyB0eXBlOiAnY2hhbmdlLXRhcmdldCc7IHRhcmdldDogc3RyaW5nIH0pW107XG4gICAgICAgIH1bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi9cbiAgICAgICAgaWYgKCEvXlxccypbXltcXF17fH1dK1xccyokLy50ZXN0KGRlc3RpbmF0aW9uKSkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogRmFpbGVkIGR1cmluZyB0aXRsZSBwYXJzaW5nICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQoZGVzdGluYXRpb24pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyc2VkRGVzdGluYXRpb24gJiYgZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogU2VsZiByZWRpcmVjdHMgKi9cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkRGVzdGluYXRpb24/LmdldFByZWZpeGVkVGV4dCgpID09PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZFRleHQoKSlcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2Nhbm5vdCByZWRpcmVjdCB0byBpdHNlbGYhJyB9KTtcblxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSAoYXdhaXQgYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6IFsncGFnZXByb3BzJywgJ2NhdGVnb3JpZXMnXSxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlQYWdlUHJvcHNQYXJhbXMpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdtaXNzaW5ndGl0bGUnKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2RvZXMgbm90IGV4aXN0IScgfSk7XG4gICAgICAgICAgICAgICAgZWxzZSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogYHdhcyBub3QgYWJsZSB0byBiZSBmZXRjaGVkIGZyb20gdGhlIEFQSSAoJHtlcnJvckNvZGV9KSFgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9KSkgYXMgKFBhZ2Vwcm9wc1Jlc3VsdCAmIENhdGVnb3JpZXNSZXN1bHQpIHwgbnVsbDtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25QYXJzZVJlc3VsdCA9IChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlJyxcbiAgICAgICAgICAgIHBhZ2U6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgcHJvcDogJ3NlY3Rpb25zJyxcbiAgICAgICAgICAgIHJlZGlyZWN0czogdHJ1ZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpKSBhcyBQYWdlUGFyc2VSZXN1bHQ7XG5cbiAgICAgICAgLyogRG91YmxlIHJlZGlyZWN0cyAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZSEucmVkaXJlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUmVkaXJlY3QgPVxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0c1swXS50byArXG4gICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50ID8gYCMke2Rlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50fWAgOiAnJyk7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKFxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZGlyZWN0LFxuICAgICAgICAgICAgICAgICl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvblJlZGlyZWN0fTwvYT4uIFJldGFyZ2V0IHRvIHRoYXQgcGFnZSBpbnN0ZWFkLCBhcyBkb3VibGUgcmVkaXJlY3RzIGFyZW4ndCBhbGxvd2VkLmAsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb25SZWRpcmVjdCB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogTm9uZXhpc3RlbnQgc2VjdGlvbiAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb24uc3BsaXQoJyMnKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFNlY3Rpb24gPSBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5zZWN0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgIChzZWN0aW9uKSA9PiBzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJykgPT09IGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbGlkU2VjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIGFuY2hvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gc2VjdGlvbn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29udGVudCA9IChhd2FpdCBnZXRQYWdlQ29udGVudCh0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRQcmVmaXhlZFRleHQoKSkpID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC8oPzw9e3tcXHMqP1tBYV0oPzpuY2hvcnM/fG5jaG9yIGZvciByZWRpcmVjdHxua2VyfE5DSE9SfG5jKVxccyo/XFx8KS4rPyg/PX19KS9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3Iuc3BsaXQoJ3wnKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyg/PD17e1xccyo/KD86W1Z2XSg/OmlzaWJsZSBhbmNob3JzP3xpc2FuY3xBbmNofGFuY2hvcnxpc2libGVhbmNob3J8YSl8W0FhXSg/Om5jaG9yZHxjaG9yZWR8bmNob3JcXCspfFtUdF1leHQgYW5jaG9yKVxccyo/XFx8KS4rPyg/PSg/PCEhfD0pfX0pL2csXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhL150ZXh0XFxzKj89Ly50ZXN0KHBhcnQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50Lm1hdGNoKC8oPzw9aWQ9KVwiPy4rPyg/PVwifD58XFx8KS9nKT8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYW5jaG9yLnRyaW0oKSkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50Lm1hdGNoKC9FcGlzb2RlTnVtYmVyICs9ICtcXGQrL2cpPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBgZXAke2FuY2hvci5zcGxpdCgnPScpWzFdLnRyaW0oKX1gKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgW10pLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnMuaW5jbHVkZXMoZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIGFuY2hvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gYW5jaG9yfX08L2NvZGU+IScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JywgdGFyZ2V0OiBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzBdIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIHNlY3Rpb24vYW5jaG9yICovXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIFsnUiB0byBzZWN0aW9uJywgJ1IgdG8gYW5jaG9yJ10pXG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSA9ICEhKFxuICAgICAgICAgICAgZGVzdGluYXRpb25EYXRhIS5xdWVyeSEucGFnZXNbMF0ucGFnZXByb3BzICYmICdkaXNhbWJpZ3VhdGlvbicgaW4gZGVzdGluYXRpb25EYXRhIS5xdWVyeSEucGFnZXNbMF0ucGFnZXByb3BzXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRhcmdldElzU3VybmFtZUxpc3QgPSAhIWRlc3RpbmF0aW9uRGF0YSEucXVlcnkhLnBhZ2VzWzBdLmNhdGVnb3JpZXM/LnNvbWUoXG4gICAgICAgICAgICAoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6U3VybmFtZXMnLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgIGNvbnN0IHRvU3VybmFtZUxpc3RUYWdzID0gWydSIGZyb20gYW1iaWd1b3VzIHNvcnQgbmFtZScsICdSIGZyb20gYW1iaWd1b3VzIHRlcm0nXTtcblxuICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgPSB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QgPSB0b1N1cm5hbWVMaXN0VGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2Ugd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5IS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgIXRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlKSB7XG4gICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlICovXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKCF0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICh0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgfHwgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpKSB8fFxuICAgICAgICAgICAgICAgICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmIHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBub3QgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogWy4uLnRvRGlzYW1iaWd1YXRpb25QYWdlVGFncywgLi4udG9TdXJuYW1lTGlzdFRhZ3NdLm1hcCgodGFnKSA9PiAoeyB0eXBlOiAncmVtb3ZlJywgdGFnIH0pKSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gc3VybmFtZSBsaXN0IHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc3VybmFtZSBsaXN0LCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgY29ycmVjdCBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiZcbiAgICAgICAgICAgIHRhZ3MuaW5jbHVkZXMoJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScpICYmXG4gICAgICAgICAgICAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKVxuICAgICAgICApXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX08L2NvZGU+LCBidXQgdGhpcyB0aXRsZSBkb2VzIG5vdCBlbmQgd2l0aCBcIiAoZGlzYW1iaWd1YXRpb24pXCIuIFVzZSA8Y29kZT57e1IgZnJvbSBhbWJpZ3VvdXMgdGVybX19PC9jb2RlPiBvciBhIHNpbWlsYXIgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgaW5zdGVhZCEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCBhIHByb3RlY3Rpb24gdGVtcGxhdGUgKi9cbiAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBbJ1IgcHJvdGVjdGVkJywgJ1IgcHJvdGVjdGVkL3NlbWknLCAnUiBwcm90ZWN0ZWQvZXhjb24nLCAnUiBwcm90ZWN0ZWQvdGVtcGxhdGUnLCAnUiBwcm90ZWN0ZWQvZnVsbCddKVxuICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogdGVtcGxhdGUgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogTGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSB3aXRob3V0IGJlaW5nIHRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSAqL1xuICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpICYmICF0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiaXMgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSBidXQgaXQgaXNuJ3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiFcIixcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gd2l0aG91dCBiZWluZyBsaW5rZWQgdG8gYW4gaXRlbSAqL1xuICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSAmJiAhbXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IGJ1dCBpdCBpcyBub3QgYWN0dWFsbHkgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJyB9XSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIE1pc3NpbmcgdGFnIHJlcXVpcmVkIHBhcmFtZXRlciAqL1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICBpZiAoISh0YWcgaW4gdGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5yZWRpcmVjdFRlbXBsYXRlc1t0YWddO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0YWdEYXRhLnBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXIgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm9cbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKVxuICAgICAgICAgICAgICAgICAgICA/LnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kUGFyYW1ldGVyKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkICYmICFmb3VuZFBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiBidXQgaXQgaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVyIDxjb2RlPiR7cGFyYW1ldGVyTmFtZX08L2NvZGU+IWAsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogU3luY2luZyB0YWxrIHBhZ2UgYnV0IHRhbGsgcGFnZSBleGlzdHMgYW5kIGlzbid0IGEgcmVkaXJlY3QgKi9cbiAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpICYmICF0aGlzLnRhbGtEYXRhIS5xdWVyeSEucGFnZXNbMF0ubWlzc2luZyAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkhLnBhZ2VzWzBdLnJlZGlyZWN0KVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnZXhpc3RzLCBidXQgaXMgbm90IGEgcmVkaXJlY3QhJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgZXZlbnQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiU3VibWl0XCIgYnV0dG9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzVG9EaXNhYmxlID0gW1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LFxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QsXG4gICAgICAgICAgICAuLi50aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmxhdE1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5lZGl0b3IpKSxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCxcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0LFxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCxcbiAgICAgICAgICAgIHRoaXMud2F0Y2hDaGVja2JveCxcbiAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3gsXG4gICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZCh0cnVlKTtcblxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ2hlY2tpbmcgdGFyZ2V0IHZhbGlkaXR5Li4uJyk7XG5cbiAgICAgICAgbGV0IGVycm9yczogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbj4+ID0gW107XG4gICAgICAgIGlmICh0aGlzLm5lZWRzQ2hlY2spIGVycm9ycyA9IGF3YWl0IHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uKCk7XG4gICAgICAgIGVsc2UgdGhpcy5wYXJzZWREZXN0aW5hdGlvbiA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpKTtcblxuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnKSkgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aXRsZSwgbWVzc2FnZSwgYXV0b0ZpeGVzIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgIGAke3RpdGxlID8gYDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKHRpdGxlKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke3RpdGxlfTwvYT5gIDogJ1RoaXMgcGFnZSd9ICR7bWVzc2FnZX0gQ2xpY2sgYWdhaW4gd2l0aG91dCBtYWtpbmcgY2hhbmdlcyB0byBzdWJtaXQgYW55d2F5LmAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItd2FybmluZyddLFxuICAgICAgICAgICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGF1dG9GaXhlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvRml4QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1BlcmZvcm0gYXV0by1maXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uJ10sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhdXRvRml4QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG9GaXggb2YgYXV0b0ZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2FkZCcgJiYgIXRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5hZGRUYWcoYXV0b0ZpeC50YWcsIGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4LnR5cGUgPT09ICdyZW1vdmUnICYmIHRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5yZW1vdmVUYWdCeURhdGEoYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2NoYW5nZS10YXJnZXQnKSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUoYXV0b0ZpeC50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdsaW5lLXRocm91Z2ggMnB4IGJsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3IoJy5vby11aS1sYWJlbEVsZW1lbnQtbGFiZWwnKSEuYXBwZW5kKGF1dG9GaXhCdXR0b24uJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZCh3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZChmYWxzZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQgYW55d2F5Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogRWRpdC9jcmVhdGUgcmVkaXJlY3QgKi9cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoYCR7dGhpcy5leGlzdHMgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSByZWRpcmVjdC4uLmApO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5ID1cbiAgICAgICAgICAgICh0aGlzLnN1bW1hcnlJbnB1dC5nZXRWYWx1ZSgpIHx8ICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlcikgKyB0aGlzLlNDUklQVF9NRVNTQUdFO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlLCBvdXRwdXQsIHN1bW1hcnkpO1xuICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgIG13Lm5vdGlmeShgUmVkaXJlY3QgJHt0aGlzLmV4aXN0cyA/ICdlZGl0ZWQnIDogJ2NyZWF0ZWQnfSBzdWNjZXNzZnVsbHkhYCwgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG5cbiAgICAgICAgLyogU3luYyB0YWxrIHBhZ2UgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdFZGl0aW5nIHRhbGsgcGFnZS4uLicpO1xuXG4gICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBtb3ZlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIGZyb21Nb3ZlID8gWydSIGZyb20gbW92ZSddIDogW10sXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhbGtSZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgICAgICAgJ1N5bmNpbmcgcmVkaXJlY3QgZnJvbSBzdWJqZWN0IHBhZ2UnICsgdGhpcy5TQ1JJUFRfTUVTU0FHRSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXRhbGtSZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgbXcubm90aWZ5KCdUYWxrIHBhZ2Ugc3luY2VkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFBhdHJvbCBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgIGlmICh0aGlzLnBhdHJvbENoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdQYXRyb2xsaW5nIHJlZGlyZWN0Li4uJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdHJvbExpbms6IEhUTUxBbmNob3JFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rIGEnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtSZXZpZXdlZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJyk7XG5cbiAgICAgICAgICAgIGlmIChwYXRyb2xMaW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzdWx0ID0gKGF3YWl0IGFwaVxuICAgICAgICAgICAgICAgICAgICAucG9zdFdpdGhUb2tlbigncGF0cm9sJywgeyBhY3Rpb246ICdwYXRyb2wnLCByY2lkOiBuZXcgVVJMKHBhdHJvbExpbmsuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgncmNpZCcpISB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHBhdHJvbGxpbmcgJHt0aGlzLnBhZ2VUaXRsZX0gdmlhIEFQSTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yPy5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pKSBhcyBvYmplY3QgfCBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXN1bHQpIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya1Jldmlld2VkQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgbWFya1Jldmlld2VkQnV0dG9uLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIG13Lm5vdGlmeSgnUGFnZSBjdXJhdGlvbiB0b29sYmFyIG5vdCBmb3VuZCwgcmVkaXJlY3QgY2Fubm90IGJlIHBhdHJvbGxlZCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ29tcGxldGUsIHJlbG9hZGluZy4uLicpO1xuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbXcudXRpbC5nZXRVcmwodGhpcy5wYWdlVGl0bGUsIHsgcmVkaXJlY3Q6ICdubycgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUYWtlcyBwcm92aWRlZCB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBwYWdlIG91dHB1dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU91dHB1dChcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgICAgICBzdHJheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgY2F0ZWdvcmllczogc3RyaW5nW10sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVGl0bGUgPSBwYXJzZWRUYXJnZXRcbiAgICAgICAgICAgID8gYCR7cGFyc2VkVGFyZ2V0LmdldE5hbWVzcGFjZUlkKCkgPT09IDE0ID8gJzonIDogJyd9JHtwYXJzZWRUYXJnZXQuZ2V0UHJlZml4ZWRUZXh0KCl9JHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKSA/IGAjJHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKX1gIDogJyd9YFxuICAgICAgICAgICAgOiB0YXJnZXQudHJpbSgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkXG4gICAgICAgICAgICAgICAgLmdldE1haW5UZXh0KClcbiAgICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKSA9PT1cbiAgICAgICAgICAgIGRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpXG4gICAgICAgIClcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0ID0gdW5kZWZpbmVkOyAvLyBDaGVjayBpZiB0aXRsZXMgbm9ybWFsaXplIHRvIHRoZSBzYW1lIHRleHQsIGFuZCByZW1vdmVzIHRoZSBERUZBVUxUU09SVCBpZiBzb1xuXG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID0gdGFncy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KFxuICAgICAgICAgICAgICAgIChwYXJhbWV0ZXIsIGluZGV4KSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSAmJiBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUgJiYgaW5kZXggPiBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgI1JFRElSRUNUIFtbJHtmb3JtYXR0ZWRUaXRsZX1dXVxcbmAsXG4gICAgICAgICAgICB0YWdzLmxlbmd0aCA+IDAgPyBge3tSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbHxcXG4ke3RhZ3NXaXRoQXJndW1lbnRzLmpvaW4oJ1xcbicpfVxcbn19XFxuYCA6IG51bGwsXG4gICAgICAgICAgICBzdHJheVRleHQgPyBzdHJheVRleHQgKyAnXFxuJyA6IG51bGwsXG4gICAgICAgICAgICBkZWZhdWx0U29ydCA/IGB7e0RFRkFVTFRTT1JUOiR7ZGVmYXVsdFNvcnQudHJpbSgpfX19YCA6IG51bGwsXG4gICAgICAgICAgICBjYXRlZ29yaWVzLmxlbmd0aCA+IDAgPyBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IGBbW0NhdGVnb3J5OiR7Y2F0ZWdvcnl9XV1gKS5qb2luKCdcXG4nKSA6IG51bGwsXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBvciBjcmVhdGVzIGEgcGFnZSB3aXRoIGdpdmVuIHRleHQuXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSBwYWdlIHRpdGxlLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICBsZXQgd2F0Y2hsaXN0OiBXYXRjaE1ldGhvZCA9ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgaWYgKHRoaXMud2F0Y2hDaGVja2JveClcbiAgICAgICAgICAgIGlmICh0aGlzLndhdGNoQ2hlY2tib3guaXNJbmRldGVybWluYXRlKCkpIHdhdGNobGlzdCA9IHRoaXMuZGVmYXVsdENyZWF0ZWRXYXRjaE1ldGhvZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMud2F0Y2hDaGVja2JveC5pc1NlbGVjdGVkKCkpIHdhdGNobGlzdCA9ICd3YXRjaCc7XG4gICAgICAgICAgICBlbHNlIHdhdGNobGlzdCA9ICd1bndhdGNoJztcblxuICAgICAgICByZXR1cm4gKGF3YWl0IGFwaVxuICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnkgfSkpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ25vY3JlYXRlLW1pc3NpbmcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5LCB3YXRjaGxpc3QgfSwgdGV4dCkuY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yPy5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKSBhcyBSZXR1cm5UeXBlPHR5cGVvZiBhcGkuZWRpdD4gfCBudWxsO1xuICAgIH1cbn1cbiIsICIjY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbnttYXJnaW4tYm90dG9tOjIwcHh9I3JlZGlyZWN0LWhlbHBlci1ib3h7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWJvdHRvbToyNXB4IWltcG9ydGFudDttYXJnaW4tbGVmdDphdXRvO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTt3aWR0aDo3MDBweDttYXgtd2lkdGg6Y2FsYygxMDAlIC0gNTBweCk7Y29sb3I6IzIwMjEyMn0ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVse2ZvbnQtd2VpZ2h0OjcwMH0ucmVkaXJlY3QtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXM6YWZ0ZXJ7Y29udGVudDpcIiAocmVkaXJlY3Qgd2l0aCBwb3NzaWJpbGl0aWVzKVwiO2ZvbnQtc3R5bGU6aXRhbGljfS5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxze21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZC1jb2xvcjojZTJlMmUyO3BhZGRpbmc6NXB4fS5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo3MDB9LnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxze21hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206NXB4O2JhY2tncm91bmQtY29sb3I6I2QxY2VjZX0jcmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdle3BhZGRpbmc6NXB4fSNyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXR7bWFyZ2luLXRvcDoxNXB4O2JvcmRlci10b3A6MXB4IHNvbGlkIGdyYXk7cGFkZGluZy10b3A6MTBweH0jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXR7bWFyZ2luLXRvcDoxMHB4fSNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dD4qe21hcmdpbi1ib3R0b206MH0ucmVkaXJlY3QtaGVscGVyLXdhcm5pbmd7bWFyZ2luLXRvcDo4cHh9LnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbnttYXJnaW4tbGVmdDo1cHg7Zm9udC1zaXplOjEycHh9LnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiBhe3BhZGRpbmc6M3B4IDRweCFpbXBvcnRhbnQ7bWluLWhlaWdodDowIWltcG9ydGFudDttaW4taGVpZ2h0OmluaXRpYWwhaW1wb3J0YW50fVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlJbmZvUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlSW5mb1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgY3NzQ29udGVudCBmcm9tICcuLi8uLi9zdHlsZXMvcmVkaXJlY3QtaGVscGVyLmNzcycgd2l0aCB7IHR5cGU6ICdjc3MnIH07XG5pbXBvcnQgeyBhcGksIGdldFBhZ2VDb250ZW50IH0gZnJvbSAnLi4vLi4vdXRpbGl0eSc7XG5pbXBvcnQgdHlwZSB7IFdhdGNoTWV0aG9kIH0gZnJvbSAnLi4vYWZjcmMtaGVscGVyL2FmY3JjLWhlbHBlcic7XG5pbXBvcnQgdHlwZSB7IFJlZGlyZWN0VGVtcGxhdGVEYXRhIH0gZnJvbSAnLi9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICByZWRpcmVjdEhlbHBlckNvbmZpZ3VyYXRpb24/OiB7IGNyZWF0ZWRXYXRjaE1ldGhvZD86IFdhdGNoTWV0aG9kIH07XG4gICAgfVxufVxuXG5jb25zdCBkZXBlbmRlbmNpZXMgPSBbXG4gICAgJ21lZGlhd2lraS51dGlsJyxcbiAgICAnb29qcy11aS1jb3JlJyxcbiAgICAnb29qcy11aS13aWRnZXRzJyxcbiAgICAnb29qcy11aS13aW5kb3dzJyxcbiAgICAnb29qcy11aS5zdHlsZXMuaWNvbnMtY29udGVudCcsXG4gICAgJ29vanMtdWkuc3R5bGVzLmljb25zLWVkaXRpbmctY29yZScsXG5dO1xuXG5tdy5sb2FkZXIudXNpbmcoZGVwZW5kZW5jaWVzLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBSZWRpcmVjdEhlbHBlckRpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KCcuL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZW50aXJlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RIZWxwZXIge1xuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIHByaXZhdGUgY29udGVudFRleHQhOiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGUhOiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkITogbXcuVGl0bGU7XG4gICAgICAgIHByaXZhdGUgY3JlYXRlZFdhdGNoTWV0aG9kITogV2F0Y2hNZXRob2Q7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIHJlZGlyZWN0IGhlbHBlci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXNzZXNQcmVDaGVja3MoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gYXdhaXQgdGhpcy5mZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oJyNtdy1jb250ZW50LXRleHQnKTtcbiAgICAgICAgICAgIGlmICghY29udGVudFRleHQpIHJldHVybiBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogRmFpbGVkIHRvIGZpbmQgY29udGVudCB0ZXh0IGVsZW1lbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gY29udGVudFRleHQ7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG4gICAgICAgICAgICBjb25zdCBwYWdlVGl0bGVQYXJzZWQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnBhZ2VUaXRsZSk7XG4gICAgICAgICAgICBpZiAoIXBhZ2VUaXRsZVBhcnNlZCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gcGFyc2UgcGFnZSB0aXRsZSEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWdDcmVhdGVkV2F0Y2hNZXRob2QgPSB3aW5kb3cucmVkaXJlY3RIZWxwZXJDb25maWd1cmF0aW9uPy5jcmVhdGVkV2F0Y2hNZXRob2Q7XG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlZFdhdGNoTWV0aG9kID1cbiAgICAgICAgICAgICAgICBjb25maWdDcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY29uZmlnQ3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZ0NyZWF0ZWRXYXRjaE1ldGhvZFxuICAgICAgICAgICAgICAgICAgICA6ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWdlQW5kTG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGUgcGFnZSBwYXNzZXMgcHJlIGNoZWNrcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgcGFzc2VzUHJlQ2hlY2tzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID49IDAsIC8vIElzIG5vdCB2aXJ0dWFsIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNQcm9iYWJseUVkaXRhYmxlJyksIC8vIFBhZ2UgaXMgZWRpdGFibGVcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAndmlldycgfHwgbXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ2VkaXQnLCAvLyBWaWV3aW5nIG9yIGVkaXRpbmcgdGhlIHBhZ2VcbiAgICAgICAgICAgICAgICAobXcuY29uZmlnLmdldCgnd2dSZXZpc2lvbklkJykgfHwgbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJykpID09PSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSwgLy8gVmlld2luZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgICAgICAgICAgICAgICFtdy5jb25maWcuZ2V0KCd3Z0RpZmZPbGRJZCcpLCAvLyBOb3Qgdmlld2luZyBhIGRpZmZcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25zLmV2ZXJ5KEJvb2xlYW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoZXMgdGhlIHJlZGlyZWN0IHRlbXBsYXRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKChhd2FpdCBnZXRQYWdlQ29udGVudCgnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nKSkgPz8gJ3t9JykgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGEgcGFnZSdzIHN0YXR1cyBhbmQgbG9hZHMgdGhlIGhlbHBlciBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1BhZ2VBbmRMb2FkKCkge1xuICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmZvID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgY29uc3QgZGlhbG9nSW5mbyA9IHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRlbXBsYXRlczogdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyxcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogdGhpcy5jb250ZW50VGV4dCxcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZVBhcnNlZDogdGhpcy5wYWdlVGl0bGVQYXJzZWQsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAocGFnZUluZm8ucXVlcnkhLnBhZ2VzWzBdLm1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdjcmVhdGUtcmVkaXJlY3QtYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDcmVhdGUgcmVkaXJlY3QnLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiAnYXJ0aWNsZVJlZGlyZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlLCB0aGlzLmNyZWF0ZWRXYXRjaE1ldGhvZCkubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKGJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJbmZvLnF1ZXJ5IS5wYWdlc1swXS5yZWRpcmVjdCkgdm9pZCBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgdHJ1ZSwgdGhpcy5jcmVhdGVkV2F0Y2hNZXRob2QpLmxvYWQoKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRsZXRMaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhcbiAgICAgICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgICcjJyxcbiAgICAgICAgICAgICAgICAgICAgJ1JlZGlyZWN0IHBhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAncmVkaXJlY3QtaGVscGVyJyxcbiAgICAgICAgICAgICAgICApITtcbiAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlLCB0aGlzLmNyZWF0ZWRXYXRjaE1ldGhvZCkubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdm9pZCBuZXcgUmVkaXJlY3RIZWxwZXIoKS5ydW4oKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2dKQVNBLGVBQXNCQSxFQUFlQyxFQUFlLENBQ2hELE9BQ0ssTUFBTUMsRUFBSSxJQUFJLENBQ1gsT0FBUSxRQUNSLGNBQWUsSUFDZixLQUFNLFlBQ04sT0FBUSxVQUNSLFFBQVMsT0FDVCxPQUFRRCxDQUNaLENBQW1DLEdBQ3JDLE1BQU0sTUFBTSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsTUFBTSxLQUFLLFFBQVEsS0FBSyxDQUM1RCxDQXBCQSxJQUdhQyxFQUhiQyxFQUFBQyxFQUFBLGtCQUdhRixFQUFNLElBQUksR0FBRyxNQ0gxQixJQU9xQkcsRUFQckJDLEVBQUFDLEVBQUEsa0JBQ0FDLElBTXFCSCxFQUFyQixjQUFpRCxHQUFHLEdBQUcsZUFBZ0IsQ0FDNUQsZ0JBQWtCLElBQUksSUFFN0IsWUFBWUksRUFBNkIsQ0FDckMsTUFBTUEsQ0FBTSxFQUVaLEdBQUcsR0FBRyxNQUFNLGNBQWMsS0FBSyxLQUE4Q0EsQ0FBTSxDQUN2RixDQUVBLGlCQUFtQixJQUFNLENBQ3JCLElBQU1DLEVBQVEsS0FBSyxT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QVksT0FBUyxhQUMvQyxJQUNBLGdCQUNBLGlCQUNKLEVBQ0FBLEVBQVksaUJBQWlCLFFBQVVDLEdBQVUsQ0FDN0NBLEVBQU0sZUFBZSxFQUVoQixJQUFJWixFQUFxQlMsRUFBWSxHQUFPLEtBQUssa0JBQWtCLEVBQUUsS0FBSyxFQUUvRSxPQUFPLFNBQVMsQ0FBRSxJQUFLLEVBQUcsU0FBVSxRQUFTLENBQUMsRUFFOUNFLEVBQVksT0FBTyxDQUN2QixDQUFDLENBQ0wsQ0FDSixDQUNKLENBRUssSUFBSVYsRUFBZSxFQUFFLElBQUksQ0FDbEMsQ0FBQyIsCiAgIm5hbWVzIjogWyJnZXRQYWdlQ29udGVudCIsICJ0aXRsZSIsICJhcGkiLCAiaW5pdF91dGlsaXR5IiwgIl9fZXNtTWluIiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiaW5pdF91dGlsaXR5IiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJzb3J0S2V5IiwgInJlc3BvbnNlIiwgInBhcnNlZFRpdGxlIiwgImFwaSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAiZGF0YSIsICJsYWJlbCIsICJDaGFuZ2VzRGlhbG9nIiwgImluaXRfY2hhbmdlc19kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF91dGlsaXR5IiwgIl9DaGFuZ2VzRGlhbG9nIiwgImNvbmZpZyIsICJvbGRUZXh0IiwgIm5ld1RleHQiLCAiYXBpIiwgInJlc3VsdCIsICJjb21wYXJpc29uIiwgIm5vQ2hhbmdlc0VsZW1lbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIk91dHB1dFByZXZpZXdEaWFsb2ciLCAiaW5pdF9vdXRwdXRfcHJldmlld19kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF91dGlsaXR5IiwgIl9PdXRwdXRQcmV2aWV3RGlhbG9nIiwgImNvbmZpZyIsICJwYWdlVGl0bGVQYXJzZWQiLCAiYXBpIiwgInJlc3VsdCIsICJ0YWdzQ29udGVudCIsICJjYXRlZ29yaWVzQ29udGVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJpbml0X3JlZGlyZWN0X3RhcmdldF9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiaW5pdF91dGlsaXR5IiwgImNvbmZpZyIsICJwYWdlVGl0bGVQYXJzZWQiLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAidGl0bGUiLCAiYXBpIiwgInJlc3VsdCIsICJtYXRjaGVkU2VjdGlvbnMiLCAic2VjdGlvbiIsICJwYXJzZWRUaXRsZSIsICJwYWdlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAicmVkaXJlY3RfaGVscGVyX2RpYWxvZ19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlJlZGlyZWN0SGVscGVyRGlhbG9nIiwgImluaXRfcmVkaXJlY3RfaGVscGVyX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X3V0aWxpdHkiLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiaW5pdF9jaGFuZ2VzX2RpYWxvZyIsICJpbml0X291dHB1dF9wcmV2aWV3X2RpYWxvZyIsICJpbml0X3JlZGlyZWN0X3RhcmdldF9pbnB1dF93aWRnZXQiLCAicmVkaXJlY3RUZW1wbGF0ZXMiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJleGlzdHMiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgImFwaSIsICJzdWJqZWN0UGFnZUNvbnRlbnQiLCAiZ2V0UGFnZUNvbnRlbnQiLCAidGFyZ2V0IiwgImlzRnJvbU1vdmUiLCAidGFnT3JSZWRpcmVjdCIsICJjdXJyZW50VGl0bGVTcGxpdCIsICJjdXJyZW50U3VicGFnZSIsICJyb290UGFnZUNvbnRlbnQiLCAidGFyZ2V0VGl0bGUiLCAiUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJ2YWx1ZSIsICJ0YWciLCAicmVkaXJlY3QiLCAibGFiZWwiLCAic2VsZWN0ZWRFbGVtZW50cyIsICJzZWxlY3RlZFRhZ3MiLCAiZWxlbWVudCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJsYXN0RWxlbWVudCIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgInN1bW1hcnlFbGVtZW50IiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJuYW1lIiwgImdlbmVyYXRpb25hbFN1ZmZpeCIsICJsYXN0TmFtZSIsICJvdGhlck5hbWVzIiwgIm5ld05hbWUiLCAibGVhZGluZ0FydGljbGUiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJwYWdlcyIsICJwYWdlIiwgInNlbGVjdGVkQ2F0ZWdvcmllcyIsICJzb3J0ZWRDYXRlZ29yaWVzIiwgIndpbmRvd01hbmFnZXIiLCAidGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgIk91dHB1dFByZXZpZXdEaWFsb2ciLCAic2hvd0NoYW5nZXNEaWFsb2ciLCAiQ2hhbmdlc0RpYWxvZyIsICJjb25maWciLCAicGFnZVRyaWFnZU1hcmtCdXR0b24iLCAicGF0cm9sUmVzcG9uc2UiLCAicmVkaXJlY3RWYWx1ZSIsICJvbGRUYXJnZXQiLCAidGFyZ2V0Q2hhbmdlZCIsICJ0YWdzQ2hhbmdlZCIsICJ0YWdBcmd1bWVudHNDaGFuZ2VkIiwgInRhZ3NXaXRoUGFyYW1ldGVycyIsICJkYXRhIiwgIm9sZFRhZ0RhdGEiLCAiZm91bmRUYWdFZGl0b3JEYXRhIiwgInRlbXBsYXRlIiwgInBhcmFtZXRlciIsICJvbGRBcmd1bWVudCIsICJhcmd1bWVudCIsICJuZXdBcmd1bWVudCIsICJkZWZhdWx0U29ydENoYW5nZWQiLCAiY2F0ZWdvcmllc0NoYW5nZWQiLCAiY2F0ZWdvcnkiLCAiY2hhbmdlcyIsICJ0YWdEYXRhIiwgIm9yaWdpbmFsUmVkaXJlY3RUYWdzIiwgIm1hdGNoIiwgIm5ld1RhZyIsICJmb3JtYXR0ZWRBcmd1bWVudHMiLCAiaW5kZXgiLCAiZm91bmRUZW1wbGF0ZUVkaXRvciIsICJmb3VuZFBhcmFtZXRlckVkaXRvciIsICJlcnJvcnMiLCAiZGVzdGluYXRpb24iLCAidGFncyIsICJkZXN0aW5hdGlvbkRhdGEiLCAiZXJyb3JDb2RlIiwgImRlc3RpbmF0aW9uUGFyc2VSZXN1bHQiLCAiZGVzdGluYXRpb25SZWRpcmVjdCIsICJzZWN0aW9uIiwgImRlc3RpbmF0aW9uQ29udGVudCIsICJhbmNob3IiLCAicGFydCIsICJ0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YXJnZXRJc1N1cm5hbWVMaXN0IiwgInRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyIsICJ0b1N1cm5hbWVMaXN0VGFncyIsICJ0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QiLCAiZm91bmRQYXJhbWV0ZXIiLCAiZWxlbWVudHNUb0Rpc2FibGUiLCAidGl0bGUiLCAibWVzc2FnZSIsICJhdXRvRml4ZXMiLCAid2FybmluZ01lc3NhZ2UiLCAiYXV0b0ZpeEJ1dHRvbiIsICJhdXRvRml4IiwgIm91dHB1dCIsICJmcm9tTW92ZSIsICJwYXRyb2xMaW5rIiwgIm1hcmtSZXZpZXdlZEJ1dHRvbiIsICJlcnJvckluZm8iLCAic3RyYXlUZXh0IiwgImRlZmF1bHRTb3J0IiwgImNhdGVnb3JpZXMiLCAicGFyc2VkVGFyZ2V0IiwgImZvcm1hdHRlZFRpdGxlIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ0ZXh0IiwgIndhdGNobGlzdCIsICJyZWRpcmVjdF9oZWxwZXJfZGVmYXVsdCIsICJpbml0X3V0aWxpdHkiLCAiZGVwZW5kZW5jaWVzIiwgIlJlZGlyZWN0SGVscGVyRGlhbG9nIiwgIlJlZGlyZWN0SGVscGVyIiwgImNvbnRlbnRUZXh0IiwgInBhZ2VUaXRsZVBhcnNlZCIsICJjb25maWdDcmVhdGVkV2F0Y2hNZXRob2QiLCAiZ2V0UGFnZUNvbnRlbnQiLCAicmVkaXJlY3RfaGVscGVyX2RlZmF1bHQiLCAicGFnZUluZm8iLCAiYXBpIiwgImRpYWxvZ0luZm8iLCAiYnV0dG9uIiwgInBvcnRsZXRMaW5rIiwgImV2ZW50Il0KfQo=