Jump to content

User:Eejit43/scripts/redirect-helper.js

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

"use strict";(()=>{var P=["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(P,()=>{class x extends OO.ui.TextInputWidget{api=new mw.Api;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];this.api.get({action:"parse",page:e,prop:"sections",redirects:!0}).catch(()=>null).then(a=>{if(a){let r=a.parse.sections.filter(s=>s.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(r.map(s=>({data:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{let e=mw.Title.newFromText(t);this.api.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?i.resolve(a.query?.pages?a.query.pages.filter(r=>r.title!==this.pageTitleParsed.toString()).map(r=>({data:r.title,label:new OO.ui.HtmlSnippet(`${r.title}${r.pageprops&&"disambiguation"in r.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in r?" <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(x.prototype,OO.ui.mixin.LookupElement.prototype);class O extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();t||i.resolve([]);let e=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:e?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(a=>{if(a?.query?.pages){let r=a.query.pages.filter(s=>!s.categories?.some(o=>o.title==="Category:Wikipedia soft redirected categories")).map(s=>{let o=s.title.split(":")[1];return{data:o,label:o}});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);class f extends OO.ui.ProcessDialog{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),this.pageTitleParsed=i,f.static.name="TemplatePreviewDialog",f.static.title="Redirect categorization templates preview",f.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>f.super.prototype.getSetupProcess.call(this).next(()=>this.api.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.getManager().closeWindow(this)}):f.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>f.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})}Object.assign(f.prototype,OO.ui.ProcessDialog.prototype);class y extends OO.ui.ProcessDialog{api=new mw.Api;constructor(t){super(t),y.static.name="ShowChangesDialog",y.static.title="Changes to be made",y.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>y.super.prototype.getSetupProcess.call(this).next(()=>{let[t,i]=this.getData();return this.api.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,r=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),s=new OO.ui.PanelLayout({padded:!0,expanded:!1});s.$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>`:r.$element[0]),this.$body.append(s.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):y.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>y.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})}Object.assign(y.prototype,OO.ui.ProcessDialog.prototype);class v{api=new mw.Api;redirectTemplates;contentText;pageTitle;pageTitleParsed;async run(){if(this.passesPreChecks()){if(this.redirectTemplates=await this.fetchRedirectTemplates(),this.contentText=document.querySelector("#mw-content-text"),!this.contentText)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});if(this.pageTitle=mw.config.get("wgPageName"),this.pageTitleParsed=mw.Title.newFromText(this.pageTitle),!this.pageTitleParsed)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});await this.checkPageAndLoad()}}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgIsArticle"),mw.config.get("wgAction")==="view",mw.config.get("wgRevisionId")===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return JSON.parse((await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"})).query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}")}async checkPageAndLoad(){let t=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),i={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(t.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}`);let e=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});e.on("click",()=>{e.$element[0].remove(),new b(i,!1).load()}),this.contentText.prepend(e.$element[0])}else if(t.query.pages[0].redirect)new b(i,!0).load();else{let e=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");e.addEventListener("click",a=>{a.preventDefault(),new b(i,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),e.remove()})}}}class b{api=new mw.Api;redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;exists;needsCheck=!0;editorBox;syncWithMainButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a},r){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=r}async load(){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}

#redirect-helper-box {
    margin-right: auto;
    margin-bottom: 25px !important;
    margin-left: auto;
    background-color: whitesmoke;
    width: 700px;
    max-width: calc(100% - 50px);
    color: #202122;
}

.redirect-input-layout label {
    font-weight: bold;
}

.redirect-helper-redirect-possibilities::after {
    content: " (redirect with possibilities)";
    font-style: italic;
}

.redirect-helper-template-parameters-container,
.redirect-helper-template-parameters-container details {
    margin-block: 10px;
    border-radius: 5px;
    background-color: #e2e2e2;
    padding: 5px;
}

.redirect-helper-template-parameters-container summary {
    cursor: pointer;
    font-weight: bold;
}

.redirect-helper-template-parameters-container details {
    margin-block: 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: unset !important;
}`),mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&(await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect&&await this.loadSyncWithMainButton(),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithMainButton?.$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 loadSyncWithMainButton(){let t=await this.getPageContent(this.pageTitleParsed.getSubjectPage().getPrefixedText());this.syncWithMainButton=new OO.ui.ButtonWidget({label:"Sync with main page",icon:"link",flags:["progressive"]}),this.syncWithMainButton.on("click",()=>{let i=this.redirectRegex.exec(t)?.[1];if(!i)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(i)?.getTalkPage()?.toString()??""),["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(["R from move"])})}loadInputElements(){this.redirectInput=new x({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}/,"")}/wiki/`),""),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 r=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:r}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{let e=this.tagSelect.getValue().sort((r,s)=>r.toLowerCase().localeCompare(s.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let r of this.templateEditorsInfo)r.details.style.display="none";let a=0;for(let r of this.tagSelect.getValue()){let s=this.templateEditorsInfo.find(o=>o.name===r);s&&(s.details.style.display="block",a++)}t.textContent=`Template parameters (${a>0?`for ${a} template${a>1?"s":""}`:"none to show"})`,i.style.display=a>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 r=Object.entries(a.parameters);if(r.length===0)continue;let s=document.createElement("details");s.style.display="none";let o=document.createElement("summary");o.textContent=e,s.append(o);let n={name:e,details:s,parameters:[]};for(let[u,l]of r){let d=new OO.ui.TextInputWidget({placeholder:l.default?.toString(),required:l.required});d.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let c=new OO.ui.FieldLayout(d,{label:new OO.ui.HtmlSnippet(`${u}${!l.label||u.toLowerCase()===l.label?.toLowerCase()?"":` (${l.label})`}${l.description?` (${l.description})`:""} (type: ${l.type}) ${l.suggested?" (suggested)":""}${l.example?` (example: "${l.example}")`:""}`),align:"inline"});s.append(c.$element[0]),n.parameters.push({name:u,aliases:l.aliases,editor:d})}this.templateParametersEditor.append(s),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 r=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(r+", "+s+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let r of["An","A","The"])if(a.startsWith(r+" ")){a=a.slice(r.length+1)+", "+r;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}/,"")}/wiki/`),""),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",()=>{let e=this.categorySelect.getValue().sort((a,r)=>a.toLowerCase().localeCompare(r.toLowerCase()));this.categorySelect.getValue().join(";")!==e.join(";")&&this.categorySelect.setValue(e),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 f({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 y({size:"large"});t.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.exists&&(this.pageContent=await this.getPageContent(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 this.api.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"})]})),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.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 this.api.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(u=>!this.oldRedirectTags.includes(u))||this.oldRedirectTags.some(u=>!this.tagSelect.getValue().includes(u)),r=!1;if(this.oldRedirectTagData){let u=Object.entries(this.redirectTemplates).filter(([,l])=>Object.entries(l.parameters).length>0);for(let[l,d]of u){if(!this.oldRedirectTags.includes(l)||!this.tagSelect.getValue().includes(l))continue;let p=this.oldRedirectTagData[l]??Object.entries(d.parameters).map(([g])=>[g,""]),m=this.templateEditorsInfo.find(g=>g.name===l);for(let g of m.parameters){let h=p.find(S=>S[0]===g.name)?.[1]??"",w=g.editor.getValue().trim();if(h!==w){r=!0;break}}if(r)break}}let s=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),o=this.categorySelect.getValue().some(u=>!this.oldCategories.includes(u))||this.oldCategories.some(u=>!this.categorySelect.getValue().includes(u)),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`),r&&n.push("change categorization template arguments"),s&&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 this.getPageContent(this.pageTitle)),this.oldRedirectTarget=this.redirectRegex.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 s=e[1].split("|").map((o,n)=>{if(!o.includes("="))return[(n+1).toString(),o.trim()];let[u,l]=o.split("=");return[u.trim(),l.trim()]});return[a,s]}).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))??[],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("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(r=>r.name===i);if(a)for(let[r,s]of e){let o=a.parameters.find(n=>[n.name,...n.aliases].includes(r));o&&o.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(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?.toString()===this.pageTitleParsed.toString()&&t.push({message:"cannot redirect to itself!"});let a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(c=>(c==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${c})!`}),null)),r=await this.api.get({action:"parse",page:i,prop:"sections",redirects:!0});if(r.parse.redirects?.[0]){let c=r.parse.redirects[0].to+(r.parse.redirects[0].tofragment?`#${r.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(c)}" target="_blank">${c}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:c}]})}if(i.split("#").length>1)if(r.parse.sections.find(p=>p.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 p=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.toString()})).query.pages[0].revisions[0].slots.main.content;[...p.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(g=>g.split("|").map(h=>h.trim()))?.flat()??[],...p.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(g=>g.split("|").map(h=>h.trim()).filter(h=>!/^text\s*?=/.test(h)))?.flat()??[],...p.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(g=>g.trim())??[],...p.match(/EpisodeNumber += +\d+/g)?.map(g=>`ep${g.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 from 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 c of["R to section","R to anchor"])e.includes(c)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${c}}}</code>!`,autoFixes:[{type:"remove",tag:c}]});let s=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),o=!!a.query.pages[0].categories?.some(c=>c.title==="Category:Surnames"),n=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],l=n.some(c=>e.includes(c)),d=u.some(c=>e.includes(c));s&&!l&&!d&&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&&!s&&((!o&&(l||d)||o&&l)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...n,...u].map(c=>({type:"remove",tag:c}))}),o&&!d&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),s&&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 c of["R protected","R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(c)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${c}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:c}]});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 c of e){let p=this.redirectTemplates[c];if(p)for(let[m,g]of Object.entries(p.parameters)){let h=this.templateEditorsInfo.find(w=>w.name===c)?.parameters.find(w=>[w.name,...w.aliases].includes(m));h&&g.required&&!h.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${c}}}</code> but it is missing the required parameter <code>${m}</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(s=>s.parameters.map(o=>o.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(let s of t)s.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 s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(let{title:s,message:o,autoFixes:n}of i){let u=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${o} Click again without making changes to submit anyway.`),l=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:u});if(n){let d=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});d.on("click",()=>{let c=this.tagSelect.getValue();for(let p of n)p.type==="add"&&!c.includes(p.tag)&&this.tagSelect.addTag(p.tag,p.tag),p.type==="remove"&&c.includes(p.tag)&&this.tagSelect.removeTagByData(p.tag),p.type==="change-target"&&this.redirectInput.setValue(p.target);l.$element[0].style.textDecoration="line-through 2px black",d.$element[0].remove()}),l.$element[0].querySelector(".oo-ui-labelElement-label").append(d.$element[0])}this.editorBox.$element[0].append(l.$element[0])}for(let s of t)s.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.scriptAdvert;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 s=this.tagSelect.getValue().includes("R from move"),o=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),o,"Syncing redirect from main page"+this.scriptAdvert))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let s=document.querySelector(".patrollink a"),o=document.querySelector("#mwe-pt-mark-as-reviewed-button");s?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(s.href).searchParams.get("rcid")}).catch((u,l)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${l?.error.info??"Unknown error"} (${u})`,{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,r){let s=mw.Title.newFromText(t),o=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.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(u=>{let l=this.templateEditorsInfo.find(p=>p.name===u);if(!l)return`{{${u}}}`;let d=l.parameters.findLastIndex((p,m)=>p.name===(m+1).toString()&&p.editor.getValue().trim()),c=l.parameters.map((p,m)=>{let g=p.editor.getValue().trim();return!g&&m>d?null:`|${p.name===(m+1).toString()?"":`${p.name}=`}${g}`}).filter(Boolean).join("");return`{{${u}${c}}}`});return[`#REDIRECT [[${o}]]
`,i.length>0?`{{Redirect category shell|
${n.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,r.length>0?r.map(u=>`[[Category:${u}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(t){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:t})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(t,i,e){return await this.api.edit(t,()=>({text:i,summary:e})).catch((a,r)=>a==="nocreate-missing"?this.api.create(t,{summary:e},i).catch((s,o)=>{mw.notify(`Error creating ${t}: ${o?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${t}: ${r?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}}new v().run()});})();

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHtcbiAgICBBcGlDb21wYXJlUGFnZXNQYXJhbXMsXG4gICAgQXBpUGFyc2VQYXJhbXMsXG4gICAgQXBpUXVlcnlJbmZvUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zLFxuICAgIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzLFxuICAgIENhdGVnb3JpZXNSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFBhZ2VJbmZvUmVzdWx0LFxuICAgIFBhZ2VQYXJzZVJlc3VsdCxcbiAgICBQYWdlUmV2aXNpb25zUmVzdWx0LFxuICAgIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2UsXG4gICAgUGFnZXByb3BzUmVzdWx0LFxufSBmcm9tICcuLi9nbG9iYWwtdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcmVkaXJlY3Q/OiB0cnVlOyBwYXJhbWV0ZXJzOiBSZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVyczsgYWxpYXNlczogc3RyaW5nW10gfT47XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGV0YWlsczogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHBhcmFtZXRlcnM6IHsgbmFtZTogc3RyaW5nOyBhbGlhc2VzOiBzdHJpbmdbXTsgZWRpdG9yOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQgfVtdO1xufVxuXG5pbnRlcmZhY2UgTG9va3VwRWxlbWVudENvbmZpZyBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldC5Db25maWdPcHRpb25zLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LkNvbmZpZ09wdGlvbnMge31cblxuY29uc3QgZGVwZW5kZW5jaWVzID0gW1xuICAgICdtZWRpYXdpa2kudXRpbCcsXG4gICAgJ29vanMtdWktY29yZScsXG4gICAgJ29vanMtdWktd2lkZ2V0cycsXG4gICAgJ29vanMtdWktd2luZG93cycsXG4gICAgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLFxuICAgICdvb2pzLXVpLnN0eWxlcy5pY29ucy1lZGl0aW5nLWNvcmUnLFxuXTtcblxubXcubG9hZGVyLnVzaW5nKGRlcGVuZGVuY2llcywgKCkgPT4ge1xuICAgIC8vIFNldHVwIFJlZGlyZWN0SW5wdXRXaWRnZXRcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSB0aXRsZSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnIycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB2YWx1ZS5zcGxpdCgnIycpWzBdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogdGl0bGUsIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IFBhZ2VQYXJzZVJlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkU2VjdGlvbnMgPSByZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmlsdGVyKChzZWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKHZhbHVlLnNwbGl0KCcjJylbMV0udG9Mb3dlckNhc2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogYCR7cmVzdWx0LnBhcnNlLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IFsnaW5mbycsICdwYWdlcHJvcHMnXSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgcGFnZXByb3BzOiB7IGRpc2FtYmlndWF0aW9uPzogc3RyaW5nIH07IHJlZGlyZWN0Pzogc3RyaW5nIH1bXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5xdWVyeT8ucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5xdWVyeS5wYWdlcyAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUgIT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGFnZS50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhZ2UudGl0bGV9JHtwYWdlLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIHBhZ2UucGFnZXByb3BzID8gJyA8aT4oZGlzYW1iaWd1YXRpb24pPC9pPicgOiAnJ30keydyZWRpcmVjdCcgaW4gcGFnZSA/ICcgPGk+KHJlZGlyZWN0KTwvaT4nIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgICAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgIC8vIFNldHVwIENhdGVnb3J5SW5wdXRXaWRnZXRcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBjYXRlZ29yeSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBjYXRlZ29yaWVzPzogeyB0aXRsZTogc3RyaW5nIH1bXSB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihDYXRlZ29yeUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuXG4gICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHByZXZpZXdpbmcgdGVtcGxhdGVzLlxuICAgICAqL1xuICAgIGNsYXNzIFRlbXBsYXRlUHJldmlld0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLm5hbWUgPSAnVGVtcGxhdGVQcmV2aWV3RGlhbG9nJztcbiAgICAgICAgICAgIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzIHByZXZpZXcnO1xuICAgICAgICAgICAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50bW9kZWw6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ3RleHQnLCAnY2F0ZWdvcmllc2h0bWwnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZERiKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyB0ZXh0OiBzdHJpbmcgfSB9KS5wYXJzZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgY2F0ZWdvcmllc2h0bWw6IHN0cmluZyB9IH0pLnBhcnNlLmNhdGVnb3JpZXNodG1sO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRhZ3NDb250ZW50LCBjYXRlZ29yaWVzQ29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHNob3dpbmcgY2hhbmdlcyB0byBiZSBtYWRlLlxuICAgICAqL1xuICAgIGNsYXNzIFNob3dDaGFuZ2VzRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93Q2hhbmdlc0RpYWxvZyc7XG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgICAgIFNob3dDaGFuZ2VzRGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTaG93Q2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29sZFRleHQsIG5ld1RleHRdID0gdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbic6ICdjb21wYXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXR2ZXJzaW9uJzogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3AnOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tc2xvdHMnOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbXRleHQtbWFpbic6IG9sZFRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b3Nsb3RzJzogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdGV4dC1tYWluJzogbmV3VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zICYge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdGV4dC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvY29udGVudG1vZGVsLW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSAocmVzdWx0IGFzIHsgY29tcGFyZTogeyBib2R5OiBzdHJpbmcgfSB9KS5jb21wYXJlLmJvZHk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYFxuPHRhYmxlIGNsYXNzPVwiZGlmZiBkaWZmLWVkaXRmb250LW1vbm9zcGFjZVwiPlxuICAgIDxjb2xncm91cD5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICA8L2NvbGdyb3VwPlxuICAgIDx0Ym9keT5cbiAgICAgICAgJHtjb21wYXJpc29ufVxuICAgIDwvdGJvZHk+XG48L3RhYmxlPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBub0NoYW5nZXNFbGVtZW50LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHBhbmVsTGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICAgICAgPyBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTaG93Q2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oU2hvd0NoYW5nZXNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGVudGlyZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFRlbXBsYXRlcyE6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0ITogSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZCE6IG13LlRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSdW5zIHRoZSByZWRpcmVjdCBoZWxwZXIuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBydW4oKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFzc2VzUHJlQ2hlY2tzKCkpIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IGF3YWl0IHRoaXMuZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRGl2RWxlbWVudD4oJyNtdy1jb250ZW50LXRleHQnKSE7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFRleHQpIHJldHVybiBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogRmFpbGVkIHRvIGZpbmQgY29udGVudCB0ZXh0IGVsZW1lbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnBhZ2VUaXRsZSkhO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2VUaXRsZVBhcnNlZCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gcGFyc2UgcGFnZSB0aXRsZSEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWdlQW5kTG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGUgcGFnZSBwYXNzZXMgcHJlIGNoZWNrcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgcGFzc2VzUHJlQ2hlY2tzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID49IDAsIC8vIElzIG5vdCB2aXJ0dWFsIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNQcm9iYWJseUVkaXRhYmxlJyksIC8vIFBhZ2UgaXMgZWRpdGFibGVcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0lzQXJ0aWNsZScpLCAvLyBWaWV3aW5nIHRoZSBjb250ZW50IG9mIGEgcGFnZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICd2aWV3JywgLy8gVmlld2luZyB0aGUgcGFnZSAobm90IGVkaXRpbmcpXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dSZXZpc2lvbklkJykgPT09IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpLCAvLyBWaWV3aW5nIHRoZSBjdXJyZW50IHJldmlzaW9uXG4gICAgICAgICAgICAgICAgIW13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJyksIC8vIE5vdCB2aWV3aW5nIGEgZGlmZlxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbnMuZXZlcnkoQm9vbGVhbik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgcmVkaXJlY3QgdGVtcGxhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICkucXVlcnkucGFnZXM/LlswXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScsXG4gICAgICAgICAgICApIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBhIHBhZ2UncyBzdGF0dXMgYW5kIGxvYWRzIHRoZSBoZWxwZXIgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgY2hlY2tQYWdlQW5kTG9hZCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmZvID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICBjb25zdCBkaWFsb2dJbmZvID0ge1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVzOiB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiB0aGlzLmNvbnRlbnRUZXh0LFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlUGFyc2VkOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChwYWdlSW5mby5xdWVyeS5wYWdlc1swXS5taXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuI2NyZWF0ZS1yZWRpcmVjdC1idXR0b24ge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG59YCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdjcmVhdGUtcmVkaXJlY3QtYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDcmVhdGUgcmVkaXJlY3QnLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiAnYXJ0aWNsZVJlZGlyZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSkubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKGJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KSBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgdHJ1ZSkubG9hZCgpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9ydGxldExpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuICAgICAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICdwLXRiJyA6ICdwLWNhY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgJyMnLFxuICAgICAgICAgICAgICAgICAgICAnUmVkaXJlY3QgcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICdyZWRpcmVjdC1oZWxwZXInLFxuICAgICAgICAgICAgICAgICkhO1xuICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcG9ydGxldExpbmsucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGRpYWxvZyBwb3J0aW9uIG9mIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RIZWxwZXJEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFJlZ2V4ID0gL14jcmVkaXJlY3Q6P1xccypcXFtcXFtcXHMqOj8oW15bXFxde3x9XSs/KVxccyooPzpcXHxbXltcXF17fH1dKz8pP11dXFxzKi9pO1xuICAgICAgICBwcml2YXRlIHNjcmlwdEFkdmVydCA9ICcgKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGU6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuXG4gICAgICAgIC8vIFVzZWQgZHVyaW5nIHJ1bigpXG4gICAgICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICAgICAgcHJpdmF0ZSBlZGl0b3JCb3ghOiBPTy51aS5QYW5lbExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jV2l0aE1haW5CdXR0b24/OiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dCE6IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHRhZ1NlbGVjdCE6IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSB0YWdTZWxlY3RMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IhOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG4gICAgICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3QhOiBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdElucHV0ITogQ2F0ZWdvcnlJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXRMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXQhOiBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHN1bW1hcnlJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHN1Ym1pdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzaG93Q2hhbmdlc0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzaG93UHJldmlld0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzdWJtaXRMYXlvdXQhOiBPTy51aS5Ib3Jpem9udGFsTGF5b3V0O1xuXG4gICAgICAgIHByaXZhdGUgdGFsa0RhdGE/OiBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICBwcml2YXRlIHBhZ2VDb250ZW50ID0gJyc7XG5cbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ3M/OiBzdHJpbmdbXTtcbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXVtdPjtcbiAgICAgICAgcHJpdmF0ZSBvbGREZWZhdWx0U29ydD86IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBvbGRDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgICAgIHByaXZhdGUgb2xkU3RyYXlUZXh0Pzogc3RyaW5nO1xuXG4gICAgICAgIHByaXZhdGUgcGFyc2VkRGVzdGluYXRpb24hOiBtdy5UaXRsZSB8IG51bGw7XG5cbiAgICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZXMsXG4gICAgICAgICAgICAgICAgY29udGVudFRleHQsXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZVBhcnNlZCxcbiAgICAgICAgICAgIH06IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhOyBjb250ZW50VGV4dDogSFRNTERpdkVsZW1lbnQ7IHBhZ2VUaXRsZTogc3RyaW5nOyBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlIH0sXG4gICAgICAgICAgICBleGlzdHM6IGJvb2xlYW4sXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IHJlZGlyZWN0VGVtcGxhdGVzO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dCA9IGNvbnRlbnRUZXh0O1xuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICAgICAgdGhpcy5leGlzdHMgPSBleGlzdHM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIHJlZGlyZWN0LWhlbHBlciBkaWFsb2cgaW50byB0aGUgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1ib3gge1xuICAgIG1hcmdpbi1yaWdodDogYXV0bztcbiAgICBtYXJnaW4tYm90dG9tOiAyNXB4ICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcbiAgICB3aWR0aDogNzAwcHg7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1MHB4KTtcbiAgICBjb2xvcjogIzIwMjEyMjtcbn1cblxuLnJlZGlyZWN0LWlucHV0LWxheW91dCBsYWJlbCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllczo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiIChyZWRpcmVjdCB3aXRoIHBvc3NpYmlsaXRpZXMpXCI7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLFxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDEwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDFjZWNlO1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlIHtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQge1xuICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGdyYXk7XG4gICAgcGFkZGluZy10b3A6IDEwcHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0ID4gKiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci13YXJuaW5nIHtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgZm9udC1zaXplOiAxMnB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uIGEge1xuICAgIHBhZGRpbmc6IDNweCA0cHggIWltcG9ydGFudDtcbiAgICBtaW4taGVpZ2h0OiB1bnNldCAhaW1wb3J0YW50O1xufWApO1xuXG4gICAgICAgICAgICBtdy5sb2FkZXIuYWRkTGlua1RhZygnaHR0cHM6Ly93d3cubWVkaWF3aWtpLm9yZy93L2xvYWQucGhwP21vZHVsZXM9bWVkaWF3aWtpLmRpZmYuc3R5bGVzJm9ubHk9c3R5bGVzJyk7XG5cbiAgICAgICAgICAgIC8qIExvYWQgZWxlbWVudHMgKi9cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgaWQ6ICdyZWRpcmVjdC1oZWxwZXItYm94JywgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UsIGZyYW1lZDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICAgICAgaWYgKG1haW5QYWdlRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCkgYXdhaXQgdGhpcy5sb2FkU3luY1dpdGhNYWluQnV0dG9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZElucHV0RWxlbWVudHMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN1Ym1pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBlbGVtZW50cyB0byBzY3JlZW4gYW5kIGxvYWQgZGF0YSAoaWYgYXBwbGljYWJsZSkgKi9cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZChcbiAgICAgICAgICAgICAgICAuLi4oW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbj8uJGVsZW1lbnQ/LlswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIEhUTUxFbGVtZW50W10pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLmxvYWRFeGlzdGluZ0RhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgXCJTeW5jIHdpdGggbWFpbiBwYWdlXCIgYnV0dG9uXCIgb24gdGFsayBwYWdlcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCkpO1xuXG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N5bmMgd2l0aCBtYWluIHBhZ2UnLCBpY29uOiAnbGluaycsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWMobWFpblBhZ2VDb250ZW50KT8uWzFdO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbXcubm90aWZ5KCdGYWlsZWQgdG8gcGFyc2UgbWFpbiBwYWdlIGNvbnRlbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk/LmdldFRhbGtQYWdlKCk/LnRvU3RyaW5nKCkgPz8gJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Nb3ZlID0gWydSIGZyb20gbW92ZScsIC4uLnRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbJ1IgZnJvbSBtb3ZlJ10uYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYWluUGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbU1vdmUpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKFsnUiBmcm9tIG1vdmUnXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgLyogUmVkaXJlY3QgdGFyZ2V0IGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQgPSBuZXcgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnVGFyZ2V0IHBhZ2UgbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnJlZGlyZWN0SW5wdXQsIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRhcmdldDonLFxuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHNlbGVjdGlvbiAqL1xuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QgPSBuZXcgT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKFt0YWcsIHsgcmVkaXJlY3QgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoYDxzcGFuIGNsYXNzPVwicmVkaXJlY3QtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXNcIj4ke3RhZ308L3NwYW4+YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbCB9O1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAodGhpcy50YWdTZWxlY3QuZ2V0TWVudSgpIGFzIE9PLnVpLk1lbnVTZWxlY3RXaWRnZXQuQ29uZmlnT3B0aW9ucykuZmlsdGVyTW9kZSA9ICdzdWJzdHJpbmcnO1xuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdG9ySW5mbyA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9IGBUZW1wbGF0ZSBwYXJhbWV0ZXJzICgke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/IGBmb3IgJHtzaG93blRlbXBsYXRlRWRpdG9yc30gdGVtcGxhdGUke3Nob3duVGVtcGxhdGVFZGl0b3JzID4gMSA/ICdzJyA6ICcnfWAgOiAnbm9uZSB0byBzaG93J30pYDtcblxuICAgICAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzOicsXG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgcGFyYW1ldGVycyAqL1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdyZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgdGVtcGxhdGVEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgICAgICBzdW1tYXJ5LnRleHRDb250ZW50ID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGE6IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gPSB7IG5hbWU6IHRlbXBsYXRlTmFtZSwgZGV0YWlscywgcGFyYW1ldGVyczogW10gfTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhcmFtZXRlck5hbWV9JHshcGFyYW1ldGVyRGF0YS5sYWJlbCB8fCBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcmFtZXRlckRhdGEubGFiZWw/LnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKGRldGFpbHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQobm9UZW1wbGF0ZXNNZXNzYWdlKTtcblxuICAgICAgICAgICAgLyogREVGQVVMVFNPUlQgaW5wdXQgKi9cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGljb246ICdyb2JvdCcsIGxhYmVsOiAnU3VnZ2VzdCcsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5yZXBsYWNlKC8gXFwoLipcXCkkLywgJycpOyAvLyBSZW1vdmUgZGlzYW1iaWd1YXRpb25cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBiaXJ0aCBuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSIGZyb20gZmljdGlvbmFsIGNoYXJhY3RlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJhbmQgbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSIGZyb20gbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSIGZyb20gcGVyc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSIGZyb20gcGVyc29uYWwgbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHJlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSIGZyb20gc3BvdXNlJyxcbiAgICAgICAgICAgICAgICAgICAgXS5zb21lKCh0YWcpID0+IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxpbmcgaXMgbW9kaWZpZWQgZnJvbSBldmFkMzcncyBcIlJhdGVyXCJcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBnZW5lcmF0aW9uYWxTdWZmaXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKC8gKD86W0pTXXIuP3xbSVZYXSspJC8udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbmFsU3VmZml4ID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnICcpKSByZXR1cm4gbmFtZSArIGdlbmVyYXRpb25hbFN1ZmZpeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROYW1lID0gbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoJyAnKSArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLCQvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9PJy8sICdPJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyTmFtZXMgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKGxhc3ROYW1lICsgJywgJyArIG90aGVyTmFtZXMgKyBnZW5lcmF0aW9uYWxTdWZmaXgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lID0gbmFtZS5yZXBsYWNlQWxsKCdNci4nLCAnTWlzdGVyJykucmVwbGFjZUFsbCgnJicsICdBbmQnKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxlYWRpbmdBcnRpY2xlIG9mIFsnQW4nLCAnQScsICdUaGUnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lLnN0YXJ0c1dpdGgobGVhZGluZ0FydGljbGUgKyAnICcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSA9IG5ld05hbWUuc2xpY2UobGVhZGluZ0FydGljbGUubGVuZ3RoICsgMSkgKyAnLCAnICsgbGVhZGluZ0FydGljbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUgPT09IG5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICBgRGVmYXVsdCBzb3J0IGtleSAoREVGQVVMVFNPUlQpIChzZWUgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoJ1dpa2lwZWRpYTpDYXRlZ29yaXphdGlvbiNTb3J0IGtleXMnKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5ndWlkZWxpbmU8L2E+KTpgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogQ2F0ZWdvcmllcyBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgICBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5jYXRlZ29yeVNlbGVjdCwge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQ2F0ZWdvcmllczonLFxuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFN1bW1hcnkgaW5wdXQgKi9cbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0ID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBkb3VibGUgcmVkaXJlY3QnIH0sIC8vXG4gICAgICAgICAgICAgICAgICAgIHsgZGF0YTogJ1Jlc29sdmUgc2VsZiByZWRpcmVjdCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVtb3ZlIGluY29ycmVjdCByY2F0cycgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3VtbWFyeUlucHV0LCB7XG4gICAgICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnU3VtbWFyeTonLFxuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGVsZW1lbnRzIGluIHRoZSBzdWJtaXQgYnV0dG9uIHJvdy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZFN1Ym1pdEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgLyogU2V0dXAgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTdWJtaXQnLCBkaXNhYmxlZDogdHJ1ZSwgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHNob3cgcHJldmlldyBidXR0b24gKi9cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUHJldmlld0RpYWxvZyA9IG5ldyBUZW1wbGF0ZVByZXZpZXdEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbdGVtcGxhdGVQcmV2aWV3RGlhbG9nXSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IHByZXZpZXcnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5zZXREYXRhKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cub3BlbigpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHNob3cgY2hhbmdlcyBidXR0b24gKi9cbiAgICAgICAgICAgIGNvbnN0IHNob3dDaGFuZ2VzRGlhbG9nID0gbmV3IFNob3dDaGFuZ2VzRGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9KTtcbiAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0NoYW5nZXNEaWFsb2ddKTtcblxuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgY2hhbmdlcycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5zZXREYXRhKFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzeW5jIHRhbGsgY2hlY2tib3ggKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWxrRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6ICEhdGhpcy50YWxrRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3luY1RhbGtDaGVja2JveCwgeyBsYWJlbDogJ1N5bmMgdGFsayBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogU2V0dXAgcGF0cm9sIGNoZWNrYm94ICovXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja1Nob3VsZFByb21wdFBhdHJvbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5wYXRyb2xDaGVja2JveCwgeyBsYWJlbDogJ01hcmsgYXMgcGF0cm9sbGVkJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogU2V0dXAgbGF5b3V0ICovXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KHtcbiAgICAgICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0JyxcbiAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94TGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0LFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIE9PLnVpLldpZGdldFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgdG8gcGF0cm9sIHRoZSBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1Nob3VsZFByb21wdFBhdHJvbCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VUcmlhZ2VNYXJrQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW1hZ2VFbGVtZW50PignI213ZS1wdC1tYXJrIC5td2UtcHQtdG9vbC1pY29uJyk7XG4gICAgICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcbiAgICAgICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuXG4gICAgICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXVucmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IGF3YWl0IG13LnVzZXIuZ2V0UmlnaHRzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF1c2VyUGVybWlzc2lvbnMuaW5jbHVkZXMoJ3BhdHJvbCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYWdldHJpYWdlbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VfaWQ6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgUGFnZVRyaWFnZUFwaVBhZ2VUcmlhZ2VMaXN0UGFyYW1zKSkgYXMgUGFnZVRyaWFnZUxpc3RSZXNwb25zZTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8udXNlcl9uYW1lID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5yZXN1bHQgIT09ICdzdWNjZXNzJyB8fCBwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAhTnVtYmVyLnBhcnNlSW50KHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy5wYXRyb2xfc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IGlucHV0IHBsYWNlaG9sZGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5KCkge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RWYWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKCFyZWRpcmVjdFZhbHVlKSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9sZFRhcmdldCA9IHRoaXMub2xkUmVkaXJlY3RUYXJnZXQ/LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICAgICAgICAgIGlmIChvbGRUYXJnZXQpIG9sZFRhcmdldCA9IG9sZFRhcmdldFswXS50b1VwcGVyQ2FzZSgpICsgb2xkVGFyZ2V0LnNsaWNlKDEpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q2hhbmdlZCA9IHJlZGlyZWN0VmFsdWUgIT09IG9sZFRhcmdldDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+ICF0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnIGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzIS5zb21lKCh0YWcpID0+ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnc1dpdGhQYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKFssIGRhdGFdKSA9PiBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdGFnLCBkYXRhXSBvZiB0YWdzV2l0aFBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1dhc1NlbGVjdGVkID0gdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmluY2x1ZGVzKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ1dhc1NlbGVjdGVkIHx8ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRUYWdEYXRhID0gdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGFbdGFnXSA/PyBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLm1hcCgoW25hbWVdKSA9PiBbbmFtZSwgJyddKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRUYWdFZGl0b3JEYXRhID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSB0YWcpITtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZm91bmRUYWdFZGl0b3JEYXRhLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRBcmd1bWVudCA9IG9sZFRhZ0RhdGEuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50WzBdID09PSBwYXJhbWV0ZXIubmFtZSk/LlsxXSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBcmd1bWVudCA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkQXJndW1lbnQgIT09IG5ld0FyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0Q2hhbmdlZCA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKSAhPT0gdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMub2xkQ2F0ZWdvcmllcyEuaW5jbHVkZXMoY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzIS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyhjYXRlZ29yeSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIGNoYW5nZXMucHVzaChgcmV0YXJnZXQgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZFJlZGlyZWN0VGFncyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnQXJndW1lbnRzQ2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgYXJndW1lbnRzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRTb3J0Q2hhbmdlZClcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJykubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBkZWZhdWx0IHNvcnQga2V5YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcmllc0NoYW5nZWQpXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHRoaXMub2xkQ2F0ZWdvcmllcyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBjYXRlZ29yaWVzYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgY2hhbmdlcy5wdXNoKCdwZXJmb3JtIHJlZGlyZWN0IGNsZWFudXAnKTtcblxuICAgICAgICAgICAgICAgIGNoYW5nZXNbMF0gPSBjaGFuZ2VzWzBdWzBdLnRvVXBwZXJDYXNlKCkgKyBjaGFuZ2VzWzBdLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDEpIGNoYW5nZXNbY2hhbmdlcy5sZW5ndGggLSAxXSA9IGBhbmQgJHtjaGFuZ2VzLmF0KC0xKX1gO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gY2hhbmdlcy5qb2luKGNoYW5nZXMubGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgICAgICAgfSBlbHNlICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGBDcmVhdGUgcmVkaXJlY3QgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIGV4aXN0aW5nIHBhZ2UgZGF0YS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4aXN0aW5nRGF0YSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5wYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlsxXTtcblxuICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ3MgPSAoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW3RhZywgdGFnRGF0YV0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGVzdCh0aGlzLnBhZ2VDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdXG4gICAgICAgICAgICApLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFJlZGlyZWN0VGFncyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PiBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdKVxuICAgICAgICAgICAgICAgIC5tYXAoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0YWdPclJlZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVkaXJlY3RUYWdzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ1swXS50b0xvd2VyQ2FzZSgpfSR7dGFnWzBdfV0ke3RhZy5zbGljZSgxKX1cXFxcfD8oLio/KVxcXFxzKn19YCkuZXhlYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFnID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmluZCgoW3RlbXBsYXRlLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGUsIC4uLnRhZ0RhdGEuYWxpYXNlc10uaW5jbHVkZXModGFnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk/LlswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBcmd1bWVudHMgPSBtYXRjaD8uWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbEFyZ3VtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEFyZ3VtZW50cyA9IG1hdGNoWzFdLnNwbGl0KCd8JykubWFwKChhcmd1bWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50LmluY2x1ZGVzKCc9JykpIHJldHVybiBbKGluZGV4ICsgMSkudG9TdHJpbmcoKSwgYXJndW1lbnQudHJpbSgpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBhcmd1bWVudC5zcGxpdCgnPScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lLnRyaW0oKSwgdmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25ld1RhZywgZm9ybWF0dGVkQXJndW1lbnRzXTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBbc3RyaW5nLCBzdHJpbmdbXVtdXVtdLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5vbGREZWZhdWx0U29ydCA9XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAubWF0Y2goL3t7REVGQVVMVFNPUlQ6Lio/fX0vZylcbiAgICAgICAgICAgICAgICAgICAgPy5hdCgtMSlcbiAgICAgICAgICAgICAgICAgICAgPy5zbGljZSgxNCwgLTIpXG4gICAgICAgICAgICAgICAgICAgID8udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMgPSB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC9cXFtcXFtbQ2NdYXRlZ29yeTouKz9dXS9nKT8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc2xpY2UoMTEsIC0yKSkgPz8gW107XG5cbiAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0ID0gW1xuICAgICAgICAgICAgICAgIC97e3Nob3J0IGRlc2NyaXB0aW9uXFx8Lio/fX0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAgICAgL3t7RElTUExBWVRJVExFOi4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAgICAgL3t7aXRhbGljIHRpdGxlXFx8Py4qP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgICAgIC97e3RpdGxlIGxhbmd1YWdlXFx8Lio/fX0vLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgICAgICAve3thdXRob3JpdHkgY29udHJvbChcXHwuKj8pP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0KSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhcmdldC5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICBlbHNlIG13Lm5vdGlmeSgnQ291bGQgbm90IGZpbmQgcmVkaXJlY3QgdGFyZ2V0IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhZ3MpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kVGVtcGxhdGVFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmRUZW1wbGF0ZUVkaXRvcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBhcmd1bWVudF0gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlckVkaXRvciA9IGZvdW5kVGVtcGxhdGVFZGl0b3IucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRQYXJhbWV0ZXJFZGl0b3IpIGZvdW5kUGFyYW1ldGVyRWRpdG9yLmVkaXRvci5zZXRWYWx1ZShhcmd1bWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vbGREZWZhdWx0U29ydCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHRoaXMub2xkRGVmYXVsdFNvcnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMub2xkQ2F0ZWdvcmllcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoY2F0ZWdvcnkpO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKHsgZGF0YTogY2F0ZWdvcnksIGxhYmVsOiBjYXRlZ29yeSB9KSkpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSdW5zIGNoZWNrcyBvbiB0aGUgcHJvdmlkZWQgZGF0YSBhbmQgcmV0dXJucyB0aGUgZXJyb3JzIChpZiBhbnkpLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVN1Ym1pc3Npb24oKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IHtcbiAgICAgICAgICAgICAgICB0aXRsZT86IHN0cmluZztcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzPzogKHsgdHlwZTogJ2FkZCcgfCAncmVtb3ZlJzsgdGFnOiBzdHJpbmcgfSB8IHsgdHlwZTogJ2NoYW5nZS10YXJnZXQnOyB0YXJnZXQ6IHN0cmluZyB9KVtdO1xuICAgICAgICAgICAgfVtdID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIC8qIEludmFsaWQgY2hhcmFjdGVycyAqL1xuICAgICAgICAgICAgaWYgKCEvXlxccypbXltcXF17fH1dK1xccyokLy50ZXN0KGRlc3RpbmF0aW9uKSkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgICAgIC8qIEZhaWxlZCBkdXJpbmcgdGl0bGUgcGFyc2luZyAqL1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQoZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlZERlc3RpbmF0aW9uICYmIGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuXG4gICAgICAgICAgICAvKiBTZWxmIHJlZGlyZWN0cyAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyc2VkRGVzdGluYXRpb24/LnRvU3RyaW5nKCkgPT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnY2Fubm90IHJlZGlyZWN0IHRvIGl0c2VsZiEnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSAoYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6IFsncGFnZXByb3BzJywgJ2NhdGVnb3JpZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8qIE5vbmV4aXN0ZW50IGRlc3RpbmF0aW9uICovIGlmIChlcnJvckNvZGUgPT09ICdtaXNzaW5ndGl0bGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdkb2VzIG5vdCBleGlzdCEnIH0pO1xuICAgICAgICAgICAgICAgICAgICAvKiBPdGhlciBBUEkgZXJyb3IgKi8gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6IGB3YXMgbm90IGFibGUgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBBUEkgKCR7ZXJyb3JDb2RlfSkhYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSkpIGFzIChQYWdlcHJvcHNSZXN1bHQgJiBDYXRlZ29yaWVzUmVzdWx0KSB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhcnNlUmVzdWx0ID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncGFyc2UnLFxuICAgICAgICAgICAgICAgIHBhZ2U6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgIHByb3A6ICdzZWN0aW9ucycsXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RzOiB0cnVlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpKSBhcyBQYWdlUGFyc2VSZXN1bHQ7XG5cbiAgICAgICAgICAgIC8qIERvdWJsZSByZWRpcmVjdHMgKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0cz8uWzBdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25SZWRpcmVjdCA9XG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvICtcbiAgICAgICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYCMke2Rlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJyk7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SZWRpcmVjdCxcbiAgICAgICAgICAgICAgICAgICAgKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9uUmVkaXJlY3R9PC9hPi4gUmV0YXJnZXQgdG8gdGhhdCBwYWdlIGluc3RlYWQsIGFzIGRvdWJsZSByZWRpcmVjdHMgYXJlbid0IGFsbG93ZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb25SZWRpcmVjdCB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogTm9uZXhpc3RlbnQgc2VjdGlvbiAqL1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkU2VjdGlvbiA9IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb24pID0+IHNlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKSA9PT0gZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZFNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uIScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gc2VjdGlvbn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFyc2VkRGVzdGluYXRpb24hLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC8oPzw9e3tcXHMqP1tBYV0oPzpuY2hvcnM/fG5jaG9yIGZvciByZWRpcmVjdHxua2VyfE5DSE9SfG5jKVxccyo/XFx8KS4rPyg/PX19KS9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYW5jaG9yLnNwbGl0KCd8JykubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyg/PD17e1xccyo/KD86W1Z2XSg/OmlzaWJsZSBhbmNob3JzP3xpc2FuY3xBbmNofGFuY2hvcnxpc2libGVhbmNob3J8YSl8W0FhXSg/Om5jaG9yZHxjaG9yZWR8bmNob3JcXCspfFtUdF1leHQgYW5jaG9yKVxccyo/XFx8KS4rPyg/PSg/PCEhfD0pfX0pL2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhL150ZXh0XFxzKj89Ly50ZXN0KHBhcnQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvKD88PWlkPSlcIj8uKz8oPz1cInw+fFxcfCkvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci50cmltKCkpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goL0VwaXNvZGVOdW1iZXIgKz0gK1xcZCsvZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGBlcCR7YW5jaG9yLnNwbGl0KCc9JylbMV0udHJpbSgpfWApID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvcnMuaW5jbHVkZXMoZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gYW5jaG9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiBmcm9tIGFuY2hvcn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIGFuY2hvcicgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb24uc3BsaXQoJyMnKVswXSB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogSW1wcm9wZXJseSB0YWdnZWQgYXMgcmVkaXJlY3QgdG8gc2VjdGlvbi9hbmNob3IgKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBbJ1IgdG8gc2VjdGlvbicsICdSIHRvIGFuY2hvciddKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcyh0YWcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBub3QgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24vYW5jaG9yLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4hYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWcgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgPSAhIShcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNTdXJuYW1lTGlzdCA9ICEhZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5jYXRlZ29yaWVzPy5zb21lKFxuICAgICAgICAgICAgICAgIChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpTdXJuYW1lcycsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MgPSBbJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScsICdSIGZyb20gaW5jb21wbGV0ZSBkaXNhbWJpZ3VhdGlvbiddO1xuICAgICAgICAgICAgY29uc3QgdG9TdXJuYW1lTGlzdFRhZ3MgPSBbJ1IgZnJvbSBhbWJpZ3VvdXMgc29ydCBuYW1lJywgJ1IgZnJvbSBhbWJpZ3VvdXMgdGVybSddO1xuXG4gICAgICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgPSB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0ID0gdG9TdXJuYW1lTGlzdFRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gZGlzYW1iaWd1YXRpb24gcGFnZSB3aXRob3V0IHRlbXBsYXRlICovXG4gICAgICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgIXRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlKSB7XG4gICAgICAgICAgICAgICAgLyogSW1wcm9wZXJseSB0YWdnZWQgYXMgcmVkaXJlY3QgdG8gZGlzYW1iaWd1YXRpb24gcGFnZSAqL1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKCF0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICh0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgfHwgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpKSB8fFxuICAgICAgICAgICAgICAgICAgICAodGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFsuLi50b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MsIC4uLnRvU3VybmFtZUxpc3RUYWdzXS5tYXAoKHRhZykgPT4gKHsgdHlwZTogJ3JlbW92ZScsIHRhZyB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gc3VybmFtZSBsaXN0IHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIGEgcmVkaXJlY3QgdG8gYSBzdXJuYW1lIGxpc3QsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBjb3JyZWN0IGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiB7e1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZX19IHdpdGhvdXQgXCIgKGRpc2FtYmlndWF0aW9uKVwiIGF0IGVuZCBvZiB0aXRsZSAqL1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlICYmXG4gICAgICAgICAgICAgICAgdGFncy5pbmNsdWRlcygnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJykgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZX19PC9jb2RlPiwgYnV0IHRoaXMgdGl0bGUgZG9lcyBub3QgZW5kIHdpdGggXCIgKGRpc2FtYmlndWF0aW9uKVwiLiBVc2UgPGNvZGU+e3tSIGZyb20gYW1iaWd1b3VzIHRlcm19fTwvY29kZT4gb3IgYSBzaW1pbGFyIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIGluc3RlYWQhJyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJyB9XSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogVGFnZ2VkIHdpdGggYSBwcm90ZWN0aW9uIHRlbXBsYXRlICovXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIFsnUiBwcm90ZWN0ZWQnLCAnUiBzZW1pLXByb3RlY3RlZCcsICdSIGV4dGVuZGVkLXByb3RlY3RlZCcsICdSIHRlbXBsYXRlLXByb3RlY3RlZCcsICdSIGZ1bGx5IHByb3RlY3RlZCddKVxuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6IHRlbXBsYXRlIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogTGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSB3aXRob3V0IGJlaW5nIHRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSAqL1xuICAgICAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSAmJiAhdGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiaXMgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSBidXQgaXQgaXNuJ3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiFcIixcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nIH1dLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBUYWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gd2l0aG91dCBiZWluZyBsaW5rZWQgdG8gYW4gaXRlbSAqL1xuICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykgJiYgIW13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IGJ1dCBpdCBpcyBub3QgYWN0dWFsbHkgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSEnLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIE1pc3NpbmcgdGFnIHJlcXVpcmVkIHBhcmFtZXRlciAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzW3RhZ107XG4gICAgICAgICAgICAgICAgaWYgKCF0YWdEYXRhKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ0RhdGEucGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXIgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgICAgID8ucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kUGFyYW1ldGVyKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyRGF0YS5yZXF1aXJlZCAmJiAhZm91bmRQYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiBidXQgaXQgaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVyIDxjb2RlPiR7cGFyYW1ldGVyTmFtZX08L2NvZGU+IWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnZXhpc3RzLCBidXQgaXMgbm90IGEgcmVkaXJlY3QhJyxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJTdWJtaXRcIiBidXR0b24uXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0Rpc2FibGUgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5mbGF0TWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmVkaXRvcikpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICAgICAgbGV0IGVycm9yczogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbj4+ID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkc0NoZWNrKSBlcnJvcnMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbigpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlZGlyZWN0LWhlbHBlci13YXJuaW5nJykpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlLCBhdXRvRml4ZXMgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt0aXRsZSA/IGA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCh0aXRsZSl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHt0aXRsZX08L2E+YCA6ICdUaGlzIHBhZ2UnfSAke21lc3NhZ2V9IENsaWNrIGFnYWluIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMgdG8gc3VibWl0IGFueXdheS5gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWhlbHBlci13YXJuaW5nJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXhlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0b0ZpeEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUGVyZm9ybSBhdXRvLWZpeCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0b0ZpeCBvZiBhdXRvRml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2FkZCcgJiYgIXRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5hZGRUYWcoYXV0b0ZpeC50YWcsIGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAncmVtb3ZlJyAmJiB0YWdzLmluY2x1ZGVzKGF1dG9GaXgudGFnKSkgdGhpcy50YWdTZWxlY3QucmVtb3ZlVGFnQnlEYXRhKGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnY2hhbmdlLXRhcmdldCcpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShhdXRvRml4LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0uc3R5bGUudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoIDJweCBibGFjayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcub28tdWktbGFiZWxFbGVtZW50LWxhYmVsJykhLmFwcGVuZChhdXRvRml4QnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZCh3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQgYW55d2F5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEVkaXQvY3JlYXRlIHJlZGlyZWN0ICovXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbChgJHt0aGlzLmV4aXN0cyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9IHJlZGlyZWN0Li4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LmdldFZhbHVlKCkgfHwgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyKSArIHRoaXMuc2NyaXB0QWR2ZXJ0O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZSwgb3V0cHV0LCBzdW1tYXJ5KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgICAgIG13Lm5vdGlmeShgUmVkaXJlY3QgJHt0aGlzLmV4aXN0cyA/ICdlZGl0ZWQnIDogJ2NyZWF0ZWQnfSBzdWNjZXNzZnVsbHkhYCwgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG5cbiAgICAgICAgICAgIC8qIFN5bmMgdGFsayBwYWdlIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdFZGl0aW5nIHRhbGsgcGFnZS4uLicpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKCdSIGZyb20gbW92ZScpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICBmcm9tTW92ZSA/IFsnUiBmcm9tIG1vdmUnXSA6IFtdLFxuICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhbGtSZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgJ1N5bmNpbmcgcmVkaXJlY3QgZnJvbSBtYWluIHBhZ2UnICsgdGhpcy5zY3JpcHRBZHZlcnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhbGtSZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnVGFsayBwYWdlIHN5bmNlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFBhdHJvbCBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgICAgICBpZiAodGhpcy5wYXRyb2xDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1BhdHJvbGxpbmcgcmVkaXJlY3QuLi4nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbExpbms6IEhUTUxBbmNob3JFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rIGEnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrUmV2aWV3ZWRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxCdXR0b25FbGVtZW50PignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhdHJvbExpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzdWx0ID0gYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0V2l0aFRva2VuKCdwYXRyb2wnLCB7IGFjdGlvbjogJ3BhdHJvbCcsIHJjaWQ6IG5ldyBVUkwocGF0cm9sTGluay5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdyY2lkJykhIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIHBhdHJvbGxpbmcgJHt0aGlzLnBhZ2VUaXRsZX0gdmlhIEFQSTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3VsdCkgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFya1Jldmlld2VkQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtSZXZpZXdlZEJ1dHRvbi5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIG13Lm5vdGlmeSgnUGFnZSBjdXJhdGlvbiB0b29sYmFyIG5vdCBmb3VuZCwgcmVkaXJlY3QgY2Fubm90IGJlIHBhdHJvbGxlZCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDb21wbGV0ZSwgcmVsb2FkaW5nLi4uJyk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbXcudXRpbC5nZXRVcmwodGhpcy5wYWdlVGl0bGUsIHsgcmVkaXJlY3Q6ICdubycgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBUYWtlcyBwcm92aWRlZCB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBwYWdlIG91dHB1dC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgICAgICAgICB0YWdzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHN0cmF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IHN0cmluZ1tdLFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFRpdGxlID0gcGFyc2VkVGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBgJHtwYXJzZWRUYXJnZXQuZ2V0TmFtZXNwYWNlSWQoKSA9PT0gMTQgPyAnOicgOiAnJ30ke3BhcnNlZFRhcmdldC5nZXRQcmVmaXhlZFRleHQoKX0ke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpID8gYCMke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpfWAgOiAnJ31gXG4gICAgICAgICAgICAgICAgOiB0YXJnZXQudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWRcbiAgICAgICAgICAgICAgICAgICAgLmdldE1haW5UZXh0KClcbiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKSA9PT1cbiAgICAgICAgICAgICAgICBkZWZhdWx0U29ydFxuICAgICAgICAgICAgICAgICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0ID0gdW5kZWZpbmVkOyAvLyBDaGVjayBpZiB0aXRsZXMgbm9ybWFsaXplIHRvIHRoZSBzYW1lIHRleHQsIGFuZCByZW1vdmVzIHRoZSBERUZBVUxUU09SVCBpZiBzb1xuXG4gICAgICAgICAgICBjb25zdCB0YWdzV2l0aEFyZ3VtZW50cyA9IHRhZ3MubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXggPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnMuZmluZExhc3RJbmRleChcbiAgICAgICAgICAgICAgICAgICAgKHBhcmFtZXRlciwgaW5kZXgpID0+IHBhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpICYmIHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBgI1JFRElSRUNUIFtbJHtmb3JtYXR0ZWRUaXRsZX1dXVxcbmAsIC8vXG4gICAgICAgICAgICAgICAgdGFncy5sZW5ndGggPiAwID8gYHt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fVxcbmAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmF5VGV4dCA/IHN0cmF5VGV4dCArICdcXG4nIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0U29ydCA/IGB7e0RFRkFVTFRTT1JUOiR7ZGVmYXVsdFNvcnQudHJpbSgpfX19YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5sZW5ndGggPiAwID8gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBgW1tDYXRlZ29yeToke2NhdGVnb3J5fV1dYCkuam9pbignXFxuJykgOiBudWxsLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdG8gZmV0Y2guXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRWRpdHMgb3IgY3JlYXRlcyBhIHBhZ2Ugd2l0aCBnaXZlbiB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHBhZ2UgdGl0bGUuXG4gICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnkgfSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ25vY3JlYXRlLW1pc3NpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5IH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBlZGl0aW5nIG9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXcgUmVkaXJlY3RIZWxwZXIoKS5ydW4oKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O21CQTJDQSxJQUFNQSxFQUFlLENBQ2pCLGlCQUNBLGVBQ0Esa0JBQ0Esa0JBQ0EsK0JBQ0EsbUNBQ0osRUFFQSxHQUFHLE9BQU8sTUFBTUEsRUFBYyxJQUFNLENBTWhDLE1BQU1DLFVBQWtDLEdBQUcsR0FBRyxlQUFnQixDQUVsRCxJQUFNLElBQUksR0FBRyxJQUdiLGdCQUVSLFlBQVlDLEVBQTZCQyxFQUEyQixDQUNoRSxNQUFNRCxDQUFNLEVBQ1osR0FBRyxHQUFHLE1BQU0sY0FBYyxLQUFLLEtBQThDQSxDQUFNLEVBRW5GLEtBQUssZ0JBQWtCQyxDQUMzQixDQUVBLGlCQUFtQixJQUFNLENBQ3JCLElBQU1DLEVBQVEsS0FBSyxTQUFTLEVBQ3RCQyxFQUFXLEVBQUUsU0FBUyxFQUU1QixHQUFJLENBQUNELEVBQU9DLEVBQVMsUUFBUSxDQUFDLENBQUMsVUFDdEJELEVBQU0sU0FBUyxHQUFHLEVBQUcsQ0FDMUIsSUFBTUUsRUFBUUYsRUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBRWhDLEtBQUssSUFDQSxJQUFJLENBQUUsT0FBUSxRQUFTLEtBQU1FLEVBQU8sS0FBTSxXQUFZLFVBQVcsRUFBSyxDQUEwQixFQUNoRyxNQUFNLElBQU0sSUFBSSxFQUNoQixLQUFNQyxHQUFtQyxDQUN0QyxHQUFJQSxFQUFRLENBQ1IsSUFBTUMsRUFBa0JELEVBQU8sTUFBTSxTQUFTLE9BQVFFLEdBQ2xEQSxFQUFRLEtBQ0gsWUFBWSxFQUNaLFdBQVcsVUFBVyxFQUFFLEVBQ3hCLFdBQVdMLEVBQU0sTUFBTSxH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SSxFQUFJLElBQ2xHLEVBQ0ssT0FBTyxPQUFPLEVBQ2QsS0FBSztBQUFBLENBQUksQ0FDbEIsQ0FNQSxNQUFjLGVBQWVYLEVBQWUsQ0FDeEMsT0FDSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQ2hCLE9BQVEsUUFDUixjQUFlLElBQ2YsS0FBTSxZQUNOLE9BQVEsVUFDUixRQUFTLE9BQ1QsT0FBUUEsQ0FDWixDQUFtQyxHQUNyQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FDMUQsQ0FRQSxNQUFjLGFBQWFBLEVBQWVpSSxFQUFjL0UsRUFBaUIsQ0FDckUsT0FBTyxNQUFNLEtBQUssSUFDYixLQUFLbEQsRUFBTyxLQUFPLENBQUUsS0FBQWlJLEVBQU0sUUFBQS9FLENBQVEsRUFBRSxFQUNyQyxNQUFNLENBQUM2QyxFQUFtQndCLElBQ25CeEIsSUFBYyxtQkFDUCxLQUFLLElBQUksT0FBTy9GLEVBQU8sQ0FBRSxRQUFBa0QsQ0FBUSxFQUFHK0UsQ0FBSSxFQUFFLE1BQU0sQ0FBQ2xDLEVBQW1Cd0IsSUFBa0MsQ0FDekcsR0FBRyxPQUFPLGtCQUFrQnZILENBQUssS0FBS3VILEdBQVcsTUFBTSxNQUFRLGVBQWUsS0FBS3hCLENBQVMsSUFBSyxDQUM3RixLQUFNLE9BQ1YsQ0FBQyxDQUNMLENBQUMsR0FFRCxHQUFHLE9BQU8sNkJBQTZCL0YsQ0FBSyxLQUFLdUgsR0FBVyxNQUFNLE1BQVEsZUFBZSxLQUFLeEIsQ0FBUyxJQUFLLENBQ3hHLEtBQU0sT0FDVixDQUFDLEVBQ00sS0FFZCxDQUNULENBQ0osQ0FFQSxJQUFJeEUsRUFBZSxFQUFFLElBQUksQ0FDN0IsQ0FBQyIsCiAgIm5hbWVzIjogWyJkZXBlbmRlbmNpZXMiLCAiUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInRpdGxlIiwgInJlc3VsdCIsICJtYXRjaGVkU2VjdGlvbnMiLCAic2VjdGlvbiIsICJwYXJzZWRUaXRsZSIsICJwYWdlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJwYWdlcyIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAiVGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgInRhZ3NDb250ZW50IiwgImNhdGVnb3JpZXNDb250ZW50IiwgInBhbmVsTGF5b3V0IiwgImFjdGlvbiIsICJTaG93Q2hhbmdlc0RpYWxvZyIsICJvbGRUZXh0IiwgIm5ld1RleHQiLCAiY29tcGFyaXNvbiIsICJub0NoYW5nZXNFbGVtZW50IiwgIlJlZGlyZWN0SGVscGVyIiwgInBhZ2VJbmZvIiwgImRpYWxvZ0luZm8iLCAiYnV0dG9uIiwgIlJlZGlyZWN0SGVscGVyRGlhbG9nIiwgInBvcnRsZXRMaW5rIiwgImV2ZW50IiwgInJlZGlyZWN0VGVtcGxhdGVzIiwgImNvbnRlbnRUZXh0IiwgInBhZ2VUaXRsZSIsICJleGlzdHMiLCAibWFpblBhZ2VDb250ZW50IiwgInRhcmdldCIsICJ0YWdPclJlZGlyZWN0IiwgInRhZyIsICJyZWRpcmVjdCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgInN1bW1hcnlFbGVtZW50IiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJuYW1lIiwgImdlbmVyYXRpb25hbFN1ZmZpeCIsICJsYXN0TmFtZSIsICJvdGhlck5hbWVzIiwgIm5ld05hbWUiLCAibGVhZGluZ0FydGljbGUiLCAid2luZG93TWFuYWdlciIsICJ0ZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAic2hvd0NoYW5nZXNEaWFsb2ciLCAicGFnZVRyaWFnZU1hcmtCdXR0b24iLCAicGF0cm9sUmVzcG9uc2UiLCAicmVkaXJlY3RWYWx1ZSIsICJvbGRUYXJnZXQiLCAidGFyZ2V0Q2hhbmdlZCIsICJ0YWdzQ2hhbmdlZCIsICJ0YWdBcmd1bWVudHNDaGFuZ2VkIiwgInRhZ3NXaXRoUGFyYW1ldGVycyIsICJvbGRUYWdEYXRhIiwgImZvdW5kVGFnRWRpdG9yRGF0YSIsICJ0ZW1wbGF0ZSIsICJwYXJhbWV0ZXIiLCAib2xkQXJndW1lbnQiLCAiYXJndW1lbnQiLCAibmV3QXJndW1lbnQiLCAiZGVmYXVsdFNvcnRDaGFuZ2VkIiwgImNhdGVnb3JpZXNDaGFuZ2VkIiwgImNoYW5nZXMiLCAidGFnRGF0YSIsICJvcmlnaW5hbFJlZGlyZWN0VGFncyIsICJtYXRjaCIsICJuZXdUYWciLCAiZm9ybWF0dGVkQXJndW1lbnRzIiwgImluZGV4IiwgImZvdW5kVGVtcGxhdGVFZGl0b3IiLCAiZm91bmRQYXJhbWV0ZXJFZGl0b3IiLCAiZXJyb3JzIiwgImRlc3RpbmF0aW9uIiwgInRhZ3MiLCAiZGVzdGluYXRpb25EYXRhIiwgImVycm9yQ29kZSIsICJkZXN0aW5hdGlvblBhcnNlUmVzdWx0IiwgImRlc3RpbmF0aW9uUmVkaXJlY3QiLCAiZGVzdGluYXRpb25Db250ZW50IiwgImFuY2hvciIsICJwYXJ0IiwgInRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhcmdldElzU3VybmFtZUxpc3QiLCAidG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzIiwgInRvU3VybmFtZUxpc3RUYWdzIiwgInRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCIsICJmb3VuZFBhcmFtZXRlciIsICJlbGVtZW50c1RvRGlzYWJsZSIsICJlbGVtZW50IiwgIm1lc3NhZ2UiLCAiYXV0b0ZpeGVzIiwgIndhcm5pbmdNZXNzYWdlIiwgImF1dG9GaXhCdXR0b24iLCAiYXV0b0ZpeCIsICJvdXRwdXQiLCAiZnJvbU1vdmUiLCAicGF0cm9sTGluayIsICJtYXJrUmV2aWV3ZWRCdXR0b24iLCAiZXJyb3JJbmZvIiwgInN0cmF5VGV4dCIsICJkZWZhdWx0U29ydCIsICJjYXRlZ29yaWVzIiwgInBhcnNlZFRhcmdldCIsICJmb3JtYXR0ZWRUaXRsZSIsICJ0YWdzV2l0aEFyZ3VtZW50cyIsICJmb3VuZEFyZ3VtZW50RWRpdG9yIiwgImxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCIsICJtYXBwZWRBcmd1bWVudHMiLCAidGV4dCJdCn0K