User:Eejit43/scripts/afcrc-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/afcrc-helper. |
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/afcrc-helper/afcrc-helper.ts
"use strict";(()=>{var se=Object.defineProperty;var x=(y,e)=>()=>(y&&(e=y(y=0)),e);var J=(y,e)=>{for(var t in e)se(y,t,{get:e[t],enumerable:!0})};var S,G=x(()=>{"use strict";S=class y extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),y.static.name="ActionsDialog",y.static.title="Actions"}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",()=>{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=[];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")}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():null):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 s=e;s<i;s++)this.loadSubtypeElements(s);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;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[o,a]of e)a in i||(i[a]=[]),i[a].push(o);let s=Object.entries(i);return s.map(([o,a])=>`* ${this.formatDeniedReason(o)}${s.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[o,a]of e)a in i||(i[a]=[]),i[a].push(o);let s=Object.entries(i);return s.map(([o,a])=>`* {{AfC comment|1=${o}}}${s.length>1||!n?` (${a.map(l=>`[[${l}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(e,{prepend:t,append:n}){let{fullSectionText:i,sectionText:s}=e;return t&&(e.sectionText=t+`
`+e.sectionText),n&&(e.sectionText+=`
`+n),e.fullSectionText=e.fullSectionText.replace(s,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),s=document.createElement("a");s.target="_blank",s.href=mw.util.getUrl(n.title,"isRedirect"in n&&n.isRedirect?{redirect:"no"}:void 0),s.textContent=n.title;let o=`afcrc-helper-action-result-${t}`;e.addLogEntry(`${n.type==="edit"?"Editing":"Creating"} ${s.outerHTML}... <span id="${o}"></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(`#${o}`);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"} ${s.outerHTML}: ${c?.error?.info??"Unknown error"} (${d}).`,"error")})):e.addLogEntry(`Error ${n.type==="edit"?"editing":"creating"} ${s.outerHTML}: ${l?.error?.info??"Unknown error"} (${a}).`,"error")})}}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,s){this.titleIndex=e,this.title=t,this.detailsElement=n,this.responderElement=i,this.dialog=s}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[s,o]of n.parameters.entries())i[s].editor.setValue(o.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 s=new OO.ui.HtmlSnippet(`<span class="afcrc-helper-redirect-possibilities">${n}</span>`);return{data:n,label:s}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",n=>{let i=n.map(a=>a.getData()),s=i.toSorted((a,l)=>a.toLowerCase().localeCompare(l.toLowerCase()));if(i.join(";")!==s.join(";")){let a=n.at(-1);this.tagSelect.reorder(a,s.indexOf(a.getData()))}this.updateActionsToTake({redirectTemplates:s});let o=0;for(let a of this.templateEditorsInfo){let l=s.includes(a.name);a.details.style.display=l?"block":"none",l&&o++}e.textContent=`Template parameters (${o>0?`for ${o} template${o>1?"s":""}`:"none to show"})`,t.style.display=o>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 s=Object.entries(i.parameters);if(s.length===0)continue;let o=document.createElement("details");o.style.display="none";let a=document.createElement("summary");a.textContent=n,o.append(a);let l={name:n,details:o,parameters:[]};for(let[d,c]of s){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"});o.append(f.$element[0]),l.parameters.push({name:d,aliases:c.aliases,editor:b})}this.templateParametersEditor.append(o),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 s=/Target of redirect: ?\[\[(.*?)]]/.exec(e)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!s)return;n.target=s,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 o=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${n.source?`|${n.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),a=o?/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/.exec(o)?.[1].trim():null;n.requester=o&&a?{type:/\[\[User( talk)?:/.test(o)?"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 s=document.createElement("input");s.classList.add("afcrc-helper-target-editor"),s.style.width=`${t.target.length}ch`,s.value=t.target,s.addEventListener("input",()=>{s.value=s.value.replaceAll("_"," "),s.style.width=`${s.value.length}ch`,this.actionsToTake[e].target=s.value,o.href=mw.util.getUrl(s.value)}),i.append(s);let o=document.createElement("a");o.classList.add("afcrc-helper-external-link"),o.target="_blank",o.href=mw.util.getUrl(t.target),o.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(o),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 T=this.actionsToTake[e].requests[t.pages[0]];for(let[O,E]of p.entries())O!==0&&E.updateFromAction(T)}),g.append(u.$element[0])}for(let u of t.pages){let T=new M(e,u,n,g,this);T.setUp(),p.push(T)}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"),s=n.find(l=>l.action==="close")?.closingReason?.id,o=n.every(l=>l.action==="close"&&l.closingReason?.id===s),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 o&&(s==="r"?a="#ffcece":s==="s"?a="#90c090":a="#b8b8b8");e.style.backgroundColor=a}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(s=>Object.values(s.requests).some(o=>o.action!=="none"))){for(let{target:o,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 "${o}" 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 "${o}" 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 "${o}" 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 "${o}" 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(O=>`[[${O}]]`).join(", ")}) ~~~~`,T=this.mapDeniedReasons(C,!1,!1);for(let O of f)this.handleAcceptedRedirect(O,a[O],o);g=this.modifySectionData(g,{append:`${u}
${T}`})}else if(f.length>0){p="a";for(let u of f)this.handleAcceptedRedirect(u,a[u],o);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 s=Object.entries(t).filter(([,o])=>o>0).map(([o,a])=>`${o} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC redirect requests (${s})${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(o=>{let a=t.redirectTemplateParameters?.find(c=>c.name===o);if(!a)return`{{${o}}}`;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`{{${o}${d}}}`}):null,s=mw.Title.newFromText(e);this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:s.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:s.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 s=[{data:`${e}|${i}`,label:`${e} (with sort key "${i}")`}];t.resolve(s),this.emit("showing-values",s)}}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 s=i.query.pages.filter(o=>!o.categories?.some(a=>a.title==="Category:Wikipedia soft redirected categories")).map(o=>{let a=o.title.split(":")[1];return this.supportsSortKey&&this.validCategories.add(a),{data:a,label:a}});this.emit("showing-values",s),t.resolve(s)}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 s=i.query.pages.map(o=>({data:o.title,label:o.title}));this.emit("showing-values",s),t.resolve(s)}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 s=e.indexOf("[[User:"),o=e.indexOf("[[User talk:"),a=e.indexOf("[[Special:Contributions/"),l=Math.min(...[s,o,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 s=document.createElement("div");s.classList.add("afcrc-helper-request-info");let o=document.createElement("span");o.style.color="dimgray",o.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(o.cloneNode(!0));s.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(o.cloneNode(!0));s.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));s.append(f),n.append(s),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),T.$element.hide(),j.$element.hide(),N.$element.hide(),F.$element.hide(),H.$element.hide(),m){case"accept":{T.$element.show(),j.$element.show(),N.$element.show();break}case"deny":{F.$element.show();break}case"close":{H.$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 T=new OO.ui.FieldLayout(p,{align:"inline",label:"Pages to categorize:"});T.$element.hide();let O=new L({placeholder:"Add categories here"});O.on("change",()=>{let r=O.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^Category:/,""),r.length>0&&O.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),O.on("showing-values",r=>{for(let m of r)E.addAllowedValue(m.data)});let E=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:O});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 F=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'});F.$element.hide();let U=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}))}});U.getMenu().on("choose",r=>{this.actionsToTake[e].closingReason={name:r.getLabel(),id:r.getData()},this.updateRequestColor(n,e)}),U.getMenu().chooseItem(U.getMenu().findItemFromData("s"));let H=new OO.ui.FieldLayout(U,{align:"inline",label:"Closing reason:"});H.$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],T.$element[0],j.$element[0],N.$element[0],F.$element[0],H.$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(s=>s.action!=="none")){for(let o of this.actionsToTake){let a={pageText:n,...o.originalText};switch(o.action){case"accept":{a=this.modifySectionData(a,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(o),t.accepted++;break}case"deny":{a=this.modifySectionData(a,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(o.denyReason)} ~~~~
{{AfC-c|b}}`}),t.denied++;break}case"comment":{o.comment?(a=this.modifySectionData(a,{append:`* {{AfC comment|1=${o.comment}}} ~~~~`}),t["commented on"]++):e.addLogEntry(`The request to create "${o.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|${o.closingReason.id}}}`,append:(o.comment?`* {{AfC comment|1=${o.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 s=Object.entries(t).filter(([,o])=>o>0).map(([o,a])=>`${o} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC category requests (${s})${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?)+)/,s=>{i=!0;let o=s.endsWith(`
`);return`${s}${o?"":`
`}[[Category:${e.category}]]${o?`
`:""}`}),i||(n+=`
[[Category:${e.category}]]`);for(let s of e.categoriesToRemove)n=n.replaceAll(new RegExp(`\\[\\[:?[Cc]ategory:${s}(\\|.*?)?\\]\\]
?`,"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 s=n?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${s} 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=s==="redirect"?y:e,c=new d(s,t,window.afcrcConfiguration?.createdPageWatchMethod);l.addWindows([c]),c.open(),c.load()})});})();
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvYWN0aW9ucy1kaWFsb2cudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvaGVscGVyLWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9yZWRpcmVjdC1yZXF1ZXN0LWhhbmRsZXIudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvcmVkaXJlY3RzLWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9jYXRlZ29yeS1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvcGFnZS1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvY2F0ZWdvcmllcy1kaWFsb2cudHMiLCAiLi4vc3R5bGVzL2FmY3JjLWhlbHBlci5jc3MiLCAiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvYWZjcmMtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYW4gYWN0aW9uIGRpYWxvZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWN0aW9uc0RpYWxvZyBleHRlbmRzIE9PLnVpLkRpYWxvZyB7XG4gICAgcHJpdmF0ZSBjb250ZW50TGF5b3V0ITogT08udWkuUGFuZWxMYXlvdXQ7XG4gICAgcHJpdmF0ZSBsb2dPdXRwdXQhOiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIGNsb3NlQnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKHsgc2l6ZTogJ2xhcmdlJyB9KTtcblxuICAgICAgICBBY3Rpb25zRGlhbG9nLnN0YXRpYy5uYW1lID0gJ0FjdGlvbnNEaWFsb2cnO1xuICAgICAgICBBY3Rpb25zRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdBY3Rpb25zJztcbiAgICB9XG5cbiAgICBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgICBPTy51aS5EaWFsb2cucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcyk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZCh0aGlzLmNvbnRlbnRMYXlvdXQuJGVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMubG9nT3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMubG9nT3V0cHV0LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1hY3Rpb25zLWNvbnRhaW5lcicpO1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9KTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xuXG4gICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQodGhpcy5sb2dPdXRwdXQsIHRoaXMuY2xvc2VCdXR0b24uJGVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbG9nIGVudHJ5IHRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSBtZXNzYWdlIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvZ0VudHJ5KG1lc3NhZ2U6IHN0cmluZywgdHlwZTogT08udWkuTWVzc2FnZVdpZGdldC5UeXBlID0gJ25vdGljZScpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZSwgaW5saW5lOiB0cnVlLCBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KG1lc3NhZ2UpIH0pO1xuXG4gICAgICAgIHRoaXMubG9nT3V0cHV0LmFwcGVuZChtZXNzYWdlV2lkZ2V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9ICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5O1xuXG4gICAgICAgIGJvZHlFbGVtZW50WzBdLnNjcm9sbFRvKHsgdG9wOiBib2R5RWxlbWVudFswXS5zY3JvbGxIZWlnaHQsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjbG9zZSBidXR0b24gYW5kIGFkZHMgYSByZWxvYWQgYnV0dG9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93UmVsb2FkKCkge1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgICAgIGNvbnN0IHJlbG9hZEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1JlbG9hZCcsIGZsYWdzOiBbJ3ByaW1hcnknXSB9KTtcbiAgICAgICAgcmVsb2FkQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZChyZWxvYWRCdXR0b24uJGVsZW1lbnQpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihBY3Rpb25zRGlhbG9nLnByb3RvdHlwZSwgT08udWkuRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlFZGl0UGFnZVBhcmFtcywgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IE1lZGlhV2lraURhdGFFcnJvciwgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgQWN0aW9uc0RpYWxvZyBmcm9tICcuL2FjdGlvbnMtZGlhbG9nJztcbmltcG9ydCB0eXBlIHsgV2F0Y2hNZXRob2QgfSBmcm9tICcuL2FmY3JjLWhlbHBlcic7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFjdGlvbiB7XG4gICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc3RyaW5nOyBzZWN0aW9uVGV4dDogc3RyaW5nIH07XG4gICAgYWN0aW9uOiBSZXF1ZXN0QWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJvdGVjdGVkIHNjcmlwdE1lc3NhZ2UgPSAnIChbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL2FmY3JjLWhlbHBlcnxhZmNyYy1oZWxwZXJdXSknO1xuXG4gICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgIHByb3RlY3RlZCBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICBwcm90ZWN0ZWQgYmVmb3JlVGV4dCE6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHMhOiB1bmtub3duW107XG4gICAgcHJvdGVjdGVkIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgIHwgeyB0eXBlOiAnZWRpdCc7IHRpdGxlOiBzdHJpbmc7IHRyYW5zZm9ybTogKGRhdGE6IHsgY29udGVudDogc3RyaW5nIH0pID0+IEFwaUVkaXRQYWdlUGFyYW1zIH1cbiAgICAgICAgfCB7IHR5cGU6ICdjcmVhdGUnOyBpc1JlZGlyZWN0OiBib29sZWFuOyB0aXRsZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IHN1bW1hcnk6IHN0cmluZyB9XG4gICAgKVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknLCBwYWdlVGl0bGU6IHN0cmluZywgY3JlYXRlZFdhdGNoTWV0aG9kOiBXYXRjaE1ldGhvZCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy5uYW1lID0gJ0FmY3JjSGVscGVyRGlhbG9nJztcbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdhZmNyYy1oZWxwZXInO1xuICAgICAgICBIZWxwZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhZ2VUeXBlID0gcmVxdWVzdFBhZ2VUeXBlO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCA9XG4gICAgICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgID8gY3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgOiAncHJlZmVyZW5jZXMnO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLW9wZW4nKTtcbiAgICB9XG5cbiAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gJ2NhbmNlbCcpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIE9PLnVpXG4gICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlPyBBbGwgY2hhbmdlcyB3aWxsIGJlIGRpc2NhcmRlZC4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGNvbmZpcm1lZCkgPT4gKGNvbmZpcm1lZCA/IHRoaXMuY2xvc2UoKSA6IG51bGwpKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnBlcmZvcm1BY3Rpb25zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYWZjcmMtaGVscGVyLW9wZW4nKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSBwYWdlUmV2aXNpb24ucXVlcnkhLnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VSZXF1ZXN0cygpO1xuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlcXVlc3RzIGZyb20gdGhlIHBhZ2UgY29udGVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUmVxdWVzdHMoKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGV4dCA9IC9eKC4qPyk9PS9zLmV4ZWModGhpcy5wYWdlQ29udGVudCkhWzFdO1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSB0aGlzLnBhZ2VDb250ZW50LnJlcGxhY2UoL14uKj89PS9zLCAnPT0nKTtcblxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IFsuLi50aGlzLnBhZ2VDb250ZW50Lm1hdGNoQWxsKC9ePT0uKj89PSQoXFxzKig/IT09W149XSkuKikqL2dpbSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzBdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Nsb3NlZCA9IC97e2FmYy1jXFx8L2kudGVzdChzZWN0aW9uVGV4dCk7XG4gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gL149PSguKj8pPT0kL20uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgdGhpcy5wYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dCwgc2VjdGlvbkhlYWRlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hTaXplID0gNTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgYmF0Y2hTaXplLCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgYGFmY3JjLWhlbHBlciAobG9hZGluZyAke2luZGV4ICsgMX0tJHtlbmRJbmRleH0vJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMpYCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViSW5kZXggPSBpbmRleDsgc3ViSW5kZXggPCBlbmRJbmRleDsgc3ViSW5kZXgrKykgdGhpcy5sb2FkU3VidHlwZUVsZW1lbnRzKHN1YkluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKCR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzIGxvYWRlZClgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaGFuZGxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnbm90aWNlJywgbGFiZWw6ICdObyB2YWxpZCByZXF1ZXN0cyB0byBoYW5kbGUhJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgbWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChtZXNzYWdlV2lkZ2V0TGF5b3V0LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbGwgYWN0aW9ucyBhbmQgbG9ncyB0aGVpciByZXN1bHRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBhY3Rpb25zRGlhbG9nID0gbmV3IEFjdGlvbnNEaWFsb2coKTtcbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFthY3Rpb25zRGlhbG9nXSk7XG4gICAgICAgIGFjdGlvbnNEaWFsb2cub3BlbigpO1xuXG4gICAgICAgIGNvbnN0IGNvdW50cyA9IHsgJ2FjY2VwdGVkJzogMCwgJ2RlbmllZCc6IDAsICdjb21tZW50ZWQgb24nOiAwLCAnY2xvc2VkJzogMCB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXG4gICAgICAgIGNvbnN0IG5ld1BhZ2VUZXh0ID0gKFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICApLnF1ZXJ5IS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB2b2lkIHRoaXMucGVyZm9ybVN1YnR5cGVBY3Rpb25zKGFjdGlvbnNEaWFsb2csIGNvdW50cywgbmV3UGFnZVRleHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHMgYSByZXF1ZXN0IGRlbmlhbCByZWFzb24gdG8gYSB7e3N1YnN0OkFmQyByZWRpcmVjdC9jYXRlZ29yeX19IGNhbGwuXG4gICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIHRvIGZvcm1hdC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGFyYW1ldGVycyA9IHJlYXNvbi5zdGFydHNXaXRoKCdhdXRvZmlsbDonKSA/IC9hdXRvZmlsbDooXFx3KykvLmV4ZWMocmVhc29uKSFbMV0gOiBgZGVjbGluZXwyPSR7cmVhc29ufWA7XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlYXNvbmluZyA9XG4gICAgICAgICAgICByZWFzb24uc3RhcnRzV2l0aCgnYXV0b2ZpbGw6JykgJiYgcmVhc29uLmluY2x1ZGVzKCcsJykgPyAnICcgKyByZWFzb24uc2xpY2UocmVhc29uLmluZGV4T2YoJywnKSArIDEpLnRyaW0oKSA6ICcnO1xuXG4gICAgICAgIHJldHVybiBge3tzdWJzdDpBZkMgJHt0aGlzLnJlcXVlc3RQYWdlVHlwZX18JHt0ZW1wbGF0ZVBhcmFtZXRlcnN9fX0ke2FkZGl0aW9uYWxSZWFzb25pbmd9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgZGVuaWVkIHJlYXNvbnMuXG4gICAgICogQHBhcmFtIGRlbmllZFBhZ2VzIFRoZSBwYWdlcyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXM6IHN0cmluZ1tdW10sIHNpbmd1bGFyUmVxdWVzdDogYm9vbGVhbiwgYWxsUmVxdWVzdHM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHNpbmd1bGFyUmVxdWVzdCkgcmV0dXJuIGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24oZGVuaWVkUGFnZXNbMF1bMV0pfSB+fn5+YDtcblxuICAgICAgICBjb25zdCByZWFzb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtwYWdlLCByZWFzb25dIG9mIGRlbmllZFBhZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIShyZWFzb24gaW4gcmVhc29ucykpIHJlYXNvbnNbcmVhc29uXSA9IFtdO1xuICAgICAgICAgICAgcmVhc29uc1tyZWFzb25dLnB1c2gocGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWFzb25zQXJyYXkgPSBPYmplY3QuZW50cmllcyhyZWFzb25zKTtcblxuICAgICAgICByZXR1cm4gcmVhc29uc0FycmF5XG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChbcmVhc29uLCBwYWdlc10pID0+XG4gICAgICAgICAgICAgICAgICAgIGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24ocmVhc29uKX0ke3JlYXNvbnNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgYSBncm91cCBvZiBjb21tZW50cy5cbiAgICAgKiBAcGFyYW0gY29tbWVudHMgVGhlIGNvbW1lbnRzIHRvIG1hcC5cbiAgICAgKiBAcGFyYW0gc2luZ3VsYXJSZXF1ZXN0IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgdGhlIG9ubHkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYWxsUmVxdWVzdHMgV2hldGhlciBhbGwgcmVxdWVzdHMgYXJlIGJlaW5nIG1hcHBlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQ29tbWVudHMoY29tbWVudHM6IHN0cmluZ1tdW10sIHNpbmd1bGFyUmVxdWVzdDogYm9vbGVhbiwgYWxsUmVxdWVzdHM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHNpbmd1bGFyUmVxdWVzdCkgcmV0dXJuIGAqIHt7QWZDIGNvbW1lbnR8MT0ke2NvbW1lbnRzWzBdWzFdfX19IH5+fn5gO1xuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRNZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgY29tbWVudF0gb2YgY29tbWVudHMpIHtcbiAgICAgICAgICAgIGlmICghKGNvbW1lbnQgaW4gY29tbWVudE1lc3NhZ2VzKSkgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdID0gW107XG4gICAgICAgICAgICBjb21tZW50TWVzc2FnZXNbY29tbWVudF0ucHVzaChwYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRzQXJyYXkgPSBPYmplY3QuZW50cmllcyhjb21tZW50TWVzc2FnZXMpO1xuXG4gICAgICAgIHJldHVybiBjb21tZW50c0FycmF5XG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChbY29tbWVudCwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50fX19JHtjb21tZW50c0FycmF5Lmxlbmd0aCA+IDEgfHwgIWFsbFJlcXVlc3RzID8gYCAoJHtwYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KWAgOiAnJ30gfn5+fmAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW9kaWZpZXMgYSBnaXZlbiBzZWN0aW9uIHRleHQgd2l0aCBwcmVwZW5kZWQgYW5kIGFwcGVuZGVkIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25EYXRhIFRoZSBzZWN0aW9uIGRhdGEuXG4gICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIHByZXBlbmRpbmcgYW5kIGFwcGVuZGluZyB0ZXh0LlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzLnByZXBlbmQgVGhlIHRleHQgdG8gcHJlcGVuZCB0byB0aGUgc2VjdGlvbiB0ZXh0LlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzLmFwcGVuZCBUaGUgdGV4dCB0byBhcHBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbW9kaWZ5U2VjdGlvbkRhdGEoXG4gICAgICAgIHNlY3Rpb25EYXRhOiB7IHBhZ2VUZXh0OiBzdHJpbmcgfSAmIFJlcXVlc3RBY3Rpb25bJ29yaWdpbmFsVGV4dCddLFxuICAgICAgICB7IHByZXBlbmQsIGFwcGVuZCB9OiB7IHByZXBlbmQ/OiBzdHJpbmc7IGFwcGVuZD86IHN0cmluZyB9LFxuICAgICkge1xuICAgICAgICBjb25zdCB7IGZ1bGxTZWN0aW9uVGV4dDogb2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogb2xkU2VjdGlvblRleHQgfSA9IHNlY3Rpb25EYXRhO1xuXG4gICAgICAgIGlmIChwcmVwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCA9IHByZXBlbmQgKyAnXFxuJyArIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0O1xuICAgICAgICBpZiAoYXBwZW5kKSBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dCArPSAnXFxuJyArIGFwcGVuZDtcblxuICAgICAgICBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQgPSBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQucmVwbGFjZShvbGRTZWN0aW9uVGV4dCwgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQpO1xuXG4gICAgICAgIHNlY3Rpb25EYXRhLnBhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQucmVwbGFjZShvbGRGdWxsU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLmZ1bGxTZWN0aW9uVGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHNlY3Rpb25EYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGFsbCBlZGl0cyBhbmQgY3JlYXRpb25zIHRoYXQgbmVlZCB0byBiZSBtYWRlLlxuICAgICAqIEBwYXJhbSBhY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gbG9nIHRoZSByZXN1bHRzIHRvLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBtYWtlQWxsRWRpdHNDcmVhdGlvbnMoYWN0aW9uc0RpYWxvZzogQWN0aW9uc0RpYWxvZykge1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYWN0aW9uXSBvZiB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgYXBpRnVuY3Rpb24gPVxuICAgICAgICAgICAgICAgIGFjdGlvbi50eXBlID09PSAnZWRpdCdcbiAgICAgICAgICAgICAgICAgICAgPyAoKSA9PiB0aGlzLmFwaS5lZGl0KGFjdGlvbi50aXRsZSwgYWN0aW9uLnRyYW5zZm9ybSlcbiAgICAgICAgICAgICAgICAgICAgOiAoKSA9PiB0aGlzLmFwaS5jcmVhdGUoYWN0aW9uLnRpdGxlLCB7IHN1bW1hcnk6IGFjdGlvbi5zdW1tYXJ5LCB3YXRjaGxpc3Q6IHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCB9LCBhY3Rpb24udGV4dCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYWN0aW9uLnRpdGxlLCAnaXNSZWRpcmVjdCcgaW4gYWN0aW9uICYmIGFjdGlvbi5pc1JlZGlyZWN0ID8geyByZWRpcmVjdDogJ25vJyB9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gYWN0aW9uLnRpdGxlO1xuXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25SZXN1bHRFbGVtZW50SWQgPSBgYWZjcmMtaGVscGVyLWFjdGlvbi1yZXN1bHQtJHtpbmRleH1gO1xuXG4gICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgIGAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH0uLi4gPHNwYW4gaWQ9XCIke2FjdGlvblJlc3VsdEVsZW1lbnRJZH1cIj48L3NwYW4+YCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCBhcGlGdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gJ1N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlua0VsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoJ25vY2hhbmdlJyBpbiByZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgU3BlY2lhbDpEaWZmLyR7cmVzdWx0Lm9sZHJldmlkID8gYCR7cmVzdWx0Lm9sZHJldmlkfS9gIDogJyd9JHtyZXN1bHQubmV3cmV2aWR9YCwgLy8gb2xkcmV2aWQgaXMgMCBvbiBwYWdlIGNyZWF0aW9ucywgYW5kIGlzIHRodXMgdW5uZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gJ2RpZmYnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25SZXN1bHRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7YWN0aW9uUmVzdWx0RWxlbWVudElkfWApITtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmtFbGVtZW50KSBhY3Rpb25SZXN1bHRFbGVtZW50LmFwcGVuZCgnKGRvbmUsIHNlZSAnLCBsaW5rRWxlbWVudCwgJyknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYWN0aW9uUmVzdWx0RWxlbWVudC50ZXh0Q29udGVudCA9ICcoZG9uZSwgbm8gY2hhbmdlcyknO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goYXN5bmMgKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdyYXRlbGltaXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFJhdGUgbGltaXRlZC4gV2FpdGluZyBmb3IgNzAgc2Vjb25kcy4uLiAocmVzdW1pbmcgYXQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgNzBfMDAwKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNzBfMDAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0NvbnRpbnVpbmcuLi4nLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGlGdW5jdGlvbigpLmNhdGNoKChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnZWRpdGluZycgOiAnY3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH06ICR7KGVycm9ySW5mbyBhcyBNZWRpYVdpa2lEYXRhRXJyb3IpPy5lcnJvcj8uaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yPy5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlIGFzIHN0cmluZ30pLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGxvYWRTdWJ0eXBlRWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWF3YWl0XG4gICAgcHJvdGVjdGVkIGFzeW5jIHBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhkaWFsb2c6IEFjdGlvbnNEaWFsb2csIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgbmV3UGFnZVRleHQ6IHN0cmluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG59XG5cbk9iamVjdC5hc3NpZ24oSGVscGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB9IGZyb20gJy4uL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdEFjdGlvblR5cGUgfSBmcm9tICcuL2hlbHBlci1kaWFsb2cnO1xuaW1wb3J0IHR5cGUgUmVkaXJlY3RzRGlhbG9nIGZyb20gJy4vcmVkaXJlY3RzLWRpYWxvZyc7XG5pbXBvcnQgdHlwZSB7IFJlZGlyZWN0QWN0aW9uIH0gZnJvbSAnLi9yZWRpcmVjdHMtZGlhbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciB7XG4gICAgcHJpdmF0ZSB0aXRsZUluZGV4OiBudW1iZXI7XG4gICAgcHJpdmF0ZSB0aXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwcml2YXRlIHJlc3BvbmRlckVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgZGlhbG9nOiBSZWRpcmVjdHNEaWFsb2c7XG5cbiAgICBwcml2YXRlIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcj86IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBhY3Rpb25SYWRpb0lucHV0ITogT08udWkuUmFkaW9TZWxlY3RXaWRnZXQ7XG4gICAgcHJpdmF0ZSB0YWdTZWxlY3QhOiBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgcHJpdmF0ZSBkZW55UmVhc29uSW5wdXQhOiBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgY2xvc2luZ1JlYXNvbkRyb3Bkb3duITogT08udWkuRHJvcGRvd25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBjb21tZW50SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG5cbiAgICBwcml2YXRlIHRhZ1NlbGVjdExheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgZGVueVJlYXNvbkxheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgY2xvc2luZ1JlYXNvbkxheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgY29tbWVudExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRpdGxlSW5kZXg6IG51bWJlcixcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCxcbiAgICAgICAgcmVzcG9uZGVyRWxlbWVudDogSFRNTERpdkVsZW1lbnQsXG4gICAgICAgIGRpYWxvZzogUmVkaXJlY3RzRGlhbG9nLFxuICAgICkge1xuICAgICAgICB0aGlzLnRpdGxlSW5kZXggPSB0aXRsZUluZGV4O1xuICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuZGV0YWlsc0VsZW1lbnQgPSBkZXRhaWxzRWxlbWVudDtcbiAgICAgICAgdGhpcy5yZXNwb25kZXJFbGVtZW50ID0gcmVzcG9uZGVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgcmVxdWVzdCBoYW5kbGVyLCBsb2FkaW5nIGVsZW1lbnRzIGludG8gdGhlIERPTS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VXAoKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gdGhpcy50aXRsZTtcbiAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKGxhYmVsKTtcblxuICAgICAgICB0aGlzLmFjdGlvblJhZGlvSW5wdXQgPSBuZXcgT08udWkuUmFkaW9TZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICBpdGVtczogWydBY2NlcHQnLCAnRGVueScsICdDb21tZW50JywgJ0Nsb3NlJywgJ05vbmUnXS5tYXAoXG4gICAgICAgICAgICAgICAgKGxhYmVsKSA9PiBuZXcgT08udWkuUmFkaW9PcHRpb25XaWRnZXQoeyBkYXRhOiBsYWJlbC50b0xvd2VyQ2FzZSgpLCBsYWJlbCB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlEYXRhKCdub25lJyk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25SYWRpb0lucHV0Lm9uKCdjaG9vc2UnLCAoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uQ2hhbmdlKHNlbGVjdGVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkQ29tbWVudExheW91dCgpO1xuXG4gICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZCh0aGlzLmFjdGlvblJhZGlvSW5wdXQuJGVsZW1lbnRbMF0sIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgdGhpcy5yZXNwb25kZXJFbGVtZW50LmFwcGVuZChyZXF1ZXN0ZWRUaXRsZURpdik7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUZyb21BY3Rpb24oYWN0aW9uOiBSZWRpcmVjdEFjdGlvbikge1xuICAgICAgICB0aGlzLmFjdGlvblJhZGlvSW5wdXQuY2hvb3NlSXRlbSh0aGlzLmFjdGlvblJhZGlvSW5wdXQuZmluZEl0ZW1Gcm9tRGF0YShhY3Rpb24uYWN0aW9uKSBhcyBPTy51aS5PcHRpb25XaWRnZXQpO1xuXG4gICAgICAgIHN3aXRjaCAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKGFjdGlvbi5yZWRpcmVjdFRlbXBsYXRlcyA/PyBbXSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLnJlZGlyZWN0VGVtcGxhdGVzKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlZGl0b3JJbmRleCwgdGVtcGxhdGVdIG9mIGFjdGlvbi5yZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycyEuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbi5yZWRpcmVjdFRlbXBsYXRlcy5pbmNsdWRlcyh0ZW1wbGF0ZS5uYW1lKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXJhbWV0ZXJzID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvW2VkaXRvckluZGV4XS5wYXJhbWV0ZXJzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJJbmRleCwgbmV3UGFyYW1ldGVyXSBvZiB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLmVudHJpZXMoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFyYW1ldGVyc1twYXJhbWV0ZXJJbmRleF0uZWRpdG9yLnNldFZhbHVlKG5ld1BhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbnlSZWFzb25JbnB1dC5zZXRWYWx1ZShhY3Rpb24uZGVueVJlYXNvbiEpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVueVJlYXNvbklucHV0XG4gICAgICAgICAgICAgICAgICAgIC5nZXRNZW51KClcbiAgICAgICAgICAgICAgICAgICAgLmNob29zZUl0ZW0odGhpcy5kZW55UmVhc29uSW5wdXQuZ2V0TWVudSgpLmZpbmRJdGVtRnJvbURhdGEoYWN0aW9uLmRlbnlSZWFzb24hKSBhcyBPTy51aS5PcHRpb25XaWRnZXQpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25Ecm9wZG93blxuICAgICAgICAgICAgICAgICAgICAuZ2V0TWVudSgpXG4gICAgICAgICAgICAgICAgICAgIC5jaG9vc2VJdGVtKHRoaXMuY2xvc2luZ1JlYXNvbkRyb3Bkb3duLmdldE1lbnUoKS5maW5kSXRlbUZyb21EYXRhKGFjdGlvbi5jbG9zaW5nUmVhc29uIS5pZCkgYXMgT08udWkuT3B0aW9uV2lkZ2V0KTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tZW50SW5wdXQuc2V0VmFsdWUoYWN0aW9uLmNvbW1lbnQgPz8gJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIHNlbGVjdGVkIGFjdGlvbiBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBzZWxlY3RlZCBUaGUgbmV3IHNlbGVjdGVkIG9wdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZUFjdGlvbkNoYW5nZShzZWxlY3RlZDogT08udWkuT3B0aW9uV2lkZ2V0KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5kaWFsb2cudXBkYXRlU2l6ZSgpLCAwKTtcblxuICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3RlZC5nZXREYXRhKCkgYXMgUmVxdWVzdEFjdGlvblR5cGU7XG5cbiAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgYWN0aW9uOiBvcHRpb24gfSk7XG5cbiAgICAgICAgdGhpcy5kaWFsb2cudXBkYXRlUmVxdWVzdENvbG9yKHRoaXMuZGV0YWlsc0VsZW1lbnQsIHRoaXMudGl0bGVJbmRleCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGFnU2VsZWN0TGF5b3V0KSB0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcikgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICBpZiAodGhpcy5kZW55UmVhc29uTGF5b3V0KSB0aGlzLmRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0KSB0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRhZ1NlbGVjdExheW91dCB8fCAhdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpIHRoaXMubG9hZFRhZ1NlbGVjdEFuZFBhcmFtZXRlcnNFZGl0b3IoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0IS4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IhLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kZW55UmVhc29uTGF5b3V0KSB0aGlzLmxvYWREZW55UmVhc29uTGF5b3V0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRlbnlSZWFzb25MYXlvdXQhLiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQpIHRoaXMubG9hZENsb3NpbmdSZWFzb25MYXlvdXQoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCEuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoWydhY2NlcHQnLCAnY29tbWVudCcsICdjbG9zZSddLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQgfSk7XG4gICAgICAgICAgICBlbHNlIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNvbW1lbnQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSB0YWcgc2VsZWN0IGFuZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGVkaXRvcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkVGFnU2VsZWN0QW5kUGFyYW1ldGVyc0VkaXRvcigpIHtcbiAgICAgICAgdGhpcy50YWdTZWxlY3QgPSBuZXcgT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuZW50cmllcyh0aGlzLmRpYWxvZy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gY2xhc3M9XCJhZmNyYy1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllc1wiPiR7dGFnfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgdGhpcy50YWdTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRhZ3MgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IHNlbGVjdGVkVGFncy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRhZ3Muam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZFRhZ3MuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IHJlZGlyZWN0VGVtcGxhdGVzOiBzb3J0ZWRUYWdzIH0pO1xuXG4gICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVGFnU2VsZWN0ZWQgPSBzb3J0ZWRUYWdzLmluY2x1ZGVzKGVkaXRvckluZm8ubmFtZSk7XG5cbiAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9IGlzVGFnU2VsZWN0ZWQgPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFnU2VsZWN0ZWQpIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMudGFnU2VsZWN0LCB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci10YWctc2VsZWN0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCB0ZW1wbGF0ZXM6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZGlhbG9nLnJlZGlyZWN0VGVtcGxhdGVzKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICBzdW1tYXJ5LnRleHRDb250ZW50ID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsLnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzOiB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8gfSk7XG5cbiAgICAgICAgY29uc3Qgbm9UZW1wbGF0ZXNNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5pZCA9ICdhZmNyYy1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2UnO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UudGV4dENvbnRlbnQgPSAnTm8gdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0byBkaXNwbGF5ISc7XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKG5vVGVtcGxhdGVzTWVzc2FnZSk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGRlbnkgcmVhc29uIGxheW91dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWREZW55UmVhc29uTGF5b3V0KCkge1xuICAgICAgICB0aGlzLmRlbnlSZWFzb25JbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnYXV0b2ZpbGw6dW5saWtlbHknLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIFsnZXhpc3RzJywgJ2V4aXN0aW5nIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgWydlbXB0eScsICdlbXB0eSBzdWJtaXNzaW9ucyddLFxuICAgICAgICAgICAgICAgIFsnbm90YXJnZXQnLCAnbm9uZXhpc3RlbnQgb3Igbm8gcHJvdmlkZWQgdGFyZ2V0J10sXG4gICAgICAgICAgICAgICAgWydub3RpdGxlJywgJ25vIHRpdGxlIHByb3ZpZGVkJ10sXG4gICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICd1bmxpa2VseSByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICBbJ3VucmVsYXRlZCcsICdhcHBhcmVudGx5IHVucmVsYXRlZCB0aXRsZXMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdHJlZGlyZWN0JywgJ2FydGljbGUgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICBbJ2V4dGVybmFsbGluaycsICdleHRlcm5hbCBsaW5rIHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgIFsnZWRpdHJlcXVlc3QnLCAnZWRpdCByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZW55UmVhc29uSW5wdXQub24oJ2NoYW5nZScsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgZGVueVJlYXNvbjogdmFsdWUgfHwgJ2F1dG9maWxsOnVubGlrZWx5JyB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZW55UmVhc29uSW5wdXQuc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgIHRoaXMuZGVueVJlYXNvbklucHV0LmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuXG4gICAgICAgIHRoaXMuZGVueVJlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmRlbnlSZWFzb25JbnB1dCwge1xuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMuZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGNsb3NpbmcgcmVhc29uIGxheW91dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRDbG9zaW5nUmVhc29uTGF5b3V0KCkge1xuICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25Ecm9wZG93biA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgWydObyByZXNwb25zZScsICdyJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgWydXaXRoZHJhd24nLCAndyddLFxuICAgICAgICAgICAgICAgIF0ubWFwKChbdGl0bGUsIGlkXSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IHRpdGxlIH0pKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkRyb3Bkb3duLmdldE1lbnUoKS5vbignY2hvb3NlJywgKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjbG9zaW5nUmVhc29uOiB7IG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLCBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyB9IH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy51cGRhdGVSZXF1ZXN0Q29sb3IodGhpcy5kZXRhaWxzRWxlbWVudCwgdGhpcy50aXRsZUluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uRHJvcGRvd24uZ2V0TWVudSgpLmNob29zZUl0ZW0odGhpcy5jbG9zaW5nUmVhc29uRHJvcGRvd24uZ2V0TWVudSgpLmZpbmRJdGVtRnJvbURhdGEoJ3MnKSBhcyBPTy51aS5PcHRpb25XaWRnZXQpO1xuXG4gICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNsb3NpbmdSZWFzb25Ecm9wZG93biwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGNvbW1lbnQgbGF5b3V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZENvbW1lbnRMYXlvdXQoKSB7XG4gICAgICAgIHRoaXMuY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50IH0pO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHJlcXVlc3QncyBhY3Rpb25zIGRhdGEuXG4gICAgICogQHBhcmFtIHVwZGF0ZSBUaGUgdXBkYXRlcyB0byBtYWtlLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlQWN0aW9uc1RvVGFrZSh1cGRhdGU6IFBhcnRpYWw8UmVkaXJlY3RBY3Rpb24+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kaWFsb2cuYWN0aW9uc1RvVGFrZVt0aGlzLnRpdGxlSW5kZXhdLnJlcXVlc3RzW3RoaXMudGl0bGVdLCB1cGRhdGUpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RUZW1wbGF0ZURhdGEsIFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgdHlwZSBBY3Rpb25zRGlhbG9nIGZyb20gJy4vYWN0aW9ucy1kaWFsb2cnO1xuaW1wb3J0IEhlbHBlckRpYWxvZywgeyB0eXBlIFJlcXVlc3RBY3Rpb24sIHR5cGUgUmVxdWVzdFJlcXVlc3RlciB9IGZyb20gJy4vaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciBmcm9tICcuL3JlZGlyZWN0LXJlcXVlc3QtaGFuZGxlcic7XG5cbmludGVyZmFjZSBSZWRpcmVjdFJlcXVlc3REYXRhIHtcbiAgICBwYWdlczogc3RyaW5nW107XG4gICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmc7XG4gICAgcmVxdWVzdGVyOiBSZXF1ZXN0UmVxdWVzdGVyO1xufVxuXG5leHBvcnQgdHlwZSBSZWRpcmVjdEFjdGlvbiA9IFJlcXVlc3RBY3Rpb24gJiB7IHJlZGlyZWN0VGVtcGxhdGVzPzogc3RyaW5nW107IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdIH07XG5cbnR5cGUgUmVkaXJlY3RBY3Rpb25zID0geyB0YXJnZXQ6IHN0cmluZzsgcmVxdWVzdHM6IFJlY29yZDxzdHJpbmcsIFJlZGlyZWN0QWN0aW9uPiB9W107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0c0RpYWxvZyBleHRlbmRzIEhlbHBlckRpYWxvZyB7XG4gICAgcHVibGljIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHM6IFJlZGlyZWN0UmVxdWVzdERhdGFbXSA9IFtdO1xuICAgIHB1YmxpYyBhY3Rpb25zVG9UYWtlOiBSZWRpcmVjdEFjdGlvbnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiAnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHQ7XG5cbiAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICByZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UucXVlcnkhLnBhZ2VzWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgICAgICB2b2lkIHN1cGVyLmxvYWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgcmVkaXJlY3QgcmVxdWVzdHMgZnJvbSBzZWN0aW9uIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSBzZWN0aW9uIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25IZWFkZXIgVGhlIHNlY3Rpb24gaGVhZGVyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dDogc3RyaW5nLCBzZWN0aW9uSGVhZGVyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHt9IGFzIFJlZGlyZWN0UmVxdWVzdERhdGE7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVkUGFnZXMgPSBzZWN0aW9uSGVhZGVyXG4gICAgICAgICAgICAubWF0Y2hBbGwoL1xcW1xcWyguKj8pXV0vZylcbiAgICAgICAgICAgIC50b0FycmF5KClcbiAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBpZiAocmVxdWVzdGVkUGFnZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgcGFyc2VkRGF0YS5wYWdlcyA9IHJlcXVlc3RlZFBhZ2VzO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IC9UYXJnZXQgb2YgcmVkaXJlY3Q6ID9cXFtcXFsoLio/KV1dLy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgaWYgKCFwYXJzZWRUYXJnZXQpIHJldHVybjtcblxuICAgICAgICBwYXJzZWREYXRhLnRhcmdldCA9IHBhcnNlZFRhcmdldDtcblxuICAgICAgICBwYXJzZWREYXRhLnJlYXNvbiA9IC9yZWFzb246ID8oLio/KVxcKnNvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86L2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgIHBhcnNlZERhdGEuc291cmNlID0gL3NvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86ID8oLio/KSg/OjxyZWZlcmVuY2VzIFxcLz58XFxuXFxuKS9pcy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKSA/PyAnJztcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXIgPSBzZWN0aW9uVGV4dFxuICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0LmluY2x1ZGVzKCc8cmVmZXJlbmNlcyAvPicpXG4gICAgICAgICAgICAgICAgICAgID8gLzxyZWZlcmVuY2VzIFxcLz5cXG4rKC4qKS9cbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBgKD86PHJlZmVyZW5jZXMgXFxcXC8+JHtwYXJzZWREYXRhLnNvdXJjZSA/IGB8JHtwYXJzZWREYXRhLnNvdXJjZS5yZXBsYWNlQWxsKC9bXFxzIyQoKSorLC4/W1xcXFxcXF1ee3x9LV0vZywgJ1xcXFwkJicpfWAgOiAnJ30pXFxuKyguKilgLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApPy5bMV1cbiAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IHJlcXVlc3RlciA/IC8oPzpTcGVjaWFsOkNvbnRyaWJ1dGlvbnNcXC98VXNlcig/OiB0YWxrKT86KSguKj8pXFx8Ly5leGVjKHJlcXVlc3Rlcik/LlsxXS50cmltKCkgOiBudWxsO1xuXG4gICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID0gcmVxdWVzdGVyICYmIG5hbWUgPyB7IHR5cGU6IC9cXFtcXFtVc2VyKCB0YWxrKT86Ly50ZXN0KHJlcXVlc3RlcikgPyAndXNlcicgOiAnaXAnLCBuYW1lIH0gOiBudWxsO1xuXG4gICAgICAgIHRoaXMucGFyc2VkUmVxdWVzdHMucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2UucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHBhcnNlZERhdGEudGFyZ2V0LFxuICAgICAgICAgICAgcmVxdWVzdHM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IFtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhIGdpdmVuIHJlZGlyZWN0IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlcXVlc3QgdG8gbG9hZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZFN1YnR5cGVFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBhcnNlZFJlcXVlc3RzW2luZGV4XTtcblxuICAgICAgICBjb25zdCBkZXRhaWxzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmlubmVySFRNTCA9IHJlcXVlc3QucGFnZXMubWFwKChwYWdlKSA9PiBgPGI+JHtwYWdlfTwvYj5gKS5qb2luKCcsICcpICsgJyBcdTIxOTIgJztcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50Py50YWdOYW1lID09PSAnSU5QVVQnICYmIGV2ZW50LmtleSA9PT0gJyAnKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXRFZGl0b3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGFyZ2V0LWVkaXRvcicpO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmVxdWVzdC50YXJnZXQubGVuZ3RofWNoYDtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSA9IHJlcXVlc3QudGFyZ2V0O1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSA9IHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlLmxlbmd0aH1jaGA7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0udGFyZ2V0ID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZTtcblxuICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hcHBlbmQodGFyZ2V0RWRpdG9yRWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwocmVxdWVzdC50YXJnZXQpO1xuICAgICAgICBsaW5rRWxlbWVudC5pbm5lckhUTUwgPSBgXG48c3ZnIHZpZXdib3g9XCIwIDAgNDggNDhcIj5cbjxwYXRoIGQ9XCJNMzYgMjRjLTEuMiAwLTIgMC44LTIgMnYxMmMwIDEuMi0wLjggMi0yIDJoLTIyYy0xLjJcbiAgICAwLTItMC44LTItMnYtMjJjMC0xLjIgMC44LTIgMi0yaDEyYzEuMiAwIDItMC44IDItMnMtMC44LTItMi0yaC0xMmMtMy40XG4gICAgMC02IDIuNi02IDZ2MjJjMCAzLjQgMi42IDYgNiA2aDIyYzMuNCAwIDYtMi42XG4gICAgNi02di0xMmMwLTEuMi0wLjgtMi0yLTJ6XCI+PC9wYXRoPlxuPHBhdGggZD1cIk00My44IDUuMmMtMC4yLTAuNC0wLjYtMC44LTEtMS0wLjItMC4yLTAuNi0wLjItMC44LTAuMmgtMTJjLTEuMlxuICAgIDAtMiAwLjgtMiAyczAuOCAyIDIgMmg3LjJsLTE4LjYgMTguNmMtMC44IDAuOC0wLjggMiAwIDIuOCAwLjQgMC40IDAuOFxuICAgIDAuNiAxLjQgMC42czEtMC4yIDEuNC0wLjZsMTguNi0xOC42djcuMmMwIDEuMiAwLjggMiAyIDJzMi0wLjhcbiAgICAyLTJ2LTEyYzAtMC4yIDAtMC42LTAuMi0wLjh6XCI+PC9wYXRoPlxuPC9zdmc+YDtcblxuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgY29uc3Qgbm9uZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICBjb25zdCB1bmtub3duRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdW5rbm93bkVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgIGNvbnN0IHJlYXNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHJlYXNvbkxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICByZWFzb25MYWJlbC50ZXh0Q29udGVudCA9ICdSZWFzb246ICc7XG4gICAgICAgIHJlYXNvbkRpdi5hcHBlbmQocmVhc29uTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlYXNvbikgcmVhc29uRGl2LmFwcGVuZChyZXF1ZXN0LnJlYXNvbik7XG4gICAgICAgIGVsc2UgcmVhc29uRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVhc29uRGl2KTtcblxuICAgICAgICBjb25zdCBzb3VyY2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgc291cmNlTGFiZWwudGV4dENvbnRlbnQgPSAnU291cmNlOiAnO1xuICAgICAgICBzb3VyY2VEaXYuYXBwZW5kKHNvdXJjZUxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5zb3VyY2UpIHNvdXJjZURpdi5hcHBlbmQocmVxdWVzdC5zb3VyY2UpO1xuICAgICAgICBlbHNlIHNvdXJjZURpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHNvdXJjZURpdik7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlcXVlc3RlckxhYmVsLnRleHRDb250ZW50ID0gJ1JlcXVlc3RlcjogJztcbiAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsuaHJlZiA9XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZXIudHlwZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApXG4gICAgICAgICAgICAgICAgICAgIDogbXcudXRpbC5nZXRVcmwoYFNwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRleHRDb250ZW50ID0gcmVxdWVzdC5yZXF1ZXN0ZXIubmFtZTtcbiAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgIH0gZWxzZSByZXF1ZXN0ZXJEaXYuYXBwZW5kKHVua25vd25FbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZXF1ZXN0ZXJEaXYpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyczogUmVkaXJlY3RSZXF1ZXN0SGFuZGxlcltdID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucGFnZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgbW9kaWZ5QWxsQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICAgICAgaWQ6ICdhZmNyYy1oZWxwZXItc3luYy1hbGwtd2l0aC1maXJzdC1idXR0b24nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnU3luYyBhbGwgcmVxdWVzdHMgd2l0aCBmaXJzdCcsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3JlY2VudENoYW5nZXMnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2RpZnlBbGxCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdC5wYWdlc1swXV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgaGFuZGxlcl0gb2YgaGFuZGxlcnMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci51cGRhdGVGcm9tQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmFwcGVuZChtb2RpZnlBbGxCdXR0b24uJGVsZW1lbnRbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0ZWRUaXRsZSBvZiByZXF1ZXN0LnBhZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gbmV3IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIoaW5kZXgsIHJlcXVlc3RlZFRpdGxlLCBkZXRhaWxzRWxlbWVudCwgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQsIHRoaXMpO1xuXG4gICAgICAgICAgICBoYW5kbGVyLnNldFVwKCk7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdFJlc3BvbmRlckVsZW1lbnQpO1xuXG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChkZXRhaWxzRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY29sb3Igb2YgYSBkZXRhaWxzIGVsZW1lbnQgYmFzZWQgb24gdGhlIGhhbmRsaW5nIG9mIHRoZSByZXF1ZXN0cyBpbnNpZGUuXG4gICAgICogQHBhcmFtIGRldGFpbHNFbGVtZW50IFRoZSBkZXRhaWxzIGVsZW1lbnQgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlZGlyZWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uc1RvVGFrZSA9IE9iamVjdC52YWx1ZXModGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5yZXF1ZXN0cyk7XG5cbiAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKTtcblxuICAgICAgICBjb25zdCBmaXJzdENsb3NlUmVhc29uID0gYWN0aW9uc1RvVGFrZS5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScpPy5jbG9zaW5nUmVhc29uPy5pZDtcbiAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNDbG9zZWQgPSBhY3Rpb25zVG9UYWtlLmV2ZXJ5KFxuICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyAmJiBhY3Rpb24uY2xvc2luZ1JlYXNvbj8uaWQgPT09IGZpcnN0Q2xvc2VSZWFzb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGJhY2tncm91bmRDb2xvciA9ICcnO1xuXG4gICAgICAgIGlmIChhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICBjb25zdCBhY2NlcHRlZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcpLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGRlbmllZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChhY2NlcHRlZENvdW50ID4gMCAmJiBkZW5pZWRDb3VudCA+IDApIGJhY2tncm91bmRDb2xvciA9ICcjZmZmMTdlJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGFjY2VwdGVkQ291bnQgPiAwKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2EwZmZhMCc7XG4gICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZClcbiAgICAgICAgICAgIGlmIChmaXJzdENsb3NlUmVhc29uID09PSAncicpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgIGVsc2UgaWYgKGZpcnN0Q2xvc2VSZWFzb24gPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2I4YjhiOCc7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFjdGlvbnMgb24gYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBhY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gYWRkIG1lc3NhZ2VzIHRvLlxuICAgICAqIEBwYXJhbSBjb3VudHMgVGhlIGNvdW50IG9iamVjdCB1c2VkIHRvIHRyYWNrIHJlcXVlc3RzIGZvciB0aGUgZWRpdCBzdW1tYXJ5LlxuICAgICAqIEBwYXJhbSBuZXdQYWdlVGV4dCBUaGUgbmV3IHBhZ2UgdGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcGVyZm9ybVN1YnR5cGVBY3Rpb25zKGFjdGlvbnNEaWFsb2c6IEFjdGlvbnNEaWFsb2csIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgbmV3UGFnZVRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9IHRoaXMuYWN0aW9uc1RvVGFrZS5zb21lKChhY3Rpb25EYXRhKSA9PlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhhY3Rpb25EYXRhLnJlcXVlc3RzKS5zb21lKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gIT09ICdub25lJyksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGFyZ2V0LCByZXF1ZXN0cyB9IG9mIHRoaXMuYWN0aW9uc1RvVGFrZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZQYWdlcyA9IE9iamVjdC5rZXlzKHJlcXVlc3RzKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0cykpXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGFjY2VwdGVkIG9yIGRlbmllZCwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiB3aWxsIGJlIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRQYWdlcy5wdXNoKHJlcXVlc3RlZFRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFjY2VwdGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGFjY2VwdGVkIG9yIGRlbmllZCwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBpcyBiZWluZyBpZ25vcmVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbmllZFBhZ2VzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uZGVueVJlYXNvbiFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1snY29tbWVudGVkIG9uJ10rKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke3JlcXVlc3RlZFRpdGxlfVwiIFx1MjE5MiBcIiR7dGFyZ2V0fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuY2xvc2VkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgY2xvc2VkIHdpdGggdGhlIHNhbWUgcmVhc29uLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLk9iamVjdC52YWx1ZXMocmVxdWVzdHMpWzBdLm9yaWdpbmFsVGV4dCB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiB0aGlzLm1hcENvbW1lbnRzKGNvbW1lbnRzLCBhbW91bnRPZlBhZ2VzID09PSAxLCBjb21tZW50cy5sZW5ndGggPT09IGFtb3VudE9mUGFnZXMpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9zaW5nSWQ6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwICYmIGRlbmllZFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdwJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlc01lc3NhZ2UgPSBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdH19ICgke2FjY2VwdGVkUGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSkgfn5+fmA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZW5pZWRQYWdlc01lc3NhZ2UgPSB0aGlzLm1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXMsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCR7YWNjZXB0ZWRQYWdlc01lc3NhZ2V9XFxuJHtkZW5pZWRQYWdlc01lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2EnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgYWNjZXB0ZWRQYWdlcykgdGhpcy5oYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2UsIHJlcXVlc3RzW3BhZ2VdLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0JHthY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDEgPyAnfGFsbCcgOiAnJ319fSB+fn5+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2QnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IHRoaXMubWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlcywgYW1vdW50T2ZQYWdlcyA9PT0gMSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBwcmVwZW5kOiBge3tBZkMtY3wke2Nsb3NpbmdJZH19fWAsIGFwcGVuZDogJ3t7QWZDLWN8Yn19JyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7Zmlyc3RDbG9zZVJlYXNvbn19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6ICd7e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYmVmb3JlVGV4dCArIHRoaXMucGFnZUNvbnRlbnQgPT09IG5ld1BhZ2VUZXh0KSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXBwZWRDb3VudHMgPSBPYmplY3QuZW50cmllcyhjb3VudHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogbmV3UGFnZVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgcmVkaXJlY3QgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZUFsbEVkaXRzQ3JlYXRpb25zKGFjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgYWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIHJlZGlyZWN0IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBoYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2U6IHN0cmluZywgZGF0YTogUmVkaXJlY3RBY3Rpb24sIHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID1cbiAgICAgICAgICAgIGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMgJiYgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IGRhdGEucmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM/LmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXggPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnMuZmluZExhc3RJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtZXRlciwgaW5kZXgpID0+IHBhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpICYmIHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhZ2UpITtcblxuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgdGV4dDogYCNSRURJUkVDVCBbWyR7dGFyZ2V0fV1dJHt0YWdzV2l0aEFyZ3VtZW50cyA/IGBcXG5cXG57e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1gIDogJyd9YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgcmVkaXJlY3QgdG8gW1ske3RhcmdldH1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvUl1dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMsIENhdGVnb3JpZXNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMb29rdXBFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBjYXRlZ29yeSBsb29rdXAgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIHByaXZhdGUgc3VwcG9ydHNTb3J0S2V5OiBib29sZWFuO1xuXG4gICAgcHVibGljIHZhbGlkQ2F0ZWdvcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnLCBzdXBwb3J0c1NvcnRLZXkgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5zdXBwb3J0c1NvcnRLZXkgPSBzdXBwb3J0c1NvcnRLZXk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCkuc3BsaXQoJ3wnKVswXTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNTb3J0S2V5KSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gdGhpcy5nZXRWYWx1ZSgpLnNwbGl0KCd8JylbMV07XG5cbiAgICAgICAgICAgIGlmIChzb3J0S2V5ICYmIHRoaXMudmFsaWRDYXRlZ29yaWVzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IFt7IGRhdGE6IGAke3ZhbHVlfXwke3NvcnRLZXl9YCwgbGFiZWw6IGAke3ZhbHVlfSAod2l0aCBzb3J0IGtleSBcIiR7c29ydEtleX1cIilgIH1dO1xuXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IENhdGVnb3JpZXNSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c1NvcnRLZXkpIHRoaXMudmFsaWRDYXRlZ29yaWVzLmFkZCh0aXRsZVdpdGhvdXROYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cblxuT2JqZWN0LmFzc2lnbihDYXRlZ29yeUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMb29rdXBFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBwYWdlIGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlSW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk/OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmcgfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXMubWFwKChwYWdlKSA9PiAoeyBkYXRhOiBwYWdlLnRpdGxlLCBsYWJlbDogcGFnZS50aXRsZSB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oUGFnZUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIEFjdGlvbnNEaWFsb2cgZnJvbSAnLi9hY3Rpb25zLWRpYWxvZyc7XG5pbXBvcnQgQ2F0ZWdvcnlJbnB1dFdpZGdldCBmcm9tICcuL2NhdGVnb3J5LWlucHV0LXdpZGdldCc7XG5pbXBvcnQgSGVscGVyRGlhbG9nLCB7IHR5cGUgUmVxdWVzdEFjdGlvbiwgdHlwZSBSZXF1ZXN0QWN0aW9uVHlwZSwgdHlwZSBSZXF1ZXN0UmVxdWVzdGVyIH0gZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcbmltcG9ydCBQYWdlSW5wdXRXaWRnZXQgZnJvbSAnLi9wYWdlLWlucHV0LXdpZGdldCc7XG5cbmludGVyZmFjZSBDYXRlZ29yeVJlcXVlc3REYXRhIHtcbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgIGV4YW1wbGVzOiBzdHJpbmdbXTtcbiAgICBwYXJlbnRzOiBzdHJpbmdbXTtcbiAgICByZXF1ZXN0ZXI6IFJlcXVlc3RSZXF1ZXN0ZXI7XG59XG5cbnR5cGUgQ2F0ZWdvcnlBY3Rpb24gPSBSZXF1ZXN0QWN0aW9uICYgeyBjYXRlZ29yeTogc3RyaW5nOyBjYXRlZ29yaXplZFBhZ2VzOiBzdHJpbmdbXTsgcGFyZW50czogc3RyaW5nW107IGNhdGVnb3JpZXNUb1JlbW92ZTogc3RyaW5nW10gfTtcblxudHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBDYXRlZ29yeUFjdGlvbltdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yaWVzRGlhbG9nIGV4dGVuZHMgSGVscGVyRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHM6IENhdGVnb3J5UmVxdWVzdERhdGFbXSA9IFtdO1xuICAgIHByaXZhdGUgYWN0aW9uc1RvVGFrZTogQ2F0ZWdvcnlBY3Rpb25zID0gW107XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgcmVkaXJlY3QgcmVxdWVzdHMgZnJvbSBzZWN0aW9uIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSBzZWN0aW9uIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25IZWFkZXIgVGhlIHNlY3Rpb24gaGVhZGVyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dDogc3RyaW5nLCBzZWN0aW9uSGVhZGVyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHt9IGFzIENhdGVnb3J5UmVxdWVzdERhdGE7XG5cbiAgICAgICAgY29uc3QgZm91bmRDYXRlZ29yeSA9IC86P0NhdGVnb3J5OiguKj8pKF1dfCQpLy5leGVjKHNlY3Rpb25IZWFkZXIpPy5bMV0udHJpbSgpO1xuICAgICAgICBpZiAoIWZvdW5kQ2F0ZWdvcnkpIHJldHVybjtcblxuICAgICAgICBwYXJzZWREYXRhLmNhdGVnb3J5ID0gZm91bmRDYXRlZ29yeS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICBwYXJzZWREYXRhLmV4YW1wbGVzID0gW1xuICAgICAgICAgICAgLi4uKFxuICAgICAgICAgICAgICAgIC9leGFtcGxlIHBhZ2VzIHdoaWNoIGJlbG9uZyB0byB0aGlzIGNhdGVnb3J5OiguKj8pKHBhcmVudCBjYXRlZ29yeVxcL2NhdGVnb3JpZXM6fFxcblxcW1xcWyhzcGVjaWFsOmNvbnRyaWJ1dGlvbnNcXC98dXNlcjopKS9pcy5leGVjKFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dCxcbiAgICAgICAgICAgICAgICApPy5bMV0gPz8gJydcbiAgICAgICAgICAgICkubWF0Y2hBbGwoL1xcKlxccyooPzpcXFtcXFspPyguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyksXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIHBhcnNlZERhdGEucGFyZW50cyA9IFtcbiAgICAgICAgICAgIC4uLigvcGFyZW50IGNhdGVnb3J5XFwvY2F0ZWdvcmllczooLio/KShcXG5cXG58XFxuXFxbXFxbKHNwZWNpYWw6Y29udHJpYnV0aW9uc1xcL3x1c2VyOikpL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0gPz8gJycpLm1hdGNoQWxsKFxuICAgICAgICAgICAgICAgIC8oPzwhXFx8KSM/Oj9DYXRlZ29yeTooLio/KShcXHx8XV18XFxzKj9cXG4pL2csXG4gICAgICAgICAgICApLFxuICAgICAgICBdXG4gICAgICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICBjb25zdCBmaXJzdFVzZXJJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbVXNlcjonKTtcbiAgICAgICAgY29uc3QgZmlyc3RVc2VyVGFsa0luZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tVc2VyIHRhbGs6Jyk7XG4gICAgICAgIGNvbnN0IGZpcnN0SXBJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbU3BlY2lhbDpDb250cmlidXRpb25zLycpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBNYXRoLm1pbiguLi5bZmlyc3RVc2VySW5kZXgsIGZpcnN0VXNlclRhbGtJbmRleCwgZmlyc3RJcEluZGV4XS5maWx0ZXIoKGluZGV4KSA9PiBpbmRleCAhPT0gLTEpKTtcblxuICAgICAgICBwYXJzZWREYXRhLnJlcXVlc3RlciA9XG4gICAgICAgICAgICBmaXJzdEluZGV4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICA6IGZpcnN0SW5kZXggPT09IGZpcnN0SXBJbmRleFxuICAgICAgICAgICAgICAgICAgPyB7IHR5cGU6ICdpcCcsIG5hbWU6IC9cXFtcXFtTcGVjaWFsOkNvbnRyaWJ1dGlvbnNcXC8oLio/KShcXHx8XV0pLy5leGVjKHNlY3Rpb25UZXh0KSFbMV0udHJpbSgpIH1cbiAgICAgICAgICAgICAgICAgIDogeyB0eXBlOiAndXNlcicsIG5hbWU6IC9cXFtcXFtVc2VyKD86IHRhbGspPzooLio/KShcXHx8XV0pLy5leGVjKHNlY3Rpb25UZXh0KSFbMV0udHJpbSgpIH07XG4gICAgICAgIGlmICghcGFyc2VkRGF0YS5yZXF1ZXN0ZXI/Lm5hbWUpIHBhcnNlZERhdGEucmVxdWVzdGVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLnBhcnNlZFJlcXVlc3RzLnB1c2gocGFyc2VkRGF0YSk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlLnB1c2goe1xuICAgICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZERhdGEuY2F0ZWdvcnksXG4gICAgICAgICAgICBjYXRlZ29yaXplZFBhZ2VzOiBwYXJzZWREYXRhLmV4YW1wbGVzLFxuICAgICAgICAgICAgcGFyZW50czogcGFyc2VkRGF0YS5wYXJlbnRzLFxuICAgICAgICAgICAgY2F0ZWdvcmllc1RvUmVtb3ZlOiBbLi4ucGFyc2VkRGF0YS5wYXJlbnRzXSxcbiAgICAgICAgICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCkgfSxcbiAgICAgICAgICAgIGFjdGlvbjogJ25vbmUnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhIGdpdmVuIGNhdGVnb3J5IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlcXVlc3QgdG8gbG9hZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZFN1YnR5cGVFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBhcnNlZFJlcXVlc3RzW2luZGV4XTtcblxuICAgICAgICBjb25zdCBkZXRhaWxzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmlubmVySFRNTCA9IGA8Yj5DYXRlZ29yeToke3JlcXVlc3QuY2F0ZWdvcnl9PC9iPmA7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgY29uc3Qgbm9uZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICBjb25zdCB1bmtub3duRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdW5rbm93bkVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgIGNvbnN0IGV4YW1wbGVzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgZXhhbXBsZXNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgZXhhbXBsZXNMYWJlbC50ZXh0Q29udGVudCA9ICdFeGFtcGxlczogJztcbiAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGV4YW1wbGVzTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LmV4YW1wbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgZXhhbXBsZV0gb2YgcmVxdWVzdC5leGFtcGxlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoZXhhbXBsZSk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBleGFtcGxlO1xuXG4gICAgICAgICAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gcmVxdWVzdC5leGFtcGxlcy5sZW5ndGggLSAxKSBleGFtcGxlc0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2UgZXhhbXBsZXNEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChleGFtcGxlc0Rpdik7XG5cbiAgICAgICAgY29uc3QgcGFyZW50c0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudHNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcGFyZW50c0xhYmVsLnRleHRDb250ZW50ID0gJ1BhcmVudHM6ICc7XG4gICAgICAgIHBhcmVudHNEaXYuYXBwZW5kKHBhcmVudHNMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucGFyZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHBhcmVudF0gb2YgcmVxdWVzdC5wYXJlbnRzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChgQ2F0ZWdvcnk6JHtwYXJlbnR9YCk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBwYXJlbnQ7XG5cbiAgICAgICAgICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QucGFyZW50cy5sZW5ndGggLSAxKSBwYXJlbnRzRGl2LmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBwYXJlbnRzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocGFyZW50c0Rpdik7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlcXVlc3RlckxhYmVsLnRleHRDb250ZW50ID0gJ1JlcXVlc3RlcjogJztcbiAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsuaHJlZiA9XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZXIudHlwZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApXG4gICAgICAgICAgICAgICAgICAgIDogbXcudXRpbC5nZXRVcmwoYFNwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRleHRDb250ZW50ID0gcmVxdWVzdC5yZXF1ZXN0ZXIubmFtZTtcbiAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgIH0gZWxzZSByZXF1ZXN0ZXJEaXYuYXBwZW5kKHVua25vd25FbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZXF1ZXN0ZXJEaXYpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyddLFxuICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKFxuICAgICAgICAgICAgICAgIChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwudG9Mb3dlckNhc2UoKSwgbGFiZWwgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuICAgICAgICBhY3Rpb25SYWRpb0lucHV0Lm9uKCdjaG9vc2UnLCAoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBzZWxlY3RlZC5nZXREYXRhKCkgYXMgUmVxdWVzdEFjdGlvblR5cGU7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uYWN0aW9uID0gb3B0aW9uO1xuXG4gICAgICAgICAgICBpZiAoWydjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG5cbiAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RJbnB1dCA9IG5ldyBQYWdlSW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBwYWdlcyBoZXJlJyB9KTtcbiAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwYWdlU2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBwYWdlU2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogcGFnZVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgcGFnZVNlbGVjdC5vbignY2hhbmdlJywgKHNlbGVjdGVkRWxlbWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFnZXMgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkUGFnZXMgPSBzZWxlY3RlZFBhZ2VzLnRvU29ydGVkKChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkUGFnZXMuam9pbignOycpICE9PSBzb3J0ZWRQYWdlcy5qb2luKCc7JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuYXQoLTEpIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uRHJhZ2dhYmxlRWxlbWVudCAmIE9PLnVpLkVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBwYWdlU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZFBhZ2VzLmluZGV4T2YobGFzdEVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNhdGVnb3JpemVkUGFnZXMgPSBzb3J0ZWRQYWdlcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgeyBjYXRlZ29yaXplZFBhZ2VzIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBjYXRlZ29yaXplZFBhZ2VzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlKTtcbiAgICAgICAgcGFnZVNlbGVjdC5zZXRWYWx1ZShjYXRlZ29yaXplZFBhZ2VzKTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHBhZ2VTZWxlY3QsIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ1BhZ2VzIHRvIGNhdGVnb3JpemU6JyB9KTtcbiAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBjYXRlZ29yeVJlbW92ZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlSZW1vdmVTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiBjYXRlZ29yeVJlbW92ZVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENhdGVnb3JpZXMgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkQ2F0ZWdvcmllcy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENhdGVnb3JpZXMuam9pbignOycpICE9PSBzb3J0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZENhdGVnb3JpZXMuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2F0ZWdvcmllc1RvUmVtb3ZlID0gc29ydGVkQ2F0ZWdvcmllcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgeyBwYXJlbnRzOiBwYXJlbnRDYXRlZ29yaWVzIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudENhdGVnb3JpZXMpIGNhdGVnb3J5UmVtb3ZlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYXJlbnQpO1xuICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdC5zZXRWYWx1ZShwYXJlbnRDYXRlZ29yaWVzKTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjYXRlZ29yeVJlbW92ZVNlbGVjdCwge1xuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdDYXRlZ29yaWVzIHRvIHJlbW92ZSBmcm9tIHBhZ2VzIHRvIGNhdGVnb3JpemU6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0ID0gbmV3IENhdGVnb3J5SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBjYXRlZ29yaWVzIGhlcmUnIH0sIHRydWUpO1xuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHBhcmVudENhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYXJlbnRDYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdC5vbignY2hhbmdlJywgKHNlbGVjdGVkRWxlbWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkRWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRDYXRlZ29yaWVzID0gc2VsZWN0ZWRDYXRlZ29yaWVzLnRvU29ydGVkKChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2F0ZWdvcmllcy5qb2luKCc7JykgIT09IHNvcnRlZENhdGVnb3JpZXMuam9pbignOycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLmF0KC0xKSBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkRyYWdnYWJsZUVsZW1lbnQgJiBPTy51aS5FbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3QucmVvcmRlcihsYXN0RWxlbWVudCwgc29ydGVkQ2F0ZWdvcmllcy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5wYXJlbnRzID0gc29ydGVkQ2F0ZWdvcmllcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXJlbnRDYXRlZ29yeSBvZiBwYXJlbnRDYXRlZ29yaWVzKSB7XG4gICAgICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFyZW50Q2F0ZWdvcnkpO1xuICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dC52YWxpZENhdGVnb3JpZXMuYWRkKHBhcmVudENhdGVnb3J5KTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShwYXJlbnRDYXRlZ29yaWVzKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRDYXRlZ29yeVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChwYXJlbnRDYXRlZ29yeVNlbGVjdCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnUGFyZW50IGNhdGVnb3JpZXM6JyB9KTtcbiAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGRlbnlSZWFzb24gPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogJ2F1dG9maWxsOnVubGlrZWx5JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBbJ2V4aXN0cycsICdleGlzdGluZyBjYXRlZ29yaWVzJ10sXG4gICAgICAgICAgICAgICAgWydlbXB0eScsICdlbXB0eSBzdWJtaXNzaW9ucyddLFxuICAgICAgICAgICAgICAgIFsndW5saWtlbHknLCAnY2F0ZWdvcmllcyB0aGF0IGFyZSB1bmxpa2VseSB0byBoYXZlIGVub3VnaCBwYWdlcyddLFxuICAgICAgICAgICAgICAgIFsnbm90Y2F0ZWdvcnknLCAncGFnZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb24ub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uZGVueVJlYXNvbiA9IGRlbnlSZWFzb24uZ2V0VmFsdWUoKSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVueVJlYXNvbi5zZXRWYWx1ZSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcbiAgICAgICAgZGVueVJlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcblxuICAgICAgICBjb25zdCBkZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb24sIHtcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRGVueSByZWFzb246JyxcbiAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgIFsnTm8gcmVzcG9uc2UnLCAnciddLFxuICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICBdLm1hcCgoW3RpdGxlLCBpZF0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiB0aXRsZSB9KSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkub24oJ2Nob29zZScsIChzZWxlY3RlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jbG9zaW5nUmVhc29uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLmNob29zZUl0ZW0oY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuZmluZEl0ZW1Gcm9tRGF0YSgncycpIGFzIE9PLnVpLk9wdGlvbldpZGdldCk7XG5cbiAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBjb21tZW50SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgIGNvbW1lbnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICBlbHNlIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjb21tZW50SW5wdXQsIHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY29tbWVudC1pbnB1dCddLFxuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdDb21tZW50OicsXG4gICAgICAgIH0pO1xuICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmFwcGVuZChcbiAgICAgICAgICAgIGFjdGlvblJhZGlvSW5wdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICApO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCk7XG5cbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xvciBvZiBhIGRldGFpbHMgZWxlbWVudCBiYXNlZCBvbiB0aGUgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3RzIGluc2lkZS5cbiAgICAgKiBAcGFyYW0gZGV0YWlsc0VsZW1lbnQgVGhlIGRldGFpbHMgZWxlbWVudCB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVkaXJlY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XTtcblxuICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLXN3aXRjaFxuICAgICAgICBpZiAoYWN0aW9uID09PSAnYWNjZXB0JykgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZW55JykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdjbG9zZScpXG4gICAgICAgICAgICBpZiAodGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jbG9zaW5nUmVhc29uPy5pZCA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNiOGI4YjgnO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhY3Rpb25zIG9uIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYWN0aW9uc0RpYWxvZyBUaGUgZGlhbG9nIHRvIGFkZCBtZXNzYWdlcyB0by5cbiAgICAgKiBAcGFyYW0gY291bnRzIFRoZSBjb3VudCBvYmplY3QgdXNlZCB0byB0cmFjayByZXF1ZXN0cyBmb3IgdGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgKiBAcGFyYW0gbmV3UGFnZVRleHQgVGhlIG5ldyBwYWdlIHRleHQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhhY3Rpb25zRGlhbG9nOiBBY3Rpb25zRGlhbG9nLCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIG5ld1BhZ2VUZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSB0aGlzLmFjdGlvbnNUb1Rha2Uuc29tZSgoYWN0aW9uRGF0YSkgPT4gYWN0aW9uRGF0YS5hY3Rpb24gIT09ICdub25lJyk7XG5cbiAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbkRhdGEgb2YgdGhpcy5hY3Rpb25zVG9UYWtlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLmFjdGlvbkRhdGEub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6ICd7e0FmQy1jfGF9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAnKiB7e3N1YnN0OkFmQyBjYXRlZ29yeX19IH5+fn5cXG57e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY2NlcHRlZENhdGVnb3J5KGFjdGlvbkRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6ICd7e0FmQy1jfGR9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGFjdGlvbkRhdGEuZGVueVJlYXNvbiEpfSB+fn5+XFxue3tBZkMtY3xifX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5kZW5pZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25EYXRhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlIHJlcXVlc3QgdG8gY3JlYXRlIFwiJHthY3Rpb25EYXRhLmNhdGVnb3J5fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7YWN0aW9uRGF0YS5jbG9zaW5nUmVhc29uIS5pZH19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAoYWN0aW9uRGF0YS5jb21tZW50ID8gYCoge3tBZkMgY29tbWVudHwxPSR7YWN0aW9uRGF0YS5jb21tZW50fX19IH5+fn5gIDogJycpICsgJ1xcbnt7QWZDLWN8Yn19JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuY2xvc2VkKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYmVmb3JlVGV4dCArIHRoaXMucGFnZUNvbnRlbnQgPT09IG5ld1BhZ2VUZXh0KSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXBwZWRDb3VudHMgPSBPYmplY3QuZW50cmllcyhjb3VudHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogbmV3UGFnZVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgY2F0ZWdvcnkgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZUFsbEVkaXRzQ3JlYXRpb25zKGFjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgYWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSBhY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIGNhdGVnb3J5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBjYXRlZ29yeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQWNjZXB0ZWRDYXRlZ29yeShkYXRhOiBDYXRlZ29yeUFjdGlvbikge1xuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGBDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9YCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhLnBhcmVudHMubWFwKChwYXJlbnQpID0+IGBbW0NhdGVnb3J5OiR7cGFyZW50fV1dYCkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYENyZWF0aW5nIGNhdGVnb3J5IGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5IHRhbGs6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgdGV4dDogYHt7V2lraVByb2plY3QgYmFubmVyIHNoZWxsfFxcbnt7V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufHRzPXt7c3Vic3Q6TE9DQUxUSU1FU1RBTVB9fXxyZXZpZXdlcj0ke213LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKX19fVxcbn19YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmRhdGEuY2F0ZWdvcml6ZWRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VkaXQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwYWdlLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKHsgY29udGVudCB9OiB7IGNvbnRlbnQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWRSZXBsYWNlQ2F0ZWdvcnkgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8oKFxcW1xcWzo/W0NjXWF0ZWdvcnk6Lis/XV1cXG4/KSspLywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRSZXBsYWNlQ2F0ZWdvcnkgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaEVuZHNXaXRoTmV3bGluZSA9IG1hdGNoLmVuZHNXaXRoKCdcXG4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke21hdGNofSR7bWF0Y2hFbmRzV2l0aE5ld2xpbmUgPyAnJyA6ICdcXG4nfVtbQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dJHttYXRjaEVuZHNXaXRoTmV3bGluZSA/ICdcXG4nIDogJyd9YDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRSZXBsYWNlQ2F0ZWdvcnkpIGNvbnRlbnQgKz0gYFxcbltbQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dYDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBkYXRhLmNhdGVnb3JpZXNUb1JlbW92ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwobmV3IFJlZ0V4cChgXFxcXFtcXFxcWzo/W0NjXWF0ZWdvcnk6JHtjYXRlZ29yeX0oXFxcXHwuKj8pP1xcXFxdXFxcXF1cXG4/YCwgJ2dpJyksICcnKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgcGFnZSB0byBbWzpDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV0gYXMgcmVxdWVzdGVkIGF0IFtbV1A6QUZDL0NdXSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCAiYm9keS5hZmNyYy1oZWxwZXItb3BlbiAjbXctdGVsZXBvcnQtdGFyZ2V0e3otaW5kZXg6NTAwfS5hZmNyYy1oZWxwZXItcmVxdWVzdHttYXJnaW46MTBweDtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7cGFkZGluZzo1cHg7Y29sb3I6IzIwMjEyMn0uYWZjcmMtaGVscGVyLXJlcXVlc3Qgc3VtbWFyeXtjdXJzb3I6cG9pbnRlcn0uYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3J7bWluLXdpZHRoOjFjaDttYXgtd2lkdGg6Y2FsYygxMDAlIC0gNGNoKTtmb250LWZhbWlseTptb25vc3BhY2V9LmFmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50O3RleHQtZGVjb3JhdGlvbjpub25lIWltcG9ydGFudH0uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsgc3Zne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjFlbTtoZWlnaHQ6MWVtO2ZpbGw6Y3VycmVudGNvbG9yfS5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvLC5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXJ7bWFyZ2luOjVweH0uYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbz5kaXYsLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcj5kaXZ7bWFyZ2luLXRvcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHh9LmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcj5kaXY6bGFzdC1vZi10eXBle21hcmdpbi1ib3R0b206MH0uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIC5vby11aS1maWVsZExheW91dHttYXJnaW4tbGVmdDo4cHh9LmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXQtaGVhZGVye3dpZHRoOi1tb3otbWF4LWNvbnRlbnQ7d2lkdGg6bWF4LWNvbnRlbnR9I2FmY3JjLWhlbHBlci1zeW5jLWFsbC13aXRoLWZpcnN0LWJ1dHRvbnttYXJnaW4tYm90dG9tOjVweH0uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpb3ttYXJnaW4tdG9wOjhweH0uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyAub28tdWktcmFkaW9PcHRpb25XaWRnZXR7ZGlzcGxheTppbmxpbmU7cGFkZGluZzo4cHh9LmFmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0LC5hZmNyYy1jb21tZW50LWlucHV0e21heC13aWR0aDo1MCV9LmFmY3JjLWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzOmFmdGVye2NvbnRlbnQ6XCIgKHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcylcIjtmb250LXN0eWxlOml0YWxpY30uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLC5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlsc3ttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O2JvcmRlcjoxcHggc29saWQgI2EyYTliMTtib3JkZXItcmFkaXVzOjJweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cGFkZGluZzo1cHh9LmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcnttYXJnaW4tbGVmdDo4cHh9LmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5e2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjcwMH0uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHN7bWFyZ2luLXRvcDo1cHg7bWFyZ2luLWJvdHRvbTo1cHg7YmFja2dyb3VuZC1jb2xvcjojZTJlMmUyfS5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyAub28tdWktZmllbGRMYXlvdXQtaGVhZGVye21heC13aWR0aDoxMDAlIWltcG9ydGFudH0jYWZjcmMtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdle3BhZGRpbmc6NXB4fS5hZmNyYy1oZWxwZXItYWN0aW9ucy1jb250YWluZXIgZGl2e21hcmdpbi10b3A6OHB4O21hcmdpbi1ib3R0b206OHB4fVxuIiwgImltcG9ydCBjc3NDb250ZW50IGZyb20gJy4uLy4uL3N0eWxlcy9hZmNyYy1oZWxwZXIuY3NzJyB3aXRoIHsgdHlwZTogJ2NzcycgfTtcblxuZXhwb3J0IHR5cGUgV2F0Y2hNZXRob2QgPSAnbm9jaGFuZ2UnIHwgJ3ByZWZlcmVuY2VzJyB8ICd1bndhdGNoJyB8ICd3YXRjaCc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgYWZjcmNDb25maWd1cmF0aW9uPzogeyBjcmVhdGVkUGFnZVdhdGNoTWV0aG9kPzogV2F0Y2hNZXRob2QgfTtcbiAgICB9XG59XG5cbm13LmxvYWRlci51c2luZyhbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJ10sIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IFJlZGlyZWN0c0RpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KCcuL3JlZGlyZWN0cy1kaWFsb2cnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICBjb25zdCB7IGRlZmF1bHQ6IENhdGVnb3JpZXNEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnLi9jYXRlZ29yaWVzLWRpYWxvZycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXG4gICAgY29uc3QgcGFnZU5hbWUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICBjb25zdCBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPSBwYWdlTmFtZSA9PT0gJ1dpa2lwZWRpYTpBcnRpY2xlcyBmb3IgY3JlYXRpb24vUmVkaXJlY3RzJztcbiAgICBjb25zdCBpc0NhdGVnb3J5UmVxdWVzdFBhZ2UgPSBwYWdlTmFtZSA9PT0gJ1dpa2lwZWRpYTpBcnRpY2xlcyBmb3IgY3JlYXRpb24vQ2F0ZWdvcmllcyc7XG5cbiAgICBpZiAoIWlzUmVkaXJlY3RSZXF1ZXN0UGFnZSAmJiAhaXNDYXRlZ29yeVJlcXVlc3RQYWdlKSByZXR1cm47XG5cbiAgICBjb25zdCByZXF1ZXN0UGFnZVR5cGUgPSBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPyAncmVkaXJlY3QnIDogJ2NhdGVnb3J5JztcblxuICAgIGNvbnN0IGxpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuICAgICAgICBtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICdwLXRiJyA6ICdwLWNhY3Rpb25zJyxcbiAgICAgICAgJyMnLFxuICAgICAgICBgSGFuZGxlICR7cmVxdWVzdFBhZ2VUeXBlfSBjcmVhdGlvbiByZXF1ZXN0c2AsXG4gICAgICAgICdhZmNyYy1oZWxwZXInLFxuICAgICkhO1xuXG4gICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIG13LnV0aWwuYWRkQ1NTKGNzc0NvbnRlbnQpO1xuXG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBoZWxwZXIgPSByZXF1ZXN0UGFnZVR5cGUgPT09ICdyZWRpcmVjdCcgPyBSZWRpcmVjdHNEaWFsb2cgOiBDYXRlZ29yaWVzRGlhbG9nO1xuXG4gICAgICAgIGNvbnN0IGFmY3JjSGVscGVyRGlhbG9nID0gbmV3IGhlbHBlcihyZXF1ZXN0UGFnZVR5cGUsIHBhZ2VOYW1lLCB3aW5kb3cuYWZjcmNDb25maWd1cmF0aW9uPy5jcmVhdGVkUGFnZVdhdGNoTWV0aG9kKTtcblxuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW2FmY3JjSGVscGVyRGlhbG9nXSk7XG5cbiAgICAgICAgYWZjcmNIZWxwZXJEaWFsb2cub3BlbigpO1xuICAgICAgICB2b2lkIGFmY3JjSGVscGVyRGlhbG9nLmxvYWQoKTtcbiAgICB9KTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2tKQUFBLElBR3FCQSxFQUhyQkMsRUFBQUMsRUFBQSxrQkFHcUJGLEVBQXJCLE1BQXFCRyxVQUFzQixHQUFHLEdBQUcsTUFBTyxDQUM1QyxjQUNBLFVBQ0EsWUFFUixhQUFjLENBQ1YsTUFBTSxDQUFFLEtBQU0sT0FBUSxDQUFDLEVBRXZCQSxFQUFjLE9BQU8sS0FBTyxnQkFDNUJBLEVBQWMsT0FBTyxNQUFRLFNBQ2pDLENBRUEsV0FBYSxLQUNULEdBQUcsR0FBRyxPQUFPLFVBQVUsV0FBVyxNQUFNLElBQUksRUFFNUMsS0FBSyxjQUFnQixJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUUsT0FBUSxHQUFNLFNBQVUsRUFBTSxDQUFDLEVBQzNFLEtBQXNDLE1BQU0sT0FBTyxLQUFLLGNBQWMsUUFBUSxFQUUvRSxLQUFLLFVBQVksU0FBUyxjQUFjLEtBQUssRUFDN0MsS0FBSyxVQUFVLFVBQVUsSUFBSSxnQ0FBZ0MsRUFFN0QsS0FBSyxZQUFjLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBRSxNQUFPLFFBQVMsTUFBTyxDQUFDLE9BQVEsT0FBTyxDQUFFLENBQUMsRUFDdEYsS0FBSyxZQUFZLEdBQUcsUUFBUyxJQUFNLEtBQUssTUFBTSxDQUFDLEVBRS9DLEtBQUssY0FBYyxTQUFTLE9BQU8sS0FBSyxVQUFXLEtBQUssWUFBWSxRQUFRLEVBRXJFLE1BUUosWUFBWUMsRUFBaUJDLEVBQWlDLFNBQVUsQ0FDM0UsSUFBTUMsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFFLEtBQUFELEVBQU0sT0FBUSxHQUFNLE1BQU8sSUFBSSxHQUFHLEdBQUcsWUFBWUQsQ0FBTyxDQUFFLENBQUMsRUFFM0csS0FBSyxVQUFVLE9BQU9FLEVBQWMsU0FBUyxDQUFDLENBQUMsRUFFL0MsS0FBSyxXQUFXLEVBRWhC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SyxlQUNqQixHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQy9DLElBQ0EsVUFBVUMsQ0FBZSxxQkFDekIsY0FDSixFQUVLLGlCQUFpQixRQUFVQyxHQUFVLENBQ3RDQSxFQUFNLGVBQWUsRUFFckIsR0FBRyxLQUFLLE9BQU9DLENBQVUsRUFFekIsSUFBTUMsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FDaEMsU0FBUyxLQUFLLE9BQU9BLEVBQWMsU0FBUyxDQUFDLENBQUMsRUFFOUMsSUFBTUMsRUFBU0osSUFBb0IsV0FBYUosRUFBa0JDLEVBRTVEUSxFQUFvQixJQUFJRCxFQUFPSixFQUFpQkYsRUFBVSxPQUFPLG9CQUFvQixzQkFBc0IsRUFFakhLLEVBQWMsV0FBVyxDQUFDRSxDQUFpQixDQUFDLEVBRTVDQSxFQUFrQixLQUFLLEVBQ2xCQSxFQUFrQixLQUFLLENBQ2hDLENBQUMsQ0FDTCxDQUFDIiwKICAibmFtZXMiOiBbIkFjdGlvbnNEaWFsb2ciLCAiaW5pdF9hY3Rpb25zX2RpYWxvZyIsICJfX2VzbU1pbiIsICJfQWN0aW9uc0RpYWxvZyIsICJtZXNzYWdlIiwgInR5cGUiLCAibWVzc2FnZVdpZGdldCIsICJib2R5RWxlbWVudCIsICJyZWxvYWRCdXR0b24iLCAiSGVscGVyRGlhbG9nIiwgImluaXRfaGVscGVyX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X2FjdGlvbnNfZGlhbG9nIiwgIl9IZWxwZXJEaWFsb2ciLCAicmVxdWVzdFBhZ2VUeXBlIiwgInBhZ2VUaXRsZSIsICJjcmVhdGVkV2F0Y2hNZXRob2QiLCAiYWN0aW9uIiwgImNvbmZpcm1lZCIsICJwYWdlUmV2aXNpb24iLCAic2VjdGlvbnMiLCAibWF0Y2giLCAic2VjdGlvblRleHQiLCAic2VjdGlvbkhlYWRlciIsICJpbmRleCIsICJoYW5kbGUiLCAiZW5kSW5kZXgiLCAic3ViSW5kZXgiLCAibWVzc2FnZVdpZGdldCIsICJtZXNzYWdlV2lkZ2V0TGF5b3V0IiwgIndpbmRvd01hbmFnZXIiLCAiYWN0aW9uc0RpYWxvZyIsICJBY3Rpb25zRGlhbG9nIiwgImNvdW50cyIsICJuZXdQYWdlVGV4dCIsICJyZWFzb24iLCAidGVtcGxhdGVQYXJhbWV0ZXJzIiwgImFkZGl0aW9uYWxSZWFzb25pbmciLCAiZGVuaWVkUGFnZXMiLCAic2luZ3VsYXJSZXF1ZXN0IiwgImFsbFJlcXVlc3RzIiwgInJlYXNvbnMiLCAicGFnZSIsICJyZWFzb25zQXJyYXkiLCAicGFnZXMiLCAiY29tbWVudHMiLCAiY29tbWVudE1lc3NhZ2VzIiwgImNvbW1lbnQiLCAiY29tbWVudHNBcnJheSIsICJzZWN0aW9uRGF0YSIsICJwcmVwZW5kIiwgImFwcGVuZCIsICJvbGRGdWxsU2VjdGlvblRleHQiLCAib2xkU2VjdGlvblRleHQiLCAiYXBpRnVuY3Rpb24iLCAibGlua0VsZW1lbnQiLCAiYWN0aW9uUmVzdWx0RWxlbWVudElkIiwgInJlc3VsdCIsICJhY3Rpb25SZXN1bHRFbGVtZW50IiwgImVycm9yQ29kZSIsICJlcnJvckluZm8iLCAicmVzb2x2ZSIsICJkZXRhaWxzRWxlbWVudCIsICJkaWFsb2ciLCAiUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciIsICJpbml0X3JlZGlyZWN0X3JlcXVlc3RfaGFuZGxlciIsICJfX2VzbU1pbiIsICJ0aXRsZUluZGV4IiwgInRpdGxlIiwgImRldGFpbHNFbGVtZW50IiwgInJlc3BvbmRlckVsZW1lbnQiLCAiZGlhbG9nIiwgInJlcXVlc3RlZFRpdGxlRGl2IiwgImxhYmVsIiwgInNlbGVjdGVkIiwgImFjdGlvbiIsICJlZGl0b3JJbmRleCIsICJ0ZW1wbGF0ZSIsICJjdXJyZW50UGFyYW1ldGVycyIsICJwYXJhbWV0ZXJJbmRleCIsICJuZXdQYXJhbWV0ZXIiLCAib3B0aW9uIiwgImNvbW1lbnQiLCAidGFnIiwgInJlZGlyZWN0IiwgInNlbGVjdGVkRWxlbWVudHMiLCAic2VsZWN0ZWRUYWdzIiwgImVsZW1lbnQiLCAic29ydGVkVGFncyIsICJiIiwgImxhc3RFbGVtZW50IiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgImVkaXRvckluZm8iLCAiaXNUYWdTZWxlY3RlZCIsICJzdW1tYXJ5RWxlbWVudCIsICJub1RlbXBsYXRlc01lc3NhZ2UiLCAidGVtcGxhdGVOYW1lIiwgInRlbXBsYXRlRGF0YSIsICJwYXJhbWV0ZXJzIiwgImRldGFpbHMiLCAic3VtbWFyeSIsICJlbGVtZW50RGF0YSIsICJwYXJhbWV0ZXJOYW1lIiwgInBhcmFtZXRlckRhdGEiLCAiaW5wdXQiLCAiaW5wdXRMYXlvdXQiLCAidmFsdWUiLCAiaWQiLCAidXBkYXRlIiwgInJlZGlyZWN0c19kaWFsb2dfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSZWRpcmVjdHNEaWFsb2ciLCAiaW5pdF9yZWRpcmVjdHNfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfaGVscGVyX2RpYWxvZyIsICJpbml0X3JlZGlyZWN0X3JlcXVlc3RfaGFuZGxlciIsICJIZWxwZXJEaWFsb2ciLCAicmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJyZXF1ZXN0ZWRQYWdlcyIsICJtYXRjaCIsICJwYXJzZWRUYXJnZXQiLCAicmVxdWVzdGVyIiwgIm5hbWUiLCAicGFnZSIsICJpbmRleCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgImV2ZW50IiwgInRhcmdldEVkaXRvckVsZW1lbnQiLCAibGlua0VsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgInJlYXNvbkRpdiIsICJyZWFzb25MYWJlbCIsICJzb3VyY2VEaXYiLCAic291cmNlTGFiZWwiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAiaGFuZGxlcnMiLCAibW9kaWZ5QWxsQnV0dG9uIiwgImFjdGlvbiIsICJoYW5kbGVyIiwgInJlcXVlc3RlZFRpdGxlIiwgIlJlZGlyZWN0UmVxdWVzdEhhbmRsZXIiLCAiYWN0aW9uc1RvVGFrZSIsICJhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkIiwgImZpcnN0Q2xvc2VSZWFzb24iLCAiYWxsUmVxdWVzdHNDbG9zZWQiLCAiYmFja2dyb3VuZENvbG9yIiwgImFjY2VwdGVkQ291bnQiLCAiZGVuaWVkQ291bnQiLCAiYWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAiYWN0aW9uRGF0YSIsICJ0YXJnZXQiLCAicmVxdWVzdHMiLCAic29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCIsICJhY2NlcHRlZFBhZ2VzIiwgImRlbmllZFBhZ2VzIiwgImNvbW1lbnRzIiwgImFtb3VudE9mUGFnZXMiLCAic2VjdGlvbkRhdGEiLCAiY2xvc2luZ0lkIiwgImFjY2VwdGVkUGFnZXNNZXNzYWdlIiwgImRlbmllZFBhZ2VzTWVzc2FnZSIsICJtYXBwZWRDb3VudHMiLCAiY291bnQiLCAiZGF0YSIsICJ0YWdzV2l0aEFyZ3VtZW50cyIsICJ0YWciLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJlZGl0b3JJbmZvIiwgImxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCIsICJwYXJhbWV0ZXIiLCAibWFwcGVkQXJndW1lbnRzIiwgInZhbHVlIiwgInRpdGxlIiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiY29uZmlnIiwgInN1cHBvcnRzU29ydEtleSIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJzb3J0S2V5IiwgInJlc3BvbnNlIiwgInBhcnNlZFRpdGxlIiwgInJlc3VsdCIsICJwYWdlcyIsICJwYWdlIiwgImNhdGVnb3J5IiwgInRpdGxlV2l0aG91dE5hbWVzcGFjZSIsICJkYXRhIiwgImxhYmVsIiwgIlBhZ2VJbnB1dFdpZGdldCIsICJpbml0X3BhZ2VfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgImNhdGVnb3JpZXNfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiQ2F0ZWdvcmllc0RpYWxvZyIsICJpbml0X2NhdGVnb3JpZXNfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgImluaXRfaGVscGVyX2RpYWxvZyIsICJpbml0X3BhZ2VfaW5wdXRfd2lkZ2V0IiwgIkhlbHBlckRpYWxvZyIsICJzZWN0aW9uVGV4dCIsICJzZWN0aW9uSGVhZGVyIiwgInBhcnNlZERhdGEiLCAiZm91bmRDYXRlZ29yeSIsICJtYXRjaCIsICJmaXJzdFVzZXJJbmRleCIsICJmaXJzdFVzZXJUYWxrSW5kZXgiLCAiZmlyc3RJcEluZGV4IiwgImZpcnN0SW5kZXgiLCAiaW5kZXgiLCAicmVxdWVzdCIsICJkZXRhaWxzRWxlbWVudCIsICJzdW1tYXJ5RWxlbWVudCIsICJyZXF1ZXN0SW5mb0VsZW1lbnQiLCAibm9uZUVsZW1lbnQiLCAidW5rbm93bkVsZW1lbnQiLCAiZXhhbXBsZXNEaXYiLCAiZXhhbXBsZXNMYWJlbCIsICJleGFtcGxlIiwgImxpbmtFbGVtZW50IiwgInBhcmVudHNEaXYiLCAicGFyZW50c0xhYmVsIiwgInBhcmVudCIsICJyZXF1ZXN0ZXJEaXYiLCAicmVxdWVzdGVyTGFiZWwiLCAicmVxdWVzdGVyTGluayIsICJyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCIsICJhY3Rpb25SYWRpb0lucHV0IiwgImxhYmVsIiwgInNlbGVjdGVkIiwgIm9wdGlvbiIsICJjb21tZW50SW5wdXRMYXlvdXQiLCAiY29tbWVudCIsICJjb21tZW50SW5wdXQiLCAicGFnZVNlbGVjdExheW91dCIsICJjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dCIsICJwYXJlbnRDYXRlZ29yeVNlbGVjdExheW91dCIsICJkZW55UmVhc29uTGF5b3V0IiwgImNsb3NpbmdSZWFzb25MYXlvdXQiLCAicGFnZVNlbGVjdElucHV0IiwgIlBhZ2VJbnB1dFdpZGdldCIsICJ2YWx1ZSIsICJwYWdlcyIsICJwYWdlIiwgInBhZ2VTZWxlY3QiLCAic2VsZWN0ZWRFbGVtZW50cyIsICJzZWxlY3RlZFBhZ2VzIiwgImVsZW1lbnQiLCAic29ydGVkUGFnZXMiLCAiYSIsICJiIiwgImxhc3RFbGVtZW50IiwgImNhdGVnb3JpemVkUGFnZXMiLCAiY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dCIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImNhdGVnb3J5UmVtb3ZlU2VsZWN0IiwgInNlbGVjdGVkQ2F0ZWdvcmllcyIsICJzb3J0ZWRDYXRlZ29yaWVzIiwgInBhcmVudENhdGVnb3JpZXMiLCAicGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dCIsICJwYXJlbnRDYXRlZ29yeVNlbGVjdCIsICJwYXJlbnRDYXRlZ29yeSIsICJkZW55UmVhc29uIiwgImNsb3NpbmdSZWFzb24iLCAidGl0bGUiLCAiaWQiLCAiYWN0aW9uIiwgImJhY2tncm91bmRDb2xvciIsICJhY3Rpb25zRGlhbG9nIiwgImNvdW50cyIsICJuZXdQYWdlVGV4dCIsICJhY3Rpb25EYXRhIiwgInNlY3Rpb25EYXRhIiwgIm1hcHBlZENvdW50cyIsICJjb3VudCIsICJkYXRhIiwgImNvbnRlbnQiLCAiZGlkUmVwbGFjZUNhdGVnb3J5IiwgIm1hdGNoRW5kc1dpdGhOZXdsaW5lIiwgImNhdGVnb3J5IiwgImFmY3JjX2hlbHBlcl9kZWZhdWx0IiwgIlJlZGlyZWN0c0RpYWxvZyIsICJDYXRlZ29yaWVzRGlhbG9nIiwgInBhZ2VOYW1lIiwgImlzUmVkaXJlY3RSZXF1ZXN0UGFnZSIsICJyZXF1ZXN0UGFnZVR5cGUiLCAiZXZlbnQiLCAiYWZjcmNfaGVscGVyX2RlZmF1bHQiLCAid2luZG93TWFuYWdlciIsICJoZWxwZXIiLCAiYWZjcmNIZWxwZXJEaWFsb2ciXQp9Cg==