User:Eejit43/scripts/redirect-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/redirect-helper. |
// <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";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"],()=>{class O extends OO.ui.TextInputWidget{constructor(t,e){super(t);this.api=new mw.Api;this.getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();if(!t)e.resolve([]);else if(t.includes("#")){const a=t.split("#")[0];this.api.get({action:"parse",page:a,prop:"sections",redirects:!0}).catch(()=>null).then(n=>{if(n){const s=n.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));e.resolve(s.map(r=>({data:`${n.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${n.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`})))}else e.resolve([])})}else{const a=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:a?.getNamespaceId()??0,gapprefix:a?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(n=>{n?e.resolve(n.query?.pages?n.query.pages.filter(s=>s.title!==this.pageTitleParsed.toString()).map(s=>({data:s.title,label:new OO.ui.HtmlSnippet(`${s.title}${s.pageprops&&"disambiguation"in s.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in s?" <i>(redirect)</i>":""}`)})):[]):e.resolve([])})}return e.promise({abort(){}})};this.getLookupCacheDataFromResponse=t=>t??[];this.getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}));OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=e}}Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype);class P extends OO.ui.TextInputWidget{constructor(t){super(t);this.api=new mw.Api;this.getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const a=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:a?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(n=>{if(n?.query?.pages){const s=n.query.pages.filter(r=>!r.categories?.some(o=>o.title==="Category:Wikipedia soft redirected categories")).map(r=>{const o=r.title.split(":")[1];return{data:o,label:o}});this.emit("showing-values",s),e.resolve(s)}else e.resolve([])}),e.promise({abort(){}})};this.getLookupCacheDataFromResponse=t=>t??[];this.getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}));OO.ui.mixin.LookupElement.call(this,t)}}Object.assign(P.prototype,OO.ui.mixin.LookupElement.prototype);class d extends OO.ui.ProcessDialog{constructor(t,e){super(t);this.api=new mw.Api;this.getSetupProcess=()=>d.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=>{const e=t.parse.text,a=t.parse.categorieshtml,n=new OO.ui.PanelLayout({padded:!0,expanded:!1});n.$element.append(e,a),this.$body.append(n.$element)}));this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):d.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>d.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});this.pageTitleParsed=e,d.static.name="TemplatePreviewDialog",d.static.title="Redirect categorization templates preview",d.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(d.prototype,OO.ui.ProcessDialog.prototype);class m extends OO.ui.ProcessDialog{constructor(t){super(t);this.api=new mw.Api;this.getSetupProcess=()=>m.super.prototype.getSetupProcess.call(this).next(()=>{const[t,e]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":e,"tocontentmodel-main":"wikitext"}).then(a=>{const n=a.compare.body,s=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),r=new OO.ui.PanelLayout({padded:!0,expanded:!1});r.$element.append(n?`
<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>
${n}
</tbody>
</table>`:s.$element[0]),this.$body.append(r.$element)})});this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):m.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>m.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});m.static.name="ShowChangesDialog",m.static.title="Changes to be made",m.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(m.prototype,OO.ui.ProcessDialog.prototype);class x{constructor(){this.api=new mw.Api}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(){const i=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),t={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(i.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}`);const 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(t,!1).load()}),this.contentText.prepend(e.$element[0])}else if(i.query.pages[0].redirect)new b(t,!0).load();else{const 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(t,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),e.remove()})}}}class b{constructor({redirectTemplates:i,contentText:t,pageTitle:e,pageTitleParsed:a},n){this.api=new mw.Api;this.redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;this.scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";this.needsCheck=!0;this.templateEditorsInfo=[];this.pageContent="";this.redirectTemplates=i,this.contentText=t,this.pageTitle=e,this.pageTitleParsed=a,this.exists=n}async load(){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}
#redirect-helper-box {
background-color: whitesmoke;
width: 700px;
max-width: calc(100% - 50px);
margin-left: auto;
margin-right: auto;
margin-bottom: 25px !important;
}
.redirect-input-layout label {
font-weight: bold;
}
.redirect-helper-template-parameters-container, .redirect-helper-template-parameters-container details {
background-color: #e2e2e2;
border-radius: 5px;
margin-block: 10px;
padding: 5px;
}
.redirect-helper-template-parameters-container summary {
cursor: pointer;
font-weight: bold;
}
.redirect-helper-template-parameters-container details {
background-color: #d1cece;
margin-block: 5px;
}
.redirect-helper-template-parameters-contained #redirect-helper-no-templates-message {
padding: 5px;
}
#redirect-helper-summary-layout {
padding-top: 10px;
margin-top: 15px;
border-top: 1px solid gray;
}
#redirect-helper-submit-layout {
margin-top: 10px;
}
#redirect-helper-submit-layout > * {
margin-bottom: 0;
}
.redirect-helper-warning {
margin-top: 8px;
}`),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(){const i=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",()=>{const t=this.redirectRegex.exec(i)?.[1];if(!t)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(t)?.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(i))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new O({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.keys(this.redirectTemplates).map(e=>({data:e,label:e}))}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{const e=this.tagSelect.getValue().sort((n,s)=>n.toLowerCase().localeCompare(s.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(const n of this.templateEditorsInfo)n.details.style.display="none";let a=0;for(const n of this.tagSelect.getValue()){const s=this.templateEditorsInfo.find(r=>r.name===n);s&&(s.details.style.display="block",a++)}t.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");const i=document.createElement("summary");i.textContent="Template parameters",this.templateParametersEditor.append(i);for(const[e,a]of Object.entries(this.redirectTemplates)){const n=Object.entries(a.parameters);if(n.length===0)continue;const s=document.createElement("details");s.style.display="none";const r=document.createElement("summary");r.textContent=e,s.append(r);const o={name:e,details:s,parameters:[]};for(const[u,c]of n){const p=new OO.ui.TextInputWidget({placeholder:c.default?.toString(),required:c.required});p.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});const l=new OO.ui.FieldLayout(p,{label:new OO.ui.HtmlSnippet(`${u}${!c.label||u.toLowerCase()===c.label?.toLowerCase()?"":` (${c.label})`}${c.description?` (${c.description})`:""} (type: ${c.type}) ${c.suggested?" (suggested)":""}${c.example?` (example: "${c.example}")`:""}`),align:"inline"});s.append(l.$element[0]),o.parameters.push({name:u,aliases:c.aliases,editor:p})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(o)}const t=document.createElement("div");t.id="redirect-helper-no-templates-message",t.textContent="No templates with parameters to display!",t.style.display=this.exists?"none":"block",this.templateParametersEditor.append(t),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{const 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 person","R from birth name"].some(a=>this.tagSelect.getValue().includes(a))){if(!e.includes(" "))return;let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;const n=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(n+", "+s+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(const n of["An","A","The"])if(a.startsWith(n+" ")){a=a.slice(n.length+1)+", "+n;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 P({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(const 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",()=>{const e=this.categorySelect.getValue().sort((a,n)=>a.toLowerCase().localeCompare(n.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(){const i=new OO.ui.WindowManager;document.body.append(i.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());const t=new d({size:"large"},this.pageTitleParsed);i.addWindows([t]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{t.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),t.open()});const e=new m({size:"large"});i.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(){const i=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(i?.click(),i?.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 this.api.get({action:"query",meta:"userinfo",uiprop:"rights"})).query.userinfo.rights.includes("patrol"))return!1;const 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(){const i=this.redirectInput.getValue().trim();if(!i)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){const t=i!==this.oldRedirectTarget?.replaceAll("_"," "),e=this.tagSelect.getValue().some(o=>!this.oldRedirectTags.includes(o))||this.oldRedirectTags.some(o=>!this.tagSelect.getValue().includes(o)),a=this.oldRedirectTagData?this.tagSelect.getValue().some(o=>this.templateEditorsInfo.find(u=>u.name===o)?.parameters.some(u=>{const c=this.oldRedirectTagData[o]?.find(p=>p[0]===u.name)?.[1];return c?c!==u.editor.getValue().trim():!1})):!1,n=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),s=this.categorySelect.getValue().some(o=>!this.oldCategories.includes(o))||this.oldCategories.some(o=>!this.categorySelect.getValue().includes(o)),r=[];t&&r.push(`retarget to [[${i}]]`),e&&r.push("change categorization templates"),a&&r.push("change categorization template arguments"),n&&r.push("change default sort key"),s&&r.push("change categories"),r.length===0&&r.push("perform redirect cleanup"),r[0]=r[0][0].toUpperCase()+r[0].slice(1),r.length>1&&(r[r.length-1]=`and ${r.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=r.join(r.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${i}]]`}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(([t,e])=>[t,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?t:null).filter(Boolean).sort((t,e)=>t.toLowerCase().localeCompare(e.toLowerCase()));const i=Object.entries(this.redirectTemplates).flatMap(([t,e])=>[t,...e.aliases]).map(t=>new RegExp(`{{\\s*[${t[0].toLowerCase()}${t[0]}]${t.slice(1)}\\s*(\\||}})`).test(this.pageContent)?t:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(i.map(t=>{const e=new RegExp(`{{\\s*[${t[0].toLowerCase()}${t[0]}]${t.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([r,o])=>[r,...o.aliases].includes(t))?.[0];if(!e?.[1])return null;const s=e[1].split("|").map((r,o)=>{if(!r.includes("="))return[(o+1).toString(),r.trim()];const[u,c]=r.split("=");return[u.trim(),c.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(t=>t.slice(11,-2))??[],this.oldStrayText=[this.pageContent.match(/{{short description\|.*?}}/i)?.[0],this.pageContent.match(/{{DISPLAYTITLE:.*?}}/)?.[0],this.pageContent.match(/{{italic title\|?.*?}}/i)?.[0],this.pageContent.match(/{{title language\|.*?}}/)?.[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(const[t,e]of Object.entries(this.oldRedirectTagData)){const a=this.templateEditorsInfo.find(n=>n.name===t);if(a)for(const[n,s]of e){const r=a.parameters.find(o=>[o.name,...o.aliases].includes(n));r&&r.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(const t of this.oldCategories)this.categorySelect.addAllowedValue(t);this.categorySelect.setValue(this.oldCategories.map(t=>({data:t,label:t}))),this.updateSummary()}async validateSubmission(){const i=[],t=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(t)||i.push({title:t,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(t)}catch{i.length===0&&i.push({title:t,message:"is not a valid page title!"})}!this.parsedDestination&&i.length===0&&i.push({title:t,message:"is not a valid page title!"}),this.parsedDestination?.toString()===this.pageTitleParsed.toString()&&i.push({message:"cannot redirect to itself!"});const a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:t}).catch(l=>(l==="missingtitle"?i.push({title:t,message:"does not exist!"}):i.push({title:t,message:`was not able to be fetched from the API (${l})!`}),null)),n=await this.api.get({action:"parse",page:t,prop:"sections",redirects:!0});if(n.parse.redirects?.[0]){const l=n.parse.redirects[0].to+(n.parse.redirects[0].tofragment?`#${n.parse.redirects[0].tofragment}`:"");i.push({title:t,message:`is a redirect to <a href="${mw.util.getUrl(l)}" target="_blank">${l}</a>. Retarget to that page instead, as double redirects aren't allowed.`})}if(t.split("#").length>1)if(n.parse.sections.find(g=>g.line.replaceAll(/<\/?i>/g,"")===t.split("#")[1]))e.includes("R to anchor")&&i.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!"}),e.includes("R to section")||i.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!"});else{const g=(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;[...g.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(f=>f.split("|").map(h=>h.trim()))?.flat()??[],...g.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(f=>f.split("|").map(h=>h.trim()).filter(h=>!/^text\s*?=/.test(h)))?.flat()??[],...g.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(f=>f.trim())??[]].includes(t.split("#")[1])?(e.includes("R to section")&&i.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!"}),e.includes("R to anchor")||i.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!"})):i.push({message:`is a redirect to <a href="${mw.util.getUrl(t)}" target="_blank">${t}</a>, but that section or anchor does not exist!`})}t.split("#").length===1&&(e.includes("R to section")||e.includes("R to anchor"))&&i.push({message:"is not a redirect to a section/anchor, but it is tagged with <code>{{R from section}}</code> or <code>{{R from anchor}}</code>!"});const s=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),r=!!a.query.pages[0].categories?.some(l=>l.title==="Category:Surnames"),o=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],c=o.some(l=>e.includes(l)),p=u.some(l=>e.includes(l));s&&!c&&!p&&i.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&&(c&&i.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!"}),r&&!p&&i.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)")&&i.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!'});for(const l of["R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(l)&&i.push({message:`is tagged with unnecessarily tagged with <code>{{${l}}}</code> which will be duplicated by the redirect category shell!`});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&i.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!"}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&i.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!"});for(const l of e){const g=this.redirectTemplates[l];if(g)for(const[y,f]of Object.entries(g.parameters)){const h=this.templateEditorsInfo.find(w=>w.name===l)?.parameters.find(w=>[w.name,...w.aliases].includes(y));h&&f.required&&!h.editor.getValue().trim()&&i.push({message:`is tagged with <code>{{${l}}}</code> but it is missing the required parameter <code>${y}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&i.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),i}async handleSubmitButtonClick(){const i=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(s=>s.parameters.map(r=>r.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(const s of i)s.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let t=[];if(this.needsCheck?t=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),t.length>0){for(const s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(const{title:s,message:r}of t){const o=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${r} Click again without making changes to submit anyway.`),u=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:o});this.editorBox.$element[0].append(u.$element[0])}for(const s of i)s.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);const 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...");const s=this.tagSelect.getValue().includes("R from move"),r=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),r,"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...");const s=document.querySelector(".patrollink a"),r=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,c)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${c?.error.info??"Unknown error"} (${u})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):r?(r.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(i,t,e,a,n){const s=mw.Title.newFromText(i),r=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:i.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);const o=t.map(u=>{const c=this.templateEditorsInfo.find(l=>l.name===u);if(!c)return`{{${u}}}`;const p=c.parameters.map((l,g)=>{const y=l.editor.getValue().trim();return y?`|${l.name===(g+1).toString()?"":`${l.name}=`}${y}`:null}).filter(Boolean).join("");return`{{${u}${p}}}`});return[`#REDIRECT [[${r}]]
`,t.length>0?`{{Redirect category shell|
${o.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,n.length>0?n.map(u=>`[[Category:${u}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(i){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:i})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(i,t,e){return await this.api.edit(i,()=>({text:t,summary:e})).catch((a,n)=>a==="nocreate-missing"?this.api.create(i,{summary:e},t).catch((s,r)=>{mw.notify(`Error creating ${i}: ${r?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${i}: ${n?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}}new x().run()});
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gICAgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zLFxuICAgIEFwaVBhcnNlUGFyYW1zLFxuICAgIEFwaVF1ZXJ5SW5mb1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcyxcbiAgICBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyxcbiAgICBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHtcbiAgICBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJldmVudC1hYmJyZXZpYXRpb25zXG4gICAgQ2F0ZWdvcmllc1Jlc3VsdCxcbiAgICBNZWRpYVdpa2lEYXRhRXJyb3IsXG4gICAgUGFnZUluZm9SZXN1bHQsXG4gICAgUGFnZVBhcnNlUmVzdWx0LFxuICAgIFBhZ2VSZXZpc2lvbnNSZXN1bHQsXG4gICAgUGFnZVRyaWFnZUxpc3RSZXNwb25zZSxcbiAgICBQYWdlcHJvcHNSZXN1bHQsXG4gICAgVXNlclBlcm1pc3Npb25zUmVzcG9uc2UsXG59IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxudHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcGFyYW1ldGVyczogUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM7IGFsaWFzZXM6IHN0cmluZ1tdIH0+O1xuXG5pbnRlcmZhY2UgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwYXJhbWV0ZXJzOiB7IG5hbWU6IHN0cmluZzsgYWxpYXNlczogc3RyaW5nW107IGVkaXRvcjogT08udWkuVGV4dElucHV0V2lkZ2V0IH1bXTtcbn1cblxuaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbm13LmxvYWRlci51c2luZyhbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJywgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLCAnb29qcy11aS5zdHlsZXMuaWNvbnMtZWRpdGluZy1jb3JlJ10sICgpID0+IHtcbiAgICAvLyBTZXR1cCBSZWRpcmVjdElucHV0V2lkZ2V0XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgdGl0bGUgbG9va3VwIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJyMnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdmFsdWUuc3BsaXQoJyMnKVswXTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoeyBhY3Rpb246ICdwYXJzZScsIHBhZ2U6IHRpdGxlLCBwcm9wOiAnc2VjdGlvbnMnLCByZWRpcmVjdHM6IHRydWUgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiBQYWdlUGFyc2VSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFNlY3Rpb25zID0gcmVzdWx0LnBhcnNlLnNlY3Rpb25zLmZpbHRlcigoc2VjdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCh2YWx1ZS5zcGxpdCgnIycpWzFdLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtyZXN1bHQucGFyc2UudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogcGFyc2VkVGl0bGU/LmdldE5hbWVzcGFjZUlkKCkgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ2luZm8nLCAncGFnZXByb3BzJ10sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IHBhZ2Vwcm9wczogeyBkaXNhbWJpZ3VhdGlvbj86IHN0cmluZyB9OyByZWRpcmVjdD86IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnk/LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5xdWVyeS5wYWdlcyAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gcGFnZS50aXRsZSAhPT0gdGhpcy5wYWdlVGl0bGVQYXJzZWQudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGFnZS50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYWdlLnRpdGxlfSR7cGFnZS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBwYWdlLnBhZ2Vwcm9wcyA/ICcgPGk+KGRpc2FtYmlndWF0aW9uKTwvaT4nIDogJyd9JHsncmVkaXJlY3QnIGluIHBhZ2UgPyAnIDxpPihyZWRpcmVjdCk8L2k+JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFJlZGlyZWN0SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICAvLyBTZXR1cCBDYXRlZ29yeUlucHV0V2lkZ2V0XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgY2F0ZWdvcnkgbG9va3VwIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBjYXRlZ29yaWVzPzogeyB0aXRsZTogc3RyaW5nIH1bXSB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuY2F0ZWdvcmllcz8uc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICAvLyBTZXR1cCBUZW1wbGF0ZVByZXZpZXdEaWFsb2dcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3IgcHJldmlld2luZyB0ZW1wbGF0ZXMuXG4gICAgICovXG4gICAgY2xhc3MgVGVtcGxhdGVQcmV2aWV3RGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9PLnVpLlByb2Nlc3NEaWFsb2cuQ29uZmlnT3B0aW9ucywgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgICAgIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdGF0aWMubmFtZSA9ICdUZW1wbGF0ZVByZXZpZXdEaWFsb2cnO1xuICAgICAgICAgICAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN0YXRpYy50aXRsZSA9ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXMgcHJldmlldyc7XG4gICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhcnNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRtb2RlbDogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IFsndGV4dCcsICdjYXRlZ29yaWVzaHRtbCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkRGIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IHRleHQ6IHN0cmluZyB9IH0pLnBhcnNlLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyBjYXRlZ29yaWVzaHRtbDogc3RyaW5nIH0gfSkucGFyc2UuY2F0ZWdvcmllc2h0bWw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQodGFnc0NvbnRlbnQsIGNhdGVnb3JpZXNDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHBhbmVsTGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICAgICAgPyBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihUZW1wbGF0ZVByZXZpZXdEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICAvLyBTZXR1cCBUZW1wbGF0ZVByZXZpZXdEaWFsb2dcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3Igc2hvd2luZyBjaGFuZ2VzIHRvIGJlIG1hZGUuXG4gICAgICovXG4gICAgY2xhc3MgU2hvd0NoYW5nZXNEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgICAgIFNob3dDaGFuZ2VzRGlhbG9nLnN0YXRpYy5uYW1lID0gJ1Nob3dDaGFuZ2VzRGlhbG9nJztcbiAgICAgICAgICAgIFNob3dDaGFuZ2VzRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdDaGFuZ2VzIHRvIGJlIG1hZGUnO1xuICAgICAgICAgICAgU2hvd0NoYW5nZXNEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFNob3dDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbb2xkVGV4dCwgbmV3VGV4dF0gPSB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb21wYXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IFsnZGlmZiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbXNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbXRleHQtbWFpbic6IG9sZFRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvc2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b3RleHQtbWFpbic6IG5ld1RleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAndG9jb250ZW50bW9kZWwtbWFpbic6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaUNvbXBhcmVQYWdlc1BhcmFtcyAmIHsgJ2Zyb210ZXh0LW1haW4nOiBzdHJpbmc7ICdmcm9tY29udGVudG1vZGVsLW1haW4nOiBzdHJpbmc7ICd0b3RleHQtbWFpbic6IHN0cmluZzsgJ3RvY29udGVudG1vZGVsLW1haW4nOiBzdHJpbmcgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGFyaXNvbiA9IChyZXN1bHQgYXMgeyBjb21wYXJlOiB7IGJvZHk6IHN0cmluZyB9IH0pLmNvbXBhcmUuYm9keTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9DaGFuZ2VzRWxlbWVudCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ3dhcm5pbmcnLCBsYWJlbDogJ05vIGNoYW5nZXMgdG8gbWFrZSEnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG48dGFibGUgY2xhc3M9XCJkaWZmIGRpZmYtZWRpdGZvbnQtbW9ub3NwYWNlXCI+XG4gICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgIDwvY29sZ3JvdXA+XG4gICAgPHRib2R5PlxuICAgICAgICAke2NvbXBhcmlzb259XG4gICAgPC90Ym9keT5cbjwvdGFibGU+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5vQ2hhbmdlc0VsZW1lbnQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb25cbiAgICAgICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBTaG93Q2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFNob3dDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihTaG93Q2hhbmdlc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZW50aXJlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RIZWxwZXIge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIHByaXZhdGUgY29udGVudFRleHQhOiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGUhOiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkITogbXcuVGl0bGU7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIHJlZGlyZWN0IGhlbHBlci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXNzZXNQcmVDaGVja3MoKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gYXdhaXQgdGhpcy5mZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXctY29udGVudC10ZXh0JykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFRleHQpIHJldHVybiBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogRmFpbGVkIHRvIGZpbmQgY29udGVudCB0ZXh0IGVsZW1lbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnBhZ2VUaXRsZSkhO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2VUaXRsZVBhcnNlZCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gcGFyc2UgcGFnZSB0aXRsZSEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2hlY2tQYWdlQW5kTG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGUgcGFnZSBwYXNzZXMgcHJlIGNoZWNrcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgcGFzc2VzUHJlQ2hlY2tzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID49IDAsIC8vIElzIG5vdCB2aXJ0dWFsIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNQcm9iYWJseUVkaXRhYmxlJyksIC8vIFBhZ2UgaXMgZWRpdGFibGVcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0lzQXJ0aWNsZScpLCAvLyBWaWV3aW5nIHRoZSBjb250ZW50IG9mIGEgcGFnZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICd2aWV3JywgLy8gVmlld2luZyB0aGUgcGFnZSAobm90IGVkaXRpbmcpXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dSZXZpc2lvbklkJykgPT09IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpLCAvLyBWaWV3aW5nIHRoZSBjdXJyZW50IHJldmlzaW9uXG4gICAgICAgICAgICAgICAgIW13LmNvbmZpZy5nZXQoJ3dnRGlmZk9sZElkJyksIC8vIE5vdCB2aWV3aW5nIGEgZGlmZlxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbnMuZXZlcnkoQm9vbGVhbik7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgcmVkaXJlY3QgdGVtcGxhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlZGlyZWN0VGVtcGxhdGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICkucXVlcnkucGFnZXM/LlswXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScsXG4gICAgICAgICAgICApIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBhIHBhZ2UncyBzdGF0dXMgYW5kIGxvYWRzIHRoZSBoZWxwZXIgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgY2hlY2tQYWdlQW5kTG9hZCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VJbmZvID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7IGFjdGlvbjogJ3F1ZXJ5JywgZm9ybWF0dmVyc2lvbjogJzInLCBwcm9wOiAnaW5mbycsIHRpdGxlczogdGhpcy5wYWdlVGl0bGUgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ0luZm8gPSB7IHJlZGlyZWN0VGVtcGxhdGVzOiB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzLCBjb250ZW50VGV4dDogdGhpcy5jb250ZW50VGV4dCwgcGFnZVRpdGxlOiB0aGlzLnBhZ2VUaXRsZSwgcGFnZVRpdGxlUGFyc2VkOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZCB9O1xuXG4gICAgICAgICAgICBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbMF0ubWlzc2luZykge1xuICAgICAgICAgICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufWApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGlkOiAnY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbicsIGxhYmVsOiAnQ3JlYXRlIHJlZGlyZWN0JywgaWNvbjogJ2FydGljbGVSZWRpcmVjdCcsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgICAgICAgICAgYnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLiRlbGVtZW50WzBdLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgZmFsc2UpLmxvYWQoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZChidXR0b24uJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYWdlSW5mby5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCkgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIHRydWUpLmxvYWQoKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcnRsZXRMaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICdwLXRiJyA6ICdwLWNhY3Rpb25zJywgJyMnLCAnUmVkaXJlY3QgcGFnZScsICdyZWRpcmVjdC1oZWxwZXInKSE7XG4gICAgICAgICAgICAgICAgcG9ydGxldExpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgZmFsc2UpLmxvYWQoKTtcblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZGlhbG9nIHBvcnRpb24gb2YgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAgICAgKi9cbiAgICBjbGFzcyBSZWRpcmVjdEhlbHBlckRpYWxvZyB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuICAgICAgICBwcml2YXRlIHJlZGlyZWN0UmVnZXggPSAvXiNyZWRpcmVjdDo/XFxzKlxcW1xcW1xccyo6PyhbXltcXF17fH1dKz8pXFxzKig/OlxcfFteW1xcXXt8fV0rPyk/XV1cXHMqL2k7XG4gICAgICAgIHByaXZhdGUgc2NyaXB0QWR2ZXJ0ID0gJyAodmlhIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyfHJlZGlyZWN0LWhlbHBlcl1dKSc7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFRlbXBsYXRlczogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIHByaXZhdGUgY29udGVudFRleHQ6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICAgICAgcHJpdmF0ZSBleGlzdHM6IGJvb2xlYW47XG5cbiAgICAgICAgLy8gVXNlZCBkdXJpbmcgcnVuKClcbiAgICAgICAgcHJpdmF0ZSBuZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICBwcml2YXRlIGVkaXRvckJveCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHN5bmNXaXRoTWFpbkJ1dHRvbj86IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdElucHV0ITogUmVkaXJlY3RJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdElucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgdGFnU2VsZWN0ITogT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHRhZ1NlbGVjdExheW91dCE6IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciE6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZUVkaXRvcnNJbmZvOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gPSBbXTtcbiAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdCE6IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0SW5wdXQhOiBDYXRlZ29yeUlucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgZGVmYXVsdFNvcnRJbnB1dCE6IE9PLnVpLlRleHRJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBkZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgZGVmYXVsdFNvcnRJbnB1dExheW91dCE6IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHN1bW1hcnlJbnB1dCE6IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc3VtbWFyeUlucHV0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgc3VibWl0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHNob3dDaGFuZ2VzQnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHNob3dQcmV2aWV3QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHN5bmNUYWxrQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHN5bmNUYWxrQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHN1Ym1pdExheW91dCE6IE9PLnVpLkhvcml6b250YWxMYXlvdXQ7XG5cbiAgICAgICAgcHJpdmF0ZSB0YWxrRGF0YT86IFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgIHByaXZhdGUgcGFnZUNvbnRlbnQgPSAnJztcblxuICAgICAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFyZ2V0Pzogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFncz86IHN0cmluZ1tdO1xuICAgICAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFnRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdW10+O1xuICAgICAgICBwcml2YXRlIG9sZERlZmF1bHRTb3J0Pzogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIG9sZENhdGVnb3JpZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgcHJpdmF0ZSBvbGRTdHJheVRleHQ/OiBzdHJpbmc7XG5cbiAgICAgICAgcHJpdmF0ZSBwYXJzZWREZXN0aW5hdGlvbiE6IG13LlRpdGxlIHwgbnVsbDtcblxuICAgICAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgICAgIHsgcmVkaXJlY3RUZW1wbGF0ZXMsIGNvbnRlbnRUZXh0LCBwYWdlVGl0bGUsIHBhZ2VUaXRsZVBhcnNlZCB9OiB7IHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTsgY29udGVudFRleHQ6IEhUTUxEaXZFbGVtZW50OyBwYWdlVGl0bGU6IHN0cmluZzsgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSB9LFxuICAgICAgICAgICAgZXhpc3RzOiBib29sZWFuLFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSByZWRpcmVjdFRlbXBsYXRlcztcbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlID0gcGFnZVRpdGxlO1xuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgICAgIHRoaXMuZXhpc3RzID0gZXhpc3RzO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSByZWRpcmVjdC1oZWxwZXIgZGlhbG9nIGludG8gdGhlIHBhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsb2FkKCkge1xuICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuI2NyZWF0ZS1yZWRpcmVjdC1idXR0b24ge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItYm94IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlO1xuICAgIHdpZHRoOiA3MDBweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDUwcHgpO1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIG1hcmdpbi1yaWdodDogYXV0bztcbiAgICBtYXJnaW4tYm90dG9tOiAyNXB4ICFpbXBvcnRhbnQ7XG59XG5cbi5yZWRpcmVjdC1pbnB1dC1sYXlvdXQgbGFiZWwge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLCAucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIG1hcmdpbi1ibG9jazogMTBweDtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMWNlY2U7XG4gICAgbWFyZ2luLWJsb2NrOiA1cHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZWQgI3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSB7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1bW1hcnktbGF5b3V0IHtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBncmF5O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCA+ICoge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItd2FybmluZyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufWApO1xuXG4gICAgICAgICAgICBtdy5sb2FkZXIuYWRkTGlua1RhZygnaHR0cHM6Ly93d3cubWVkaWF3aWtpLm9yZy93L2xvYWQucGhwP21vZHVsZXM9bWVkaWF3aWtpLmRpZmYuc3R5bGVzJm9ubHk9c3R5bGVzJyk7XG5cbiAgICAgICAgICAgIC8qIExvYWQgZWxlbWVudHMgKi9cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgaWQ6ICdyZWRpcmVjdC1oZWxwZXItYm94JywgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UsIGZyYW1lZDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICAgICAgaWYgKG1haW5QYWdlRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCkgYXdhaXQgdGhpcy5sb2FkU3luY1dpdGhNYWluQnV0dG9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZElucHV0RWxlbWVudHMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN1Ym1pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgICAgIC8qIEFkZCBlbGVtZW50cyB0byBzY3JlZW4gYW5kIGxvYWQgZGF0YSAoaWYgYXBwbGljYWJsZSkgKi9cbiAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZChcbiAgICAgICAgICAgICAgICAuLi4oW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbj8uJGVsZW1lbnQ/LlswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIEhUTUxFbGVtZW50W10pLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLmxvYWRFeGlzdGluZ0RhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgXCJTeW5jIHdpdGggbWFpbiBwYWdlXCIgYnV0dG9uXCIgb24gdGFsayBwYWdlcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCkpO1xuXG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N5bmMgd2l0aCBtYWluIHBhZ2UnLCBpY29uOiAnbGluaycsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoTWFpbkJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWMobWFpblBhZ2VDb250ZW50KT8uWzFdO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbXcubm90aWZ5KCdGYWlsZWQgdG8gcGFyc2UgbWFpbiBwYWdlIGNvbnRlbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk/LmdldFRhbGtQYWdlKCk/LnRvU3RyaW5nKCkgPz8gJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Nb3ZlID0gWydSIGZyb20gbW92ZScsIC4uLnRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbJ1IgZnJvbSBtb3ZlJ10uYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QobWFpblBhZ2VDb250ZW50KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tTW92ZSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoWydSIGZyb20gbW92ZSddKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBpbnB1dCBlbGVtZW50cy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgbG9hZElucHV0RWxlbWVudHMoKSB7XG4gICAgICAgICAgICAvKiBSZWRpcmVjdCB0YXJnZXQgaW5wdXQgKi9cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dCA9IG5ldyBSZWRpcmVjdElucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdUYXJnZXQgcGFnZSBuYW1lJywgcmVxdWlyZWQ6IHRydWUgfSwgdGhpcy5wYWdlVGl0bGVQYXJzZWQpO1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucmVkaXJlY3RJbnB1dCwgeyBsYWJlbDogJ1JlZGlyZWN0IHRhcmdldDonLCBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLCBhbGlnbjogJ3RvcCcgfSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHNlbGVjdGlvbiAqL1xuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QgPSBuZXcgT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBPYmplY3Qua2V5cyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKHRhZykgPT4gKHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgICAgIGlmICgodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9ySW5mbyBvZiB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8pIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgbGV0IHNob3duVGVtcGxhdGVFZGl0b3JzID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckluZm8gPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93blRlbXBsYXRlRWRpdG9ycysrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMudGFnU2VsZWN0LCB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ3JlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gJ1RlbXBsYXRlIHBhcmFtZXRlcnMnO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgICAgIHN1bW1hcnkudGV4dENvbnRlbnQgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLCByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFyYW1ldGVyTmFtZX0keyFwYXJhbWV0ZXJEYXRhLmxhYmVsIHx8IHBhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFyYW1ldGVyRGF0YS5sYWJlbD8udG9Mb3dlckNhc2UoKSA/ICcnIDogYCAoJHtwYXJhbWV0ZXJEYXRhLmxhYmVsfSlgfSR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbiA/IGAgKCR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbn0pYCA6ICcnfSAodHlwZTogJHtwYXJhbWV0ZXJEYXRhLnR5cGV9KSAke3BhcmFtZXRlckRhdGEuc3VnZ2VzdGVkID8gJyAoc3VnZ2VzdGVkKScgOiAnJ30ke3BhcmFtZXRlckRhdGEuZXhhbXBsZSA/IGAgKGV4YW1wbGU6IFwiJHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGV9XCIpYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnBhcmFtZXRlcnMucHVzaCh7IG5hbWU6IHBhcmFtZXRlck5hbWUsIGFsaWFzZXM6IHBhcmFtZXRlckRhdGEuYWxpYXNlcywgZWRpdG9yOiBpbnB1dCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UudGV4dENvbnRlbnQgPSAnTm8gdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0byBkaXNwbGF5ISc7XG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHRoaXMuZXhpc3RzID8gJ25vbmUnIDogJ2Jsb2NrJztcblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKG5vVGVtcGxhdGVzTWVzc2FnZSk7XG5cbiAgICAgICAgICAgIC8qIERFRkFVTFRTT1JUIGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh2YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpY29uOiAncm9ib3QnLCBsYWJlbDogJ1N1Z2dlc3QnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE1haW5UZXh0KCkucmVwbGFjZSgvIFxcKC4qXFwpJC8sICcnKTsgLy8gUmVtb3ZlIGRpc2FtYmlndWF0aW9uXG5cbiAgICAgICAgICAgICAgICBpZiAoWydSIGZyb20gcGVyc29uJywgJ1IgZnJvbSBiaXJ0aCBuYW1lJ10uc29tZSgodGFnKSA9PiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsaW5nIGlzIG1vZGlmaWVkIGZyb20gZXZhZDM3J3MgXCJSYXRlclwiXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcgJykpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2VuZXJhdGlvbmFsU3VmZml4ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICgvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25hbFN1ZmZpeCA9IG5hbWUuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0TmFtZSA9IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLywkLywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvTycvLCAnTycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShsYXN0TmFtZSArICcsICcgKyBvdGhlck5hbWVzICsgZ2VuZXJhdGlvbmFsU3VmZml4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnTXIuJywgJ01pc3RlcicpLnJlcGxhY2VBbGwoJyYnLCAnQW5kJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsZWFkaW5nQXJ0aWNsZSBvZiBbJ0FuJywgJ0EnLCAnVGhlJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TmFtZS5zdGFydHNXaXRoKGxlYWRpbmdBcnRpY2xlICsgJyAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKGxlYWRpbmdBcnRpY2xlLmxlbmd0aCArIDEpICsgJywgJyArIGxlYWRpbmdBcnRpY2xlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBuYW1lKSBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwgeyB0eXBlOiAnd2FybicgfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKG5ld05hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuQWN0aW9uRmllbGRMYXlvdXQodGhpcy5kZWZhdWx0U29ydElucHV0LCB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiwge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoYERlZmF1bHQgc29ydCBrZXkgKERFRkFVTFRTT1JUKSAoc2VlIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdXaWtpcGVkaWE6Q2F0ZWdvcml6YXRpb24jU29ydCBrZXlzJyl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+Z3VpZGVsaW5lPC9hPik6YCksXG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogQ2F0ZWdvcmllcyBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7IGFsbG93UmVvcmRlcmluZzogZmFsc2UsIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJywgaW5wdXRXaWRnZXQ6IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5jYXRlZ29yeVNlbGVjdCwgeyBsYWJlbDogJ0NhdGVnb3JpZXM6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuXG4gICAgICAgICAgICAvKiBTdW1tYXJ5IGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgZGF0YTogJ1Jlc29sdmUgZG91YmxlIHJlZGlyZWN0JyB9LCAvL1xuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIHNlbGYgcmVkaXJlY3QnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgZGF0YTogJ1JlbW92ZSBpbmNvcnJlY3QgcmNhdHMnIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnN1bW1hcnlJbnB1dCwgeyBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCcsIGxhYmVsOiAnU3VtbWFyeTonLCBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLCBhbGlnbjogJ3RvcCcgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGVsZW1lbnRzIGluIHRoZSBzdWJtaXQgYnV0dG9uIHJvdy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZFN1Ym1pdEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgLyogU2V0dXAgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTdWJtaXQnLCBkaXNhYmxlZDogdHJ1ZSwgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHNob3cgcHJldmlldyBidXR0b24gKi9cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUHJldmlld0RpYWxvZyA9IG5ldyBUZW1wbGF0ZVByZXZpZXdEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbdGVtcGxhdGVQcmV2aWV3RGlhbG9nXSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IHByZXZpZXcnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5zZXREYXRhKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cub3BlbigpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHNob3cgY2hhbmdlcyBidXR0b24gKi9cbiAgICAgICAgICAgIGNvbnN0IHNob3dDaGFuZ2VzRGlhbG9nID0gbmV3IFNob3dDaGFuZ2VzRGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9KTtcbiAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0NoYW5nZXNEaWFsb2ddKTtcblxuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgY2hhbmdlcycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5zZXREYXRhKFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzeW5jIHRhbGsgY2hlY2tib3ggKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWxrRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6ICEhdGhpcy50YWxrRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoeyBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3luY1RhbGtDaGVja2JveCwgeyBsYWJlbDogJ1N5bmMgdGFsayBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogU2V0dXAgcGF0cm9sIGNoZWNrYm94ICovXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja1Nob3VsZFByb21wdFBhdHJvbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7IGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5wYXRyb2xDaGVja2JveCwgeyBsYWJlbDogJ01hcmsgYXMgcGF0cm9sbGVkJywgYWxpZ246ICdpbmxpbmUnIH0pXSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogU2V0dXAgbGF5b3V0ICovXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KHtcbiAgICAgICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0JyxcbiAgICAgICAgICAgICAgICBpdGVtczogW3RoaXMuc3VibWl0QnV0dG9uLCB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLCB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLCB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQsIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXRdLmZpbHRlcihCb29sZWFuKSBhcyBPTy51aS5XaWRnZXRbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgaWYgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHRvIHBhdHJvbCB0aGUgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlVHJpYWdlTWFya0J1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyayAubXdlLXB0LXRvb2wtaWNvbicpIGFzIEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG4gICAgICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcblxuICAgICAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rJykpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy11bnJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyUGVybWlzc2lvbnMgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHsgYWN0aW9uOiAncXVlcnknLCBtZXRhOiAndXNlcmluZm8nLCB1aXByb3A6ICdyaWdodHMnIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5VXNlckluZm9QYXJhbXMpKSBhcyBVc2VyUGVybWlzc2lvbnNSZXNwb25zZTtcbiAgICAgICAgICAgICAgICBpZiAoIXVzZXJQZXJtaXNzaW9ucy5xdWVyeS51c2VyaW5mby5yaWdodHMuaW5jbHVkZXMoJ3BhdHJvbCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYWdldHJpYWdlbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VfaWQ6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgUGFnZVRyaWFnZUFwaVBhZ2VUcmlhZ2VMaXN0UGFyYW1zKSkgYXMgUGFnZVRyaWFnZUxpc3RSZXNwb25zZTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8udXNlcl9uYW1lID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5yZXN1bHQgIT09ICdzdWNjZXNzJyB8fCBwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAhTnVtYmVyLnBhcnNlSW50KHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy5wYXRyb2xfc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IGlucHV0IHBsYWNlaG9sZGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5KCkge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RWYWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKCFyZWRpcmVjdFZhbHVlKSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q2hhbmdlZCA9IHJlZGlyZWN0VmFsdWUgIT09IHRoaXMub2xkUmVkaXJlY3RUYXJnZXQ/LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+ICF0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnIGFzIHN0cmluZykpIHx8IHRoaXMub2xkUmVkaXJlY3RUYWdzIS5zb21lKCh0YWcpID0+ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuc29tZSgodGFnKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUubmFtZSA9PT0gdGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5wYXJhbWV0ZXJzLnNvbWUoKHBhcmFtZXRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kT2xkQXJndW1lbnQgPSB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSFbdGFnIGFzIHN0cmluZ10/LmZpbmQoKGFyZ3VtZW50KSA9PiBhcmd1bWVudFswXSA9PT0gcGFyYW1ldGVyLm5hbWUpPy5bMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRPbGRBcmd1bWVudCA/IGZvdW5kT2xkQXJndW1lbnQgIT09IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U29ydENoYW5nZWQgPSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkgIT09IHRoaXMub2xkRGVmYXVsdFNvcnQhLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5vbGRDYXRlZ29yaWVzIS5pbmNsdWRlcyhjYXRlZ29yeSBhcyBzdHJpbmcpKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMhLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKGNhdGVnb3J5KSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Q2hhbmdlZCkgY2hhbmdlcy5wdXNoKGByZXRhcmdldCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWApO1xuICAgICAgICAgICAgICAgIGlmICh0YWdzQ2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0FyZ3VtZW50c0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIGFyZ3VtZW50cycpO1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U29ydENoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGRlZmF1bHQgc29ydCBrZXknKTtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcmllc0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpZXMnKTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgY2hhbmdlcy5wdXNoKCdwZXJmb3JtIHJlZGlyZWN0IGNsZWFudXAnKTtcblxuICAgICAgICAgICAgICAgIGNoYW5nZXNbMF0gPSBjaGFuZ2VzWzBdWzBdLnRvVXBwZXJDYXNlKCkgKyBjaGFuZ2VzWzBdLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA+IDEpIGNoYW5nZXNbY2hhbmdlcy5sZW5ndGggLSAxXSA9IGBhbmQgJHtjaGFuZ2VzLmF0KC0xKX1gO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gY2hhbmdlcy5qb2luKGNoYW5nZXMubGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgICAgICAgfSBlbHNlICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGBDcmVhdGUgcmVkaXJlY3QgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIGV4aXN0aW5nIHBhZ2UgZGF0YS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4aXN0aW5nRGF0YSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5wYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlsxXTtcblxuICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ3MgPSAoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW3RhZywgdGFnRGF0YV0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QodGhpcy5wYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0YWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXVxuICAgICAgICAgICAgKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZWRpcmVjdFRhZ3MgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKVxuICAgICAgICAgICAgICAgIC5mbGF0TWFwKChbdGFnLCB0YWdEYXRhXSkgPT4gW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXSlcbiAgICAgICAgICAgICAgICAubWFwKCh0YWdPclJlZGlyZWN0KSA9PiAobmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QodGhpcy5wYWdlQ29udGVudCkgPyB0YWdPclJlZGlyZWN0IDogbnVsbCkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxSZWRpcmVjdFRhZ3NcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnWzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdbMF19XSR7dGFnLnNsaWNlKDEpfVxcXFx8PyguKj8pXFxcXHMqfX1gKS5leGVjKHRoaXMucGFnZUNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdUYWcgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maW5kKChbdGVtcGxhdGUsIHRhZ0RhdGFdKSA9PiBbdGVtcGxhdGUsIC4uLnRhZ0RhdGEuYWxpYXNlc10uaW5jbHVkZXModGFnKSk/LlswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxBcmd1bWVudHMgPSBtYXRjaD8uWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbEFyZ3VtZW50cykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEFyZ3VtZW50cyA9IG1hdGNoWzFdLnNwbGl0KCd8JykubWFwKChhcmd1bWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50LmluY2x1ZGVzKCc9JykpIHJldHVybiBbKGluZGV4ICsgMSkudG9TdHJpbmcoKSwgYXJndW1lbnQudHJpbSgpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBhcmd1bWVudC5zcGxpdCgnPScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lLnRyaW0oKSwgdmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25ld1RhZywgZm9ybWF0dGVkQXJndW1lbnRzXTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBbc3RyaW5nLCBzdHJpbmdbXVtdXVtdLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5vbGREZWZhdWx0U29ydCA9XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAubWF0Y2goL3t7REVGQVVMVFNPUlQ6Lio/fX0vZylcbiAgICAgICAgICAgICAgICAgICAgPy5hdCgtMSlcbiAgICAgICAgICAgICAgICAgICAgPy5zbGljZSgxNCwgLTIpXG4gICAgICAgICAgICAgICAgICAgID8udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMgPSB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC9cXFtcXFtbQ2NdYXRlZ29yeTouKz9dXS9nKT8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc2xpY2UoMTEsIC0yKSkgPz8gW107XG5cbiAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0ID0gW1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL3t7c2hvcnQgZGVzY3JpcHRpb25cXHwuKj99fS9pKT8uWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL3t7RElTUExBWVRJVExFOi4qP319Lyk/LlswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC97e2l0YWxpYyB0aXRsZVxcfD8uKj99fS9pKT8uWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL3t7dGl0bGUgbGFuZ3VhZ2VcXHwuKj99fS8pPy5bMF0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0LnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgICAgIGVsc2UgbXcubm90aWZ5KCdDb3VsZCBub3QgZmluZCByZWRpcmVjdCB0YXJnZXQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFncyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRUZW1wbGF0ZUVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRlbXBsYXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZFRlbXBsYXRlRWRpdG9yKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIGFyZ3VtZW50XSBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyRWRpdG9yID0gZm91bmRUZW1wbGF0ZUVkaXRvci5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFBhcmFtZXRlckVkaXRvcikgZm91bmRQYXJhbWV0ZXJFZGl0b3IuZWRpdG9yLnNldFZhbHVlKGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9sZERlZmF1bHRTb3J0KSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGREZWZhdWx0U29ydCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5vbGRDYXRlZ29yaWVzKSB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShjYXRlZ29yeSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHRoaXMub2xkQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoeyBkYXRhOiBjYXRlZ29yeSwgbGFiZWw6IGNhdGVnb3J5IH0pKSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgY2hlY2tzIG9uIHRoZSBwcm92aWRlZCBkYXRhIGFuZCByZXR1cm5zIHRoZSBlcnJvcnMgKGlmIGFueSkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3VibWlzc2lvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgKi9cbiAgICAgICAgICAgIGlmICghL15cXHMqW15bXFxde3x9XStcXHMqJC8udGVzdChkZXN0aW5hdGlvbikpIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuXG4gICAgICAgICAgICAvKiBGYWlsZWQgZHVyaW5nIHRpdGxlIHBhcnNpbmcgKi9cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZWREZXN0aW5hdGlvbiA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJzZWREZXN0aW5hdGlvbiAmJiBlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAgICAgLyogU2VsZiByZWRpcmVjdHMgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZERlc3RpbmF0aW9uPy50b1N0cmluZygpID09PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC50b1N0cmluZygpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdjYW5ub3QgcmVkaXJlY3QgdG8gaXRzZWxmIScgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uRGF0YSA9IChhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoeyBhY3Rpb246ICdxdWVyeScsIGZvcm1hdHZlcnNpb246ICcyJywgcHJvcDogWydwYWdlcHJvcHMnLCAnY2F0ZWdvcmllcyddLCB0aXRsZXM6IGRlc3RpbmF0aW9uIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLyogTm9uZXhpc3RlbnQgZGVzdGluYXRpb24gKi8gaWYgKGVycm9yQ29kZSA9PT0gJ21pc3Npbmd0aXRsZScpIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnZG9lcyBub3QgZXhpc3QhJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLyogT3RoZXIgQVBJIGVycm9yICovIGVsc2UgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6IGB3YXMgbm90IGFibGUgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBBUEkgKCR7ZXJyb3JDb2RlfSkhYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSkpIGFzIChQYWdlcHJvcHNSZXN1bHQgJiBDYXRlZ29yaWVzUmVzdWx0KSB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhcnNlUmVzdWx0ID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogZGVzdGluYXRpb24sIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcykpIGFzIFBhZ2VQYXJzZVJlc3VsdDtcblxuICAgICAgICAgICAgLyogRG91YmxlIHJlZGlyZWN0cyAqL1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzPy5bMF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblJlZGlyZWN0ID1cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG8gKyAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudCA/IGAjJHtkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50fWAgOiAnJyk7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SZWRpcmVjdCxcbiAgICAgICAgICAgICAgICAgICAgKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9uUmVkaXJlY3R9PC9hPi4gUmV0YXJnZXQgdG8gdGhhdCBwYWdlIGluc3RlYWQsIGFzIGRvdWJsZSByZWRpcmVjdHMgYXJlbid0IGFsbG93ZWQuYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogTm9uZXhpc3RlbnQgc2VjdGlvbiAqL1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkU2VjdGlvbiA9IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2Uuc2VjdGlvbnMuZmluZCgoc2VjdGlvbikgPT4gc2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpID09PSBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiEnIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gc2VjdGlvbn19PC9jb2RlPiEnIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYXJzZWREZXN0aW5hdGlvbiEudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/W0FhXSg/Om5jaG9ycz98bmNob3IgZm9yIHJlZGlyZWN0fG5rZXJ8TkNIT1J8bmMpXFxzKj9cXHwpLis/KD89fX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3Iuc3BsaXQoJ3wnKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC8oPzw9e3tcXHMqPyg/OltWdl0oPzppc2libGUgYW5jaG9ycz98aXNhbmN8QW5jaHxhbmNob3J8aXNpYmxlYW5jaG9yfGEpfFtBYV0oPzpuY2hvcmR8Y2hvcmVkfG5jaG9yXFwrKXxbVHRdZXh0IGFuY2hvcilcXHMqP1xcfCkuKz8oPz0oPzwhIXw9KX19KS9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhL150ZXh0XFxzKj89Ly50ZXN0KHBhcnQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvKD88PWlkPSlcIj8uKz8oPz1cInw+fFxcfCkvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci50cmltKCkpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvcnMuaW5jbHVkZXMoZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhbiBhbmNob3IhJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIGZyb20gYW5jaG9yfX08L2NvZGU+IScgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBzZWN0aW9uL2FuY2hvciAqL1xuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID09PSAxICYmICh0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSB8fCB0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBub3QgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24vYW5jaG9yLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIGZyb20gc2VjdGlvbn19PC9jb2RlPiBvciA8Y29kZT57e1IgZnJvbSBhbmNob3J9fTwvY29kZT4hJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgPSAhIShkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldElzU3VybmFtZUxpc3QgPSAhIWRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0uY2F0ZWdvcmllcz8uc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6U3VybmFtZXMnKTtcblxuICAgICAgICAgICAgY29uc3QgdG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzID0gWydSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnLCAnUiBmcm9tIGluY29tcGxldGUgZGlzYW1iaWd1YXRpb24nXTtcbiAgICAgICAgICAgIGNvbnN0IHRvU3VybmFtZUxpc3RUYWdzID0gWydSIGZyb20gYW1iaWd1b3VzIHNvcnQgbmFtZScsICdSIGZyb20gYW1iaWd1b3VzIHRlcm0nXTtcblxuICAgICAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlID0gdG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzLnNvbWUoKHRlbXBsYXRlKSA9PiB0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSk7XG4gICAgICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCA9IHRvU3VybmFtZUxpc3RUYWdzLnNvbWUoKHRlbXBsYXRlKSA9PiB0YWdzLmluY2x1ZGVzKHRlbXBsYXRlKSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2Ugd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgaWYgKHRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlICYmICF0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyB9KTtcblxuICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzICYmICF0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSkge1xuICAgICAgICAgICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UgKi9cbiAgICAgICAgICAgICAgICBpZiAodGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBub3QgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG5cbiAgICAgICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBzdXJuYW1lIGxpc3Qgd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIHN1cm5hbWUgbGlzdCwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGNvcnJlY3QgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSAmJiB0YWdzLmluY2x1ZGVzKCdSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnKSAmJiAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fTwvY29kZT4sIGJ1dCB0aGlzIHRpdGxlIGRvZXMgbm90IGVuZCB3aXRoIFwiIChkaXNhbWJpZ3VhdGlvbilcIi4gVXNlIDxjb2RlPnt7UiBmcm9tIGFtYmlndW91cyB0ZXJtfX08L2NvZGU+IG9yIGEgc2ltaWxhciBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkIScsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFRhZ2dlZCB3aXRoIGEgcHJvdGVjdGlvbiB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBbJ1Igc2VtaS1wcm90ZWN0ZWQnLCAnUiBleHRlbmRlZC1wcm90ZWN0ZWQnLCAnUiB0ZW1wbGF0ZS1wcm90ZWN0ZWQnLCAnUiBmdWxseSBwcm90ZWN0ZWQnXSlcbiAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAgfSk7XG5cbiAgICAgICAgICAgIC8qIExpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gd2l0aG91dCBiZWluZyB0YWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gKi9cbiAgICAgICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1dpa2liYXNlSXRlbUlkJykgJiYgIXRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBcImlzIGxpbmtlZCB0byBhIFdpa2lkYXRhIGl0ZW0gYnV0IGl0IGlzbid0IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4hXCIgfSk7XG5cbiAgICAgICAgICAgIC8qIFRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSB3aXRob3V0IGJlaW5nIGxpbmtlZCB0byBhbiBpdGVtICovXG4gICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSAmJiAhbXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4gYnV0IGl0IGlzIG5vdCBhY3R1YWxseSBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIScgfSk7XG5cbiAgICAgICAgICAgIC8qIE1pc3NpbmcgdGFnIHJlcXVpcmVkIHBhcmFtZXRlciAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncyBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzW3RhZ107XG4gICAgICAgICAgICAgICAgaWYgKCF0YWdEYXRhKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ0RhdGEucGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXIgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgICAgID8ucGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+IFtwYXJhbWV0ZXIubmFtZSwgLi4ucGFyYW1ldGVyLmFsaWFzZXNdLmluY2x1ZGVzKHBhcmFtZXRlck5hbWUpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kUGFyYW1ldGVyKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyRGF0YS5yZXF1aXJlZCAmJiAhZm91bmRQYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4gYnV0IGl0IGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciA8Y29kZT4ke3BhcmFtZXRlck5hbWV9PC9jb2RlPiFgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogU3luY2luZyB0YWxrIHBhZ2UgYnV0IHRhbGsgcGFnZSBleGlzdHMgYW5kIGlzbid0IGEgcmVkaXJlY3QgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ubWlzc2luZyAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyB0aXRsZTogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksIG1lc3NhZ2U6ICdleGlzdHMsIGJ1dCBpcyBub3QgYSByZWRpcmVjdCEnIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhbmRsZXMgdGhlIGV2ZW50IHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBcIlN1Ym1pdFwiIGJ1dHRvbi5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c1RvRGlzYWJsZSA9IFtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QsXG4gICAgICAgICAgICAgICAgLi4udGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZsYXRNYXAoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIuZWRpdG9yKSksXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QsXG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCxcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94LFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZCh0cnVlKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0NoZWNraW5nIHRhcmdldCB2YWxpZGl0eS4uLicpO1xuXG4gICAgICAgICAgICBsZXQgZXJyb3JzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uPj4gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRzQ2hlY2spIGVycm9ycyA9IGF3YWl0IHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uKCk7XG4gICAgICAgICAgICBlbHNlIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSk7XG5cbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnKSkgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGl0bGUsIG1lc3NhZ2UgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt0aXRsZSA/IGA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCh0aXRsZSl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHt0aXRsZX08L2E+YCA6ICdUaGlzIHBhZ2UnfSAke21lc3NhZ2V9IENsaWNrIGFnYWluIHdpdGhvdXQgbWFraW5nIGNoYW5nZXMgdG8gc3VibWl0IGFueXdheS5gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ2Vycm9yJywgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItd2FybmluZyddLCBpbmxpbmU6IHRydWUsIGxhYmVsIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZCh3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQgYW55d2F5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEVkaXQvY3JlYXRlIHJlZGlyZWN0ICovXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbChgJHt0aGlzLmV4aXN0cyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9IHJlZGlyZWN0Li4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9ICh0aGlzLnN1bW1hcnlJbnB1dC5nZXRWYWx1ZSgpIHx8ICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlcikgKyB0aGlzLnNjcmlwdEFkdmVydDtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUodGhpcy5wYWdlVGl0bGUsIG91dHB1dCwgc3VtbWFyeSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBtdy5ub3RpZnkoYFJlZGlyZWN0ICR7dGhpcy5leGlzdHMgPyAnZWRpdGVkJyA6ICdjcmVhdGVkJ30gc3VjY2Vzc2Z1bGx5IWAsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuXG4gICAgICAgICAgICAvKiBTeW5jIHRhbGsgcGFnZSBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnRWRpdGluZyB0YWxrIHBhZ2UuLi4nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Nb3ZlID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcygnUiBmcm9tIG1vdmUnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBmcm9tTW92ZSA/IFsnUiBmcm9tIG1vdmUnXSA6IFtdLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgW10pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFsa1Jlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBvdXRwdXQsICdTeW5jaW5nIHJlZGlyZWN0IGZyb20gbWFpbiBwYWdlJyArIHRoaXMuc2NyaXB0QWR2ZXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhbGtSZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnVGFsayBwYWdlIHN5bmNlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFBhdHJvbCBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgICAgICBpZiAodGhpcy5wYXRyb2xDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1BhdHJvbGxpbmcgcmVkaXJlY3QuLi4nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbExpbms6IEhUTUxBbmNob3JFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rIGEnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrUmV2aWV3ZWRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhdHJvbExpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzdWx0ID0gYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0V2l0aFRva2VuKCdwYXRyb2wnLCB7IGFjdGlvbjogJ3BhdHJvbCcsIHJjaWQ6IG5ldyBVUkwocGF0cm9sTGluay5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdyY2lkJykhIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgcGF0cm9sbGluZyAke3RoaXMucGFnZVRpdGxlfSB2aWEgQVBJOiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXN1bHQpIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtSZXZpZXdlZEJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXJrUmV2aWV3ZWRCdXR0b24uY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBtdy5ub3RpZnkoJ1BhZ2UgY3VyYXRpb24gdG9vbGJhciBub3QgZm91bmQsIHJlZGlyZWN0IGNhbm5vdCBiZSBwYXRyb2xsZWQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ29tcGxldGUsIHJlbG9hZGluZy4uLicpO1xuXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHRoaXMucGFnZVRpdGxlLCB7IHJlZGlyZWN0OiAnbm8nIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVGFrZXMgcHJvdmlkZWQgdmFsdWVzIHRvIGNyZWF0ZSB0aGUgcGFnZSBvdXRwdXQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGNyZWF0ZU91dHB1dCh0YXJnZXQ6IHN0cmluZywgdGFnczogc3RyaW5nW10sIHN0cmF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZWZhdWx0U29ydDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjYXRlZ29yaWVzOiBzdHJpbmdbXSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGFyZ2V0ID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KTtcblxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVGl0bGUgPSBwYXJzZWRUYXJnZXRcbiAgICAgICAgICAgICAgICA/IGAke3BhcnNlZFRhcmdldC5nZXROYW1lc3BhY2VJZCgpID09PSAxNCA/ICc6JyA6ICcnfSR7cGFyc2VkVGFyZ2V0LmdldFByZWZpeGVkVGV4dCgpfSR7cGFyc2VkVGFyZ2V0LmdldEZyYWdtZW50KCkgPyBgIyR7cGFyc2VkVGFyZ2V0LmdldEZyYWdtZW50KCl9YCA6ICcnfWBcbiAgICAgICAgICAgICAgICA6IHRhcmdldC50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZFxuICAgICAgICAgICAgICAgICAgICAuZ2V0TWFpblRleHQoKVxuICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpID09PVxuICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgZGVmYXVsdFNvcnQgPSB1bmRlZmluZWQ7IC8vIENoZWNrIGlmIHRpdGxlcyBub3JtYWxpemUgdG8gdGhlIHNhbWUgdGV4dCwgYW5kIHJlbW92ZXMgdGhlIERFRkFVTFRTT1JUIGlmIHNvXG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID0gdGFncy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQXJndW1lbnRFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBgI1JFRElSRUNUIFtbJHtmb3JtYXR0ZWRUaXRsZX1dXVxcbmAsIC8vXG4gICAgICAgICAgICAgICAgdGFncy5sZW5ndGggPiAwID8gYHt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fVxcbmAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmF5VGV4dCA/IHN0cmF5VGV4dCArICdcXG4nIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0U29ydCA/IGB7e0RFRkFVTFRTT1JUOiR7ZGVmYXVsdFNvcnQudHJpbSgpfX19YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5sZW5ndGggPiAwID8gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBgW1tDYXRlZ29yeToke2NhdGVnb3J5fV1dYCkuam9pbignXFxuJykgOiBudWxsLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdG8gZmV0Y2guXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRWRpdHMgb3IgY3JlYXRlcyBhIHBhZ2Ugd2l0aCBnaXZlbiB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHBhZ2UgdGl0bGUuXG4gICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnkgfSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ25vY3JlYXRlLW1pc3NpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5IH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBlZGl0aW5nIG9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBSZWRpcmVjdEhlbHBlcigpLnJ1bigpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7YUE2Q0EsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGtCQUFtQiwrQkFBZ0MsbUNBQW1DLEVBQUcsSUFBTSxDQU1qSyxNQUFNQSxVQUE0QixHQUFHLEdBQUcsZUFBZ0IsQ0FPcEQsWUFBWUMsRUFBNkJDLEVBQTJCLENBQ2hFLE1BQU1ELENBQU0sRUFOaEIsS0FBUSxJQUFNLElBQUksR0FBRyxJQVlyQixzQkFBbUIsSUFBTSxDQUNyQixNQUFNRSxFQUFRLEtBQUssU0FBUyxFQUN0QkMsRUFBVyxFQUFFLFNBQVMsRUFFNUIsR0FBSSxDQUFDRCxFQUFPQyxFQUFTLFFBQVEsQ0FBQyxDQUFDLFVBQ3RCRCxFQUFNLFNBQVMsR0FBRyxFQUFHLENBQzFCLE1BQU1FLEVBQVFGLEVBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUVoQyxLQUFLLElBQ0EsSUFBSSxDQUFFLE9BQVEsUUFBUyxLQUFNRSxFQUFPLEtBQU0sV0FBWSxVQUFXLEVBQUssQ0FBMEIsRUFDaEcsTUFBTSxJQUFNLElBQUksRUFDaEIsS0FBTUMsR0FBbUMsQ0FDdEMsR0FBSUEsRUFBUSxDQUNSLE1BQU1DLEVBQWtCRCxFQUFPLE1BQU0sU0FBUyxPQUFRRSxHQUNsREEsRUFBUSxLQUNILFlBQVksRUFDWixXQUFXLFVBQVcsRUFBRSxFQUN4QixXQUFXTCxFQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxZQUFZ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UUEsQ0FDWixDQUFtQyxHQUNyQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FDMUQsQ0FRQSxNQUFjLGFBQWFBLEVBQWV1SCxFQUFjdEUsRUFBaUIsQ0FDckUsT0FBTyxNQUFNLEtBQUssSUFDYixLQUFLakQsRUFBTyxLQUFPLENBQUUsS0FBQXVILEVBQU0sUUFBQXRFLENBQVEsRUFBRSxFQUNyQyxNQUFNLENBQUN3QyxFQUFtQnFCLElBQ25CckIsSUFBYyxtQkFDUCxLQUFLLElBQUksT0FBT3pGLEVBQU8sQ0FBRSxRQUFBaUQsQ0FBUSxFQUFHc0UsQ0FBSSxFQUFFLE1BQU0sQ0FBQzlCLEVBQW1CcUIsSUFBa0MsQ0FDekcsR0FBRyxPQUFPLGtCQUFrQjlHLENBQUssS0FBSzhHLEdBQVcsTUFBTSxNQUFRLGVBQWUsS0FBS3JCLENBQVMsSUFBSyxDQUFFLEtBQU0sT0FBUSxDQUFDLENBQ3RILENBQUMsR0FFRCxHQUFHLE9BQU8sNkJBQTZCekYsQ0FBSyxLQUFLOEcsR0FBVyxNQUFNLE1BQVEsZUFBZSxLQUFLckIsQ0FBUyxJQUFLLENBQUUsS0FBTSxPQUFRLENBQUMsRUFDdEgsS0FFZCxDQUNULENBQ0osQ0FFQSxJQUFJbEUsRUFBZSxFQUFFLElBQUksQ0FDN0IsQ0FBQyIsCiAgIm5hbWVzIjogWyJSZWRpcmVjdElucHV0V2lkZ2V0IiwgImNvbmZpZyIsICJwYWdlVGl0bGVQYXJzZWQiLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAidGl0bGUiLCAicmVzdWx0IiwgIm1hdGNoZWRTZWN0aW9ucyIsICJzZWN0aW9uIiwgInBhcnNlZFRpdGxlIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgInBhZ2VzIiwgImNhdGVnb3J5IiwgInRpdGxlV2l0aG91dE5hbWVzcGFjZSIsICJUZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAidGFnc0NvbnRlbnQiLCAiY2F0ZWdvcmllc0NvbnRlbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgIlNob3dDaGFuZ2VzRGlhbG9nIiwgIm9sZFRleHQiLCAibmV3VGV4dCIsICJjb21wYXJpc29uIiwgIm5vQ2hhbmdlc0VsZW1lbnQiLCAiUmVkaXJlY3RIZWxwZXIiLCAicGFnZUluZm8iLCAiZGlhbG9nSW5mbyIsICJidXR0b24iLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAicG9ydGxldExpbmsiLCAiZXZlbnQiLCAicmVkaXJlY3RUZW1wbGF0ZXMiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlIiwgImV4aXN0cyIsICJtYWluUGFnZUNvbnRlbnQiLCAidGFyZ2V0IiwgInRhZ09yUmVkaXJlY3QiLCAidGFnIiwgInNvcnRlZFRhZ3MiLCAiYSIsICJiIiwgImVkaXRvckluZm8iLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInN1bW1hcnlFbGVtZW50IiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgIm5hbWUiLCAiZ2VuZXJhdGlvbmFsU3VmZml4IiwgImxhc3ROYW1lIiwgIm90aGVyTmFtZXMiLCAibmV3TmFtZSIsICJsZWFkaW5nQXJ0aWNsZSIsICJ3aW5kb3dNYW5hZ2VyIiwgInRlbXBsYXRlUHJldmlld0RpYWxvZyIsICJzaG93Q2hhbmdlc0RpYWxvZyIsICJwYWdlVHJpYWdlTWFya0J1dHRvbiIsICJwYXRyb2xSZXNwb25zZSIsICJyZWRpcmVjdFZhbHVlIiwgInRhcmdldENoYW5nZWQiLCAidGFnc0NoYW5nZWQiLCAidGFnQXJndW1lbnRzQ2hhbmdlZCIsICJ0ZW1wbGF0ZSIsICJwYXJhbWV0ZXIiLCAiZm91bmRPbGRBcmd1bWVudCIsICJhcmd1bWVudCIsICJkZWZhdWx0U29ydENoYW5nZWQiLCAiY2F0ZWdvcmllc0NoYW5nZWQiLCAiY2hhbmdlcyIsICJ0YWdEYXRhIiwgIm9yaWdpbmFsUmVkaXJlY3RUYWdzIiwgIm1hdGNoIiwgIm5ld1RhZyIsICJmb3JtYXR0ZWRBcmd1bWVudHMiLCAiaW5kZXgiLCAiZm91bmRUZW1wbGF0ZUVkaXRvciIsICJmb3VuZFBhcmFtZXRlckVkaXRvciIsICJlcnJvcnMiLCAiZGVzdGluYXRpb24iLCAidGFncyIsICJkZXN0aW5hdGlvbkRhdGEiLCAiZXJyb3JDb2RlIiwgImRlc3RpbmF0aW9uUGFyc2VSZXN1bHQiLCAiZGVzdGluYXRpb25SZWRpcmVjdCIsICJkZXN0aW5hdGlvbkNvbnRlbnQiLCAiYW5jaG9yIiwgInBhcnQiLCAidGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFyZ2V0SXNTdXJuYW1lTGlzdCIsICJ0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MiLCAidG9TdXJuYW1lTGlzdFRhZ3MiLCAidGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0IiwgImZvdW5kUGFyYW1ldGVyIiwgImVsZW1lbnRzVG9EaXNhYmxlIiwgImVsZW1lbnQiLCAibWVzc2FnZSIsICJ3YXJuaW5nTWVzc2FnZSIsICJvdXRwdXQiLCAiZnJvbU1vdmUiLCAicGF0cm9sTGluayIsICJtYXJrUmV2aWV3ZWRCdXR0b24iLCAiZXJyb3JJbmZvIiwgInN0cmF5VGV4dCIsICJkZWZhdWx0U29ydCIsICJjYXRlZ29yaWVzIiwgInBhcnNlZFRhcmdldCIsICJmb3JtYXR0ZWRUaXRsZSIsICJ0YWdzV2l0aEFyZ3VtZW50cyIsICJmb3VuZEFyZ3VtZW50RWRpdG9yIiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ0ZXh0Il0KfQo=