Jump to content

User:Eejit43/scripts/afcrc-helper.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/afcrc-helper/afcrc-helper.ts

"use strict";(()=>{var oe=Object.defineProperty;var x=(y,e)=>()=>(y&&(e=y(y=0)),e);var J=(y,e)=>{for(var t in e)oe(y,t,{get:e[t],enumerable:!0})};var S,G=x(()=>{"use strict";S=class y extends OO.ui.Dialog{contentLayout;logOutput;closeButton;helperDialog;constructor(e){super({size:"large"}),y.static.name="ActionsDialog",y.static.title="Actions",this.helperDialog=e}initialize=()=>(OO.ui.Dialog.prototype.initialize.apply(this),this.contentLayout=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.$body.append(this.contentLayout.$element),this.logOutput=document.createElement("div"),this.logOutput.classList.add("afcrc-helper-actions-container"),this.closeButton=new OO.ui.ButtonWidget({label:"Close",flags:["safe","close"]}),this.closeButton.on("click",()=>this.close()),this.contentLayout.$element.append(this.logOutput,this.closeButton.$element),this);addLogEntry(e,t="notice"){let n=new OO.ui.MessageWidget({type:t,inline:!0,label:new OO.ui.HtmlSnippet(e)});this.logOutput.append(n.$element[0]),this.updateSize();let i=this.$body;i[0].scrollTo({top:i[0].scrollHeight,behavior:"smooth"})}showReload(){this.closeButton.$element.remove();let e=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});e.on("click",()=>{this.helperDialog.allowTabClosure(),window.location.reload()}),this.contentLayout.$element.append(e.$element)}};Object.assign(S.prototype,OO.ui.Dialog.prototype)});var v,_=x(()=>{"use strict";G();v=class y extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;createdPageWatchMethod;beforeText;pageContent;parsedRequests;editsCreationsToMake=[];shouldStopTabClosure=!0;constructor(e,t,n){super({size:"large"}),y.static.name="AfcrcHelperDialog",y.static.title="afcrc-helper",y.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=t,this.requestPageType=e,this.createdPageWatchMethod=n&&["nochange","preferences","unwatch","watch"].includes(n)?n:"preferences",document.body.classList.add("afcrc-helper-open"),window.addEventListener("beforeunload",i=>{this.parsedRequests.length>0&&this.shouldStopTabClosure&&i.preventDefault()})}getActionProcess=e=>!e||e==="cancel"?new OO.ui.Process(()=>{this.parsedRequests.length>0?OO.ui.confirm("Are you sure you want to close? All changes will be discarded.").then(t=>{t&&(this.close(),this.shouldStopTabClosure=!1)}):this.close()}):e==="save"?new OO.ui.Process(()=>{this.performActions()}):y.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>y.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty(),document.body.classList.remove("afcrc-helper-open")});async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle});this.pageContent=e.query.pages[0].revisions[0].slots.main.content.trim(),this.parseRequests(),this.loadInputElements()}parseRequests(){this.beforeText=/^(.*?)==/s.exec(this.pageContent)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==");let e=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(t=>t[0]);for(let t of e){if(/{{afc-c\|/i.test(t))continue;let i=/^==(.*?)==$/m.exec(t)[1].trim();this.parseSubtypeRequests(t,i)}}loadInputElements(){if(this.parsedRequests.length>0){let e=0,t=()=>{let i=Math.min(e+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${e+1}-${i}/${this.parsedRequests.length} requests)`);for(let o=e;o<i;o++)this.loadSubtypeElements(o);i<this.parsedRequests.length?(e=i,setTimeout(t,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};t()}else{let e=new OO.ui.MessageWidget({type:"notice",label:"No valid requests to handle!"}),t=new OO.ui.PanelLayout({padded:!0,expanded:!1});t.$element.append(e.$element),this.$body.append(t.$element),this.updateSize()}}async performActions(){let e=new OO.ui.WindowManager;document.body.append(e.$element[0]);let t=new S(this);e.addWindows([t]),t.open();let n={accepted:0,denied:0,"commented on":0,closed:0},i=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle})).query.pages[0].revisions[0].slots.main.content.trim();this.performSubtypeActions(t,n,i)}formatDeniedReason(e){let t=e.startsWith("autofill:")?/autofill:(\w+)/.exec(e)[1]:`decline|2=${e}`,n=e.startsWith("autofill:")&&e.includes(",")?" "+e.slice(e.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${t}}}${n}`}mapDeniedReasons(e,t,n){if(t)return`* ${this.formatDeniedReason(e[0][1])} ~~~~`;let i={};for(let[s,a]of e)a in i||(i[a]=[]),i[a].push(s);let o=Object.entries(i);return o.map(([s,a])=>`* ${this.formatDeniedReason(s)}${o.length>1||!n?` (${a.map(l=>`[[${l}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(e,t,n){if(t)return`* {{AfC comment|1=${e[0][1]}}} ~~~~`;let i={};for(let[s,a]of e)a in i||(i[a]=[]),i[a].push(s);let o=Object.entries(i);return o.map(([s,a])=>`* {{AfC comment|1=${s}}}${o.length>1||!n?` (${a.map(l=>`[[${l}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(e,{prepend:t,append:n}){let{fullSectionText:i,sectionText:o}=e;return t&&(e.sectionText=t+`
`+e.sectionText),n&&(e.sectionText+=`
`+n),e.fullSectionText=e.fullSectionText.replace(o,e.sectionText),e.pageText=e.pageText.replace(i,e.fullSectionText),e}async makeAllEditsCreations(e){for(let[t,n]of this.editsCreationsToMake.entries()){let i=n.type==="edit"?()=>this.api.edit(n.title,n.transform):()=>this.api.create(n.title,{summary:n.summary,watchlist:this.createdPageWatchMethod},n.text),o=document.createElement("a");o.target="_blank",o.href=mw.util.getUrl(n.title,"isRedirect"in n&&n.isRedirect?{redirect:"no"}:void 0),o.textContent=n.title;let s=`afcrc-helper-action-result-${t}`;e.addLogEntry(`${n.type==="edit"?"Editing":"Creating"} ${o.outerHTML}... <span id="${s}"></span>`),await i().then(a=>{if(a.result==="Success"){let l;"nochange"in a||(l=document.createElement("a"),l.target="_blank",l.href=mw.util.getUrl(`Special:Diff/${a.oldrevid?`${a.oldrevid}/`:""}${a.newrevid}`),l.textContent="diff");let d=document.querySelector(`#${s}`);l?d.append("(done, see ",l,")"):d.textContent="(done, no changes)"}}).catch(async(a,l)=>{a==="ratelimited"?(e.addLogEntry(`Rate limited. Waiting for 70 seconds... (resuming at ${new Date(Date.now()+7e4).toLocaleTimeString()})`,"warning"),await new Promise(d=>setTimeout(d,7e4)),e.addLogEntry("Continuing...","success"),await i().catch((d,c)=>{e.addLogEntry(`Error ${n.type==="edit"?"editing":"creating"} ${o.outerHTML}: ${c?.error?.info??"Unknown error"} (${d}).`,"error")})):e.addLogEntry(`Error ${n.type==="edit"?"editing":"creating"} ${o.outerHTML}: ${l?.error?.info??"Unknown error"} (${a}).`,"error")})}}allowTabClosure(){this.shouldStopTabClosure=!1}parseSubtypeRequests(e,t){throw new Error("Not implemented.")}loadSubtypeElements(e){throw new Error("Not implemented.")}updateRequestColor(e,t){throw new Error("Not implemented.")}async performSubtypeActions(e,t,n){throw new Error("Not implemented.")}};Object.assign(v.prototype,OO.ui.ProcessDialog.prototype)});var M,Y=x(()=>{"use strict";M=class{titleIndex;title;detailsElement;responderElement;dialog;templateParametersEditor;templateEditorsInfo=[];actionRadioInput;tagSelect;denyReasonInput;closingReasonDropdown;commentInput;tagSelectLayout;denyReasonLayout;closingReasonLayout;commentLayout;constructor(e,t,n,i,o){this.titleIndex=e,this.title=t,this.detailsElement=n,this.responderElement=i,this.dialog=o}setUp(){let e=document.createElement("div"),t=document.createElement("b");t.textContent=this.title,e.append(t),this.actionRadioInput=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(n=>new OO.ui.RadioOptionWidget({data:n.toLowerCase(),label:n}))}),this.actionRadioInput.selectItemByData("none"),this.actionRadioInput.on("choose",n=>{this.handleActionChange(n)}),this.loadCommentLayout(),e.append(this.actionRadioInput.$element[0],this.commentLayout.$element[0]),this.responderElement.append(e)}updateFromAction(e){switch(this.actionRadioInput.chooseItem(this.actionRadioInput.findItemFromData(e.action)),e.action){case"accept":{if(this.tagSelect.setValue(e.redirectTemplates??[]),e.redirectTemplates)for(let[t,n]of e.redirectTemplateParameters.entries()){if(!e.redirectTemplates.includes(n.name))continue;let i=this.templateEditorsInfo[t].parameters;for(let[o,s]of n.parameters.entries())i[o].editor.setValue(s.editor.getValue())}break}case"deny":{this.denyReasonInput.setValue(e.denyReason),this.denyReasonInput.getMenu().chooseItem(this.denyReasonInput.getMenu().findItemFromData(e.denyReason));break}case"close":{this.closingReasonDropdown.getMenu().chooseItem(this.closingReasonDropdown.getMenu().findItemFromData(e.closingReason.id));break}}this.commentInput.setValue(e.comment??"")}handleActionChange(e){setTimeout(()=>this.dialog.updateSize(),0);let t=e.getData();switch(this.updateActionsToTake({action:t}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex),this.tagSelectLayout&&this.tagSelectLayout.$element.hide(),this.templateParametersEditor&&(this.templateParametersEditor.style.display="none"),this.denyReasonLayout&&this.denyReasonLayout.$element.hide(),this.closingReasonLayout&&this.closingReasonLayout.$element.hide(),t){case"accept":{(!this.tagSelectLayout||!this.templateParametersEditor)&&this.loadTagSelectAndParametersEditor(),this.tagSelectLayout.$element.show(),this.templateParametersEditor.style.display="block";break}case"deny":{this.denyReasonLayout||this.loadDenyReasonLayout(),this.denyReasonLayout.$element.show();break}case"close":{this.closingReasonLayout||this.loadClosingReasonLayout(),this.closingReasonLayout.$element.show();break}}if(["accept","comment","close"].includes(t)){this.commentLayout.$element.show();let n=this.commentInput.getValue().trim();n?this.updateActionsToTake({comment:n}):this.updateActionsToTake({comment:void 0})}else this.commentLayout.$element.hide(),this.updateActionsToTake({comment:void 0})}loadTagSelectAndParametersEditor(){this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.dialog.redirectTemplates).map(([n,{redirect:i}])=>{if(!i)return{data:n,label:n};let o=new OO.ui.HtmlSnippet(`<span class="afcrc-helper-redirect-possibilities">${n}</span>`);return{data:n,label:o}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",n=>{let i=n.map(a=>a.getData()),o=i.toSorted((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));if(i.join(";")!==o.join(";")){let a=n.at(-1);this.tagSelect.reorder(a,o.indexOf(a.getData()))}this.updateActionsToTake({redirectTemplates:o});let s=0;for(let a of this.templateEditorsInfo){let l=o.includes(a.name);a.details.style.display=l?"block":"none",l&&s++}e.textContent=`Template parameters (${s>0?`for ${s} template${s>1?"s":""}`:"none to show"})`,t.style.display=s>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),this.commentLayout.$element[0].before(this.tagSelectLayout.$element[0]),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("afcrc-helper-template-parameters-container");let e=document.createElement("summary");e.textContent="Template parameters (none to show)",this.templateParametersEditor.append(e);for(let[n,i]of Object.entries(this.dialog.redirectTemplates)){let o=Object.entries(i.parameters);if(o.length===0)continue;let s=document.createElement("details");s.style.display="none";let a=document.createElement("summary");a.textContent=n,s.append(a);let l={name:n,details:s,parameters:[]};for(let[d,c]of o){let b=new OO.ui.TextInputWidget({placeholder:c.default?.toString(),required:c.required}),f=new OO.ui.FieldLayout(b,{label:new OO.ui.HtmlSnippet(`${d}${!c.label||d.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(f.$element[0]),l.parameters.push({name:d,aliases:c.aliases,editor:b})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(l)}this.updateActionsToTake({redirectTemplateParameters:this.templateEditorsInfo});let t=document.createElement("div");t.id="afcrc-helper-no-templates-message",t.textContent="No templates with parameters to display!",this.templateParametersEditor.append(t),this.commentLayout.$element[0].before(this.templateParametersEditor)}loadDenyReasonLayout(){this.denyReasonInput=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing pages"],["empty","empty submissions"],["notarget","nonexistent or no provided target"],["notitle","no title provided"],["unlikely","unlikely redirects"],["unrelated","apparently unrelated titles"],["notredirect","article creation requests"],["externallink","external link redirects"],["editrequest","edit requests"],["notenglish","requests not in English"]].map(([e,t])=>({data:`autofill:${e}`,label:`Autofilled text for ${t}`}))}),this.denyReasonInput.on("change",e=>{this.updateActionsToTake({denyReason:e||"autofill:unlikely"})}),this.denyReasonInput.setValue("autofill:unlikely"),this.denyReasonInput.getMenu().selectItemByData("autofill:unlikely"),this.denyReasonLayout=new OO.ui.FieldLayout(this.denyReasonInput,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'}),this.denyReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.denyReasonLayout.$element[0])}loadClosingReasonLayout(){this.closingReasonDropdown=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([e,t])=>new OO.ui.MenuOptionWidget({data:t,label:e}))}}),this.closingReasonDropdown.getMenu().on("choose",e=>{this.updateActionsToTake({closingReason:{name:e.getLabel(),id:e.getData()}}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex)}),this.closingReasonDropdown.getMenu().chooseItem(this.closingReasonDropdown.getMenu().findItemFromData("s")),this.closingReasonLayout=new OO.ui.FieldLayout(this.closingReasonDropdown,{align:"inline",label:"Closing reason:"}),this.closingReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.closingReasonLayout.$element[0])}loadCommentLayout(){this.commentInput=new OO.ui.TextInputWidget,this.commentInput.on("change",e=>{let t=e.trim();t?this.updateActionsToTake({comment:t}):this.updateActionsToTake({comment:void 0})}),this.commentLayout=new OO.ui.FieldLayout(this.commentInput,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"}),this.commentLayout.$element.hide()}updateActionsToTake(e){Object.assign(this.dialog.actionsToTake[this.titleIndex].requests[this.title],e)}}});var X={};J(X,{default:()=>B});var B,Z=x(()=>{"use strict";_();Y();B=class extends v{redirectTemplates;parsedRequests=[];actionsToTake=[];async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"});this.redirectTemplates=JSON.parse(e.query.pages[0]?.revisions?.[0]?.slots?.main?.content||"{}"),super.load()}parseSubtypeRequests(e,t){let n={},i=t.matchAll(/\[\[(.*?)]]/g).toArray().map(l=>l[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(i.length===0)return;n.pages=i;let o=/Target of redirect: ?\[\[(.*?)]]/.exec(e)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!o)return;n.target=o,n.reason=/reason: ?(.*?)\*source(?: \(if applicable\))?:/is.exec(e)?.[1].trim()??"",n.source=/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is.exec(e)?.[1].trim()??"";let s=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${n.source?`|${n.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),a=s?/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/.exec(s)?.[1].trim():null;n.requester=s&&a?{type:/\[\[User( talk)?:/.test(s)?"user":"ip",name:a}:null,this.parsedRequests.push(n),this.actionsToTake.push({target:n.target,requests:Object.fromEntries(i.map(l=>[l,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let i=document.createElement("summary");i.innerHTML=t.pages.map(u=>`<b>${u}</b>`).join(", ")+" \u2192 ",i.addEventListener("keyup",u=>{document.activeElement?.tagName==="INPUT"&&u.key===" "&&u.preventDefault()});let o=document.createElement("input");o.classList.add("afcrc-helper-target-editor"),o.style.width=`${t.target.length}ch`,o.value=t.target,o.addEventListener("input",()=>{o.value=o.value.replaceAll("_"," "),o.style.width=`${o.value.length}ch`,this.actionsToTake[e].target=o.value,s.href=mw.util.getUrl(o.value)}),i.append(o);let s=document.createElement("a");s.classList.add("afcrc-helper-external-link"),s.target="_blank",s.href=mw.util.getUrl(t.target),s.innerHTML=`
<svg viewbox="0 0 48 48">
<path d="M36 24c-1.2 0-2 0.8-2 2v12c0 1.2-0.8 2-2 2h-22c-1.2
    0-2-0.8-2-2v-22c0-1.2 0.8-2 2-2h12c1.2 0 2-0.8 2-2s-0.8-2-2-2h-12c-3.4
    0-6 2.6-6 6v22c0 3.4 2.6 6 6 6h22c3.4 0 6-2.6
    6-6v-12c0-1.2-0.8-2-2-2z"></path>
<path d="M43.8 5.2c-0.2-0.4-0.6-0.8-1-1-0.2-0.2-0.6-0.2-0.8-0.2h-12c-1.2
    0-2 0.8-2 2s0.8 2 2 2h7.2l-18.6 18.6c-0.8 0.8-0.8 2 0 2.8 0.4 0.4 0.8
    0.6 1.4 0.6s1-0.2 1.4-0.6l18.6-18.6v7.2c0 1.2 0.8 2 2 2s2-0.8
    2-2v-12c0-0.2 0-0.6-0.2-0.8z"></path>
</svg>`,i.append(s),n.append(i);let a=document.createElement("div");a.classList.add("afcrc-helper-request-info");let l=document.createElement("span");l.style.color="dimgray",l.textContent="None";let d=document.createElement("span");d.style.color="dimgray",d.textContent="Unknown";let c=document.createElement("div"),b=document.createElement("b");b.textContent="Reason: ",c.append(b),t.reason?c.append(t.reason):c.append(l.cloneNode(!0)),a.append(c);let f=document.createElement("div"),C=document.createElement("b");C.textContent="Source: ",f.append(C),t.source?f.append(t.source):f.append(l.cloneNode(!0)),a.append(f);let R=document.createElement("div"),k=document.createElement("b");if(k.textContent="Requester: ",R.append(k),t.requester){let u=document.createElement("a");u.target="_blank",u.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),u.textContent=t.requester.name,R.append(u)}else R.append(d.cloneNode(!0));a.append(R),n.append(a),n.append(document.createElement("hr"));let g=document.createElement("div");g.classList.add("afcrc-helper-request-responder");let p=[];if(t.pages.length>1){let u=new OO.ui.ButtonWidget({id:"afcrc-helper-sync-all-with-first-button",label:"Sync all requests with first",icon:"recentChanges"});u.on("click",()=>{let O=this.actionsToTake[e].requests[t.pages[0]];for(let[T,E]of p.entries())T!==0&&E.updateFromAction(O)}),g.append(u.$element[0])}for(let u of t.pages){let O=new M(e,u,n,g,this);O.setUp(),p.push(O)}n.append(g),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let n=Object.values(this.actionsToTake[t].requests),i=n.every(l=>l.action==="accept"||l.action==="deny"),o=n.find(l=>l.action==="close")?.closingReason?.id,s=n.every(l=>l.action==="close"&&l.closingReason?.id===o),a="";if(i){let l=n.filter(c=>c.action==="accept").length,d=n.filter(c=>c.action==="deny").length;l>0&&d>0?a="#fff17e":l>0?a="#a0ffa0":a="#ffcece"}else s&&(o==="r"?a="#ffcece":o==="s"?a="#90c090":a="#b8b8b8");e.style.backgroundColor=a}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(o=>Object.values(o.requests).some(s=>s.action!=="none"))){for(let{target:s,requests:a}of this.actionsToTake){let l=Object.values(a).some(p=>p.action==="accept"||p.action==="deny"),d=Object.values(a).every(p=>p.action==="accept"||p.action==="deny"),c=Object.values(a).find(p=>p.action==="close")?.closingReason?.id,b=Object.values(a).every(p=>p.action==="close"&&p.closingReason?.id===c),f=[],C=[],R=[],k=Object.keys(a).length;for(let[p,u]of Object.entries(a))switch(u.action){case"accept":{l&&!d?e.addLogEntry(`Not all requests to "${s}" were accepted or denied, the handling of "${p}" will be ignored.`,"warning"):(f.push(p),u.comment&&R.push([p,u.comment]),t.accepted++);break}case"deny":{l&&!d?e.addLogEntry(`Not all requests to "${s}" were accepted or denied, the handling of "${p}" is being ignored.`,"warning"):(C.push([p,u.denyReason]),t.denied++);break}case"comment":{u.comment?(R.push([p,u.comment]),t["commented on"]++):e.addLogEntry(`The request to create "${p}" \u2192 "${s}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{b?(u.comment&&R.push([p,u.comment]),t.closed++):e.addLogEntry(`Not all requests to "${s}" were closed with the same reason, the handling of "${p}" is being ignored.`,"warning");break}}let g={pageText:n,...Object.values(a)[0].originalText};if(R.length>0&&(g=this.modifySectionData(g,{append:this.mapComments(R,k===1,R.length===k)})),d){let p;if(f.length>0&&C.length>0){p="p";let u=`* {{subst:AfC redirect}} (${f.map(T=>`[[${T}]]`).join(", ")}) ~~~~`,O=this.mapDeniedReasons(C,!1,!1);for(let T of f)this.handleAcceptedRedirect(T,a[T],s);g=this.modifySectionData(g,{append:`${u}
${O}`})}else if(f.length>0){p="a";for(let u of f)this.handleAcceptedRedirect(u,a[u],s);g=this.modifySectionData(g,{append:`* {{subst:AfC redirect${f.length>1?"|all":""}}} ~~~~`})}else p="d",g=this.modifySectionData(g,{append:this.mapDeniedReasons(C,k===1,!0)});g=this.modifySectionData(g,{prepend:`{{AfC-c|${p}}}`,append:"{{AfC-c|b}}"})}else b&&(g=this.modifySectionData(g,{prepend:`{{AfC-c|${c}}}`,append:"{{AfC-c|b}}"}));n=g.pageText}if(this.beforeText+this.pageContent===n){e.addLogEntry("No requests have been handled (page content identical)!");return}let o=Object.entries(t).filter(([,s])=>s>0).map(([s,a])=>`${s} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC redirect requests (${o})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedRedirect(e,t,n){let i=t.redirectTemplates&&t.redirectTemplates.length>0?t.redirectTemplates.map(s=>{let a=t.redirectTemplateParameters?.find(c=>c.name===s);if(!a)return`{{${s}}}`;let l=a.parameters.findLastIndex((c,b)=>c.name===(b+1).toString()&&c.editor.getValue().trim()),d=a.parameters.map((c,b)=>{let f=c.editor.getValue().trim();return!f&&b>l?null:`|${c.name===(b+1).toString()?"":`${c.name}=`}${f}`}).filter(Boolean).join("");return`{{${s}${d}}}`}):null,o=mw.Title.newFromText(e);this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:o.getPrefixedText(),text:`#REDIRECT [[${n}]]${i?`

{{Redirect category shell|
${i.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${n}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:o.getTalkPage().getPrefixedText(),text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`})}}});var L,ee=x(()=>{"use strict";L=class extends OO.ui.TextInputWidget{api=new mw.Api;supportsSortKey;validCategories=new Set;constructor(e,t=!1){super(e),OO.ui.mixin.LookupElement.call(this,e),this.supportsSortKey=t}getLookupRequest=()=>{let e=this.getValue().split("|")[0],t=$.Deferred();if(e||t.resolve([]),this.supportsSortKey){let i=this.getValue().split("|")[1];if(i&&this.validCategories.has(e)){let o=[{data:`${e}|${i}`,label:`${e} (with sort key "${i}")`}];t.resolve(o),this.emit("showing-values",o)}}let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:n?.getMainText()??e,generator:"allpages",prop:"categories"}).catch(()=>null).then(i=>{if(i?.query?.pages){let o=i.query.pages.filter(s=>!s.categories?.some(a=>a.title==="Category:Wikipedia soft redirected categories")).map(s=>{let a=s.title.split(":")[1];return this.supportsSortKey&&this.validCategories.add(a),{data:a,label:a}});this.emit("showing-values",o),t.resolve(o)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(L.prototype,OO.ui.mixin.LookupElement.prototype)});var D,te=x(()=>{"use strict";D=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(e){super(e),OO.ui.mixin.LookupElement.call(this,e)}getLookupRequest=()=>{let e=this.getValue(),t=$.Deferred();e||t.resolve([]);let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:n?.getNamespaceId()??0,gapprefix:n?.getMainText()??e,generator:"allpages"}).catch(()=>null).then(i=>{if(i?.query?.pages){let o=i.query.pages.map(s=>({data:s.title,label:s.title}));this.emit("showing-values",o),t.resolve(o)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(D.prototype,OO.ui.mixin.LookupElement.prototype)});var ne={};J(ne,{default:()=>Q});var Q,ae=x(()=>{"use strict";ee();_();te();Q=class extends v{parsedRequests=[];actionsToTake=[];parseSubtypeRequests(e,t){let n={},i=/:?Category:(.*?)(]]|$)/.exec(t)?.[1].trim();if(!i)return;n.category=i.replaceAll("_"," "),n.examples=[...(/example pages which belong to this category:(.*?)(parent category\/categories:|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/\*\s*(?:\[\[)?(.*?)(\||]]|\s*?\n)/g)].map(d=>d[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean),n.parents=[...(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(d=>d[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);let o=e.indexOf("[[User:"),s=e.indexOf("[[User talk:"),a=e.indexOf("[[Special:Contributions/"),l=Math.min(...[o,s,a].filter(d=>d!==-1));n.requester=l===Number.POSITIVE_INFINITY?null:l===a?{type:"ip",name:/\[\[Special:Contributions\/(.*?)(\||]])/.exec(e)[1].trim()}:{type:"user",name:/\[\[User(?: talk)?:(.*?)(\||]])/.exec(e)[1].trim()},n.requester?.name||(n.requester=null),this.parsedRequests.push(n),this.actionsToTake.push({category:n.category,categorizedPages:n.examples,parents:n.parents,categoriesToRemove:[...n.parents],originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let i=document.createElement("summary");i.innerHTML=`<b>Category:${t.category}</b>`,n.append(i);let o=document.createElement("div");o.classList.add("afcrc-helper-request-info");let s=document.createElement("span");s.style.color="dimgray",s.textContent="None";let a=document.createElement("span");a.style.color="dimgray",a.textContent="Unknown";let l=document.createElement("div"),d=document.createElement("b");if(d.textContent="Examples: ",l.append(d),t.examples.length>0)for(let[r,m]of t.examples.entries()){let h=document.createElement("a");h.target="_blank",h.href=mw.util.getUrl(m),h.textContent=m,l.append(h),r!==t.examples.length-1&&l.append(", ")}else l.append(s.cloneNode(!0));o.append(l);let c=document.createElement("div"),b=document.createElement("b");if(b.textContent="Parents: ",c.append(b),t.parents.length>0)for(let[r,m]of t.parents.entries()){let h=document.createElement("a");h.target="_blank",h.href=mw.util.getUrl(`Category:${m}`),h.textContent=m,c.append(h),r!==t.parents.length-1&&c.append(", ")}else c.append(s.cloneNode(!0));o.append(c);let f=document.createElement("div"),C=document.createElement("b");if(C.textContent="Requester: ",f.append(C),t.requester){let r=document.createElement("a");r.target="_blank",r.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),r.textContent=t.requester.name,f.append(r)}else f.append(a.cloneNode(!0));o.append(f),n.append(o),n.append(document.createElement("hr"));let R=document.createElement("div");R.classList.add("afcrc-helper-request-responder");let k=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(r=>new OO.ui.RadioOptionWidget({data:r.toLowerCase(),label:r}))});k.selectItemByLabel("None"),k.on("choose",r=>{setTimeout(()=>this.updateSize(),0);let m=r.getData();if(this.actionsToTake[e].action=m,["comment","close"].includes(m)){z.$element.show();let h=V.getValue().trim();h?this.actionsToTake[e].comment=h:delete this.actionsToTake[e].comment}else z.$element.hide(),delete this.actionsToTake[e].comment;switch(this.updateRequestColor(n,e),O.$element.hide(),j.$element.hide(),N.$element.hide(),H.$element.hide(),U.$element.hide(),m){case"accept":{O.$element.show(),j.$element.show(),N.$element.show();break}case"deny":{H.$element.show();break}case"close":{U.$element.show();break}}});let g=new D({placeholder:"Add pages here"});g.on("change",()=>{let r=g.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^:/,""),r.length>0&&g.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),g.on("showing-values",r=>{for(let m of r)p.addAllowedValue(m.data)});let p=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:g});p.on("change",r=>{let m=r.map(w=>w.getData()),h=m.toSorted((w,I)=>w.toLowerCase().localeCompare(I.toLowerCase()));if(m.join(";")!==h.join(";")){let w=r.at(-1);p.reorder(w,h.indexOf(w.getData()))}this.actionsToTake[e].categorizedPages=h});let{categorizedPages:u}=this.actionsToTake[e];for(let r of u)p.addAllowedValue(r);p.setValue(u);let O=new OO.ui.FieldLayout(p,{align:"inline",label:"Pages to categorize:"});O.$element.hide();let T=new L({placeholder:"Add categories here"});T.on("change",()=>{let r=T.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^Category:/,""),r.length>0&&T.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),T.on("showing-values",r=>{for(let m of r)E.addAllowedValue(m.data)});let E=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:T});E.on("change",r=>{let m=r.map(w=>w.getData()),h=m.toSorted((w,I)=>w.toLowerCase().localeCompare(I.toLowerCase()));if(m.join(";")!==h.join(";")){let w=r.at(-1);E.reorder(w,h.indexOf(w.getData()))}this.actionsToTake[e].categoriesToRemove=h});let{parents:W}=this.actionsToTake[e];for(let r of W)E.addAllowedValue(r);E.setValue(W);let j=new OO.ui.FieldLayout(E,{align:"inline",label:"Categories to remove from pages to categorize:"});j.$element.hide();let q=new L({placeholder:"Add categories here"},!0);q.on("change",()=>{let r=q.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^Category:/,""),r.length>0&&q.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),q.on("showing-values",r=>{for(let m of r)A.addAllowedValue(m.data)});let A=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:q});A.on("change",r=>{let m=r.map(w=>w.getData()),h=m.toSorted((w,I)=>w.toLowerCase().localeCompare(I.toLowerCase()));if(m.join(";")!==h.join(";")){let w=r.at(-1);A.reorder(w,h.indexOf(w.getData()))}this.actionsToTake[e].parents=h});for(let r of W)A.addAllowedValue(r),q.validCategories.add(r);A.setValue(W);let N=new OO.ui.FieldLayout(A,{align:"inline",label:"Parent categories:"});N.$element.hide();let P=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing categories"],["empty","empty submissions"],["unlikely","categories that are unlikely to have enough pages"],["notcategory","page creation requests"],["notenglish","requests not in English"]].map(([r,m])=>({data:`autofill:${r}`,label:`Autofilled text for ${m}`}))});P.on("change",()=>{this.actionsToTake[e].denyReason=P.getValue()||"autofill:unlikely"}),P.setValue("autofill:unlikely"),P.getMenu().selectItemByData("autofill:unlikely");let H=new OO.ui.FieldLayout(P,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});H.$element.hide();let F=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([r,m])=>new OO.ui.MenuOptionWidget({data:m,label:r}))}});F.getMenu().on("choose",r=>{this.actionsToTake[e].closingReason={name:r.getLabel(),id:r.getData()},this.updateRequestColor(n,e)}),F.getMenu().chooseItem(F.getMenu().findItemFromData("s"));let U=new OO.ui.FieldLayout(F,{align:"inline",label:"Closing reason:"});U.$element.hide();let V=new OO.ui.TextInputWidget;V.on("change",()=>{let r=V.getValue().trim();r?this.actionsToTake[e].comment=r:delete this.actionsToTake[e].comment});let z=new OO.ui.FieldLayout(V,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});z.$element.hide(),R.append(k.$element[0],O.$element[0],j.$element[0],N.$element[0],H.$element[0],U.$element[0],z.$element[0]),n.append(R),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let{action:n}=this.actionsToTake[t],i="";n==="accept"?i="#a0ffa0":n==="deny"?i="#ffcece":n==="close"&&(this.actionsToTake[t].closingReason?.id==="r"?i="#ffcece":this.actionsToTake[t].closingReason?.id==="s"?i="#90c090":i="#b8b8b8"),e.style.backgroundColor=i}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(o=>o.action!=="none")){for(let s of this.actionsToTake){let a={pageText:n,...s.originalText};switch(s.action){case"accept":{a=this.modifySectionData(a,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(s),t.accepted++;break}case"deny":{a=this.modifySectionData(a,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(s.denyReason)} ~~~~
{{AfC-c|b}}`}),t.denied++;break}case"comment":{s.comment?(a=this.modifySectionData(a,{append:`* {{AfC comment|1=${s.comment}}} ~~~~`}),t["commented on"]++):e.addLogEntry(`The request to create "${s.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{a=this.modifySectionData(a,{prepend:`{{AfC-c|${s.closingReason.id}}}`,append:(s.comment?`* {{AfC comment|1=${s.comment}}} ~~~~`:"")+`
{{AfC-c|b}}`}),t.closed++;break}}n=a.pageText}if(this.beforeText+this.pageContent===n){e.addLogEntry("No requests have been handled (page content identical)!");return}let o=Object.entries(t).filter(([,s])=>s>0).map(([s,a])=>`${s} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC category requests (${o})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedCategory(e){this.editsCreationsToMake.push({type:"create",isRedirect:!1,title:`Category:${e.category}`,text:e.parents.map(t=>`[[Category:${t}]]`).join(`
`),summary:`Creating category as requested at [[WP:AFC/C]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:`Category talk:${e.category}`,text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`},...e.categorizedPages.map(t=>({type:"edit",title:t,transform:({content:n})=>{let i=!1;n=n.replace(/((\[\[:?[Cc]ategory:.+?]]\n?)+)/,o=>{i=!0;let s=o.endsWith(`
`);return`${o}${s?"":`
`}[[Category:${e.category}]]${s?`
`:""}`}),i||(n+=`
[[Category:${e.category}]]`);for(let o of e.categoriesToRemove)n=n.replaceAll(new RegExp(`\\[\\[:?[Cc]ategory:${o}(\\|.*?)?\\]\\]
?`,"gi"),"");return{text:n,summary:`Adding page to [[:Category:${e.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`}}})))}}});var K=`body.afcrc-helper-open #mw-teleport-target{z-index:500}.afcrc-helper-request{margin:10px;border-radius:5px;background-color:#eee;padding:5px;color:#202122}.afcrc-helper-request summary{cursor:pointer}.afcrc-helper-target-editor{min-width:1ch;max-width:calc(100% - 4ch);font-family:monospace}.afcrc-helper-external-link{-webkit-text-decoration:none!important;text-decoration:none!important}.afcrc-helper-external-link svg{display:inline-block;width:1em;height:1em;fill:currentcolor}.afcrc-helper-request-info,.afcrc-helper-request-responder{margin:5px}.afcrc-helper-request-info>div,.afcrc-helper-request-responder>div{margin-top:8px;margin-bottom:8px}.afcrc-helper-request-responder>div:last-of-type{margin-bottom:0}.afcrc-helper-request-responder .oo-ui-fieldLayout{margin-left:8px}.afcrc-helper-request-responder .oo-ui-fieldLayout-header{width:-moz-max-content;width:max-content}#afcrc-helper-sync-all-with-first-button{margin-bottom:5px}.afcrc-helper-action-radio{margin-top:8px}.afcrc-helper-action-radio .oo-ui-radioOptionWidget{display:inline;padding:8px}.afcrc-closing-reason-input,.afcrc-comment-input{max-width:50%}.afcrc-helper-redirect-possibilities:after{content:" (redirect with possibilities)";font-style:italic}.afcrc-helper-template-parameters-container,.afcrc-helper-template-parameters-container details{margin-top:10px;margin-bottom:10px;border:1px solid #a2a9b1;border-radius:2px;background-color:#fff;padding:5px}.afcrc-helper-template-parameters-container{margin-left:8px}.afcrc-helper-template-parameters-container summary{cursor:pointer;font-weight:700}.afcrc-helper-template-parameters-container details{margin-top:5px;margin-bottom:5px;background-color:#e2e2e2}.afcrc-helper-template-parameters-container details .oo-ui-fieldLayout-header{max-width:100%!important}#afcrc-helper-no-templates-message{padding:5px}.afcrc-helper-actions-container div{margin-top:8px;margin-bottom:8px}
`;mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],async()=>{let{default:y}=await Promise.resolve().then(()=>(Z(),X)),{default:e}=await Promise.resolve().then(()=>(ae(),ne)),t=mw.config.get("wgPageName").replaceAll("_"," "),n=t==="Wikipedia:Articles for creation/Redirects";if(!n&&!(t==="Wikipedia:Articles for creation/Categories"))return;let o=n?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${o} creation requests`,"afcrc-helper").addEventListener("click",a=>{a.preventDefault(),mw.util.addCSS(K);let l=new OO.ui.WindowManager;document.body.append(l.$element[0]);let d=o==="redirect"?y:e,c=new d(o,t,window.afcrcConfiguration?.createdPageWatchMethod);l.addWindows([c]),c.open(),c.load()})});})();

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvYWN0aW9ucy1kaWFsb2cudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvaGVscGVyLWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9yZWRpcmVjdC1yZXF1ZXN0LWhhbmRsZXIudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvcmVkaXJlY3RzLWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9jYXRlZ29yeS1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvcGFnZS1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvY2F0ZWdvcmllcy1kaWFsb2cudHMiLCAiLi4vc3R5bGVzL2FmY3JjLWhlbHBlci5jc3MiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvYWZjcmMtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSBIZWxwZXJEaWFsb2cgZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGFuIGFjdGlvbiBkaWFsb2cuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjdGlvbnNEaWFsb2cgZXh0ZW5kcyBPTy51aS5EaWFsb2cge1xuICAgIHByaXZhdGUgY29udGVudExheW91dCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgIHByaXZhdGUgbG9nT3V0cHV0ITogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBjbG9zZUJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcblxuICAgIHByaXZhdGUgaGVscGVyRGlhbG9nITogSGVscGVyRGlhbG9nO1xuXG4gICAgY29uc3RydWN0b3IoaGVscGVyRGlhbG9nOiBIZWxwZXJEaWFsb2cpIHtcbiAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWN0aW9uc0RpYWxvZyc7XG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0FjdGlvbnMnO1xuXG4gICAgICAgIHRoaXMuaGVscGVyRGlhbG9nID0gaGVscGVyRGlhbG9nO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICAgIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0aGlzLmxvZ091dHB1dCwgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9nRW50cnkobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBPTy51aS5NZXNzYWdlV2lkZ2V0LlR5cGUgPSAnbm90aWNlJykge1xuICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlLCBpbmxpbmU6IHRydWUsIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQobWVzc2FnZSkgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHk7XG5cbiAgICAgICAgYm9keUVsZW1lbnRbMF0uc2Nyb2xsVG8oeyB0b3A6IGJvZHlFbGVtZW50WzBdLnNjcm9sbEhlaWdodCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNsb3NlIGJ1dHRvbiBhbmQgYWRkcyBhIHJlbG9hZCBidXR0b24uXG4gICAgICovXG4gICAgcHVibGljIHNob3dSZWxvYWQoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uJGVsZW1lbnQucmVtb3ZlKCk7XG5cbiAgICAgICAgY29uc3QgcmVsb2FkQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnUmVsb2FkJywgZmxhZ3M6IFsncHJpbWFyeSddIH0pO1xuICAgICAgICByZWxvYWRCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oZWxwZXJEaWFsb2cuYWxsb3dUYWJDbG9zdXJlKCk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZChyZWxvYWRCdXR0b24uJGVsZW1lbnQpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihBY3Rpb25zRGlhbG9nLnByb3RvdHlwZSwgT08udWkuRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlFZGl0UGFnZVBhcmFtcywgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IE1lZGlhV2lraURhdGFFcnJvciwgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgQWN0aW9uc0RpYWxvZyBmcm9tICcuL2FjdGlvbnMtZGlhbG9nJztcbmltcG9ydCB0eXBlIHsgV2F0Y2hNZXRob2QgfSBmcm9tICcuL2FmY3JjLWhlbHBlcic7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFjdGlvbiB7XG4gICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc3RyaW5nOyBzZWN0aW9uVGV4dDogc3RyaW5nIH07XG4gICAgYWN0aW9uOiBSZXF1ZXN0QWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJvdGVjdGVkIHNjcmlwdE1lc3NhZ2UgPSAnIChbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL2FmY3JjLWhlbHBlcnxhZmNyYy1oZWxwZXJdXSknO1xuXG4gICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgIHByb3RlY3RlZCBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICBwcm90ZWN0ZWQgYmVmb3JlVGV4dCE6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHMhOiB1bmtub3duW107XG4gICAgcHJvdGVjdGVkIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgIHwgeyB0eXBlOiAnZWRpdCc7IHRpdGxlOiBzdHJpbmc7IHRyYW5zZm9ybTogKGRhdGE6IHsgY29udGVudDogc3RyaW5nIH0pID0+IEFwaUVkaXRQYWdlUGFyYW1zIH1cbiAgICAgICAgfCB7IHR5cGU6ICdjcmVhdGUnOyBpc1JlZGlyZWN0OiBib29sZWFuOyB0aXRsZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IHN1bW1hcnk6IHN0cmluZyB9XG4gICAgKVtdID0gW107XG5cbiAgICBwcml2YXRlIHNob3VsZFN0b3BUYWJDbG9zdXJlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3RQYWdlVHlwZTogJ3JlZGlyZWN0JyB8ICdjYXRlZ29yeScsIHBhZ2VUaXRsZTogc3RyaW5nLCBjcmVhdGVkV2F0Y2hNZXRob2Q6IFdhdGNoTWV0aG9kIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHN1cGVyKHsgc2l6ZTogJ2xhcmdlJyB9KTtcblxuICAgICAgICBIZWxwZXJEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWZjcmNIZWxwZXJEaWFsb2cnO1xuICAgICAgICBIZWxwZXJEaWFsb2cuc3RhdGljLnRpdGxlID0gJ2FmY3JjLWhlbHBlcic7XG4gICAgICAgIEhlbHBlckRpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9LFxuICAgICAgICAgICAgeyBhY3Rpb246ICdzYXZlJywgbGFiZWw6ICdSdW4nLCBmbGFnczogWydwcmltYXJ5JywgJ3Byb2dyZXNzaXZlJ10gfSxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UGFnZVR5cGUgPSByZXF1ZXN0UGFnZVR5cGU7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVkUGFnZVdhdGNoTWV0aG9kID1cbiAgICAgICAgICAgIGNyZWF0ZWRXYXRjaE1ldGhvZCAmJiBbJ25vY2hhbmdlJywgJ3ByZWZlcmVuY2VzJywgJ3Vud2F0Y2gnLCAnd2F0Y2gnXS5pbmNsdWRlcyhjcmVhdGVkV2F0Y2hNZXRob2QpXG4gICAgICAgICAgICAgICAgPyBjcmVhdGVkV2F0Y2hNZXRob2RcbiAgICAgICAgICAgICAgICA6ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItb3BlbicpO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCA+IDAgJiYgdGhpcy5zaG91bGRTdG9wVGFiQ2xvc3VyZSkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWFjdGlvbiB8fCBhY3Rpb24gPT09ICdjYW5jZWwnKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBPTy51aS5jb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xvc2U/IEFsbCBjaGFuZ2VzIHdpbGwgYmUgZGlzY2FyZGVkLicpLnRoZW4oKGNvbmZpcm1lZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRTdG9wVGFiQ2xvc3VyZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnBlcmZvcm1BY3Rpb25zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYWZjcmMtaGVscGVyLW9wZW4nKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSBwYWdlUmV2aXNpb24ucXVlcnkhLnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VSZXF1ZXN0cygpO1xuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlcXVlc3RzIGZyb20gdGhlIHBhZ2UgY29udGVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUmVxdWVzdHMoKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGV4dCA9IC9eKC4qPyk9PS9zLmV4ZWModGhpcy5wYWdlQ29udGVudCkhWzFdO1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSB0aGlzLnBhZ2VDb250ZW50LnJlcGxhY2UoL14uKj89PS9zLCAnPT0nKTtcblxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IFsuLi50aGlzLnBhZ2VDb250ZW50Lm1hdGNoQWxsKC9ePT0uKj89PSQoXFxzKig/IT09W149XSkuKikqL2dpbSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzBdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Nsb3NlZCA9IC97e2FmYy1jXFx8L2kudGVzdChzZWN0aW9uVGV4dCk7XG4gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gL149PSguKj8pPT0kL20uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgdGhpcy5wYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dCwgc2VjdGlvbkhlYWRlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hTaXplID0gNTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgYmF0Y2hTaXplLCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgYGFmY3JjLWhlbHBlciAobG9hZGluZyAke2luZGV4ICsgMX0tJHtlbmRJbmRleH0vJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMpYCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViSW5kZXggPSBpbmRleDsgc3ViSW5kZXggPCBlbmRJbmRleDsgc3ViSW5kZXgrKykgdGhpcy5sb2FkU3VidHlwZUVsZW1lbnRzKHN1YkluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKCR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzIGxvYWRlZClgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaGFuZGxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnbm90aWNlJywgbGFiZWw6ICdObyB2YWxpZCByZXF1ZXN0cyB0byBoYW5kbGUhJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgbWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChtZXNzYWdlV2lkZ2V0TGF5b3V0LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbGwgYWN0aW9ucyBhbmQgbG9ncyB0aGVpciByZXN1bHRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBhY3Rpb25zRGlhbG9nID0gbmV3IEFjdGlvbnNEaWFsb2codGhpcyk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbYWN0aW9uc0RpYWxvZ10pO1xuICAgICAgICBhY3Rpb25zRGlhbG9nLm9wZW4oKTtcblxuICAgICAgICBjb25zdCBjb3VudHMgPSB7ICdhY2NlcHRlZCc6IDAsICdkZW5pZWQnOiAwLCAnY29tbWVudGVkIG9uJzogMCwgJ2Nsb3NlZCc6IDAgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgICAgICBjb25zdCBuZXdQYWdlVGV4dCA9IChcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgKS5xdWVyeSEucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG5cbiAgICAgICAgdm9pZCB0aGlzLnBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhhY3Rpb25zRGlhbG9nLCBjb3VudHMsIG5ld1BhZ2VUZXh0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGEgcmVxdWVzdCBkZW5pYWwgcmVhc29uIHRvIGEge3tzdWJzdDpBZkMgcmVkaXJlY3QvY2F0ZWdvcnl9fSBjYWxsLlxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiB0byBmb3JtYXQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZvcm1hdERlbmllZFJlYXNvbihyZWFzb246IHN0cmluZykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcmFtZXRlcnMgPSByZWFzb24uc3RhcnRzV2l0aCgnYXV0b2ZpbGw6JykgPyAvYXV0b2ZpbGw6KFxcdyspLy5leGVjKHJlYXNvbikhWzFdIDogYGRlY2xpbmV8Mj0ke3JlYXNvbn1gO1xuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZWFzb25pbmcgPVxuICAgICAgICAgICAgcmVhc29uLnN0YXJ0c1dpdGgoJ2F1dG9maWxsOicpICYmIHJlYXNvbi5pbmNsdWRlcygnLCcpID8gJyAnICsgcmVhc29uLnNsaWNlKHJlYXNvbi5pbmRleE9mKCcsJykgKyAxKS50cmltKCkgOiAnJztcblxuICAgICAgICByZXR1cm4gYHt7c3Vic3Q6QWZDICR7dGhpcy5yZXF1ZXN0UGFnZVR5cGV9fCR7dGVtcGxhdGVQYXJhbWV0ZXJzfX19JHthZGRpdGlvbmFsUmVhc29uaW5nfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBhIGdyb3VwIG9mIGRlbmllZCByZWFzb25zLlxuICAgICAqIEBwYXJhbSBkZW5pZWRQYWdlcyBUaGUgcGFnZXMgdG8gbWFwLlxuICAgICAqIEBwYXJhbSBzaW5ndWxhclJlcXVlc3QgV2hldGhlciB0aGUgcmVxdWVzdCBpcyB0aGUgb25seSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBhbGxSZXF1ZXN0cyBXaGV0aGVyIGFsbCByZXF1ZXN0cyBhcmUgYmVpbmcgbWFwcGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGRlbmllZFBhZ2VzWzBdWzFdKX0gfn5+fmA7XG5cbiAgICAgICAgY29uc3QgcmVhc29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgcmVhc29uXSBvZiBkZW5pZWRQYWdlcykge1xuICAgICAgICAgICAgaWYgKCEocmVhc29uIGluIHJlYXNvbnMpKSByZWFzb25zW3JlYXNvbl0gPSBbXTtcbiAgICAgICAgICAgIHJlYXNvbnNbcmVhc29uXS5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVhc29uc0FycmF5ID0gT2JqZWN0LmVudHJpZXMocmVhc29ucyk7XG5cbiAgICAgICAgcmV0dXJuIHJlYXNvbnNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW3JlYXNvbiwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbil9JHtyZWFzb25zQXJyYXkubGVuZ3RoID4gMSB8fCAhYWxsUmVxdWVzdHMgPyBgICgke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pYCA6ICcnfSB+fn5+YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgY29tbWVudHMuXG4gICAgICogQHBhcmFtIGNvbW1lbnRzIFRoZSBjb21tZW50cyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcENvbW1lbnRzKGNvbW1lbnRzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50c1swXVsxXX19fSB+fn5+YDtcblxuICAgICAgICBjb25zdCBjb21tZW50TWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIGNvbW1lbnRdIG9mIGNvbW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAoIShjb21tZW50IGluIGNvbW1lbnRNZXNzYWdlcykpIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSA9IFtdO1xuICAgICAgICAgICAgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdLnB1c2gocGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tZW50c0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY29tbWVudE1lc3NhZ2VzKTtcblxuICAgICAgICByZXR1cm4gY29tbWVudHNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW2NvbW1lbnQsIHBhZ2VzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudH19fSR7Y29tbWVudHNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIGEgZ2l2ZW4gc2VjdGlvbiB0ZXh0IHdpdGggcHJlcGVuZGVkIGFuZCBhcHBlbmRlZCB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uRGF0YSBUaGUgc2VjdGlvbiBkYXRhLlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBwcmVwZW5kaW5nIGFuZCBhcHBlbmRpbmcgdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5wcmVwZW5kIFRoZSB0ZXh0IHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5hcHBlbmQgVGhlIHRleHQgdG8gYXBwZW5kIHRvIHRoZSBzZWN0aW9uIHRleHQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1vZGlmeVNlY3Rpb25EYXRhKFxuICAgICAgICBzZWN0aW9uRGF0YTogeyBwYWdlVGV4dDogc3RyaW5nIH0gJiBSZXF1ZXN0QWN0aW9uWydvcmlnaW5hbFRleHQnXSxcbiAgICAgICAgeyBwcmVwZW5kLCBhcHBlbmQgfTogeyBwcmVwZW5kPzogc3RyaW5nOyBhcHBlbmQ/OiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgeyBmdWxsU2VjdGlvblRleHQ6IG9sZEZ1bGxTZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IG9sZFNlY3Rpb25UZXh0IH0gPSBzZWN0aW9uRGF0YTtcblxuICAgICAgICBpZiAocHJlcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgPSBwcmVwZW5kICsgJ1xcbicgKyBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dDtcbiAgICAgICAgaWYgKGFwcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgKz0gJ1xcbicgKyBhcHBlbmQ7XG5cbiAgICAgICAgc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0ID0gc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0LnJlcGxhY2Uob2xkU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0KTtcblxuICAgICAgICBzZWN0aW9uRGF0YS5wYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0LnJlcGxhY2Uob2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQpO1xuXG4gICAgICAgIHJldHVybiBzZWN0aW9uRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbGwgZWRpdHMgYW5kIGNyZWF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWFkZS5cbiAgICAgKiBAcGFyYW0gYWN0aW9uc0RpYWxvZyBUaGUgZGlhbG9nIHRvIGxvZyB0aGUgcmVzdWx0cyB0by5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbWFrZUFsbEVkaXRzQ3JlYXRpb25zKGFjdGlvbnNEaWFsb2c6IEFjdGlvbnNEaWFsb2cpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFjdGlvbl0gb2YgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFwaUZ1bmN0aW9uID1cbiAgICAgICAgICAgICAgICBhY3Rpb24udHlwZSA9PT0gJ2VkaXQnXG4gICAgICAgICAgICAgICAgICAgID8gKCkgPT4gdGhpcy5hcGkuZWRpdChhY3Rpb24udGl0bGUsIGFjdGlvbi50cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIDogKCkgPT4gdGhpcy5hcGkuY3JlYXRlKGFjdGlvbi50aXRsZSwgeyBzdW1tYXJ5OiBhY3Rpb24uc3VtbWFyeSwgd2F0Y2hsaXN0OiB0aGlzLmNyZWF0ZWRQYWdlV2F0Y2hNZXRob2QgfSwgYWN0aW9uLnRleHQpO1xuXG4gICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGFjdGlvbi50aXRsZSwgJ2lzUmVkaXJlY3QnIGluIGFjdGlvbiAmJiBhY3Rpb24uaXNSZWRpcmVjdCA/IHsgcmVkaXJlY3Q6ICdubycgfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IGFjdGlvbi50aXRsZTtcblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uUmVzdWx0RWxlbWVudElkID0gYGFmY3JjLWhlbHBlci1hY3Rpb24tcmVzdWx0LSR7aW5kZXh9YDtcblxuICAgICAgICAgICAgYWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICBgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ0VkaXRpbmcnIDogJ0NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9Li4uIDxzcGFuIGlkPVwiJHthY3Rpb25SZXN1bHRFbGVtZW50SWR9XCI+PC9zcGFuPmAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgPT09ICdTdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCdub2NoYW5nZScgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNwZWNpYWw6RGlmZi8ke3Jlc3VsdC5vbGRyZXZpZCA/IGAke3Jlc3VsdC5vbGRyZXZpZH0vYCA6ICcnfSR7cmVzdWx0Lm5ld3JldmlkfWAsIC8vIG9sZHJldmlkIGlzIDAgb24gcGFnZSBjcmVhdGlvbnMsIGFuZCBpcyB0aHVzIHVubmVlZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9ICdkaWZmJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uUmVzdWx0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2FjdGlvblJlc3VsdEVsZW1lbnRJZH1gKSE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudCkgYWN0aW9uUmVzdWx0RWxlbWVudC5hcHBlbmQoJyhkb25lLCBzZWUgJywgbGlua0VsZW1lbnQsICcpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGFjdGlvblJlc3VsdEVsZW1lbnQudGV4dENvbnRlbnQgPSAnKGRvbmUsIG5vIGNoYW5nZXMpJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGFzeW5jIChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAncmF0ZWxpbWl0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBSYXRlIGxpbWl0ZWQuIFdhaXRpbmcgZm9yIDcwIHNlY29uZHMuLi4gKHJlc3VtaW5nIGF0ICR7bmV3IERhdGUoRGF0ZS5ub3coKSArIDcwXzAwMCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDcwXzAwMCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdDb250aW51aW5nLi4uJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24oKS5jYXRjaCgoZXJyb3JDb2RlLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnZWRpdGluZycgOiAnY3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH06ICR7KGVycm9ySW5mbyBhcyBNZWRpYVdpa2lEYXRhRXJyb3IpPy5lcnJvcj8uaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZSBhcyBzdHJpbmd9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIGJsb2NrIGFnYWluc3QgdGFiIGNsb3N1cmUuXG4gICAgICovXG4gICAgcHVibGljIGFsbG93VGFiQ2xvc3VyZSgpIHtcbiAgICAgICAgdGhpcy5zaG91bGRTdG9wVGFiQ2xvc3VyZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgcGFyc2VTdWJ0eXBlUmVxdWVzdHMoc2VjdGlvblRleHQ6IHN0cmluZywgc2VjdGlvbkhlYWRlcjogc3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgbG9hZFN1YnR5cGVFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXRcbiAgICBwcm90ZWN0ZWQgYXN5bmMgcGVyZm9ybVN1YnR5cGVBY3Rpb25zKGRpYWxvZzogQWN0aW9uc0RpYWxvZywgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+LCBuZXdQYWdlVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihIZWxwZXJEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0QWN0aW9uVHlwZSB9IGZyb20gJy4vaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgdHlwZSBSZWRpcmVjdHNEaWFsb2cgZnJvbSAnLi9yZWRpcmVjdHMtZGlhbG9nJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RBY3Rpb24gfSBmcm9tICcuL3JlZGlyZWN0cy1kaWFsb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyIHtcbiAgICBwcml2YXRlIHRpdGxlSW5kZXg6IG51bWJlcjtcbiAgICBwcml2YXRlIHRpdGxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHByaXZhdGUgcmVzcG9uZGVyRWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBkaWFsb2c6IFJlZGlyZWN0c0RpYWxvZztcblxuICAgIHByaXZhdGUgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yPzogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG5cbiAgICBwcml2YXRlIGFjdGlvblJhZGlvSW5wdXQhOiBPTy51aS5SYWRpb1NlbGVjdFdpZGdldDtcbiAgICBwcml2YXRlIHRhZ1NlbGVjdCE6IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICBwcml2YXRlIGRlbnlSZWFzb25JbnB1dCE6IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBjbG9zaW5nUmVhc29uRHJvcGRvd24hOiBPTy51aS5Ecm9wZG93bldpZGdldDtcbiAgICBwcml2YXRlIGNvbW1lbnRJbnB1dCE6IE9PLnVpLlRleHRJbnB1dFdpZGdldDtcblxuICAgIHByaXZhdGUgdGFnU2VsZWN0TGF5b3V0PzogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBkZW55UmVhc29uTGF5b3V0PzogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBjbG9zaW5nUmVhc29uTGF5b3V0PzogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBjb21tZW50TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgdGl0bGVJbmRleDogbnVtYmVyLFxuICAgICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgICBkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LFxuICAgICAgICByZXNwb25kZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICAgICAgZGlhbG9nOiBSZWRpcmVjdHNEaWFsb2csXG4gICAgKSB7XG4gICAgICAgIHRoaXMudGl0bGVJbmRleCA9IHRpdGxlSW5kZXg7XG4gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5kZXRhaWxzRWxlbWVudCA9IGRldGFpbHNFbGVtZW50O1xuICAgICAgICB0aGlzLnJlc3BvbmRlckVsZW1lbnQgPSByZXNwb25kZXJFbGVtZW50O1xuICAgICAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIHRoZSByZXF1ZXN0IGhhbmRsZXIsIGxvYWRpbmcgZWxlbWVudHMgaW50byB0aGUgRE9NLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRVcCgpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkVGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlO1xuICAgICAgICByZXF1ZXN0ZWRUaXRsZURpdi5hcHBlbmQobGFiZWwpO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgIGl0ZW1zOiBbJ0FjY2VwdCcsICdEZW55JywgJ0NvbW1lbnQnLCAnQ2xvc2UnLCAnTm9uZSddLm1hcChcbiAgICAgICAgICAgICAgICAobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLnRvTG93ZXJDYXNlKCksIGxhYmVsIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeURhdGEoJ25vbmUnKTtcblxuICAgICAgICB0aGlzLmFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsIChzZWxlY3RlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb25DaGFuZ2Uoc2VsZWN0ZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxvYWRDb21tZW50TGF5b3V0KCk7XG5cbiAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKHRoaXMuYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSwgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICB0aGlzLnJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKHJlcXVlc3RlZFRpdGxlRGl2KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlRnJvbUFjdGlvbihhY3Rpb246IFJlZGlyZWN0QWN0aW9uKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uUmFkaW9JbnB1dC5jaG9vc2VJdGVtKHRoaXMuYWN0aW9uUmFkaW9JbnB1dC5maW5kSXRlbUZyb21EYXRhKGFjdGlvbi5hY3Rpb24pIGFzIE9PLnVpLk9wdGlvbldpZGdldCk7XG5cbiAgICAgICAgc3dpdGNoIChhY3Rpb24uYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoYWN0aW9uLnJlZGlyZWN0VGVtcGxhdGVzID8/IFtdKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24ucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2VkaXRvckluZGV4LCB0ZW1wbGF0ZV0gb2YgYWN0aW9uLnJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzIS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWN0aW9uLnJlZGlyZWN0VGVtcGxhdGVzLmluY2x1ZGVzKHRlbXBsYXRlLm5hbWUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhcmFtZXRlcnMgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm9bZWRpdG9ySW5kZXhdLnBhcmFtZXRlcnM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlckluZGV4LCBuZXdQYXJhbWV0ZXJdIG9mIHRlbXBsYXRlLnBhcmFtZXRlcnMuZW50cmllcygpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJhbWV0ZXJzW3BhcmFtZXRlckluZGV4XS5lZGl0b3Iuc2V0VmFsdWUobmV3UGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVueVJlYXNvbklucHV0LnNldFZhbHVlKGFjdGlvbi5kZW55UmVhc29uISk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZW55UmVhc29uSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgLmdldE1lbnUoKVxuICAgICAgICAgICAgICAgICAgICAuY2hvb3NlSXRlbSh0aGlzLmRlbnlSZWFzb25JbnB1dC5nZXRNZW51KCkuZmluZEl0ZW1Gcm9tRGF0YShhY3Rpb24uZGVueVJlYXNvbiEpIGFzIE9PLnVpLk9wdGlvbldpZGdldCk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgIC5nZXRNZW51KClcbiAgICAgICAgICAgICAgICAgICAgLmNob29zZUl0ZW0odGhpcy5jbG9zaW5nUmVhc29uRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRJdGVtRnJvbURhdGEoYWN0aW9uLmNsb3NpbmdSZWFzb24hLmlkKSBhcyBPTy51aS5PcHRpb25XaWRnZXQpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbW1lbnRJbnB1dC5zZXRWYWx1ZShhY3Rpb24uY29tbWVudCA/PyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3Igc2VsZWN0ZWQgYWN0aW9uIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIHNlbGVjdGVkIFRoZSBuZXcgc2VsZWN0ZWQgb3B0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFuZGxlQWN0aW9uQ2hhbmdlKHNlbGVjdGVkOiBPTy51aS5PcHRpb25XaWRnZXQpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpYWxvZy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHNlbGVjdGVkLmdldERhdGEoKSBhcyBSZXF1ZXN0QWN0aW9uVHlwZTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBhY3Rpb246IG9wdGlvbiB9KTtcblxuICAgICAgICB0aGlzLmRpYWxvZy51cGRhdGVSZXF1ZXN0Q29sb3IodGhpcy5kZXRhaWxzRWxlbWVudCwgdGhpcy50aXRsZUluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy50YWdTZWxlY3RMYXlvdXQpIHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKSB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGlmICh0aGlzLmRlbnlSZWFzb25MYXlvdXQpIHRoaXMuZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQpIHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGFnU2VsZWN0TGF5b3V0IHx8ICF0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcikgdGhpcy5sb2FkVGFnU2VsZWN0QW5kUGFyYW1ldGVyc0VkaXRvcigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQhLiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciEuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlbnlSZWFzb25MYXlvdXQpIHRoaXMubG9hZERlbnlSZWFzb25MYXlvdXQoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVueVJlYXNvbkxheW91dCEuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCkgdGhpcy5sb2FkQ2xvc2luZ1JlYXNvbkxheW91dCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0IS4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChbJ2FjY2VwdCcsICdjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWVudCkgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudCB9KTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIHRhZyBzZWxlY3QgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnMgZWRpdG9ycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRUYWdTZWxlY3RBbmRQYXJhbWV0ZXJzRWRpdG9yKCkge1xuICAgICAgICB0aGlzLnRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5lbnRyaWVzKHRoaXMuZGlhbG9nLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKFt0YWcsIHsgcmVkaXJlY3QgfV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0KSByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBjbGFzcz1cImFmY3JjLWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzXCI+JHt0YWd9PC9zcGFuPmApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbCB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICAodGhpcy50YWdTZWxlY3QuZ2V0TWVudSgpIGFzIE9PLnVpLk1lbnVTZWxlY3RXaWRnZXQuQ29uZmlnT3B0aW9ucykuZmlsdGVyTW9kZSA9ICdzdWJzdHJpbmcnO1xuICAgICAgICB0aGlzLnRhZ1NlbGVjdC5vbignY2hhbmdlJywgKHNlbGVjdGVkRWxlbWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGFncyA9IHNlbGVjdGVkRWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gc2VsZWN0ZWRUYWdzLnRvU29ydGVkKChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGFncy5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLmF0KC0xKSBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkRyYWdnYWJsZUVsZW1lbnQgJiBPTy51aS5FbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkVGFncy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgcmVkaXJlY3RUZW1wbGF0ZXM6IHNvcnRlZFRhZ3MgfSk7XG5cbiAgICAgICAgICAgIGxldCBzaG93blRlbXBsYXRlRWRpdG9ycyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNUYWdTZWxlY3RlZCA9IHNvcnRlZFRhZ3MuaW5jbHVkZXMoZWRpdG9ySW5mby5uYW1lKTtcblxuICAgICAgICAgICAgICAgIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gaXNUYWdTZWxlY3RlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNUYWdTZWxlY3RlZCkgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSBgVGVtcGxhdGUgcGFyYW1ldGVycyAoJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyBgZm9yICR7c2hvd25UZW1wbGF0ZUVkaXRvcnN9IHRlbXBsYXRlJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDEgPyAncycgOiAnJ31gIDogJ25vbmUgdG8gc2hvdyd9KWA7XG5cbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy50YWdTZWxlY3QsIHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLXRhZy1zZWxlY3QtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IHRlbXBsYXRlczonLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC50ZXh0Q29udGVudCA9ICdUZW1wbGF0ZSBwYXJhbWV0ZXJzIChub25lIHRvIHNob3cpJztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5kaWFsb2cucmVkaXJlY3RUZW1wbGF0ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgIHN1bW1hcnkudGV4dENvbnRlbnQgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGE6IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gPSB7IG5hbWU6IHRlbXBsYXRlTmFtZSwgZGV0YWlscywgcGFyYW1ldGVyczogW10gfTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhcmFtZXRlck5hbWV9JHshcGFyYW1ldGVyRGF0YS5sYWJlbCB8fCBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcmFtZXRlckRhdGEubGFiZWwudG9Mb3dlckNhc2UoKSA/ICcnIDogYCAoJHtwYXJhbWV0ZXJEYXRhLmxhYmVsfSlgfSR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbiA/IGAgKCR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbn0pYCA6ICcnfSAodHlwZTogJHtwYXJhbWV0ZXJEYXRhLnR5cGV9KSAke3BhcmFtZXRlckRhdGEuc3VnZ2VzdGVkID8gJyAoc3VnZ2VzdGVkKScgOiAnJ30ke3BhcmFtZXRlckRhdGEuZXhhbXBsZSA/IGAgKGV4YW1wbGU6IFwiJHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGV9XCIpYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChpbnB1dExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgcmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM6IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbyB9KTtcblxuICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcblxuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQobm9UZW1wbGF0ZXNNZXNzYWdlKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgZGVueSByZWFzb24gbGF5b3V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZERlbnlSZWFzb25MYXlvdXQoKSB7XG4gICAgICAgIHRoaXMuZGVueVJlYXNvbklucHV0ID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgcGFnZXMnXSxcbiAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgWydub3RhcmdldCcsICdub25leGlzdGVudCBvciBubyBwcm92aWRlZCB0YXJnZXQnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGl0bGUnLCAnbm8gdGl0bGUgcHJvdmlkZWQnXSxcbiAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ3VubGlrZWx5IHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgIFsndW5yZWxhdGVkJywgJ2FwcGFyZW50bHkgdW5yZWxhdGVkIHRpdGxlcyddLFxuICAgICAgICAgICAgICAgIFsnbm90cmVkaXJlY3QnLCAnYXJ0aWNsZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnZXh0ZXJuYWxsaW5rJywgJ2V4dGVybmFsIGxpbmsgcmVkaXJlY3RzJ10sXG4gICAgICAgICAgICAgICAgWydlZGl0cmVxdWVzdCcsICdlZGl0IHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlbnlSZWFzb25JbnB1dC5vbignY2hhbmdlJywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBkZW55UmVhc29uOiB2YWx1ZSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlbnlSZWFzb25JbnB1dC5zZXRWYWx1ZSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcbiAgICAgICAgdGhpcy5kZW55UmVhc29uSW5wdXQuZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuZGVueVJlYXNvbklucHV0LCB7XG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RlbnkgcmVhc29uOicsXG4gICAgICAgICAgICBoZWxwOiAnU3VwcG9ydHMgYXV0b21hdGljIHJlYXNvbmluZywgY3VzdG9tIHJlYXNvbmluZywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIHdpdGggXCJhdXRvZmlsbDpSRUFTT04sIENVU1RPTVwiIGZvcm1hdCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy5kZW55UmVhc29uTGF5b3V0LiRlbGVtZW50WzBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgY2xvc2luZyByZWFzb24gbGF5b3V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZENsb3NpbmdSZWFzb25MYXlvdXQoKSB7XG4gICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkRyb3Bkb3duID0gbmV3IE9PLnVpLkRyb3Bkb3duV2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIG1lbnU6IHtcbiAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgWydTdWNjZWVkZWQnLCAncyddLFxuICAgICAgICAgICAgICAgICAgICBbJ1dpdGhkcmF3bicsICd3J10sXG4gICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uRHJvcGRvd24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNsb3NpbmdSZWFzb246IHsgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nIH0gfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLnVwZGF0ZVJlcXVlc3RDb2xvcih0aGlzLmRldGFpbHNFbGVtZW50LCB0aGlzLnRpdGxlSW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25Ecm9wZG93bi5nZXRNZW51KCkuY2hvb3NlSXRlbSh0aGlzLmNsb3NpbmdSZWFzb25Ecm9wZG93bi5nZXRNZW51KCkuZmluZEl0ZW1Gcm9tRGF0YSgncycpIGFzIE9PLnVpLk9wdGlvbldpZGdldCk7XG5cbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY2xvc2luZ1JlYXNvbkRyb3Bkb3duLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgY29tbWVudCBsYXlvdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkQ29tbWVudExheW91dCgpIHtcbiAgICAgICAgdGhpcy5jb21tZW50SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50SW5wdXQub24oJ2NoYW5nZScsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQgfSk7XG4gICAgICAgICAgICBlbHNlIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuY29tbWVudElucHV0LCB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNvbW1lbnQtaW5wdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnQ29tbWVudDonLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgcmVxdWVzdCdzIGFjdGlvbnMgZGF0YS5cbiAgICAgKiBAcGFyYW0gdXBkYXRlIFRoZSB1cGRhdGVzIHRvIG1ha2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVBY3Rpb25zVG9UYWtlKHVwZGF0ZTogUGFydGlhbDxSZWRpcmVjdEFjdGlvbj4pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRpYWxvZy5hY3Rpb25zVG9UYWtlW3RoaXMudGl0bGVJbmRleF0ucmVxdWVzdHNbdGhpcy50aXRsZV0sIHVwZGF0ZSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdFRlbXBsYXRlRGF0YSwgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB9IGZyb20gJy4uL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcbmltcG9ydCB0eXBlIEFjdGlvbnNEaWFsb2cgZnJvbSAnLi9hY3Rpb25zLWRpYWxvZyc7XG5pbXBvcnQgSGVscGVyRGlhbG9nLCB7IHR5cGUgUmVxdWVzdEFjdGlvbiwgdHlwZSBSZXF1ZXN0UmVxdWVzdGVyIH0gZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcbmltcG9ydCBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyIGZyb20gJy4vcmVkaXJlY3QtcmVxdWVzdC1oYW5kbGVyJztcblxuaW50ZXJmYWNlIFJlZGlyZWN0UmVxdWVzdERhdGEge1xuICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICB0YXJnZXQ6IHN0cmluZztcbiAgICByZWFzb246IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByZXF1ZXN0ZXI6IFJlcXVlc3RSZXF1ZXN0ZXI7XG59XG5cbmV4cG9ydCB0eXBlIFJlZGlyZWN0QWN0aW9uID0gUmVxdWVzdEFjdGlvbiAmIHsgcmVkaXJlY3RUZW1wbGF0ZXM/OiBzdHJpbmdbXTsgcmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM/OiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gfTtcblxudHlwZSBSZWRpcmVjdEFjdGlvbnMgPSB7IHRhcmdldDogc3RyaW5nOyByZXF1ZXN0czogUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+IH1bXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RzRGlhbG9nIGV4dGVuZHMgSGVscGVyRGlhbG9nIHtcbiAgICBwdWJsaWMgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgIHByb3RlY3RlZCBwYXJzZWRSZXF1ZXN0czogUmVkaXJlY3RSZXF1ZXN0RGF0YVtdID0gW107XG4gICAgcHVibGljIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBlbGVtZW50cyBpbiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCByZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdDtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZS5xdWVyeSEucGFnZXNbMF0/LnJldmlzaW9ucz8uWzBdPy5zbG90cz8ubWFpbj8uY29udGVudCB8fCAne30nLFxuICAgICAgICApIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgICAgIHZvaWQgc3VwZXIubG9hZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZWRpcmVjdCByZXF1ZXN0cyBmcm9tIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRlciBUaGUgc2VjdGlvbiBoZWFkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZWRQYWdlcyA9IHNlY3Rpb25IZWFkZXJcbiAgICAgICAgICAgIC5tYXRjaEFsbCgvXFxbXFxbKC4qPyldXS9nKVxuICAgICAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRQYWdlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBwYXJzZWREYXRhLnBhZ2VzID0gcmVxdWVzdGVkUGFnZXM7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGFyZ2V0ID0gL1RhcmdldCBvZiByZWRpcmVjdDogP1xcW1xcWyguKj8pXV0vLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICBpZiAoIXBhcnNlZFRhcmdldCkgcmV0dXJuO1xuXG4gICAgICAgIHBhcnNlZERhdGEudGFyZ2V0ID0gcGFyc2VkVGFyZ2V0O1xuXG4gICAgICAgIHBhcnNlZERhdGEucmVhc29uID0gL3JlYXNvbjogPyguKj8pXFwqc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzovaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXS50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5zb3VyY2UgPSAvc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzogPyguKj8pKD86PHJlZmVyZW5jZXMgXFwvPnxcXG5cXG4pL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlciA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgc2VjdGlvblRleHQuaW5jbHVkZXMoJzxyZWZlcmVuY2VzIC8+JylcbiAgICAgICAgICAgICAgICAgICAgPyAvPHJlZmVyZW5jZXMgXFwvPlxcbisoLiopL1xuICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAoPzo8cmVmZXJlbmNlcyBcXFxcLz4ke3BhcnNlZERhdGEuc291cmNlID8gYHwke3BhcnNlZERhdGEuc291cmNlLnJlcGxhY2VBbGwoL1tcXHMjJCgpKissLj9bXFxcXFxcXV57fH0tXS9nLCAnXFxcXCQmJyl9YCA6ICcnfSlcXG4rKC4qKWAsXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk/LlsxXVxuICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICBjb25zdCBuYW1lID0gcmVxdWVzdGVyID8gLyg/OlNwZWNpYWw6Q29udHJpYnV0aW9uc1xcL3xVc2VyKD86IHRhbGspPzopKC4qPylcXHwvLmV4ZWMocmVxdWVzdGVyKT8uWzFdLnRyaW0oKSA6IG51bGw7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPSByZXF1ZXN0ZXIgJiYgbmFtZSA/IHsgdHlwZTogL1xcW1xcW1VzZXIoIHRhbGspPzovLnRlc3QocmVxdWVzdGVyKSA/ICd1c2VyJyA6ICdpcCcsIG5hbWUgfSA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5wYXJzZWRSZXF1ZXN0cy5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZS5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogcGFyc2VkRGF0YS50YXJnZXQsXG4gICAgICAgICAgICByZXF1ZXN0czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBhZ2VzLm1hcCgocGFnZSkgPT4gW1xuICAgICAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZ2l2ZW4gcmVkaXJlY3QgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkU3VidHlwZUVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdO1xuXG4gICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gcmVxdWVzdC5wYWdlcy5tYXAoKHBhZ2UpID0+IGA8Yj4ke3BhZ2V9PC9iPmApLmpvaW4oJywgJykgKyAnIFx1MjE5MiAnO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZXZlbnQua2V5ID09PSAnICcpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldEVkaXRvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9yJyk7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXF1ZXN0LnRhcmdldC5sZW5ndGh9Y2hgO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gcmVxdWVzdC50YXJnZXQ7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RhcmdldEVkaXRvckVsZW1lbnQudmFsdWUubGVuZ3RofWNoYDtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS50YXJnZXQgPSB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwodGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZCh0YXJnZXRFZGl0b3JFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGlua0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsnKTtcbiAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChyZXF1ZXN0LnRhcmdldCk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlubmVySFRNTCA9IGBcbjxzdmcgdmlld2JveD1cIjAgMCA0OCA0OFwiPlxuPHBhdGggZD1cIk0zNiAyNGMtMS4yIDAtMiAwLjgtMiAydjEyYzAgMS4yLTAuOCAyLTIgMmgtMjJjLTEuMlxuICAgIDAtMi0wLjgtMi0ydi0yMmMwLTEuMiAwLjgtMiAyLTJoMTJjMS4yIDAgMi0wLjggMi0ycy0wLjgtMi0yLTJoLTEyYy0zLjRcbiAgICAwLTYgMi42LTYgNnYyMmMwIDMuNCAyLjYgNiA2IDZoMjJjMy40IDAgNi0yLjZcbiAgICA2LTZ2LTEyYzAtMS4yLTAuOC0yLTItMnpcIj48L3BhdGg+XG48cGF0aCBkPVwiTTQzLjggNS4yYy0wLjItMC40LTAuNi0wLjgtMS0xLTAuMi0wLjItMC42LTAuMi0wLjgtMC4yaC0xMmMtMS4yXG4gICAgMC0yIDAuOC0yIDJzMC44IDIgMiAyaDcuMmwtMTguNiAxOC42Yy0wLjggMC44LTAuOCAyIDAgMi44IDAuNCAwLjQgMC44XG4gICAgMC42IDEuNCAwLjZzMS0wLjIgMS40LTAuNmwxOC42LTE4LjZ2Ny4yYzAgMS4yIDAuOCAyIDIgMnMyLTAuOFxuICAgIDItMnYtMTJjMC0wLjIgMC0wLjYtMC4yLTAuOHpcIj48L3BhdGg+XG48L3N2Zz5gO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8nKTtcblxuICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIG5vbmVFbGVtZW50LnRleHRDb250ZW50ID0gJ05vbmUnO1xuXG4gICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgdW5rbm93bkVsZW1lbnQudGV4dENvbnRlbnQgPSAnVW5rbm93bic7XG5cbiAgICAgICAgY29uc3QgcmVhc29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVhc29uTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlYXNvbkxhYmVsLnRleHRDb250ZW50ID0gJ1JlYXNvbjogJztcbiAgICAgICAgcmVhc29uRGl2LmFwcGVuZChyZWFzb25MYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVhc29uKSByZWFzb25EaXYuYXBwZW5kKHJlcXVlc3QucmVhc29uKTtcbiAgICAgICAgZWxzZSByZWFzb25EaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZWFzb25EaXYpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBzb3VyY2VMYWJlbC50ZXh0Q29udGVudCA9ICdTb3VyY2U6ICc7XG4gICAgICAgIHNvdXJjZURpdi5hcHBlbmQoc291cmNlTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnNvdXJjZSkgc291cmNlRGl2LmFwcGVuZChyZXF1ZXN0LnNvdXJjZSk7XG4gICAgICAgIGVsc2Ugc291cmNlRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoc291cmNlRGl2KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID1cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgfSBlbHNlIHJlcXVlc3RlckRpdi5hcHBlbmQodW5rbm93bkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJykpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzOiBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyW10gPSBbXTtcblxuICAgICAgICBpZiAocmVxdWVzdC5wYWdlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RpZnlBbGxCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBpZDogJ2FmY3JjLWhlbHBlci1zeW5jLWFsbC13aXRoLWZpcnN0LWJ1dHRvbicsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdTeW5jIGFsbCByZXF1ZXN0cyB3aXRoIGZpcnN0JyxcbiAgICAgICAgICAgICAgICBpY29uOiAncmVjZW50Q2hhbmdlcycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZGlmeUFsbEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0LnBhZ2VzWzBdXTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBoYW5kbGVyXSBvZiBoYW5kbGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnVwZGF0ZUZyb21BY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKG1vZGlmeUFsbEJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZFRpdGxlIG9mIHJlcXVlc3QucGFnZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgUmVkaXJlY3RSZXF1ZXN0SGFuZGxlcihpbmRleCwgcmVxdWVzdGVkVGl0bGUsIGRldGFpbHNFbGVtZW50LCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGhhbmRsZXIuc2V0VXAoKTtcblxuICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCk7XG5cbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xvciBvZiBhIGRldGFpbHMgZWxlbWVudCBiYXNlZCBvbiB0aGUgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3RzIGluc2lkZS5cbiAgICAgKiBAcGFyYW0gZGV0YWlsc0VsZW1lbnQgVGhlIGRldGFpbHMgZWxlbWVudCB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVkaXJlY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBhY3Rpb25zVG9UYWtlID0gT2JqZWN0LnZhbHVlcyh0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLnJlcXVlc3RzKTtcblxuICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gYWN0aW9uc1RvVGFrZS5ldmVyeSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0Q2xvc2VSZWFzb24gPSBhY3Rpb25zVG9UYWtlLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoXG4gICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbixcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkQ291bnQgPSBhY3Rpb25zVG9UYWtlLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JykubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZGVuaWVkQ291bnQgPSBhY3Rpb25zVG9UYWtlLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKGFjY2VwdGVkQ291bnQgPiAwICYmIGRlbmllZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNmZmYxN2UnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYWNjZXB0ZWRDb3VudCA+IDApIGJhY2tncm91bmRDb2xvciA9ICcjYTBmZmEwJztcbiAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgaWYgKGZpcnN0Q2xvc2VSZWFzb24gPT09ICdyJykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgZWxzZSBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3MnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnIzkwYzA5MCc7XG4gICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYWN0aW9ucyBvbiBhIGdpdmVuIGNhdGVnb3J5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBhZGQgbWVzc2FnZXMgdG8uXG4gICAgICogQHBhcmFtIGNvdW50cyBUaGUgY291bnQgb2JqZWN0IHVzZWQgdG8gdHJhY2sgcmVxdWVzdHMgZm9yIHRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICogQHBhcmFtIG5ld1BhZ2VUZXh0IFRoZSBuZXcgcGFnZSB0ZXh0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBwZXJmb3JtU3VidHlwZUFjdGlvbnMoYWN0aW9uc0RpYWxvZzogQWN0aW9uc0RpYWxvZywgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+LCBuZXdQYWdlVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGFueVJlcXVlc3RIYW5kbGVkID0gdGhpcy5hY3Rpb25zVG9UYWtlLnNvbWUoKGFjdGlvbkRhdGEpID0+XG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGFjdGlvbkRhdGEucmVxdWVzdHMpLnNvbWUoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiAhPT0gJ25vbmUnKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYW55UmVxdWVzdEhhbmRsZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0YXJnZXQsIHJlcXVlc3RzIH0gb2YgdGhpcy5hY3Rpb25zVG9UYWtlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsb3NlUmVhc29uID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNDbG9zZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyAmJiBhY3Rpb24uY2xvc2luZ1JlYXNvbj8uaWQgPT09IGZpcnN0Q2xvc2VSZWFzb24sXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZW5pZWRQYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzID0gW107XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbW91bnRPZlBhZ2VzID0gT2JqZWN0LmtleXMocmVxdWVzdHMpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVlc3RzKSlcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgJiYgIWFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZFBhZ2VzLnB1c2gocmVxdWVzdGVkVGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgJiYgIWFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuaWVkUGFnZXMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5kZW55UmVhc29uIV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuZGVuaWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgXHUyMTkyIFwiJHt0YXJnZXR9XCIgd2FzIG1hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZCBzbyBpdCB3aWxsIGJlIHNraXBwZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBjbG9zZWQgd2l0aCB0aGUgc2FtZSByZWFzb24sIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbkRhdGEgPSB7IHBhZ2VUZXh0OiBuZXdQYWdlVGV4dCwgLi4uT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cylbMF0ub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IHRoaXMubWFwQ29tbWVudHMoY29tbWVudHMsIGFtb3VudE9mUGFnZXMgPT09IDEsIGNvbW1lbnRzLmxlbmd0aCA9PT0gYW1vdW50T2ZQYWdlcyksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NpbmdJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDAgJiYgZGVuaWVkUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ3AnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzTWVzc2FnZSA9IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0fX0gKCR7YWNjZXB0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KSB+fn5+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZFBhZ2VzTWVzc2FnZSA9IHRoaXMubWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlcywgZmFsc2UsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGFjY2VwdGVkUGFnZXMpIHRoaXMuaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlLCByZXF1ZXN0c1twYWdlXSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgJHthY2NlcHRlZFBhZ2VzTWVzc2FnZX1cXG4ke2RlbmllZFBhZ2VzTWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAnYSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCoge3tzdWJzdDpBZkMgcmVkaXJlY3Qke2FjY2VwdGVkUGFnZXMubGVuZ3RoID4gMSA/ICd8YWxsJyA6ICcnfX19IH5+fn5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAnZCc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBhbW91bnRPZlBhZ2VzID09PSAxLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IHByZXBlbmQ6IGB7e0FmQy1jfCR7Y2xvc2luZ0lkfX19YCwgYXBwZW5kOiAne3tBZkMtY3xifX0nIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHtmaXJzdENsb3NlUmVhc29ufX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogJ3t7QWZDLWN8Yn19JyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEhhbmRsaW5nIEFmQyByZWRpcmVjdCByZXF1ZXN0cyAoJHttYXBwZWRDb3VudHN9KSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoYWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0FsbCBjaGFuZ2VzIG1hZGUsIGNsaWNrIGJlbG93IHRvIHJlbG9hZCEnLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICBhY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHBhZ2VzIHJlbGF0ZWQgdG8gYW4gYWNjZXB0ZWQgcmVkaXJlY3QgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvZiB0aGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZTogc3RyaW5nLCBkYXRhOiBSZWRpcmVjdEFjdGlvbiwgdGFyZ2V0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGFnc1dpdGhBcmd1bWVudHMgPVxuICAgICAgICAgICAgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcyAmJiBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gZGF0YS5yZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycz8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1ldGVyLCBpbmRleCkgPT4gcGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgJiYgcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcmFtZXRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUgJiYgaW5kZXggPiBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHwke3BhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpID8gJycgOiBgJHtwYXJhbWV0ZXIubmFtZX09YH0ke3ZhbHVlfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFnZSkhO1xuXG4gICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBgI1JFRElSRUNUIFtbJHt0YXJnZXR9XV0ke3RhZ3NXaXRoQXJndW1lbnRzID8gYFxcblxcbnt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBDcmVhdGluZyByZWRpcmVjdCB0byBbWyR7dGFyZ2V0fV1dIGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9SXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycywgQ2F0ZWdvcmllc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExvb2t1cEVsZW1lbnRDb25maWcgfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJpdmF0ZSBzdXBwb3J0c1NvcnRLZXk6IGJvb2xlYW47XG5cbiAgICBwdWJsaWMgdmFsaWRDYXRlZ29yaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcsIHN1cHBvcnRzU29ydEtleSA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLnN1cHBvcnRzU29ydEtleSA9IHN1cHBvcnRzU29ydEtleTtcbiAgICB9XG5cbiAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKS5zcGxpdCgnfCcpWzBdO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBpZiAodGhpcy5zdXBwb3J0c1NvcnRLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRLZXkgPSB0aGlzLmdldFZhbHVlKCkuc3BsaXQoJ3wnKVsxXTtcblxuICAgICAgICAgICAgaWYgKHNvcnRLZXkgJiYgdGhpcy52YWxpZENhdGVnb3JpZXMuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gW3sgZGF0YTogYCR7dmFsdWV9fCR7c29ydEtleX1gLCBsYWJlbDogYCR7dmFsdWV9ICh3aXRoIHNvcnQga2V5IFwiJHtzb3J0S2V5fVwiKWAgfV07XG5cbiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogQ2F0ZWdvcmllc1Jlc3VsdCB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1cHBvcnRzU29ydEtleSkgdGhpcy52YWxpZENhdGVnb3JpZXMuYWRkKHRpdGxlV2l0aG91dE5hbWVzcGFjZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuXG5PYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycyB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExvb2t1cEVsZW1lbnRDb25maWcgfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHBhZ2UgbG9va3VwIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeT86IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IGRhdGE6IHBhZ2UudGl0bGUsIGxhYmVsOiBwYWdlLnRpdGxlIH0pKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cblxuT2JqZWN0LmFzc2lnbihQYWdlSW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgQWN0aW9uc0RpYWxvZyBmcm9tICcuL2FjdGlvbnMtZGlhbG9nJztcbmltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBIZWxwZXJEaWFsb2csIHsgdHlwZSBSZXF1ZXN0QWN0aW9uLCB0eXBlIFJlcXVlc3RBY3Rpb25UeXBlLCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgfSBmcm9tICcuL2hlbHBlci1kaWFsb2cnO1xuaW1wb3J0IFBhZ2VJbnB1dFdpZGdldCBmcm9tICcuL3BhZ2UtaW5wdXQtd2lkZ2V0JztcblxuaW50ZXJmYWNlIENhdGVnb3J5UmVxdWVzdERhdGEge1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgZXhhbXBsZXM6IHN0cmluZ1tdO1xuICAgIHBhcmVudHM6IHN0cmluZ1tdO1xuICAgIHJlcXVlc3RlcjogUmVxdWVzdFJlcXVlc3Rlcjtcbn1cblxudHlwZSBDYXRlZ29yeUFjdGlvbiA9IFJlcXVlc3RBY3Rpb24gJiB7IGNhdGVnb3J5OiBzdHJpbmc7IGNhdGVnb3JpemVkUGFnZXM6IHN0cmluZ1tdOyBwYXJlbnRzOiBzdHJpbmdbXTsgY2F0ZWdvcmllc1RvUmVtb3ZlOiBzdHJpbmdbXSB9O1xuXG50eXBlIENhdGVnb3J5QWN0aW9ucyA9IENhdGVnb3J5QWN0aW9uW107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhdGVnb3JpZXNEaWFsb2cgZXh0ZW5kcyBIZWxwZXJEaWFsb2cge1xuICAgIHByb3RlY3RlZCBwYXJzZWRSZXF1ZXN0czogQ2F0ZWdvcnlSZXF1ZXN0RGF0YVtdID0gW107XG4gICAgcHJpdmF0ZSBhY3Rpb25zVG9UYWtlOiBDYXRlZ29yeUFjdGlvbnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZWRpcmVjdCByZXF1ZXN0cyBmcm9tIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRlciBUaGUgc2VjdGlvbiBoZWFkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YTtcblxuICAgICAgICBjb25zdCBmb3VuZENhdGVnb3J5ID0gLzo/Q2F0ZWdvcnk6KC4qPykoXV18JCkvLmV4ZWMoc2VjdGlvbkhlYWRlcik/LlsxXS50cmltKCk7XG4gICAgICAgIGlmICghZm91bmRDYXRlZ29yeSkgcmV0dXJuO1xuXG4gICAgICAgIHBhcnNlZERhdGEuY2F0ZWdvcnkgPSBmb3VuZENhdGVnb3J5LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgIHBhcnNlZERhdGEuZXhhbXBsZXMgPSBbXG4gICAgICAgICAgICAuLi4oXG4gICAgICAgICAgICAgICAgL2V4YW1wbGUgcGFnZXMgd2hpY2ggYmVsb25nIHRvIHRoaXMgY2F0ZWdvcnk6KC4qPykocGFyZW50IGNhdGVnb3J5XFwvY2F0ZWdvcmllczp8XFxuXFxbXFxbKHNwZWNpYWw6Y29udHJpYnV0aW9uc1xcL3x1c2VyOikpL2lzLmV4ZWMoXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0LFxuICAgICAgICAgICAgICAgICk/LlsxXSA/PyAnJ1xuICAgICAgICAgICAgKS5tYXRjaEFsbCgvXFwqXFxzKig/OlxcW1xcWyk/KC4qPykoXFx8fF1dfFxccyo/XFxuKS9nKSxcbiAgICAgICAgXVxuICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5wYXJlbnRzID0gW1xuICAgICAgICAgICAgLi4uKC9wYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOiguKj8pKFxcblxcbnxcXG5cXFtcXFsoc3BlY2lhbDpjb250cmlidXRpb25zXFwvfHVzZXI6KSkvaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXSA/PyAnJykubWF0Y2hBbGwoXG4gICAgICAgICAgICAgICAgLyg/PCFcXHwpIz86P0NhdGVnb3J5OiguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyxcbiAgICAgICAgICAgICksXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VXNlckluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tVc2VyOicpO1xuICAgICAgICBjb25zdCBmaXJzdFVzZXJUYWxrSW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXIgdGFsazonKTtcbiAgICAgICAgY29uc3QgZmlyc3RJcEluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJyk7XG5cbiAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IE1hdGgubWluKC4uLltmaXJzdFVzZXJJbmRleCwgZmlyc3RVc2VyVGFsa0luZGV4LCBmaXJzdElwSW5kZXhdLmZpbHRlcigoaW5kZXgpID0+IGluZGV4ICE9PSAtMSkpO1xuXG4gICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID1cbiAgICAgICAgICAgIGZpcnN0SW5kZXggPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogZmlyc3RJbmRleCA9PT0gZmlyc3RJcEluZGV4XG4gICAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ2lwJywgbmFtZTogL1xcW1xcW1NwZWNpYWw6Q29udHJpYnV0aW9uc1xcLyguKj8pKFxcfHxdXSkvLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCkgfVxuICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICd1c2VyJywgbmFtZTogL1xcW1xcW1VzZXIoPzogdGFsayk/OiguKj8pKFxcfHxdXSkvLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCkgfTtcbiAgICAgICAgaWYgKCFwYXJzZWREYXRhLnJlcXVlc3Rlcj8ubmFtZSkgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFyc2VkUmVxdWVzdHMucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2UucHVzaCh7XG4gICAgICAgICAgICBjYXRlZ29yeTogcGFyc2VkRGF0YS5jYXRlZ29yeSxcbiAgICAgICAgICAgIGNhdGVnb3JpemVkUGFnZXM6IHBhcnNlZERhdGEuZXhhbXBsZXMsXG4gICAgICAgICAgICBwYXJlbnRzOiBwYXJzZWREYXRhLnBhcmVudHMsXG4gICAgICAgICAgICBjYXRlZ29yaWVzVG9SZW1vdmU6IFsuLi5wYXJzZWREYXRhLnBhcmVudHNdLFxuICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc2VjdGlvblRleHQsIHNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSB9LFxuICAgICAgICAgICAgYWN0aW9uOiAnbm9uZScsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkU3VidHlwZUVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdO1xuXG4gICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gYDxiPkNhdGVnb3J5OiR7cmVxdWVzdC5jYXRlZ29yeX08L2I+YDtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8nKTtcblxuICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIG5vbmVFbGVtZW50LnRleHRDb250ZW50ID0gJ05vbmUnO1xuXG4gICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgdW5rbm93bkVsZW1lbnQudGV4dENvbnRlbnQgPSAnVW5rbm93bic7XG5cbiAgICAgICAgY29uc3QgZXhhbXBsZXNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBleGFtcGxlc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBleGFtcGxlc0xhYmVsLnRleHRDb250ZW50ID0gJ0V4YW1wbGVzOiAnO1xuICAgICAgICBleGFtcGxlc0Rpdi5hcHBlbmQoZXhhbXBsZXNMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZXhhbXBsZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBleGFtcGxlXSBvZiByZXF1ZXN0LmV4YW1wbGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChleGFtcGxlKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IGV4YW1wbGU7XG5cbiAgICAgICAgICAgICAgICBleGFtcGxlc0Rpdi5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSByZXF1ZXN0LmV4YW1wbGVzLmxlbmd0aCAtIDEpIGV4YW1wbGVzRGl2LmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBleGFtcGxlc0Rpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKGV4YW1wbGVzRGl2KTtcblxuICAgICAgICBjb25zdCBwYXJlbnRzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50c0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBwYXJlbnRzTGFiZWwudGV4dENvbnRlbnQgPSAnUGFyZW50czogJztcbiAgICAgICAgcGFyZW50c0Rpdi5hcHBlbmQocGFyZW50c0xhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5wYXJlbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGFyZW50XSBvZiByZXF1ZXN0LnBhcmVudHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGBDYXRlZ29yeToke3BhcmVudH1gKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IHBhcmVudDtcblxuICAgICAgICAgICAgICAgIHBhcmVudHNEaXYuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gcmVxdWVzdC5wYXJlbnRzLmxlbmd0aCAtIDEpIHBhcmVudHNEaXYuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlIHBhcmVudHNEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChwYXJlbnRzRGl2KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID1cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgfSBlbHNlIHJlcXVlc3RlckRpdi5hcHBlbmQodW5rbm93bkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJykpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgIGNvbnN0IGFjdGlvblJhZGlvSW5wdXQgPSBuZXcgT08udWkuUmFkaW9TZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICBpdGVtczogWydBY2NlcHQnLCAnRGVueScsICdDb21tZW50JywgJ0Nsb3NlJywgJ05vbmUnXS5tYXAoXG4gICAgICAgICAgICAgICAgKGxhYmVsKSA9PiBuZXcgT08udWkuUmFkaW9PcHRpb25XaWRnZXQoeyBkYXRhOiBsYWJlbC50b0xvd2VyQ2FzZSgpLCBsYWJlbCB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsIChzZWxlY3RlZCkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHNlbGVjdGVkLmdldERhdGEoKSBhcyBSZXF1ZXN0QWN0aW9uVHlwZTtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5hY3Rpb24gPSBvcHRpb247XG5cbiAgICAgICAgICAgIGlmIChbJ2NvbW1lbnQnLCAnY2xvc2UnXS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcblxuICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFnZVNlbGVjdElucHV0ID0gbmV3IFBhZ2VJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIHBhZ2VzIGhlcmUnIH0pO1xuICAgICAgICBwYWdlU2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhZ2VTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eOi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHBhZ2VTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHBhZ2VTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiBwYWdlU2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBwYWdlU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoc2VsZWN0ZWRFbGVtZW50cykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYWdlcyA9IHNlbGVjdGVkRWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRQYWdlcyA9IHNlbGVjdGVkUGFnZXMudG9Tb3J0ZWQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQYWdlcy5qb2luKCc7JykgIT09IHNvcnRlZFBhZ2VzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHBhZ2VTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkUGFnZXMuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2F0ZWdvcml6ZWRQYWdlcyA9IHNvcnRlZFBhZ2VzO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IGNhdGVnb3JpemVkUGFnZXMgfSA9IHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF07XG5cbiAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGNhdGVnb3JpemVkUGFnZXMpIHBhZ2VTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UpO1xuICAgICAgICBwYWdlU2VsZWN0LnNldFZhbHVlKGNhdGVnb3JpemVkUGFnZXMpO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQocGFnZVNlbGVjdCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnUGFnZXMgdG8gY2F0ZWdvcml6ZTonIH0pO1xuICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0ID0gbmV3IENhdGVnb3J5SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBjYXRlZ29yaWVzIGhlcmUnIH0pO1xuICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIGNhdGVnb3J5UmVtb3ZlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVJlbW92ZVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IGNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdC5vbignY2hhbmdlJywgKHNlbGVjdGVkRWxlbWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkRWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRDYXRlZ29yaWVzID0gc2VsZWN0ZWRDYXRlZ29yaWVzLnRvU29ydGVkKChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2F0ZWdvcmllcy5qb2luKCc7JykgIT09IHNvcnRlZENhdGVnb3JpZXMuam9pbignOycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLmF0KC0xKSBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkRyYWdnYWJsZUVsZW1lbnQgJiBPTy51aS5FbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkQ2F0ZWdvcmllcy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jYXRlZ29yaWVzVG9SZW1vdmUgPSBzb3J0ZWRDYXRlZ29yaWVzO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IHBhcmVudHM6IHBhcmVudENhdGVnb3JpZXMgfSA9IHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF07XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50Q2F0ZWdvcmllcykgY2F0ZWdvcnlSZW1vdmVTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhcmVudCk7XG4gICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0LnNldFZhbHVlKHBhcmVudENhdGVnb3JpZXMpO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5UmVtb3ZlU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNhdGVnb3J5UmVtb3ZlU2VsZWN0LCB7XG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NhdGVnb3JpZXMgdG8gcmVtb3ZlIGZyb20gcGFnZXMgdG8gY2F0ZWdvcml6ZTonLFxuICAgICAgICB9KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSwgdHJ1ZSk7XG4gICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgcGFyZW50Q2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudENhdGVnb3J5U2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoc2VsZWN0ZWRFbGVtZW50cykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDYXRlZ29yaWVzID0gc2VsZWN0ZWRFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZENhdGVnb3JpZXMgPSBzZWxlY3RlZENhdGVnb3JpZXMudG9Tb3J0ZWQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSAhPT0gc29ydGVkQ2F0ZWdvcmllcy5qb2luKCc7JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuYXQoLTEpIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uRHJhZ2dhYmxlRWxlbWVudCAmIE9PLnVpLkVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdC5yZW9yZGVyKGxhc3RFbGVtZW50LCBzb3J0ZWRDYXRlZ29yaWVzLmluZGV4T2YobGFzdEVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLnBhcmVudHMgPSBzb3J0ZWRDYXRlZ29yaWVzO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhcmVudENhdGVnb3J5IG9mIHBhcmVudENhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYXJlbnRDYXRlZ29yeSk7XG4gICAgICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0LnZhbGlkQ2F0ZWdvcmllcy5hZGQocGFyZW50Q2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHBhcmVudENhdGVnb3JpZXMpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHBhcmVudENhdGVnb3J5U2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdQYXJlbnQgY2F0ZWdvcmllczonIH0pO1xuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgZGVueVJlYXNvbiA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnYXV0b2ZpbGw6dW5saWtlbHknLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIFsnZXhpc3RzJywgJ2V4aXN0aW5nIGNhdGVnb3JpZXMnXSxcbiAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICdjYXRlZ29yaWVzIHRoYXQgYXJlIHVubGlrZWx5IHRvIGhhdmUgZW5vdWdoIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgWydub3RjYXRlZ29yeScsICdwYWdlIGNyZWF0aW9uIHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICB9KTtcbiAgICAgICAgZGVueVJlYXNvbi5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5kZW55UmVhc29uID0gZGVueVJlYXNvbi5nZXRWYWx1ZSgpIHx8ICdhdXRvZmlsbDp1bmxpa2VseSc7XG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uLnNldFZhbHVlKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuICAgICAgICBkZW55UmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuXG4gICAgICAgIGNvbnN0IGRlbnlSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoZGVueVJlYXNvbiwge1xuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbiA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgWydObyByZXNwb25zZScsICdyJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgWydXaXRoZHJhd24nLCAndyddLFxuICAgICAgICAgICAgICAgIF0ubWFwKChbdGl0bGUsIGlkXSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IHRpdGxlIH0pKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5vbignY2hvb3NlJywgKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaWQ6IHNlbGVjdGVkLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuY2hvb3NlSXRlbShjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5maW5kSXRlbUZyb21EYXRhKCdzJykgYXMgT08udWkuT3B0aW9uV2lkZ2V0KTtcblxuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNsb3NpbmdSZWFzb24sIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0Nsb3NpbmcgcmVhc29uOicgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWVudCkgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29tbWVudElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbG9yIG9mIGEgZGV0YWlscyBlbGVtZW50IGJhc2VkIG9uIHRoZSBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdHMgaW5zaWRlLlxuICAgICAqIEBwYXJhbSBkZXRhaWxzRWxlbWVudCBUaGUgZGV0YWlscyBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHsgYWN0aW9uIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSAnJztcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItc3dpdGNoXG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdhY2NlcHQnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2EwZmZhMCc7XG4gICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbnknKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Nsb3NlJylcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncicpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2I4YjhiOCc7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFjdGlvbnMgb24gYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBhY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gYWRkIG1lc3NhZ2VzIHRvLlxuICAgICAqIEBwYXJhbSBjb3VudHMgVGhlIGNvdW50IG9iamVjdCB1c2VkIHRvIHRyYWNrIHJlcXVlc3RzIGZvciB0aGUgZWRpdCBzdW1tYXJ5LlxuICAgICAqIEBwYXJhbSBuZXdQYWdlVGV4dCBUaGUgbmV3IHBhZ2UgdGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcGVyZm9ybVN1YnR5cGVBY3Rpb25zKGFjdGlvbnNEaWFsb2c6IEFjdGlvbnNEaWFsb2csIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgbmV3UGFnZVRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9IHRoaXMuYWN0aW9uc1RvVGFrZS5zb21lKChhY3Rpb25EYXRhKSA9PiBhY3Rpb25EYXRhLmFjdGlvbiAhPT0gJ25vbmUnKTtcblxuICAgICAgICBpZiAoYW55UmVxdWVzdEhhbmRsZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0aW9uRGF0YSBvZiB0aGlzLmFjdGlvbnNUb1Rha2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbkRhdGEgPSB7IHBhZ2VUZXh0OiBuZXdQYWdlVGV4dCwgLi4uYWN0aW9uRGF0YS5vcmlnaW5hbFRleHQgfTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uRGF0YS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8YX19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6ICcqIHt7c3Vic3Q6QWZDIGNhdGVnb3J5fX0gfn5+flxcbnt7QWZDLWN8Yn19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjY2VwdGVkQ2F0ZWdvcnkoYWN0aW9uRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hY2NlcHRlZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogJ3t7QWZDLWN8ZH19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24oYWN0aW9uRGF0YS5kZW55UmVhc29uISl9IH5+fn5cXG57e0FmQy1jfGJ9fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkRhdGEuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1snY29tbWVudGVkIG9uJ10rKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke2FjdGlvbkRhdGEuY2F0ZWdvcnl9XCIgd2FzIG1hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZCBzbyBpdCB3aWxsIGJlIHNraXBwZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHthY3Rpb25EYXRhLmNsb3NpbmdSZWFzb24hLmlkfX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IChhY3Rpb25EYXRhLmNvbW1lbnQgPyBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAgOiAnJykgKyAnXFxue3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEhhbmRsaW5nIEFmQyBjYXRlZ29yeSByZXF1ZXN0cyAoJHttYXBwZWRDb3VudHN9KSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoYWN0aW9uc0RpYWxvZyk7XG5cbiAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0FsbCBjaGFuZ2VzIG1hZGUsIGNsaWNrIGJlbG93IHRvIHJlbG9hZCEnLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICBhY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ05vIHJlcXVlc3RzIGhhdmUgYmVlbiBoYW5kbGVkIScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHBhZ2VzIHJlbGF0ZWQgdG8gYW4gYWNjZXB0ZWQgY2F0ZWdvcnkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIGNhdGVnb3J5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBoYW5kbGVBY2NlcHRlZENhdGVnb3J5KGRhdGE6IENhdGVnb3J5QWN0aW9uKSB7XG4gICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1gLFxuICAgICAgICAgICAgICAgIHRleHQ6IGRhdGEucGFyZW50cy5tYXAoKHBhcmVudCkgPT4gYFtbQ2F0ZWdvcnk6JHtwYXJlbnR9XV1gKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgY2F0ZWdvcnkgYXMgcmVxdWVzdGVkIGF0IFtbV1A6QUZDL0NdXSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnkgdGFsazoke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBge3tXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGx8XFxue3tXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258dHM9e3tzdWJzdDpMT0NBTFRJTUVTVEFNUH19fHJldmlld2VyPSR7bXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpfX19XFxufX1gLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgW1tXaWtpcGVkaWE6V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufFdpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbl1dIGJhbm5lciR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uZGF0YS5jYXRlZ29yaXplZFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHBhZ2UsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoeyBjb250ZW50IH06IHsgY29udGVudDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZFJlcGxhY2VDYXRlZ29yeSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLygoXFxbXFxbOj9bQ2NdYXRlZ29yeTouKz9dXVxcbj8pKykvLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZFJlcGxhY2VDYXRlZ29yeSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoRW5kc1dpdGhOZXdsaW5lID0gbWF0Y2guZW5kc1dpdGgoJ1xcbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bWF0Y2h9JHttYXRjaEVuZHNXaXRoTmV3bGluZSA/ICcnIDogJ1xcbid9W1tDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV0ke21hdGNoRW5kc1dpdGhOZXdsaW5lID8gJ1xcbicgOiAnJ31gO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZFJlcGxhY2VDYXRlZ29yeSkgY29udGVudCArPSBgXFxuW1tDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV1gOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGRhdGEuY2F0ZWdvcmllc1RvUmVtb3ZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChuZXcgUmVnRXhwKGBcXFxcW1xcXFxbOj9bQ2NdYXRlZ29yeToke2NhdGVnb3J5fShcXFxcfC4qPyk/XFxcXF1cXFxcXVxcbj9gLCAnZ2knKSwgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBwYWdlIHRvIFtbOkNhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICJib2R5LmFmY3JjLWhlbHBlci1vcGVuICNtdy10ZWxlcG9ydC10YXJnZXR7ei1pbmRleDo1MDB9LmFmY3JjLWhlbHBlci1yZXF1ZXN0e21hcmdpbjoxMHB4O2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQtY29sb3I6I2VlZTtwYWRkaW5nOjVweDtjb2xvcjojMjAyMTIyfS5hZmNyYy1oZWxwZXItcmVxdWVzdCBzdW1tYXJ5e2N1cnNvcjpwb2ludGVyfS5hZmNyYy1oZWxwZXItdGFyZ2V0LWVkaXRvcnttaW4td2lkdGg6MWNoO21heC13aWR0aDpjYWxjKDEwMCUgLSA0Y2gpO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZX0uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmt7LXdlYmtpdC10ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50fS5hZmNyYy1oZWxwZXItZXh0ZXJuYWwtbGluayBzdmd7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MWVtO2hlaWdodDoxZW07ZmlsbDpjdXJyZW50Y29sb3J9LmFmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8sLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcnttYXJnaW46NXB4fS5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvPmRpdiwuYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyPmRpdnttYXJnaW4tdG9wOjhweDttYXJnaW4tYm90dG9tOjhweH0uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyPmRpdjpsYXN0LW9mLXR5cGV7bWFyZ2luLWJvdHRvbTowfS5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0e21hcmdpbi1sZWZ0OjhweH0uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIC5vby11aS1maWVsZExheW91dC1oZWFkZXJ7d2lkdGg6LW1vei1tYXgtY29udGVudDt3aWR0aDptYXgtY29udGVudH0jYWZjcmMtaGVscGVyLXN5bmMtYWxsLXdpdGgtZmlyc3QtYnV0dG9ue21hcmdpbi1ib3R0b206NXB4fS5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlve21hcmdpbi10b3A6OHB4fS5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIC5vby11aS1yYWRpb09wdGlvbldpZGdldHtkaXNwbGF5OmlubGluZTtwYWRkaW5nOjhweH0uYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQsLmFmY3JjLWNvbW1lbnQtaW5wdXR7bWF4LXdpZHRoOjUwJX0uYWZjcmMtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXM6YWZ0ZXJ7Y29udGVudDpcIiAocmVkaXJlY3Qgd2l0aCBwb3NzaWJpbGl0aWVzKVwiO2ZvbnQtc3R5bGU6aXRhbGljfS5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxze21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjYTJhOWIxO2JvcmRlci1yYWRpdXM6MnB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtwYWRkaW5nOjVweH0uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVye21hcmdpbi1sZWZ0OjhweH0uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnl7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NzAwfS5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlsc3ttYXJnaW4tdG9wOjVweDttYXJnaW4tYm90dG9tOjVweDtiYWNrZ3JvdW5kLWNvbG9yOiNlMmUyZTJ9LmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIC5vby11aS1maWVsZExheW91dC1oZWFkZXJ7bWF4LXdpZHRoOjEwMCUhaW1wb3J0YW50fSNhZmNyYy1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2V7cGFkZGluZzo1cHh9LmFmY3JjLWhlbHBlci1hY3Rpb25zLWNvbnRhaW5lciBkaXZ7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHh9XG4iLCAiaW1wb3J0IGNzc0NvbnRlbnQgZnJvbSAnLi4vLi4vc3R5bGVzL2FmY3JjLWhlbHBlci5jc3MnIHdpdGggeyB0eXBlOiAnY3NzJyB9O1xuXG5leHBvcnQgdHlwZSBXYXRjaE1ldGhvZCA9ICdub2NoYW5nZScgfCAncHJlZmVyZW5jZXMnIHwgJ3Vud2F0Y2gnIHwgJ3dhdGNoJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBhZmNyY0NvbmZpZ3VyYXRpb24/OiB7IGNyZWF0ZWRQYWdlV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCB9O1xuICAgIH1cbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdDogUmVkaXJlY3RzRGlhbG9nIH0gPSBhd2FpdCBpbXBvcnQoJy4vcmVkaXJlY3RzLWRpYWxvZycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgIGNvbnN0IHsgZGVmYXVsdDogQ2F0ZWdvcmllc0RpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KCcuL2NhdGVnb3JpZXMtZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cbiAgICBjb25zdCBwYWdlTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgIGNvbnN0IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA9IHBhZ2VOYW1lID09PSAnV2lraXBlZGlhOkFydGljbGVzIGZvciBjcmVhdGlvbi9SZWRpcmVjdHMnO1xuICAgIGNvbnN0IGlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSA9IHBhZ2VOYW1lID09PSAnV2lraXBlZGlhOkFydGljbGVzIGZvciBjcmVhdGlvbi9DYXRlZ29yaWVzJztcblxuICAgIGlmICghaXNSZWRpcmVjdFJlcXVlc3RQYWdlICYmICFpc0NhdGVnb3J5UmVxdWVzdFBhZ2UpIHJldHVybjtcblxuICAgIGNvbnN0IHJlcXVlc3RQYWdlVHlwZSA9IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA/ICdyZWRpcmVjdCcgOiAnY2F0ZWdvcnknO1xuXG4gICAgY29uc3QgbGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsoXG4gICAgICAgIG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLFxuICAgICAgICAnIycsXG4gICAgICAgIGBIYW5kbGUgJHtyZXF1ZXN0UGFnZVR5cGV9IGNyZWF0aW9uIHJlcXVlc3RzYCxcbiAgICAgICAgJ2FmY3JjLWhlbHBlcicsXG4gICAgKSE7XG5cbiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgbXcudXRpbC5hZGRDU1MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIGNvbnN0IGhlbHBlciA9IHJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0JyA/IFJlZGlyZWN0c0RpYWxvZyA6IENhdGVnb3JpZXNEaWFsb2c7XG5cbiAgICAgICAgY29uc3QgYWZjcmNIZWxwZXJEaWFsb2cgPSBuZXcgaGVscGVyKHJlcXVlc3RQYWdlVHlwZSwgcGFnZU5hbWUsIHdpbmRvdy5hZmNyY0NvbmZpZ3VyYXRpb24/LmNyZWF0ZWRQYWdlV2F0Y2hNZXRob2QpO1xuXG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbYWZjcmNIZWxwZXJEaWFsb2ddKTtcblxuICAgICAgICBhZmNyY0hlbHBlckRpYWxvZy5vcGVuKCk7XG4gICAgICAgIHZvaWQgYWZjcmNIZWxwZXJEaWFsb2cubG9hZCgpO1xuICAgIH0pO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7a0pBQUEsSUFLcUJBLEVBTHJCQyxFQUFBQyxFQUFBLGtCQUtxQkYsRUFBckIsTUFBcUJHLFVBQXNCLEdBQUcsR0FBRyxNQUFPLENBQzVDLGNBQ0EsVUFDQSxZQUVB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LEdBQUcsS0FBSyxlQUNqQixHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQy9DLElBQ0EsVUFBVUMsQ0FBZSxxQkFDekIsY0FDSixFQUVLLGlCQUFpQixRQUFVQyxHQUFVLENBQ3RDQSxFQUFNLGVBQWUsRUFFckIsR0FBRyxLQUFLLE9BQU9DLENBQVUsRUFFekIsSUFBTUMsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FDaEMsU0FBUyxLQUFLLE9BQU9BLEVBQWMsU0FBUyxDQUFDLENBQUMsRUFFOUMsSUFBTUMsRUFBU0osSUFBb0IsV0FBYUosRUFBa0JDLEVBRTVEUSxFQUFvQixJQUFJRCxFQUFPSixFQUFpQkYsRUFBVSxPQUFPLG9CQUFvQixzQkFBc0IsRUFFakhLLEVBQWMsV0FBVyxDQUFDRSxDQUFpQixDQUFDLEVBRTVDQSxFQUFrQixLQUFLLEVBQ2xCQSxFQUFrQixLQUFLLENBQ2hDLENBQUMsQ0FDTCxDQUFDIiwKICAibmFtZXMiOiBbIkFjdGlvbnNEaWFsb2ciLCAiaW5pdF9hY3Rpb25zX2RpYWxvZyIsICJfX2VzbU1pbiIsICJfQWN0aW9uc0RpYWxvZyIsICJoZWxwZXJEaWFsb2ciLCAibWVzc2FnZSIsICJ0eXBlIiwgIm1lc3NhZ2VXaWRnZXQiLCAiYm9keUVsZW1lbnQiLCAicmVsb2FkQnV0dG9uIiwgIkhlbHBlckRpYWxvZyIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF9hY3Rpb25zX2RpYWxvZyIsICJfSGVscGVyRGlhbG9nIiwgInJlcXVlc3RQYWdlVHlwZSIsICJwYWdlVGl0bGUiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgImV2ZW50IiwgImFjdGlvbiIsICJjb25maXJtZWQiLCAicGFnZVJldmlzaW9uIiwgInNlY3Rpb25zIiwgIm1hdGNoIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAiaW5kZXgiLCAiaGFuZGxlIiwgImVuZEluZGV4IiwgInN1YkluZGV4IiwgIm1lc3NhZ2VXaWRnZXQiLCAibWVzc2FnZVdpZGdldExheW91dCIsICJ3aW5kb3dNYW5hZ2VyIiwgImFjdGlvbnNEaWFsb2ciLCAiQWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAicmVhc29uIiwgInRlbXBsYXRlUGFyYW1ldGVycyIsICJhZGRpdGlvbmFsUmVhc29uaW5nIiwgImRlbmllZFBhZ2VzIiwgInNpbmd1bGFyUmVxdWVzdCIsICJhbGxSZXF1ZXN0cyIsICJyZWFzb25zIiwgInBhZ2UiLCAicmVhc29uc0FycmF5IiwgInBhZ2VzIiwgImNvbW1lbnRzIiwgImNvbW1lbnRNZXNzYWdlcyIsICJjb21tZW50IiwgImNvbW1lbnRzQXJyYXkiLCAic2VjdGlvbkRhdGEiLCAicHJlcGVuZCIsICJhcHBlbmQiLCAib2xkRnVsbFNlY3Rpb25UZXh0IiwgIm9sZFNlY3Rpb25UZXh0IiwgImFwaUZ1bmN0aW9uIiwgImxpbmtFbGVtZW50IiwgImFjdGlvblJlc3VsdEVsZW1lbnRJZCIsICJyZXN1bHQiLCAiYWN0aW9uUmVzdWx0RWxlbWVudCIsICJlcnJvckNvZGUiLCAiZXJyb3JJbmZvIiwgInJlc29sdmUiLCAiZGV0YWlsc0VsZW1lbnQiLCAiZGlhbG9nIiwgIlJlZGlyZWN0UmVxdWVzdEhhbmRsZXIiLCAiaW5pdF9yZWRpcmVjdF9yZXF1ZXN0X2hhbmRsZXIiLCAiX19lc21NaW4iLCAidGl0bGVJbmRleCIsICJ0aXRsZSIsICJkZXRhaWxzRWxlbWVudCIsICJyZXNwb25kZXJFbGVtZW50IiwgImRpYWxvZyIsICJyZXF1ZXN0ZWRUaXRsZURpdiIsICJsYWJlbCIsICJzZWxlY3RlZCIsICJhY3Rpb24iLCAiZWRpdG9ySW5kZXgiLCAidGVtcGxhdGUiLCAiY3VycmVudFBhcmFtZXRlcnMiLCAicGFyYW1ldGVySW5kZXgiLCAibmV3UGFyYW1ldGVyIiwgIm9wdGlvbiIsICJjb21tZW50IiwgInRhZyIsICJyZWRpcmVjdCIsICJzZWxlY3RlZEVsZW1lbnRzIiwgInNlbGVjdGVkVGFncyIsICJlbGVtZW50IiwgInNvcnRlZFRhZ3MiLCAiYiIsICJsYXN0RWxlbWVudCIsICJzaG93blRlbXBsYXRlRWRpdG9ycyIsICJlZGl0b3JJbmZvIiwgImlzVGFnU2VsZWN0ZWQiLCAic3VtbWFyeUVsZW1lbnQiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgInZhbHVlIiwgImlkIiwgInVwZGF0ZSIsICJyZWRpcmVjdHNfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUmVkaXJlY3RzRGlhbG9nIiwgImluaXRfcmVkaXJlY3RzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF9yZXF1ZXN0X2hhbmRsZXIiLCAiSGVscGVyRGlhbG9nIiwgInJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZSIsICJzZWN0aW9uVGV4dCIsICJzZWN0aW9uSGVhZGVyIiwgInBhcnNlZERhdGEiLCAicmVxdWVzdGVkUGFnZXMiLCAibWF0Y2giLCAicGFyc2VkVGFyZ2V0IiwgInJlcXVlc3RlciIsICJuYW1lIiwgInBhZ2UiLCAiaW5kZXgiLCAicmVxdWVzdCIsICJkZXRhaWxzRWxlbWVudCIsICJzdW1tYXJ5RWxlbWVudCIsICJldmVudCIsICJ0YXJnZXRFZGl0b3JFbGVtZW50IiwgImxpbmtFbGVtZW50IiwgInJlcXVlc3RJbmZvRWxlbWVudCIsICJub25lRWxlbWVudCIsICJ1bmtub3duRWxlbWVudCIsICJyZWFzb25EaXYiLCAicmVhc29uTGFiZWwiLCAic291cmNlRGl2IiwgInNvdXJjZUxhYmVsIiwgInJlcXVlc3RlckRpdiIsICJyZXF1ZXN0ZXJMYWJlbCIsICJyZXF1ZXN0ZXJMaW5rIiwgInJlcXVlc3RSZXNwb25kZXJFbGVtZW50IiwgImhhbmRsZXJzIiwgIm1vZGlmeUFsbEJ1dHRvbiIsICJhY3Rpb24iLCAiaGFuZGxlciIsICJyZXF1ZXN0ZWRUaXRsZSIsICJSZWRpcmVjdFJlcXVlc3RIYW5kbGVyIiwgImFjdGlvbnNUb1Rha2UiLCAiYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCIsICJmaXJzdENsb3NlUmVhc29uIiwgImFsbFJlcXVlc3RzQ2xvc2VkIiwgImJhY2tncm91bmRDb2xvciIsICJhY2NlcHRlZENvdW50IiwgImRlbmllZENvdW50IiwgImFjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgImFjdGlvbkRhdGEiLCAidGFyZ2V0IiwgInJlcXVlc3RzIiwgInNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQiLCAiYWNjZXB0ZWRQYWdlcyIsICJkZW5pZWRQYWdlcyIsICJjb21tZW50cyIsICJhbW91bnRPZlBhZ2VzIiwgInNlY3Rpb25EYXRhIiwgImNsb3NpbmdJZCIsICJhY2NlcHRlZFBhZ2VzTWVzc2FnZSIsICJkZW5pZWRQYWdlc01lc3NhZ2UiLCAibWFwcGVkQ291bnRzIiwgImNvdW50IiwgImRhdGEiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAidGFnIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAiZWRpdG9ySW5mbyIsICJsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgiLCAicGFyYW1ldGVyIiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ2YWx1ZSIsICJ0aXRsZSIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImNvbmZpZyIsICJzdXBwb3J0c1NvcnRLZXkiLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAic29ydEtleSIsICJyZXNwb25zZSIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAiZGF0YSIsICJsYWJlbCIsICJQYWdlSW5wdXRXaWRnZXQiLCAiaW5pdF9wYWdlX2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJjYXRlZ29yaWVzX2RpYWxvZ19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkNhdGVnb3JpZXNEaWFsb2ciLCAiaW5pdF9jYXRlZ29yaWVzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiaW5pdF9wYWdlX2lucHV0X3dpZGdldCIsICJIZWxwZXJEaWFsb2ciLCAic2VjdGlvblRleHQiLCAic2VjdGlvbkhlYWRlciIsICJwYXJzZWREYXRhIiwgImZvdW5kQ2F0ZWdvcnkiLCAibWF0Y2giLCAiZmlyc3RVc2VySW5kZXgiLCAiZmlyc3RVc2VyVGFsa0luZGV4IiwgImZpcnN0SXBJbmRleCIsICJmaXJzdEluZGV4IiwgImluZGV4IiwgInJlcXVlc3QiLCAiZGV0YWlsc0VsZW1lbnQiLCAic3VtbWFyeUVsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgImV4YW1wbGVzRGl2IiwgImV4YW1wbGVzTGFiZWwiLCAiZXhhbXBsZSIsICJsaW5rRWxlbWVudCIsICJwYXJlbnRzRGl2IiwgInBhcmVudHNMYWJlbCIsICJwYXJlbnQiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAiYWN0aW9uUmFkaW9JbnB1dCIsICJsYWJlbCIsICJzZWxlY3RlZCIsICJvcHRpb24iLCAiY29tbWVudElucHV0TGF5b3V0IiwgImNvbW1lbnQiLCAiY29tbWVudElucHV0IiwgInBhZ2VTZWxlY3RMYXlvdXQiLCAiY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQiLCAicGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQiLCAiZGVueVJlYXNvbkxheW91dCIsICJjbG9zaW5nUmVhc29uTGF5b3V0IiwgInBhZ2VTZWxlY3RJbnB1dCIsICJQYWdlSW5wdXRXaWRnZXQiLCAidmFsdWUiLCAicGFnZXMiLCAicGFnZSIsICJwYWdlU2VsZWN0IiwgInNlbGVjdGVkRWxlbWVudHMiLCAic2VsZWN0ZWRQYWdlcyIsICJlbGVtZW50IiwgInNvcnRlZFBhZ2VzIiwgImEiLCAiYiIsICJsYXN0RWxlbWVudCIsICJjYXRlZ29yaXplZFBhZ2VzIiwgImNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJjYXRlZ29yeVJlbW92ZVNlbGVjdCIsICJzZWxlY3RlZENhdGVnb3JpZXMiLCAic29ydGVkQ2F0ZWdvcmllcyIsICJwYXJlbnRDYXRlZ29yaWVzIiwgInBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQiLCAicGFyZW50Q2F0ZWdvcnlTZWxlY3QiLCAicGFyZW50Q2F0ZWdvcnkiLCAiZGVueVJlYXNvbiIsICJjbG9zaW5nUmVhc29uIiwgInRpdGxlIiwgImlkIiwgImFjdGlvbiIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAiYWN0aW9uRGF0YSIsICJzZWN0aW9uRGF0YSIsICJtYXBwZWRDb3VudHMiLCAiY291bnQiLCAiZGF0YSIsICJjb250ZW50IiwgImRpZFJlcGxhY2VDYXRlZ29yeSIsICJtYXRjaEVuZHNXaXRoTmV3bGluZSIsICJjYXRlZ29yeSIsICJhZmNyY19oZWxwZXJfZGVmYXVsdCIsICJSZWRpcmVjdHNEaWFsb2ciLCAiQ2F0ZWdvcmllc0RpYWxvZyIsICJwYWdlTmFtZSIsICJpc1JlZGlyZWN0UmVxdWVzdFBhZ2UiLCAicmVxdWVzdFBhZ2VUeXBlIiwgImV2ZW50IiwgImFmY3JjX2hlbHBlcl9kZWZhdWx0IiwgIndpbmRvd01hbmFnZXIiLCAiaGVscGVyIiwgImFmY3JjSGVscGVyRGlhbG9nIl0KfQo=