User:Eejit43/scripts/rmtr-helper.js

// <pre>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/rmtr-helper.ts

"use strict";(()=>{var x=new mw.Api;var A=`#rmtr-review-result{margin:1em;padding:2.5%;color:#202122;font-size:.8em;background-color:#f5f5f5;border:1px solid #a2a9b1;border-radius:2px}#rmtr-review-header{margin-bottom:.5em;font-weight:700;font-size:1.5em}.rmtr-review-header{margin:.5em 0;font-weight:700;font-size:1em}.rmtr-review-invalid-warning{color:#cd5c5c;font-weight:700}.rmtr-review-request-checkbox{margin:3px 3px 0}.rmtr-review-section-content{margin-left:1em;line-height:1.3}.rmtr-review-section-content li+li{margin-top:.4rem;margin-bottom:.4rem}#rmtr-review-submit{margin-top:.2em}#rmtr-review-loading{display:inline-block;height:1.3em;margin-top:-.3em;margin-left:3px;line-height:1.5em;vertical-align:text-bottom;overflow:hidden}#rmtr-review-loading:after{display:inline-table;text-align:left;white-space:pre;animation:rmtr-review-loading .8s steps(10) infinite;content:"\\280b\\a\\2819\\a\\2839\\a\\2838\\a\\283c\\a\\2834\\a\\2826\\a\\2827\\a\\2807\\a\\280f"}@keyframes rmtr-review-loading{to{transform:translateY(-15em)}}
`;mw.loader.using(["mediawiki.util"],()=>{if(mw.config.get("wgPageName")!=="Wikipedia:Requested_moves/Technical_requests")return;mw.util.addCSS(A);let E=mw.config.get("wgNamespaceIds"),S=!1;mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Review move requests","review-rmtr-requests").addEventListener("click",async M=>{M.preventDefault();let L=!0;if(window.addEventListener("beforeunload",o=>{L&&o.preventDefault()}),S)return document.querySelector("#rmtr-review-result")?.scrollIntoView();S=!0;let P=await I(),j=P.revid,N=P.slots.main.content,f=["Uncontroversial technical requests","Requests to revert undiscussed moves","Contested technical requests","Administrator needed"],T=f[2],O=f[3],d={};function W(o){let t=[],n=["[","{"],c=["]","}"],s=!1,r="";for(let i=0;i<o.length;i++){let a=o[i],l=o[i+1];if(a==="|"&&!s||i===o.length-1){a!=="|"&&(r+=a),t.push(r),r="";continue}r+=a,n.some(m=>m===a&&m===l)?s=!0:c.some(m=>m===a&&m===l)&&(s=!1)}let e={};for(let[i,a]of t.entries()){let l=a.split("=").map(m=>m.trim());l.length===1&&l.unshift((i+1).toString()),e[l.shift()]=l.join("=")}return e}for(let o of f){let n=N.split(new RegExp(`={3,}[^
]*${o} *={3,}`))[1].split(/={3,}/m)[0].trim().match(/(?:\* ?\n)?[ *:]*{{rmassist\/core.+?(?=[ *:]*{{rmassist\/core|$)/gis);if(n)d[o]=n.map(c=>{c=c.trim();let s=W(c.replaceAll(/(?:\* ?\n)?[ *:]*{{rmassist\/core\s*\||}}(?![^\n]*}}).*/gis,""));return s.full=c,s.original=s[1]?.replace(/^\[+/,"").replace(/]+$/,"")??"UNKNOWN",s.destination=s[2]?.replace(/^\[+/,"").replace(/]+$/,"")??"UNKNOWN",s.requester??=s.sig?.match(/\[\[User:(.*?)(\||]])/)?.[1].trim(),delete s[1],delete s[2],s});else{d[o]=[];continue}}await Promise.all(Object.entries(d).map(async([,o])=>{await Promise.all(o.map(async t=>{let n=mw.Title.newFromText(t.original),c=mw.Title.newFromText(t.destination);if(!n)return mw.notify(`Invalid title "${t.original}"!`,{type:"error"});if(!c)return mw.notify(`Invalid title "${t.destination}"!`,{type:"error"});let s=!/[#<>[\]{|}]/.test(t.destination)&&c,r=document.createElement("span");r.classList.add("rmtr-review-invalid-warning"),r.textContent=`Invalid title "${t.destination}"!`;let e=![E.file,E.category].some(u=>n.getNamespaceId()===u||c.getNamespaceId()===u),i=document.createElement("span");i.classList.add("rmtr-review-invalid-warning"),i.textContent=`Warning: original or destination page is in namespace "${c.getNamespaceId()===E.file?"file":"category"}"!`;let a=await x.parse(`[[:${t.original}]] \u2192 ${s?`[[:${t.destination}]]`:r.outerHTML} requested by ${t.requester?mw.util.isIPAddress(t.requester)?`[[Special:Contributions/${t.requester}|${t.requester}]]`:`[[User:${t.requester}|${t.requester}]]`:/(\[{2}Special:Contributions\/(.*?)\|\2]{2})/.exec(t.sig)?.[1]??"(unknown)"} with reasoning "${t.reason}"`),l=new DOMParser().parseFromString(a,"text/html"),m=document.createElement("li");m.innerHTML=l.querySelector("div.mw-parser-output").firstElementChild.innerHTML,e||m.append(i),t.element=m}))}));let w=document.createElement("div");w.id="rmtr-review-result";let C=document.createElement("div");C.id="rmtr-review-header",C.textContent="Technical move requests review",w.append(C);for(let[o,[t,n]]of Object.entries(d).entries()){let c=document.createElement("div");c.classList.add("rmtr-review-header"),c.textContent=t,w.append(c);let s=document.createElement("div");if(s.classList.add("rmtr-review-section-content"),n.length===0){let r=document.createElement("div");r.textContent="No requests in this section",s.append(r)}else{let r=document.createElement("ul");for(let[e,i]of n.entries()){let a=i.element,l=document.createElement("input");l.type="checkbox",l.classList.add("rmtr-review-request-checkbox"),l.id=`rmtr-review-remove-request-${o}-${e}`,l.addEventListener("change",()=>{l.checked?(d[t][e].result={remove:!0,reason:R.value},u.style.display="inline",g.disabled=!0):(delete d[t][e].result,u.style.display="none",g.disabled=!1)});let m=document.createElement("label");m.htmlFor=`rmtr-review-remove-request-${o}-${e}`,m.textContent="Remove request",a.append(l),a.append(m);let u=document.createElement("span");u.style.display="none",u.append(document.createTextNode(" as "));let R=document.createElement("select");t==="Contested technical requests"&&(R.value="Contested"),R.addEventListener("change",()=>{d[t][e].result.reason=R.value});let D=["Completed","Contested","Already done","Invalid page name","Incorrect venue","Withdrawn","Stale","Not done"];for(let h of D){let v=document.createElement("option");v.value=h,v.textContent=h,R.append(v)}u.append(R),a.append(u);let g=document.createElement("input");g.type="checkbox",g.classList.add("rmtr-review-request-checkbox"),g.id=`rmtr-review-move-request-${o}-${e}`,g.addEventListener("change",()=>{g.checked?(d[t][e].result={move:!0,section:$.value},p.style.display="inline",l.disabled=!0):(delete d[t][e].result,p.style.display="none",l.disabled=!1)});let k=document.createElement("label");k.htmlFor=`rmtr-review-move-request-${o}-${e}`,k.textContent="Switch section",a.append(g),a.append(k);let p=document.createElement("span");p.style.display="none",p.append(document.createTextNode(" to "));let $=document.createElement("select");$.addEventListener("change",()=>{d[t][e].result.section=$.value});for(let h of f){if(h===t)continue;let v=document.createElement("option");v.selected=h===(t===T?O:T),v.value=h,v.textContent=h,$.append(v)}p.append($),p.append(document.createTextNode(" with reasoning "));let q=document.createElement("input");q.type="text",q.addEventListener("input",()=>{d[t][e].result.reason=q.value}),p.append(q),p.append(document.createTextNode(" (optional, automatically pings requestor and signs)")),a.append(p),r.append(a)}s.append(r)}w.append(s)}let y=document.createElement("button");y.id="rmtr-review-submit",y.textContent="Submit",y.addEventListener("click",async()=>{if((await I()).revid!==j)return mw.notify("An edit conflict occurred, please start over!",{type:"error"});y.disabled=!0,b.style.display="inline-block";let t=N,n={remove:{},move:{},total:0};for(let r of Object.values(d))for(let e of r)if(e.result){if("remove"in e.result)t=t.replace(e.full+`
`,"").replace(e.full,""),e.result.reason in n.remove||(n.remove[e.result.reason]=[]),n.remove[e.result.reason].push(e),n.total++;else if("move"in e.result){let i=f[f.indexOf(e.result.section)+1];t=t.replace(e.full+`
`,"").replace(e.full,""),t=t.replace(new RegExp(`(
?
?(?:={3,}[^
]*${i} *={3,}|$))`),`
${e.full}${e.result.reason?`
:: ${e.requester&&e.requester.length>0?mw.util.isIPAddress(e.requester)?"":`@[[User:${e.requester}|${e.requester}]] `:""} ${e.result.reason} ~~~~`:""}$1`),e.result.section in n.move||(n.move[e.result.section]=[]),n.move[e.result.section].push(e),n.total++}}if(n.total===0)return y.disabled=!1,b.style.display="none",mw.notify("No changes to make!",{type:"error"});t=t.replaceAll(new RegExp(`
{2,}(={3,}[^
]*${f.join("|")} *={3,})`,"g"),`
$1`);let c=Object.values(d).every(r=>r.every(e=>e.result&&"remove"in e.result)),s=`Handled ${n.total} request${n.total>1?"s":""}: ${Object.entries(n.remove).length>0?`Removed ${Object.entries(n.remove).map(([r,e])=>`${e.map(i=>`[[${i.original}]]`).join(", ")} as ${r.toLowerCase()}`).join(", ")}`:""}${Object.entries(n.move).length>0?`${Object.entries(n.remove).length>0?", ":""}Moved ${Object.entries(n.move).map(([r,e])=>`${e.map(i=>`[[${i.original}]]`).join(", ")} to "${r}"`).join(", ")}`:""}${c?" (no requests remain)":""} (via [[User:Eejit43/scripts/rmtr-helper|script]])`;await x.edit(mw.config.get("wgPageName"),()=>({text:t,summary:s})),mw.notify(`Successfully handled ${n.total} requests, reloading...`,{type:"success"}),L=!1,window.location.reload()});let b=document.createElement("span");b.id="rmtr-review-loading",b.style.display="none",y.append(b),w.append(y),mw.util.$content[0].prepend(w),w.scrollIntoView()})});async function I(){return(await x.get({action:"query",formatversion:"2",prop:"revisions",rvprop:["content","ids"],rvslots:"main",titles:mw.config.get("wgPageName")})).query.pages[0].revisions[0]}})();

// </pre>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zdHlsZXMvcm10ci1oZWxwZXIuY3NzIiwgIi4uL3NjcmlwdHMvcm10ci1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxNZXNzYWdlc1BhcmFtcywgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2ktYXBpJztcbmltcG9ydCB0eXBlIHsgQWxsTWVzc2FnZXNSZXN1bHQsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuL2dsb2JhbC10eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZUNvbnRlbnQodGl0bGU6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICAgIChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6IHRpdGxlLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9ucz8uWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG59XG5cbi8qKlxuICogR2V0cyBhIHN5c3RlbSBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeXN0ZW0gbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN5c3RlbU1lc3NhZ2UobWVzc2FnZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICAgIChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIG1ldGE6ICdhbGxtZXNzYWdlcycsXG4gICAgICAgICAgICBhbW1lc3NhZ2VzOiBtZXNzYWdlTmFtZSxcbiAgICAgICAgICAgIGFtbGFuZzogbXcuY29uZmlnLmdldCgnd2dDb250ZW50TGFuZ3VhZ2UnKSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxNZXNzYWdlc1BhcmFtcykpIGFzIEFsbE1lc3NhZ2VzUmVzdWx0XG4gICAgKS5xdWVyeT8uYWxsbWVzc2FnZXNbMF0uY29udGVudDtcbn1cblxuLyoqXG4gKiBJbnRlcnBvbGF0ZXMgYSBzeXN0ZW0gbWVzc2FnZSB3aXRoIHZhbHVlcy5cbiAqIEBwYXJhbSBtZXNzYWdlIFRoZSBzeXN0ZW0gbWVzc2FnZSB0byBpbnRlcnBvbGF0ZS5cbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBpbnRlcnBvbGF0ZSBpbnRvIHRoZSBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVTeXN0ZW1NZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdmFsdWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCByZXN1bHQgPSBtZXNzYWdlO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChgJCR7aW5kZXggKyAxfWAsIHZhbHVlKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCAiI3JtdHItcmV2aWV3LXJlc3VsdHttYXJnaW46MWVtO3BhZGRpbmc6Mi41JTtjb2xvcjojMjAyMTIyO2ZvbnQtc2l6ZTouOGVtO2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNTtib3JkZXI6MXB4IHNvbGlkICNhMmE5YjE7Ym9yZGVyLXJhZGl1czoycHh9I3JtdHItcmV2aWV3LWhlYWRlcnttYXJnaW4tYm90dG9tOi41ZW07Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxLjVlbX0ucm10ci1yZXZpZXctaGVhZGVye21hcmdpbjouNWVtIDA7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxZW19LnJtdHItcmV2aWV3LWludmFsaWQtd2FybmluZ3tjb2xvcjojY2Q1YzVjO2ZvbnQtd2VpZ2h0OjcwMH0ucm10ci1yZXZpZXctcmVxdWVzdC1jaGVja2JveHttYXJnaW46M3B4IDNweCAwfS5ybXRyLXJldmlldy1zZWN0aW9uLWNvbnRlbnR7bWFyZ2luLWxlZnQ6MWVtO2xpbmUtaGVpZ2h0OjEuM30ucm10ci1yZXZpZXctc2VjdGlvbi1jb250ZW50IGxpK2xpe21hcmdpbi10b3A6LjRyZW07bWFyZ2luLWJvdHRvbTouNHJlbX0jcm10ci1yZXZpZXctc3VibWl0e21hcmdpbi10b3A6LjJlbX0jcm10ci1yZXZpZXctbG9hZGluZ3tkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MS4zZW07bWFyZ2luLXRvcDotLjNlbTttYXJnaW4tbGVmdDozcHg7bGluZS1oZWlnaHQ6MS41ZW07dmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207b3ZlcmZsb3c6aGlkZGVufSNybXRyLXJldmlldy1sb2FkaW5nOmFmdGVye2Rpc3BsYXk6aW5saW5lLXRhYmxlO3RleHQtYWxpZ246bGVmdDt3aGl0ZS1zcGFjZTpwcmU7YW5pbWF0aW9uOnJtdHItcmV2aWV3LWxvYWRpbmcgLjhzIHN0ZXBzKDEwKSBpbmZpbml0ZTtjb250ZW50OlwiXFwyODBiXFxhXFwyODE5XFxhXFwyODM5XFxhXFwyODM4XFxhXFwyODNjXFxhXFwyODM0XFxhXFwyODI2XFxhXFwyODI3XFxhXFwyODA3XFxhXFwyODBmXCJ9QGtleWZyYW1lcyBybXRyLXJldmlldy1sb2FkaW5ne3Rve3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xNWVtKX19XG4iLCAiaW1wb3J0IHR5cGUgeyBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnQC9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHsgYXBpIH0gZnJvbSAnQC91dGlsaXR5JztcbmltcG9ydCBjc3NDb250ZW50IGZyb20gJ0BzdHlsZXMvcm10ci1oZWxwZXIuY3NzJyB3aXRoIHsgdHlwZTogJ2NzcycgfTtcbmltcG9ydCB0eXBlIHsgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2ktYXBpJztcblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnXSwgKCkgPT4ge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgIT09ICdXaWtpcGVkaWE6UmVxdWVzdGVkX21vdmVzL1RlY2huaWNhbF9yZXF1ZXN0cycpIHJldHVybjtcblxuICAgIG13LnV0aWwuYWRkQ1NTKGNzc0NvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXNwYWNlcyA9IG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlSWRzJyk7XG5cbiAgICBsZXQgZGlzcGxheWVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBsaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhcbiAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICcjJyxcbiAgICAgICAgJ1JldmlldyBtb3ZlIHJlcXVlc3RzJyxcbiAgICAgICAgJ3Jldmlldy1ybXRyLXJlcXVlc3RzJyxcbiAgICApITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBsZXQgc2hvdWxkU3RvcFRhYkNsb3N1cmUgPSB0cnVlO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RvcFRhYkNsb3N1cmUpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkaXNwbGF5ZWQpIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcm10ci1yZXZpZXctcmVzdWx0Jyk/LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIGVsc2UgZGlzcGxheWVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb24gPSBhd2FpdCBnZXRQYWdlUmV2aXNpb24oKTtcblxuICAgICAgICBjb25zdCByZXZJZCA9IHBhZ2VSZXZpc2lvbi5yZXZpZDtcbiAgICAgICAgY29uc3QgcGFnZUNvbnRlbnQgPSBwYWdlUmV2aXNpb24uc2xvdHMubWFpbi5jb250ZW50O1xuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgICAgICAgICAgJ1VuY29udHJvdmVyc2lhbCB0ZWNobmljYWwgcmVxdWVzdHMnLFxuICAgICAgICAgICAgJ1JlcXVlc3RzIHRvIHJldmVydCB1bmRpc2N1c3NlZCBtb3ZlcycsXG4gICAgICAgICAgICAnQ29udGVzdGVkIHRlY2huaWNhbCByZXF1ZXN0cycsXG4gICAgICAgICAgICAnQWRtaW5pc3RyYXRvciBuZWVkZWQnLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRNb3ZlU2VjdGlvbiA9IHNlY3Rpb25zWzJdO1xuICAgICAgICBjb25zdCBmYWxsYmFja0RlZmF1bHRNb3ZlU2VjdGlvbiA9IHNlY3Rpb25zWzNdO1xuXG4gICAgICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgICAgICAgIHNpZzogc3RyaW5nO1xuICAgICAgICAgICAgcmVxdWVzdGVyPzogc3RyaW5nO1xuICAgICAgICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAgICAgICBmdWxsOiBzdHJpbmc7XG4gICAgICAgICAgICBvcmlnaW5hbDogc3RyaW5nO1xuICAgICAgICAgICAgZGVzdGluYXRpb246IHN0cmluZztcbiAgICAgICAgICAgIGVsZW1lbnQ6IEhUTUxMSUVsZW1lbnQ7XG4gICAgICAgICAgICByZXN1bHQ/OiBSZXF1ZXN0UmVzdWx0TW92ZSB8IFJlcXVlc3RSZXN1bHRSZW1vdmU7XG4gICAgICAgIH1cblxuICAgICAgICBpbnRlcmZhY2UgUmVxdWVzdFJlc3VsdE1vdmUge1xuICAgICAgICAgICAgbW92ZTogYm9vbGVhbjtcbiAgICAgICAgICAgIHNlY3Rpb246IHN0cmluZztcbiAgICAgICAgICAgIHJlYXNvbj86IHN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGludGVyZmFjZSBSZXF1ZXN0UmVzdWx0UmVtb3ZlIHtcbiAgICAgICAgICAgIHJlbW92ZTogYm9vbGVhbjtcbiAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxsUmVxdWVzdHM6IFJlY29yZDxzdHJpbmcsIFJlcXVlc3RbXT4gPSB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIHRoZSBwYXJhbWV0ZXJzIG9mIGEgZ2l2ZW4gV2lraXRleHQgdGVtcGxhdGUuXG4gICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSBUaGUgdGVtcGxhdGUgdG8gcGFyc2UuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBwYXJzZVRlbXBsYXRlUGFyYW1ldGVycyh0ZW1wbGF0ZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCByYXdQYXJhbWV0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBpZ25vcmVkU3RhcnRTeW1ib2xzID0gWydbJywgJ3snXTtcbiAgICAgICAgICAgIGNvbnN0IGlnbm9yZWRFbmRTeW1ib2xzID0gWyddJywgJ30nXTtcblxuICAgICAgICAgICAgbGV0IGluc2lkZUxpbmtPclRlbXBsYXRlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgY3VycmVudFRleHQgPSAnJztcblxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRlbXBsYXRlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJhY3RlciA9IHRlbXBsYXRlW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2hhcmFjdGVyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0ZW1wbGF0ZVtpbmRleCArIDFdO1xuXG4gICAgICAgICAgICAgICAgaWYgKChjaGFyYWN0ZXIgPT09ICd8JyAmJiAhaW5zaWRlTGlua09yVGVtcGxhdGUpIHx8IGluZGV4ID09PSB0ZW1wbGF0ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgIT09ICd8JykgY3VycmVudFRleHQgKz0gY2hhcmFjdGVyO1xuXG4gICAgICAgICAgICAgICAgICAgIHJhd1BhcmFtZXRlcnMucHVzaChjdXJyZW50VGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0ID0gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VycmVudFRleHQgKz0gY2hhcmFjdGVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlnbm9yZWRTdGFydFN5bWJvbHMuc29tZSgoc3ltYm9sKSA9PiBzeW1ib2wgPT09IGNoYXJhY3RlciAmJiBzeW1ib2wgPT09IG5leHRDaGFyYWN0ZXIpKSBpbnNpZGVMaW5rT3JUZW1wbGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaWdub3JlZEVuZFN5bWJvbHMuc29tZSgoc3ltYm9sKSA9PiBzeW1ib2wgPT09IGNoYXJhY3RlciAmJiBzeW1ib2wgPT09IG5leHRDaGFyYWN0ZXIpKSBpbnNpZGVMaW5rT3JUZW1wbGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBwYXJhbWV0ZXJdIG9mIHJhd1BhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRQYXJhbWV0ZXIgPSBwYXJhbWV0ZXIuc3BsaXQoJz0nKS5tYXAoKHZhbHVlKSA9PiB2YWx1ZS50cmltKCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UGFyYW1ldGVyLmxlbmd0aCA9PT0gMSkgc3BsaXRQYXJhbWV0ZXIudW5zaGlmdCgoaW5kZXggKyAxKS50b1N0cmluZygpKTtcblxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNbc3BsaXRQYXJhbWV0ZXIuc2hpZnQoKSFdID0gc3BsaXRQYXJhbWV0ZXIuam9pbignPScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkNvbnRlbnQgPSBwYWdlQ29udGVudFxuICAgICAgICAgICAgICAgIC5zcGxpdChuZXcgUmVnRXhwKGA9ezMsfVteXFxuXSoke3NlY3Rpb259ICo9ezMsfWApKVsxXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgvPXszLH0vbSlbMF1cbiAgICAgICAgICAgICAgICAudHJpbSgpO1xuXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkUmVxdWVzdHMgPSBzZWN0aW9uQ29udGVudC5tYXRjaCgvKD86XFwqID9cXG4pP1sgKjpdKnt7cm1hc3Npc3RcXC9jb3JlLis/KD89WyAqOl0qe3tybWFzc2lzdFxcL2NvcmV8JCkvZ2lzKTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoZWRSZXF1ZXN0cylcbiAgICAgICAgICAgICAgICBhbGxSZXF1ZXN0c1tzZWN0aW9uXSA9IG1hdGNoZWRSZXF1ZXN0cy5tYXAoKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJzZVRlbXBsYXRlUGFyYW1ldGVycyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVwbGFjZUFsbCgvKD86XFwqID9cXG4pP1sgKjpdKnt7cm1hc3Npc3RcXC9jb3JlXFxzKlxcfHx9fSg/IVteXFxuXSp9fSkuKi9naXMsICcnKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmZ1bGwgPSByZXF1ZXN0O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMub3JpZ2luYWwgPSBwYXJhbWV0ZXJzWzFdPy5yZXBsYWNlKC9eXFxbKy8sICcnKS5yZXBsYWNlKC9dKyQvLCAnJykgPz8gJ1VOS05PV04nO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmRlc3RpbmF0aW9uID0gcGFyYW1ldGVyc1syXT8ucmVwbGFjZSgvXlxcWysvLCAnJykucmVwbGFjZSgvXSskLywgJycpID8/ICdVTktOT1dOJztcblxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnJlcXVlc3RlciA/Pz0gcGFyYW1ldGVycy5zaWc/Lm1hdGNoKC9cXFtcXFtVc2VyOiguKj8pKFxcfHxdXSkvKT8uWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW1ldGVyc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtZXRlcnNbMl07XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMgYXMgdW5rbm93biBhcyBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWxsUmVxdWVzdHNbc2VjdGlvbl0gPSBbXTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoYWxsUmVxdWVzdHMpLm1hcChhc3luYyAoWywgcmVxdWVzdHNdKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzLm1hcChhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXdPbGRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHJlcXVlc3Qub3JpZ2luYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXdOZXdUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHJlcXVlc3QuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW13T2xkVGl0bGUpIHJldHVybiBtdy5ub3RpZnkoYEludmFsaWQgdGl0bGUgXCIke3JlcXVlc3Qub3JpZ2luYWx9XCIhYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtd05ld1RpdGxlKSByZXR1cm4gbXcubm90aWZ5KGBJbnZhbGlkIHRpdGxlIFwiJHtyZXF1ZXN0LmRlc3RpbmF0aW9ufVwiIWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRUaXRsZSA9ICEvWyM8PltcXF17fH1dLy50ZXN0KHJlcXVlc3QuZGVzdGluYXRpb24pICYmIG13TmV3VGl0bGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludmFsaWRUaXRsZVdhcm5pbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVGl0bGVXYXJuaW5nLmNsYXNzTGlzdC5hZGQoJ3JtdHItcmV2aWV3LWludmFsaWQtd2FybmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFRpdGxlV2FybmluZy50ZXh0Q29udGVudCA9IGBJbnZhbGlkIHRpdGxlIFwiJHtyZXF1ZXN0LmRlc3RpbmF0aW9ufVwiIWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkTmFtZXNwYWNlID0gIVtuYW1lc3BhY2VzLmZpbGUsIG5hbWVzcGFjZXMuY2F0ZWdvcnldLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZSkgPT4gbXdPbGRUaXRsZS5nZXROYW1lc3BhY2VJZCgpID09PSBuYW1lc3BhY2UgfHwgbXdOZXdUaXRsZS5nZXROYW1lc3BhY2VJZCgpID09PSBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnZhbGlkTmFtZXNwYWNlV2FybmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWROYW1lc3BhY2VXYXJuaW5nLmNsYXNzTGlzdC5hZGQoJ3JtdHItcmV2aWV3LWludmFsaWQtd2FybmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZE5hbWVzcGFjZVdhcm5pbmcudGV4dENvbnRlbnQgPSBgV2FybmluZzogb3JpZ2luYWwgb3IgZGVzdGluYXRpb24gcGFnZSBpcyBpbiBuYW1lc3BhY2UgXCIke213TmV3VGl0bGUuZ2V0TmFtZXNwYWNlSWQoKSA9PT0gbmFtZXNwYWNlcy5maWxlID8gJ2ZpbGUnIDogJ2NhdGVnb3J5J31cIiFgO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRXaWtpdGV4dCA9IGF3YWl0IGFwaS5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgW1s6JHtyZXF1ZXN0Lm9yaWdpbmFsfV1dIFx1MjE5MiAke3ZhbGlkVGl0bGUgPyBgW1s6JHtyZXF1ZXN0LmRlc3RpbmF0aW9ufV1dYCA6IGludmFsaWRUaXRsZVdhcm5pbmcub3V0ZXJIVE1MfSByZXF1ZXN0ZWQgYnkgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5pc0lQQWRkcmVzcyhyZXF1ZXN0LnJlcXVlc3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBbW1NwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyfXwke3JlcXVlc3QucmVxdWVzdGVyfV1dYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFtbVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyfXwke3JlcXVlc3QucmVxdWVzdGVyfV1dYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoLyhcXFt7Mn1TcGVjaWFsOkNvbnRyaWJ1dGlvbnNcXC8oLio/KVxcfFxcMl17Mn0pLy5leGVjKHJlcXVlc3Quc2lnKT8uWzFdID8/ICcodW5rbm93biknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2l0aCByZWFzb25pbmcgXCIke3JlcXVlc3QucmVhc29ufVwiYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRIdG1sID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhwYXJzZWRXaWtpdGV4dCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBwYXJzZWRIdG1sLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5tdy1wYXJzZXItb3V0cHV0JykhLmZpcnN0RWxlbWVudENoaWxkIS5pbm5lckhUTUwhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkTmFtZXNwYWNlKSByZXF1ZXN0RWxlbWVudC5hcHBlbmQoaW52YWxpZE5hbWVzcGFjZVdhcm5pbmcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmVsZW1lbnQgPSByZXF1ZXN0RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3V0cHV0RWxlbWVudC5pZCA9ICdybXRyLXJldmlldy1yZXN1bHQnO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBoZWFkZXIuaWQgPSAncm10ci1yZXZpZXctaGVhZGVyJztcbiAgICAgICAgaGVhZGVyLnRleHRDb250ZW50ID0gJ1RlY2huaWNhbCBtb3ZlIHJlcXVlc3RzIHJldmlldyc7XG5cbiAgICAgICAgb3V0cHV0RWxlbWVudC5hcHBlbmQoaGVhZGVyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtzZWN0aW9uSW5kZXgsIFtzZWN0aW9uLCByZXF1ZXN0c11dIG9mIE9iamVjdC5lbnRyaWVzKGFsbFJlcXVlc3RzKS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25IZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHNlY3Rpb25IZWFkZXIuY2xhc3NMaXN0LmFkZCgncm10ci1yZXZpZXctaGVhZGVyJyk7XG4gICAgICAgICAgICBzZWN0aW9uSGVhZGVyLnRleHRDb250ZW50ID0gc2VjdGlvbjtcblxuICAgICAgICAgICAgb3V0cHV0RWxlbWVudC5hcHBlbmQoc2VjdGlvbkhlYWRlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25Db250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzZWN0aW9uQ29udGVudC5jbGFzc0xpc3QuYWRkKCdybXRyLXJldmlldy1zZWN0aW9uLWNvbnRlbnQnKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vUmVxdWVzdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBub1JlcXVlc3RzLnRleHRDb250ZW50ID0gJ05vIHJlcXVlc3RzIGluIHRoaXMgc2VjdGlvbic7XG5cbiAgICAgICAgICAgICAgICBzZWN0aW9uQ29udGVudC5hcHBlbmQobm9SZXF1ZXN0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RzTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0SW5kZXgsIHJlcXVlc3RdIG9mIHJlcXVlc3RzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0RWxlbWVudCA9IHJlcXVlc3QuZWxlbWVudDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVSZXF1ZXN0Q2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXF1ZXN0Q2hlY2tib3gudHlwZSA9ICdjaGVja2JveCc7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlcXVlc3RDaGVja2JveC5jbGFzc0xpc3QuYWRkKCdybXRyLXJldmlldy1yZXF1ZXN0LWNoZWNrYm94Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlcXVlc3RDaGVja2JveC5pZCA9IGBybXRyLXJldmlldy1yZW1vdmUtcmVxdWVzdC0ke3NlY3Rpb25JbmRleH0tJHtyZXF1ZXN0SW5kZXh9YDtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVxdWVzdENoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVSZXF1ZXN0Q2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFJlcXVlc3RzW3NlY3Rpb25dW3JlcXVlc3RJbmRleF0ucmVzdWx0ID0geyByZW1vdmU6IHRydWUsIHJlYXNvbjogcmVtb3ZlUmVxdWVzdERyb3Bkb3duLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVxdWVzdEV4dHJhSW5wdXRzLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uQ2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYWxsUmVxdWVzdHNbc2VjdGlvbl1bcmVxdWVzdEluZGV4XS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVxdWVzdEV4dHJhSW5wdXRzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoU2VjdGlvbkNoZWNrYm94LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZVJlcXVlc3RMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlcXVlc3RMYWJlbC5odG1sRm9yID0gYHJtdHItcmV2aWV3LXJlbW92ZS1yZXF1ZXN0LSR7c2VjdGlvbkluZGV4fS0ke3JlcXVlc3RJbmRleH1gO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXF1ZXN0TGFiZWwudGV4dENvbnRlbnQgPSAnUmVtb3ZlIHJlcXVlc3QnO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RFbGVtZW50LmFwcGVuZChyZW1vdmVSZXF1ZXN0Q2hlY2tib3gpO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RWxlbWVudC5hcHBlbmQocmVtb3ZlUmVxdWVzdExhYmVsKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVSZXF1ZXN0RXh0cmFJbnB1dHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlcXVlc3RFeHRyYUlucHV0cy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlcXVlc3RFeHRyYUlucHV0cy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyBhcyAnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlUmVxdWVzdERyb3Bkb3duID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uID09PSAnQ29udGVzdGVkIHRlY2huaWNhbCByZXF1ZXN0cycpIHJlbW92ZVJlcXVlc3REcm9wZG93bi52YWx1ZSA9ICdDb250ZXN0ZWQnO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXF1ZXN0RHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGFsbFJlcXVlc3RzW3NlY3Rpb25dW3JlcXVlc3RJbmRleF0ucmVzdWx0IGFzIFJlcXVlc3RSZXN1bHRSZW1vdmUpLnJlYXNvbiA9IHJlbW92ZVJlcXVlc3REcm9wZG93bi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlUmVxdWVzdERyb3Bkb3duT3B0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlc3RlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWxyZWFkeSBkb25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdJbnZhbGlkIHBhZ2UgbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnSW5jb3JyZWN0IHZlbnVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdXaXRoZHJhd24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1N0YWxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdOb3QgZG9uZScsXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgcmVtb3ZlUmVxdWVzdERyb3Bkb3duT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlcXVlc3REcm9wZG93bi5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXF1ZXN0RXh0cmFJbnB1dHMuYXBwZW5kKHJlbW92ZVJlcXVlc3REcm9wZG93bik7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEVsZW1lbnQuYXBwZW5kKHJlbW92ZVJlcXVlc3RFeHRyYUlucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3dpdGNoU2VjdGlvbkNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoU2VjdGlvbkNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uQ2hlY2tib3guY2xhc3NMaXN0LmFkZCgncm10ci1yZXZpZXctcmVxdWVzdC1jaGVja2JveCcpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uQ2hlY2tib3guaWQgPSBgcm10ci1yZXZpZXctbW92ZS1yZXF1ZXN0LSR7c2VjdGlvbkluZGV4fS0ke3JlcXVlc3RJbmRleH1gO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uQ2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN3aXRjaFNlY3Rpb25DaGVja2JveC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbFJlcXVlc3RzW3NlY3Rpb25dW3JlcXVlc3RJbmRleF0ucmVzdWx0IGFzIFJlcXVlc3RSZXN1bHRNb3ZlKSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogc3dpdGNoU2VjdGlvbkRyb3Bkb3duLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoU2VjdGlvbkV4dHJhSW5wdXRzLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXF1ZXN0Q2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYWxsUmVxdWVzdHNbc2VjdGlvbl1bcmVxdWVzdEluZGV4XS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoU2VjdGlvbkV4dHJhSW5wdXRzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVxdWVzdENoZWNrYm94LmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN3aXRjaFNlY3Rpb25MYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaFNlY3Rpb25MYWJlbC5odG1sRm9yID0gYHJtdHItcmV2aWV3LW1vdmUtcmVxdWVzdC0ke3NlY3Rpb25JbmRleH0tJHtyZXF1ZXN0SW5kZXh9YDtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoU2VjdGlvbkxhYmVsLnRleHRDb250ZW50ID0gJ1N3aXRjaCBzZWN0aW9uJztcblxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RWxlbWVudC5hcHBlbmQoc3dpdGNoU2VjdGlvbkNoZWNrYm94KTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEVsZW1lbnQuYXBwZW5kKHN3aXRjaFNlY3Rpb25MYWJlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3dpdGNoU2VjdGlvbkV4dHJhSW5wdXRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uRXh0cmFJbnB1dHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uRXh0cmFJbnB1dHMuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgdG8gJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN3aXRjaFNlY3Rpb25Ecm9wZG93biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uRHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGFsbFJlcXVlc3RzW3NlY3Rpb25dW3JlcXVlc3RJbmRleF0ucmVzdWx0IGFzIFJlcXVlc3RSZXN1bHRNb3ZlKS5zZWN0aW9uID0gc3dpdGNoU2VjdGlvbkRyb3Bkb3duLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbiA9PT0gc2VjdGlvbikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQuc2VsZWN0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9PT0gKHNlY3Rpb24gPT09IGRlZmF1bHRNb3ZlU2VjdGlvbiA/IGZhbGxiYWNrRGVmYXVsdE1vdmVTZWN0aW9uIDogZGVmYXVsdE1vdmVTZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBvcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uRHJvcGRvd24uYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoU2VjdGlvbkV4dHJhSW5wdXRzLmFwcGVuZChzd2l0Y2hTZWN0aW9uRHJvcGRvd24pO1xuXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaFNlY3Rpb25FeHRyYUlucHV0cy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyB3aXRoIHJlYXNvbmluZyAnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3dpdGNoU2VjdGlvblJlYXNvbmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaFNlY3Rpb25SZWFzb25pbmcudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoU2VjdGlvblJlYXNvbmluZy5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChhbGxSZXF1ZXN0c1tzZWN0aW9uXVtyZXF1ZXN0SW5kZXhdLnJlc3VsdCBhcyBSZXF1ZXN0UmVzdWx0UmVtb3ZlKS5yZWFzb24gPSBzd2l0Y2hTZWN0aW9uUmVhc29uaW5nLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hTZWN0aW9uRXh0cmFJbnB1dHMuYXBwZW5kKHN3aXRjaFNlY3Rpb25SZWFzb25pbmcpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaFNlY3Rpb25FeHRyYUlucHV0cy5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJyAob3B0aW9uYWwsIGF1dG9tYXRpY2FsbHkgcGluZ3MgcmVxdWVzdG9yIGFuZCBzaWducyknKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEVsZW1lbnQuYXBwZW5kKHN3aXRjaFNlY3Rpb25FeHRyYUlucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHNMaXN0LmFwcGVuZChyZXF1ZXN0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2VjdGlvbkNvbnRlbnQuYXBwZW5kKHJlcXVlc3RzTGlzdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kKHNlY3Rpb25Db250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICBzdWJtaXRCdXR0b24uaWQgPSAncm10ci1yZXZpZXctc3VibWl0JztcbiAgICAgICAgc3VibWl0QnV0dG9uLnRleHRDb250ZW50ID0gJ1N1Ym1pdCc7XG4gICAgICAgIHN1Ym1pdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhZ2VSZXZpc2lvbiA9IGF3YWl0IGdldFBhZ2VSZXZpc2lvbigpO1xuXG4gICAgICAgICAgICBpZiAobmV3UGFnZVJldmlzaW9uLnJldmlkICE9PSByZXZJZCkgcmV0dXJuIG13Lm5vdGlmeSgnQW4gZWRpdCBjb25mbGljdCBvY2N1cnJlZCwgcGxlYXNlIHN0YXJ0IG92ZXIhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgbG9hZGluZ1NwaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuXG4gICAgICAgICAgICBsZXQgZW5kUmVzdWx0ID0gcGFnZUNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGludGVyZmFjZSBBbGxDaGFuZ2VzIHtcbiAgICAgICAgICAgICAgICByZW1vdmU6IFJlY29yZDxzdHJpbmcsIFJlcXVlc3RbXT47XG4gICAgICAgICAgICAgICAgbW92ZTogUmVjb3JkPHN0cmluZywgUmVxdWVzdFtdPjtcbiAgICAgICAgICAgICAgICB0b3RhbDogbnVtYmVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzOiBBbGxDaGFuZ2VzID0geyByZW1vdmU6IHt9LCBtb3ZlOiB7fSwgdG90YWw6IDAgfTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIE9iamVjdC52YWx1ZXMoYWxsUmVxdWVzdHMpKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiBzZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgncmVtb3ZlJyBpbiByZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kUmVzdWx0ID0gZW5kUmVzdWx0LnJlcGxhY2UocmVxdWVzdC5mdWxsICsgJ1xcbicsICcnKS5yZXBsYWNlKHJlcXVlc3QuZnVsbCwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVxdWVzdC5yZXN1bHQucmVhc29uIGluIGNoYW5nZXMucmVtb3ZlKSkgY2hhbmdlcy5yZW1vdmVbcmVxdWVzdC5yZXN1bHQucmVhc29uXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5yZW1vdmVbcmVxdWVzdC5yZXN1bHQucmVhc29uXS5wdXNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy50b3RhbCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdtb3ZlJyBpbiByZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VjdGlvblRpdGxlQWZ0ZXIgPSBzZWN0aW9uc1tzZWN0aW9ucy5pbmRleE9mKHJlcXVlc3QucmVzdWx0LnNlY3Rpb24pICsgMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFJlc3VsdCA9IGVuZFJlc3VsdC5yZXBsYWNlKHJlcXVlc3QuZnVsbCArICdcXG4nLCAnJykucmVwbGFjZShyZXF1ZXN0LmZ1bGwsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFJlc3VsdCA9IGVuZFJlc3VsdC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYChcXG4/XFxuPyg/Oj17Myx9W15cXG5dKiR7c2VjdGlvblRpdGxlQWZ0ZXJ9ICo9ezMsfXwkKSlgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXFxuJHtyZXF1ZXN0LmZ1bGx9JHtyZXF1ZXN0LnJlc3VsdC5yZWFzb24gPyBgXFxuOjogJHtyZXF1ZXN0LnJlcXVlc3RlciAmJiByZXF1ZXN0LnJlcXVlc3Rlci5sZW5ndGggPiAwID8gKG13LnV0aWwuaXNJUEFkZHJlc3MocmVxdWVzdC5yZXF1ZXN0ZXIpID8gJycgOiBgQFtbVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyfXwke3JlcXVlc3QucmVxdWVzdGVyfV1dIGApIDogJyd9ICR7cmVxdWVzdC5yZXN1bHQucmVhc29ufSB+fn5+YCA6ICcnfSQxYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyZXF1ZXN0LnJlc3VsdC5zZWN0aW9uIGluIGNoYW5nZXMubW92ZSkpIGNoYW5nZXMubW92ZVtyZXF1ZXN0LnJlc3VsdC5zZWN0aW9uXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLm1vdmVbcmVxdWVzdC5yZXN1bHQuc2VjdGlvbl0ucHVzaChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMudG90YWwrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNoYW5nZXMudG90YWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsb2FkaW5nU3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoJ05vIGNoYW5nZXMgdG8gbWFrZSEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuZFJlc3VsdCA9IGVuZFJlc3VsdC5yZXBsYWNlQWxsKG5ldyBSZWdFeHAoYFxcbnsyLH0oPXszLH1bXlxcbl0qJHtzZWN0aW9ucy5qb2luKCd8Jyl9ICo9ezMsfSlgLCAnZycpLCAnXFxuJDEnKTtcblxuICAgICAgICAgICAgY29uc3Qgbm9SZW1haW5pbmcgPSBPYmplY3QudmFsdWVzKGFsbFJlcXVlc3RzKS5ldmVyeSgoc2VjdGlvbikgPT5cbiAgICAgICAgICAgICAgICBzZWN0aW9uLmV2ZXJ5KChyZXF1ZXN0KSA9PiByZXF1ZXN0LnJlc3VsdCAmJiAncmVtb3ZlJyBpbiByZXF1ZXN0LnJlc3VsdCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBlZGl0U3VtbWFyeSA9IGBIYW5kbGVkICR7Y2hhbmdlcy50b3RhbH0gcmVxdWVzdCR7Y2hhbmdlcy50b3RhbCA+IDEgPyAncycgOiAnJ306ICR7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlcy5yZW1vdmUpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyBgUmVtb3ZlZCAke09iamVjdC5lbnRyaWVzKGNoYW5nZXMucmVtb3ZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChbcmVhc29uLCBwYWdlc10pID0+IGAke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlLm9yaWdpbmFsfV1dYCkuam9pbignLCAnKX0gYXMgJHtyZWFzb24udG9Mb3dlckNhc2UoKX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKX1gXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH0ke1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMubW92ZSkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IGAke09iamVjdC5lbnRyaWVzKGNoYW5nZXMucmVtb3ZlKS5sZW5ndGggPiAwID8gJywgJyA6ICcnfU1vdmVkICR7T2JqZWN0LmVudHJpZXMoY2hhbmdlcy5tb3ZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChbZGVzdGluYXRpb24sIHBhZ2VzXSkgPT4gYCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2Uub3JpZ2luYWx9XV1gKS5qb2luKCcsICcpfSB0byBcIiR7ZGVzdGluYXRpb259XCJgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKX1gXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH0ke25vUmVtYWluaW5nID8gJyAobm8gcmVxdWVzdHMgcmVtYWluKScgOiAnJ30gKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JtdHItaGVscGVyfHNjcmlwdF1dKWA7XG5cbiAgICAgICAgICAgIGF3YWl0IGFwaS5lZGl0KG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSwgKCkgPT4gKHsgdGV4dDogZW5kUmVzdWx0LCBzdW1tYXJ5OiBlZGl0U3VtbWFyeSB9KSk7XG5cbiAgICAgICAgICAgIG13Lm5vdGlmeShgU3VjY2Vzc2Z1bGx5IGhhbmRsZWQgJHtjaGFuZ2VzLnRvdGFsfSByZXF1ZXN0cywgcmVsb2FkaW5nLi4uYCwgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG5cbiAgICAgICAgICAgIHNob3VsZFN0b3BUYWJDbG9zdXJlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbG9hZGluZ1NwaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIGxvYWRpbmdTcGlubmVyLmlkID0gJ3JtdHItcmV2aWV3LWxvYWRpbmcnO1xuICAgICAgICBsb2FkaW5nU3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIHN1Ym1pdEJ1dHRvbi5hcHBlbmQobG9hZGluZ1NwaW5uZXIpO1xuXG4gICAgICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kKHN1Ym1pdEJ1dHRvbik7XG5cbiAgICAgICAgbXcudXRpbC4kY29udGVudFswXS5wcmVwZW5kKG91dHB1dEVsZW1lbnQpO1xuXG4gICAgICAgIG91dHB1dEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICB9KTtcbn0pO1xuXG4vKipcbiAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSB3aWtpIHBhZ2UncyBsYXRlc3QgcmV2aXNpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VSZXZpc2lvbigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogWydjb250ZW50JywgJ2lkcyddLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyksXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdCAmIHsgcXVlcnk6IHsgcGFnZXM6IHsgcmV2aXNpb25zOiB7IHJldmlkOiBudW1iZXIgfVtdIH1bXSB9IH1cbiAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OzttQkFHTyxJQUFNQSxFQUFNLElBQUksR0FBRyxJQ0gxQixJQUFBQyxFQUFBO0VDS0EsR0FBRyxPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRyxJQUFNLENBQ3RDLEdBQUksR0FBRyxPQUFPLElBQUksWUFBWSxJQUFNLCtDQUFnRCxPQUVwRixHQUFHLEtBQUssT0FBT0MsQ0FBVSxFQUV6QixJQUFNQyxFQUFhLEdBQUcsT0FBTyxJQUFJLGdCQUFnQixFQUU3Q0MsRUFBWSxHQUVILEdBQUcsS0FBSyxlQUNqQixHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxPQUFTLGFBQy9DLElBQ0EsdUJBQ0Esc0JBQ0osRUFFSyxpQkFBaUIsUUFBUyxNQUFPQyxHQUFVLENBQzVDQSxFQUFNLGVBQWUsRUFFckIsSUFBSUMsRUFBdUIsR0FLM0IsR0FKQSxPQUFPLGlCQUFpQixlQUFpQkQsR0FBVSxDQUMzQ0MsR0FBc0JELEVBQU0sZUFBZSxDQUNuRCxDQUFDLEVBRUdELEVBQVcsT0FBTyxTQUFTLGNBQWMscUJBQXFCLEdBQUcsZUFBZSxFQUMvRUEsRUFBWSxHQUVqQixJQUFNRyxFQUFlLE1BQU1DLEVBQWdCLEVBRXJDQyxFQUFRRixFQUFhLE1BQ3JCRyxFQUFjSCxFQUFhLE1BQU0sS0FBSyxRQUV0Q0ksRUFBVyxDQUNiLHFDQUNBLHVDQUNBLCtCQUNBLHNCQUNKLEVBRU1DLEVBQXFCRCxFQUFTLENBQUMsRUFDL0JFLEVBQTZCRixFQUFTLENBQUMsRUF3QnZDRyxFQUF5QyxDQUFDLEVBTWhELFNBQVNDLEVBQXdCQyxFQUFrQixDQUMvQyxJQUFNQyxFQUEwQixDQUFDLEVBRTNCQyxFQUFzQixDQUFDLElB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QUFNLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FDaEMiLAogICJuYW1lcyI6IFsiYXBpIiwgInJtdHJfaGVscGVyX2RlZmF1bHQiLCAicm10cl9oZWxwZXJfZGVmYXVsdCIsICJuYW1lc3BhY2VzIiwgImRpc3BsYXllZCIsICJldmVudCIsICJzaG91bGRTdG9wVGFiQ2xvc3VyZSIsICJwYWdlUmV2aXNpb24iLCAiZ2V0UGFnZVJldmlzaW9uIiwgInJldklkIiwgInBhZ2VDb250ZW50IiwgInNlY3Rpb25zIiwgImRlZmF1bHRNb3ZlU2VjdGlvbiIsICJmYWxsYmFja0RlZmF1bHRNb3ZlU2VjdGlvbiIsICJhbGxSZXF1ZXN0cyIsICJwYXJzZVRlbXBsYXRlUGFyYW1ldGVycyIsICJ0ZW1wbGF0ZSIsICJyYXdQYXJhbWV0ZXJzIiwgImlnbm9yZWRTdGFydFN5bWJvbHMiLCAiaWdub3JlZEVuZFN5bWJvbHMiLCAiaW5zaWRlTGlua09yVGVtcGxhdGUiLCAiY3VycmVudFRleHQiLCAiaW5kZXgiLCAiY2hhcmFjdGVyIiwgIm5leHRDaGFyYWN0ZXIiLCAic3ltYm9sIiwgInBhcmFtZXRlcnMiLCAicGFyYW1ldGVyIiwgInNwbGl0UGFyYW1ldGVyIiwgInZhbHVlIiwgInNlY3Rpb24iLCAibWF0Y2hlZFJlcXVlc3RzIiwgInJlcXVlc3QiLCAicmVxdWVzdHMiLCAibXdPbGRUaXRsZSIsICJtd05ld1RpdGxlIiwgInZhbGlkVGl0bGUiLCAiaW52YWxpZFRpdGxlV2FybmluZyIsICJ2YWxpZE5hbWVzcGFjZSIsICJuYW1lc3BhY2UiLCAiaW52YWxpZE5hbWVzcGFjZVdhcm5pbmciLCAicGFyc2VkV2lraXRleHQiLCAiYXBpIiwgInBhcnNlZEh0bWwiLCAicmVxdWVzdEVsZW1lbnQiLCAib3V0cHV0RWxlbWVudCIsICJoZWFkZXIiLCAic2VjdGlvbkluZGV4IiwgInNlY3Rpb25IZWFkZXIiLCAic2VjdGlvbkNvbnRlbnQiLCAibm9SZXF1ZXN0cyIsICJyZXF1ZXN0c0xpc3QiLCAicmVxdWVzdEluZGV4IiwgInJlbW92ZVJlcXVlc3RDaGVja2JveCIsICJyZW1vdmVSZXF1ZXN0RHJvcGRvd24iLCAicmVtb3ZlUmVxdWVzdEV4dHJhSW5wdXRzIiwgInN3aXRjaFNlY3Rpb25DaGVja2JveCIsICJyZW1vdmVSZXF1ZXN0TGFiZWwiLCAicmVtb3ZlUmVxdWVzdERyb3Bkb3duT3B0aW9ucyIsICJvcHRpb24iLCAib3B0aW9uRWxlbWVudCIsICJzd2l0Y2hTZWN0aW9uRHJvcGRvd24iLCAic3dpdGNoU2VjdGlvbkV4dHJhSW5wdXRzIiwgInN3aXRjaFNlY3Rpb25MYWJlbCIsICJzd2l0Y2hTZWN0aW9uUmVhc29uaW5nIiwgInN1Ym1pdEJ1dHRvbiIsICJsb2FkaW5nU3Bpbm5lciIsICJlbmRSZXN1bHQiLCAiY2hhbmdlcyIsICJzZWN0aW9uVGl0bGVBZnRlciIsICJub1JlbWFpbmluZyIsICJlZGl0U3VtbWFyeSIsICJyZWFzb24iLCAicGFnZXMiLCAicGFnZSIsICJkZXN0aW5hdGlvbiJdCn0K

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.