",u.innerHTML=m,M("setup-step-summary")}async function z(u){try{const m=await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return m.ok?(await m.json(),!0):(errorHandler.logError("[SetupWizard] Save Config",new Error(`Server returned ${m.status}`),{function:"saveConfigToServer"}),!1)}catch(m){return errorHandler.logError("[SetupWizard] Save Config",m,{function:"saveConfigToServer"}),!1}}async function D(){const u={setupComplete:!0,configurationType:f,timestamp:new Date().toISOString(),timezone:document.getElementById("setup-timezone")?.value||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"};if(f==="homelab"){u.tld=document.getElementById("setup-tld")?.value?.trim()||".home",u.caName=document.getElementById("setup-ca-name")?.value?.trim()||"";const H=document.getElementById("setup-dns-provider")?.value||"technitium";u.dns={provider:H,ip:document.getElementById("setup-dns-ip")?.value?.trim()||"",port:document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT,token:document.getElementById("setup-dns-token")?.value?.trim()||""},u.defaults={dnsType:"private",sslType:"internal",targetIP:"localhost"}}else f==="simple"?(u.defaultIP=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost",u.defaults={dnsType:"none",sslType:"none",targetIP:u.defaultIP}):f==="public"&&(u.domain=document.getElementById("setup-public-domain")?.value?.trim()||"",u.email=document.getElementById("setup-public-email")?.value?.trim()||"",u.routingMode=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",u.defaults={dnsType:u.routingMode==="subdirectory"?"none":"public",sslType:"letsencrypt",targetIP:"localhost"});const m=await z(u);safeSet("dashcaddy-config",JSON.stringify(u)),safeSet("dashcaddy-setup","completed"),document.getElementById("setup-wizard").style.display="none";const h=f==="homelab"?"Professional Home Lab":f==="simple"?"Simple Setup":"Public Server",g=m?"server (shared across all devices)":"locally (this browser only)";showNotification(`Setup Complete! Configured for: ${h}. Settings saved to: ${g}`,"success",5e3),setTimeout(()=>location.reload(),500)}const v=document.getElementById("setup-step-1-next");v&&(v.onclick=function(u){u.preventDefault();const m=document.querySelector('input[name="config-type"]:checked');m&&(f=m.value),M(f==="homelab"?"setup-step-homelab":f==="simple"?"setup-step-simple":f==="public"?"setup-step-public":"setup-step-homelab")});const B=document.getElementById("setup-skip");B&&(B.onclick=async function(u){u.preventDefault(),confirm("Skip setup? You can run it later from Settings.")&&(await z({setupComplete:!0,skipped:!0,timestamp:new Date().toISOString()}),safeSet("dashcaddy-setup","skipped"),document.getElementById("setup-wizard").style.display="none")});const x=document.getElementById("setup-tld");x&&(x.oninput=function(u){const m=u.target.value||".home",h=document.getElementById("tld-preview"),g=document.getElementById("tld-preview-2");h&&(h.textContent=m),g&&(g.textContent=m)});const $=document.getElementById("setup-homelab-back");$&&($.onclick=function(u){u.preventDefault(),M("setup-step-1")});const k=document.getElementById("setup-homelab-next");k&&(k.onclick=function(u){u.preventDefault();const m=document.getElementById("setup-tld")?.value?.trim()||"",h=document.getElementById("setup-ca-name")?.value?.trim()||"",g=document.getElementById("setup-dns-ip")?.value?.trim()||"";if(!m||!m.startsWith(".")){showNotification("Please enter a valid TLD starting with a dot (e.g., .home)","warning");return}if(!h){showNotification("Please enter a Certificate Authority name","warning");return}if(!g){showNotification("Please enter your DNS server IP address","warning");return}P()});const T=document.getElementById("setup-simple-back");T&&(T.onclick=function(u){u.preventDefault(),M("setup-step-1")});const S=document.getElementById("setup-simple-next");S&&(S.onclick=function(u){u.preventDefault(),P()}),document.querySelectorAll('input[name="routing-mode"]').forEach(function(u){u.onchange=function(){var m=document.getElementById("dns-requirement-note");m&&(m.textContent=this.value==="subdirectory"?"Only one DNS record needed (for the main domain)":"You'll need to configure DNS manually for each subdomain")}});const L=document.getElementById("setup-public-back");L&&(L.onclick=function(u){u.preventDefault(),M("setup-step-1")});const j=document.getElementById("setup-public-next");j&&(j.onclick=function(u){u.preventDefault();const m=document.getElementById("setup-public-domain")?.value?.trim()||"",h=document.getElementById("setup-public-email")?.value?.trim()||"";if(!m){showNotification("Please enter your domain name","warning");return}if(!h||!h.includes("@")){showNotification("Please enter a valid email address","warning");return}P()});const C=document.getElementById("setup-summary-back");C&&(C.onclick=function(u){u.preventDefault(),f==="homelab"?M("setup-step-homelab"):f==="simple"?M("setup-step-simple"):f==="public"&&M("setup-step-public")});const N=document.getElementById("setup-summary-next");N&&(N.onclick=function(u){u.preventDefault(),M("setup-step-disk-safety")});const R=document.getElementById("setup-disk-safety-back");R&&(R.onclick=function(u){u.preventDefault(),M("setup-step-summary")});const U=document.getElementById("setup-disk-safety-finish");U&&(U.onclick=function(u){u.preventDefault(),D()}),window.getGlobalConfig=async function(){try{const m=await fetch("/api/v1/config");if(m.ok){const h=await m.json();if(h&&h.setupComplete)return h}}catch{console.warn("Could not fetch config from server")}const u=safeGet("dashcaddy-config");return u?JSON.parse(u):{setupComplete:!1,configurationType:"homelab",tld:".home",caName:"",defaults:{dnsType:"private",sslType:"internal",targetIP:"localhost"}}},window.resetSetupWizard=async function(){if(confirm("Reset DashCaddy configuration? This will show the setup wizard again.")){try{await secureFetch("/api/v1/config",{method:"DELETE"})}catch{console.warn("Could not delete server config")}safeRemove("dashcaddy-setup"),safeRemove("dashcaddy-config"),location.reload()}}})(),(function(){const f=new ErrorHandler;injectModal("app-selector-modal",`
Choose an App
`),injectModal("app-deploy-modal",`
Deploy Application
Your app will be available at: uptime.home
\u2713 Detected from existing media servers:
Select folders from existing servers, browse, or type paths manually. Separate multiple with commas.
Token expires in 4 minutes! Get it right before clicking Deploy. Leave empty to configure Plex manually later.
Checking Tailscale status...
\u2699\uFE0F Advanced Options
Use 'localhost' for same-host containers, or specific IP for remote services
Customize where container data is stored on the host. Media volumes are configured above.
Optional CPU and memory constraints. Leave at 0 for unlimited.
`);const I="custom-apps";let A=null,E=null;const M=document.getElementById("app-selector-modal"),P=document.getElementById("app-selector-grid");async function z(){try{const c=await(await fetch("/api/v1/apps/templates")).json();if(c.success)return A=c.templates,E=c.categories,!0}catch(r){f.logError("[AppSelector] Fetch Templates",r,{function:"fetchApiTemplates"})}return!1}async function D(r){try{return await(await fetch(`/api/v1/apps/ports/${r}/check`)).json()}catch(c){return f.logError("[AppSelector] Check Port",c,{function:"checkPortAvailability"}),{available:!0}}}async function v(r){try{const d=await(await fetch(`/api/v1/apps/ports/${r}/suggest`)).json();if(d.success)return d.suggestedPort}catch(c){f.logError("[AppSelector] Get Suggested Port",c,{function:"getSuggestedPort"})}return r}async function B(){if(P.innerHTML='
Loading app templates...
',!A&&!await z()){P.innerHTML='
Failed to load app templates. Please try again.
';return}P.innerHTML="";const r={};for(const[d,b]of Object.entries(A)){const y=b.category||"Other";r[y]||(r[y]=[]),r[y].push({id:d,...b})}const c=E?Object.keys(E):Object.keys(r).sort();for(const d of c){const b=r[d];if(!b||b.length===0)continue;b.sort((e,a)=>(a.popularity||0)-(e.popularity||0));const y=document.createElement("div");y.className="app-category-header";const t=E?.[d]||{};y.innerHTML=`${escapeHtml(t.icon||"")} ${escapeHtml(d)}`,t.color&&(y.style.borderBottomColor=t.color),P.appendChild(y),b.forEach(e=>{const a=document.createElement("div");a.className="app-option";const o=e.isDashboardWidget,i=o&&safeGet("widget-"+e.id+"-enabled")!=="false",n=o?`
${i?"ON":"OFF"}
`:"",s=!o&&e.difficulty?`
${escapeHtml(e.difficulty)}
`:"";a.innerHTML=`
${escapeHtml(e.icon||"\u{1F4E6}")}
${escapeHtml(e.name)}
${escapeHtml(e.description||"")}
${n}${s}
`,o?a.onclick=()=>x(e,a):a.onclick=()=>$(e),P.appendChild(a)})}window.renderRecipeCards&&await window.renderRecipeCards(P)}function x(r,c){const d="widget-"+r.id+"-enabled",y=!(safeGet(d)!=="false");safeSet(d,String(y));const t=r.widgetSelector;if(t){const a=document.querySelector(t);a&&(a.style.display=y?"":"none")}const e=c.querySelector('div[style*="border-radius: 4px"]');e&&(e.textContent=y?"ON":"OFF",e.style.background=y?"#2ecc7130":"#e74c3c30",e.style.color=y?"#2ecc71":"#e74c3c"),showNotification(`${r.name} widget ${y?"enabled":"disabled"}`,"success",2e3)}async function $(r){const c=document.getElementById("app-deploy-modal"),d=document.getElementById("app-deploy-title"),b=document.getElementById("deploy-subdomain"),y=document.getElementById("deploy-url-preview"),t=document.getElementById("deploy-ip"),e=document.getElementById("deploy-port"),a=document.getElementById("deploy-tailscale-only"),o=document.getElementById("tailscale-status");try{const G=await(await secureFetch("/api/v1/apps/check-existing",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:r.id})})).json();if(G.success&&G.exists){const V=G.container;confirm(`Found existing ${r.name} container:
Container: ${V.name}
Status: ${V.status}
Port: ${V.primaryPort||"N/A"}
Would you like to use this existing container?
Click OK to configure DNS/Caddy for the existing container.
Click Cancel to deploy a new container.`)&&(r._useExisting=!0,r._existingContainer=V)}}catch{}d.textContent=`Deploy ${r.name}`;const i=r.subdomain||r.id.replace(/-/g,"");b.value=i;const n=document.getElementById("subpath-compat-warning");if(n)if(SITE.routingMode==="subdirectory"){const W=r.subpathSupport||"strip";W==="none"?(n.style.display="block",n.innerHTML='⚠ '+r.name+" does not support subdirectory mode. It may not work correctly at a subpath."):W==="strip"?(n.style.display="block",n.innerHTML='ⓘ '+r.name+" has unverified subdirectory support. It may require additional configuration."):n.style.display="none"}else n.style.display="none";const s=SITE.defaults.dnsType||(SITE.configurationType==="public"?"public":"private"),l=SITE.defaults.sslType||(SITE.configurationType==="public"?"letsencrypt":"internal"),p=document.querySelector(`input[name="dns-type"][value="${s}"]`),w=document.querySelector(`input[name="ssl-type"][value="${l}"]`);p?p.checked=!0:document.querySelector('input[name="dns-type"][value="private"]').checked=!0,w?w.checked=!0:document.querySelector('input[name="ssl-type"][value="internal"]').checked=!0,t.value=SITE.defaults.targetIP||"localhost",a.checked=!1;const O=document.querySelector("#app-deploy-modal .flex-col-gap")?.closest("div"),_=document.querySelector("#app-deploy-modal details"),F=_?.querySelector("div");if(_&&F&&(SITE.configurationType==="public"||SITE.configurationType==="homelab")){const W=document.querySelectorAll('#app-deploy-modal input[name="dns-type"]')[0]?.closest("div.flex-col-gap")?.parentElement,G=document.querySelectorAll('#app-deploy-modal input[name="ssl-type"]')[0]?.closest("div.flex-col-gap")?.parentElement;W&&!W.dataset.moved&&(F.appendChild(W),W.dataset.moved="1"),G&&!G.dataset.moved&&(F.appendChild(G),G.dataset.moved="1")}const q=document.getElementById("media-path-section"),J=document.getElementById("deploy-media-path"),X=document.getElementById("media-path-description");if(r.mediaMount){q.style.display="block",J.value="",J.placeholder="/media/Movies, /media/TVShows or click Browse";const W=document.getElementById("detected-mounts-container"),G=document.getElementById("detected-mounts-list");try{const K=await(await fetch("/api/v1/media/detected-mounts")).json();if(K.success&&K.mounts.length>0){W.style.display="block",G.innerHTML="";const te=[...new Set(K.mounts.map(ee=>ee.hostPath))];J.value=te.join(", "),K.mounts.forEach(ee=>{const Z=document.createElement("button");Z.type="button";const de=te.includes(ee.hostPath);Z.style.cssText=`padding: 8px 14px; font-size: 0.85rem; background: color-mix(in srgb, var(--success) ${de?"40%":"15%"}, var(--card-bg)); border: 1px solid var(--success); border-radius: 6px; cursor: pointer; color: var(--fg);`,Z.innerHTML=`${escapeHtml(ee.folderName)} from ${escapeHtml(ee.sourceImage)}`,Z.title=`${ee.hostPath} (from ${ee.sourceContainer})`,Z.onclick=()=>{const le=J.value.split(",").map(ce=>ce.trim()).filter(ce=>ce),pe=le.indexOf(ee.hostPath);pe>=0?(le.splice(pe,1),Z.style.background="color-mix(in srgb, var(--success) 15%, var(--card-bg))"):(le.push(ee.hostPath),Z.style.background="color-mix(in srgb, var(--success) 40%, var(--card-bg))"),J.value=le.join(", ")},G.appendChild(Z)})}else W.style.display="none"}catch{W.style.display="none"}document.getElementById("browse-media-btn").onclick=()=>{openFolderBrowser(J)}}else q.style.display="none",J.value="",document.getElementById("detected-mounts-container").style.display="none";const Q=document.getElementById("plex-claim-section");Q&&(r.id==="plex"||r.claimToken?(Q.style.display="block",document.getElementById("deploy-plex-claim").value=""):Q.style.display="none");const ne=document.getElementById("volume-mounts-section"),oe=document.getElementById("volume-mounts-list");if(oe.innerHTML="",r.docker?.volumes?.length){const W=r.mediaMount?.containerPath,G=r.docker.volumes.filter(V=>!V.includes("{{MEDIA_PATH}}")&&!(W&&V.endsWith(":"+W)));G.length>0?(ne.style.display="block",G.forEach((V,K)=>{const[te,ee]=V.split(":"),Z=document.createElement("div");Z.style.cssText="display: flex; gap: 6px; align-items: center;",Z.innerHTML=`
\u2192 ${ee}
`,oe.appendChild(Z),Z.querySelector(".vol-browse-btn").onclick=()=>{const de=Z.querySelector(".vol-host-path");openFolderBrowser(de)}})):ne.style.display="none"}else ne.style.display="none";const se=r.defaultPort||8080;e.value="",e.placeholder=`Default: ${se}`;let Y=document.getElementById("deploy-port-status");Y||(Y=document.createElement("div"),Y.id="deploy-port-status",Y.style.cssText="font-size: 0.8rem; margin-top: 4px;",e.parentNode.appendChild(Y));async function ie(){const W=e.value||se;Y.innerHTML='Checking port...';const G=await D(W);if(G.available)Y.innerHTML=`Port ${escapeHtml(String(W))} is available`;else{const V=await v(se);Y.innerHTML=`
Port ${escapeHtml(W)} in use by ${escapeHtml(G.conflict?.usedBy||"unknown")}
`;const K=document.createElement("button");K.type="button",K.textContent=`Use ${V}`,K.style.cssText="margin-left: 8px; padding: 2px 8px; font-size: 0.75rem; cursor: pointer;",K.onclick=()=>{document.getElementById("deploy-port").value=V,Y.innerHTML=`Using suggested port ${escapeHtml(String(V))}`},Y.appendChild(K)}}let re;e.oninput=function(){clearTimeout(re),re=setTimeout(ie,500)},ie();try{const G=await(await fetch("/api/v1/tailscale/status")).json();G.success&&G.installed&&G.connected?o.innerHTML=`
Connected${G.self?.hostname} (${G.self?.ip})| ${G.deviceCount} devices
`:G.installed?o.innerHTML='Not connected':(o.innerHTML='Not available',a.disabled=!0)}catch{o.innerHTML='Could not check status'}function ae(){const W=b.value||"subdomain",G=document.querySelector('input[name="dns-type"]:checked').value,V=document.querySelector('input[name="ssl-type"]:checked').value;let K="";if(SITE.routingMode==="subdirectory"&&SITE.domain)K=`https://${SITE.domain}/${W}`;else if(G==="private")K=`${V==="none"?"http":"https"}://${buildDomain(W)}`;else if(G==="public"){const te=V==="none"?"http":"https",ee=SITE.domain||W;K=SITE.domain?`${te}://${W}.${SITE.domain}`:`${te}://${W}`}else{const te=e.value||r.defaultPort||DC.DEFAULTS.SERVICE_PORT;K=`http://${t.value}:${te}`}y.textContent=K}b.oninput=ae,t.oninput=ae,e.oninput=ae,document.querySelectorAll('input[name="dns-type"]').forEach(W=>{W.onchange=ae}),document.querySelectorAll('input[name="ssl-type"]').forEach(W=>{W.onchange=ae}),ae(),M.classList.remove("show"),c.classList.add("show"),c.dataset.appTemplate=JSON.stringify(r)}async function k(r){const c=r.appTemplate,d=safeGetJSON(I,[]),b=c._useExisting&&c._existingContainer,y=d.find(t=>t.id===r.subdomain);if(!(y&&!b&&!confirm(`An app with subdomain "${r.subdomain}" already exists. Redeploy?`))){if(y){const t=d.indexOf(y);d.splice(t,1),safeSet(I,JSON.stringify(d))}if(b)r.port=c._existingContainer.primaryPort;else{const t=r.port||c.defaultPort||8080;showNotification(`Checking port ${t} availability...`,"info",0);const e=await D(t);if(!e.available){const a=await v(c.defaultPort||8080);if(confirm(`Port ${t} is already in use by ${e.conflict?.usedBy||"another container"}.
Would you like to use port ${a} instead?`))r.port=a;else{showNotification("Deployment cancelled - port conflict","error",5e3);return}}}showNotification(b?`Configuring ${c.name} with existing container...`:`Deploying ${c.name}...`,"info",0);try{const t={appId:c.id,config:{subdomain:r.subdomain,ip:r.ip,createDns:r.dnsType==="private",port:r.port||c.defaultPort||null,sslType:r.sslType,dnsType:r.dnsType,tailscaleOnly:r.tailscaleOnly||!1,mediaPath:r.mediaPath||null,plexClaimToken:r.plexClaimToken||null,customVolumes:r.customVolumes||null}};b&&(t.config.useExisting=!0,t.config.existingContainerId=c._existingContainer.id,t.config.existingPort=c._existingContainer.primaryPort,!r.port&&c._existingContainer.primaryPort&&(t.config.port=c._existingContainer.primaryPort));const a=await(await secureFetch("/api/v1/apps/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).json();if(a.success){const o={id:r.subdomain,name:c.name,logo:`/assets/${c.id}.png`,containerId:a.containerId,url:a.url,ip:r.ip,appTemplate:c.id,tailscaleOnly:r.tailscaleOnly||!1};d.push(o),safeSet(I,JSON.stringify(d)),window.APPS&&!window.APPS.some(n=>n.id===c.id)&&(window.APPS.push(o),typeof window.buildGrid=="function"&&window.buildGrid(),typeof window.refreshAll=="function"&&setTimeout(()=>window.refreshAll(),500));let i=a.usedExisting?`${c.name} configured with existing container!
URL: ${a.url}`:`${c.name} deployed successfully!
URL: ${a.url}`;a.warning&&(i+=`
\u26A0 Warning: ${a.warning}`),showNotification(i,"success",8e3),delete c._useExisting,delete c._existingContainer,a.url&&a.url.startsWith("https://")&&T(a.url,c.name),a.setupInstructions&&a.setupInstructions.length>0&&setTimeout(()=>{const n=a.setupInstructions.join(`
`);showNotification(`Setup Instructions for ${c.name}: ${n}`,"info",1e4)},1e3)}else throw new Error(a.error||"Deployment failed")}catch(t){f.logError("[AppSelector] Deployment",t,{function:"deploy"}),showNotification(`Failed to deploy ${c.name}: ${t.message}`,"error",8e3)}}}async function T(r,c){showNotification(`\u23F3 Generating SSL certificate for ${c}...`,"warning",6e4);let d=0;const b=12,y=async()=>{d++;try{const t=await fetch(r,{method:"HEAD",mode:"no-cors"});return showNotification(`\u2705 ${c} is ready! SSL certificate generated.`,"success",5e3),!0}catch{return d{window.APPS.some(d=>d.id===c.id)||window.APPS.push(c)})}document.getElementById("add-service-btn")?.addEventListener("click",()=>{B(),M.classList.add("show")}),wireModal(M,document.getElementById("app-selector-cancel"));const L=document.getElementById("app-deploy-modal");document.getElementById("app-deploy-cancel")?.addEventListener("click",()=>{L.classList.remove("show")}),document.getElementById("app-deploy-confirm")?.addEventListener("click",()=>{const r=JSON.parse(L.dataset.appTemplate),c=document.getElementById("deploy-media-path").value.trim(),d=[];document.querySelectorAll("#volume-mounts-list .vol-host-path").forEach(y=>{d.push({hostPath:y.value.trim(),containerPath:y.dataset.containerPath})});const b={appTemplate:r,subdomain:document.getElementById("deploy-subdomain").value.trim(),dnsType:document.querySelector('input[name="dns-type"]:checked').value,sslType:document.querySelector('input[name="ssl-type"]:checked').value,ip:document.getElementById("deploy-ip").value.trim(),port:document.getElementById("deploy-port").value.trim(),tailscaleOnly:document.getElementById("deploy-tailscale-only").checked,mediaPath:c||null,plexClaimToken:document.getElementById("deploy-plex-claim")?.value.trim()||null,customVolumes:d.length>0?d:null,resources:{cpus:parseFloat(document.getElementById("deploy-cpu-limit").value)||0,memory:parseFloat(document.getElementById("deploy-memory-limit").value)||0}};if(!b.subdomain){showNotification("Please enter a subdomain or domain name","warning");return}if(r.mediaMount?.required&&!c){showNotification("Please enter a media library path for this application","warning");return}L.classList.remove("show"),k(b)}),wireModal(L);const j=document.getElementById("folder-browser-modal"),C=document.getElementById("folder-browser-path"),N=document.getElementById("folder-browser-list"),R=document.getElementById("folder-browser-selected"),U=document.getElementById("folder-browser-selected-list");let u="",m=[],h=null;window.openFolderBrowser=function(r){h=r,m=r.value.split(",").map(c=>c.trim()).filter(c=>c),u="",H(),g(""),j.classList.add("show")};async function g(r){C.textContent=r||"Select a drive...",N.innerHTML='
');const f=document.getElementById("error-log-modal"),I=document.getElementById("error-log-content"),A=document.getElementById("view-error-logs"),E=document.getElementById("error-log-refresh"),M=document.getElementById("error-log-clear"),P=document.getElementById("error-log-close");async function z(){I.innerHTML='
Create and manage Docker container checkpoints for instant state recovery.
Image:
Status:
Created:
Container ID:
\u{1F4BE}Select a container to view its snapshots
`);const f=document.getElementById("snapshot-modal"),I=document.getElementById("snapshot-btn"),A=document.getElementById("snapshot-close"),E=document.getElementById("snapshot-container-select"),M=document.getElementById("snapshot-details"),P=document.getElementById("snapshot-create-btn"),z=document.getElementById("snapshot-create-status");let D=null;async function v(){try{const S=await(await fetch("/api/v1/containers")).json();if(!S.success||!S.containers)return;E.innerHTML='';for(const L of S.containers){const j=document.createElement("option");j.value=L.id,j.textContent=`${L.name||L.id} (${L.image||"unknown"})`,j.dataset.name=L.name,j.dataset.image=L.image,j.dataset.status=L.status,j.dataset.created=L.created,E.appendChild(j)}}catch(T){console.error("Failed to load containers:",T)}}function B(T){if(!T||!T.value){M.style.display="none",D=null;return}D=T.value,document.getElementById("snapshot-image").textContent=T.dataset.image||"-",document.getElementById("snapshot-status").textContent=T.dataset.status||"-",document.getElementById("snapshot-created").textContent=T.dataset.created?new Date(T.dataset.created*1e3).toLocaleString():"-",document.getElementById("snapshot-id").textContent=T.value.substring(0,12),M.style.display=""}async function x(){if(!D){z.textContent="Please select a container first",z.style.color="var(--bad-fg)";return}const T=document.getElementById("snapshot-name").value.trim();if(!T){z.textContent="Please enter a snapshot name",z.style.color="var(--bad-fg)";return}const S=document.getElementById("snapshot-leave-running").checked;P.disabled=!0,P.textContent="Creating...",z.textContent="";try{const j=await(await fetch(`/api/v1/containers/${encodeURIComponent(D)}/checkpoint`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:T,leaveRunning:S})})).json();j.success?(z.textContent=`\u2713 Snapshot "${T}" created successfully`,z.style.color="var(--ok-fg)",document.getElementById("snapshot-name").value=""):(z.textContent=`\u2717 Failed: ${j.error||"Unknown error"}`,z.style.color="var(--bad-fg)")}catch(L){z.textContent=`\u2717 Error: ${L.message}`,z.style.color="var(--bad-fg)"}finally{P.disabled=!1,P.textContent="\u{1F4BE} Create Snapshot"}}function $(){f.classList.add("show"),v()}function k(){f.classList.remove("show"),M.style.display="none",D=null,E.selectedIndex=0}I?.addEventListener("click",$),A?.addEventListener("click",k),wireModal(f,A),E?.addEventListener("change",T=>{const S=E.options[E.selectedIndex];B(S)}),P?.addEventListener("click",x),f?.querySelectorAll(".panel-tab").forEach(T=>{T.addEventListener("click",()=>{f.querySelectorAll(".panel-tab").forEach(S=>S.classList.remove("active")),f.querySelectorAll(".panel-section").forEach(S=>S.classList.remove("active")),T.classList.add("active"),f.querySelector(`#${T.dataset.panel}`).classList.add("active")})})})(),(function(){injectModal("arr-setup-modal",`
\u{1F3AC} Smart Arr Connect
Auto-discover and connect your entire media stack.
`,v.style.display="block"}}function U(g){let H="";const r=g.services,c=["radarr","sonarr","prowlarr"];for(const y of c){const t=r[y];if(!t||t.status==="not_found"&&!t.url)continue;const e=L[y],a=j[y],o=t.status==="connected";H+=`
`}B.innerHTML=H}window.smartTestConnection=async function(g){const H=document.getElementById(`smart-${g}-url`),r=document.getElementById(`smart-${g}-key`),c=document.getElementById(`smart-${g}-status`),d=H?.value.trim(),b=r?.value.trim();if(!d||!b){c.innerHTML='Enter URL and API key';return}c.innerHTML='';try{const t=await(await secureFetch("/api/v1/arr/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:g,url:d,apiKey:b})})).json();t.success?c.innerHTML=`✓ ${escapeHtml(t.appName||"Connected")} v${escapeHtml(t.version||"")}`:c.innerHTML=`✗ ${escapeHtml(t.error)}`}catch(y){c.innerHTML=`✗ ${escapeHtml(y.message)}`}};async function u(){C("progress"),x.innerHTML='
Connecting services...
';const g={};for(const r of["radarr","sonarr","prowlarr"]){const c=document.getElementById(`smart-${r}-url`)?.value.trim(),d=document.getElementById(`smart-${r}-key`)?.value.trim();d&&c?g[r]={apiKey:d,url:c}:d&&(g[r]={apiKey:d})}const H={services:Object.keys(g).length>0?g:void 0,configurePlex:document.getElementById("smart-opt-plex")?.checked,configureProwlarr:document.getElementById("smart-opt-prowlarr")?.checked,configureSeerr:document.getElementById("smart-opt-seerr")?.checked,saveCredentials:document.getElementById("smart-opt-save")?.checked};try{const c=await(await secureFetch("/api/v1/arr/smart-connect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(H)})).json();let d="";for(const b of c.steps||[]){const y=b.status==="success"?'✓':'✗',t=b.status==="success"?"var(--muted)":"var(--bad-fg)";d+=`
"}}}async function m(e,a){try{var o=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,...a})}),i=await o.json();i.success?showNotification("Schedule updated for "+e,"success"):(showNotification("Update failed: "+(i.error||"Unknown"),"error"),u())}catch(n){showNotification("Error: "+n.message,"error")}}async function h(e){try{var a=await secureFetch("/api/v1/backups/backup/"+encodeURIComponent(e),{method:"POST",headers:{"Content-Type":"application/json"}}),o=await a.json();o.success?showNotification("Backup started for "+e+"!","success"):showNotification("Backup failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function g(e){if(confirm("Remove backup schedule for "+e+"?"))try{var a=await secureFetch("/api/v1/backups/schedule/"+encodeURIComponent(e),{method:"DELETE"}),o=await a.json();o.success?(showNotification("Schedule removed for "+e,"success"),u()):showNotification("Delete failed: "+(o.error||"Unknown"),"error")}catch(i){showNotification("Error: "+i.message,"error")}}async function H(){var e=document.getElementById("new-schedule-appid")?.value?.trim(),a=document.getElementById("new-schedule-interval")?.value||"daily",o=parseInt(document.getElementById("new-schedule-retention")?.value)||7;if(!e){showNotification("Please enter an App ID","warning");return}try{var i=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,schedule:a,retention:{keep:o},enabled:!0})}),n=await i.json();if(n.success){showNotification("Schedule created for "+e,"success"),u();var s=document.getElementById("new-schedule-appid");s&&(s.value="")}else showNotification("Failed: "+(n.error||"Unknown"),"error")}catch(l){showNotification("Error: "+l.message,"error")}}async function r(){if(N){N.innerHTML='
Loading...
';try{var e=await fetch("/api/v1/backups/files"),a=await e.json();if(!a.success)throw new Error(a.error||"Failed to load");var o=a.files||[];if(o.length===0){N.innerHTML='
"}}}window.__restoreServerBackup=async function(e){if(confirm("Restore from this server backup? This will overwrite current configuration."))try{var a=await secureFetch("/api/v1/backups/restore/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restoreServices:!0,restoreConfig:!0})}),o=await a.json();o.success?(showNotification("Restore completed successfully!","success"),location.reload()):showNotification("Restore failed: "+(o.error||"Unknown error"),"error")}catch(i){showNotification("Restore error: "+i.message,"error")}},document.querySelector('[data-panel="backup-schedules-tab"]')?.addEventListener("click",u),document.querySelector('[data-panel="backup-disk-tab"]')?.addEventListener("click",r),document.querySelector('[data-panel="backup-pointintime-tab"]')?.addEventListener("click",d),document.querySelector('[data-panel="backup-history-tab"]')?.addEventListener("click",c);async function d(){if(R){try{var e=await fetch("/api/v1/license/status"),a=await e.json();if(a.tier!=="premium"){R.innerHTML=`
\u2B50
Premium Feature
Point-in-time restore requires DashCaddy Premium with auto-backup enabled.
Configuration differs \u2014 restoring will replace current settings
':s+='
No changes
',s+="
"}s+='
',document.body.insertAdjacentHTML("beforeend",s),document.getElementById("compare-close-btn")?.addEventListener("click",function(){document.getElementById("compare-overlay")?.remove()}),document.getElementById("compare-overlay")?.addEventListener("click",function(w){w.target===this&&this.remove()})}catch(w){showNotification("Compare error: "+w.message,"error")}}async function t(e,a){if(confirm("Restore "+a+" for "+e+`?
This will replace current configuration, credentials, and data. Containers will be restarted.`))try{var o=await secureFetch("/api/v1/apps/"+encodeURIComponent(e)+"/revert/"+encodeURIComponent(a),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restartContainers:!0})}),i=await o.json();i.success?(showNotification(e+" restored to "+a,"success"),setTimeout(function(){location.reload()},1500)):showNotification("Restore failed: "+(i.error||"Unknown"),"error")}catch(n){showNotification("Restore error: "+n.message,"error")}}})(),(function(){injectModal("stats-modal",`
\u{1F4CA} Resource Monitor
Real-time and historical CPU, memory, network, and disk usage for containers.
Loading container stats...
\u{1F4C8}
Loading 24-hour aggregated metrics...
\u{1F4CA}
Choose a container and time range to view history.
\u{1F514}
Loading alert configurations...
`);const f=document.getElementById("stats-modal"),I=document.getElementById("container-stats-btn"),A=document.getElementById("stats-cancel"),E=document.getElementById("stats-refresh-btn"),M=document.getElementById("stats-auto-refresh"),P=document.getElementById("stats-container"),z=document.getElementById("stats-aggregated-container"),D=document.getElementById("stats-alerts-container"),v=document.getElementById("stats-last-update");let B=null,x=null;function $(d){if(d===0||!d)return"0 B";const b=1024,y=["B","KB","MB","GB"],t=Math.floor(Math.log(d)/Math.log(b));return parseFloat((d/Math.pow(b,t)).toFixed(1))+" "+y[t]}function k(d){return d<30?"#2ecc71":d<70?"#f39c12":"#e74c3c"}function T(d){return d<50?"#2ecc71":d<80?"#f39c12":"#e74c3c"}async function S(){try{let d=null,b=!1;try{const e=await(await fetch("/api/v1/monitoring/stats")).json();e.success&&e.stats&&(d=e.stats,b=!0,x=e.stats)}catch{}if(!b){const e=await(await fetch("/api/v1/stats/containers")).json();if(e.success&&e.stats){d={};for(const a of e.stats)d[a.name]={name:a.name,current:{cpu:a.cpu,memory:{percent:a.memory.percent,usage:a.memory.used,limit:a.memory.limit,usageMB:Math.round(a.memory.used/1048576),limitMB:Math.round(a.memory.limit/1048576)},network:{rxBytes:a.network.rx,txBytes:a.network.tx,rxMB:(a.network.rx/1048576).toFixed(1),txMB:(a.network.tx/1048576).toFixed(1)},disk:{readMB:0,writeMB:0}},status:a.status};x=d}}if(!d||Object.keys(d).length===0){P.innerHTML='
';try{const e=await(await fetch(`/api/v1/monitoring/history/${encodeURIComponent(d)}?startTime=${y}&endTime=${b}`)).json();if(!e.success)throw new Error(e.error||"Failed to load history");const a=e.samples||[],o=e.tier||"raw";if(a.length===0){U.innerHTML=`
\u{1F4CA}No data for the last ${m}. Tier: ${g(o)}.
Service uptime tracking, SLA monitoring, and incident management.
Loading health status...
\u{1F6A8} Loading incidents...
\u2699\uFE0F Loading configuration...
\u{1F30D} Global Settings
Applies to all health checks. Settings are stored locally in this browser.
How often each service's health endpoint is checked.
How often container statistics (CPU/memory) are sampled.
Cap on stored history records per service.
Health history older than this is pruned.
Warn when disk usage exceeds this level.
Add Health Check
`);const f=document.getElementById("health-modal"),I=document.getElementById("health-check-btn"),A=document.getElementById("health-cancel"),E=document.getElementById("health-refresh-btn"),M=document.getElementById("health-status-container"),P=document.getElementById("health-incidents-container"),z=document.getElementById("health-config-container"),D=document.getElementById("health-last-update"),v=document.getElementById("health-add-btn"),B=document.getElementById("health-config-form"),x=document.getElementById("health-form-title"),$=document.getElementById("health-form-cancel"),k=document.getElementById("health-form-save"),T="dashcaddy-health-settings",S={retentionDays:30,pollingInterval:60,statsPollingInterval:30,maxEntriesPerService:500,diskUsageThreshold:80},L=document.getElementById("health-global-save"),j=document.getElementById("health-global-reset"),C=document.getElementById("health-global-status"),N=document.getElementById("health-setting-retention"),R=document.getElementById("health-setting-interval"),U=document.getElementById("health-setting-stats-interval"),u=document.getElementById("health-setting-max-entries"),m=document.getElementById("health-setting-disk-threshold");function h(){try{const i=safeGet(T),n=i?JSON.parse(i):{};return Object.assign({},S,n)}catch{return Object.assign({},S)}}function g(){const i=h();N&&(N.value=i.retentionDays),R&&(R.value=i.pollingInterval),U&&(U.value=i.statsPollingInterval),u&&(u.value=i.maxEntriesPerService),m&&(m.value=i.diskUsageThreshold)}function H(){const i={retentionDays:Math.max(1,Math.min(3650,parseInt(N?.value)||S.retentionDays)),pollingInterval:Math.max(5,Math.min(3600,parseInt(R?.value)||S.pollingInterval)),statsPollingInterval:Math.max(5,Math.min(3600,parseInt(U?.value)||S.statsPollingInterval)),maxEntriesPerService:Math.max(10,Math.min(1e5,parseInt(u?.value)||S.maxEntriesPerService)),diskUsageThreshold:Math.max(50,Math.min(99,parseInt(m?.value)||S.diskUsageThreshold))};try{safeSet(T,JSON.stringify(i)),g(),C&&(C.textContent="Saved \u2713",C.style.color="var(--ok-fg)",setTimeout(()=>{C&&(C.textContent="")},2500)),typeof showNotification=="function"&&showNotification("Global health settings saved","success")}catch(n){C&&(C.textContent="Save failed",C.style.color="var(--bad-fg)"),typeof showNotification=="function"&&showNotification("Failed to save settings: "+n.message,"error")}}function r(){try{safeSet(T,JSON.stringify(S))}catch{}g(),C&&(C.textContent="Reset to defaults \u2713",C.style.color="var(--ok-fg)",setTimeout(()=>{C&&(C.textContent="")},2500))}g(),L?.addEventListener("click",H),j?.addEventListener("click",r);let c=null;function d(i){return i>=99.9?"var(--ok-fg)":i>=95?"#f39c12":"var(--bad-fg)"}function b(i){const n={critical:"var(--bad-fg)",high:"#ff6b6b",medium:"#f39c12",low:"var(--muted)"};return`${i}`}async function y(){try{const n=await(await fetch("/api/v1/health-checks/status")).json();if(!n.success||!n.status||Object.keys(n.status).length===0){M.innerHTML='
\u{1F3E5}No health checks configured. Go to the Configure tab to add services.
';return}const s=Object.values(n.status);let l='
';l+='
',l+='
Service
Status
',l+='
Uptime 24h
Uptime 7d
',l+='
Avg Response
Last Check
';for(const p of s){const w=p.status==="up",O=w?"var(--dot-ok)":"var(--dot-bad)",_=p.uptime?.["24h"]??"-",F=p.uptime?.["7d"]??"-",q=p.avgResponseTime!=null?Math.round(p.avgResponseTime)+"ms":"-",J=p.timestamp?timeAgo(p.timestamp):"-";l+=`
';for(const _ of O){const F=_.status==="resolved",q=F&&_.duration?_.duration<6e4?Math.round(_.duration/1e3)+"s":Math.round(_.duration/6e4)+"m":"-";p+='
',p+=`
${escapeHtml(_.serviceId)}
`,p+=`
${escapeHtml(_.type)}
`,p+=`
${b(_.severity)}
`,p+=`
${_.status}
`,p+=`
${q}
`,p+=`
${timeAgo(_.createdAt)}
`,p+="
"}p+="
"}P.innerHTML=p||'
\u{1F6A8}No incidents recorded yet.
'}catch(i){P.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}async function e(){try{const n=await(await fetch("/api/v1/health-checks/status")).json(),s=n.success&&n.status?Object.values(n.status):[];if(s.length===0){z.innerHTML='
\u2699\uFE0FNo health checks configured yet. Click "Add Health Check" below.
';return}let l='
';l+='
Service
Status
SLA Target
Actions
';for(const p of s){const w=p.status==="up";l+='
',l+=`
${escapeHtml(p.name||p.serviceId)}
`,l+=`
${w?"Up":"Down"}
`,l+=`
${p.sla?.target?p.sla.target+"%":"-"}
`,l+='
',l+=``,l+=``,l+="
"}l+="
",z.innerHTML=l}catch(i){z.innerHTML=`
Failed: ${escapeHtml(i.message)}
`}}function a(i,n,s,l,p,w,O){c=i||null,x.textContent=i?"Edit Health Check":"Add Health Check",document.getElementById("health-form-id").value=i||"",document.getElementById("health-form-id").disabled=!!i,document.getElementById("health-form-name").value=n||"",document.getElementById("health-form-url").value=s||"",document.getElementById("health-form-timeout").value=l||1e4,document.getElementById("health-form-codes").value=p||"200",document.getElementById("health-form-sla").value=w||99.9,document.getElementById("health-form-slow").value=O||5e3,B.style.display="",v.style.display="none"}function o(){B.style.display="none",v.style.display="",c=null}v?.addEventListener("click",()=>a("","","",1e4,"200",99.9,5e3)),$?.addEventListener("click",o),k?.addEventListener("click",async()=>{const i=c||document.getElementById("health-form-id").value.trim();if(!i)return showNotification("Service ID is required","warning");const n=document.getElementById("health-form-url").value.trim();if(!n)return showNotification("URL is required","warning");const s=document.getElementById("health-form-codes").value.split(",").map(p=>parseInt(p.trim())).filter(Boolean),l={name:document.getElementById("health-form-name").value.trim()||i,url:n,timeout:parseInt(document.getElementById("health-form-timeout").value)||1e4,expectedStatusCodes:s.length?s:[200],sla:{target:parseFloat(document.getElementById("health-form-sla").value)||99.9},slowResponseThreshold:parseInt(document.getElementById("health-form-slow").value)||5e3};try{k.textContent="Saving...",k.disabled=!0;const w=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(i)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)})).json();if(!w.success)throw new Error(w.error||"Save failed");o(),e(),y()}catch(p){showNotification("Error: "+p.message,"error")}finally{k.textContent="Save",k.disabled=!1}}),document.addEventListener("health-edit",async i=>{const n=i.detail;a(n,"","",1e4,"200",99.9,5e3)}),document.addEventListener("health-delete",async i=>{const n=i.detail;if(confirm(`Delete health check for "${n}"?`))try{const l=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(n)}/configure`,{method:"DELETE"})).json();if(!l.success)throw new Error(l.error);e(),y()}catch(s){showNotification("Error: "+s.message,"error")}}),I?.addEventListener("click",()=>{f?.classList.add("show"),y()}),wireModal(f,A),E?.addEventListener("click",y),document.querySelector('[data-panel="health-incidents"]')?.addEventListener("click",t),document.querySelector('[data-panel="health-config"]')?.addEventListener("click",e)})(),(function(){injectModal("updates-modal",`
\u2B06\uFE0F Update Management
Check for container image updates, apply them, and manage rollbacks.
\u{1F4E6} Click "Check for Updates" to scan containers.
Loading update history...
\u{1F916} Loading auto-update configuration...
DashCaddy
Loading...
Update available
New version:
\u{1F4E6}No self-update history.
`);const f=document.getElementById("updates-modal"),I=document.getElementById("updates-btn"),A=document.getElementById("updates-cancel"),E=document.getElementById("updates-check-btn"),M=document.getElementById("updates-available-container"),P=document.getElementById("updates-history-container"),z=document.getElementById("updates-auto-container"),D=document.getElementById("updates-last-check");async function v(){try{const t=await(await fetch("/api/v1/updates/available")).json();if(!t.success)throw new Error(t.error);const e=t.updates||[];if(e.length===0){M.innerHTML='
';for(const n of e){const s=(()=>{const l=window.APPS||[];for(const p of l)if(p.containerId===n.containerId||p.name===n.containerName||p.id===n.containerName)return p.id;return n.containerName})();a+=`
`,a+=`
${escapeHtml(n.containerName)}
`,a+=`
${escapeHtml(n.imageName)}
`,a+=`
${escapeHtml(n.currentDigest)}
`,a+=`
${escapeHtml(n.latestDigest)}
`,a+='
',a+=``,a+=``,a+="
"}a+="
",M.innerHTML=a,D.textContent=e.length+" update(s) available";const o=document.getElementById("updates-count-badge"),i=document.getElementById("updates-update-all-btn");o&&(o.textContent=e.length+" pending",o.style.display=""),i&&e.length>0&&(i.style.display=""),window._pendingUpdates=e,M.querySelectorAll(".update-now-btn").forEach(n=>{n.addEventListener("click",async()=>{const s=n.dataset.id,l=n.dataset.name;if(confirm(`Update "${l}" to the latest version? The container will restart.`)){n.textContent="Updating...",n.disabled=!0;try{const w=await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(s)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json();if(w.success)n.textContent="Done!",n.style.background="var(--ok-fg)",setTimeout(()=>v(),2e3);else throw new Error(w.error||"Update failed")}catch(p){n.textContent="Failed",n.style.color="var(--bad-fg)",showNotification("Update error: "+p.message,"error"),setTimeout(()=>{n.textContent="Update",n.disabled=!1,n.style.color="",n.style.background=""},3e3)}}})}),M.querySelectorAll(".rollback-btn").forEach(n=>{n.addEventListener("click",async()=>{const s=n.dataset.id,l=n.dataset.name;if(confirm(`Rollback "${l}" to its previous version?`)){n.textContent="Rolling back...",n.disabled=!0;try{const w=await(await secureFetch(`/api/v1/updates/rollback/${encodeURIComponent(s)}`,{method:"POST"})).json();if(w.success)n.textContent="Rolled back!",setTimeout(()=>v(),2e3);else throw new Error(w.error||"Rollback failed")}catch(p){n.textContent="Failed",showNotification("Rollback error: "+p.message,"error"),setTimeout(()=>{n.textContent="Rollback",n.disabled=!1},3e3)}}})})}catch(y){M.innerHTML=`
Failed: ${escapeHtml(y.message)}
`}}async function B(){const y=window._pendingUpdates||[];if(!y.length)return;const t=document.getElementById("updates-update-all-btn");if(!confirm(`Update all ${y.length} containers? Each will restart.`))return;t.textContent="\u23F3 Updating...",t.disabled=!0;let e=0,a=0;for(const o of y)try{(await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(o.containerId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json()).success?e++:a++}catch{a++}t.textContent="\u2705 Done",showNotification(`Update all: ${e} succeeded, ${a} failed.`,e>0&&a===0?"success":"error"),setTimeout(()=>{t.textContent="\u2B06\uFE0F Update All",t.disabled=!1,v()},3e3)}document.getElementById("updates-update-all-btn")?.addEventListener("click",B);async function x(){E.textContent="\u{1F50D} Checking...",E.disabled=!0;try{const t=await(await secureFetch("/api/v1/updates/check",{method:"POST"})).json();if(!t.success)throw new Error(t.error);E.textContent="\u2705 Done!",await v()}catch(y){E.textContent="\u274C Failed",showNotification("Check error: "+y.message,"error")}setTimeout(()=>{E.textContent="\u{1F50D} Check for Updates",E.disabled=!1},3e3)}async function $(){try{P.innerHTML='
Auto-updates run during maintenance window (default 2AM-4AM). Daily = every day, Weekly = Sundays, Monthly = 1st of month.
';n+='
',n+='
Container
Schedule
Window
Rollback
Last Run
Actions
';for(const s of o){const l=s.name||s.Names?.[0]?.replace(/^\//,"")||s.Id?.substring(0,12),p=s.containerId||s.Id,w=i[p]||{},O=w.enabled?w.schedule||"weekly":"",_=w.autoRollback!==!1,F=w.maintenanceWindow||"",q=w.lastAutoUpdate?timeAgo(w.lastAutoUpdate):"Never";n+=`
`}}const T=document.getElementById("dashcaddy-current-version"),S=document.getElementById("dashcaddy-update-badge"),L=document.getElementById("dashcaddy-update-details"),j=document.getElementById("dashcaddy-new-version"),C=document.getElementById("dashcaddy-changelog"),N=document.getElementById("dashcaddy-apply-btn"),R=document.getElementById("dashcaddy-check-btn"),U=document.getElementById("dashcaddy-rollback-btn"),u=document.getElementById("dashcaddy-status-bar"),m=document.getElementById("dashcaddy-history-container");let h=null;function g(y,t){u&&(u.style.display="block",u.style.background=t==="error"?"var(--bad-bg)":t==="success"?"var(--ok-bg)":"var(--bg)",u.style.color=t==="error"?"var(--bad-fg)":t==="success"?"var(--ok-fg)":"var(--fg)",u.textContent=y)}async function H(){try{const t=await(await fetch("/api/v1/system/version")).json();if(t.success){const e=t.commit&&t.commit!=="unknown"?t.commit:null;T.textContent="v"+t.version+(e?" ("+e.substring(0,7)+")":"")}}catch{T.textContent="Unable to fetch version"}}async function r(y){y||(R.textContent="Checking...",R.disabled=!0);try{const e=await(await fetch("/api/v1/system/update-check")).json();if(h=e,e.success&&e.available&&e.remote){S.style.display="",L.style.display="",j.textContent="v"+e.remote.version,C.textContent=e.remote.changelog||"No changelog available.";const a=document.getElementById("updates-btn");if(a&&!a.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:var(--accent);",a.style.position="relative",a.appendChild(i)}const o=document.getElementById("updates-dashcaddy-tab");if(o&&!o.querySelector(".update-dot")){const i=document.createElement("span");i.className="update-dot",i.style.cssText="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:4px;vertical-align:middle;",o.appendChild(i)}}else S.style.display="none",L.style.display="none",await H(),y||g("You are running the latest version.","success");y||(R.textContent="Check for Updates",R.disabled=!1)}catch(t){y||(g("Failed to check: "+t.message,"error"),R.textContent="Check for Updates",R.disabled=!1)}}async function c(){if(!confirm("Apply DashCaddy update? The API container will restart."))return!1;N.textContent="Updating...",N.disabled=!0,g("Downloading and applying update...","info");try{const t=await(await secureFetch("/api/v1/system/update-apply",{method:"POST"})).json();if(t.success)return g("Update initiated: v"+(t.fromVersion||"?")+" \u2192 v"+(t.toVersion||"?")+". The container will restart shortly.","success"),N.textContent="Applied!",document.querySelectorAll(".update-dot").forEach(e=>e.remove()),!0;throw new Error(t.error||"Update failed")}catch(y){throw g("Update failed: "+y.message,"error"),N.textContent="Update Now",N.disabled=!1,y}}async function d(){try{const t=await(await fetch("/api/v1/system/update-history")).json(),e=t.success&&t.history?t.history:[];if(e.length===0){m.innerHTML='
\u{1F4E6}No self-update history.
';return}let a='
';a+='
When
Version
From
Status
';for(const o of e){const i=o.status==="success"?"\u2713 success":o.status==="pending"?"\u23F3 pending":o.status==="partial"?"\u26A0 partial":"\u2717 "+o.status,n=o.status==="success"?"var(--ok-fg)":o.status==="pending"?"var(--muted)":"var(--bad-fg)";a+='
"}}async function b(){try{const t=await(await fetch("/api/v1/system/rollback-versions")).json(),e=t.success&&t.versions?t.versions:[];if(e.length===0){showNotification("No rollback versions available.","info");return}const a=prompt(`Available rollback versions:
`+e.join(`
`)+`
Enter version to rollback to:`);if(!a)return;if(!e.includes(a)){showNotification("Invalid version: "+a,"error");return}if(!confirm("Rollback DashCaddy to v"+a+"? The container will restart."))return;g("Rolling back to v"+a+"...","info");const i=await(await secureFetch("/api/v1/system/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({version:a})})).json();if(i.success)g("Rollback to v"+a+" initiated. Container will restart.","success");else throw new Error(i.error||"Rollback failed")}catch(y){g("Rollback failed: "+y.message,"error")}}R?.addEventListener("click",()=>r(!1)),N?.addEventListener("click",()=>c().catch(()=>{})),U?.addEventListener("click",b),E?.addEventListener("click",x),I?.addEventListener("click",()=>{f?.classList.add("show"),v()}),wireModal(f,A),window.openUpdateModal=function(y){f?.classList.add("show"),v().then(()=>{if(!y)return;const t=M.querySelector(`[data-app-id="${y}"]`);t&&(t.scrollIntoView({behavior:"smooth",block:"center"}),t.style.background="rgba(249,115,22,0.15)",setTimeout(()=>{t.style.background=""},3e3))})},document.querySelector('[data-panel="updates-history"]')?.addEventListener("click",$),document.querySelector('[data-panel="updates-auto"]')?.addEventListener("click",k),document.querySelector('[data-panel="updates-dashcaddy"]')?.addEventListener("click",()=>{H(),d(),h||r(!0)}),window.dcApplyUpdate=c,window.dcCheckForUpdate=r,setTimeout(()=>r(!0),5e3)})(),(function(){injectModal("docker-resources-modal",`
",D.innerHTML=x,D.querySelectorAll(".dr-vol-del").forEach($=>{$.addEventListener("click",async()=>{if(confirm(`Delete volume "${$.dataset.name}"? Data will be lost.`)){$.textContent="...",$.disabled=!0;try{await deleteAPI(`/api/v1/docker/volumes/${encodeURIComponent($.dataset.name)}?force=true`),M()}catch(k){showNotification("Delete failed: "+k.message,"error"),$.textContent="Delete",$.disabled=!1}}})})}catch(v){D.innerHTML=`
Failed: ${escapeHtml(v.message)}
`}}document.getElementById("dr-vol-create")?.addEventListener("click",async()=>{const D=document.getElementById("dr-vol-name"),v=D.value.trim();if(!v){showNotification("Enter a volume name","warning");return}try{await postJSON("/api/v1/docker/volumes",{name:v}),D.value="",showNotification(`Volume "${v}" created`,"success"),M()}catch(B){showNotification("Create failed: "+B.message,"error")}});async function P(){const D=document.getElementById("dr-net-list");try{const B=(await getJSON("/api/v1/docker/networks")).networks||[];if(B.length===0){D.innerHTML='
\u{1F310}No networks found.
';return}let x='
';x+='
Name
Driver
Scope
Containers
Actions
';for(const $ of B){const k=["bridge","host","none"].includes($.name);x+='
';for(const x of v.results){const $=x.status==="deployed"||x.status==="created"?"\u2705":x.status==="exists"?"\u26A1":x.status==="skipped"?"\u23ED":"\u274C";B+='
`}}I?.addEventListener("click",()=>{f?.classList.add("show"),x(!1)}),wireModal(f,A),E?.addEventListener("click",()=>x(!1)),P?.addEventListener("change",()=>x(!1)),D?.addEventListener("click",()=>x(!0)),M?.addEventListener("click",async()=>{if(confirm("Clear the entire audit log? This cannot be undone."))try{const k=await(await secureFetch("/api/v1/audit-logs",{method:"DELETE"})).json();k.success?x(!1):showNotification("Error: "+(k.error||"Clear failed"),"error")}catch($){showNotification("Error: "+$.message,"error")}})})(),(function(){injectModal("security-modal",`
\u{1F6E1}\uFE0F Security Center
Live events from API, Caddy, fail2ban & shared_bans. Live-tail via SSE.
`}async function u(){try{const c=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[],d=L.value;L.innerHTML=''+c.map(b=>``).join(""),d&&(L.value=d)}catch{}}document.getElementById("sec-host-register-btn").addEventListener("click",h),document.getElementById("sec-hosts-refresh").addEventListener("click",m);async function m(){try{const c=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[];z=c;const d=document.getElementById("sec-hosts-container");if(!c.length){d.innerHTML='
No hosts registered. Click \u2795 Register Host to add one.
id: ${g(b.id)} \xB7
registered ${new Date(b.registered_at).toLocaleDateString()} \xB7
last seen ${b.last_seen_at?new Date(b.last_seen_at).toLocaleString():"never"}
${y}
${b.id==="self"?"":``}
`}).join(""),d.querySelectorAll(".sec-host-del").forEach(b=>{b.addEventListener("click",async()=>{confirm(`Remove host ${b.dataset.id}? Events already received will remain in the store.`)&&(await fetch(`/api/v1/security/hosts/${encodeURIComponent(b.dataset.id)}`,{method:"DELETE"}),m())})})}catch(r){document.getElementById("sec-hosts-container").innerHTML='
Load failed: '+g(r.message)+"
"}}async function h(){const r=prompt("Host id (lowercase, no spaces):");if(!r)return;const c=prompt("Display label:",r)||r,d=prompt('Type ("dashcaddy", "service", or "agent"):',"agent")||"agent";try{const b=await fetch("/api/v1/security/hosts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:r,label:c,type:d})}),y=await b.json();if(!b.ok){alert("Failed: "+(y?.error?.message||b.statusText));return}alert(`\u2705 Host registered!
id: ${y.data.host.id}
label: ${y.data.host.label}
type: ${y.data.host.type}
\u{1F511} API KEY (save this NOW \u2014 won't be shown again):
${y.data.api_key}
Send this key as: Authorization: Bearer
To endpoint: POST /api/v1/security/events/ingest or /events/batch`),m()}catch(b){alert("Failed: "+b.message)}}function g(r){return String(r).replace(/[&<>"']/g,c=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[c])}function H(r,c){let d;return function(){clearTimeout(d),d=setTimeout(()=>r.apply(this,arguments),c)}}})(),(function(){const f=new ErrorHandler;injectModal("weather-modal",`
Weather Settings
Enter a city name, postal code, or “City, Country”
`);const I="weather-location",A="weather-zip",E="weather-geo",M="weather-unit";!safeGet(I)&&safeGet(A)&&safeSet(I,safeGet(A));function P(){return safeGet(M)||"imperial"}function z(){return{icon:document.querySelector(".weather-icon"),temp:document.querySelector(".weather-temp"),condition:document.querySelector(".weather-condition"),location:document.querySelector(".weather-location"),wind:document.querySelector(".weather-wind")}}const D={0:"Clear sky",1:"Mainly clear",2:"Partly cloudy",3:"Overcast",45:"Fog",48:"Rime fog",51:"Light drizzle",53:"Drizzle",55:"Dense drizzle",56:"Freezing drizzle",57:"Dense freezing drizzle",61:"Light rain",63:"Moderate rain",65:"Heavy rain",66:"Light freezing rain",67:"Heavy freezing rain",71:"Light snow",73:"Moderate snow",75:"Heavy snow",77:"Snow grains",80:"Light showers",81:"Moderate showers",82:"Violent showers",85:"Light snow showers",86:"Heavy snow showers",95:"Thunderstorm",96:"Thunderstorm with hail",99:"Severe thunderstorm"},v={0:"\u2600\uFE0F",1:"\u{1F324}\uFE0F",2:"\u26C5",3:"\u2601\uFE0F",45:"\u{1F32B}\uFE0F",48:"\u{1F32B}\uFE0F",51:"\u{1F326}\uFE0F",53:"\u{1F326}\uFE0F",55:"\u{1F326}\uFE0F",56:"\u{1F328}\uFE0F",57:"\u{1F328}\uFE0F",61:"\u{1F326}\uFE0F",63:"\u{1F327}\uFE0F",65:"\u{1F327}\uFE0F",66:"\u{1F328}\uFE0F",67:"\u{1F328}\uFE0F",71:"\u{1F328}\uFE0F",73:"\u2744\uFE0F",75:"\u2744\uFE0F",77:"\u2744\uFE0F",80:"\u{1F326}\uFE0F",81:"\u{1F327}\uFE0F",82:"\u{1F327}\uFE0F",85:"\u{1F328}\uFE0F",86:"\u2744\uFE0F",95:"\u26C8\uFE0F",96:"\u26C8\uFE0F",99:"\u26C8\uFE0F"},B=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];function x(C){return B[Math.round(C/22.5)%16]}async function $(C){const N=safeGet(E);if(N)try{const h=JSON.parse(N);if(h.query===C)return h}catch{}const R=await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(C)}&count=1&language=en&format=json`);if(!R.ok)throw new Error("Geocoding failed");const U=await R.json();if(!U.results||!U.results.length)throw new Error("Location not found");const u=U.results[0],m={query:C,lat:u.latitude,lon:u.longitude,city:u.name,state:u.admin1||"",country:u.country||"",countryCode:u.country_code||""};return safeSet(E,JSON.stringify(m)),m}function k(C){return C.countryCode==="US"&&C.state?`${C.city}, ${C.state}`:C.country?`${C.city}, ${C.country}`:C.city}async function T(C){try{const N=await $(C),R=P(),U=R==="metric"?"celsius":"fahrenheit",u=R==="metric"?"kmh":"mph",m=`https://api.open-meteo.com/v1/forecast?latitude=${N.lat}&longitude=${N.lon}¤t=temperature_2m,weather_code,wind_speed_10m,wind_direction_10m&temperature_unit=${U}&wind_speed_unit=${u}`,h=await fetch(m);if(!h.ok)throw new Error("Weather fetch failed");const H=(await h.json()).current,r=H.weather_code;return{temp:Math.round(H.temperature_2m),condition:D[r]||"Unknown",icon:v[r]||"\u{1F324}\uFE0F",locationStr:k(N),windSpeed:Math.round(H.wind_speed_10m),windDir:x(H.wind_direction_10m),unit:R}}catch(N){return console.warn("Weather fetch failed:",N),null}}async function S(){const C=z();if(!C.icon||!C.temp||!C.condition||!C.location||!C.wind){console.warn("Weather widget elements not found");return}const N=safeGet(I);if(!N){C.location.textContent="Set Location",C.temp.textContent="--\xB0",C.condition.textContent="Click \u2699\uFE0F to configure",C.wind.textContent="--",C.icon.innerHTML='\u{1F324}\uFE0F';return}try{const R=await T(N);if(R){const U=R.unit==="metric"?"\xB0C":"\xB0F",u=R.unit==="metric"?"km/h":"mph";C.location.textContent=R.locationStr,C.temp.textContent=`${R.temp}${U}`,C.condition.textContent=R.condition,C.wind.textContent=`Wind: ${R.windSpeed} ${u} ${R.windDir}`,C.icon.innerHTML=`${escapeHtml(R.icon)}`}}catch(R){f.logError("[Weather] Update Error",R,{function:"updateWeather"}),C.location.textContent="Weather Error",C.temp.textContent="Error",C.condition.textContent="Failed to load",C.wind.textContent="--"}}const L=document.getElementById("weather-modal"),j=document.getElementById("weather-location-input");document.getElementById("weather-settings")?.addEventListener("click",()=>{j.value=safeGet(I)||"";const C=P(),N=L.querySelector(`input[name="weather-unit-radio"][value="${C}"]`);N&&(N.checked=!0),L.classList.add("show"),j.focus()}),document.getElementById("weather-cancel")?.addEventListener("click",()=>{L.classList.remove("show")}),document.getElementById("weather-save")?.addEventListener("click",()=>{const C=j.value.trim();if(C){safeGet(I)!==C&&safeSet(E,""),safeSet(I,C);const R=L.querySelector('input[name="weather-unit-radio"]:checked'),U=R?R.value:"imperial",u=P();safeSet(M,U),u!==U&&safeSet(E,""),L.classList.remove("show"),S()}else showNotification("Please enter a location (e.g., Hamburg, London, 90210)","warning")}),wireModal(L),document.addEventListener("keydown",C=>{C.key==="Escape"&&L.classList.contains("show")&&L.classList.remove("show")}),S(),setInterval(S,DC.POLL.WEATHER)})(),(function(){const f=document.getElementById("clock-widget"),I=document.getElementById("clock-render");if(!f||!I)return;const A=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],E=["January","February","March","April","May","June","July","August","September","October","November","December"],M=["XII","I","II","III","IV","V","VI","VII","VIII","IX","X","XI"];let P=safeGet("clock-style")||"default",z=-1,D=!1,v="",B="",x=null,$=null;function k(t){if(D||safeGet("clock-chimes")!=="true")return;D=!0;const e=parseInt(safeGet("clock-chime-volume")||"50",10)/100;let a=0;function o(){if(a>=t){D=!1;return}const i=new Audio("/assets/sounds/church-bell.mp3");i.volume=e,i.play().catch(()=>{}),a++,a{D=!1},2500)}o()}function T(t){return A[t.getDay()]+", "+E[t.getMonth()]+" "+t.getDate()+", "+t.getFullYear()}function S(){B="",x=null}function L(){return B!=="digital"&&(I.innerHTML='
`).join("")}async function C(){try{const g=await(await fetch("/api/v1/license/status")).json();g.success&&(j(g.license),U(g.license))}catch(h){console.warn("Failed to load license status:",h.message)}}async function N(){const h=I.value.trim();if(!h){S("Please enter a license code.");return}T(),A.disabled=!0,A.textContent="Activating...";try{const H=await(await secureFetch("/api/v1/license/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:h})})).json();H.success?(L(H.message),I.value="",j(H.license),showNotification("License activated! Premium features unlocked.","success",5e3),U(H.license)):S(H.error||"Activation failed")}catch(g){S("Network error: "+g.message)}finally{A.disabled=!1,A.textContent="Activate"}}async function R(){if(confirm("Deactivate your license? You can reuse the code on another machine.")){E.disabled=!0,E.textContent="Deactivating...";try{const g=await(await secureFetch("/api/v1/license/deactivate",{method:"POST"})).json();g.success?(L(g.message),await C(),showNotification("License deactivated.","info",3e3),U({active:!1})):S(g.error||"Deactivation failed")}catch(h){S("Network error: "+h.message)}finally{E.disabled=!1,E.textContent="Deactivate"}}}function U(h){const g=document.getElementById("license-status-topbar"),H=document.getElementById("license-topbar-icon"),r=document.getElementById("license-topbar-text"),c=document.getElementById("license-topbar-time");if(g)if(g.className="license-status-topbar "+(h.active?"premium":"free"),h.active)if(H.textContent="\u2605",r.textContent="PREMIUM",h.lifetime)c.textContent="\xB7 LIFETIME";else{const d=h.daysRemaining;c.textContent=d!=null?"\xB7 "+d+"d remaining":""}else H.textContent="\u2606",r.textContent=h.expired?"EXPIRED":"FREE TIER",c.textContent=""}function u(){T(),C(),f.classList.add("show")}I.addEventListener("input",function(){let h=this.value.toUpperCase().replace(/[^A-Z0-9-]/g,"");if(h.length>this._prevLength&&(h=h.replace(/-/g,""),h.length>2&&!h.startsWith("DC")&&(h="DC"+h),h.startsWith("DC")&&h.length>2)){const g=["DC"],H=h.substring(2);for(let r=0;r{h.key==="Enter"&&N()}),wireModal(f,document.getElementById("license-cancel"));const m=document.getElementById("license-status-topbar");m&&m.addEventListener("click",()=>window.openLicenseModal&&window.openLicenseModal()),window.openLicenseModal=u,window.checkPremiumFeature=async function(h){try{return(await(await fetch(`/api/v1/license/feature/${h}`)).json()).available}catch{return!1}},C().then(h=>{k&&U(k)})})(),(function(){"use strict";if(window.__dc_058_share_modal_loaded)return;window.__dc_058_share_modal_loaded=!0;const f=[{ms:3600*1e3,label:"1 hour"},{ms:1440*60*1e3,label:"24 hours"},{ms:10080*60*1e3,label:"7 days"}];injectModal("share-modal",`
Share \u2026
Create a public link or Tailscale invite so someone outside your network can access this service.
A single-use Tailscale pre-auth key is generated and emailed. The device joins your tailnet and is routed to this service via Caddy.
`}).join(""),B.querySelectorAll(".share-revoke").forEach(i=>{i.addEventListener("click",()=>r(i.dataset.shareId))})}catch{B.innerHTML='Could not load outstanding shares.'}}async function r(t){try{const e=await fetch(`/api/v1/share/${encodeURIComponent(t)}`,{method:"DELETE",credentials:"same-origin"});if(!e.ok){const a=await e.json().catch(()=>({}));N(a&&a.error||`Revoke failed (HTTP ${e.status}).`);return}R("Share revoked."),H()}catch{N("Network error while revoking.")}}async function c(){if(!L)return;C(),$.disabled=!0;const t=$.textContent;$.textContent="Creating\u2026";try{const e=parseInt(S.value,10),a=await fetch("/api/v1/share",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:L.id,ttlMs:e})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){b(a.status,o);return}const i=o.data.urlPath;M.value=u(i),z.textContent=`Public link \xB7 expires ${m(o.data.expiresAt)}`,E.style.display="block",R("Share link created."),H()}catch{N("Network error while creating share.")}finally{$.disabled=!1,$.textContent=t}}async function d(){if(!L)return;const t=(T.value||"").trim();if(!t||!t.includes("@")){N("A valid recipient email is required.");return}C(),k.disabled=!0;const e=k.textContent;k.textContent="Creating\u2026";try{const a=await fetch("/api/v1/share/tailscale",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:L.id,email:t})}),o=await a.json().catch(()=>({}));if(!a.ok||!o.success){b(a.status,o);return}const i=o.data&&o.data.urlPath;i?(M.value=u(i),z.textContent=`Tailscale invite \xB7 emailed to ${t} (or use this URL manually if delivery failed).`):(M.value="",z.textContent=`Tailscale invite sent to ${t}.`),E.style.display="block",R("Tailscale invite created."),T.value="",H()}catch{N("Network error while creating Tailscale invite.")}finally{k.disabled=!1,k.textContent=e}}function b(t,e){const a=e&&e.error||"";if(t===402){N("Share is a Pro feature. Activate a license to unlock.");return}if(t===400&&/tailscale/i.test(a)){N("Tailscale is not configured on this host. Set up Tailscale in the dashboard first.");return}if(t===403){N("You do not have permission to share services.");return}if(t===404){N("Service not found. It may have been deleted.");return}N(a||`Request failed (HTTP ${t}).`)}function y(t){!t||!t.id||(L={id:t.id,name:t.name||t.id},A.textContent=L.name,C(),g("public"),T.value="",S.value=String(f[1].ms),I.classList.add("show"),H())}I.querySelectorAll(".share-tab").forEach(t=>{t.addEventListener("click",()=>g(t.dataset.tab))}),$.addEventListener("click",c),k.addEventListener("click",d),x.addEventListener("click",()=>I.classList.remove("show")),wireModal(I,x),P.addEventListener("click",async()=>{const t=M.value;if(t)try{navigator.clipboard&&navigator.clipboard.writeText?await navigator.clipboard.writeText(t):(M.select(),document.execCommand("copy"));const e=P.textContent;P.textContent="Copied!",setTimeout(()=>{P.textContent=e},1200)}catch{N("Could not copy to clipboard. Select the URL manually.")}}),window.openShareModal=y})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gTG9nbyBDdXN0b21pemF0aW9uIFN5c3RlbVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbG9nby1tb2RhbCcsIGA8ZGl2IGlkPVwibG9nby1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDAwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+RGFzaGJvYXJkIFNldHRpbmdzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBDdXN0b21pemUgeW91ciBkYXNoYm9hcmQncyBhcHBlYXJhbmNlIGFuZCBzeXN0ZW0gcHJlZmVyZW5jZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGFzaGJvYXJkLXRpdGxlXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5EYXNoYm9hcmQgVGl0bGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkYXNoYm9hcmQtdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeVwiIG1heGxlbmd0aD1cIjUwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5TaG93biBpbiBicm93c2VyIHRhYiBhbmQgaGVhZGVyIChtYXggNTAgY2hhcmFjdGVycyk8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5Mb2dvOjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+U2VwYXJhdGUgbG9nb3MgZm9yIGRhcmsgYW5kIGxpZ2h0IHRoZW1lcywgb3IgdXNlIHRoZSBzYW1lIGZvciBib3RoLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogIzFhMWEyZTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhcmsgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjOWFhNmJmOyBtYXJnaW4tdG9wOiA2cHg7XCI+RGFyayB0aGVtZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogI2YwZjBmMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiTGlnaHQgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjNWY2YjdhOyBtYXJnaW4tdG9wOiA2cHg7XCI+TGlnaHQgdGhlbWVzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgaWQ9XCJsb2dvLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+VXNpbmcgZGVmYXVsdCBsb2dvczwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODJyZW07IGN1cnNvcjogcG9pbnRlcjsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibG9nby1zYW1lLWJvdGhcIiAvPiBVc2Ugc2FtZSBsb2dvIGZvciBib3RoXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tZHVhbC11cGxvYWRzXCIgY2xhc3M9XCJtYi0xNlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQtZGFya1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+RGFyayB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1kYXJrXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLWxpZ2h0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5MaWdodCB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1saWdodFwiIGFjY2VwdD1cImltYWdlLypcIiBjbGFzcz1cImlucHV0LWNhcmQtYWx0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tc2luZ2xlLXVwbG9hZFwiIGNsYXNzPVwibWItMTZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC1zaW5nbGVcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlVwbG9hZCBsb2dvOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQtc2luZ2xlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiAvPlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlRoaXMgbG9nbyB3aWxsIGJlIHVzZWQgb24gYWxsIHRoZW1lczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDtcIj5Mb2dvIFBvc2l0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJsb2dvLXBvc2l0aW9uLWJ0bnNcIiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcG9zPVwibGVmdFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5MZWZ0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJjZW50ZXJcIiBjbGFzcz1cImxvZ28tcG9zLWJ0biBidG4tb3B0aW9uXCI+Q2VudGVyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJyaWdodFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5SaWdodDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aHIgY2xhc3M9XCJoci1kaXZpZGVyXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPkZhdmljb24gKEJyb3dzZXIgVGFiIEljb24pOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJmYXZpY29uLXByZXZpZXctY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTtcIj5cbiAgICAgICAgICA8aW1nIGlkPVwiZmF2aWNvbi1wcmV2aWV3XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktZmF2aWNvbi5pY29cIiBhbHQ9XCJDdXJyZW50IGZhdmljb25cIiBzdHlsZT1cIndpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7IGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1wiIG9uZXJyb3I9XCJ0aGlzLnNyYz0nZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9JTIyaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjIgdmlld0JveD0lMjIwIDAgMzIgMzIlMjI+PHJlY3QgZmlsbD0lMjIlMjM2NjclMjIgd2lkdGg9JTIyMzIlMjIgaGVpZ2h0PSUyMjMyJTIyIHJ4PSUyMjQlMjIvPjwvc3ZnPidcIiAvPlxuICAgICAgICAgIDxzcGFuIGlkPVwiZmF2aWNvbi1zdGF0dXNcIiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlVzaW5nIERhc2hDYWRkeSBmYXZpY29uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJmYXZpY29uLXVwbG9hZFwiIGFjY2VwdD1cImltYWdlL3BuZyxpbWFnZS9zdmcreG1sXCIgY2xhc3M9XCJpbnB1dC1jYXJkLWFsdFwiIC8+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+VXBsb2FkIFBORyBvciBTVkcgLSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBJQ088L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwic2V0dGluZ3MtdGltZXpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPlRpbWV6b25lOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzZXR0aW5ncy10aW1lem9uZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAxcmVtO1wiPlxuICAgICAgICAgIDwhLS0gUG9wdWxhdGVkIGJ5IEpTIHdpdGggSUFOQSB0aW1lem9uZXMgLS0+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlVzZWQgYnkgYWxsIGRlcGxveWVkIGNvbnRhaW5lcnMuIENoYW5nZXMgYXBwbHkgdG8gbmV3IGRlcGxveW1lbnRzLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLXJlc2V0XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2VmNDQ0NCAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiAjZWY0NDQ0OyBjb2xvcjogI2VmNDQ0NDtcIj5SZXNldCB0byBEZWZhdWx0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibG9nby1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IGxvZ29Nb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLW1vZGFsJyk7XG4gIGNvbnN0IHByZXZpZXdEYXJrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tcHJldmlldy1kYXJrJyk7XG4gIGNvbnN0IHByZXZpZXdMaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXByZXZpZXctbGlnaHQnKTtcbiAgY29uc3QgbG9nb1N0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXN0YXR1cycpO1xuICBjb25zdCBzYW1lQm90aENoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2FtZS1ib3RoJyk7XG4gIGNvbnN0IGR1YWxVcGxvYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tZHVhbC11cGxvYWRzJyk7XG4gIGNvbnN0IHNpbmdsZVVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNpbmdsZS11cGxvYWQnKTtcbiAgY29uc3QgdXBsb2FkRGFyayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1kYXJrJyk7XG4gIGNvbnN0IHVwbG9hZExpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tdXBsb2FkLWxpZ2h0Jyk7XG4gIGNvbnN0IHVwbG9hZFNpbmdsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1zaW5nbGUnKTtcbiAgY29uc3QgYnJhbmRMb2dvRGFyayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNicmFuZCAuYnJhbmQtbG9nby1kYXJrJyk7XG4gIGNvbnN0IGJyYW5kTG9nb0xpZ2h0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JyYW5kIC5icmFuZC1sb2dvLWxpZ2h0Jyk7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3Atcm93Jyk7XG4gIGNvbnN0IGRhc2hib2FyZFRpdGxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkLXRpdGxlJyk7XG4gIGNvbnN0IERFRkFVTFRfVElUTEUgPSBEQy5OQU1FO1xuXG4gIGxldCBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICBsZXQgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gIGxldCBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gIGxldCBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gIGxldCBjdXJyZW50VGl0bGUgPSBERUZBVUxUX1RJVExFO1xuXG4gIC8vIFRvZ2dsZSBiZXR3ZWVuIGR1YWwgYW5kIHNpbmdsZSB1cGxvYWQgbW9kZVxuICBzYW1lQm90aENoZWNrYm94Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNhbWVCb3RoQ2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHNpbmdsZVVwbG9hZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBDbGVhciBpbmRpdmlkdWFsIHBlbmRpbmcgZGF0YVxuICAgICAgcGVuZGluZ0RhcmtEYXRhID0gbnVsbDtcbiAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkdWFsVXBsb2Fkcy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgc2luZ2xlVXBsb2FkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWFkIGZpbGUgYXMgZGF0YSBVUkwgaGVscGVyXG4gIGZ1bmN0aW9uIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFmaWxlIHx8ICFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBzZWxlY3QgYW4gaW1hZ2UgZmlsZScsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiBjYWxsYmFjayhlLnRhcmdldC5yZXN1bHQpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgLy8gVXBsb2FkIGhhbmRsZXJzXG4gIHVwbG9hZERhcms/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nRGFya0RhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnTmV3IGRhcmsgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkTGlnaHQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nTGlnaHREYXRhID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbGlnaHQgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkU2luZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIHJlYWRGaWxlQXNEYXRhVVJMKGUudGFyZ2V0LmZpbGVzWzBdLCAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZ1NpbmdsZURhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbG9nbyByZWFkeSB0byBzYXZlIChib3RoIHRoZW1lcyknO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBcHBseSBsb2dvIHBvc2l0aW9uXG4gIGZ1bmN0aW9uIGFwcGx5TG9nb1Bvc2l0aW9uKHBvcykge1xuICAgIHRvcFJvdy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9nby1wb3MnLCBwb3MpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3ZhcigtLWFjY2VudCknIDogJ3ZhcigtLWNhcmQtYmcpJztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3doaXRlJyA6ICd2YXIoLS1mZyknO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQXBwbHkgZGFzaGJvYXJkIHRpdGxlXG4gIGZ1bmN0aW9uIGFwcGx5RGFzaGJvYXJkVGl0bGUodGl0bGUpIHtcbiAgICBjdXJyZW50VGl0bGUgPSB0aXRsZSB8fCBERUZBVUxUX1RJVExFO1xuICAgIGRvY3VtZW50LnRpdGxlID0gY3VycmVudFRpdGxlO1xuICAgIGNvbnN0IGhlYWRlclRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRhc2hib2FyZC10aXRsZScpO1xuICAgIGlmIChoZWFkZXJUaXRsZSkgaGVhZGVyVGl0bGUudGV4dENvbnRlbnQgPSBjdXJyZW50VGl0bGU7XG4gIH1cblxuICAvLyBMb2FkIGN1c3RvbSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlIG9uIHN0YXJ0dXBcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEN1c3RvbUxvZ28oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbG9nbycpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIEFwcGx5IGRhcmsvbGlnaHQgdmFyaWFudHNcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tTG9nb0RhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nb0Rhcms7XG4gICAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YS5jdXN0b21Mb2dvRGFyaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5jdXN0b21Mb2dvTGlnaHQpIHtcbiAgICAgICAgICBicmFuZExvZ29MaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ29MaWdodDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvTGlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGVnYWN5IHNpbmdsZS1sb2dvIGZhbGxiYWNrXG4gICAgICAgIGlmICghZGF0YS5jdXN0b21Mb2dvRGFyayAmJiAhZGF0YS5jdXN0b21Mb2dvTGlnaHQgJiYgZGF0YS5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSBkYXRhLmN1c3RvbUxvZ287XG4gICAgICAgICAgYnJhbmRMb2dvTGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nbztcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YS5pc0RlZmF1bHQpIHtcbiAgICAgICAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBsb2dvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgYXBwbHlMb2dvUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZGFzaGJvYXJkVGl0bGUpIHtcbiAgICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKGRhdGEuZGFzaGJvYXJkVGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGxvYWQgY3VzdG9tIGxvZ286JywgZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9zaXRpb24gYnV0dG9uIGhhbmRsZXJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY3VycmVudFBvc2l0aW9uID0gYnRuLmRhdGFzZXQucG9zO1xuICAgICAgYXBwbHlMb2dvUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gT3BlbiBsb2dvIG1vZGFsIG9uIGJyYW5kIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmFuZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgICBpZiAodXBsb2FkRGFyaykgdXBsb2FkRGFyay52YWx1ZSA9ICcnO1xuICAgIGlmICh1cGxvYWRMaWdodCkgdXBsb2FkTGlnaHQudmFsdWUgPSAnJztcbiAgICBpZiAodXBsb2FkU2luZ2xlKSB1cGxvYWRTaW5nbGUudmFsdWUgPSAnJztcbiAgICAvLyBSZXNldCBjaGVja2JveCB0byBkdWFsIG1vZGVcbiAgICBpZiAoc2FtZUJvdGhDaGVja2JveCkgc2FtZUJvdGhDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBzaW5nbGVVcGxvYWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBwcmV2aWV3cyB0byBjdXJyZW50IGhlYWRlciBsb2dvc1xuICAgIHByZXZpZXdEYXJrLnNyYyA9IGJyYW5kTG9nb0Rhcmsuc3JjO1xuICAgIHByZXZpZXdMaWdodC5zcmMgPSBicmFuZExvZ29MaWdodC5zcmM7XG4gICAgY29uc3QgaXNDdXN0b20gPSBicmFuZExvZ29EYXJrLnNyYy5pbmNsdWRlcygnY3VzdG9tLWxvZ28nKSB8fCBicmFuZExvZ29MaWdodC5zcmMuaW5jbHVkZXMoJ2N1c3RvbS1sb2dvJyk7XG4gICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9IGlzQ3VzdG9tID8gJ1VzaW5nIGN1c3RvbSBsb2dvJyA6ICdVc2luZyBkZWZhdWx0IGxvZ29zJztcbiAgICBhcHBseUxvZ29Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgbG9nb01vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gU2F2ZSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld1RpdGxlID0gZGFzaGJvYXJkVGl0bGVJbnB1dC52YWx1ZS50cmltKCkgfHwgREVGQVVMVF9USVRMRTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgIGRhc2hib2FyZFRpdGxlOiBuZXdUaXRsZVxuICAgICAgfTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGxvZ28gZGF0YSB0byBzZW5kXG4gICAgICBpZiAoc2FtZUJvdGhDaGVja2JveD8uY2hlY2tlZCAmJiBwZW5kaW5nU2luZ2xlRGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbG9nbyBmb3IgYm90aCB2YXJpYW50c1xuICAgICAgICBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICAgIHBheWxvYWQuZGF0YUxpZ2h0ID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGVuZGluZ0RhcmtEYXRhKSBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ0RhcmtEYXRhO1xuICAgICAgICBpZiAocGVuZGluZ0xpZ2h0RGF0YSkgcGF5bG9hZC5kYXRhTGlnaHQgPSBwZW5kaW5nTGlnaHREYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xvZ28nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY29uc3QgdCA9ICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGRhdGEucGF0aERhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnBhdGhMaWdodCkge1xuICAgICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9IGRhdGEucGF0aExpZ2h0ICsgdDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5wYXRoTGlnaHQgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbik7XG4gICAgICAgIGFwcGx5RGFzaGJvYXJkVGl0bGUobmV3VGl0bGUpO1xuICAgICAgICBsb2dvTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyb3IuZXJyb3IsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvciBzYXZpbmc6ICcgKyBlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJlc2V0IGFsbCBicmFuZGluZyB0byBkZWZhdWx0c1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1yZXNldCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc2V0IGFsbCBicmFuZGluZyB0byBEYXNoQ2FkZHkgZGVmYXVsdHM/XFxuXFxuVGhpcyB3aWxsIHJlc2V0IHRoZSBsb2dvLCBmYXZpY29uLCB0aXRsZSwgYW5kIHBvc2l0aW9uLicpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nb1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbG9nbycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChsb2dvUmVzcG9uc2Uub2spIHtcbiAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSAnL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZyc7XG4gICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIHByZXZpZXdEYXJrLnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nJztcbiAgICAgICAgcHJldmlld0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnVXNpbmcgZGVmYXVsdCBsb2dvcyc7XG4gICAgICAgIHBlbmRpbmdEYXJrRGF0YSA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBERUZBVUxUX1RJVExFO1xuICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKERFRkFVTFRfVElUTEUpO1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKCdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZhdmljb25SZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Zhdmljb24nLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBpZiAoZmF2aWNvblJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGZhdmljb25MaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJpY29uXCJdJyk7XG4gICAgICAgIGNvbnN0IGZhdmljb25QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tcHJldmlldycpO1xuICAgICAgICBjb25zdCBmYXZpY29uU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tc3RhdHVzJyk7XG4gICAgICAgIGlmIChmYXZpY29uTGluaykgZmF2aWNvbkxpbmsuaHJlZiA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblByZXZpZXcpIGZhdmljb25QcmV2aWV3LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblN0YXR1cykgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBEYXNoQ2FkZHkgZmF2aWNvbic7XG4gICAgICAgIHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHJlc2V0dGluZyBicmFuZGluZzogJyArIGVycm9yLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKGxvZ29Nb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tY2FuY2VsJykpO1xuXG4gIC8vID09PT09IEZBVklDT04gSEFORExJTkcgPT09PT1cbiAgY29uc3QgZmF2aWNvblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1wcmV2aWV3Jyk7XG4gIGNvbnN0IGZhdmljb25TdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1zdGF0dXMnKTtcbiAgY29uc3QgZmF2aWNvblVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXZpY29uLXVwbG9hZCcpO1xuICBjb25zdCBmYXZpY29uTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiaWNvblwiXScpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgbGV0IHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG5cbiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImljb25cIl0nKSkge1xuICAgIGZhdmljb25MaW5rLnJlbCA9ICdpY29uJztcbiAgICBmYXZpY29uTGluay5ocmVmID0gJy9hc3NldHMvZGFzaGNhZGR5LWZhdmljb24uaWNvJztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGZhdmljb25MaW5rKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDdXN0b21GYXZpY29uKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Zhdmljb24nKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgZmF2aWNvbkxpbmsuaHJlZiA9IGRhdGEuY3VzdG9tRmF2aWNvbiArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uUHJldmlldy5zcmMgPSBkYXRhLmN1c3RvbUZhdmljb24gKyAnP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBjdXN0b20gZmF2aWNvbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgbG9hZCBjdXN0b20gZmF2aWNvbjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBmYXZpY29uVXBsb2FkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBpZiAoIWZpbGUudHlwZS5tYXRjaCgvXmltYWdlXFwvKHBuZ3xzdmdcXCt4bWwpJC8pKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2Ugc2VsZWN0IGEgUE5HIG9yIFNWRyBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIGZhdmljb25VcGxvYWQudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgZmF2aWNvblByZXZpZXcuc3JjID0gcGVuZGluZ0Zhdmljb25EYXRhO1xuICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgZmF2aWNvbiByZWFkeSB0byBzYXZlJztcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9KTtcblxuICAvLyBTYXZlIGZhdmljb24gYWxvbmdzaWRlIGxvZ28gc2F2ZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nRmF2aWNvbkRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZmF2aWNvbicsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRhdGE6IHBlbmRpbmdGYXZpY29uRGF0YSB9KVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICBmYXZpY29uTGluay5ocmVmID0gZGF0YS5wYXRoICsgJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICAgIGZhdmljb25QcmV2aWV3LnNyYyA9IGRhdGEucGF0aCArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBmYXZpY29uJztcbiAgICAgICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlIGZhdmljb246ICcgKyBlcnJvci5lcnJvciwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHNhdmluZyBmYXZpY29uOiAnICsgZXJyb3IubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBsb2FkQ3VzdG9tRmF2aWNvbigpO1xuICBsb2FkQ3VzdG9tTG9nbygpO1xuXG4gIC8vID09PT09IFRJTUVaT05FIFNFVFRJTkcgPT09PT1cbiAgY29uc3Qgc2V0dGluZ3NUelNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy10aW1lem9uZScpO1xuICBpZiAoc2V0dGluZ3NUelNlbGVjdCkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGxvZ29Nb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSAmJiBzZXR0aW5nc1R6U2VsZWN0Lm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnRUejtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7IGNvbnN0IGNmZyA9IGF3YWl0IHJlcy5qc29uKCk7IGN1cnJlbnRUeiA9IGNmZy50aW1lem9uZTsgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgICB3aW5kb3cucG9wdWxhdGVUaW1lem9uZVNlbGVjdChzZXR0aW5nc1R6U2VsZWN0LCBjdXJyZW50VHopO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUobG9nb01vZGFsLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR6ID0gc2V0dGluZ3NUelNlbGVjdC52YWx1ZTtcbiAgICAgIGlmICghdHopIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgICAgICBjb25zdCBjZmcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBjZmcudGltZXpvbmUgPSB0ejtcbiAgICAgICAgY2ZnLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNmZylcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgdGltZXpvbmU6JywgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSkoKTtcbjtcbi8vIFNoYXJlZCB0aW1lem9uZSB1dGlsaXR5IFx1MjAxNCB1c2VkIGJ5IHNldHVwIHdpemFyZCBhbmQgc2V0dGluZ3MgbW9kYWxcbi8vIGVycm9ySGFuZGxlciBpcyBkZWNsYXJlZCBnbG9iYWxseSBpbiBnbG9iYWxzLmpzIChjb3JlLmpzIGJ1bmRsZSk7IHJldXNpbmcgaXRcbi8vIGhlcmUgc28gd2UgZG9uJ3QgZ2V0IFwicmVkZWNsYXJhdGlvbiBvZiBjb25zdCBlcnJvckhhbmRsZXJcIiBhdCBzY3JpcHQgc2NvcGUuXG5cbndpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0RWwsIHNlbGVjdGVkVHopIHtcbiAgY29uc3QgdGltZXpvbmVzID0gSW50bC5zdXBwb3J0ZWRWYWx1ZXNPZigndGltZVpvbmUnKTtcbiAgY29uc3QgZGV0ZWN0ZWQgPSBzZWxlY3RlZFR6IHx8IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcbiAgc2VsZWN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIGZvciAoY29uc3QgdHogb2YgdGltZXpvbmVzKSB7XG4gICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0LnZhbHVlID0gdHo7XG4gICAgb3B0LnRleHRDb250ZW50ID0gdHoucmVwbGFjZSgvXy9nLCAnICcpO1xuICAgIGlmICh0eiA9PT0gZGV0ZWN0ZWQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgc2VsZWN0RWwuYXBwZW5kQ2hpbGQob3B0KTtcbiAgfVxufTtcblxuLy8gU2V0dXAgV2l6YXJkIFN5c3RlbSAtIFNlcnZlci1zaWRlIGNvbmZpZyBzdG9yYWdlXG4oZnVuY3Rpb24gKCkge1xuICBsZXQgY3VycmVudENvbmZpZ1R5cGUgPSAnaG9tZWxhYic7XG4gIGxldCBzZXJ2ZXJDb25maWcgPSBudWxsO1xuXG4gIC8vIENoZWNrIHNlcnZlciBmb3IgZXhpc3RpbmcgY29uZmlnIG9uIHBhZ2UgbG9hZFxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZlckNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBzZXJ2ZXJDb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChzZXJ2ZXJDb25maWcgJiYgc2VydmVyQ29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICAvLyBDb25maWcgZXhpc3RzIG9uIHNlcnZlciAtIGRvbid0IHNob3cgd2l6YXJkXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggc2VydmVyIGNvbmZpZywgY2hlY2tpbmcgbG9jYWxTdG9yYWdlIGZhbGxiYWNrOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBjaGVjayBsb2NhbFN0b3JhZ2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgbG9jYWxTZXR1cCA9IHNhZmVHZXQoJ2Rhc2hjYWRkeS1zZXR1cCcpO1xuICAgIGlmIChsb2NhbFNldHVwKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE5vIGNvbmZpZyBmb3VuZCAtIHNob3cgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWRcbiAgY2hlY2tTZXJ2ZXJDb25maWcoKTtcblxuICAvLyBQb3B1bGF0ZSB0aW1lem9uZSBkcm9wZG93biB3aXRoIGF1dG8tZGV0ZWN0aW9uXG4gIGNvbnN0IHNldHVwVHpTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKTtcbiAgaWYgKHNldHVwVHpTZWxlY3QpIHdpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0KHNldHVwVHpTZWxlY3QpO1xuXG4gIC8vIFN0ZXAgbmF2aWdhdGlvblxuICBmdW5jdGlvbiBzaG93U3RlcChzdGVwSWQpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2V0dXAtc3RlcCcpLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICBzdGVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0ZXBJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXApIHtcbiAgICAgIHRhcmdldFN0ZXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyBzdW1tYXJ5XG4gIGZ1bmN0aW9uIHNob3dTdW1tYXJ5KCkge1xuICAgIGNvbnN0IHN1bW1hcnlDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN1bW1hcnktY29udGVudCcpO1xuICAgIGlmICghc3VtbWFyeUNvbnRlbnQpIHJldHVybjtcblxuICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDIwcHg7XCI+JztcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25zdCB0bGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk/LnZhbHVlPy50cmltKCkgfHwgJy5ob21lJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGRuc1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+SG9tZSBMYWIgQ29uZmlndXJhdGlvbjwvaDM+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlRMRDo8L3N0cm9uZz4gJHt0bGR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+Q2VydGlmaWNhdGUgQXV0aG9yaXR5Ojwvc3Ryb25nPiAke2NhTmFtZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5ETlMgU2VydmVyOjwvc3Ryb25nPiAke2Ruc0lQfToke2Ruc1BvcnR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RXhhbXBsZSBVUkxzOjwvc3Ryb25nPiBodHRwczovL3VwdGltZSR7dGxkfSwgaHR0cHM6Ly9uZXh0Y2xvdWQke3RsZH08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zaW1wbGUtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnbG9jYWxob3N0JztcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+U2ltcGxlIFNldHVwPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+QWNjZXNzIE1ldGhvZDo8L3N0cm9uZz4gSVA6UG9ydCBvbmx5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RGVmYXVsdCBJUDo8L3N0cm9uZz4gJHtpcH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5TU0w6PC9zdHJvbmc+IE5vbmUgKEhUVFAgb25seSk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5FeGFtcGxlIFVSTHM6PC9zdHJvbmc+IGh0dHA6Ly8ke2lwfTo4MDgwLCBodHRwOi8vJHtpcH06MzAwMDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHJvdXRpbmdNb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInJvdXRpbmctbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlIHx8ICdzdWJkaXJlY3RvcnknO1xuICAgICAgY29uc3QgZXhhbXBsZVVybHMgPSByb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgPyBgaHR0cHM6Ly8ke2RvbWFpbn0vc29uYXJyLCBodHRwczovLyR7ZG9tYWlufS9ncmFmYW5hYFxuICAgICAgICA6IGBodHRwczovL3NvbmFyci4ke2RvbWFpbn0sIGh0dHBzOi8vZ3JhZmFuYS4ke2RvbWFpbn1gO1xuICAgICAgY29uc3Qgcm91dGluZ0xhYmVsID0gcm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknID8gJ1N1YmRpcmVjdG9yeSAoZG9tYWluLmNvbS9hcHApJyA6ICdTdWJkb21haW4gKGFwcC5kb21haW4uY29tKSc7XG5cbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlB1YmxpYyBTZXJ2ZXI8L2gzPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZG9tYWlufTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlNTTDo8L3N0cm9uZz4gTGV0J3MgRW5jcnlwdDwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkVtYWlsOjwvc3Ryb25nPiAke2VtYWlsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlJvdXRpbmc6PC9zdHJvbmc+ICR7cm91dGluZ0xhYmVsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkV4YW1wbGUgVVJMczo8L3N0cm9uZz4gJHtleGFtcGxlVXJsc308L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIC8vIFRpbWV6b25lICh1bml2ZXJzYWwgYWNyb3NzIGFsbCBjb25maWcgdHlwZXMpXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnO1xuICAgIGh0bWwgKz0gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiPjxzdHJvbmc+VGltZXpvbmU6PC9zdHJvbmc+ICR7dHoucmVwbGFjZSgvXy9nLCAnICcpfTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgc3VtbWFyeUNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gIH1cblxuICAvLyBTYXZlIGNvbmZpZyB0byBzZXJ2ZXJcbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXR1cFdpemFyZF0gU2F2ZSBDb25maWcnLCBuZXcgRXJyb3IoYFNlcnZlciByZXR1cm5lZCAke3Jlc3BvbnNlLnN0YXR1c31gKSwgeyBmdW5jdGlvbjogJ3NhdmVDb25maWdUb1NlcnZlcicgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2V0dXBXaXphcmRdIFNhdmUgQ29uZmlnJywgZXJyb3IsIHsgZnVuY3Rpb246ICdzYXZlQ29uZmlnVG9TZXJ2ZXInIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBoYW5kbGVyXG4gIGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFNldHVwKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNldHVwQ29tcGxldGU6IHRydWUsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogY3VycmVudENvbmZpZ1R5cGUsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRpbWV6b25lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnXG4gICAgfTtcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25maWcudGxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXRsZCcpPy52YWx1ZT8udHJpbSgpIHx8ICcuaG9tZSc7XG4gICAgICBjb25maWcuY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWNhLW5hbWUnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvdmlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXByb3ZpZGVyJyk/LnZhbHVlIHx8ICd0ZWNobml0aXVtJztcbiAgICAgIGNvbmZpZy5kbnMgPSB7XG4gICAgICAgIHByb3ZpZGVyOiBzZWxlY3RlZFByb3ZpZGVyLFxuICAgICAgICBpcDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgICBwb3J0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgICAgICAgdG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtdG9rZW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJ1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5kZWZhdWx0cyA9IHtcbiAgICAgICAgZG5zVHlwZTogJ3ByaXZhdGUnLFxuICAgICAgICBzc2xUeXBlOiAnaW50ZXJuYWwnLFxuICAgICAgICB0YXJnZXRJUDogJ2xvY2FsaG9zdCdcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIGNvbmZpZy5kZWZhdWx0SVAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc2ltcGxlLWlwJyk/LnZhbHVlPy50cmltKCkgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6ICdub25lJyxcbiAgICAgICAgc3NsVHlwZTogJ25vbmUnLFxuICAgICAgICB0YXJnZXRJUDogY29uZmlnLmRlZmF1bHRJUFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgY29uZmlnLmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcuZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtcHVibGljLWVtYWlsJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcucm91dGluZ01vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicm91dGluZy1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgfHwgJ3N1YmRpcmVjdG9yeSc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6IGNvbmZpZy5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgPyAnbm9uZScgOiAncHVibGljJyxcbiAgICAgICAgc3NsVHlwZTogJ2xldHNlbmNyeXB0JyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChwcmltYXJ5KSBhbmQgbG9jYWxTdG9yYWdlIChmYWxsYmFjaylcbiAgICBjb25zdCBzYXZlZFRvU2VydmVyID0gYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZyk7XG4gICAgc2FmZVNldCgnZGFzaGNhZGR5LWNvbmZpZycsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdjb21wbGV0ZWQnKTtcblxuICAgIC8vIEhpZGUgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBTaG93IHN1Y2Nlc3Mgbm90aWZpY2F0aW9uXG4gICAgY29uc3QgY29uZmlnTmFtZSA9IGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicgPyAnUHJvZmVzc2lvbmFsIEhvbWUgTGFiJyA6XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnID8gJ1NpbXBsZSBTZXR1cCcgOiAnUHVibGljIFNlcnZlcic7XG4gICAgY29uc3Qgc2F2ZUxvY2F0aW9uID0gc2F2ZWRUb1NlcnZlciA/ICdzZXJ2ZXIgKHNoYXJlZCBhY3Jvc3MgYWxsIGRldmljZXMpJyA6ICdsb2NhbGx5ICh0aGlzIGJyb3dzZXIgb25seSknO1xuXG4gICAgc2hvd05vdGlmaWNhdGlvbihgU2V0dXAgQ29tcGxldGUhIENvbmZpZ3VyZWQgZm9yOiAke2NvbmZpZ05hbWV9LiBTZXR0aW5ncyBzYXZlZCB0bzogJHtzYXZlTG9jYXRpb259YCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgIC8vIFJlbG9hZCBwYWdlIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IGxvY2F0aW9uLnJlbG9hZCgpLCA1MDApO1xuICB9XG5cbiAgLy8gPT09PT0gRXZlbnQgSGFuZGxlcnMgdXNpbmcgZGlyZWN0IG9uY2xpY2sgZm9yIHJlbGlhYmlsaXR5ID09PT09XG5cbiAgLy8gU3RlcCAxOiBDb250aW51ZSBidXR0b25cbiAgY29uc3Qgc3RlcDFOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN0ZXAtMS1uZXh0Jyk7XG4gIGlmIChzdGVwMU5leHQpIHtcbiAgICBzdGVwMU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNvbmZpZy10eXBlXCJdOmNoZWNrZWQnKTtcbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjdXJyZW50Q29uZmlnVHlwZSA9IHNlbGVjdGVkLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtaG9tZWxhYicpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtc2ltcGxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1wdWJsaWMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWhvbWVsYWInKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gU2tpcCBzZXR1cCBidXR0b25cbiAgY29uc3Qgc2tpcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1za2lwJyk7XG4gIGlmIChza2lwQnRuKSB7XG4gICAgc2tpcEJ0bi5vbmNsaWNrID0gYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGNvbmZpcm0oJ1NraXAgc2V0dXA/IFlvdSBjYW4gcnVuIGl0IGxhdGVyIGZyb20gU2V0dGluZ3MuJykpIHtcbiAgICAgICAgLy8gU2F2ZSBza2lwIHN0YXR1cyB0byBzZXJ2ZXJcbiAgICAgICAgYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKHsgc2V0dXBDb21wbGV0ZTogdHJ1ZSwgc2tpcHBlZDogdHJ1ZSwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSk7XG4gICAgICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdza2lwcGVkJyk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC13aXphcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYjogVExEIFByZXZpZXdcbiAgY29uc3QgdGxkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk7XG4gIGlmICh0bGRJbnB1dCkge1xuICAgIHRsZElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCB0bGQgPSBlLnRhcmdldC52YWx1ZSB8fCAnLmhvbWUnO1xuICAgICAgY29uc3QgcHJldmlldzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxkLXByZXZpZXcnKTtcbiAgICAgIGNvbnN0IHByZXZpZXcyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZC1wcmV2aWV3LTInKTtcbiAgICAgIGlmIChwcmV2aWV3MSkgcHJldmlldzEudGV4dENvbnRlbnQgPSB0bGQ7XG4gICAgICBpZiAocHJldmlldzIpIHByZXZpZXcyLnRleHRDb250ZW50ID0gdGxkO1xuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYiBuYXZpZ2F0aW9uXG4gIGNvbnN0IGhvbWVsYWJCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWhvbWVsYWItYmFjaycpO1xuICBpZiAoaG9tZWxhYkJhY2spIHtcbiAgICBob21lbGFiQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBob21lbGFiTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1ob21lbGFiLW5leHQnKTtcbiAgaWYgKGhvbWVsYWJOZXh0KSB7XG4gICAgaG9tZWxhYk5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHRsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10bGQnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCF0bGQgfHwgIXRsZC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdmFsaWQgVExEIHN0YXJ0aW5nIHdpdGggYSBkb3QgKGUuZy4sIC5ob21lKScsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY2FOYW1lKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIENlcnRpZmljYXRlIEF1dGhvcml0eSBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFkbnNJUCkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgeW91ciBETlMgc2VydmVyIElQIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTaW1wbGUgbmF2aWdhdGlvblxuICBjb25zdCBzaW1wbGVCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1iYWNrJyk7XG4gIGlmIChzaW1wbGVCYWNrKSB7XG4gICAgc2ltcGxlQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBzaW1wbGVOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1uZXh0Jyk7XG4gIGlmIChzaW1wbGVOZXh0KSB7XG4gICAgc2ltcGxlTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N1bW1hcnkoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gUHVibGljIHJvdXRpbmcgbW9kZSB0b2dnbGUgXHUyMDE0IHVwZGF0ZSByZXF1aXJlbWVudCB0ZXh0XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJyb3V0aW5nLW1vZGVcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgcmFkaW8ub25jaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBub3RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1yZXF1aXJlbWVudC1ub3RlJyk7XG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBub3RlLnRleHRDb250ZW50ID0gdGhpcy52YWx1ZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgICA/ICdPbmx5IG9uZSBETlMgcmVjb3JkIG5lZWRlZCAoZm9yIHRoZSBtYWluIGRvbWFpbiknXG4gICAgICAgICAgOiAnWW91XFwnbGwgbmVlZCB0byBjb25maWd1cmUgRE5TIG1hbnVhbGx5IGZvciBlYWNoIHN1YmRvbWFpbic7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gUHVibGljIG5hdmlnYXRpb25cbiAgY29uc3QgcHVibGljQmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtYmFjaycpO1xuICBpZiAocHVibGljQmFjaykge1xuICAgIHB1YmxpY0JhY2sub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLTEnKTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHVibGljTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtbmV4dCcpO1xuICBpZiAocHVibGljTmV4dCkge1xuICAgIHB1YmxpY05leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIHlvdXIgZG9tYWluIG5hbWUnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IG5hdmlnYXRpb25cbiAgY29uc3Qgc3VtbWFyeUJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc3VtbWFyeS1iYWNrJyk7XG4gIGlmIChzdW1tYXJ5QmFjaykge1xuICAgIHN1bW1hcnlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdob21lbGFiJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1ob21lbGFiJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zaW1wbGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXB1YmxpYycpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IFwiQ29udGludWUgXHUyMTkyXCIgXHUyMDE0IGFkdmFuY2UgdG8gdGhlIGRpc2stc2FmZXR5IHdhcm5pbmcgc3RlcFxuICBjb25zdCBzdW1tYXJ5TmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zdW1tYXJ5LW5leHQnKTtcbiAgaWYgKHN1bW1hcnlOZXh0KSB7XG4gICAgc3VtbWFyeU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWRpc2stc2FmZXR5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIERpc2stc2FmZXR5IHN0ZXAgbmF2aWdhdGlvblxuICBjb25zdCBkaXNrU2FmZXR5QmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kaXNrLXNhZmV0eS1iYWNrJyk7XG4gIGlmIChkaXNrU2FmZXR5QmFjaykge1xuICAgIGRpc2tTYWZldHlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBidXR0b24gKG5vdyBvbiB0aGUgZGlzay1zYWZldHkgc3RlcClcbiAgY29uc3QgZmluaXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRpc2stc2FmZXR5LWZpbmlzaCcpO1xuICBpZiAoZmluaXNoQnRuKSB7XG4gICAgZmluaXNoQnRuLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBmaW5pc2hTZXR1cCgpO1xuICAgIH07XG4gIH1cblxuICAvLyBFeHBvc2UgZnVuY3Rpb24gdG8gZ2V0IGdsb2JhbCBjb25maWcgKGZyb20gc2VydmVyIG9yIGxvY2FsU3RvcmFnZSlcbiAgd2luZG93LmdldEdsb2JhbENvbmZpZyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRyeSBzZXJ2ZXIgZmlyc3RcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggY29uZmlnIGZyb20gc2VydmVyJyk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gbG9jYWxTdG9yYWdlXG4gICAgY29uc3QgY29uZmlnU3RyID0gc2FmZUdldCgnZGFzaGNhZGR5LWNvbmZpZycpO1xuICAgIGlmIChjb25maWdTdHIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZ1N0cik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGRlZmF1bHQgY29uZmlnIGlmIG5vdCBzZXRcbiAgICByZXR1cm4ge1xuICAgICAgc2V0dXBDb21wbGV0ZTogZmFsc2UsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogJ2hvbWVsYWInLFxuICAgICAgdGxkOiAnLmhvbWUnLFxuICAgICAgY2FOYW1lOiAnJyxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGRuc1R5cGU6ICdwcml2YXRlJyxcbiAgICAgICAgc3NsVHlwZTogJ2ludGVybmFsJyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBFeHBvc2UgcmVzZXQgZnVuY3Rpb24gZm9yIHNldHRpbmdzXG4gIHdpbmRvdy5yZXNldFNldHVwV2l6YXJkID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKGNvbmZpcm0oJ1Jlc2V0IERhc2hDYWRkeSBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgc2hvdyB0aGUgc2V0dXAgd2l6YXJkIGFnYWluLicpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGRlbGV0ZSBzZXJ2ZXIgY29uZmlnJyk7XG4gICAgICB9XG4gICAgICBzYWZlUmVtb3ZlKCdkYXNoY2FkZHktc2V0dXAnKTtcbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1jb25maWcnKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG47XG4vLyBBcHAgU2VsZWN0b3IgU3lzdGVtXG4oZnVuY3Rpb24gKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdhcHAtc2VsZWN0b3ItbW9kYWwnLCBgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0b3ItY29udGVudFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOiAwIDAgMjRweDsgY29sb3I6IHZhcigtLWZnKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiPkNob29zZSBhbiBBcHA8L2gyPlxuICAgICAgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1ncmlkXCIgY2xhc3M9XCJhcHAtc2VsZWN0b3ItZ3JpZFwiPjwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFwcC1zZWxlY3Rvci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnYXBwLWRlcGxveS1tb2RhbCcsIGA8ZGl2IGlkPVwiYXBwLWRlcGxveS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzAwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJhcHAtZGVwbG95LXRpdGxlXCI+RGVwbG95IEFwcGxpY2F0aW9uPC9oMz5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU3ViZG9tYWluL0RvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LXN1YmRvbWFpblwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFx1RDgzQ1x1REYxMCBTdWJkb21haW4gb3IgRG9tYWluXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1zdWJkb21haW5cIiBwbGFjZWhvbGRlcj1cInVwdGltZVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFlvdXIgYXBwIHdpbGwgYmUgYXZhaWxhYmxlIGF0OiA8c3BhbiBpZD1cImRlcGxveS11cmwtcHJldmlld1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+dXB0aW1lLmhvbWU8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YnBhdGgtY29tcGF0LXdhcm5pbmdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmY5ODAwIDEwJSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgI2ZmOTgwMCAzMCUsIHRyYW5zcGFyZW50KTsgbWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRE5TIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RERDMlx1RkUwRiBETlMgQ29uZmlndXJhdGlvblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sLWdhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZG5zLXR5cGVcIiB2YWx1ZT1cInByaXZhdGVcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPlByaXZhdGUgRE5TIChUZWNobml0aXVtKTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgeW91ciBsb2NhbCBETlMgc2VydmVyIHdpdGggY3VzdG9tIFRMRCAoLnNhbWksIC5ob21lLCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkbnMtdHlwZVwiIHZhbHVlPVwicHVibGljXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+UHVibGljIEROUzwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgYSByZWFsIGRvbWFpbiAoZXhhbXBsZS5jb20pIC0gcmVxdWlyZXMgRE5TIHByb3ZpZGVyIHNldHVwPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRucy10eXBlXCIgdmFsdWU9XCJub25lXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+Tm8gRE5TIChJUDpQb3J0IG9ubHkpPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPkFjY2VzcyB2aWEgSVAgYWRkcmVzcyBhbmQgcG9ydCAtIG5vIGRvbWFpbiBzZXR1cDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU1NMIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1REQxMiBTU0wvVExTIENlcnRpZmljYXRlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwiaW50ZXJuYWxcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkludGVybmFsIENBPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlVzZSBDYWRkeSdzIGludGVybmFsIGNlcnRpZmljYXRlIGF1dGhvcml0eSAoc2VsZi1zaWduZWQpPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNzbC10eXBlXCIgdmFsdWU9XCJsZXRzZW5jcnlwdFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkxldCdzIEVuY3J5cHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+RnJlZSBwdWJsaWMgU1NMIGNlcnRpZmljYXRlIChyZXF1aXJlcyBwdWJsaWMgZG9tYWluKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwibm9uZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPk5vIFNTTCAoSFRUUCBvbmx5KTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5cdTI2QTBcdUZFMEYgTm90IHJlY29tbWVuZGVkIC0gdHJhZmZpYyB3aWxsIGJlIHVuZW5jcnlwdGVkPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBNZWRpYSBMaWJyYXJ5IFBhdGggKHNob3duIGZvciBtZWRpYSBhcHBzKSAtLT5cbiAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudFwiPlxuICAgICAgICAgICAgXHVEODNEXHVEQ0MxIE1lZGlhIExpYnJhcnkgTG9jYXRpb25cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICA8IS0tIERldGVjdGVkIG1vdW50cyBmcm9tIGV4aXN0aW5nIG1lZGlhIHNlcnZlcnMgLS0+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGV0ZWN0ZWQtbW91bnRzLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgICAgICAgICAgXHUyNzEzIERldGVjdGVkIGZyb20gZXhpc3RpbmcgbWVkaWEgc2VydmVyczpcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJkZXRlY3RlZC1tb3VudHMtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBhdGggaW5wdXQgd2l0aCBicm93c2UgYnV0dG9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1tZWRpYS1wYXRoXCIgcGxhY2Vob2xkZXI9XCIvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93c1wiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZsZXhcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJyb3dzZS1tZWRpYS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgIFx1RDgzRFx1RENDMiBCcm93c2VcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtaGludFwiPlxuICAgICAgICAgICAgICBTZWxlY3QgZm9sZGVycyBmcm9tIGV4aXN0aW5nIHNlcnZlcnMsIGJyb3dzZSwgb3IgdHlwZSBwYXRocyBtYW51YWxseS4gU2VwYXJhdGUgbXVsdGlwbGUgd2l0aCBjb21tYXMuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBwYXRocyBkaXNwbGF5IC0tPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlbGVjdGVkLW1lZGlhLXBhdGhzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBsZXggQ2xhaW0gVG9rZW4gKHNob3duIG9ubHkgZm9yIFBsZXggZGVwbG95bWVudHMpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwicGxleC1jbGFpbS1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTEgUGxleCBDbGFpbSBUb2tlblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkZXBsb3ktcGxleC1jbGFpbVwiIHBsYWNlaG9sZGVyPVwiY2xhaW0teHh4eHh4eHh4eHh4eHh4eHh4eHhcIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmxleFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9wbGV4LnR2L2NsYWltXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogI2U1YTAwZDsgY29sb3I6ICMwMDA7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgR2V0IFRva2VuXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2U1YTAwZDsgbWFyZ2luLXRvcDogNHB4O1wiPlxuICAgICAgICAgICAgVG9rZW4gZXhwaXJlcyBpbiA0IG1pbnV0ZXMhIEdldCBpdCByaWdodCBiZWZvcmUgY2xpY2tpbmcgRGVwbG95LiBMZWF2ZSBlbXB0eSB0byBjb25maWd1cmUgUGxleCBtYW51YWxseSBsYXRlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgU2VjdXJpdHkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJ0YWlsc2NhbGUtc2VjdGlvblwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTAgVGFpbHNjYWxlIFNlY3VyaXR5XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZGVwbG95LXRhaWxzY2FsZS1vbmx5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+VGFpbHNjYWxlLU9ubHkgQWNjZXNzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seSAoMTAwLngueC54IElQcyk8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUgc3RhdHVzLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgT3B0aW9ucyAoQ29sbGFwc2libGUpIC0tPlxuICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2OTlcdUZFMEYgQWR2YW5jZWQgT3B0aW9uczwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1wb3J0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPkN1c3RvbSBQb3J0IChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LXBvcnRcIiBwbGFjZWhvbGRlcj1cIkxlYXZlIGVtcHR5IGZvciBkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbnB1dC1jYXJkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1pcFwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDtcIj5UYXJnZXQgSVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVwbG95LWlwXCIgdmFsdWU9XCJsb2NhbGhvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNhcmRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICAgICAgVXNlICdsb2NhbGhvc3QnIGZvciBzYW1lLWhvc3QgY29udGFpbmVycywgb3Igc3BlY2lmaWMgSVAgZm9yIHJlbW90ZSBzZXJ2aWNlc1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cInZvbHVtZS1tb3VudHMtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cdUQ4M0RcdURDQzIgVm9sdW1lIE1vdW50czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIEN1c3RvbWl6ZSB3aGVyZSBjb250YWluZXIgZGF0YSBpcyBzdG9yZWQgb24gdGhlIGhvc3QuIE1lZGlhIHZvbHVtZXMgYXJlIGNvbmZpZ3VyZWQgYWJvdmUuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwidm9sdW1lLW1vdW50cy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XHUyNjk5XHVGRTBGIFJlc291cmNlIExpbWl0czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIE9wdGlvbmFsIENQVSBhbmQgbWVtb3J5IGNvbnN0cmFpbnRzLiBMZWF2ZSBhdCAwIGZvciB1bmxpbWl0ZWQuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXBsb3ktY3B1LWxpbWl0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+Q1BVIENvcmVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkZXBsb3ktY3B1LWxpbWl0XCIgdmFsdWU9XCIwXCIgbWluPVwiMFwiIG1heD1cIjY0XCIgc3RlcD1cIjAuMjVcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1tZW1vcnktbGltaXRcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5NZW1vcnkgKE1CKTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LW1lbW9yeS1saW1pdFwiIHZhbHVlPVwiMFwiIG1pbj1cIjBcIiBtYXg9XCIxMzEwNzJcIiBzdGVwPVwiNjRcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhcHAtZGVwbG95LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXBwLWRlcGxveS1jb25maXJtXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgXHVEODNEXHVERTgwIERlcGxveVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBBUFBTX0tFWSA9ICdjdXN0b20tYXBwcyc7XG5cbiAgLy8gQ2FjaGUgZm9yIEFQSSB0ZW1wbGF0ZXNcbiAgbGV0IGFwaVRlbXBsYXRlcyA9IG51bGw7XG4gIGxldCBhcGlDYXRlZ29yaWVzID0gbnVsbDtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItbW9kYWwnKTtcbiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItZ3JpZCcpO1xuXG4gIC8vIEZldGNoIGFwcCB0ZW1wbGF0ZXMgZnJvbSBBUElcbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBcHBUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXBwcy90ZW1wbGF0ZXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGFwaVRlbXBsYXRlcyA9IGRhdGEudGVtcGxhdGVzO1xuICAgICAgICBhcGlDYXRlZ29yaWVzID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRmV0Y2ggVGVtcGxhdGVzJywgZSwgeyBmdW5jdGlvbjogJ2ZldGNoQXBpVGVtcGxhdGVzJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgcG9ydCBhdmFpbGFiaWxpdHlcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tQb3J0QXZhaWxhYmlsaXR5KHBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7cG9ydH0vY2hlY2tgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gQ2hlY2sgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdjaGVja1BvcnRBdmFpbGFiaWxpdHknIH0pO1xuICAgICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH07IC8vIEFzc3VtZSBhdmFpbGFibGUgb24gZXJyb3JcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgc3VnZ2VzdGVkIGF2YWlsYWJsZSBwb3J0XG4gIGFzeW5jIGZ1bmN0aW9uIGdldFN1Z2dlc3RlZFBvcnQoYmFzZVBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7YmFzZVBvcnR9L3N1Z2dlc3RgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnN1Z2dlc3RlZFBvcnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQXBwU2VsZWN0b3JdIEdldCBTdWdnZXN0ZWQgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdnZXRTdWdnZXN0ZWRQb3J0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VQb3J0O1xuICB9XG5cbiAgLy8gQnVpbGQgYXBwIHNlbGVjdG9yIGdyaWQgZnJvbSBBUEkgdGVtcGxhdGVzXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwU2VsZWN0b3IoKSB7XG4gICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nIGFwcCB0ZW1wbGF0ZXMuLi48L2Rpdj4nO1xuXG4gICAgLy8gRmV0Y2ggdGVtcGxhdGVzIGlmIG5vdCBjYWNoZWRcbiAgICBpZiAoIWFwaVRlbXBsYXRlcykge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZldGNoQXBwVGVtcGxhdGVzKCk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLWVycm9yKTtcIj5GYWlsZWQgdG8gbG9hZCBhcHAgdGVtcGxhdGVzLiBQbGVhc2UgdHJ5IGFnYWluLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBncmlkLmlubmVySFRNTCA9ICcnO1xuXG4gICAgLy8gR3JvdXAgdGVtcGxhdGVzIGJ5IGNhdGVnb3J5XG4gICAgY29uc3QgYnlDYXRlZ29yeSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2FwcElkLCB0ZW1wbGF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXBpVGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0ZW1wbGF0ZS5jYXRlZ29yeSB8fCAnT3RoZXInO1xuICAgICAgaWYgKCFieUNhdGVnb3J5W2NhdGVnb3J5XSkge1xuICAgICAgICBieUNhdGVnb3J5W2NhdGVnb3J5XSA9IFtdO1xuICAgICAgfVxuICAgICAgYnlDYXRlZ29yeVtjYXRlZ29yeV0ucHVzaCh7IGlkOiBhcHBJZCwgLi4udGVtcGxhdGUgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZSBvcmRlciBpbiBhcGlDYXRlZ29yaWVzIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNhdGVnb3J5T3JkZXIgPSBhcGlDYXRlZ29yaWVzID8gT2JqZWN0LmtleXMoYXBpQ2F0ZWdvcmllcykgOiBPYmplY3Qua2V5cyhieUNhdGVnb3J5KS5zb3J0KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3J5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGFwcHMgPSBieUNhdGVnb3J5W2NhdGVnb3J5XTtcbiAgICAgIGlmICghYXBwcyB8fCBhcHBzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIC8vIFNvcnQgYXBwcyBieSBwb3B1bGFyaXR5IChkZXNjZW5kaW5nKVxuICAgICAgYXBwcy5zb3J0KChhLCBiKSA9PiAoYi5wb3B1bGFyaXR5IHx8IDApIC0gKGEucG9wdWxhcml0eSB8fCAwKSk7XG5cbiAgICAgIC8vIENhdGVnb3J5IGhlYWRlciB3aXRoIGljb24gYW5kIGNvbG9yIGZyb20gQVBJXG4gICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgICBjb25zdCBjYXRlZ29yeUluZm8gPSBhcGlDYXRlZ29yaWVzPy5bY2F0ZWdvcnldIHx8IHt9O1xuICAgICAgaGVhZGVyLmlubmVySFRNTCA9IGAke2VzY2FwZUh0bWwoY2F0ZWdvcnlJbmZvLmljb24gfHwgJycpfSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfWA7XG4gICAgICBpZiAoY2F0ZWdvcnlJbmZvLmNvbG9yKSB7XG4gICAgICAgIGhlYWRlci5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGNhdGVnb3J5SW5mby5jb2xvcjtcbiAgICAgIH1cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcblxuICAgICAgLy8gQXBwIG9wdGlvbnNcbiAgICAgIGFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcblxuICAgICAgICAvLyBXaWRnZXQgZW5hYmxlZCBiYWRnZVxuICAgICAgICBjb25zdCBpc1dpZGdldCA9IGFwcC5pc0Rhc2hib2FyZFdpZGdldDtcbiAgICAgICAgY29uc3Qgd2lkZ2V0RW5hYmxlZCA9IGlzV2lkZ2V0ICYmIHNhZmVHZXQoJ3dpZGdldC0nICsgYXBwLmlkICsgJy1lbmFibGVkJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGNvbnN0IHdpZGdldEJhZGdlID0gaXNXaWRnZXRcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogJHt3aWRnZXRFbmFibGVkID8gJyMyZWNjNzEzMCcgOiAnI2U3NGMzYzMwJ307IGNvbG9yOiAke3dpZGdldEVuYWJsZWQgPyAnIzJlY2M3MScgOiAnI2U3NGMzYyd9OyBmb250LXdlaWdodDogNjAwO1wiPiR7d2lkZ2V0RW5hYmxlZCA/ICdPTicgOiAnT0ZGJ308L2Rpdj5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICAvLyBTaG93IGRpZmZpY3VsdHkgYmFkZ2UgKG5vbi13aWRnZXRzIG9ubHkpXG4gICAgICAgIGNvbnN0IGRpZmZpY3VsdHlCYWRnZSA9ICFpc1dpZGdldCAmJiBhcHAuZGlmZmljdWx0eSA/XG4gICAgICAgICAgYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9MjA7IGNvbG9yOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9O1wiPiR7ZXNjYXBlSHRtbChhcHAuZGlmZmljdWx0eSl9PC9kaXY+YCA6ICcnO1xuXG4gICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24taWNvblwiPiR7ZXNjYXBlSHRtbChhcHAuaWNvbiB8fCAnXHVEODNEXHVEQ0U2Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tbmFtZVwiPiR7ZXNjYXBlSHRtbChhcHAubmFtZSl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tZGVzY1wiPiR7ZXNjYXBlSHRtbChhcHAuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuICAgICAgICAgICR7d2lkZ2V0QmFkZ2V9JHtkaWZmaWN1bHR5QmFkZ2V9XG4gICAgICAgIGA7XG5cbiAgICAgICAgaWYgKGlzV2lkZ2V0KSB7XG4gICAgICAgICAgb3B0aW9uLm9uY2xpY2sgPSAoKSA9PiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbi5vbmNsaWNrID0gKCkgPT4gc2hvd0RlcGxveUNvbmZpZyhhcHApO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciByZWNpcGUgY2FyZHMgYXQgdGhlIGVuZCBvZiB0aGUgZ3JpZFxuICAgIGlmICh3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMpIHtcbiAgICAgIGF3YWl0IHdpbmRvdy5yZW5kZXJSZWNpcGVDYXJkcyhncmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb2dnbGUgYSBkYXNoYm9hcmQgd2lkZ2V0IG9uL29mZlxuICBmdW5jdGlvbiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb25FbCkge1xuICAgIGNvbnN0IGtleSA9ICd3aWRnZXQtJyArIGFwcC5pZCArICctZW5hYmxlZCc7XG4gICAgY29uc3QgY3VycmVudGx5RW5hYmxlZCA9IHNhZmVHZXQoa2V5KSAhPT0gJ2ZhbHNlJztcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFjdXJyZW50bHlFbmFibGVkO1xuICAgIHNhZmVTZXQoa2V5LCBTdHJpbmcobmV3U3RhdGUpKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IGltbWVkaWF0ZWx5XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBhcHAud2lkZ2V0U2VsZWN0b3I7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gbmV3U3RhdGUgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJhZGdlIGluIHRoZSBhcHAgc2VsZWN0b3IgY2FyZFxuICAgIGNvbnN0IGJhZGdlID0gb3B0aW9uRWwucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlci1yYWRpdXM6IDRweFwiXScpO1xuICAgIGlmIChiYWRnZSkge1xuICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBuZXdTdGF0ZSA/ICdPTicgOiAnT0ZGJztcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBuZXdTdGF0ZSA/ICcjMmVjYzcxMzAnIDogJyNlNzRjM2MzMCc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9IG5ld1N0YXRlID8gJyMyZWNjNzEnIDogJyNlNzRjM2MnO1xuICAgIH1cblxuICAgIHNob3dOb3RpZmljYXRpb24oYCR7YXBwLm5hbWV9IHdpZGdldCAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gLCAnc3VjY2VzcycsIDIwMDApO1xuICB9XG5cbiAgLy8gU2hvdyBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gbW9kYWxcbiAgYXN5bmMgZnVuY3Rpb24gc2hvd0RlcGxveUNvbmZpZyhhcHBUZW1wbGF0ZSkge1xuICAgIGNvbnN0IGRlcGxveU1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LXRpdGxlJyk7XG4gICAgY29uc3Qgc3ViZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXVybC1wcmV2aWV3Jyk7XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktaXAnKTtcbiAgICBjb25zdCBwb3J0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktdGFpbHNjYWxlLW9ubHknKTtcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFpbHNjYWxlLXN0YXR1cycpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIGNvbnRhaW5lciB3aXRoIHNhbWUgaW1hZ2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2tSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvY2hlY2stZXhpc3RpbmcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZDogYXBwVGVtcGxhdGUuaWQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGNoZWNrUmVzdWx0LnN1Y2Nlc3MgJiYgY2hlY2tSZXN1bHQuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNoZWNrUmVzdWx0LmNvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgdXNlRXhpc3RpbmcgPSBjb25maXJtKFxuICAgICAgICAgIGBGb3VuZCBleGlzdGluZyAke2FwcFRlbXBsYXRlLm5hbWV9IGNvbnRhaW5lcjpcXG5cXG5gICtcbiAgICAgICAgICBgQ29udGFpbmVyOiAke2NvbnRhaW5lci5uYW1lfVxcbmAgK1xuICAgICAgICAgIGBTdGF0dXM6ICR7Y29udGFpbmVyLnN0YXR1c31cXG5gICtcbiAgICAgICAgICBgUG9ydDogJHtjb250YWluZXIucHJpbWFyeVBvcnQgfHwgJ04vQSd9XFxuXFxuYCArXG4gICAgICAgICAgYFdvdWxkIHlvdSBsaWtlIHRvIHVzZSB0aGlzIGV4aXN0aW5nIGNvbnRhaW5lcj9cXG5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgT0sgdG8gY29uZmlndXJlIEROUy9DYWRkeSBmb3IgdGhlIGV4aXN0aW5nIGNvbnRhaW5lci5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgQ2FuY2VsIHRvIGRlcGxveSBhIG5ldyBjb250YWluZXIuYFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh1c2VFeGlzdGluZykge1xuICAgICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nIGNvbnRhaW5lciBpbmZvIGZvciBkZXBsb3ltZW50XG4gICAgICAgICAgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgY29udGFpbmVyIGNoZWNrIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFNldCB0aXRsZSB3aXRoIGFwcCBpbmZvXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgRGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX1gO1xuXG4gICAgLy8gUHJlLWZpbGwgc3ViZG9tYWluIGZyb20gdGVtcGxhdGUgb3IgYXBwIElEXG4gICAgY29uc3QgZGVmYXVsdFN1YmRvbWFpbiA9IGFwcFRlbXBsYXRlLnN1YmRvbWFpbiB8fCBhcHBUZW1wbGF0ZS5pZC5yZXBsYWNlKC8tL2csICcnKTtcbiAgICBzdWJkb21haW5JbnB1dC52YWx1ZSA9IGRlZmF1bHRTdWJkb21haW47XG5cbiAgICAvLyBTaG93IHN1YnBhdGggY29tcGF0aWJpbGl0eSB3YXJuaW5nIGluIHN1YmRpcmVjdG9yeSBtb2RlXG4gICAgY29uc3Qgc3VicGF0aFdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VicGF0aC1jb21wYXQtd2FybmluZycpO1xuICAgIGlmIChzdWJwYXRoV2FybmluZykge1xuICAgICAgaWYgKFNJVEUucm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnQgPSBhcHBUZW1wbGF0ZS5zdWJwYXRoU3VwcG9ydCB8fCAnc3RyaXAnO1xuICAgICAgICBpZiAoc3VwcG9ydCA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+JiM5ODg4OyA8c3Ryb25nPicgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJzwvc3Ryb25nPiBkb2VzIG5vdCBzdXBwb3J0IHN1YmRpcmVjdG9yeSBtb2RlLiBJdCBtYXkgbm90IHdvcmsgY29ycmVjdGx5IGF0IGEgc3VicGF0aC48L3NwYW4+JztcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0ID09PSAnc3RyaXAnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4mIzk0MzI7ICcgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJyBoYXMgdW52ZXJpZmllZCBzdWJkaXJlY3Rvcnkgc3VwcG9ydC4gSXQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLjwvc3Bhbj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlLXNlbGVjdCBETlMvU1NMIGZyb20gc2l0ZSBjb25maWcgKHNldCBkdXJpbmcgc2V0dXAgd2l6YXJkKVxuICAgIGNvbnN0IGNmZ0Ruc1R5cGUgPSBTSVRFLmRlZmF1bHRzLmRuc1R5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ3B1YmxpYycgOiAncHJpdmF0ZScpO1xuICAgIGNvbnN0IGNmZ1NzbFR5cGUgPSBTSVRFLmRlZmF1bHRzLnNzbFR5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ2xldHNlbmNyeXB0JyA6ICdpbnRlcm5hbCcpO1xuICAgIGNvbnN0IGRuc1JhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdW3ZhbHVlPVwiJHtjZmdEbnNUeXBlfVwiXWApO1xuICAgIGNvbnN0IHNzbFJhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdW3ZhbHVlPVwiJHtjZmdTc2xUeXBlfVwiXWApO1xuICAgIGlmIChkbnNSYWRpbykgZG5zUmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgZWxzZSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl1bdmFsdWU9XCJwcml2YXRlXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaWYgKHNzbFJhZGlvKSBzc2xSYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBlbHNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzc2wtdHlwZVwiXVt2YWx1ZT1cImludGVybmFsXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaXBJbnB1dC52YWx1ZSA9IFNJVEUuZGVmYXVsdHMudGFyZ2V0SVAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgdGFpbHNjYWxlQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgLy8gTW92ZSBETlMvU1NMIGludG8gQWR2YW5jZWQgc2VjdGlvbiB3aGVuIGFscmVhZHkgY29uZmlndXJlZFxuICAgIGNvbnN0IGRuc1NlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwLWRlcGxveS1tb2RhbCAuZmxleC1jb2wtZ2FwJyk/LmNsb3Nlc3QoJ2RpdicpO1xuICAgIGNvbnN0IGFkdmFuY2VkRGV0YWlscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhcHAtZGVwbG95LW1vZGFsIGRldGFpbHMnKTtcbiAgICBjb25zdCBhZHZhbmNlZENvbnRlbnQgPSBhZHZhbmNlZERldGFpbHM/LnF1ZXJ5U2VsZWN0b3IoJ2RpdicpO1xuICAgIGlmIChhZHZhbmNlZERldGFpbHMgJiYgYWR2YW5jZWRDb250ZW50ICYmIChTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAncHVibGljJyB8fCBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAnaG9tZWxhYicpKSB7XG4gICAgICAvLyBNb3ZlIEROUyBhbmQgU1NMIHNlY3Rpb25zIGluc2lkZSBBZHZhbmNlZFxuICAgICAgY29uc3QgZG5zU2VjdGlvbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FwcC1kZXBsb3ktbW9kYWwgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdJylbMF0/LmNsb3Nlc3QoJ2Rpdi5mbGV4LWNvbC1nYXAnKT8ucGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHNzbFNlY3Rpb25FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhcHAtZGVwbG95LW1vZGFsIGlucHV0W25hbWU9XCJzc2wtdHlwZVwiXScpWzBdPy5jbG9zZXN0KCdkaXYuZmxleC1jb2wtZ2FwJyk/LnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAoZG5zU2VjdGlvbkVsICYmICFkbnNTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoZG5zU2VjdGlvbkVsKTtcbiAgICAgICAgZG5zU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgICBpZiAoc3NsU2VjdGlvbkVsICYmICFzc2xTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoc3NsU2VjdGlvbkVsKTtcbiAgICAgICAgc3NsU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG1lZGlhIHBhdGggc2VjdGlvbiBmb3IgbWVkaWEgYXBwc1xuICAgIGNvbnN0IG1lZGlhUGF0aFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWEtcGF0aC1zZWN0aW9uJyk7XG4gICAgY29uc3QgbWVkaWFQYXRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKTtcbiAgICBjb25zdCBtZWRpYVBhdGhEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYS1wYXRoLWRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoYXBwVGVtcGxhdGUubWVkaWFNb3VudCkge1xuICAgICAgbWVkaWFQYXRoU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gJyc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC5wbGFjZWhvbGRlciA9ICcvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93cyBvciBjbGljayBCcm93c2UnO1xuXG4gICAgICAvLyBGZXRjaCBkZXRlY3RlZCBtb3VudHMgZnJvbSBleGlzdGluZyBtZWRpYSBzZXJ2ZXJzXG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRlY3RlZC1tb3VudHMtY29udGFpbmVyJyk7XG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0ZWN0ZWQtbW91bnRzLWxpc3QnKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tZWRpYS9kZXRlY3RlZC1tb3VudHMnKTtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzdWx0ID0gYXdhaXQgbW91bnRzUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGlmIChtb3VudHNSZXN1bHQuc3VjY2VzcyAmJiBtb3VudHNSZXN1bHQubW91bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAvLyBBdXRvLWZpbGwgbWVkaWEgcGF0aCB3aXRoIGFsbCBkZXRlY3RlZCBtb3VudHNcbiAgICAgICAgICBjb25zdCBhdXRvUGF0aHMgPSBbLi4ubmV3IFNldChtb3VudHNSZXN1bHQubW91bnRzLm1hcChtID0+IG0uaG9zdFBhdGgpKV07XG4gICAgICAgICAgbWVkaWFQYXRoSW5wdXQudmFsdWUgPSBhdXRvUGF0aHMuam9pbignLCAnKTtcblxuICAgICAgICAgIG1vdW50c1Jlc3VsdC5tb3VudHMuZm9yRWFjaChtb3VudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYXV0b1BhdGhzLmluY2x1ZGVzKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gYHBhZGRpbmc6IDhweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAke2lzU2VsZWN0ZWQgPyAnNDAlJyA6ICcxNSUnfSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1mZyk7YDtcbiAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChtb3VudC5mb2xkZXJOYW1lKX08L3NwYW4+PGJyPjxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+ZnJvbSAke2VzY2FwZUh0bWwobW91bnQuc291cmNlSW1hZ2UpfTwvc3Bhbj5gO1xuICAgICAgICAgICAgYnRuLnRpdGxlID0gYCR7bW91bnQuaG9zdFBhdGh9IChmcm9tICR7bW91bnQuc291cmNlQ29udGFpbmVyfSlgO1xuICAgICAgICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRocyA9IG1lZGlhUGF0aElucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHAgPT4gcC50cmltKCkpLmZpbHRlcihwID0+IHApO1xuICAgICAgICAgICAgICBjb25zdCBpZHggPSBjdXJyZW50UGF0aHMuaW5kZXhPZihtb3VudC5ob3N0UGF0aCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMTUlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5wdXNoKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgNDAlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gY3VycmVudFBhdGhzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGV0ZWN0ZWRNb3VudHNMaXN0LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGV0ZWN0ZWRNb3VudHNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgYnJvd3NlIGJ1dHRvblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jyb3dzZS1tZWRpYS1idG4nKS5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihtZWRpYVBhdGhJbnB1dCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRpYVBhdGhTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGVjdGVkLW1vdW50cy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNob3cgUGxleCBjbGFpbSB0b2tlbiBzZWN0aW9uIGZvciBQbGV4IGRlcGxveW1lbnRzXG4gICAgY29uc3QgcGxleENsYWltU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGV4LWNsYWltLXNlY3Rpb24nKTtcbiAgICBpZiAocGxleENsYWltU2VjdGlvbikge1xuICAgICAgaWYgKGFwcFRlbXBsYXRlLmlkID09PSAncGxleCcgfHwgYXBwVGVtcGxhdGUuY2xhaW1Ub2tlbikge1xuICAgICAgICBwbGV4Q2xhaW1TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBsZXgtY2xhaW0nKS52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGxleENsYWltU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvcHVsYXRlIHZvbHVtZSBtb3VudHMgaW4gQWR2YW5jZWQgT3B0aW9uc1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm9sdW1lLW1vdW50cy1zZWN0aW9uJyk7XG4gICAgY29uc3Qgdm9sdW1lTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWUtbW91bnRzLWxpc3QnKTtcbiAgICB2b2x1bWVMaXN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgaWYgKGFwcFRlbXBsYXRlLmRvY2tlcj8udm9sdW1lcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtZWRpYUNvbnRhaW5lclBhdGggPSBhcHBUZW1wbGF0ZS5tZWRpYU1vdW50Py5jb250YWluZXJQYXRoO1xuICAgICAgY29uc3Qgbm9uTWVkaWFWb2x1bWVzID0gYXBwVGVtcGxhdGUuZG9ja2VyLnZvbHVtZXMuZmlsdGVyKHYgPT4gIXYuaW5jbHVkZXMoJ3t7TUVESUFfUEFUSH19JykgJiYgIShtZWRpYUNvbnRhaW5lclBhdGggJiYgdi5lbmRzV2l0aCgnOicgKyBtZWRpYUNvbnRhaW5lclBhdGgpKSk7XG5cbiAgICAgIGlmIChub25NZWRpYVZvbHVtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBub25NZWRpYVZvbHVtZXMuZm9yRWFjaCgodm9sLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgW2hvc3REZWZhdWx0LCBjb250YWluZXJQYXRoXSA9IHZvbC5zcGxpdCgnOicpO1xuICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHJvdy5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyc7XG4gICAgICAgICAgcm93LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidm9sLWhvc3QtcGF0aFwiIGRhdGEtY29udGFpbmVyLXBhdGg9XCIke2NvbnRhaW5lclBhdGh9XCIgdmFsdWU9XCIke2hvc3REZWZhdWx0fVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XHUyMTkyICR7Y29udGFpbmVyUGF0aH08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvbC1icm93c2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQzI8L2J1dHRvbj5cbiAgICAgICAgICBgO1xuICAgICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgICAgICByb3cucXVlcnlTZWxlY3RvcignLnZvbC1icm93c2UtYnRuJykub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy52b2wtaG9zdC1wYXRoJyk7XG4gICAgICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihpbnB1dCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBwb3J0IGZyb20gdGVtcGxhdGUgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eVxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgODA4MDtcbiAgICBwb3J0SW5wdXQudmFsdWUgPSAnJztcbiAgICBwb3J0SW5wdXQucGxhY2Vob2xkZXIgPSBgRGVmYXVsdDogJHtkZWZhdWx0UG9ydH1gO1xuXG4gICAgLy8gQWRkIHBvcnQgc3RhdHVzIGVsZW1lbnQgaWYgbm90IGV4aXN0c1xuICAgIGxldCBwb3J0U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0LXN0YXR1cycpO1xuICAgIGlmICghcG9ydFN0YXR1cykge1xuICAgICAgcG9ydFN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcG9ydFN0YXR1cy5pZCA9ICdkZXBsb3ktcG9ydC1zdGF0dXMnO1xuICAgICAgcG9ydFN0YXR1cy5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTogMC44cmVtOyBtYXJnaW4tdG9wOiA0cHg7JztcbiAgICAgIHBvcnRJbnB1dC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHBvcnRTdGF0dXMpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGRlZmF1bHQgcG9ydCBhdmFpbGFiaWxpdHlcbiAgICBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVBvcnRTdGF0dXMoKSB7XG4gICAgICBjb25zdCBwb3J0VG9DaGVjayA9IHBvcnRJbnB1dC52YWx1ZSB8fCBkZWZhdWx0UG9ydDtcbiAgICAgIHBvcnRTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBwb3J0Li4uPC9zcGFuPic7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrUG9ydEF2YWlsYWJpbGl0eShwb3J0VG9DaGVjayk7XG4gICAgICBpZiAocmVzdWx0LmF2YWlsYWJsZSkge1xuICAgICAgICBwb3J0U3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPlBvcnQgJHtlc2NhcGVIdG1sKFN0cmluZyhwb3J0VG9DaGVjaykpfSBpcyBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZFBvcnQgPSBhd2FpdCBnZXRTdWdnZXN0ZWRQb3J0KGRlZmF1bHRQb3J0KTtcbiAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2U3NGMzYztcIj5Qb3J0ICR7ZXNjYXBlSHRtbChwb3J0VG9DaGVjayl9IGluIHVzZSBieSAke2VzY2FwZUh0bWwocmVzdWx0LmNvbmZsaWN0Py51c2VkQnkgfHwgJ3Vua25vd24nKX08L3NwYW4+XG4gICAgICAgIGA7XG4gICAgICAgIGNvbnN0IHVzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICB1c2VCdG4udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB1c2VCdG4udGV4dENvbnRlbnQgPSBgVXNlICR7c3VnZ2VzdGVkUG9ydH1gO1xuICAgICAgICB1c2VCdG4uc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogOHB4OyBwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgICB1c2VCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKS52YWx1ZSA9IHN1Z2dlc3RlZFBvcnQ7XG4gICAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzRjYWY1MDtcIj5Vc2luZyBzdWdnZXN0ZWQgcG9ydCAke2VzY2FwZUh0bWwoU3RyaW5nKHN1Z2dlc3RlZFBvcnQpKX08L3NwYW4+YDtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydFN0YXR1cy5hcHBlbmRDaGlsZCh1c2VCdG4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgb24gaW5wdXQgY2hhbmdlIChkZWJvdW5jZWQpXG4gICAgbGV0IHBvcnRDaGVja1RpbWVvdXQ7XG4gICAgcG9ydElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dChwb3J0Q2hlY2tUaW1lb3V0KTtcbiAgICAgIHBvcnRDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cywgNTAwKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBwb3J0IGNoZWNrXG4gICAgY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzKCk7XG5cbiAgICAvLyBGZXRjaCBUYWlsc2NhbGUgc3RhdHVzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGFpbHNjYWxlL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5pbnN0YWxsZWQgJiYgZGF0YS5jb25uZWN0ZWQpIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPkNvbm5lY3RlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7XCI+JHtkYXRhLnNlbGY/Lmhvc3RuYW1lfSAoJHtkYXRhLnNlbGY/LmlwfSk8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogOHB4O1wiPnwgJHtkYXRhLmRldmljZUNvdW50fSBkZXZpY2VzPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+Tm90IGNvbm5lY3RlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm90IGF2YWlsYWJsZTwvc3Bhbj5gO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q291bGQgbm90IGNoZWNrIHN0YXR1czwvc3Bhbj5gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVUkwgcHJldmlldyBpbiByZWFsLXRpbWVcbiAgICBmdW5jdGlvbiB1cGRhdGVVcmxQcmV2aWV3KCkge1xuICAgICAgY29uc3Qgc3ViZG9tYWluID0gc3ViZG9tYWluSW5wdXQudmFsdWUgfHwgJ3N1YmRvbWFpbic7XG4gICAgICBjb25zdCBkbnNUeXBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImRucy10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZTtcbiAgICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlO1xuXG4gICAgICBsZXQgdXJsID0gJyc7XG4gICAgICBpZiAoU0lURS5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgJiYgU0lURS5kb21haW4pIHtcbiAgICAgICAgLy8gU3ViZGlyZWN0b3J5IG1vZGU6IGRvbWFpbi5jb20vYXBwXG4gICAgICAgIHVybCA9IGBodHRwczovLyR7U0lURS5kb21haW59LyR7c3ViZG9tYWlufWA7XG4gICAgICB9IGVsc2UgaWYgKGRuc1R5cGUgPT09ICdwcml2YXRlJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIHVybCA9IGAke3Byb3RvY29sfTovLyR7YnVpbGREb21haW4oc3ViZG9tYWluKX1gO1xuICAgICAgfSBlbHNlIGlmIChkbnNUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IFNJVEUuZG9tYWluIHx8IHN1YmRvbWFpbjtcbiAgICAgICAgdXJsID0gU0lURS5kb21haW4gPyBgJHtwcm90b2NvbH06Ly8ke3N1YmRvbWFpbn0uJHtTSVRFLmRvbWFpbn1gIDogYCR7cHJvdG9jb2x9Oi8vJHtzdWJkb21haW59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwb3J0SW5wdXQudmFsdWUgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgICAgICB1cmwgPSBgaHR0cDovLyR7aXBJbnB1dC52YWx1ZX06JHtwb3J0fWA7XG4gICAgICB9XG4gICAgICB1cmxQcmV2aWV3LnRleHRDb250ZW50ID0gdXJsO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBsaXN0ZW5lcnNcbiAgICBzdWJkb21haW5JbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBpcElucHV0Lm9uaW5wdXQgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIHBvcnRJbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcblxuICAgIHVwZGF0ZVVybFByZXZpZXcoKTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3Rvciwgb3BlbiBkZXBsb3kgY29uZmlnXG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGRlcGxveU1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIFN0b3JlIGFwcCB0ZW1wbGF0ZSBmb3IgZGVwbG95bWVudFxuICAgIGRlcGxveU1vZGFsLmRhdGFzZXQuYXBwVGVtcGxhdGUgPSBKU09OLnN0cmluZ2lmeShhcHBUZW1wbGF0ZSk7XG4gIH1cblxuICAvLyBBZGQgYXBwIHRvIGdyaWQgd2l0aCBmdWxsIERvY2tlciBkZXBsb3ltZW50XG4gIGFzeW5jIGZ1bmN0aW9uIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpIHtcbiAgICBjb25zdCBhcHBUZW1wbGF0ZSA9IGRlcGxveUNvbmZpZy5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBjdXN0b21BcHBzID0gc2FmZUdldEpTT04oQVBQU19LRVksIFtdKTtcblxuICAgIC8vIENoZWNrIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lclxuICAgIGNvbnN0IHVzaW5nRXhpc3RpbmcgPSBhcHBUZW1wbGF0ZS5fdXNlRXhpc3RpbmcgJiYgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuXG4gICAgLy8gQ2hlY2sgaWYgYXBwIGFscmVhZHkgZXhpc3RzIC0gc2tpcCBpZiB1c2luZyBleGlzdGluZyBjb250YWluZXIgKHVzZXIgYWxyZWFkeSBjb25maXJtZWQpXG4gICAgY29uc3QgZXhpc3RpbmdBcHAgPSBjdXN0b21BcHBzLmZpbmQoYSA9PiBhLmlkID09PSBkZXBsb3lDb25maWcuc3ViZG9tYWluKTtcbiAgICBpZiAoZXhpc3RpbmdBcHAgJiYgIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oYEFuIGFwcCB3aXRoIHN1YmRvbWFpbiBcIiR7ZGVwbG95Q29uZmlnLnN1YmRvbWFpbn1cIiBhbHJlYWR5IGV4aXN0cy4gUmVkZXBsb3k/YCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbFN0b3JhZ2UgdG8gYWxsb3cgcmVkZXBsb3ltZW50L3VwZGF0ZVxuICAgIGlmIChleGlzdGluZ0FwcCkge1xuICAgICAgY29uc3QgaW5kZXggPSBjdXN0b21BcHBzLmluZGV4T2YoZXhpc3RpbmdBcHApO1xuICAgICAgY3VzdG9tQXBwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgYXZhaWxhYmlsaXR5IGJlZm9yZSBkZXBsb3ltZW50IChza2lwIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lcilcbiAgICBpZiAoIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IHBvcnRUb1VzZSA9IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IDgwODA7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBDaGVja2luZyBwb3J0ICR7cG9ydFRvVXNlfSBhdmFpbGFiaWxpdHkuLi5gLCAnaW5mbycsIDApO1xuXG4gICAgICBjb25zdCBwb3J0Q2hlY2sgPSBhd2FpdCBjaGVja1BvcnRBdmFpbGFiaWxpdHkocG9ydFRvVXNlKTtcbiAgICAgIGlmICghcG9ydENoZWNrLmF2YWlsYWJsZSkge1xuICAgICAgICBjb25zdCBzdWdnZXN0ZWRQb3J0ID0gYXdhaXQgZ2V0U3VnZ2VzdGVkUG9ydChhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCA4MDgwKTtcbiAgICAgICAgY29uc3QgdXNlQWx0ZXJuYXRlID0gY29uZmlybShcbiAgICAgICAgICBgUG9ydCAke3BvcnRUb1VzZX0gaXMgYWxyZWFkeSBpbiB1c2UgYnkgJHtwb3J0Q2hlY2suY29uZmxpY3Q/LnVzZWRCeSB8fCAnYW5vdGhlciBjb250YWluZXInfS5cXG5cXG5gICtcbiAgICAgICAgICBgV291bGQgeW91IGxpa2UgdG8gdXNlIHBvcnQgJHtzdWdnZXN0ZWRQb3J0fSBpbnN0ZWFkP2BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVzZUFsdGVybmF0ZSkge1xuICAgICAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gc3VnZ2VzdGVkUG9ydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZXBsb3ltZW50IGNhbmNlbGxlZCAtIHBvcnQgY29uZmxpY3QnLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIGNvbnRhaW5lcidzIHBvcnRcbiAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLnByaW1hcnlQb3J0O1xuICAgIH1cbiAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgdXNpbmdFeGlzdGluZ1xuICAgICAgICA/IGBDb25maWd1cmluZyAke2FwcFRlbXBsYXRlLm5hbWV9IHdpdGggZXhpc3RpbmcgY29udGFpbmVyLi4uYFxuICAgICAgICA6IGBEZXBsb3lpbmcgJHthcHBUZW1wbGF0ZS5uYW1lfS4uLmAsXG4gICAgICAnaW5mbycsIDBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFByZXBhcmUgZGVwbG95bWVudCBjb25maWcgZnJvbSB1c2VyJ3MgY2hvaWNlc1xuICAgICAgY29uc3QgYXBpRGVwbG95Q29uZmlnID0ge1xuICAgICAgICBhcHBJZDogYXBwVGVtcGxhdGUuaWQsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIHN1YmRvbWFpbjogZGVwbG95Q29uZmlnLnN1YmRvbWFpbixcbiAgICAgICAgICBpcDogZGVwbG95Q29uZmlnLmlwLFxuICAgICAgICAgIGNyZWF0ZURuczogZGVwbG95Q29uZmlnLmRuc1R5cGUgPT09ICdwcml2YXRlJywgIC8vIE9ubHkgY3JlYXRlIEROUyBmb3IgcHJpdmF0ZVxuICAgICAgICAgIHBvcnQ6IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IG51bGwsICAvLyBVc2UgY3VzdG9tLCB0ZW1wbGF0ZSBkZWZhdWx0LCBvciBudWxsXG4gICAgICAgICAgc3NsVHlwZTogZGVwbG95Q29uZmlnLnNzbFR5cGUsXG4gICAgICAgICAgZG5zVHlwZTogZGVwbG95Q29uZmlnLmRuc1R5cGUsXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UsICAvLyBUYWlsc2NhbGUtb25seSBhY2Nlc3MgcmVzdHJpY3Rpb25cbiAgICAgICAgICBtZWRpYVBhdGg6IGRlcGxveUNvbmZpZy5tZWRpYVBhdGggfHwgbnVsbCwgIC8vIE1lZGlhIGZvbGRlciBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgICAgICAgcGxleENsYWltVG9rZW46IGRlcGxveUNvbmZpZy5wbGV4Q2xhaW1Ub2tlbiB8fCBudWxsLCAgLy8gUGxleCBjbGFpbSB0b2tlbiBmb3IgYXV0by1jbGFpbVxuICAgICAgICAgIGN1c3RvbVZvbHVtZXM6IGRlcGxveUNvbmZpZy5jdXN0b21Wb2x1bWVzIHx8IG51bGwgIC8vIEN1c3RvbSB2b2x1bWUgbW91bnQgb3ZlcnJpZGVzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBleGlzdGluZyBjb250YWluZXIgaW5mbyBpZiB1c2luZyBleGlzdGluZ1xuICAgICAgaWYgKHVzaW5nRXhpc3RpbmcpIHtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy51c2VFeGlzdGluZyA9IHRydWU7XG4gICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcuZXhpc3RpbmdDb250YWluZXJJZCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5pZDtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy5leGlzdGluZ1BvcnQgPSBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIucHJpbWFyeVBvcnQ7XG4gICAgICAgIC8vIFVzZSBleGlzdGluZyBjb250YWluZXIncyBwb3J0IGlmIG5vIGN1c3RvbSBwb3J0IHNwZWNpZmllZFxuICAgICAgICBpZiAoIWRlcGxveUNvbmZpZy5wb3J0ICYmIGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydCkge1xuICAgICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcucG9ydCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGRlcGxveW1lbnQgQVBJXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGFwaURlcGxveUNvbmZpZylcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBBZGQgdG8gc2F2ZWQgYXBwcyAoc3RvcmUgSVAgZm9yIGxhdGVyIGRlbGV0aW9uKVxuICAgICAgICBjb25zdCBuZXdBcHAgPSB7XG4gICAgICAgICAgaWQ6IGRlcGxveUNvbmZpZy5zdWJkb21haW4sICAvLyBVc2Ugc3ViZG9tYWluIGFzIElEXG4gICAgICAgICAgbmFtZTogYXBwVGVtcGxhdGUubmFtZSxcbiAgICAgICAgICBsb2dvOiBgL2Fzc2V0cy8ke2FwcFRlbXBsYXRlLmlkfS5wbmdgLFxuICAgICAgICAgIGNvbnRhaW5lcklkOiByZXN1bHQuY29udGFpbmVySWQsXG4gICAgICAgICAgdXJsOiByZXN1bHQudXJsLFxuICAgICAgICAgIGlwOiBkZXBsb3lDb25maWcuaXAsICAvLyBTdG9yZSBJUCBmb3IgRE5TIHJlY29yZCBkZWxldGlvblxuICAgICAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZS5pZCwgIC8vIFN0b3JlIG9yaWdpbmFsIHRlbXBsYXRlIElEXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UgIC8vIFRhaWxzY2FsZSBwcm90ZWN0aW9uIHN0YXR1c1xuICAgICAgICB9O1xuICAgICAgICBjdXN0b21BcHBzLnB1c2gobmV3QXBwKTtcbiAgICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuXG4gICAgICAgIC8vIEFkZCB0byBBUFBTIGFycmF5IGFuZCByZWJ1aWxkIGdyaWRcbiAgICAgICAgLy8gQWNjZXNzIEFQUFMgZnJvbSBwYXJlbnQgc2NvcGUgdmlhIHdpbmRvd1xuICAgICAgICBpZiAod2luZG93LkFQUFMgJiYgIXdpbmRvdy5BUFBTLnNvbWUoYSA9PiBhLmlkID09PSBhcHBUZW1wbGF0ZS5pZCkpIHtcbiAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKG5ld0FwcCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB3aW5kb3cuYnVpbGRHcmlkKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlZnJlc2hBbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gd2luZG93LnJlZnJlc2hBbGwoKSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG93IHN1Y2Nlc3Mgd2l0aCBVUkwgKGFuZCB3YXJuaW5nIGlmIEROUyBmYWlsZWQpXG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVzdWx0LnVzZWRFeGlzdGluZ1xuICAgICAgICAgID8gYCR7YXBwVGVtcGxhdGUubmFtZX0gY29uZmlndXJlZCB3aXRoIGV4aXN0aW5nIGNvbnRhaW5lciFcXG5VUkw6ICR7cmVzdWx0LnVybH1gXG4gICAgICAgICAgOiBgJHthcHBUZW1wbGF0ZS5uYW1lfSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhXFxuVVJMOiAke3Jlc3VsdC51cmx9YDtcbiAgICAgICAgaWYgKHJlc3VsdC53YXJuaW5nKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuXFxuXHUyNkEwIFdhcm5pbmc6ICR7cmVzdWx0Lndhcm5pbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dOb3RpZmljYXRpb24obWVzc2FnZSwgJ3N1Y2Nlc3MnLCA4MDAwKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCB0ZW1wb3JhcnkgcHJvcGVydGllc1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nO1xuICAgICAgICBkZWxldGUgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIEhUVFBTIFVSTHMsIGNoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXNcbiAgICAgICAgaWYgKHJlc3VsdC51cmwgJiYgcmVzdWx0LnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICAgICAgY2hlY2tTU0xDZXJ0aWZpY2F0ZShyZXN1bHQudXJsLCBhcHBUZW1wbGF0ZS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNob3cgc2V0dXAgaW5zdHJ1Y3Rpb25zIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAocmVzdWx0LnNldHVwSW5zdHJ1Y3Rpb25zICYmIHJlc3VsdC5zZXR1cEluc3RydWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSByZXN1bHQuc2V0dXBJbnN0cnVjdGlvbnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBTZXR1cCBJbnN0cnVjdGlvbnMgZm9yICR7YXBwVGVtcGxhdGUubmFtZX06ICR7aW5zdHJ1Y3Rpb25zfWAsICdpbmZvJywgMTAwMDApO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yIHx8ICdEZXBsb3ltZW50IGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRGVwbG95bWVudCcsIGVycm9yLCB7IGZ1bmN0aW9uOiAnZGVwbG95JyB9KTtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oXG4gICAgICAgIGBGYWlsZWQgdG8gZGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAnZXJyb3InLFxuICAgICAgICA4MDAwXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIFNTTCBjZXJ0aWZpY2F0ZSBzdGF0dXMgYW5kIG5vdGlmeSB3aGVuIHJlYWR5XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrU1NMQ2VydGlmaWNhdGUodXJsLCBhcHBOYW1lKSB7XG4gICAgc2hvd05vdGlmaWNhdGlvbihgXHUyM0YzIEdlbmVyYXRpbmcgU1NMIGNlcnRpZmljYXRlIGZvciAke2FwcE5hbWV9Li4uYCwgJ3dhcm5pbmcnLCA2MDAwMCk7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IDEyOyAvLyA2MCBzZWNvbmRzIHRvdGFsICg1IHNlY29uZCBpbnRlcnZhbHMpXG4gICAgXG4gICAgY29uc3QgY2hlY2tDZXJ0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgYXR0ZW1wdHMrKztcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGZldGNoIHRoZSBVUkwgLSBpZiBTU0wgd29ya3MsIHRoaXMgd2lsbCBzdWNjZWVkXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IFxuICAgICAgICAgIG1ldGhvZDogJ0hFQUQnLFxuICAgICAgICAgIG1vZGU6ICduby1jb3JzJyAvLyBBdm9pZCBDT1JTIGlzc3Vlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBTU0wgaXMgd29ya2luZ1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBcdTI3MDUgJHthcHBOYW1lfSBpcyByZWFkeSEgU1NMIGNlcnRpZmljYXRlIGdlbmVyYXRlZC5gLCAnc3VjY2VzcycsIDUwMDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNTTCBub3QgcmVhZHkgeWV0XG4gICAgICAgIGlmIChhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgc2V0VGltZW91dChjaGVja0NlcnQsIDUwMDApOyAvLyBDaGVjayBhZ2FpbiBpbiA1IHNlY29uZHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICAgICAgYFx1MjZBMFx1RkUwRiAke2FwcE5hbWV9IGRlcGxveWVkIGJ1dCBTU0wgY2VydGlmaWNhdGUgbWF5IHN0aWxsIGJlIGdlbmVyYXRpbmcuXFxuVHJ5IHJlZnJlc2hpbmcgaW4gYSBtb21lbnQgaWYgeW91IHNlZSBhIGNlcnRpZmljYXRlIGVycm9yLmAsXG4gICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAxMDAwMFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RhcnQgY2hlY2tpbmcgYWZ0ZXIgMyBzZWNvbmRzIChnaXZlIENhZGR5IHRpbWUgdG8gc3RhcnQpXG4gICAgc2V0VGltZW91dChjaGVja0NlcnQsIDMwMDApO1xuICB9XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBzdGFydHVwXG4gIGZ1bmN0aW9uIGxvYWRDdXN0b21BcHBzKCkge1xuICAgIGNvbnN0IGN1c3RvbUFwcHMgPSBzYWZlR2V0SlNPTihBUFBTX0tFWSwgW10pO1xuICAgIGN1c3RvbUFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgaWYgKCF3aW5kb3cuQVBQUy5zb21lKGEgPT4gYS5pZCA9PT0gYXBwLmlkKSkge1xuICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKGFwcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zZXJ2aWNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBidWlsZEFwcFNlbGVjdG9yKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItY2FuY2VsJykpO1xuXG4gIC8vIERlcGxveSBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgZGVwbG95TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLWRlcGxveS1tb2RhbCcpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkZXBsb3lNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNvbmZpcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgLy8gR2V0IHVzZXIgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFwcFRlbXBsYXRlID0gSlNPTi5wYXJzZShkZXBsb3lNb2RhbC5kYXRhc2V0LmFwcFRlbXBsYXRlKTtcbiAgICBjb25zdCBtZWRpYVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKS52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBDb2xsZWN0IGN1c3RvbSB2b2x1bWUgb3ZlcnJpZGVzXG4gICAgY29uc3QgY3VzdG9tVm9sdW1lcyA9IFtdO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN2b2x1bWUtbW91bnRzLWxpc3QgLnZvbC1ob3N0LXBhdGgnKS5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGN1c3RvbVZvbHVtZXMucHVzaCh7IGhvc3RQYXRoOiBpbnB1dC52YWx1ZS50cmltKCksIGNvbnRhaW5lclBhdGg6IGlucHV0LmRhdGFzZXQuY29udGFpbmVyUGF0aCB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlcGxveUNvbmZpZyA9IHtcbiAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZSxcbiAgICAgIHN1YmRvbWFpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1zdWJkb21haW4nKS52YWx1ZS50cmltKCksXG4gICAgICBkbnNUeXBlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlLFxuICAgICAgc3NsVHlwZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZSxcbiAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LWlwJykudmFsdWUudHJpbSgpLFxuICAgICAgcG9ydDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0JykudmFsdWUudHJpbSgpLFxuICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS10YWlsc2NhbGUtb25seScpLmNoZWNrZWQsXG4gICAgICBtZWRpYVBhdGg6IG1lZGlhUGF0aCB8fCBudWxsLFxuICAgICAgcGxleENsYWltVG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcGxleC1jbGFpbScpPy52YWx1ZS50cmltKCkgfHwgbnVsbCxcbiAgICAgIGN1c3RvbVZvbHVtZXM6IGN1c3RvbVZvbHVtZXMubGVuZ3RoID4gMCA/IGN1c3RvbVZvbHVtZXMgOiBudWxsLFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIGNwdXM6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1jcHUtbGltaXQnKS52YWx1ZSkgfHwgMCxcbiAgICAgICAgbWVtb3J5OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktbWVtb3J5LWxpbWl0JykudmFsdWUpIHx8IDAsXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFZhbGlkYXRlIHN1YmRvbWFpblxuICAgIGlmICghZGVwbG95Q29uZmlnLnN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgc3ViZG9tYWluIG9yIGRvbWFpbiBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZWRpYSBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgaWYgKGFwcFRlbXBsYXRlLm1lZGlhTW91bnQ/LnJlcXVpcmVkICYmICFtZWRpYVBhdGgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIG1lZGlhIGxpYnJhcnkgcGF0aCBmb3IgdGhpcyBhcHBsaWNhdGlvbicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgZGVwbG95IG1vZGFsXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgLy8gU3RhcnQgZGVwbG95bWVudFxuICAgIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpO1xuICB9KTtcblxuICB3aXJlTW9kYWwoZGVwbG95TW9kYWwpO1xuXG4gIC8vID09PT09IEZPTERFUiBCUk9XU0VSIEZVTkNUSU9OQUxJVFkgPT09PT1cbiAgY29uc3QgZm9sZGVyQnJvd3Nlck1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLW1vZGFsJyk7XG4gIGNvbnN0IGZvbGRlckJyb3dzZXJQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLXBhdGgnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3Nlckxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItbGlzdCcpO1xuICBjb25zdCBmb2xkZXJCcm93c2VyU2VsZWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWQnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1zZWxlY3RlZC1saXN0Jyk7XG4gIGxldCBjdXJyZW50QnJvd3NlclBhdGggPSAnJztcbiAgbGV0IHNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICBsZXQgdGFyZ2V0TWVkaWFJbnB1dCA9IG51bGw7XG5cbiAgd2luZG93Lm9wZW5Gb2xkZXJCcm93c2VyID0gZnVuY3Rpb24obWVkaWFJbnB1dCkge1xuICAgIHRhcmdldE1lZGlhSW5wdXQgPSBtZWRpYUlucHV0O1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IG1lZGlhSW5wdXQudmFsdWUuc3BsaXQoJywnKS5tYXAocCA9PiBwLnRyaW0oKSkuZmlsdGVyKHAgPT4gcCk7XG4gICAgY3VycmVudEJyb3dzZXJQYXRoID0gJyc7XG4gICAgdXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSgpO1xuICAgIGxvYWRGb2xkZXJDb250ZW50cygnJyk7XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkRm9sZGVyQ29udGVudHMocGF0aCkge1xuICAgIGZvbGRlckJyb3dzZXJQYXRoLnRleHRDb250ZW50ID0gcGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYnJvd3NlL2RpcmVjdG9yaWVzP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEJyb3dzZXJQYXRoID0gcmVzdWx0LnBhdGggfHwgJyc7XG4gICAgICBmb2xkZXJCcm93c2VyUGF0aC50ZXh0Q29udGVudCA9IGN1cnJlbnRCcm93c2VyUGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAvLyBBZGQgcGFyZW50IGZvbGRlciBuYXZpZ2F0aW9uXG4gICAgICBpZiAocmVzdWx0LnBhcmVudCAmJiByZXN1bHQucGFyZW50ICE9PSByZXN1bHQucGF0aCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwocmVzdWx0LnBhcmVudCl9XCIgc3R5bGU9XCJwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPlx1MkIwNlx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Li4gUGFyZW50IERpcmVjdG9yeTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGZvbGRlcnNcbiAgICAgIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwICYmICFyZXN1bHQucGFyZW50KSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gYnJvd3NlYWJsZSBkcml2ZXMgY29uZmlndXJlZC4gQ2hlY2sgeW91ciBkb2NrZXItY29tcG9zZS55bWwgdm9sdW1lIG1vdW50cy48L2Rpdj4nO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gc3ViZm9sZGVycyBmb3VuZDwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBpY29uID0gaXRlbS50eXBlID09PSAnZHJpdmUnID8gJ1x1RDgzRFx1RENCRScgOiAnXHVEODNEXHVEQ0MxJztcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRGb2xkZXJzLmluY2x1ZGVzKGl0ZW0ucGF0aCk7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdHlsZSA9IGlzU2VsZWN0ZWQgPyAnYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDIwJSwgdHJhbnNwYXJlbnQpOycgOiAnJztcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwoaXRlbS5wYXRoKX1cIiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyAke3NlbGVjdGVkU3R5bGV9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+JHtlc2NhcGVIdG1sKGl0ZW0ubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgJHtpc1NlbGVjdGVkID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPlx1MjcxMzwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIEFkZCBjbGljayBoYW5kbGVyc1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QucXVlcnlTZWxlY3RvckFsbCgnLmZvbGRlci1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBsb2FkRm9sZGVyQ29udGVudHMoaXRlbS5kYXRhc2V0LnBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1jYXJkLWJnKSc7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkRm9sZGVycy5pbmNsdWRlcyhpdGVtLmRhdGFzZXQucGF0aCk7XG4gICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gaXNTZWxlY3RlZCA/ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCknIDogJyc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RmFpbGVkIHRvIGxvYWQ6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKSB7XG4gICAgaWYgKHNlbGVjdGVkRm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvbGRlckJyb3dzZXJTZWxlY3RlZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb2xkZXJCcm93c2VyU2VsZWN0ZWQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdC5pbm5lckhUTUwgPSBzZWxlY3RlZEZvbGRlcnMubWFwKHBhdGggPT4gYFxuICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA0cHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4O1wiPlxuICAgICAgICAke2VzY2FwZUh0bWwocGF0aCl9XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJyZW1vdmVTZWxlY3RlZEZvbGRlcignJHtlc2NhcGVIdG1sKHBhdGgpfScpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWVycm9yKTsgZm9udC1zaXplOiAxcmVtOyBwYWRkaW5nOiAwO1wiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIGApLmpvaW4oJycpO1xuICB9XG5cbiAgd2luZG93LnJlbW92ZVNlbGVjdGVkRm9sZGVyID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IHNlbGVjdGVkRm9sZGVycy5maWx0ZXIocCA9PiBwICE9PSBwYXRoKTtcbiAgICB1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5KCk7XG4gICAgbG9hZEZvbGRlckNvbnRlbnRzKGN1cnJlbnRCcm93c2VyUGF0aCk7IC8vIFJlZnJlc2ggdG8gdXBkYXRlIGNoZWNrbWFya3NcbiAgfTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0LWN1cnJlbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY3VycmVudEJyb3dzZXJQYXRoICYmICFzZWxlY3RlZEZvbGRlcnMuaW5jbHVkZXMoY3VycmVudEJyb3dzZXJQYXRoKSkge1xuICAgICAgc2VsZWN0ZWRGb2xkZXJzLnB1c2goY3VycmVudEJyb3dzZXJQYXRoKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKTtcbiAgICAgIGxvYWRGb2xkZXJDb250ZW50cyhjdXJyZW50QnJvd3NlclBhdGgpOyAvLyBSZWZyZXNoIHRvIHNob3cgY2hlY2ttYXJrXG4gICAgfVxuICB9KTtcblxuICB3aXJlTW9kYWwoZm9sZGVyQnJvd3Nlck1vZGFsLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItY2FuY2VsJykpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1kb25lJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKHRhcmdldE1lZGlhSW5wdXQpIHtcbiAgICAgIHRhcmdldE1lZGlhSW5wdXQudmFsdWUgPSBzZWxlY3RlZEZvbGRlcnMuam9pbignLCAnKTtcbiAgICB9XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBwYWdlIGxvYWRcbiAgbG9hZEN1c3RvbUFwcHMoKTtcbn0pKCk7XG47XG4vLyBSZWNpcGUgU3lzdGVtIFx1MjAxNCBtdWx0aS1jb250YWluZXIgc3RhY2sgZGVwbG95bWVudFxuKGZ1bmN0aW9uKCkge1xuICAvLyA9PT0gUkVDSVBFIERFUExPWSBXSVpBUkQgTU9EQUwgPT09XG4gIGluamVjdE1vZGFsKCdyZWNpcGUtZGVwbG95LW1vZGFsJywgYDxkaXYgaWQ9XCJyZWNpcGUtZGVwbG95LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2MjBweDsgbWF4LXdpZHRoOiA3NDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInJlY2lwZS1kZXBsb3ktdGl0bGVcIj5EZXBsb3kgUmVjaXBlPC9oMz5cblxuICAgICAgPCEtLSBTdGVwIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcHNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW46IDE2cHggMCAyNHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXAgYWN0aXZlXCIgZGF0YS1zdGVwPVwiMVwiPjxzcGFuPjE8L3NwYW4+IENvbXBvbmVudHM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiMlwiPjxzcGFuPjI8L3NwYW4+IENvbmZpZ3VyYXRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiM1wiPjxzcGFuPjM8L3NwYW4+IFJldmlldzwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXBcIiBkYXRhLXN0ZXA9XCI0XCI+PHNwYW4+NDwvc3Bhbj4gUHJvZ3Jlc3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMTogQ29tcG9uZW50IFNlbGVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0xXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlbGVjdCBDb21wb25lbnRzOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtY29tcG9uZW50LWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAyOiBTaGFyZWQgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0yXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxNnB4O1wiPlxuICAgICAgICAgIDwhLS0gU2hhcmVkIHZvbHVtZXMgLS0+XG4gICAgICAgICAgPGRpdiBpZD1cInJlY2lwZS12b2x1bWVzLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+U2hhcmVkIFZvbHVtZXM6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtdm9sdW1lLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUaW1lem9uZSAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5UaW1lem9uZTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJyZWNpcGUtdGltZXpvbmVcIiB2YWx1ZT1cIlVUQ1wiIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWVyaWNhL05ld19Zb3JrXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFyZ2V0IElQIC0tPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlRhcmdldCBJUCBBZGRyZXNzOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInJlY2lwZS1pcFwiIHZhbHVlPVwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIiBwbGFjZWhvbGRlcj1cImxvY2FsaG9zdCBvciBJUFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+SVAgd2hlcmUgY29udGFpbmVycyBleHBvc2UgcG9ydHM8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFpbHNjYWxlIC0tPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJyZWNpcGUtdGFpbHNjYWxlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlJlc3RyaWN0IHRvIFRhaWxzY2FsZSBuZXR3b3JrIG9ubHk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDM6IFJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0zXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwicmVjaXBlLXJldmlldy1jb250ZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTsgbGluZS1oZWlnaHQ6IDEuNztcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgNDogUHJvZ3Jlc3MgLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtNFwiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1wcm9ncmVzcy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1kZXBsb3ktcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1wcmV2XCIgY2xhc3M9XCJidG4tYWNjZW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+QmFjazwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVjaXBlLW5leHRcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5OZXh0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgLy8gPT09IFNUQVRFID09PVxuICBsZXQgcmVjaXBlVGVtcGxhdGVzID0gbnVsbDtcbiAgbGV0IHJlY2lwZUNhdGVnb3JpZXMgPSBudWxsO1xuICBsZXQgY3VycmVudFJlY2lwZSA9IG51bGw7XG4gIGxldCBjdXJyZW50U3RlcCA9IDE7XG4gIGxldCBpc1ByZW1pdW0gPSBmYWxzZTtcblxuICBjb25zdCBkZXBsb3lNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtZGVwbG95LW1vZGFsJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtY2FuY2VsJyk7XG4gIGNvbnN0IHByZXZCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXByZXYnKTtcbiAgY29uc3QgbmV4dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtbmV4dCcpO1xuXG4gIHdpcmVNb2RhbChkZXBsb3lNb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyA9PT0gRkVUQ0ggUkVDSVBFIFRFTVBMQVRFUyA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNpcGVUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9yZWNpcGVzL3RlbXBsYXRlcycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICByZWNpcGVUZW1wbGF0ZXMgPSBkYXRhLnRlbXBsYXRlcztcbiAgICAgICAgcmVjaXBlQ2F0ZWdvcmllcyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBQcmVtaXVtIHJlcXVpcmVkIFx1MjAxNCB0ZW1wbGF0ZXMgQVBJIGdhdGVkXG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIHJlY2lwZSB0ZW1wbGF0ZXM6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gPT09IENIRUNLIFBSRU1JVU0gPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVjaXBlUHJlbWl1bSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS9yZWNpcGVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpc1ByZW1pdW0gPSBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlzUHJlbWl1bSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNQcmVtaXVtO1xuICB9XG5cbiAgLy8gPT09IFJFTkRFUiBSRUNJUEUgQ0FSRFMgSU5UTyBBUFAgU0VMRUNUT1IgPT09XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHAgc2VsZWN0b3IgdG8gaW5qZWN0IHJlY2lwZSBjYXJkc1xuICB3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMgPSBhc3luYyBmdW5jdGlvbihncmlkKSB7XG4gICAgYXdhaXQgY2hlY2tSZWNpcGVQcmVtaXVtKCk7XG5cbiAgICAvLyBCdWlsZCByZWNpcGUgZGF0YSBcdTIwMTQgd2UgY2FuIHNob3cgY2FyZCBtZXRhZGF0YSBldmVuIHdpdGhvdXQgcHJlbWl1bVxuICAgIC8vIChjYXJkcyBqdXN0IHNob3cgYSBsb2NrIGFuZCBwcm9tcHQgdG8gdXBncmFkZSlcbiAgICBsZXQgcmVjaXBlcztcbiAgICBpZiAoaXNQcmVtaXVtICYmIHJlY2lwZVRlbXBsYXRlcykge1xuICAgICAgcmVjaXBlcyA9IHJlY2lwZVRlbXBsYXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2hvdyBoYXJkY29kZWQgcHJldmlldyBjYXJkcyB3aGVuIG5vdCBwcmVtaXVtXG4gICAgICByZWNpcGVzID0gZ2V0UHJldmlld1JlY2lwZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlY2lwZXMgfHwgcmVjaXBlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIENhdGVnb3J5IGhlYWRlclxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgaGVhZGVyLmlubmVySFRNTCA9IGBcXHVEODNFXFx1RERFQSBSZWNpcGVzYDtcbiAgICBoZWFkZXIuc3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSAnIzhlNDRhZCc7XG4gICAgZ3JpZC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuXG4gICAgY29uc3QgcmVjaXBlTGlzdCA9IEFycmF5LmlzQXJyYXkocmVjaXBlcykgPyByZWNpcGVzIDogT2JqZWN0LnZhbHVlcyhyZWNpcGVzKTtcbiAgICByZWNpcGVMaXN0LnNvcnQoKGEsIGIpID0+IChiLnBvcHVsYXJpdHkgfHwgMCkgLSAoYS5wb3B1bGFyaXR5IHx8IDApKTtcblxuICAgIGZvciAoY29uc3QgcmVjaXBlIG9mIHJlY2lwZUxpc3QpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcbiAgICAgIG9wdGlvbi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudEJhZGdlID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDE0Miw2OCwxNzMsMC4yKTsgY29sb3I6ICNhODU1Zjc7XCI+JHtyZWNpcGUuY29tcG9uZW50Q291bnQgfHwgcmVjaXBlLmNvbXBvbmVudHM/Lmxlbmd0aCB8fCAnPyd9IGFwcHM8L2Rpdj5gO1xuXG4gICAgICBjb25zdCBsb2NrT3ZlcmxheSA9ICFpc1ByZW1pdW0gPyBgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA2cHg7IHJpZ2h0OiA2cHg7IGZvbnQtc2l6ZTogMC42NXJlbTsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogcmdiYSgyNDEsMTk2LDE1LDAuMik7IGNvbG9yOiAjZjFjNDBmOyBmb250LXdlaWdodDogNjAwO1wiPlBSRU1JVU08L2Rpdj5gIDogJyc7XG5cbiAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICR7bG9ja092ZXJsYXl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLWljb25cIj4ke2VzY2FwZUh0bWwocmVjaXBlLmljb24gfHwgJ1xcdUQ4M0VcXHVEREVBJyl9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLW5hbWVcIj4ke2VzY2FwZUh0bWwocmVjaXBlLm5hbWUpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1kZXNjXCI+JHtlc2NhcGVIdG1sKHJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgICR7Y29tcG9uZW50QmFkZ2V9XG4gICAgICBgO1xuXG4gICAgICBvcHRpb24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1ByZW1pdW0pIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZWNpcGVzIHJlcXVpcmUgYSBEYXNoQ2FkZHkgUHJlbWl1bSBsaWNlbnNlLiBDbGljayB0aGUgTGljZW5zZSBidXR0b24gdG8gYWN0aXZhdGUuJywgJ3dhcm5pbmcnLCA1MDAwKTtcbiAgICAgICAgICBpZiAod2luZG93Lm9wZW5MaWNlbnNlTW9kYWwpIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5SZWNpcGVEZXBsb3lXaXphcmQocmVjaXBlKTtcbiAgICAgIH07XG5cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0UHJldmlld1JlY2lwZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgaWQ6ICdodHBjLXN1aXRlJywgbmFtZTogJ0hUUEMgU3VpdGUnLCBpY29uOiAnXFx1RDgzQ1xcdURGQUMnLCBkZXNjcmlwdGlvbjogJ0NvbXBsZXRlIG1lZGlhIGF1dG9tYXRpb246IGZpbmQsIGRvd25sb2FkLCBvcmdhbml6ZSwgYW5kIHN0cmVhbScsIGNvbXBvbmVudENvdW50OiA2LCBwb3B1bGFyaXR5OiA5OCB9LFxuICAgICAgeyBpZDogJ25leHRjbG91ZC1jb21wbGV0ZScsIG5hbWU6ICdOZXh0Y2xvdWQgQ29tcGxldGUnLCBpY29uOiAnXFx1MjYwMVxcdUZFMEYnLCBkZXNjcmlwdGlvbjogJ0Z1bGwgcHJvZHVjdGl2aXR5IHN1aXRlOiBjbG91ZCBzdG9yYWdlLCBvZmZpY2UgZWRpdGluZywgYW5kIGNvbGxhYm9yYXRpb24nLCBjb21wb25lbnRDb3VudDogNCwgcG9wdWxhcml0eTogOTAgfSxcbiAgICAgIHsgaWQ6ICdzbWFydC1ob21lJywgbmFtZTogJ1NtYXJ0IEhvbWUgSHViJywgaWNvbjogJ1xcdUQ4M0NcXHVERkUwJywgZGVzY3JpcHRpb246ICdIb21lIGF1dG9tYXRpb246IGNvbnRyb2wsIGF1dG9tYXRlLCBhbmQgbW9uaXRvciBJb1QgZGV2aWNlcycsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4OCB9LFxuICAgICAgeyBpZDogJ2Rldi1lbnZpcm9ubWVudCcsIG5hbWU6ICdEZXYgRW52aXJvbm1lbnQnLCBpY29uOiAnXFx1RDgzRFxcdURDQkInLCBkZXNjcmlwdGlvbjogJ1NlbGYtaG9zdGVkIGRldmVsb3BtZW50IHdvcmtmbG93OiBHaXQsIENJL0NELCBJREUsIGFuZCBkYXRhYmFzZScsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4MiB9XG4gICAgXTtcbiAgfVxuXG4gIC8vID09PSBSRUNJUEUgREVQTE9ZIFdJWkFSRCA9PT1cbiAgZnVuY3Rpb24gb3BlblJlY2lwZURlcGxveVdpemFyZChyZWNpcGUpIHtcbiAgICBjdXJyZW50UmVjaXBlID0gcmVjaXBlO1xuICAgIGN1cnJlbnRTdGVwID0gMTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3RvclxuICAgIGNvbnN0IGFwcFNlbGVjdG9yTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLXNlbGVjdG9yLW1vZGFsJyk7XG4gICAgaWYgKGFwcFNlbGVjdG9yTW9kYWwpIGFwcFNlbGVjdG9yTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktdGl0bGUnKS50ZXh0Q29udGVudCA9IGBEZXBsb3kgJHtyZWNpcGUubmFtZX1gO1xuXG4gICAgLy8gUmVzZXQgc3RlcHNcbiAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICByZW5kZXJTdGVwMSgpO1xuXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RlcFVJKCkge1xuICAgIC8vIFN0ZXAgaW5kaWNhdG9yc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtc3RlcHMgLnJlY2lwZS1zdGVwJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoZWwuZGF0YXNldC5zdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIHN0ZXAgPT09IGN1cnJlbnRTdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBsZXRlZCcsIHN0ZXAgPCBjdXJyZW50U3RlcCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGVwIHBhbmVsc1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDQ7IGkrKykge1xuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVjaXBlLXN0ZXAtJHtpfWApO1xuICAgICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gY3VycmVudFN0ZXAgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBOYXZpZ2F0aW9uIGJ1dHRvbnNcbiAgICBwcmV2QnRuLnN0eWxlLmRpc3BsYXkgPSBjdXJyZW50U3RlcCA+IDEgJiYgY3VycmVudFN0ZXAgPCA0ID8gJycgOiAnbm9uZSc7XG4gICAgaWYgKGN1cnJlbnRTdGVwID09PSA0KSB7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgPSAnQ2xvc2UnO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnXFx1RDgzRFxcdURFODAgRGVwbG95JztcbiAgICAgIG5leHRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ0NhbmNlbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnTmV4dCc7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMTogQ29tcG9uZW50IHNlbGVjdGlvblxuICBmdW5jdGlvbiByZW5kZXJTdGVwMSgpIHtcbiAgICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1jb21wb25lbnQtbGlzdCcpO1xuICAgIGxpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gY3VycmVudFJlY2lwZS5jb21wb25lbnRzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7JztcblxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGNvbXAucmVxdWlyZWQ7XG4gICAgICBjb25zdCBpc0ludGVybmFsID0gY29tcC5pbnRlcm5hbDtcblxuICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgJHtpc1JlcXVpcmVkID8gJ2NoZWNrZWQgZGlzYWJsZWQnIDogJ2NoZWNrZWQnfSBkYXRhLWNvbXBvbmVudC1pZD1cIiR7Y29tcC5pZH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgYWNjZW50LWNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiIC8+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwoY29tcC5yb2xlIHx8IGNvbXAuaWQpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICAke2NvbXAudGVtcGxhdGVSZWYgPyBlc2NhcGVIdG1sKGNvbXAudGVtcGxhdGVSZWYpIDogJ0J1aWx0LWluJ31cbiAgICAgICAgICAgICR7aXNSZXF1aXJlZCA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPlJlcXVpcmVkPC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPk9wdGlvbmFsPC9zcGFuPid9XG4gICAgICAgICAgICAke2lzSW50ZXJuYWwgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPihJbnRlcm5hbCk8L3NwYW4+JyA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICR7Y29tcC5ub3RlID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS13YXJuLWZnKTsgbWFyZ2luLXRvcDogNHB4O1wiPlxcdTI2QTAgJHtlc2NhcGVIdG1sKGNvbXAubm90ZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBsaXN0LmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IFNoYXJlZCBjb25maWd1cmF0aW9uXG4gIGZ1bmN0aW9uIHJlbmRlclN0ZXAyKCkge1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZXMtc2VjdGlvbicpO1xuICAgIGNvbnN0IHZvbHVtZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZS1saXN0Jyk7XG5cbiAgICBjb25zdCBzaGFyZWRWb2x1bWVzID0gY3VycmVudFJlY2lwZS5zaGFyZWRWb2x1bWVzO1xuICAgIGlmIChzaGFyZWRWb2x1bWVzICYmIE9iamVjdC5rZXlzKHNoYXJlZFZvbHVtZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgdm9sdW1lTGlzdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2b2xdIG9mIE9iamVjdC5lbnRyaWVzKHNoYXJlZFZvbHVtZXMpKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7JztcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4ke2VzY2FwZUh0bWwodm9sLmxhYmVsIHx8IGtleSl9PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBkYXRhLXZvbHVtZS1rZXk9XCIke2tleX1cIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJycpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJy9wYXRoJyl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+JHtlc2NhcGVIdG1sKHZvbC5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgIGA7XG4gICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAzOiBSZXZpZXdcbiAgZnVuY3Rpb24gcmVuZGVyU3RlcDMoKSB7XG4gICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIGNvbnN0IHZvbHVtZUlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtdm9sdW1lLWxpc3QgaW5wdXRbZGF0YS12b2x1bWUta2V5XScpO1xuICAgIGNvbnN0IHZvbHVtZXMgPSB7fTtcbiAgICB2b2x1bWVJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICB2b2x1bWVzW2lucHV0LmRhdGFzZXQudm9sdW1lS2V5XSA9IGlucHV0LnZhbHVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRpbWV6b25lJykudmFsdWUgfHwgJ1VUQyc7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJztcbiAgICBjb25zdCB0YWlsc2NhbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRhaWxzY2FsZScpLmNoZWNrZWQ7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRSZWNpcGUubmFtZSl9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj4ke2VzY2FwZUh0bWwoY3VycmVudFJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8c3Ryb25nPkNvbXBvbmVudHMgKCR7c2VsZWN0ZWRDb21wb25lbnRzLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7IG1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAke3NlbGVjdGVkQ29tcG9uZW50cy5tYXAoYyA9PiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDRweCAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICBcXHUyMDIyIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGMucm9sZSB8fCBjLmlkKX08L3N0cm9uZz4gJHtjLmludGVybmFsID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpXCI+KGludGVybmFsKTwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7T2JqZWN0LmtleXModm9sdW1lcykubGVuZ3RoID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHN0cm9uZz5Wb2x1bWVzOjwvc3Ryb25nPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHZvbHVtZXMpLm1hcCgoW2ssIHZdKSA9PiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2t9OiAke2VzY2FwZUh0bWwodil9PC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIFRpbWV6b25lOiAke2VzY2FwZUh0bWwodHopfSAmYnVsbDsgSVA6ICR7ZXNjYXBlSHRtbChpcCl9ICR7dGFpbHNjYWxlID8gJyZidWxsOyBUYWlsc2NhbGUgb25seScgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke2N1cnJlbnRSZWNpcGUubmV0d29yayA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+RG9ja2VyIG5ldHdvcms6IDxjb2RlPiR7ZXNjYXBlSHRtbChjdXJyZW50UmVjaXBlLm5ldHdvcmsubmFtZSl9PC9jb2RlPjwvZGl2PmAgOiAnJ31cbiAgICBgO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnRzKCkge1xuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLWNvbXBvbmVudC1saXN0IGlucHV0W2RhdGEtY29tcG9uZW50LWlkXScpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgpO1xuICAgIGNoZWNrYm94ZXMuZm9yRWFjaChjYiA9PiB7XG4gICAgICBpZiAoY2IuY2hlY2tlZCkgc2VsZWN0ZWRJZHMuYWRkKGNiLmRhdGFzZXQuY29tcG9uZW50SWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcmVxdWlyZWQgY29tcG9uZW50c1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjdXJyZW50UmVjaXBlLmNvbXBvbmVudHMgfHwgW107XG4gICAgY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjLnJlcXVpcmVkKS5mb3JFYWNoKGMgPT4gc2VsZWN0ZWRJZHMuYWRkKGMuaWQpKTtcblxuICAgIHJldHVybiBjb21wb25lbnRzLmZpbHRlcihjID0+IHNlbGVjdGVkSWRzLmhhcyhjLmlkKSk7XG4gIH1cblxuICAvLyBTdGVwIDQ6IERlcGxveVxuICBhc3luYyBmdW5jdGlvbiBleGVjdXRlRGVwbG95KCkge1xuICAgIGNvbnN0IHByb2dyZXNzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcHJvZ3Jlc3MtbGlzdCcpO1xuICAgIGNvbnN0IHJlc3VsdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktcmVzdWx0Jyk7XG4gICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBwcm9ncmVzc0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIC8vIFNob3cgcHJvZ3Jlc3MgaXRlbXNcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuaWQgPSBgcmVjaXBlLXByb2dyZXNzLSR7Y29tcC5pZH1gO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBlbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVjaXBlLXByb2dyZXNzLWljb25cIiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPlxcdTIzRjM8L3NwYW4+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxOyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChjb21wLnJvbGUgfHwgY29tcC5pZCl9PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlY2lwZS1wcm9ncmVzcy1zdGF0dXNcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UXVldWVkPC9zcGFuPlxuICAgICAgYDtcbiAgICAgIHByb2dyZXNzTGlzdC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBjb25maWdcbiAgICBjb25zdCB2b2x1bWVJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLXZvbHVtZS1saXN0IGlucHV0W2RhdGEtdm9sdW1lLWtleV0nKTtcbiAgICBjb25zdCB2b2x1bWVzID0ge307XG4gICAgdm9sdW1lSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdm9sdW1lc1tpbnB1dC5kYXRhc2V0LnZvbHVtZUtleV0gPSBpbnB1dC52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNlbGVjdGVkQ29tcG9uZW50czogc2VsZWN0ZWRDb21wb25lbnRzLm1hcChjID0+IGMuaWQpLFxuICAgICAgc2hhcmVkQ29uZmlnOiB7XG4gICAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJyxcbiAgICAgICAgdGltZXpvbmU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtdGltZXpvbmUnKS52YWx1ZSB8fCAnVVRDJyxcbiAgICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS10YWlsc2NhbGUnKS5jaGVja2VkLFxuICAgICAgICB2b2x1bWVzXG4gICAgICB9LFxuICAgICAgY29tcG9uZW50T3ZlcnJpZGVzOiB7fVxuICAgIH07XG5cbiAgICAvLyBNYXJrIGFsbCBhcyBkZXBsb3lpbmdcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcC5pZCwgJ2RlcGxveWluZycsICdEZXBsb3lpbmcuLi4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3JlY2lwZXMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVjaXBlSWQ6IGN1cnJlbnRSZWNpcGUuaWQsIGNvbmZpZyB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gTWFyayBkZXBsb3llZCBjb21wb25lbnRzXG4gICAgICAgIGZvciAoY29uc3QgZGVwbG95ZWQgb2YgKGRhdGEuZGVwbG95ZWQgfHwgW10pKSB7XG4gICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NJdGVtKGRlcGxveWVkLmlkLCAnc3VjY2VzcycsIGRlcGxveWVkLnVybCA/IGBSdW5uaW5nIFxcdTIxOTIgJHtkZXBsb3llZC51cmx9YCA6ICdSdW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFyayBlcnJvcnNcbiAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgKGRhdGEuZXJyb3JzIHx8IFtdKSkge1xuICAgICAgICAgIHVwZGF0ZVByb2dyZXNzSXRlbShlcnIuY29tcG9uZW50SWQsICdlcnJvcicsIGVyci5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSg0NiwyMDQsMTEzLDAuMyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW9rLWZnKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7ZXNjYXBlSHRtbChkYXRhLm1lc3NhZ2UgfHwgJ0RlcGxveWVkIScpfTwvZGl2PlxuICAgICAgICAgICAgJHtkYXRhLnNldHVwSW5zdHJ1Y3Rpb25zID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPlNldHVwIHRpcHM6PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAxNnB4OyBwYWRkaW5nOiAwO1wiPiR7ZGF0YS5zZXR1cEluc3RydWN0aW9ucy5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG5cbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50UmVjaXBlLm5hbWV9IHJlY2lwZSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgICAgICAvLyBSZWZyZXNoIGRhc2hib2FyZFxuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMzEsNzYsNjAsMC4zKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgPHN0cm9uZz5EZXBsb3ltZW50IGZhaWxlZDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjMxLDc2LDYwLDAuMyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICA8c3Ryb25nPk5ldHdvcmsgZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcG9uZW50SWQsIHN0YXR1cywgdGV4dCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlY2lwZS1wcm9ncmVzcy0ke2NvbXBvbmVudElkfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBpY29uID0gZWwucXVlcnlTZWxlY3RvcignLnJlY2lwZS1wcm9ncmVzcy1pY29uJyk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLXByb2dyZXNzLXN0YXR1cycpO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gJ2RlcGxveWluZycpIHtcbiAgICAgIGljb24udGV4dENvbnRlbnQgPSAnXFx1MjNGMyc7XG4gICAgICBzdGF0dXNFbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1hY2NlbnQpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBpY29uLnRleHRDb250ZW50ID0gJ1xcdTI3MDUnO1xuICAgICAgc3RhdHVzRWwuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgaWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICAvLyA9PT0gU1RFUCBOQVZJR0FUSU9OID09PVxuICBuZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykge1xuICAgICAgY3VycmVudFN0ZXAgPSA0O1xuICAgICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgICBleGVjdXRlRGVwbG95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50U3RlcCA8IDMpIHtcbiAgICAgIGN1cnJlbnRTdGVwKys7XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMikgcmVuZGVyU3RlcDIoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykgcmVuZGVyU3RlcDMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIHByZXZCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGVwID4gMSAmJiBjdXJyZW50U3RlcCA8IDQpIHtcbiAgICAgIGN1cnJlbnRTdGVwLS07XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PSBSRUNJUEUgQ0FSRCBHUk9VUElORyBPTiBEQVNIQk9BUkQgPT09XG4gIC8vIEFmdGVyIGRhc2hib2FyZCBsb2FkcywgZ3JvdXAgY2FyZHMgdGhhdCBzaGFyZSBhIHJlY2lwZUlkXG4gIHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VydmljZS1jYXJkW2RhdGEtcmVjaXBlLWlkXScpO1xuICAgIGlmIChjYXJkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHt9O1xuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCByZWNpcGVJZCA9IGNhcmQuZGF0YXNldC5yZWNpcGVJZDtcbiAgICAgIGlmICghZ3JvdXBzW3JlY2lwZUlkXSkgZ3JvdXBzW3JlY2lwZUlkXSA9IFtdO1xuICAgICAgZ3JvdXBzW3JlY2lwZUlkXS5wdXNoKGNhcmQpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBbcmVjaXBlSWQsIGdyb3VwQ2FyZHNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICAgIGlmIChncm91cENhcmRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBBcHBseSBzdWJ0bGUgdmlzdWFsIGdyb3VwaW5nXG4gICAgICBncm91cENhcmRzLmZvckVhY2goKGNhcmQsIGkpID0+IHtcbiAgICAgICAgY2FyZC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCByZ2JhKDE0Miw2OCwxNzMsMC41KSc7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgLy8gQWRkIGEgcmVjaXBlIGxhYmVsIHRvIHRoZSBmaXJzdCBjYXJkXG4gICAgICAgICAgbGV0IGxhYmVsID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLWdyb3VwLWxhYmVsJyk7XG4gICAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdyZWNpcGUtZ3JvdXAtbGFiZWwnO1xuICAgICAgICAgICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLThweDsgbGVmdDogMTJweDsgZm9udC1zaXplOiAwLjZyZW07IHBhZGRpbmc6IDFweCA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgxNDIsNjgsMTczLDAuMyk7IGNvbG9yOiAjZDRhNWZmOyBmb250LXdlaWdodDogNjAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7JztcbiAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcmVjaXBlSWQucmVwbGFjZSgvLS9nLCAnICcpO1xuICAgICAgICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT0gUkVDSVBFIE1BTkFHRU1FTlQgQUNUSU9OUyA9PT1cbiAgd2luZG93Lm1hbmFnZVJlY2lwZSA9IGFzeW5jIGZ1bmN0aW9uKHJlY2lwZUlkLCBhY3Rpb24pIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH0vJHthY3Rpb259YDtcbiAgICBjb25zdCBtZXRob2QgPSBhY3Rpb24gPT09ICdyZW1vdmUnID8gJ0RFTEVURScgOiAnUE9TVCc7XG4gICAgY29uc3QgdXJsID0gYWN0aW9uID09PSAncmVtb3ZlJyA/IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH1gIDogZW5kcG9pbnQ7XG5cbiAgICBpZiAoYWN0aW9uID09PSAncmVtb3ZlJyAmJiAhY29uZmlybShgUmVtb3ZlIHRoZSBlbnRpcmUgJHtyZWNpcGVJZH0gcmVjaXBlPyBUaGlzIHdpbGwgZGVsZXRlIGFsbCBjb250YWluZXJzIGFuZCBjb25maWd1cmF0aW9uLmApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBSZWNpcGUgJHthY3Rpb259OiAke2RhdGEucmVzdWx0cz8uZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICdmYWlsZWQnKS5sZW5ndGggfHwgMH0gY29tcG9uZW50cyBwcm9jZXNzZWRgLCAnc3VjY2VzcycsIDQwMDApO1xuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlICR7YWN0aW9ufSBmYWlsZWQ6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBOZXR3b3JrIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09IElOSkVDVCBDU1MgPT09XG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLnJlY2lwZS1zdGVwIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc4cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcCBzcGFuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuYWN0aXZlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYWNjZW50KTtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmFjdGl2ZSBzcGFuIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmNvbXBsZXRlZCB7XG4gICAgICBjb2xvcjogdmFyKC0tb2stZmcpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tb2stZmcpO1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuY29tcGxldGVkIHNwYW4ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcpO1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcC1wYW5lbCB7XG4gICAgICBtaW4taGVpZ2h0OiAxODBweDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG4gIC8vID09PSBJTklUID09PVxuICAvLyBQcmUtZmV0Y2ggcHJlbWl1bSBzdGF0dXMgb24gbG9hZFxuICBjaGVja1JlY2lwZVByZW1pdW0oKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBRERZIFJFTE9BRCBCVVRUT04gPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBSZWxvYWQgQ2FkZHkgYnV0dG9uIGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBSZWxvYWRpbmcuLi4nO1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jYWRkeS9yZWxvYWQnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTI3MDUgUmVsb2FkZWQhJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9LCAyMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1JlbG9hZCBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHJlbG9hZCBDYWRkeTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRVJST1IgTE9HIFZJRVdFUiA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdlcnJvci1sb2ctbW9kYWwnLCAnPGRpdiBpZD1cImVycm9yLWxvZy1tb2RhbFwiIGNsYXNzPVwibG9ncy1tb2RhbFwiPjxkaXYgY2xhc3M9XCJsb2dzLW1vZGFsLWNvbnRlbnRcIj48ZGl2IGNsYXNzPVwibG9ncy1oZWFkZXJcIj48aDM+XHVEODNEXHVEQ0NCIEVycm9yIExvZ3M8L2gzPjxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCI+PGJ1dHRvbiBpZD1cImVycm9yLWxvZy1yZWZyZXNoXCIgc3R5bGU9XCJwYWRkaW5nOjRweCAxMnB4IWltcG9ydGFudDtmb250LXNpemU6Ljg1cmVtIWltcG9ydGFudFwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+PGJ1dHRvbiBpZD1cImVycm9yLWxvZy1jbGVhclwiIHN0eWxlPVwicGFkZGluZzo0cHggMTJweCFpbXBvcnRhbnQ7Zm9udC1zaXplOi44NXJlbSFpbXBvcnRhbnQ7YmFja2dyb3VuZDpjb2xvci1taXgoaW4gc3JnYix2YXIoLS1iYWQtZmcpIDE1JSx0cmFuc3BhcmVudCkhaW1wb3J0YW50O2JvcmRlci1jb2xvcjp2YXIoLS1iYWQtZmcpIWltcG9ydGFudDtjb2xvcjp2YXIoLS1iYWQtZmcpIWltcG9ydGFudFwiPlx1RDgzRFx1REREMVx1RkUwRiBDbGVhcjwvYnV0dG9uPjxidXR0b24gaWQ9XCJlcnJvci1sb2ctY2xvc2VcIiBjbGFzcz1cImNsb3NlLWJ0blwiPlx1MjcxNTwvYnV0dG9uPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XCJsb2dzLWNvbnRhaW5lclwiPjxkaXYgaWQ9XCJlcnJvci1sb2ctY29udGVudFwiIGNsYXNzPVwibG9ncy1jb250ZW50XCI+PGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiPkxvYWRpbmcgZXJyb3IgbG9ncy4uLjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1tb2RhbCcpO1xuICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250ZW50Jyk7XG4gIGNvbnN0IHZpZXdCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1lcnJvci1sb2dzJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXJlZnJlc2gnKTtcbiAgY29uc3QgY2xlYXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWNsZWFyJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jbG9zZScpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRFcnJvckxvZ3MoKSB7XG4gICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiPkxvYWRpbmcgZXJyb3IgbG9ncy4uLjwvZGl2Pic7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvZXJyb3ItbG9ncycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmxvZ3MpIHtcbiAgICAgICAgaWYgKGRhdGEubG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlx1MjcwNSBObyBlcnJvcnMgbG9nZ2VkISBFdmVyeXRoaW5nIGlzIHdvcmtpbmcgc21vb3RobHkuPC9kaXY+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9IGRhdGEubG9ncy5tYXAobG9nID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShsb2cudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1lbnRyeSBlcnJvclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXRpbWVzdGFtcFwiPiR7ZGF0ZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctbGV2ZWxcIj5FUlJPUjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGxvZy5jb250ZXh0KX08L3N0cm9uZz46ICR7ZXNjYXBlSHRtbChsb2cuZXJyb3IpfVxuICAgICAgICAgICAgICAgICAgJHtsb2cuZGV0YWlscyA/IGA8YnI+PHNtYWxsIHN0eWxlPVwib3BhY2l0eTogMC43O1wiPiR7ZXNjYXBlSHRtbChsb2cuZGV0YWlscyl9PC9zbWFsbD5gIDogJyd9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlx1Mjc0QyBGYWlsZWQgdG8gbG9hZCBlcnJvciBsb2dzPC9kaXY+JztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDIwcHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlx1Mjc0QyBFcnJvciBsb2FkaW5nIGxvZ3M6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsZWFyRXJyb3JMb2dzKCkge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgYWxsIGVycm9yIGxvZ3M/JykpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Vycm9yLWxvZ3MnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1x1MjcwNSBFcnJvciBsb2dzIGNsZWFyZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgICAgICBsb2FkRXJyb3JMb2dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3NEMgRmFpbGVkIHRvIGNsZWFyIGxvZ3MnLCAnZXJyb3InLCAzMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgXHUyNzRDIEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfVxuICB9XG5cbiAgdmlld0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRFcnJvckxvZ3MoKTtcbiAgfSk7XG5cbiAgcmVmcmVzaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkRXJyb3JMb2dzKTtcbiAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYXJFcnJvckxvZ3MpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBMT0cgVklFV0VSID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2NvbnRhaW5lci1sb2dzLW1vZGFsJywgYDxkaXYgaWQ9XCJjb250YWluZXItbG9ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDkwMHB4OyBtYXgtd2lkdGg6IDk1dnc7IGhlaWdodDogODB2aDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nLWJvdHRvbTogMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwO1wiPlx1RDgzRFx1RENEQyBDb250YWluZXIgTG9nczwvaDM+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOiA0cHggMCAwIDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPlZpZXcgYW5kIHN0cmVhbSBEb2NrZXIgY29udGFpbmVyIGxvZ3M8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250cm9sc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLWNvbnRhaW5lci1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgbWluLXdpZHRoOiAyMDBweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNsLWxvZy1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsb2dzLi4uXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHdpZHRoOiAxNTBweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbC1sb2ctdGFpbFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+TGFzdCA1MCBsaW5lczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwMFwiIHNlbGVjdGVkPkxhc3QgMTAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNTAwXCI+TGFzdCA1MDAgbGluZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDAwXCI+TGFzdCAxMDAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGxvZ3M8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtcmVmcmVzaFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1kb3dubG9hZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdURDQkUgRG93bmxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtY2xlYXItc2VhcmNoXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtY29udGFpbmVyLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSwgdmFyKC0tYmcpKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+SW1hZ2U6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtaW1hZ2VcIj4tPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtc3RhdHVzXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+Q3JlYXRlZDo8L3N0cm9uZz4gPHNwYW4gaWQ9XCJjbC1jcmVhdGVkXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBpZD1cImNsLWxvZy1jb250ZW50XCIgY2xhc3M9XCJsb2dzLWNvbnRlbnQgc2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZmxleDogMTsgbWluLWhlaWdodDogMDsgYmFja2dyb3VuZDogIzFhMWExYTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxMnB4OyBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtOyBvdmVyZmxvdzogYXV0bztcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtc3RyZWFtLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnLCAjMWEzYTFhKTsgY29sb3I6IHZhcigtLW9rLWZnLCAjNGFkZTgwKTsgYm9yZGVyLXJhZGl1czogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJjbC1zdHJlYW0taW5kaWNhdG9yXCI+XHVEODNEXHVERDM0PC9zcGFuPiA8c3BhbiBpZD1cImNsLXN0cmVhbS10ZXh0XCI+RGlzY29ubmVjdGVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cImNsLWxpbmUtY291bnRcIj4wIGxpbmVzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnw8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJjbC1maWx0ZXItY291bnRcIj4wIGZpbHRlcmVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLWxvZ3MtbW9kYWwnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgbG9nQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sb2ctY29udGVudCcpO1xuICBjb25zdCBsb2dTZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbG9nLXNlYXJjaCcpO1xuICBjb25zdCBsb2dUYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxvZy10YWlsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtcmVmcmVzaCcpO1xuICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtJyk7XG4gIGNvbnN0IGRvd25sb2FkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWRvd25sb2FkJyk7XG4gIGNvbnN0IGNsZWFyU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNsZWFyLXNlYXJjaCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IHN0cmVhbVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0tc3RhdHVzJyk7XG4gIGNvbnN0IHN0cmVhbUluZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0taW5kaWNhdG9yJyk7XG4gIGNvbnN0IHN0cmVhbVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtLXRleHQnKTtcbiAgY29uc3QgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxpbmUtY291bnQnKTtcbiAgY29uc3QgZmlsdGVyQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtZmlsdGVyLWNvdW50Jyk7XG4gIFxuICAvLyBDb250YWluZXIgaW5mbyBlbGVtZW50c1xuICBjb25zdCBpbWFnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWltYWdlJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXN0YXR1cycpO1xuICBjb25zdCBjcmVhdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY3JlYXRlZCcpO1xuXG4gIGxldCBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICBsZXQgY3VycmVudExvZ3MgPSBbXTtcbiAgbGV0IGZpbHRlcmVkTG9ncyA9IFtdO1xuICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsO1xuXG4gIC8vIEZvcm1hdCBkYXRlXG4gIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVN0cikge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICctJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZVN0cik7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIGRhdGVTdHI7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIC8vIEVzY2FwZSBIVE1MXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvLyBGb3JtYXQgbG9nIGVudHJ5IGZvciBkaXNwbGF5XG4gIGZ1bmN0aW9uIGZvcm1hdExvZ0VudHJ5KGxvZywgaW5kZXgpIHtcbiAgICBjb25zdCBzdHJlYW1DbGFzcyA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID8gJ2xvZy1zdGRlcnInIDogJ2xvZy1zdGRvdXQnO1xuICAgIGNvbnN0IHN0cmVhbUljb24gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdcdTI2QTBcdUZFMEYnIDogJ1x1RDgzRFx1RENFNCc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZW50cnkgJHtzdHJlYW1DbGFzc31cIiBkYXRhLWluZGV4PVwiJHtpbmRleH1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzMzOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctbGluZS1udW1cIiBzdHlsZT1cImNvbG9yOiAjNjY2OyBtaW4td2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IHJpZ2h0OyB1c2VyLXNlbGVjdDogbm9uZTtcIj4ke2luZGV4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXN0cmVhbS1pY29uXCIgc3R5bGU9XCJjb2xvcjogJHtsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICcjZjU5ZTBiJyA6ICcjMjJjNTVlJ307XCI+JHtzdHJlYW1JY29ufTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctdGV4dFwiIHN0eWxlPVwiZmxleDogMTsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IGNvbG9yOiAjZTVlNWU1O1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIFJlbmRlciBsb2dzIHRvIHRoZSBjb250ZW50IGFyZWFcbiAgZnVuY3Rpb24gcmVuZGVyTG9ncyhsb2dzLCBzZWFyY2hUZXJtID0gJycpIHtcbiAgICBpZiAoIWxvZ3MgfHwgbG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIGF2YWlsYWJsZTwvZGl2Pic7XG4gICAgICBsaW5lQ291bnQudGV4dENvbnRlbnQgPSAnMCBsaW5lcyc7XG4gICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50TG9ncyA9IGxvZ3M7XG4gICAgZmlsdGVyZWRMb2dzID0gc2VhcmNoVGVybSA/IGxvZ3MuZmlsdGVyKGxvZyA9PiBcbiAgICAgIGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKVxuICAgICkgOiBsb2dzO1xuXG4gICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gYCR7bG9ncy5sZW5ndGh9IGxpbmVzYDtcbiAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IHNlYXJjaFRlcm0gPyBgJHtmaWx0ZXJlZExvZ3MubGVuZ3RofSBvZiAke2xvZ3MubGVuZ3RofSBzaG93bmAgOiBgJHtsb2dzLmxlbmd0aH0gc2hvd25gO1xuXG4gICAgaWYgKGZpbHRlcmVkTG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIG1hdGNoIFwiJHtlc2NhcGVIdG1sKHNlYXJjaFRlcm0pfVwiPC9kaXY+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dDb250ZW50LmlubmVySFRNTCA9IGZpbHRlcmVkTG9ncy5tYXAoKGxvZywgaSkgPT4gZm9ybWF0TG9nRW50cnkobG9nLCBpKSkuam9pbignJyk7XG4gICAgXG4gICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxuICAgIGxvZ0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBsaXN0XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb250YWluZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9sb2dzL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkYXRhLmNvbnRhaW5lcnMgfHwgW107XG4gICAgICBcbiAgICAgIC8vIFN0b3JlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICBjb25zdCBjdXJyZW50VmFsID0gY29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj4nO1xuICAgICAgXG4gICAgICBjb250YWluZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBjLmlkO1xuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBgJHtjLm5hbWV9ICgke2MuaW1hZ2Uuc3BsaXQoJzonKVswXX0pIC0gJHtjLnN0YXR1c31gO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbiBpZiBzdGlsbCB2YWxpZFxuICAgICAgaWYgKGN1cnJlbnRWYWwgJiYgY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y3VycmVudFZhbH1cIl1gKSkge1xuICAgICAgICBjb250YWluZXJTZWxlY3QudmFsdWUgPSBjdXJyZW50VmFsO1xuICAgICAgICBsb2FkQ29udGFpbmVySW5mbyhjdXJyZW50VmFsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNvbnRhaW5lcnM6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBpbmZvXG4gIGZ1bmN0aW9uIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y29udGFpbmVySWR9XCJdYCk7XG4gICAgaWYgKG9wdGlvbikge1xuICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IG9wdGlvbi5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzID09PSAncnVubmluZycgPyAndmFyKC0tb2stZmcsICM0YWRlODApJyA6ICd2YXIoLS1iYWQtZmcsICNlZjQ0NDQpJztcbiAgICAgIGNyZWF0ZWRFbC50ZXh0Q29udGVudCA9IGZvcm1hdERhdGUob3B0aW9uLmRhdGFzZXQuY3JlYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBsb2dzIGZvciBzZWxlY3RlZCBjb250YWluZXJcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkge1xuICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbVxuICAgIHN0b3BTdHJlYW0oKTtcblxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKTtcblxuICAgIGNvbnN0IHRhaWwgPSBsb2dUYWlsLnZhbHVlO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuXG4gICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gYC9hcGkvdjEvbG9ncy9jb250YWluZXIvJHtjb250YWluZXJJZH0ke3RhaWwgIT09ICdhbGwnID8gYD90YWlsPSR7dGFpbH1gIDogJyd9YDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKHVybCk7XG5cbiAgICAgIGlmIChkYXRhLmxvZ3MgJiYgZGF0YS5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVuZGVyTG9ncyhkYXRhLmxvZ3MsIHNlYXJjaFRlcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGxvZ3MgZm91bmQgZm9yIHRoaXMgY29udGFpbmVyPC9kaXY+JztcbiAgICAgICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gJzAgbGluZXMnO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RXJyb3IgbG9hZGluZyBsb2dzOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhcnQgc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RhcnRTdHJlYW0oKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuXG4gICAgLy8gU3RvcCBhbnkgZXhpc3Rpbmcgc3RyZWFtXG4gICAgc3RvcFN0cmVhbSgpO1xuXG4gICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjkgU3RvcCc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgc3RyZWFtVGV4dC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW5nLi4uJztcblxuICAgIGNvbnN0IHVybCA9IGAvYXBpL3YxL2xvZ3Mvc3RyZWFtLyR7Y29udGFpbmVySWR9YDtcbiAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Nvbm5lY3RlZCAtIHN0cmVhbWluZyBsb2dzJztcbiAgICB9O1xuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2cgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxvZy5lcnJvcikge1xuICAgICAgICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMzQnO1xuICAgICAgICAgIHN0cmVhbVRleHQudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7bG9nLmVycm9yfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGN1cnJlbnQgbG9nc1xuICAgICAgICBjdXJyZW50TG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIGZpbHRlcmVkTG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgY291bnRzXG4gICAgICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2N1cnJlbnRMb2dzLmxlbmd0aH0gbGluZXNgO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IGAke2ZpbHRlcmVkTG9ncy5sZW5ndGh9IHNob3duYDtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGVuZCBuZXcgbG9nIGVudHJ5XG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoIXNlYXJjaFRlcm0gfHwgKGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9IGZvcm1hdExvZ0VudHJ5KGxvZywgZmlsdGVyZWRMb2dzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGNvbnN0IGVudHJ5RGl2ID0gZW50cnkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgZW50cnlEaXYuc3R5bGUuYmFja2dyb3VuZCA9ICcjMWEzYTFhJztcbiAgICAgICAgICBsb2dDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5RGl2KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgICBsb2dDb250ZW50LnNjcm9sbFRvcCA9IGxvZ0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgbG9nOicsIGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQzNCc7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Rpc2Nvbm5lY3RlZCc7XG4gICAgICBpc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjVCNiBTdHJlYW0nO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSB0aGUgRXZlbnRTb3VyY2UgZm9yIGNsZWFudXBcbiAgICBtb2RhbC5fZXZlbnRTb3VyY2UgPSBldmVudFNvdXJjZTtcbiAgfVxuXG4gIC8vIFN0b3Agc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RvcFN0cmVhbSgpIHtcbiAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChtb2RhbC5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIG1vZGFsLl9ldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgbW9kYWwuX2V2ZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2IFN0cmVhbSc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvLyBEb3dubG9hZCBsb2dzIGFzIGZpbGVcbiAgZnVuY3Rpb24gZG93bmxvYWRMb2dzKCkge1xuICAgIGlmICghY3VycmVudExvZ3MgfHwgY3VycmVudExvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdObyBsb2dzIHRvIGRvd25sb2FkJywgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lclNlbGVjdC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke2N1cnJlbnRDb250YWluZXJJZH1cIl1gKT8uZGF0YXNldC5uYW1lIHx8IGN1cnJlbnRDb250YWluZXJJZDtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7Y29udGFpbmVyTmFtZX0tbG9ncy0ke3RpbWVzdGFtcH0udHh0YDtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBjdXJyZW50TG9ncy5tYXAobG9nID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGxvZy50aW1lc3RhbXAgfHwgJyc7XG4gICAgICBjb25zdCBzdHJlYW0gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdbRVJSXScgOiAnW09VVF0nO1xuICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcCA/IHRpbWVzdGFtcCArICcgJyA6ICcnfSR7c3RyZWFtfSAke2xvZy50ZXh0fWA7XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblxuICAgIHNob3dOb3RpZmljYXRpb24oYERvd25sb2FkZWQgJHtjdXJyZW50TG9ncy5sZW5ndGh9IGxvZyBsaW5lc2AsICdzdWNjZXNzJyk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgY29udGFpbmVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgbG9hZExvZ3MoKTtcbiAgfSk7XG5cbiAgbG9nVGFpbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHN0cmVhbUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wU3RyZWFtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0U3RyZWFtKCk7XG4gICAgfVxuICB9KTtcblxuICBkb3dubG9hZEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG93bmxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIGNsZWFyU2VhcmNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2dTZWFyY2gudmFsdWUgPSAnJztcbiAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgLy8gRGVib3VuY2Ugc2VhcmNoXG4gICAgY2xlYXJUaW1lb3V0KHNlYXJjaFRpbWVvdXQpO1xuICAgIHNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlbmRlckxvZ3MoY3VycmVudExvZ3MsIGxvZ1NlYXJjaC52YWx1ZS50cmltKCkpO1xuICAgIH0sIDMwMCk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgbG9nU2VhcmNoLnZhbHVlID0gJyc7XG4gICAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPcGVuIG1vZGFsXG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1jb250YWluZXItbG9ncycpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZENvbnRhaW5lcnMoKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWwgaGFuZGxlcnNcbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBzdG9wU3RyZWFtKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gIGNsb3NlQnRuMj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcblxuICAvLyBDbG9zZSBvbiBlc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFdpcmUgYmFja2Ryb3AgY2xpY2sgdG8gY2xvc2VNb2RhbCBzbyB0aGUgbG9nIHN0cmVhbSBzdG9wcyB0b28uXG4gIC8vIChDYW4ndCB1c2Ugd2lyZU1vZGFsIGhlcmUgXHUyMDE0IGl0IG9ubHkgZG9lcyBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcbiAgLy8gb24gYmFja2Ryb3AgY2xpY2ssIHdoaWNoIHdvdWxkIGxlYWsgdGhlIFNTRS9zdHJlYW0gY29ubmVjdGlvbi4pXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgY2xvc2VNb2RhbCgpOyB9KTtcblxuICAvLyBFeHBvc2UgZm9yIHVzZSBieSBzZXJ2aWNlIGNhcmQgYnV0dG9ucyAoZ3JpZC5qcyBjYWxscyBvcGVuQ29udGFpbmVyTG9nc01vZGFsKVxuICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbCA9IGZ1bmN0aW9uKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhbmQgc2VsZWN0IHRoZSBjb250YWluZXJcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEFycmF5LmZyb20oY29udGFpbmVyU2VsZWN0Lm9wdGlvbnMpLmZpbmQob3B0ID0+IFxuICAgICAgICBvcHQudmFsdWUgPT09IGNvbnRhaW5lcklkIHx8IG9wdC5kYXRhc2V0Lm5hbWUgPT09IGNvbnRhaW5lck5hbWVcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIGNvbnRhaW5lclNlbGVjdC52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgbG9hZENvbnRhaW5lckluZm8ob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgbG9hZExvZ3MoKTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgLy8gSWYgY29udGFpbmVyIG5vdCBmb3VuZCBpbiBsaXN0IGJ1dCB3ZSBoYXZlIGFuIElELCB0cnkgbG9hZGluZyBkaXJlY3RseVxuICAgICAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IGNvbnRhaW5lck5hbWUgfHwgY29udGFpbmVySWQ7XG4gICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJy0nO1xuICAgICAgICBjcmVhdGVkRWwudGV4dENvbnRlbnQgPSAnLSc7XG4gICAgICAgIGxvYWRMb2dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBjb250YWluZXIgSUQsIGp1c3Qgc2hvdyBtb2RhbCB3aXRoIGNvbnRhaW5lciBsaXN0XG4gICAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBsb2dzPC9kaXY+JztcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBTTkFQU0hPVCAvIENIRUNLUE9JTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnc25hcHNob3QtbW9kYWwnLCBgPGRpdiBpZD1cInNuYXBzaG90LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3MDBweDsgbWF4LXdpZHRoOiA4NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQkUgQ29udGFpbmVyIFNuYXBzaG90czwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIENyZWF0ZSBhbmQgbWFuYWdlIERvY2tlciBjb250YWluZXIgY2hlY2twb2ludHMgZm9yIGluc3RhbnQgc3RhdGUgcmVjb3ZlcnkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0LXdyYXBwZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TZWxlY3QgQ29udGFpbmVyOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWRldGFpbHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3Zlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+SW1hZ2U6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWltYWdlXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlN0YXR1czo8L3NwYW4+IDxzcGFuIGlkPVwic25hcHNob3Qtc3RhdHVzXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNyZWF0ZWQ6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWNyZWF0ZWRcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyIElEOjwvc3Bhbj4gPHNwYW4gaWQ9XCJzbmFwc2hvdC1pZFwiIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1jcmVhdGVcIj5DcmVhdGUgU25hcHNob3Q8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1saXN0XCI+TWFuYWdlIFNuYXBzaG90czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jcmVhdGVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TbmFwc2hvdCBOYW1lOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzbmFwc2hvdC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBiZWZvcmUtdXBkYXRlLTIwMjRcIiBcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBtYXJnaW4tdG9wOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuOXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNuYXBzaG90LWxlYXZlLXJ1bm5pbmdcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICBMZWF2ZSBjb250YWluZXIgcnVubmluZyBhZnRlciBjaGVja3BvaW50IChyZXN1bWUgd2l0aG91dCByZXN0YXJ0KVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGlkPVwic25hcHNob3QtY3JlYXRlLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHVEODNEXHVEQ0JFIENyZWF0ZSBTbmFwc2hvdDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwic25hcHNob3QtY3JlYXRlLXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWxpc3RcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1saXN0LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGl0cyBzbmFwc2hvdHM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzbmFwc2hvdC1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1idG4nKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY2xvc2UnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgZGV0YWlsc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1kZXRhaWxzJyk7XG4gIGNvbnN0IGNyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtYnRuJyk7XG4gIGNvbnN0IGNyZWF0ZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtc3RhdHVzJyk7XG5cbiAgbGV0IGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbnRhaW5lcnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuY29udGFpbmVycykgcmV0dXJuO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj4nO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEuY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gYy5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7Yy5uYW1lIHx8IGMuaWR9ICgke2MuaW1hZ2UgfHwgJ3Vua25vd24nfSlgO1xuICAgICAgICBvcHQuZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHQuZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdC5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHQuZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb250YWluZXJzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dDb250YWluZXJEZXRhaWxzKG9wdCkge1xuICAgIGlmICghb3B0IHx8ICFvcHQudmFsdWUpIHtcbiAgICAgIGRldGFpbHNEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG9wdC52YWx1ZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtaW1hZ2UnKS50ZXh0Q29udGVudCA9IG9wdC5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3Qtc3RhdHVzJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5zdGF0dXMgfHwgJy0nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGVkJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5jcmVhdGVkID8gbmV3IERhdGUob3B0LmRhdGFzZXQuY3JlYXRlZCAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCkgOiAnLSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWlkJykudGV4dENvbnRlbnQgPSBvcHQudmFsdWUuc3Vic3RyaW5nKDAsIDEyKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90KCkge1xuICAgIGlmICghY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIHNlbGVjdCBhIGNvbnRhaW5lciBmaXJzdCc7XG4gICAgICBjcmVhdGVTdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9ICdQbGVhc2UgZW50ZXIgYSBzbmFwc2hvdCBuYW1lJztcbiAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVhdmVSdW5uaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWxlYXZlLXJ1bm5pbmcnKS5jaGVja2VkO1xuICAgIFxuICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nLi4uJztcbiAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29udGFpbmVySWQpfS9jaGVja3BvaW50YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZSwgbGVhdmVSdW5uaW5nIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzEzIFNuYXBzaG90IFwiJHtuYW1lfVwiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1uYW1lJykudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3MTcgRmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzE3IEVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGNyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgQ3JlYXRlIFNuYXBzaG90JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTW9kYWwoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgICBjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleCA9IDA7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2RhbCk7XG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgXG4gIGNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBvcHQgPSBjb250YWluZXJTZWxlY3Qub3B0aW9uc1tjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgc2hvd0NvbnRhaW5lckRldGFpbHMob3B0KTtcbiAgfSk7XG4gIFxuICBjcmVhdGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY3JlYXRlU25hcHNob3QpO1xuICBcbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBtb2RhbD8ucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtdGFiJykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4gcy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKGAjJHt0YWIuZGF0YXNldC5wYW5lbH1gKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTTUFSVCBBUlIgQ09OTkVDVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdhcnItc2V0dXAtbW9kYWwnLCBgPGRpdiBpZD1cImFyci1zZXR1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzIwcHg7XCI+XG4gICAgICA8aDM+XHVEODNDXHVERkFDIFNtYXJ0IEFyciBDb25uZWN0PC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XG4gICAgICAgIEF1dG8tZGlzY292ZXIgYW5kIGNvbm5lY3QgeW91ciBlbnRpcmUgbWVkaWEgc3RhY2suXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gUGhhc2UgMTogRGV0ZWN0aW9uIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWRldGVjdFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjlyZW07XCI+U2Nhbm5pbmcgZm9yIHNlcnZpY2VzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtZGV0ZWN0LXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAyOiBDcmVkZW50aWFsIElucHV0IChvbmx5IGZvciBzZXJ2aWNlcyBuZWVkaW5nIGtleXMpIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWNyZWRlbnRpYWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+RW50ZXIgTWlzc2luZyBBUEkgS2V5czwvaDQ+XG4gICAgICAgIDxkaXYgaWQ9XCJzbWFydC1jcmVkZW50aWFsLWlucHV0c1wiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ29ubmVjdGlvbiBPcHRpb25zIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+Q29ubmVjdGlvbiBPcHRpb25zPC9oND5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1zZWVyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25maWd1cmUgU2VlcnIgd2l0aCBSYWRhcnIgKyBTb25hcnJcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm9wdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXBsZXhcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgQ29ubmVjdCBQbGV4IHRvIFNlZXJyXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1wcm93bGFyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25uZWN0IFByb3dsYXJyIHRvIFJhZGFyciArIFNvbmFyclxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXNhdmVcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgU2F2ZSBBUEkga2V5cyBmb3Igb25lLWNsaWNrIHJlY29ubmVjdFxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gaWQ9XCJzbWFydC1jb25uZWN0LWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNlNzRjM2MgMCUsICM5YjU5YjYgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIFNtYXJ0IENvbm5lY3RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAzOiBDb25uZWN0aW9uIFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLXByb2dyZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+Q29ubmVjdGluZyBFdmVyeXRoaW5nLi4uPC9oND5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXByb2dyZXNzLXN0ZXBzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBoYXNlIDQ6IFJlc3VsdHMgLS0+XG4gICAgICA8ZGl2IGlkPVwic21hcnQtcGhhc2UtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXJlc3VsdHMtY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtcGxleC1saWJyYXJpZXNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic21hcnQtcmV0cnktYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4OiAxOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjZjM5YzEyOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDUwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBSZXRyeSBGYWlsZWQgU3RlcHNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YSBpZD1cInNtYXJ0LW9wZW4tc2VlcnJcIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIE9wZW4gU2VlcnJcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSGVscCBUZXh0IC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8c3Ryb25nPldoZXJlIHRvIGZpbmQgQVBJIGtleXM6PC9zdHJvbmc+PGJyPlxuICAgICAgICBSYWRhcnIvU29uYXJyL1Byb3dsYXJyOiBTZXR0aW5ncyAtPiBHZW5lcmFsIC0+IFNlY3VyaXR5IC0+IEFQSSBLZXlcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXJyLXNldHVwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWNhbmNlbCcpO1xuICBjb25zdCBjb25uZWN0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LWNvbm5lY3QtYnRuJyk7XG5cbiAgLy8gUGhhc2UgZWxlbWVudHNcbiAgY29uc3QgcGhhc2VEZXRlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtZGV0ZWN0Jyk7XG4gIGNvbnN0IHBoYXNlQ3JlZGVudGlhbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtY3JlZGVudGlhbHMnKTtcbiAgY29uc3QgcGhhc2VQcm9ncmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1waGFzZS1wcm9ncmVzcycpO1xuICBjb25zdCBwaGFzZVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtcmVzdWx0cycpO1xuXG4gIGNvbnN0IGRldGVjdFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtZGV0ZWN0LXJlc3VsdHMnKTtcbiAgY29uc3QgY3JlZGVudGlhbElucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1jcmVkZW50aWFsLWlucHV0cycpO1xuICBjb25zdCBwcm9ncmVzc1N0ZXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXByb2dyZXNzLXN0ZXBzJyk7XG4gIGNvbnN0IHJlc3VsdHNDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJlc3VsdHMtY29udGVudCcpO1xuICBjb25zdCBwbGV4TGlicmFyaWVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBsZXgtbGlicmFyaWVzJyk7XG4gIGNvbnN0IHJldHJ5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJldHJ5LWJ0bicpO1xuXG4gIGxldCBkZXRlY3RlZERhdGEgPSBudWxsOyAvLyBTdG9yZSBkZXRlY3Rpb24gcmVzdWx0cyBmb3Igc21hcnQtY29ubmVjdFxuXG4gIGNvbnN0IHNlcnZpY2VJY29ucyA9IHsgcGxleDogJ1x1RDgzQ1x1REZBQycsIHJhZGFycjogJ1x1RDgzQ1x1REZBQycsIHNvbmFycjogJ1x1RDgzRFx1RENGQScsIHByb3dsYXJyOiAnXHVEODNEXHVERDBEJywgc2VlcnI6ICdcdUQ4M0RcdURDQ0InIH07XG4gIGNvbnN0IHNlcnZpY2VMYWJlbHMgPSB7IHBsZXg6ICdQbGV4JywgcmFkYXJyOiAnUmFkYXJyIChNb3ZpZXMpJywgc29uYXJyOiAnU29uYXJyIChUViknLCBwcm93bGFycjogJ1Byb3dsYXJyIChJbmRleGVycyknLCBzZWVycjogJ1NlZXJyJyB9O1xuXG4gIGZ1bmN0aW9uIHNob3dQaGFzZShwaGFzZSkge1xuICAgIHBoYXNlRGV0ZWN0LnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ2RldGVjdCcgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHBoYXNlQ3JlZGVudGlhbHMuc3R5bGUuZGlzcGxheSA9IHBoYXNlID09PSAnY3JlZGVudGlhbHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICBwaGFzZVByb2dyZXNzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Byb2dyZXNzJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgcGhhc2VSZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Jlc3VsdHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXR1c0JhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgIGNvbm5lY3RlZDogeyBiZzogJ3ZhcigtLW9rLWZnKScsIGljb246ICcmIzEwMDAzOycsIHRleHQ6ICdDb25uZWN0ZWQnIH0sXG4gICAgICBuZWVkc19rZXk6IHsgYmc6ICcjZjM5YzEyJywgaWNvbjogJyYjMTI4MjczOycsIHRleHQ6ICdOZWVkcyBBUEkgS2V5JyB9LFxuICAgICAgbm90X2ZvdW5kOiB7IGJnOiAndmFyKC0tbXV0ZWQpJywgaWNvbjogJyZtZGFzaDsnLCB0ZXh0OiAnTm90IEZvdW5kJyB9LFxuICAgICAgZXJyb3I6IHsgYmc6ICd2YXIoLS1iYWQtZmcpJywgaWNvbjogJyYjMTAwMDc7JywgdGV4dDogJ0Vycm9yJyB9XG4gICAgfTtcbiAgICBjb25zdCBjID0gY29sb3JzW3N0YXR1c10gfHwgY29sb3JzLm5vdF9mb3VuZDtcbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Yy5iZ30gMjAlLCB0cmFuc3BhcmVudCk7IGNvbG9yOiAke2MuYmd9O1wiPiR7Yy5pY29ufSAke2MudGV4dH08L3NwYW4+YDtcbiAgfVxuXG4gIC8vIFBoYXNlIDE6IFNtYXJ0IERldGVjdGlvblxuICBhc3luYyBmdW5jdGlvbiBzbWFydERldGVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ2RldGVjdCcpO1xuICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Fyci9zbWFydC1kZXRlY3QnKTtcbiAgICAgIGRldGVjdGVkRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFkZXRlY3RlZERhdGEuc3VjY2Vzcykge1xuICAgICAgICBkZXRlY3RSZXN1bHRzLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGV0ZWN0aW9uIGZhaWxlZDogJHtlc2NhcGVIdG1sKGRldGVjdGVkRGF0YS5lcnJvcil9PC9kaXY+YDtcbiAgICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW5kZXIgZGV0ZWN0aW9uIHJlc3VsdHNcbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IFtzdmMsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRldGVjdGVkRGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHNlcnZpY2VJY29uc1tzdmNdIHx8ICdcdUQ4M0RcdURDRTYnO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHNlcnZpY2VMYWJlbHNbc3ZjXSB8fCBzdmM7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGluZm8uc291cmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDFweCA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiAzcHg7XCI+JHtlc2NhcGVIdG1sKGluZm8uc291cmNlKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gaW5mby52ZXJzaW9uID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+diR7ZXNjYXBlSHRtbChpbmZvLnZlcnNpb24pfTwvc3Bhbj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGtleVNhdmVkID0gKGluZm8uaGFzQXBpS2V5IHx8IGluZm8uaGFzVG9rZW4pICYmIGluZm8uc3RhdHVzID09PSAnY29ubmVjdGVkJ1xuICAgICAgICAgID8gJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1vay1mZyk7XCI+S2V5IHNhdmVkPC9zcGFuPicgOiAnJztcblxuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgICAgICAke3NvdXJjZX0gJHt2ZXJzaW9ufSAke2tleVNhdmVkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShpbmZvLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgIC8vIFN1bW1hcnlcbiAgICAgIGNvbnN0IHMgPSBkZXRlY3RlZERhdGEuc3VtbWFyeTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZ1bGx5Q29ubmVjdGVkKSl9LyR7ZXNjYXBlSHRtbChTdHJpbmcocy50b3RhbERldGVjdGVkICsgKDUgLSBzLnRvdGFsRGV0ZWN0ZWQpKSl9IHNlcnZpY2VzIGRldGVjdGVkICZtaWRkb3Q7XG4gICAgICAgICR7ZXNjYXBlSHRtbChTdHJpbmcocy5mdWxseUNvbm5lY3RlZCkpfSBjb25uZWN0ZWQke3MubmVlZHNBcGlLZXkgPiAwID8gYCAmbWlkZG90OyA8c3Ryb25nPiR7ZXNjYXBlSHRtbChTdHJpbmcocy5uZWVkc0FwaUtleSkpfSBuZWVkcyBBUEkga2V5PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgPC9kaXY+YDtcblxuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgLy8gQnVpbGQgY3JlZGVudGlhbCBpbnB1dHMgZm9yIHNlcnZpY2VzIHRoYXQgbmVlZCBrZXlzXG4gICAgICBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGV0ZWN0ZWREYXRhKTtcblxuICAgICAgLy8gQXV0by1hZHZhbmNlIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaG93UGhhc2UoJ2NyZWRlbnRpYWxzJyk7XG4gICAgICB9LCA4MDApO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCBjcmVkZW50aWFsIGlucHV0IGZpZWxkc1xuICBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGF0YSkge1xuICAgIGxldCBodG1sID0gJyc7XG4gICAgY29uc3Qgc2VydmljZXMgPSBkYXRhLnNlcnZpY2VzO1xuICAgIGNvbnN0IGFyclNlcnZpY2VzID0gWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ107XG5cbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBhcnJTZXJ2aWNlcykge1xuICAgICAgY29uc3QgaW5mbyA9IHNlcnZpY2VzW3N2Y107XG4gICAgICBpZiAoIWluZm8gfHwgaW5mby5zdGF0dXMgPT09ICdub3RfZm91bmQnICYmICFpbmZvLnVybCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGljb24gPSBzZXJ2aWNlSWNvbnNbc3ZjXTtcbiAgICAgIGNvbnN0IGxhYmVsID0gc2VydmljZUxhYmVsc1tzdmNdO1xuICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSBpbmZvLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCc7XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGlzQ29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSc7XG5cbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7bGFiZWx9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwic21hcnQtJHtzdmN9LXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cbiAgICAgICAgICAgICR7aXNDb25uZWN0ZWQgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7IENvbm5lY3RlZDwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5VUkw6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic21hcnQtJHtzdmN9LXVybFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluZm8udXJsIHx8ICcnKX1cIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vc2VlZGJveC5jb20vJHtzdmN9L1wiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BUEkgS2V5OjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzbWFydC0ke3N2Y30ta2V5XCIgcGxhY2Vob2xkZXI9XCIke2lzQ29ubmVjdGVkID8gJyhzYXZlZCknIDogJ1Bhc3RlIEFQSSBrZXknfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJzbWFydFRlc3RDb25uZWN0aW9uKCcke3N2Y30nKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA0cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBQbGV4IHN0YXR1cyAobm9uLWVkaXRhYmxlLCBqdXN0IHNob3dzIHN0YXR1cylcbiAgICBjb25zdCBwbGV4ID0gc2VydmljZXMucGxleDtcbiAgICBpZiAocGxleCkge1xuICAgICAgY29uc3QgcGxleENvbm5lY3RlZCA9IHBsZXguc3RhdHVzID09PSAnY29ubmVjdGVkJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgJHtwbGV4Q29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSd9OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj5cdUQ4M0NcdURGQUM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPlBsZXg8L3NwYW4+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShwbGV4LnN0YXR1cyl9XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChwbGV4LnNvdXJjZSB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gU2VlcnIgc3RhdHVzXG4gICAgY29uc3Qgc2VlcnIgPSBzZXJ2aWNlcy5zZWVycjtcbiAgICBpZiAoc2VlcnIpIHtcbiAgICAgIGNvbnN0IHNlZXJyT2sgPSBzZWVyci5zdGF0dXMgPT09ICdjb25uZWN0ZWQnO1xuICAgICAgbGV0IGNvbmZpZ3VyZWRIdG1sID0gJyc7XG4gICAgICBpZiAoc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGNzID0gc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzO1xuICAgICAgICBjb25maWd1cmVkSHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgQ29uZmlndXJlZDogJHtjcy5yYWRhcnIgPyAnJiMxMDAwMzsgUmFkYXJyJyA6ICcmIzEwMDA3OyBSYWRhcnInfSAmbWlkZG90O1xuICAgICAgICAgICR7Y3Muc29uYXJyID8gJyYjMTAwMDM7IFNvbmFycicgOiAnJiMxMDAwNzsgU29uYXJyJ30gJm1pZGRvdDtcbiAgICAgICAgICAke2NzLnBsZXggPyAnJiMxMDAwMzsgUGxleCcgOiAnJiMxMDAwNzsgUGxleCd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7c2VlcnJPayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJvcmRlciknfTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07XCI+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj5TZWVycjwvc3Bhbj5cbiAgICAgICAgICAke3N0YXR1c0JhZGdlKHNlZXJyLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZWRIdG1sfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBjcmVkZW50aWFsSW5wdXRzLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBUZXN0IGNvbm5lY3Rpb24gKGdsb2JhbCBmb3Igb25jbGljaylcbiAgd2luZG93LnNtYXJ0VGVzdENvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS11cmxgKTtcbiAgICBjb25zdCBrZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3NlcnZpY2V9LWtleWApO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS1zdGF0dXNgKTtcblxuICAgIGNvbnN0IHVybCA9IHVybElucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgYXBpS2V5ID0ga2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdXJsIHx8ICFhcGlLZXkpIHtcbiAgICAgIHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RW50ZXIgVVJMIGFuZCBBUEkga2V5PC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvdGVzdC1jb25uZWN0aW9uJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZSwgdXJsLCBhcGlLZXkgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7ICR7ZXNjYXBlSHRtbChkYXRhLmFwcE5hbWUgfHwgJ0Nvbm5lY3RlZCcpfSB2JHtlc2NhcGVIdG1sKGRhdGEudmVyc2lvbiB8fCAnJyl9PC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfTtcblxuICAvLyBQaGFzZSAzOiBTbWFydCBDb25uZWN0XG4gIGFzeW5jIGZ1bmN0aW9uIHNtYXJ0Q29ubmVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ3Byb2dyZXNzJyk7XG4gICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+PGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nIHNlcnZpY2VzLi4uPC9kaXY+PC9kaXY+JztcblxuICAgIC8vIEdhdGhlciBpbnB1dFxuICAgIGNvbnN0IHNlcnZpY2VzID0ge307XG4gICAgZm9yIChjb25zdCBzdmMgb2YgWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ10pIHtcbiAgICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30tdXJsYCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFwaUtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30ta2V5YCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgdXJsKSB7XG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSwgdXJsIH07XG4gICAgICB9IGVsc2UgaWYgKGFwaUtleSkge1xuICAgICAgICAvLyBLZXkgcHJvdmlkZWQgd2l0aG91dCBVUkwgLSBsZXQgYmFja2VuZCByZXNvbHZlXG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSB9O1xuICAgICAgfVxuICAgICAgLy8gSWYgbm8ga2V5IGVudGVyZWQgYnV0IHNlcnZpY2Ugd2FzIGFscmVhZHkgY29ubmVjdGVkLCBiYWNrZW5kIHVzZXMgc3RvcmVkIGNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNlcnZpY2VzOiBPYmplY3Qua2V5cyhzZXJ2aWNlcykubGVuZ3RoID4gMCA/IHNlcnZpY2VzIDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlndXJlUGxleDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wbGV4Jyk/LmNoZWNrZWQsXG4gICAgICBjb25maWd1cmVQcm93bGFycjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wcm93bGFycicpPy5jaGVja2VkLFxuICAgICAgY29uZmlndXJlU2VlcnI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1vcHQtc2VlcnInKT8uY2hlY2tlZCxcbiAgICAgIHNhdmVDcmVkZW50aWFsczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1zYXZlJyk/LmNoZWNrZWRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3NtYXJ0LWNvbm5lY3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBSZW5kZXIgcHJvZ3Jlc3Mgc3RlcHNcbiAgICAgIGxldCBzdGVwc0h0bWwgPSAnJztcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiAoZGF0YS5zdGVwcyB8fCBbXSkpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7PC9zcGFuPic7XG4gICAgICAgIGNvbnN0IGRldGFpbENvbG9yID0gc3RlcC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBzdGVwc0h0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICR7aWNvbn1cbiAgICAgICAgICA8c3Bhbj4ke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogJHtkZXRhaWxDb2xvcn07XCI+JHtlc2NhcGVIdG1sKHN0ZXAuZGV0YWlscyB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSBzdGVwc0h0bWw7XG5cbiAgICAgIC8vIFNob3cgcmVzdWx0cyBhZnRlciBicmllZiBkZWxheVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzaG93UmVzdWx0cyhkYXRhKSwgNTAwKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByb2dyZXNzU3RlcHMuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5Db25uZWN0aW9uIGVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBoYXNlIDQ6IFJlc3VsdHNcbiAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMoZGF0YSkge1xuICAgIHNob3dQaGFzZSgncmVzdWx0cycpO1xuXG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeSB8fCB7fTtcbiAgICBjb25zdCBhbGxHb29kID0gcy5mYWlsZWQgPT09IDAgJiYgcy5zdWNjZWVkZWQgPiAwO1xuICAgIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsR29vZCA/ICd2YXIoLS1vay1mZyknIDogJyNmMzljMTInO1xuICAgIGNvbnN0IGhlYWRlckljb24gPSBhbGxHb29kID8gJyYjMTAwMDM7JyA6ICcmIzk4ODg7JztcbiAgICBjb25zdCBoZWFkZXJUZXh0ID0gYWxsR29vZCA/ICdBbGwgQ29ubmVjdGVkIScgOiBgJHtlc2NhcGVIdG1sKFN0cmluZyhzLnN1Y2NlZWRlZCkpfS8ke2VzY2FwZUh0bWwoU3RyaW5nKHMudG90YWxTdGVwcykpfSBTdGVwcyBTdWNjZWVkZWRgO1xuXG4gICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7aGVhZGVyQ29sb3J9IDEyJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAke2hlYWRlckNvbG9yfTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuNXJlbTsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVySWNvbn08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVyVGV4dH08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj4ke2VzY2FwZUh0bWwoU3RyaW5nKHMuc3VjY2VlZGVkKSl9IHN1Y2NlZWRlZCwgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZhaWxlZCkpfSBmYWlsZWQ8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gICAgLy8gU3RlcHMgZGV0YWlsXG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4O1wiPic7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIChkYXRhLnN0ZXBzIHx8IFtdKSkge1xuICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4mIzEwMDA3Ozwvc3Bhbj4nO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA0cHggOHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgJHtpY29ufSAke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX0gPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChzdGVwLmRldGFpbHMgfHwgJycpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICByZXN1bHRzQ29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gU2hvdyByZXRyeSBidXR0b24gaWYgYW55IGZhaWx1cmVzXG4gICAgcmV0cnlCdG4uc3R5bGUuZGlzcGxheSA9IHMuZmFpbGVkID4gMCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAvLyBGZXRjaCBQbGV4IGxpYnJhcmllcyBpZiBQbGV4IHdhcyBjb25uZWN0ZWRcbiAgICBpZiAoZGF0YS5zdGVwcz8uc29tZShzdCA9PiBzdC5zdGVwLmluY2x1ZGVzKCdQbGV4JykgJiYgc3Quc3RhdHVzID09PSAnc3VjY2VzcycpKSB7XG4gICAgICBmZXRjaFBsZXhMaWJyYXJpZXMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFBsZXhMaWJyYXJpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3BsZXgvbGlicmFyaWVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5saWJyYXJpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNDXHVERkFDICR7ZXNjYXBlSHRtbChkYXRhLnNlcnZlck5hbWUpfSBMaWJyYXJpZXM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4O1wiPmA7XG4gICAgICAgIGZvciAoY29uc3QgbGliIG9mIGRhdGEubGlicmFyaWVzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZUljb24gPSBsaWIudHlwZSA9PT0gJ21vdmllJyA/ICdcdUQ4M0NcdURGQUMnIDogbGliLnR5cGUgPT09ICdzaG93JyA/ICdcdUQ4M0RcdURDRkEnIDogJ1x1RDgzQ1x1REZCNSc7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAke3R5cGVJY29ufSA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsaWIudGl0bGUpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhsaWIuY291bnQpKX0gaXRlbXM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICBwbGV4TGlicmFyaWVzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIFBsZXggbGlicmFyeSBmZXRjaCBlcnJvcnNcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzbWFydERldGVjdCgpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIGNvbm5lY3RCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbiAgcmV0cnlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE5PVElGSUNBVElPTiBTRVRUSU5HUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ25vdGlmaWNhdGlvbnMtbW9kYWwnLCBgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbnMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDU1MHB4OyBtYXgtd2lkdGg6IDY1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REQxNCBOb3RpZmljYXRpb24gU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8IS0tIE1hc3RlciBUb2dnbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWNjZW50LWluZm8tYm94XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm5vdGlmaWNhdGlvbnMtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+RW5hYmxlIE5vdGlmaWNhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+UmVjZWl2ZSBhbGVydHMgd2hlbiBjb250YWluZXJzIGdvIHVwL2Rvd248L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFByb3ZpZGVycyBTZWN0aW9uIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIFByb3ZpZGVyczwvaDQ+XG5cbiAgICAgIDwhLS0gRGlzY29yZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImRpc2NvcmQtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LTUwMFwiPkRpc2NvcmQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlzY29yZC10ZXN0XCIgY2xhc3M9XCJ0ZXN0LWJ0biBidG4teHNcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGlzY29yZC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5XZWJob29rIFVSTDo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGlzY29yZC13ZWJob29rXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL2Rpc2NvcmQuY29tL2FwaS92MS93ZWJob29rcy8uLi5cIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGVsZWdyYW0gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0ZWxlZ3JhbS1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+VGVsZWdyYW08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidGVsZWdyYW0tdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInRlbGVncmFtLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPkJvdCBUb2tlbjo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWJvdC10b2tlblwiIHBsYWNlaG9sZGVyPVwiMTIzNDU2OkFCQy4uLlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+Q2hhdCBJRDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWNoYXQtaWRcIiBwbGFjZWhvbGRlcj1cIi0xMDAxMjM0NTY3ODkwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG50Znkuc2ggLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJudGZ5LWVuYWJsZWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5udGZ5LnNoPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cIm50ZnktdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm50ZnktY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5TZXJ2ZXIgVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibnRmeS1zZXJ2ZXJcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbnRmeS5zaFwiIHZhbHVlPVwiaHR0cHM6Ly9udGZ5LnNoXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5Ub3BpYzo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm50ZnktdG9waWNcIiBwbGFjZWhvbGRlcj1cImRhc2hjYWRkeS1hbGVydHNcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1haWwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbWFpbC1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW1haWwgKFNNVFApPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImVtYWlsLXRlc3RcIiBjbGFzcz1cInRlc3QtYnRuIGJ0bi14c1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJlbWFpbC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+U01UUCBIb3N0OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtaG9zdFwiIHBsYWNlaG9sZGVyPVwic210cC5nbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBvcnQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVtYWlsLXBvcnRcIiB2YWx1ZT1cIjU4N1wiIHBsYWNlaG9sZGVyPVwiNTg3XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlVzZXJuYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdXNlclwiIHBsYWNlaG9sZGVyPVwidXNlckBnbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImVtYWlsLXBhc3NcIiBwbGFjZWhvbGRlcj1cImFwcCBwYXNzd29yZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+RnJvbTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVtYWlsLWZyb21cIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeSAmbHQ7bm9yZXBseUBleGFtcGxlLmNvbSZndDtcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlRvOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdG9cIiBwbGFjZWhvbGRlcj1cImFkbWluQGV4YW1wbGUuY29tXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZW1haWwtc2VjdXJlXCIgLz4gVXNlIFRMUyAocG9ydCA0NjUpXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIZWFsdGggQ2hlY2sgU2V0dGluZ3MgLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5IZWFsdGggTW9uaXRvcmluZzwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJoZWFsdGgtY2hlY2stZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW5hYmxlIEhlYWx0aCBNb25pdG9yaW5nPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlBlcmlvZGljYWxseSBjaGVjayBjb250YWluZXIgc3RhdHVzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5DaGVjayBpbnRlcnZhbDo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJoZWFsdGgtY2hlY2staW50ZXJ2YWxcIiBzdHlsZT1cIndpZHRoOiBhdXRvO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj4xIG1pbnV0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIiBzZWxlY3RlZD41IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxNVwiPjE1IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIzMFwiPjMwIG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI2MFwiPjEgaG91cjwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtY2hlY2stbm93XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBtYXJnaW4tbGVmdDogYXV0bztcIj5DaGVjayBOb3c8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICBMYXN0IGNoZWNrOiBOZXZlclxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV2ZW50IFR5cGVzIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+RXZlbnRzIHRvIE5vdGlmeTwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci1kb3duXCIgY2hlY2tlZCAvPiBDb250YWluZXIgRG93blxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci11cFwiIGNoZWNrZWQgLz4gQ29udGFpbmVyIFJlY292ZXJlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGxveS1zdWNjZXNzXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IFN1Y2Nlc3NcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1kZXBsb3ktZmFpbGVkXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IEZhaWxlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1yZXNvdXJjZS1hbGVydFwiIGNoZWNrZWQgLz4gUmVzb3VyY2UgQWxlcnRzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIaXN0b3J5IC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIEhpc3Rvcnk8L2g0PlxuICAgICAgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbi1oaXN0b3J5XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxNTBweDsgb3ZlcmZsb3cteTogYXV0bzsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIG5vdGlmaWNhdGlvbnMgeWV0PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJsYXN0LW5vdGlmaWNhdGlvbi1zZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm5vdGlmaWNhdGlvbnMtc2VuZC10ZXN0XCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IGF1dG87XCI+U2VuZCBUZXN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJub3RpZmljYXRpb25zLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibm90aWZpY2F0aW9ucy1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZSBTZXR0aW5nczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2Utbm90aWZpY2F0aW9ucycpO1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2F2ZScpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1jYW5jZWwnKTtcblxuICAvLyBQcm92aWRlciB0b2dnbGUgaGFuZGxlcnNcbiAgWydkaXNjb3JkJywgJ3RlbGVncmFtJywgJ250ZnknLCAnZW1haWwnXS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3Byb3ZpZGVyfS1lbmFibGVkYCk7XG4gICAgY29uc3QgY29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cHJvdmlkZXJ9LWNvbmZpZ2ApO1xuXG4gICAgY2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gY2hlY2tib3guY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhlYWx0aCBjaGVjayB0b2dnbGVcbiAgY29uc3QgaGVhbHRoQ2hlY2tFbmFibGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJyk7XG4gIGNvbnN0IGhlYWx0aENoZWNrQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1jb25maWcnKTtcbiAgaGVhbHRoQ2hlY2tFbmFibGVkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaGVhbHRoQ2hlY2tDb25maWcuc3R5bGUub3BhY2l0eSA9IGhlYWx0aENoZWNrRW5hYmxlZC5jaGVja2VkID8gJzEnIDogJzAuNSc7XG4gIH0pO1xuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGNvbmZpZyBmcm9tIEFQSVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGRhdGEuY29uZmlnO1xuXG4gICAgICAgIC8vIE1hc3RlciB0b2dnbGVcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcuZW5hYmxlZDtcblxuICAgICAgICAvLyBQcm92aWRlcnNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCB8fCBmYWxzZTtcblxuICAgICAgICAvLyBTaG93L2hpZGUgY29uZmlnIHNlY3Rpb25zXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgLy8gbnRmeSBzZXJ2ZXIgVVJMXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5udGZ5Py5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMubnRmeS5zZXJ2ZXJVcmw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWFpbCBmaWVsZHNcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5ob3N0KSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtaG9zdCcpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC5ob3N0O1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LmZyb20pIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1mcm9tJykudmFsdWUgPSBjb25maWcucHJvdmlkZXJzLmVtYWlsLmZyb207XG5cbiAgICAgICAgLy8gSGVhbHRoIGNoZWNrXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcuaGVhbHRoQ2hlY2s/LmVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGlmIChjb25maWcuaGVhbHRoQ2hlY2s/LmludGVydmFsTWludXRlcykge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2staW50ZXJ2YWwnKS52YWx1ZSA9IGNvbmZpZy5oZWFsdGhDaGVjay5pbnRlcnZhbE1pbnV0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5oZWFsdGhDaGVjaz8ubGFzdENoZWNrKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1zdGF0dXMnKS50ZXh0Q29udGVudCA9XG4gICAgICAgICAgICBgTGFzdCBjaGVjazogJHtuZXcgRGF0ZShjb25maWcuaGVhbHRoQ2hlY2subGFzdENoZWNrKS50b0xvY2FsZVN0cmluZygpfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFdmVudHNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWNvbnRhaW5lci1kb3duJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LmNvbnRhaW5lckRvd24gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLXVwJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LmNvbnRhaW5lclVwICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1zdWNjZXNzJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LmRlcGxveW1lbnRTdWNjZXNzICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1mYWlsZWQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uZGVwbG95bWVudEZhaWxlZCAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZXNvdXJjZS1hbGVydCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5yZXNvdXJjZUFsZXJ0ICE9PSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbTm90aWZpY2F0aW9uc10gTG9hZCBDb25maWcnLCBlcnJvciwgeyBmdW5jdGlvbjogJ2xvYWRDb25maWcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGhpc3RvcnlcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9oaXN0b3J5P2xpbWl0PTEwJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5Py5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBkYXRhLmhpc3RvcnkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCB0eXBlQ29sb3JzID0ge1xuICAgICAgICAgICAgc3VjY2VzczogJ3ZhcigtLW9rLWZnKScsXG4gICAgICAgICAgICBlcnJvcjogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgICAgICAgd2FybmluZzogJyNmMzljMTInLFxuICAgICAgICAgICAgaW5mbzogJ3ZhcigtLWFjY2VudCknXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICR7dHlwZUNvbG9yc1tpdGVtLnR5cGVdIHx8ICd2YXIoLS1tdXRlZCknfVwiPiR7aXRlbS50eXBlID09PSAnc3VjY2VzcycgPyAnXHUyNzEzJyA6IGl0ZW0udHlwZSA9PT0gJ2Vycm9yJyA/ICdcdTI3MTcnIDogJ1x1MjEzOSd9PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAwO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoaXRlbS50aXRsZSl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZGF0ZX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBub3RpZmljYXRpb25zIHlldDwvZGl2Pic7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW05vdGlmaWNhdGlvbnNdIExvYWQgSGlzdG9yeScsIGVycm9yLCB7IGZ1bmN0aW9uOiAnbG9hZEhpc3RvcnknIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNhdmUgbm90aWZpY2F0aW9uIGNvbmZpZ1xuICBhc3luYyBmdW5jdGlvbiBzYXZlTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICBwcm92aWRlcnM6IHtcbiAgICAgICAgICBkaXNjb3JkOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzY29yZC1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIHdlYmhvb2tVcmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLXdlYmhvb2snKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRlbGVncmFtOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBib3RUb2tlbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWJvdC10b2tlbicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIGNoYXRJZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNoYXQtaWQnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG50Znk6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICAgc2VydmVyVXJsOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZS50cmltKCkgfHwgJ2h0dHBzOi8vbnRmeS5zaCcsXG4gICAgICAgICAgICB0b3BpYzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktdG9waWMnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBob3N0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtaG9zdCcpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1wb3J0JykudmFsdWUpIHx8IDU4NyxcbiAgICAgICAgICAgIHNlY3VyZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXNlY3VyZScpLmNoZWNrZWQsXG4gICAgICAgICAgICB1c2VyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdXNlcicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBhc3M6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1wYXNzJykudmFsdWUudHJpbSgpLFxuICAgICAgICAgICAgZnJvbTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWZyb20nKS52YWx1ZS50cmltKCksXG4gICAgICAgICAgICB0bzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXRvJykudmFsdWUudHJpbSgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICBjb250YWluZXJEb3duOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLWRvd24nKS5jaGVja2VkLFxuICAgICAgICAgIGNvbnRhaW5lclVwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLXVwJykuY2hlY2tlZCxcbiAgICAgICAgICBkZXBsb3ltZW50U3VjY2VzczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWRlcGxveS1zdWNjZXNzJykuY2hlY2tlZCxcbiAgICAgICAgICBkZXBsb3ltZW50RmFpbGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwbG95LWZhaWxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgcmVzb3VyY2VBbGVydDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXJlc291cmNlLWFsZXJ0JykuY2hlY2tlZFxuICAgICAgICB9LFxuICAgICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgaW50ZXJ2YWxNaW51dGVzOiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWludGVydmFsJykudmFsdWUpIHx8IDVcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTm90aWZpY2F0aW9uIHNldHRpbmdzIHNhdmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHNhdmU6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICB9XG4gIH1cblxuICAvLyBUZXN0IG5vdGlmaWNhdGlvbiBoYW5kbGVyc1xuICBhc3luYyBmdW5jdGlvbiB0ZXN0UHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL3Rlc3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwcm92aWRlciB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgJHtwcm92aWRlcn0gbm90aWZpY2F0aW9uIHNlbnQhYCwgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignZGlzY29yZCcpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ3RlbGVncmFtJykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVzdFByb3ZpZGVyKCdudGZ5JykpO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignZW1haWwnKSk7XG5cbiAgLy8gSGVhbHRoIGNoZWNrIG5vdyBidXR0b25cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1ub3cnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9oZWFsdGgtY2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLXN0YXR1cycpLnRleHRDb250ZW50ID1cbiAgICAgICAgICBgTGFzdCBjaGVjazogJHtuZXcgRGF0ZShkYXRhLmxhc3RDaGVjaykudG9Mb2NhbGVTdHJpbmcoKX0gKCR7ZGF0YS5jb250YWluZXJzTW9uaXRvcmVkfSBjb250YWluZXJzKWA7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0hlYWx0aCBjaGVjayBjb21wbGV0ZWQnLCAnc3VjY2VzcycsIDIwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTW9kYWwgaGFuZGxlcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWROb3RpZmljYXRpb25Db25maWcoKTtcbiAgICBsb2FkTm90aWZpY2F0aW9uSGlzdG9yeSgpO1xuICB9KTtcblxuICBzYXZlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVOb3RpZmljYXRpb25Db25maWcpO1xuXG4gIC8vIFNlbmQgVGVzdCBidXR0b24gLSBzZW5kcyB0ZXN0IG5vdGlmaWNhdGlvbiB0byBhbGwgZW5hYmxlZCBwcm92aWRlcnNcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2VuZC10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLXNlbmQtdGVzdCcpO1xuICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnU2VuZGluZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvc2VuZCcsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IFxuICAgICAgICAgIGV2ZW50OiAndGVzdCcsXG4gICAgICAgICAgZGF0YTogeyBtZXNzYWdlOiAnVGhpcyBpcyBhIHRlc3Qgbm90aWZpY2F0aW9uIGZyb20gRGFzaENhZGR5LicgfSxcbiAgICAgICAgICB0eXBlOiAnaW5mbydcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdUZXN0IG5vdGlmaWNhdGlvbiBzZW50IScsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIC8vIFVwZGF0ZSBsYXN0IHNlbnQgdGltZXN0YW1wXG4gICAgICAgIGxvYWROb3RpZmljYXRpb25TdGF0dXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYFRlc3QgZmFpbGVkOiAke2RhdGEucmVzdWx0cz8ubWFwKHIgPT4gYCR7ci5wcm92aWRlcn06ICR7ci5lcnJvciB8fCAnb2snfWApLmpvaW4oJywgJyl9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTG9hZCBub3RpZmljYXRpb24gc3RhdHVzIChsYXN0IHNlbnQgdGltZXN0YW1wKVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmxhc3RTZW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3RTZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFzdC1ub3RpZmljYXRpb24tc2VudCcpO1xuICAgICAgICBpZiAobGFzdFNlbnRFbCkge1xuICAgICAgICAgIGxhc3RTZW50RWwudGV4dENvbnRlbnQgPSBgTGFzdCBzZW50OiAke25ldyBEYXRlKGRhdGEubGFzdFNlbnQpLnRvTG9jYWxlU3RyaW5nKCl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBTaWxlbnRseSBmYWlsIC0gc3RhdHVzIGlzIG5vdCBjcml0aWNhbFxuICAgIH1cbiAgfVxuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFBBTkVMIFRBQiBTV0lUQ0hJTkcgKHNoYXJlZCB1dGlsaXR5KSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBjb25zdCB0YWIgPSBlLnRhcmdldC5jbG9zZXN0KCcucGFuZWwtdGFiJyk7XG4gICAgaWYgKCF0YWIpIHJldHVybjtcbiAgICBjb25zdCBwYW5lbElkID0gdGFiLmRhdGFzZXQucGFuZWw7XG4gICAgaWYgKCFwYW5lbElkKSByZXR1cm47XG4gICAgY29uc3QgdGFiQmFyID0gdGFiLmNsb3Nlc3QoJy5wYW5lbC10YWJzJyk7XG4gICAgY29uc3QgbW9kYWxDb250ZW50ID0gdGFiQmFyLmNsb3Nlc3QoJy53ZWF0aGVyLW1vZGFsLWNvbnRlbnQnKTtcbiAgICB0YWJCYXIucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godCA9PiB0LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgbW9kYWxDb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lbC1zZWN0aW9uJykuZm9yRWFjaChzID0+IHMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgIGNvbnN0IHRhcmdldCA9IG1vZGFsQ29udGVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHBhbmVsSWQpO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBVTklGSUVEIEJBQ0tVUC9SRVNUT1JFIHYyLjAgPT09PT09PT09PVxuLy8gU2luZ2xlIGZpbGUgY2FwdHVyZXMgZXZlcnl0aGluZzogc2VydmVyIGNvbmZpZyArIGJyb3dzZXIgc3RhdGUgKyB0aGVtZXMgKyBlbmNyeXB0aW9uIGtleVxuKGZ1bmN0aW9uKCkge1xuICAvLyBBbGwgRGFzaENhZGR5IGxvY2FsU3RvcmFnZSBrZXlzIHRvIGluY2x1ZGUgaW4gYmFja3VwXG4gIHZhciBCUk9XU0VSX1NUQVRFX0tFWVMgPSBbXG4gICAgJ2Rhc2hjYWRkeV9zaXRlX2NvbmZpZycsICdkYXNoY2FkZHlfb25ib2FyZGluZycsICdkYXNoY2FkZHktZW5jcnlwdGlvbi1rZXknLFxuICAgICdkYXNoY2FkZHktc2V0dXAnLCAnZGFzaGNhZGR5LWNvbmZpZycsXG4gICAgJ3RoZW1lJywgJ3VzZXItdGhlbWVzJywgJ2N1c3RvbS10aGVtZScsXG4gICAgJ2N1c3RvbS1hcHBzJywgJ2N1c3RvbS1zZXJ2aWNlcycsICd0b29sYmFyLXNlY3Rpb25zJyxcbiAgICAnd2VhdGhlci1sb2NhdGlvbicsICd3ZWF0aGVyLXppcCcsICd3ZWF0aGVyLWdlbycsICd3ZWF0aGVyLXVuaXQnLFxuICAgICdjbG9jay1zdHlsZScsICdjbG9jay1jaGltZXMnLCAnY2xvY2stY2hpbWUtdm9sdW1lJ1xuICBdO1xuXG4gIC8vIENvbGxlY3QgYWxsIERhc2hDYWRkeSBicm93c2VyIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlXG4gIGZ1bmN0aW9uIGNvbGxlY3RCcm93c2VyU3RhdGUoKSB7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgLy8gR3JhYiBhbGwgd2hpdGVsaXN0ZWQga2V5c1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQlJPV1NFUl9TVEFURV9LRVlTLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gQlJPV1NFUl9TVEFURV9LRVlTW2ldO1xuICAgICAgdmFyIHZhbCA9IHNhZmVHZXQoa2V5KTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQpIHN0YXRlW2tleV0gPSB2YWw7XG4gICAgfVxuICAgIC8vIEdyYWIgZHluYW1pYyB3aWRnZXQtKi1lbmFibGVkIGtleXNcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGsgPSBsb2NhbFN0b3JhZ2Uua2V5KGopO1xuICAgICAgICBpZiAoL153aWRnZXQtListZW5hYmxlZCQvLnRlc3QoaykpIHtcbiAgICAgICAgICBzdGF0ZVtrXSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBwcml2YXRlIGJyb3dzaW5nICovIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvLyBSZXN0b3JlIGJyb3dzZXIgc3RhdGUgZnJvbSBiYWNrdXAgaW50byBsb2NhbFN0b3JhZ2VcbiAgZnVuY3Rpb24gcmVzdG9yZUJyb3dzZXJTdGF0ZShicm93c2VyU3RhdGUpIHtcbiAgICBpZiAoIWJyb3dzZXJTdGF0ZSB8fCB0eXBlb2YgYnJvd3NlclN0YXRlICE9PSAnb2JqZWN0JykgcmV0dXJuIDA7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICBmb3IgKHZhciBrZXkgaW4gYnJvd3NlclN0YXRlKSB7XG4gICAgICBpZiAoIWJyb3dzZXJTdGF0ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZTtcbiAgICAgIHNhZmVTZXQoa2V5LCBicm93c2VyU3RhdGVba2V5XSk7XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgbGVnYWN5IHYxLjAuMCBpbXBvcnQtZXhwb3J0IGZvcm1hdCAocHJlLWJhY2t1cCBtb2RhbClcbiAgZnVuY3Rpb24gaXNMZWdhY3lGb3JtYXQoZGF0YSkge1xuICAgIHJldHVybiBkYXRhLnZlcnNpb24gJiYgIWRhdGEuZmlsZXMgJiYgZGF0YS5zZXJ2aWNlcztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3RvcmVMZWdhY3lGb3JtYXQoZGF0YSkge1xuICAgIC8vIE1hcCB0aGUgb2xkIGZsYXQga2V5cyBpbnRvIGJyb3dzZXJTdGF0ZSBmb3IgbG9jYWxTdG9yYWdlIHJlc3RvcmVcbiAgICB2YXIgYnJvd3NlclN0YXRlID0ge307XG4gICAgaWYgKGRhdGEuY3VzdG9tU2VydmljZXMpIGJyb3dzZXJTdGF0ZVsnY3VzdG9tLXNlcnZpY2VzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmN1c3RvbVNlcnZpY2VzKTtcbiAgICBpZiAoZGF0YS5jdXN0b21BcHBzKSBicm93c2VyU3RhdGVbJ2N1c3RvbS1hcHBzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLmN1c3RvbUFwcHMpO1xuICAgIGlmIChkYXRhLndlYXRoZXJaaXApIGJyb3dzZXJTdGF0ZVsnd2VhdGhlci16aXAnXSA9IGRhdGEud2VhdGhlclppcDtcbiAgICBpZiAoZGF0YS50aGVtZSkgYnJvd3NlclN0YXRlWyd0aGVtZSddID0gZGF0YS50aGVtZTtcbiAgICBpZiAoZGF0YS51c2VyVGhlbWVzICYmIE9iamVjdC5rZXlzKGRhdGEudXNlclRoZW1lcykubGVuZ3RoKSBicm93c2VyU3RhdGVbJ3VzZXItdGhlbWVzJ10gPSBKU09OLnN0cmluZ2lmeShkYXRhLnVzZXJUaGVtZXMpO1xuICAgIHJlc3RvcmVCcm93c2VyU3RhdGUoYnJvd3NlclN0YXRlKTtcblxuICAgIC8vIFB1c2ggc2VydmljZXMgdG8gc2VydmVyIGlmIGF2YWlsYWJsZVxuICAgIGlmIChkYXRhLnNlcnZpY2VzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YS5zZXJ2aWNlcylcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkge30pO1xuICAgIH1cblxuICAgIC8vIFB1c2ggdGhlbWVzIHRvIHNlcnZlciBpZiBhdmFpbGFibGVcbiAgICBpZiAoZGF0YS51c2VyVGhlbWVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhkYXRhLnVzZXJUaGVtZXMpLmZvckVhY2goZnVuY3Rpb24oc2x1Zykge1xuICAgICAgICB2YXIgdCA9IGRhdGEudXNlclRoZW1lc1tzbHVnXTtcbiAgICAgICAgdmFyIGNvbG9ycyA9IHt9O1xuICAgICAgICAod2luZG93LlRIRU1FX1BST1BTIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHApIHsgaWYgKHRbcF0pIGNvbG9yc1twXSA9IHRbcF07IH0pO1xuICAgICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIHNsdWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IHQubmFtZSB8fCBzbHVnLCBjb2xvcnM6IGNvbG9ycyB9KVxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdiYWNrdXAtbW9kYWwnLCBgPGRpdiBpZD1cImJhY2t1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNTUwcHg7IG1heC13aWR0aDogNjUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0JFIEJhY2t1cCAmIFJlc3RvcmU8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBGdWxsIGJhY2t1cCBvZiB5b3VyIGVudGlyZSBEYXNoQ2FkZHkgc2V0dXAgXHUyMDE0IHNlcnZlciBjb25maWcsIGNyZWRlbnRpYWxzLCB0aGVtZXMsIGFuZCBicm93c2VyIHByZWZlcmVuY2VzIGluIG9uZSBmaWxlLlxuICAgICAgPC9wPlxuXG4gICAgICA8IS0tIFRhYiBiYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtbWFudWFsXCI+TWFudWFsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLXNjaGVkdWxlcy10YWJcIj5TY2hlZHVsZXM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtZGlzay10YWJcIj5CYWNrdXBzIG9uIERpc2s8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtcG9pbnRpbnRpbWUtdGFiXCI+UG9pbnQtaW4tVGltZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1oaXN0b3J5LXRhYlwiPkhpc3Rvcnk8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogTWFudWFsIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1tYW51YWxcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDwhLS0gRXhwb3J0IFNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjb2xvci1taXgoaW4gc3JnYiwgIzI3YWU2MCAxNSUsIHRyYW5zcGFyZW50KSwgY29sb3ItbWl4KGluIHNyZ2IsICMyZWNjNzEgMTAlLCB0cmFuc3BhcmVudCkpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjMjdhZTYwO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgY29sb3I6ICMyZWNjNzE7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cdUQ4M0RcdURDRTQgRXhwb3J0IEJhY2t1cDwvaDQ+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTJweDtcIj5cbiAgICAgICAgICAgIERvd25sb2FkcyBldmVyeXRoaW5nIFx1MjAxNCBzZXJ2aWNlcywgQ2FkZHlmaWxlLCBjcmVkZW50aWFscywgZW5jcnlwdGlvbiBrZXksIHRoZW1lcywgYW5kIGFsbCBicm93c2VyIHByZWZlcmVuY2VzLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWV4cG9ydC1idG5cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMjdhZTYwIDAlLCAjMmVjYzcxIDEwMCUpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDYwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBcdTJCMDdcdUZFMEYgRG93bmxvYWQgRnVsbCBCYWNrdXBcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBJbXBvcnQgU2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIGNvbG9yLW1peChpbiBzcmdiLCAjMzQ5OGRiIDE1JSwgdHJhbnNwYXJlbnQpLCBjb2xvci1taXgoaW4gc3JnYiwgIzI5ODBiOSAxMCUsIHRyYW5zcGFyZW50KSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkICMzNDk4ZGI7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgOHB4OyBjb2xvcjogIzM0OThkYjsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlx1RDgzRFx1RENFNSBSZXN0b3JlIEJhY2t1cDwvaDQ+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTJweDtcIj5cbiAgICAgICAgICAgIFVwbG9hZCBhIGJhY2t1cCBmaWxlIHRvIHJlc3RvcmUgeW91ciBlbnRpcmUgY29uZmlndXJhdGlvbiBcdTIwMTQgZHJhZyBhbmQgZHJvcCByZWFkeS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJiYWNrdXAtZmlsZS1pbnB1dFwiIGFjY2VwdD1cIi5qc29uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1zZWxlY3QtZmlsZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMzNDk4ZGIgMCUsICMyOTgwYjkgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RENDMSBTZWxlY3QgQmFja3VwIEZpbGVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWZpbGUtbmFtZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFByZXZpZXcgU2VjdGlvbiAoc2hvd24gYWZ0ZXIgZmlsZSBzZWxlY3RlZCkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtcHJldmlld1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4OyBmb250LXNpemU6IDAuOXJlbTtcIj5cdUQ4M0RcdURDQ0IgQmFja3VwIENvbnRlbnRzPC9oND5cbiAgICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXByZXZpZXctY29udGVudFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJiYWNrdXAtcmVsb2FkLWNhZGR5XCIgY2hlY2tlZCAvPlxuICAgICAgICAgICAgICBSZWxvYWQgQ2FkZHkgYWZ0ZXIgcmVzdG9yZVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWRvLXJlc3RvcmUtYnRuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2U3NGMzYyAwJSwgI2MwMzkyYiAxMDAlKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiA2MDA7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgXHUyNkExIFJlc3RvcmUgRXZlcnl0aGluZ1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc3VsdCBNZXNzYWdlIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXJlc3VsdFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBTY2hlZHVsZXMgKFByZW1pdW0pIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1zY2hlZHVsZXMtdGFiXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtc2NoZWR1bGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyM0YwPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHNjaGVkdWxlcy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQmFja3VwcyBvbiBEaXNrIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1kaXNrLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWRpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYmFja3VwIGZpbGVzLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBQb2ludC1pbi1UaW1lIFJlc3RvcmUgLS0+XG4gICAgICA8ZGl2IGlkPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwicG9pbnRpbnRpbWUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTIzRUE8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEJhY2t1cCBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1oaXN0b3J5LXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLWhpc3RvcnktY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBiYWNrdXAgaGlzdG9yeS4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYmFja3VwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgdmFyIG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1tb2RhbCcpO1xuICB2YXIgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcmVzdG9yZS1idG4nKTtcbiAgdmFyIGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtY2FuY2VsJyk7XG4gIHZhciBleHBvcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWV4cG9ydC1idG4nKTtcbiAgdmFyIHNlbGVjdEZpbGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXNlbGVjdC1maWxlJyk7XG4gIHZhciBmaWxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWZpbGUtaW5wdXQnKTtcbiAgdmFyIGZpbGVOYW1lRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1maWxlLW5hbWUnKTtcbiAgdmFyIHByZXZpZXdEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXByZXZpZXcnKTtcbiAgdmFyIHByZXZpZXdDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1wcmV2aWV3LWNvbnRlbnQnKTtcbiAgdmFyIHJlc3RvcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWRvLXJlc3RvcmUtYnRuJyk7XG4gIHZhciByZXN1bHREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3VsdCcpO1xuICB2YXIgc2NoZWR1bGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXNjaGVkdWxlcy1jb250YWluZXInKTtcbiAgdmFyIGhpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWhpc3RvcnktY29udGFpbmVyJyk7XG4gIHZhciBkaXNrQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1kaXNrLWNvbnRhaW5lcicpO1xuICB2YXIgcG9pbnRpbnRpbWVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRpbnRpbWUtY29udGFpbmVyJyk7XG5cbiAgdmFyIHNlbGVjdGVkQmFja3VwID0gbnVsbDtcblxuICAvLyBPcGVuIG1vZGFsXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGlmIChyZXN1bHREaXYpIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChwcmV2aWV3RGl2KSBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaWYgKGZpbGVOYW1lRGl2KSBmaWxlTmFtZURpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHNlbGVjdGVkQmFja3VwID0gbnVsbDtcbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuXG4gIC8vID09PSBFWFBPUlQ6IFNlcnZlciBiYWNrdXAgKyBicm93c2VyIHN0YXRlIGluIG9uZSBmaWxlID09PVxuICBleHBvcnRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgZXhwb3J0QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBleHBvcnRCdG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gRXhwb3J0aW5nLi4uJztcbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggc2VydmVyLXNpZGUgYmFja3VwIChjb25maWcsIHNlcnZpY2VzLCBjYWRkeWZpbGUsIGNyZWRlbnRpYWxzLCBlbmNyeXB0aW9uIGtleSwgdGhlbWVzLCBldGMuKVxuICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3VwL2V4cG9ydCcpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIEFkZCBhbGwgYnJvd3NlciBsb2NhbFN0b3JhZ2Ugc3RhdGVcbiAgICAgIGRhdGEuYnJvd3NlclN0YXRlID0gY29sbGVjdEJyb3dzZXJTdGF0ZSgpO1xuXG4gICAgICAvLyBEb3dubG9hZCB1bmlmaWVkIGJhY2t1cFxuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgIHZhciB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICBhLmRvd25sb2FkID0gJ2Rhc2hjYWRkeS1iYWNrdXAtJyArIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdICsgJy5qc29uJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICBhLmNsaWNrKCk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuXG4gICAgICB2YXIgc3RhdGVDb3VudCA9IE9iamVjdC5rZXlzKGRhdGEuYnJvd3NlclN0YXRlKS5sZW5ndGg7XG4gICAgICB2YXIgdGhlbWVDb3VudCA9IGRhdGEudGhlbWVzID8gT2JqZWN0LmtleXMoZGF0YS50aGVtZXMpLmxlbmd0aCA6IDA7XG4gICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjcwNSBGdWxsIGJhY2t1cCBkb3dubG9hZGVkIFx1MjAxNCBzZXJ2ZXIgY29uZmlnICsgJyArIHN0YXRlQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3MnICsgKHRoZW1lQ291bnQgPyAnICsgJyArIHRoZW1lQ291bnQgKyAnIHRoZW1lcycgOiAnJyk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLW9rLWZnKSc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgRXhwb3J0IGZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBleHBvcnRCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBleHBvcnRCdG4uaW5uZXJIVE1MID0gJ1x1MkIwN1x1RkUwRiBEb3dubG9hZCBGdWxsIEJhY2t1cCc7XG4gIH0pO1xuXG4gIC8vIFNlbGVjdCBmaWxlIGJ1dHRvblxuICBzZWxlY3RGaWxlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBmaWxlSW5wdXQuY2xpY2soKTsgfSk7XG5cbiAgLy8gPT09IEZJTEUgU0VMRUNURUQ6IFByZXZpZXcgY29udGVudHMgPT09XG4gIGZpbGVJbnB1dD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgIHZhciBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgZmlsZU5hbWVEaXYudGV4dENvbnRlbnQgPSAnXHVEODNEXHVEQ0M0ICcgKyBmaWxlLm5hbWU7XG4gICAgZmlsZU5hbWVEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB0ZXh0ID0gYXdhaXQgZmlsZS50ZXh0KCk7XG4gICAgICB2YXIgYmFja3VwID0gSlNPTi5wYXJzZSh0ZXh0KTtcblxuICAgICAgLy8gSGFuZGxlIGxlZ2FjeSB2MS4wLjAgZm9ybWF0IChmcm9tIG9sZCBpbXBvcnQtZXhwb3J0LmpzKVxuICAgICAgaWYgKGlzTGVnYWN5Rm9ybWF0KGJhY2t1cCkpIHtcbiAgICAgICAgc2VsZWN0ZWRCYWNrdXAgPSBiYWNrdXA7XG4gICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxlZ2FjeSBmb3JtYXQgKHYnICsgZXNjYXBlSHRtbChiYWNrdXAudmVyc2lvbikgKyAnKTwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPic7XG4gICAgICAgIGlmIChiYWNrdXAuc2VydmljZXM/Lmxlbmd0aCkgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQ0IgJyArIGJhY2t1cC5zZXJ2aWNlcy5sZW5ndGggKyAnIHNlcnZpY2VzPC9zcGFuPic7XG4gICAgICAgIGlmIChiYWNrdXAuY3VzdG9tQXBwcz8ubGVuZ3RoKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzRFx1RENFNiAnICsgYmFja3VwLmN1c3RvbUFwcHMubGVuZ3RoICsgJyBjdXN0b20gYXBwczwvc3Bhbj4nO1xuICAgICAgICBpZiAoYmFja3VwLnRoZW1lKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzQ1x1REZBOCBUaGVtZTogJyArIGVzY2FwZUh0bWwoYmFja3VwLnRoZW1lKSArICc8L3NwYW4+JztcbiAgICAgICAgaWYgKGJhY2t1cC51c2VyVGhlbWVzKSBodG1sICs9ICc8c3BhbiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlx1RDgzQ1x1REZBOCAnICsgT2JqZWN0LmtleXMoYmFja3VwLnVzZXJUaGVtZXMpLmxlbmd0aCArICcgY3VzdG9tIHRoZW1lczwvc3Bhbj4nO1xuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgICBwcmV2aWV3Q29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHYxLjErIC8gdjIuMCBmb3JtYXQgXHUyMDE0IHNlbmQgdG8gc2VydmVyIGZvciBwcmV2aWV3XG4gICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXAvcHJldmlldycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShiYWNrdXApXG4gICAgICB9KTtcbiAgICAgIHZhciBwcmV2aWV3ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKHByZXZpZXcuc3VjY2Vzcykge1xuICAgICAgICBzZWxlY3RlZEJhY2t1cCA9IGJhY2t1cDtcbiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjhyZW07XCI+RXhwb3J0ZWQ6ICcgKyBuZXcgRGF0ZShiYWNrdXAuZXhwb3J0ZWRBdCkudG9Mb2NhbGVTdHJpbmcoKSArICcgKHYnICsgZXNjYXBlSHRtbChiYWNrdXAudmVyc2lvbikgKyAnKTwvZGl2Pic7XG5cbiAgICAgICAgLy8gU2VydmVyIGZpbGVzXG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1wiPlNlcnZlciBDb25maWc8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJldmlldy5wcmV2aWV3LmZpbGVzKSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBwcmV2aWV3LnByZXZpZXcuZmlsZXNba2V5XTtcbiAgICAgICAgICB2YXIgaWNvbiA9IGluZm8uYWN0aW9uID09PSAnY3JlYXRlJyA/ICdcdUQ4M0NcdUREOTUnIDogJ1x1RDgzRFx1RENERCc7XG4gICAgICAgICAgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj4nICsgaWNvbiArICcgJyArIGVzY2FwZUh0bWwoaW5mby5kZXNjcmlwdGlvbikgKyAnPC9zcGFuPic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcblxuICAgICAgICAvLyBTZXJ2aWNlcyBjb3VudFxuICAgICAgICBpZiAocHJldmlldy5wcmV2aWV3LnNlcnZpY2VDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj4nICsgcHJldmlldy5wcmV2aWV3LnNlcnZpY2VDb3VudCArICcgc2VydmljZXM8L2Rpdj4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlbWVzXG4gICAgICAgIGlmIChwcmV2aWV3LnByZXZpZXcudGhlbWVDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IG1hcmdpbi1ib3R0b206IDZweDtcIj5cdUQ4M0NcdURGQTggJyArIHByZXZpZXcucHJldmlldy50aGVtZUNvdW50ICsgJyBjdXN0b20gdGhlbWVzPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJyb3dzZXIgc3RhdGVcbiAgICAgICAgaWYgKHByZXZpZXcucHJldmlldy5icm93c2VyU3RhdGVDb3VudCkge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1wiPkJyb3dzZXIgUHJlZmVyZW5jZXM8L2Rpdj4nO1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNEXHVEREE1XHVGRTBGICcgKyBwcmV2aWV3LnByZXZpZXcuYnJvd3NlclN0YXRlQ291bnQgKyAnIHNhdmVkIHNldHRpbmdzICh0aGVtZSwgd2VhdGhlciwgY2xvY2ssIHdpZGdldHMsIGV0Yy4pPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpZXdDb250ZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjZBMFx1RkUwRiBJbnZhbGlkIGJhY2t1cCBmaWxlOiAnICsgZXNjYXBlSHRtbChwcmV2aWV3LmVycm9yKTtcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmMzljMTInO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgQ291bGQgbm90IHJlYWQgZmlsZTogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKTtcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1iYWQtZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLWJhZC1mZyknO1xuICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09IFJFU1RPUkU6IFNlcnZlciArIGJyb3dzZXIgc3RhdGUgPT09XG4gIHJlc3RvcmVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKCFzZWxlY3RlZEJhY2t1cCkgcmV0dXJuO1xuICAgIGlmICghY29uZmlybSgnVGhpcyB3aWxsIG92ZXJ3cml0ZSB5b3VyIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgYnJvd3NlciBwcmVmZXJlbmNlcy4gQ29udGludWU/JykpIHJldHVybjtcbiAgICByZXN0b3JlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICByZXN0b3JlQnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IFJlc3RvcmluZy4uLic7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEhhbmRsZSBsZWdhY3kgZm9ybWF0XG4gICAgICBpZiAoaXNMZWdhY3lGb3JtYXQoc2VsZWN0ZWRCYWNrdXApKSB7XG4gICAgICAgIHJlc3RvcmVMZWdhY3lGb3JtYXQoc2VsZWN0ZWRCYWNrdXApO1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gJ1x1MjcwNSBMZWdhY3kgYmFja3VwIHJlc3RvcmVkIFx1MjAxNCBicm93c2VyIHNldHRpbmdzIGFuZCBzZXJ2aWNlcyBpbXBvcnRlZC4nO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tb2stZmcpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBsb2NhdGlvbi5yZWxvYWQoKTsgfSwgMjAwMCk7XG4gICAgICAgIHJlc3RvcmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmVzdG9yZUJ0bi5pbm5lckhUTUwgPSAnXHUyNkExIFJlc3RvcmUgRXZlcnl0aGluZyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gdjEuMSsgLyB2Mi4wIFx1MjAxNCByZXN0b3JlIHNlcnZlci1zaWRlIGZpcnN0XG4gICAgICB2YXIgcmVsb2FkQ2FkZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlbG9hZC1jYWRkeScpPy5jaGVja2VkID8/IHRydWU7XG4gICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXAvcmVzdG9yZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGJhY2t1cDogc2VsZWN0ZWRCYWNrdXAsIG9wdGlvbnM6IHsgcmVsb2FkQ2FkZHk6IHJlbG9hZENhZGR5IH0gfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIC8vIFRoZW4gcmVzdG9yZSBicm93c2VyIHN0YXRlXG4gICAgICB2YXIgYnJvd3NlckNvdW50ID0gMDtcbiAgICAgIGlmIChzZWxlY3RlZEJhY2t1cC5icm93c2VyU3RhdGUpIHtcbiAgICAgICAgYnJvd3NlckNvdW50ID0gcmVzdG9yZUJyb3dzZXJTdGF0ZShzZWxlY3RlZEJhY2t1cC5icm93c2VyU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHZhciBtc2cgPSAnXHUyNzA1ICcgKyBkYXRhLm1lc3NhZ2U7XG4gICAgICAgIGlmIChicm93c2VyQ291bnQgPiAwKSBtc2cgKz0gJzxicj48c21hbGwgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBicm93c2VyQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3MgcmVzdG9yZWQ8L3NtYWxsPic7XG4gICAgICAgIGlmIChkYXRhLnJlc3VsdHMuY2FkZHlSZWxvYWRlZCkgbXNnICs9ICc8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DYWRkeSBjb25maWd1cmF0aW9uIHJlbG9hZGVkPC9zbWFsbD4nO1xuICAgICAgICByZXN1bHREaXYuaW5uZXJIVE1MID0gbXNnO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tb2stZmcpJztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0sIDIwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI2QTBcdUZFMEYgJyArIGVzY2FwZUh0bWwoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgaWYgKGJyb3dzZXJDb3VudCA+IDApIHJlc3VsdERpdi5pbm5lckhUTUwgKz0gJzxicj48c21hbGwgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBicm93c2VyQ291bnQgKyAnIGJyb3dzZXIgc2V0dGluZ3Mgd2VyZSByZXN0b3JlZDwvc21hbGw+JztcbiAgICAgICAgaWYgKGRhdGEucmVzdWx0cz8uZXJyb3JzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCArPSAnPGJyPjxzbWFsbD4nICsgZGF0YS5yZXN1bHRzLmVycm9ycy5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gZXNjYXBlSHRtbChlLmZpbGUpICsgJzogJyArIGVzY2FwZUh0bWwoZS5lcnJvcik7IH0pLmpvaW4oJywgJykgKyAnPC9zbWFsbD4nO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5iYWNrZ3JvdW5kID0gJ2NvbG9yLW1peChpbiBzcmdiLCAjZjM5YzEyIDE1JSwgdHJhbnNwYXJlbnQpJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2YzOWMxMic7XG4gICAgICB9XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3NEMgUmVzdG9yZSBmYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1iYWQtZmcpJztcbiAgICB9XG4gICAgcmVzdG9yZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHJlc3RvcmVCdG4uaW5uZXJIVE1MID0gJ1x1MjZBMSBSZXN0b3JlIEV2ZXJ5dGhpbmcnO1xuICB9KTtcblxuICAvLyA9PT0gU2NoZWR1bGVzIFRhYiAoUHJlbWl1bSkgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTY2hlZHVsZXNUYWIoKSB7XG4gICAgaWYgKCFzY2hlZHVsZUNvbnRhaW5lcikgcmV0dXJuO1xuICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9zY2hlZHVsZScpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgXG4gICAgICBpZiAoZGF0YS5wcmVtaXVtUmVxdWlyZWQpIHtcbiAgICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwicGFkZGluZzogMjRweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAycmVtOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlx1MkI1MDwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlByZW1pdW0gRmVhdHVyZTwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF1dG8tYmFja3VwIHNjaGVkdWxpbmcgcmVxdWlyZXMgYSBEYXNoQ2FkZHkgUHJlbWl1bSBzdWJzY3JpcHRpb24uPC9kaXY+JyArXG4gICAgICAgICAgJzxidXR0b24gb25jbGljaz1cInNob3dOb3RpZmljYXRpb24oXFwnVXBncmFkZSB0byBQcmVtaXVtIHRvIGVuYWJsZSBhdXRvLWJhY2t1cHMhXFwnLCBcXCdpbmZvXFwnKTsgc2Nyb2xsVG9TZWN0aW9uKFxcJ2xpY2Vuc2VcXCcpO1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmMzljMTIsICNlNjdlMjIpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+VXBncmFkZSB0byBQcmVtaXVtPC9idXR0b24+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCBzY2hlZHVsZXMnKTtcbiAgICAgIFxuICAgICAgdmFyIHNjaGVkdWxlcyA9IGRhdGEuc2NoZWR1bGVzIHx8IFtdO1xuICAgICAgXG4gICAgICBpZiAoc2NoZWR1bGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjNGMDwvc3Bhbj4nICtcbiAgICAgICAgICAnPGRpdj5ObyBiYWNrdXAgc2NoZWR1bGVzIGNvbmZpZ3VyZWQ8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+U2VsZWN0IGFwcHMgYmVsb3cgdG8gZW5hYmxlIGF1dG8tYmFja3VwPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4O1wiPic7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVkdWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2NoID0gc2NoZWR1bGVzW2ldO1xuICAgICAgICB2YXIgbmV4dFJ1blN0ciA9IHNjaC5uZXh0UnVuID8gbmV3IERhdGUoc2NoLm5leHRSdW4pLnRvTG9jYWxlU3RyaW5nKCkgOiAnTm90IHNjaGVkdWxlZCc7XG4gICAgICAgIHZhciBsYXN0UnVuU3RyID0gc2NoLmxhc3RSdW4gPyBuZXcgRGF0ZShzY2gubGFzdFJ1bikudG9Mb2NhbGVTdHJpbmcoKSA6ICdOZXZlcic7XG4gICAgICAgIFxuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweCAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtc3dpdGNoXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAnICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNjaGVkdWxlLXRvZ2dsZVwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiJyArIChzY2guZW5hYmxlZCA/ICcgY2hlY2tlZCcgOiAnJykgKyAnIC8+JyArXG4gICAgICAgICAgJyAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgKHNjaC5lbmFibGVkID8gJ09OJyA6ICdPRkYnKSArICc8L3NwYW4+JyArXG4gICAgICAgICAgJyAgPC9sYWJlbD4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuOHJlbTsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5TY2hlZHVsZTo8L3NwYW4+IDxzZWxlY3QgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3RcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IHBhZGRpbmc6IDJweCA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiaG91cmx5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ2hvdXJseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+SG91cmx5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiZGFpbHlcIicgKyAoc2NoLnNjaGVkdWxlID09PSAnZGFpbHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPkRhaWx5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwid2Vla2x5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ3dlZWtseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+V2Vla2x5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICdtb250aGx5JyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5Nb250aGx5PC9vcHRpb24+JyArXG4gICAgICAgICAgJyAgPC9zZWxlY3Q+PC9kaXY+JyArXG4gICAgICAgICAgJyAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+S2VlcCBsYXN0Ojwvc3Bhbj4gPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInJldGVudGlvbi1pbnB1dFwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHZhbHVlPVwiJyArIChzY2gucmV0ZW50aW9uPy5rZWVwIHx8IDcpICsgJ1wiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAycHggNnB4O1wiIC8+PC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPicgK1xuICAgICAgICAgICcgIDxkaXY+TmV4dCBydW46ICcgKyBlc2NhcGVIdG1sKG5leHRSdW5TdHIpICsgJzwvZGl2PicgK1xuICAgICAgICAgICcgIDxkaXY+TGFzdCBydW46ICcgKyBlc2NhcGVIdG1sKGxhc3RSdW5TdHIpICsgJzwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJzY2hlZHVsZS1ydW4tbm93XCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1vay1mZykgMjAlLCB0cmFuc3BhcmVudCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW9rLWZnKTsgY29sb3I6IHZhcigtLW9rLWZnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XHUyNUI2XHVGRTBGIFJ1biBOb3c8L2J1dHRvbj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwic2NoZWR1bGUtZGVsZXRlXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XHVEODNEXHVEREQxXHVGRTBGIFJlbW92ZTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBcbiAgICAgIC8vIEFkZCBcIkFkZCBTY2hlZHVsZVwiIHNlY3Rpb24gYXQgYm90dG9tXG4gICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggZGFzaGVkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICc8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4OyBmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XHUyNzk1IEFkZCBOZXcgU2NoZWR1bGU8L2g0PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBmbGV4LXdyYXA6IHdyYXA7XCI+JyArXG4gICAgICAgICcgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibmV3LXNjaGVkdWxlLWFwcGlkXCIgcGxhY2Vob2xkZXI9XCJBcHAgSUQgKGUuZy4sIHBsZXgsIHNvbmFycilcIiBzdHlsZT1cImZsZXg6IDE7IG1pbi13aWR0aDogMTUwcHg7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTtcIiAvPicgK1xuICAgICAgICAnICA8c2VsZWN0IGlkPVwibmV3LXNjaGVkdWxlLWludGVydmFsXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7XCI+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImhvdXJseVwiPkhvdXJseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJkYWlseVwiIHNlbGVjdGVkPkRhaWx5PC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIndlZWtseVwiPldlZWtseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJtb250aGx5XCI+TW9udGhseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCI2aFwiPkV2ZXJ5IDYgaG91cnM8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiMzBtXCI+RXZlcnkgMzAgbWludXRlczwvb3B0aW9uPicgK1xuICAgICAgICAnICA8L3NlbGVjdD4nICtcbiAgICAgICAgJyAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cIm5ldy1zY2hlZHVsZS1yZXRlbnRpb25cIiB2YWx1ZT1cIjdcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgcGxhY2Vob2xkZXI9XCJLZWVwXCIgc3R5bGU9XCJ3aWR0aDogNzBweDsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpO1wiIC8+JyArXG4gICAgICAgICcgIDxidXR0b24gaWQ9XCJhZGQtc2NoZWR1bGUtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPkFkZCBTY2hlZHVsZTwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nO1xuICAgICAgXG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgXG4gICAgICAvLyBXaXJlIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLXRvZ2dsZScpLmZvckVhY2goZnVuY3Rpb24odG9nZ2xlKSB7XG4gICAgICAgIHRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdXBkYXRlU2NoZWR1bGUodG9nZ2xlLmRhdGFzZXQuYXBwaWQsIHsgZW5hYmxlZDogdG9nZ2xlLmNoZWNrZWQgfSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2NoZWR1bGUtc2VsZWN0JykuZm9yRWFjaChmdW5jdGlvbihzZWwpIHtcbiAgICAgICAgc2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyB1cGRhdGVTY2hlZHVsZShzZWwuZGF0YXNldC5hcHBpZCwgeyBzY2hlZHVsZTogc2VsLnZhbHVlIH0pOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnJldGVudGlvbi1pbnB1dCcpLmZvckVhY2goZnVuY3Rpb24oaW5wKSB7XG4gICAgICAgIGlucC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdXBkYXRlU2NoZWR1bGUoaW5wLmRhdGFzZXQuYXBwaWQsIHsgcmV0ZW50aW9uOiB7IGtlZXA6IHBhcnNlSW50KGlucC52YWx1ZSkgfHwgNyB9IH0pOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLXJ1bi1ub3cnKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgcnVuQmFja3VwTm93KGJ0bi5kYXRhc2V0LmFwcGlkKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS1kZWxldGUnKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgZGVsZXRlU2NoZWR1bGUoYnRuLmRhdGFzZXQuYXBwaWQpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zY2hlZHVsZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGROZXdTY2hlZHVsZSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQgdG8gbG9hZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NoZWR1bGUoYXBwSWQsIHVwZGF0ZXMpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZCwgLi4udXBkYXRlcyB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NjaGVkdWxlIHVwZGF0ZWQgZm9yICcgKyBhcHBJZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1VwZGF0ZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgICAgbG9hZFNjaGVkdWxlc1RhYigpOyAvLyBSZWZyZXNoIG9uIGZhaWx1cmVcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBmdW5jdGlvbiBydW5CYWNrdXBOb3coYXBwSWQpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvYmFja3VwLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0JhY2t1cCBzdGFydGVkIGZvciAnICsgYXBwSWQgKyAnIScsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdCYWNrdXAgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlU2NoZWR1bGUoYXBwSWQpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ1JlbW92ZSBiYWNrdXAgc2NoZWR1bGUgZm9yICcgKyBhcHBJZCArICc/JykpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUvJyArIGVuY29kZVVSSUNvbXBvbmVudChhcHBJZCksIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignU2NoZWR1bGUgcmVtb3ZlZCBmb3IgJyArIGFwcElkLCAnc3VjY2VzcycpO1xuICAgICAgICBsb2FkU2NoZWR1bGVzVGFiKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZWxldGUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gYWRkTmV3U2NoZWR1bGUoKSB7XG4gICAgdmFyIGFwcElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1hcHBpZCcpPy52YWx1ZT8udHJpbSgpO1xuICAgIHZhciBpbnRlcnZhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtaW50ZXJ2YWwnKT8udmFsdWUgfHwgJ2RhaWx5JztcbiAgICB2YXIgcmV0ZW50aW9uID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1yZXRlbnRpb24nKT8udmFsdWUpIHx8IDc7XG4gICAgXG4gICAgaWYgKCFhcHBJZCkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGFuIEFwcCBJRCcsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9zY2hlZHVsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFwcElkLCBzY2hlZHVsZTogaW50ZXJ2YWwsIHJldGVudGlvbjogeyBrZWVwOiByZXRlbnRpb24gfSwgZW5hYmxlZDogdHJ1ZSB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NjaGVkdWxlIGNyZWF0ZWQgZm9yICcgKyBhcHBJZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgbG9hZFNjaGVkdWxlc1RhYigpO1xuICAgICAgICAvLyBDbGVhciBpbnB1dHNcbiAgICAgICAgdmFyIGFwcElkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNjaGVkdWxlLWFwcGlkJyk7XG4gICAgICAgIGlmIChhcHBJZElucHV0KSBhcHBJZElucHV0LnZhbHVlID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdGYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG4gIFxuICAvLyA9PT0gQmFja3VwcyBvbiBEaXNrIFRhYiA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZERpc2tCYWNrdXBzKCkge1xuICAgIGlmICghZGlza0NvbnRhaW5lcikgcmV0dXJuO1xuICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXBzL2ZpbGVzJyk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkJyk7XG5cbiAgICAgIHZhciBmaWxlcyA9IGRhdGEuZmlsZXMgfHwgW107XG5cbiAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGlza0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+JyArXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENCRTwvc3Bhbj4nICtcbiAgICAgICAgICAnPGRpdj5ObyBiYWNrdXAgZmlsZXMgb24gZGlzazwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5SdW4gYSBiYWNrdXAgdG8gY3JlYXRlIGJhY2t1cCBmaWxlczwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEdyb3VwIGJ5IGFwcElkXG4gICAgICB2YXIgYnlBcHAgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGYgPSBmaWxlc1tpXTtcbiAgICAgICAgdmFyIGFwcElkID0gZi5hcHBJZCB8fCAndW5rbm93bic7XG4gICAgICAgIGlmICghYnlBcHBbYXBwSWRdKSBieUFwcFthcHBJZF0gPSBbXTtcbiAgICAgICAgYnlBcHBbYXBwSWRdLnB1c2goZik7XG4gICAgICB9XG5cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JyArIGZpbGVzLmxlbmd0aCArICcgYmFja3VwIGZpbGUocykgYWNyb3NzICcgKyBPYmplY3Qua2V5cyhieUFwcCkubGVuZ3RoICsgJyBhcHAocyk8L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTJweDtcIj4nO1xuXG4gICAgICB2YXIgYXBwSWRzID0gT2JqZWN0LmtleXMoYnlBcHApLnNvcnQoKTtcbiAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgYXBwSWRzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgIHZhciBhcHBJZCA9IGFwcElkc1thXTtcbiAgICAgICAgdmFyIGFwcEZpbGVzID0gYnlBcHBbYXBwSWRdO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBvdmVyZmxvdzogaGlkZGVuO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDglLCB0cmFuc3BhcmVudCk7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JyArXG4gICAgICAgICAgZXNjYXBlSHRtbChhcHBJZCkgKyAnIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IG5vcm1hbDsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPignICsgYXBwRmlsZXMubGVuZ3RoICsgJyBiYWNrdXAocykpPC9zcGFuPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXBwRmlsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICB2YXIgZiA9IGFwcEZpbGVzW2pdO1xuICAgICAgICAgIHZhciBkYXRlU3RyID0gbmV3IERhdGUoZi50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgK1xuICAgICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgZi5zaXplRm9ybWF0dGVkICsgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICsgZGF0ZVN0ciArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwiZGlzay1jb21wYXJlLWJ0blwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnXCIgZGF0YS1maWxlbmFtZT1cIicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+Q29tcGFyZTwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cImRpc2stcmVzdG9yZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1vay1mZyksICMyN2FlNjApOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+UmVzdG9yZTwvYnV0dG9uPicgK1xuICAgICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgLy8gV2lyZSB1cCBidXR0b25zXG4gICAgICBkaXNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXNrLWNvbXBhcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGNvbXBhcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgICBkaXNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaXNrLXJlc3RvcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHJlc3RvcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGlza0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cbiAgXG4gIC8vID09PSBCYWNrdXAgSGlzdG9yeSBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRCYWNrdXBIaXN0b3J5KCkge1xuICAgIGlmICghaGlzdG9yeUNvbnRhaW5lcikgcmV0dXJuO1xuICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXBzL2hpc3Rvcnk/bGltaXQ9NTAnKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+IE5vIGJhY2t1cCBoaXN0b3J5IHlldDwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj4nO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmhpc3RvcnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGJrID0gZGF0YS5oaXN0b3J5W2ldO1xuICAgICAgICB2YXIgc2l6ZU1CID0gYmsuc2l6ZSA/IChiay5zaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMikgOiAnPyc7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7XCI+JyArIGVzY2FwZUh0bWwoYmsubmFtZSB8fCAnYmFja3VwJykgKyAnPC9zcGFuPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+JztcbiAgICAgICAgaHRtbCArPSAnICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtYmFkZ2UgJyArIChiay5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICdzdWNjZXNzJyA6ICdkb3duJykgKyAnXCI+JyArIGVzY2FwZUh0bWwoYmsuc3RhdHVzKSArICc8L3NwYW4+JztcbiAgICAgICAgaWYgKGJrLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSBodG1sICs9ICcgICAgICA8YnV0dG9uIGNsYXNzPVwiYmFja3VwLXJlc3RvcmUtYnRuXCIgZGF0YS1iYWNrdXAtaWQ9XCInICsgZXNjYXBlSHRtbChiay5pZCkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07XCI+UmVzdG9yZTwvYnV0dG9uPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICA8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICcgIDwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJyAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nO1xuICAgICAgICBodG1sICs9ICcgICAgJyArIG5ldyBEYXRlKGJrLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKSArICcgfCAnICsgc2l6ZU1CICsgJyBNQiB8ICcgKyAoYmsuZHVyYXRpb24gPyAoYmsuZHVyYXRpb24gLyAxMDAwKS50b0ZpeGVkKDEpICsgJ3MnIDogJy0tJyk7XG4gICAgICAgIGlmIChiay5lbmNyeXB0ZWQpIGh0bWwgKz0gJyB8IFx1RDgzRFx1REQxMic7XG4gICAgICAgIGh0bWwgKz0gJyAgPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5iYWNrdXAtcmVzdG9yZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgd2luZG93Ll9fcmVzdG9yZVNlcnZlckJhY2t1cChidG4uZGF0YXNldC5iYWNrdXBJZCk7IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICB3aW5kb3cuX19yZXN0b3JlU2VydmVyQmFja3VwID0gYXN5bmMgZnVuY3Rpb24oYmFja3VwSWQpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc3RvcmUgZnJvbSB0aGlzIHNlcnZlciBiYWNrdXA/IFRoaXMgd2lsbCBvdmVyd3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uLicpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3Jlc3RvcmUvJyArIGJhY2t1cElkLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByZXN0b3JlU2VydmljZXM6IHRydWUsIHJlc3RvcmVDb25maWc6IHRydWUgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7IH1cbiAgfTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImJhY2t1cC1zY2hlZHVsZXMtdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFNjaGVkdWxlc1RhYik7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLWRpc2stdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZERpc2tCYWNrdXBzKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtcG9pbnRpbnRpbWUtdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFBvaW50SW5UaW1lVGFiKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtaGlzdG9yeS10YWJcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQmFja3VwSGlzdG9yeSk7XG5cbiAgLy8gPT09PT0gUG9pbnQtaW4tVGltZSBSZXN0b3JlIFRhYiA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkUG9pbnRJblRpbWVUYWIoKSB7XG4gICAgaWYgKCFwb2ludGludGltZUNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgcHJlbWl1bVxuICAgIHRyeSB7XG4gICAgICB2YXIgbGljZW5zZVJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2Uvc3RhdHVzJyk7XG4gICAgICB2YXIgbGljZW5zZURhdGEgPSBhd2FpdCBsaWNlbnNlUmVzLmpzb24oKTtcbiAgICAgIGlmIChsaWNlbnNlRGF0YS50aWVyICE9PSAncHJlbWl1bScpIHtcbiAgICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwicGFkZGluZzogMjRweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAycmVtOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlx1MkI1MDwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlByZW1pdW0gRmVhdHVyZTwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlBvaW50LWluLXRpbWUgcmVzdG9yZSByZXF1aXJlcyBEYXNoQ2FkZHkgUHJlbWl1bSB3aXRoIGF1dG8tYmFja3VwIGVuYWJsZWQuPC9kaXY+JyArXG4gICAgICAgICAgJzxidXR0b24gb25jbGljaz1cInNob3dOb3RpZmljYXRpb24oXFwnVXBncmFkZSB0byBQcmVtaXVtIGZvciBwb2ludC1pbi10aW1lIHJlc3RvcmUhXFwnLCBcXCdpbmZvXFwnKTsgc2Nyb2xsVG9TZWN0aW9uKFxcJ2xpY2Vuc2VcXCcpO1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmMzljMTIsICNlNjdlMjIpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+VXBncmFkZSB0byBQcmVtaXVtPC9idXR0b24+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9XG5cbiAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICAvLyBGZXRjaCBzZXJ2aWNlcyBmb3IgZHJvcGRvd25cbiAgICAgIHZhciBzZXJ2aWNlc1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlcnZpY2VzJyk7XG4gICAgICB2YXIgc2VydmljZXNEYXRhID0gYXdhaXQgc2VydmljZXNSZXMuanNvbigpO1xuICAgICAgdmFyIHNlcnZpY2VzID0gc2VydmljZXNEYXRhLnNlcnZpY2VzIHx8IFtdO1xuXG4gICAgICBpZiAoc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+IE5vIGFwcHMgZGVwbG95ZWQgeWV0PC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogOHB4IDAgMTJweDtcIj4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj4nICtcbiAgICAgICAgJyAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPkFwcDo8L2xhYmVsPicgK1xuICAgICAgICAnICA8c2VsZWN0IGlkPVwicGl0LWFwcC1zZWxlY3RcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgbWF4LXdpZHRoOiAyNDBweDtcIj4nO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBodG1sICs9ICc8b3B0aW9uIHZhbHVlPVwiJyArIGVzY2FwZUh0bWwoc2VydmljZXNbaV0uaWQgfHwgc2VydmljZXNbaV0ubmFtZSB8fCAnJykgKyAnXCI+JyArXG4gICAgICAgICAgZXNjYXBlSHRtbChzZXJ2aWNlc1tpXS5uYW1lIHx8IHNlcnZpY2VzW2ldLmlkIHx8ICcnKSArICc8L29wdGlvbj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9zZWxlY3Q+JyArXG4gICAgICAgICcgIDxidXR0b24gaWQ9XCJwaXQtbG9hZC1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+TG9hZCBCYWNrdXBzPC9idXR0b24+JyArXG4gICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgaWQ9XCJwaXQtYmFja3Vwcy1saXN0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMjBweDsgb3ZlcmZsb3cteTogYXV0bztcIj48L2Rpdj4nICtcbiAgICAgICAgJzwvZGl2Pic7XG5cbiAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXQtbG9hZC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFwcElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpdC1hcHAtc2VsZWN0Jyk/LnZhbHVlO1xuICAgICAgICBpZiAoYXBwSWQpIGxvYWRQb2ludEluVGltZUJhY2t1cHMoYXBwSWQpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFBvaW50SW5UaW1lQmFja3VwcyhhcHBJZCkge1xuICAgIHZhciBsaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl0LWJhY2t1cHMtbGlzdCcpO1xuICAgIGlmICghbGlzdEVsKSByZXR1cm47XG5cbiAgICBsaXN0RWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGJhY2t1cHMuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9iYWNrdXBzL2ZpbGVzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuZmlsZXMgfHwgZGF0YS5maWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+IE5vIGJhY2t1cCBmaWxlcyBmb3IgJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJzwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPicgKyBkYXRhLmZpbGVzLmxlbmd0aCArICcgYmFja3VwKHMpPC9kaXY+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7XCI+JztcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmID0gZGF0YS5maWxlc1tpXTtcbiAgICAgICAgdmFyIGRhdGVTdHIgPSBuZXcgRGF0ZShmLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJzwvZGl2PicgK1xuICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGYuc2l6ZUZvcm1hdHRlZCArICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICsgZGF0ZVN0ciArICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJwaXQtY29tcGFyZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBib3JkZXItcmFkaXVzOiA1cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5Db21wYXJlPC9idXR0b24+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInBpdC1yZXN0b3JlLWJ0blwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChhcHBJZCkgKyAnXCIgZGF0YS1maWxlbmFtZT1cIicgKyBlc2NhcGVIdG1sKGYubmFtZSkgKyAnXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1vay1mZyksICMyN2FlNjApOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+UmVzdG9yZTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBsaXN0RWwuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgLy8gV2lyZSB1cCBidXR0b25zXG4gICAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLnBpdC1jb21wYXJlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBjb21wYXJlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXQtcmVzdG9yZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgcmVzdG9yZUJhY2t1cEZpbGUoYnRuLmRhdGFzZXQuYXBwaWQsIGJ0bi5kYXRhc2V0LmZpbGVuYW1lKTsgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsaXN0RWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY29tcGFyZUJhY2t1cEZpbGUoYXBwSWQsIGZpbGVuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL2NvbXBhcmUvJyArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSksIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignQ29tcGFyZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGlmZiA9IGRhdGEuZGlmZjtcbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogZml4ZWQ7IHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjUpOyB6LWluZGV4OiAxMDAwMDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIgaWQ9XCJjb21wYXJlLW92ZXJsYXlcIj4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogMTJweDsgbWF4LXdpZHRoOiA2MDBweDsgd2lkdGg6IDkwJTsgbWF4LWhlaWdodDogODB2aDsgb3ZlcmZsb3c6IGF1dG87IHBhZGRpbmc6IDIwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICc8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCAxNnB4O1wiPlx1RDgzRFx1RENDQSBDb21wYXJlOiAnICsgZXNjYXBlSHRtbChmaWxlbmFtZSkgKyAnPC9oND4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5TaXplOiAnICsgKGRpZmYuc2l6ZUZvcm1hdHRlZCB8fCAnPycpICsgJyB8IENyZWF0ZWQ6ICcgKyBuZXcgRGF0ZShkaWZmLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKSArICc8L2Rpdj4nO1xuXG4gICAgICBpZiAoZGlmZi5zZXJ2aWNlcykge1xuICAgICAgICB2YXIgc3ZjQ2hhbmdlZCA9IGRpZmYuc2VydmljZXMuaGFzQ2hhbmdlcyA/ICdcdUQ4M0RcdUREMzQnIDogJ1x1RDgzRFx1REZFMic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICsgc3ZjQ2hhbmdlZCArICcgU2VydmljZXMgKGJhY2t1cCB2cyBjdXJyZW50KTwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QmFja3VwOiAnICsgZGlmZi5zZXJ2aWNlcy5iYWNrdXBDb3VudCArICcgc2VydmljZXMgfCBDdXJyZW50OiAnICsgZGlmZi5zZXJ2aWNlcy5jdXJyZW50Q291bnQgKyAnIHNlcnZpY2VzPC9kaXY+JztcbiAgICAgICAgaWYgKGRpZmYuc2VydmljZXMuaGFzQ2hhbmdlcykge1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2YzOWMxMjtcIj5TZXJ2aWNlcyBkaWZmZXIgXHUyMDE0IHJlc3RvcmluZyB3aWxsIHJlcGxhY2UgY3VycmVudCBjb25maWd1cmF0aW9uPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlmZi5jb25maWcpIHtcbiAgICAgICAgdmFyIGNmZ0NoYW5nZWQgPSBkaWZmLmNvbmZpZy5oYXNDaGFuZ2VzID8gJ1x1RDgzRFx1REQzNCcgOiAnXHVEODNEXHVERkUyJztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgKyBjZmdDaGFuZ2VkICsgJyBDb25maWd1cmF0aW9uPC9kaXY+JztcbiAgICAgICAgaWYgKGRpZmYuY29uZmlnLmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjZjM5YzEyO1wiPkNvbmZpZ3VyYXRpb24gZGlmZmVycyBcdTIwMTQgcmVzdG9yaW5nIHdpbGwgcmVwbGFjZSBjdXJyZW50IHNldHRpbmdzPC9kaXY+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1vay1mZyk7XCI+Tm8gY2hhbmdlczwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cblxuICAgICAgaHRtbCArPSAnPGJ1dHRvbiBpZD1cImNvbXBhcmUtY2xvc2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPkNsb3NlPC9idXR0b24+JyArXG4gICAgICAgICc8L2Rpdj48L2Rpdj4nO1xuXG4gICAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyZS1jbG9zZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmUtb3ZlcmxheScpPy5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmUtb3ZlcmxheScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSB0aGlzKSB0aGlzLnJlbW92ZSgpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ29tcGFyZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVzdG9yZUJhY2t1cEZpbGUoYXBwSWQsIGZpbGVuYW1lKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZXN0b3JlICcgKyBmaWxlbmFtZSArICcgZm9yICcgKyBhcHBJZCArICc/XFxuXFxuVGhpcyB3aWxsIHJlcGxhY2UgY3VycmVudCBjb25maWd1cmF0aW9uLCBjcmVkZW50aWFscywgYW5kIGRhdGEuIENvbnRhaW5lcnMgd2lsbCBiZSByZXN0YXJ0ZWQuJykpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXBwcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSArICcvcmV2ZXJ0LycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByZXN0YXJ0Q29udGFpbmVyczogdHJ1ZSB9KVxuICAgICAgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYXBwSWQgKyAnIHJlc3RvcmVkIHRvICcgKyBmaWxlbmFtZSwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0sIDE1MDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93bicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZXN0b3JlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFJFU09VUkNFIE1PTklUT1IgKEVuaGFuY2VkKSA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdzdGF0cy1tb2RhbCcsIGA8ZGl2IGlkPVwic3RhdHMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDc1MHB4OyBtYXgtd2lkdGg6IDk1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENDQSBSZXNvdXJjZSBNb25pdG9yPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgUmVhbC10aW1lIGFuZCBoaXN0b3JpY2FsIENQVSwgbWVtb3J5LCBuZXR3b3JrLCBhbmQgZGlzayB1c2FnZSBmb3IgY29udGFpbmVycy5cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBUYWIgYmFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwic3RhdHMtbGl2ZVwiPkxpdmUgU3RhdHM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzdGF0cy1hZ2dyZWdhdGVkXCI+MjRoIFN1bW1hcnk8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzdGF0cy1oaXN0b3J5XCI+SGlzdG9yeTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInN0YXRzLWFsZXJ0c1wiPkFsZXJ0czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBMaXZlIFN0YXRzIC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWxpdmVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGNvbnRhaW5lciBzdGF0cy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogMjRoIEFnZ3JlZ2F0ZWQgU3VtbWFyeSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hZ2dyZWdhdGVkXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hZ2dyZWdhdGVkLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0M4PC9zcGFuPlxuICAgICAgICAgICAgTG9hZGluZyAyNC1ob3VyIGFnZ3JlZ2F0ZWQgbWV0cmljcy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogTG9uZy10ZXJtIEhpc3RvcnkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtaGlzdG9yeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDEycHg7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyOjwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInN0YXRzLWhpc3RvcnktY29udGFpbmVyXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgZmxleDogMTsgbWluLXdpZHRoOiAxODBweDtcIj48L3NlbGVjdD5cbiAgICAgICAgICA8ZGl2IGlkPVwic3RhdHMtaGlzdG9yeS1yYW5nZS1idXR0b25zXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG4gYWN0aXZlXCIgZGF0YS1yYW5nZT1cIjFoXCI+MWg8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiMjRoXCI+MjRoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjdkXCI+N2Q8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzdGF0cy1yYW5nZS1idG5cIiBkYXRhLXJhbmdlPVwiMzBkXCI+MzBkPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjF5XCI+MXk8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1oaXN0b3J5LWNvbnRhaW5lci1hcmVhXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0E8L3NwYW4+XG4gICAgICAgICAgICBDaG9vc2UgYSBjb250YWluZXIgYW5kIHRpbWUgcmFuZ2UgdG8gdmlldyBoaXN0b3J5LlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQWxlcnQgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hbGVydHNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInN0YXRzLWFsZXJ0cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REQxNDwvc3Bhbj5cbiAgICAgICAgICAgIExvYWRpbmcgYWxlcnQgY29uZmlndXJhdGlvbnMuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBBdXRvLXJlZnJlc2ggdG9nZ2xlIChib3R0b20gYmFyKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3R0b20tYmFyXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic3RhdHMtYXV0by1yZWZyZXNoXCIgY2hlY2tlZCAvPlxuICAgICAgICAgIEF1dG8tcmVmcmVzaCBldmVyeSA1c1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8YnV0dG9uIGlkPVwic3RhdHMtcmVmcmVzaC1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoIE5vdzwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cInN0YXRzLWxhc3QtdXBkYXRlXCIgY2xhc3M9XCJ0ZXh0LWF1dG8tcmlnaHRcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN0YXRzLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXItc3RhdHMtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1jYW5jZWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBhdXRvUmVmcmVzaENoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWF1dG8tcmVmcmVzaCcpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGFnZ3JlZ2F0ZWRDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtYWdncmVnYXRlZC1jb250YWluZXInKTtcbiAgY29uc3QgYWxlcnRzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWFsZXJ0cy1jb250YWluZXInKTtcbiAgY29uc3QgbGFzdFVwZGF0ZVNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtbGFzdC11cGRhdGUnKTtcblxuICBsZXQgcmVmcmVzaEludGVydmFsID0gbnVsbDtcbiAgbGV0IGNhY2hlZE1vbml0b3JpbmdEYXRhID0gbnVsbDtcblxuICBmdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlcykge1xuICAgIGlmIChieXRlcyA9PT0gMCB8fCAhYnl0ZXMpIHJldHVybiAnMCBCJztcbiAgICBjb25zdCBrID0gMTAyNDtcbiAgICBjb25zdCBzaXplcyA9IFsnQicsICdLQicsICdNQicsICdHQiddO1xuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgxKSkgKyAnICcgKyBzaXplc1tpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldENwdUNvbG9yKHBlcmNlbnQpIHtcbiAgICBpZiAocGVyY2VudCA8IDMwKSByZXR1cm4gJyMyZWNjNzEnO1xuICAgIGlmIChwZXJjZW50IDwgNzApIHJldHVybiAnI2YzOWMxMic7XG4gICAgcmV0dXJuICcjZTc0YzNjJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1lbUNvbG9yKHBlcmNlbnQpIHtcbiAgICBpZiAocGVyY2VudCA8IDUwKSByZXR1cm4gJyMyZWNjNzEnO1xuICAgIGlmIChwZXJjZW50IDwgODApIHJldHVybiAnI2YzOWMxMic7XG4gICAgcmV0dXJuICcjZTc0YzNjJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTdGF0cygpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IG5ldyBtb25pdG9yaW5nIEFQSSBmaXJzdCwgZmFsbCBiYWNrIHRvIG9sZFxuICAgICAgbGV0IHN0YXRzID0gbnVsbDtcbiAgICAgIGxldCBpc05ld0FwaSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9zdGF0cycpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLnN0YXRzKSB7IHN0YXRzID0gZGF0YS5zdGF0czsgaXNOZXdBcGkgPSB0cnVlOyBjYWNoZWRNb25pdG9yaW5nRGF0YSA9IGRhdGEuc3RhdHM7IH1cbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAgIGlmICghaXNOZXdBcGkpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zdGF0cy9jb250YWluZXJzJyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5zdGF0cykge1xuICAgICAgICAgIC8vIENvbnZlcnQgYXJyYXkgZm9ybWF0IHRvIG9iamVjdCBmb3JtYXRcbiAgICAgICAgICBzdGF0cyA9IHt9O1xuICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBkYXRhLnN0YXRzKSB7XG4gICAgICAgICAgICBzdGF0c1tzLm5hbWVdID0geyBuYW1lOiBzLm5hbWUsIGN1cnJlbnQ6IHsgY3B1OiBzLmNwdSwgbWVtb3J5OiB7IHBlcmNlbnQ6IHMubWVtb3J5LnBlcmNlbnQsIHVzYWdlOiBzLm1lbW9yeS51c2VkLCBsaW1pdDogcy5tZW1vcnkubGltaXQsIHVzYWdlTUI6IE1hdGgucm91bmQocy5tZW1vcnkudXNlZCAvIDEwNDg1NzYpLCBsaW1pdE1COiBNYXRoLnJvdW5kKHMubWVtb3J5LmxpbWl0IC8gMTA0ODU3NikgfSwgbmV0d29yazogeyByeEJ5dGVzOiBzLm5ldHdvcmsucngsIHR4Qnl0ZXM6IHMubmV0d29yay50eCwgcnhNQjogKHMubmV0d29yay5yeCAvIDEwNDg1NzYpLnRvRml4ZWQoMSksIHR4TUI6IChzLm5ldHdvcmsudHggLyAxMDQ4NTc2KS50b0ZpeGVkKDEpIH0sIGRpc2s6IHsgcmVhZE1COiAwLCB3cml0ZU1COiAwIH0gfSwgc3RhdHVzOiBzLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYWNoZWRNb25pdG9yaW5nRGF0YSA9IHN0YXRzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RhdHMgfHwgT2JqZWN0LmtleXMoc3RhdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gcnVubmluZyBjb250YWluZXJzIGZvdW5kPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA4cHg7XCI+JztcblxuICAgICAgZm9yIChjb25zdCBbaWQsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKHN0YXRzKSkge1xuICAgICAgICBjb25zdCBjdXIgPSBpbmZvLmN1cnJlbnQgfHwgaW5mbztcbiAgICAgICAgY29uc3QgY3B1ID0gY3VyLmNwdT8ucGVyY2VudCB8fCAwO1xuICAgICAgICBjb25zdCBtZW0gPSBjdXIubWVtb3J5Py5wZXJjZW50IHx8IDA7XG4gICAgICAgIGNvbnN0IGNwdUNvbG9yID0gZ2V0Q3B1Q29sb3IoY3B1KTtcbiAgICAgICAgY29uc3QgbWVtQ29sb3IgPSBnZXRNZW1Db2xvcihtZW0pO1xuICAgICAgICBjb25zdCBtZW1Vc2VkID0gY3VyLm1lbW9yeT8udXNhZ2UgfHwgY3VyLm1lbW9yeT8udXNlZCB8fCAwO1xuICAgICAgICBjb25zdCBtZW1MaW1pdCA9IGN1ci5tZW1vcnk/LmxpbWl0IHx8IDA7XG4gICAgICAgIGNvbnN0IG5ldFJ4ID0gY3VyLm5ldHdvcms/LnJ4Qnl0ZXMgfHwgY3VyLm5ldHdvcms/LnJ4IHx8IDA7XG4gICAgICAgIGNvbnN0IG5ldFR4ID0gY3VyLm5ldHdvcms/LnR4Qnl0ZXMgfHwgY3VyLm5ldHdvcms/LnR4IHx8IDA7XG4gICAgICAgIGNvbnN0IGFnZyA9IGluZm8uYWdncmVnYXRlZDtcblxuICAgICAgICBodG1sICs9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTJweDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmbGV4OiAxO1wiPiR7aW5mby5uYW1lIHx8IGlkfTwvc3Bhbj5cbiAgICAgICAgICAgICAgJHthZ2cgPyBgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDJweCA2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDEwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+YXZnICR7YWdnLmNwdT8uYXZnPy50b0ZpeGVkKDApIHx8IDB9JSBjcHU8L3NwYW4+YCA6ICcnfVxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IHBhZGRpbmc6IDJweCA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj4ke2luZm8uc3RhdHVzIHx8ICdydW5uaW5nJ308L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+Q1BVPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IGhlaWdodDogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogM3B4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogJHtNYXRoLm1pbihjcHUsIDEwMCl9JTsgYmFja2dyb3VuZDogJHtjcHVDb2xvcn07IGJvcmRlci1yYWRpdXM6IDNweDsgdHJhbnNpdGlvbjogd2lkdGggMC4zcztcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgY29sb3I6ICR7Y3B1Q29sb3J9OyBtaW4td2lkdGg6IDQ1cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPiR7Y3B1LnRvRml4ZWQoMSl9JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+TWVtb3J5PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7IGhlaWdodDogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogM3B4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogJHtNYXRoLm1pbihtZW0sIDEwMCl9JTsgYmFja2dyb3VuZDogJHttZW1Db2xvcn07IGJvcmRlci1yYWRpdXM6IDNweDsgdHJhbnNpdGlvbjogd2lkdGggMC4zcztcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgY29sb3I6ICR7bWVtQ29sb3J9OyBtaW4td2lkdGg6IDQ1cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPiR7bWVtLnRvRml4ZWQoMSl9JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+JHtmb3JtYXRCeXRlcyhtZW1Vc2VkKX0gLyAke2Zvcm1hdEJ5dGVzKG1lbUxpbWl0KX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+TmV0d29yazwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMzNDk4ZGI7XCI+XHUyMTkzICR7Zm9ybWF0Qnl0ZXMobmV0UngpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDRweDtcIj4vPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2U3NGMzYztcIj5cdTIxOTEgJHtmb3JtYXRCeXRlcyhuZXRUeCl9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICBsYXN0VXBkYXRlU3Bhbi50ZXh0Q29udGVudCA9ICdVcGRhdGVkOiAnICsgbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlx1Mjc0QyBGYWlsZWQgdG8gbG9hZCBzdGF0czogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyA9PT0gMjRoIEFnZ3JlZ2F0ZWQgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkQWdncmVnYXRlZCgpIHtcbiAgICBpZiAoIWFnZ3JlZ2F0ZWRDb250YWluZXIpIHJldHVybjtcbiAgICBjb25zdCBkYXRhID0gY2FjaGVkTW9uaXRvcmluZ0RhdGE7XG4gICAgaWYgKCFkYXRhIHx8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYWdncmVnYXRlZENvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0M4PC9zcGFuPk5vIG1vbml0b3JpbmcgZGF0YSBhdmFpbGFibGUuIE9wZW4gdGhlIExpdmUgU3RhdHMgdGFiIGZpcnN0LjwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7XCI+JztcbiAgICBmb3IgKGNvbnN0IFtpZCwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgIGNvbnN0IGFnZyA9IGluZm8uYWdncmVnYXRlZDtcbiAgICAgIGlmICghYWdnKSBjb250aW51ZTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPiR7aW5mby5uYW1lIHx8IGlkfTwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgMWZyKTsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLmNwdT8uYXZnPy50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+QXZnIENQVTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cuY3B1Py5tYXg/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5NYXggQ1BVPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5tZW1vcnk/LmF2Zz8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPkF2ZyBNZW08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLm1lbW9yeT8ubWF4Py50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+TWF4IE1lbTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgICR7YWdnLmRhdGFQb2ludHMgPyBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA2cHg7XCI+JHthZ2cuZGF0YVBvaW50c30gZGF0YSBwb2ludHMgb3ZlciAke2FnZy50aW1lUmFuZ2UgfHwgMjR9aDwvZGl2PmAgOiAnJ31cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgYWdncmVnYXRlZENvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICB9XG5cbiAgLy8gPT09IEFsZXJ0cyBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBbGVydHMoKSB7XG4gICAgaWYgKCFhbGVydHNDb250YWluZXIpIHJldHVybjtcbiAgICBhbGVydHNDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBhbGVydHMuLi48L2Rpdj4nO1xuXG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZE1vbml0b3JpbmdEYXRhO1xuICAgIGlmICghZGF0YSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGFsZXJ0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERDE0PC9zcGFuPk5vIGNvbnRhaW5lcnMgZm91bmQuIE9wZW4gdGhlIExpdmUgU3RhdHMgdGFiIGZpcnN0LjwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgcHJlbWl1bSBzdGF0dXMgZm9yIGNvbmZpZyBzZWN0aW9uIHZpc2liaWxpdHlcbiAgICBsZXQgaXNQcmVtaXVtID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9saWNlbnNlL2ZlYXR1cmUvcmVzb3VyY2UtYWxlcnRzJyk7XG4gICAgICBjb25zdCBsZCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaXNQcmVtaXVtID0gbGQuYXZhaWxhYmxlO1xuICAgIH0gY2F0Y2ggKF8pIHsgaXNQcmVtaXVtID0gZmFsc2U7IH1cblxuICAgIC8vIEZldGNoIGFsZXJ0IGhpc3RvcnlcbiAgICBsZXQgYWxlcnRIaXN0b3J5ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhyID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHM/bGltaXQ9NTAnKTtcbiAgICAgIGNvbnN0IGhkID0gYXdhaXQgaHIuanNvbigpO1xuICAgICAgaWYgKGhkLnN1Y2Nlc3MpIGFsZXJ0SGlzdG9yeSA9IGhkLmhpc3RvcnkgfHwgW107XG4gICAgfSBjYXRjaCAoXykge31cblxuICAgIC8vIEZldGNoIGFsbCBhbGVydCBjb25maWdzXG4gICAgbGV0IGFsbENvbmZpZ3MgPSB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3IgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tb25pdG9yaW5nL2FsZXJ0cy9jb25maWcnKTtcbiAgICAgIGNvbnN0IGNkID0gYXdhaXQgY3IuanNvbigpO1xuICAgICAgaWYgKGNkLnN1Y2Nlc3MpIGFsbENvbmZpZ3MgPSBjZC5jb25maWdzIHx8IHt9O1xuICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICBjb25zdCBjb250YWluZXJzID0gT2JqZWN0LmVudHJpZXMoZGF0YSk7XG4gICAgY29uc3QgY29udGFpbmVyUm93cyA9IGNvbnRhaW5lcnMubWFwKChbaWQsIGluZm9dKSA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBhbGxDb25maWdzW2lkXSB8fCB7IGNwdVRocmVzaG9sZDogODAsIG1lbW9yeVRocmVzaG9sZDogOTAsIGRpc2tJT1RocmVzaG9sZDogNTAsIGF1dG9SZXN0YXJ0OiBmYWxzZSwgZW5hYmxlZDogZmFsc2UgfTtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIDx0ciBkYXRhLWNvbnRhaW5lcj1cIiR7aWR9XCI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgcGFkZGluZzogOHB4O1wiPiR7aW5mby5uYW1lIHx8IGlkfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiYWxlcnQtY3B1XCIgdmFsdWU9XCIke2NmZy5jcHVUaHJlc2hvbGQgPz8gODB9XCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0eWxlPVwid2lkdGg6IDYwcHg7IGZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggNHB4O1wiICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiYWxlcnQtbWVtXCIgdmFsdWU9XCIke2NmZy5tZW1vcnlUaHJlc2hvbGQgPz8gOTB9XCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHN0eWxlPVwid2lkdGg6IDYwcHg7IGZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggNHB4O1wiICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiYWxlcnQtZGlza1wiIHZhbHVlPVwiJHtjZmcuZGlza0lPVGhyZXNob2xkID8/IDUwfVwiIG1pbj1cIjBcIiBtYXg9XCIxMDAwXCIgc3R5bGU9XCJ3aWR0aDogNzBweDsgZm9udC1zaXplOiAwLjhyZW07IHBhZGRpbmc6IDJweCA0cHg7XCIgJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImFsZXJ0LWF1dG9yZXN0YXJ0XCIgJHtjZmcuYXV0b1Jlc3RhcnQgPyAnY2hlY2tlZCcgOiAnJ30gJHtpc1ByZW1pdW0gPyAnJyA6ICdkaXNhYmxlZCd9IC8+PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFsZXJ0LXRlc3QtYnRuIGJ0bi14c1wiIGRhdGEtY29udGFpbmVyPVwiJHtpZH1cIiBkYXRhLW5hbWU9XCIke2luZm8ubmFtZSB8fCBpZH1cIiBzdHlsZT1cInBhZGRpbmc6IDJweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICBgO1xuICAgIH0pLmpvaW4oJycpO1xuXG4gICAgY29uc3QgaGlzdG9yeVJvd3MgPSBhbGVydEhpc3RvcnkubWFwKGVudHJ5ID0+IHtcbiAgICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZShlbnRyeS50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICBjb25zdCBub3RpZmllZE1hcmsgPSBlbnRyeS5ub3RpZmllZCA/ICdcdTI3MTMnIDogJ1x1MjAxNCc7XG4gICAgICByZXR1cm4gYFxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHt0aW1lfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VudHJ5LmNvbnRhaW5lck5hbWUgfHwgZW50cnkuY29udGFpbmVySWR9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcIj4ke2VudHJ5Lm1ldHJpYyB8fCBlbnRyeS50eXBlfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDtcIj4ke3R5cGVvZiBlbnRyeS52YWx1ZSA9PT0gJ251bWJlcicgPyBlbnRyeS52YWx1ZS50b0ZpeGVkKDEpIDogZW50cnkudmFsdWV9JHtlbnRyeS5tZXRyaWMgPT09ICdkaXNrJyA/ICcgTUIvcycgOiAnJSd9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JHtub3RpZmllZE1hcmt9PC90ZD5cbiAgICAgICAgICA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiAke2VudHJ5LmF1dG9SZXN0YXJ0VHJpZ2dlcmVkID8gJyNmMzljMTInIDogJ3ZhcigtLW11dGVkKSd9O1wiPiR7ZW50cnkuYXV0b1Jlc3RhcnRUcmlnZ2VyZWQgPyAnXHUyMUJCJyA6ICcnfTwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICBgO1xuICAgIH0pLmpvaW4oJycpO1xuXG4gICAgY29uc3QgY29uZmlnU2VjdGlvbiA9IGlzUHJlbWl1bSA/IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMDsgZm9udC1zaXplOiAwLjlyZW07XCI+XHUyNjk5XHVGRTBGIEFsZXJ0IENvbmZpZ3VyYXRpb248L2g0PlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgaWQ9XCJnby10by1ub3RpZmljYXRpb25zXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTtcIj5Db25maWd1cmUgbm90aWZpY2F0aW9ucyBcdTIxOTI8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bztcIj5cbiAgICAgICAgICA8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvbnRhaW5lcjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5DUFUgJTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5NZW0gJTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5EaXNrIEkvTyBNQi9zPC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXV0by1SZXN0YXJ0PC90aD5cbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4O1wiPjwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PiR7Y29udGFpbmVyUm93c308L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2F2ZS1hbGwtYWxlcnRzXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTZweDsgZm9udC1zaXplOiAwLjg1cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmFzZSk7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+U2F2ZSBBbGw8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgIDogYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHJnYmEoMjQxLDE5NiwxNSwwLjEpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI0MSwxOTYsMTUsMC4zKTsgYm9yZGVyLXJhZGl1czogOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmMWM0MGY7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdTJCNTAgUHJlbWl1bSBGZWF0dXJlPC9zcGFuPlxuICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjogNnB4IDAgMDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlVwZ3JhZGUgdG8gY29uZmlndXJlIHJlc291cmNlIGFsZXJ0IHRocmVzaG9sZHMgcGVyIGNvbnRhaW5lci48L3A+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ1cGdyYWRlLWZvci1hbGVydHNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZzogNHB4IDEycHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogI2YxYzQwZjsgY29sb3I6ICMwMDA7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+VXBncmFkZSBOb3c8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICBhbGVydHNDb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgICAgJHtjb25maWdTZWN0aW9ufVxuICAgICAgPGRpdj5cbiAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTBweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XHVEODNEXHVEQ0NCIFJlY2VudCBBbGVydHM8L2g0PlxuICAgICAgICAke2hpc3RvcnlSb3dzID8gYFxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvO1wiPlxuICAgICAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db250YWluZXI8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5NZXRyaWM8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5WYWx1ZTwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XHUyNzEzPzwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHggOHB4O1wiPjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PiR7aGlzdG9yeVJvd3N9PC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGAgOiAnPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBhbGVydHMgcmVjb3JkZWQgeWV0LjwvZGl2Pid9XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgLy8gV2lyZSB1cCBzYXZlLWFsbCBidXR0b25cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZS1hbGwtYWxlcnRzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlncyA9IHt9O1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3N0YXRzLWFsZXJ0cy1jb250YWluZXIgdHJbZGF0YS1jb250YWluZXJdJykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBjb25zdCBjSWQgPSByb3cuZGF0YXNldC5jb250YWluZXI7XG4gICAgICAgIGNvbmZpZ3NbY0lkXSA9IHtcbiAgICAgICAgICBjcHVUaHJlc2hvbGQ6IHBhcnNlSW50KHJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtY3B1Jyk/LnZhbHVlKSB8fCA4MCxcbiAgICAgICAgICBtZW1vcnlUaHJlc2hvbGQ6IHBhcnNlSW50KHJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtbWVtJyk/LnZhbHVlKSB8fCA5MCxcbiAgICAgICAgICBkaXNrSU9UaHJlc2hvbGQ6IHBhcnNlSW50KHJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtZGlzaycpPy52YWx1ZSkgfHwgNTAsXG4gICAgICAgICAgYXV0b1Jlc3RhcnQ6ICEhcm93LnF1ZXJ5U2VsZWN0b3IoJy5hbGVydC1hdXRvcmVzdGFydCcpPy5jaGVja2VkLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHMvY29uZmlnJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY29uZmlncyB9KVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZCA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLWFsbC1hbGVydHMnKTtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gZC5zdWNjZXNzID8gJ1x1MjcwNSBTYXZlZCcgOiAnXHUyNzRDIEZhaWxlZCc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnU2F2ZSBBbGwnOyB9LCAyMDAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUtYWxsLWFsZXJ0cycpO1xuICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzRDIEVycm9yJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdTYXZlIEFsbCc7IH0sIDIwMDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2lyZSB1cCBub3RpZmljYXRpb24gc2V0dGluZ3MgbGlua1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnby10by1ub3RpZmljYXRpb25zJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS1ub3RpZmljYXRpb25zJyk/LmNsaWNrKCk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXJlIHVwIHRlc3QgYnV0dG9uc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbGVydC10ZXN0LWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZyA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJy4uLic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHMvJHtidG4uZGF0YXNldC5jb250YWluZXJ9L3Rlc3RgLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUnO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Rlc3QgYWxlcnQgc2VudCBmb3IgJyArIGJ0bi5kYXRhc2V0Lm5hbWUsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzRDJztcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gb3JpZzsgfSwgMjAwMCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFdpcmUgdXAgdXBncmFkZSBidXR0b25cbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBncmFkZS1mb3ItYWxlcnRzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgICBpZiAodHlwZW9mIG9wZW5MaWNlbnNlTW9kYWwgPT09ICdmdW5jdGlvbicpIG9wZW5MaWNlbnNlTW9kYWwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0QXV0b1JlZnJlc2goKSB7XG4gICAgaWYgKHJlZnJlc2hJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpO1xuICAgIGlmIChhdXRvUmVmcmVzaENoZWNrYm94Py5jaGVja2VkKSB7XG4gICAgICByZWZyZXNoSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChsb2FkU3RhdHMsIERDLlBPTEwuU1RBVFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BBdXRvUmVmcmVzaCgpIHtcbiAgICBpZiAocmVmcmVzaEludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHJlZnJlc2hJbnRlcnZhbCk7XG4gICAgICByZWZyZXNoSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9wZW4gbW9kYWxcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRTdGF0cygpO1xuICAgIHN0YXJ0QXV0b1JlZnJlc2goKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWxcbiAgY2FuY2VsQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gIH0pO1xuXG4gIG1vZGFsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgc3RvcEF1dG9SZWZyZXNoKCk7XG4gICAgfVxuICB9KTtcblxuICByZWZyZXNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRTdGF0cyk7XG5cbiAgYXV0b1JlZnJlc2hDaGVja2JveD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGlmIChhdXRvUmVmcmVzaENoZWNrYm94LmNoZWNrZWQpIHN0YXJ0QXV0b1JlZnJlc2goKTtcbiAgICBlbHNlIHN0b3BBdXRvUmVmcmVzaCgpO1xuICB9KTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInN0YXRzLWFnZ3JlZ2F0ZWRcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQWdncmVnYXRlZCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwic3RhdHMtYWxlcnRzXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEFsZXJ0cyk7XG5cbiAgLy8gPT09IEhpc3RvcnkgVGFiID09PVxuICBjb25zdCBoaXN0b3J5Q29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWhpc3RvcnktY29udGFpbmVyJyk7XG4gIGNvbnN0IGhpc3RvcnlBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWhpc3RvcnktY29udGFpbmVyLWFyZWEnKTtcbiAgY29uc3QgcmFuZ2VCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN0YXRzLXJhbmdlLWJ0bicpO1xuXG4gIGxldCBjdXJyZW50UmFuZ2UgPSAnMWgnO1xuXG4gIGZ1bmN0aW9uIHJhbmdlVG9NcyhyYW5nZSkge1xuICAgIHN3aXRjaCAocmFuZ2UpIHtcbiAgICAgIGNhc2UgJzFoJzogIHJldHVybiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzI0aCc6IHJldHVybiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnN2QnOiAgcmV0dXJuIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgY2FzZSAnMzBkJzogcmV0dXJuIDMwICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzF5JzogIHJldHVybiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgICAgZGVmYXVsdDogICAgcmV0dXJuIDYwICogNjAgKiAxMDAwO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRpZXJMYWJlbCh0aWVyKSB7XG4gICAgaWYgKHRpZXIgPT09ICdyYXcnKSByZXR1cm4gJ2xpdmUgKDEwcyBzYW1wbGVzKSc7XG4gICAgaWYgKHRpZXIgPT09ICdob3VybHknKSByZXR1cm4gJ2hvdXJseSBhdmVyYWdlJztcbiAgICBpZiAodGllciA9PT0gJ2RhaWx5JykgcmV0dXJuICdkYWlseSBhdmVyYWdlJztcbiAgICByZXR1cm4gdGllcjtcbiAgfVxuXG4gIC8vIFNpbXBsZSBTVkcgc3BhcmtsaW5lIFx1MjAxNCBubyBleHRlcm5hbCBsaWJcbiAgZnVuY3Rpb24gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIGFjY2Vzc29yLCBjb2xvciwgbGFiZWwsIHVuaXQpIHtcbiAgICBpZiAoIXNhbXBsZXMgfHwgc2FtcGxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTsgcGFkZGluZzogMjBweDtcIj5ObyBkYXRhIGZvciAke2VzY2FwZUh0bWwobGFiZWwpfTwvZGl2PmA7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IHNhbXBsZXMubWFwKGFjY2Vzc29yKS5maWx0ZXIodiA9PiB2ICE9IG51bGwpO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gZGF0YSBmb3IgJHtlc2NhcGVIdG1sKGxhYmVsKX08L2Rpdj5gO1xuICAgIH1cbiAgICBjb25zdCBtYXggPSBNYXRoLm1heCguLi52YWx1ZXMsIDEpO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKC4uLnZhbHVlcywgMCk7XG4gICAgY29uc3QgcmFuZ2UgPSBtYXggLSBtaW4gfHwgMTtcbiAgICBjb25zdCB3ID0gNjAwLCBoID0gODAsIHBhZCA9IDQ7XG4gICAgY29uc3Qgc3RlcFggPSAodyAtIHBhZCAqIDIpIC8gTWF0aC5tYXgodmFsdWVzLmxlbmd0aCAtIDEsIDEpO1xuICAgIGNvbnN0IHBvaW50cyA9IHZhbHVlcy5tYXAoKHYsIGkpID0+IHtcbiAgICAgIGNvbnN0IHggPSBwYWQgKyBpICogc3RlcFg7XG4gICAgICBjb25zdCB5ID0gaCAtIHBhZCAtICgodiAtIG1pbikgLyByYW5nZSkgKiAoaCAtIHBhZCAqIDIpO1xuICAgICAgcmV0dXJuIGAke3gudG9GaXhlZCgxKX0sJHt5LnRvRml4ZWQoMSl9YDtcbiAgICB9KS5qb2luKCcgJyk7XG4gICAgY29uc3QgbGFzdCA9IHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXZnID0gdmFsdWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdmFsdWVzLmxlbmd0aDtcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE0cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogYmFzZWxpbmU7IGdhcDogMTJweDsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtlc2NhcGVIdG1sKGxhYmVsKX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+bGFzdCAke2xhc3QudG9GaXhlZCgxKX0ke3VuaXR9IFx1MDBCNyBhdmcgJHthdmcudG9GaXhlZCgxKX0ke3VuaXR9IFx1MDBCNyBtYXggJHttYXgudG9GaXhlZCgxKX0ke3VuaXR9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwICR7d30gJHtofVwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAke2h9cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiJHtjb2xvcn1cIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBwb2ludHM9XCIke3BvaW50c31cIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBmdW5jdGlvbiBwb3B1bGF0ZUhpc3RvcnlDb250YWluZXJTZWxlY3QoKSB7XG4gICAgaWYgKCFoaXN0b3J5Q29udGFpbmVyU2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZE1vbml0b3JpbmdEYXRhIHx8IHt9O1xuICAgIGNvbnN0IHByZXZpb3VzID0gaGlzdG9yeUNvbnRhaW5lclNlbGVjdC52YWx1ZTtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGF0YSk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+Tm8gY29udGFpbmVyczwvb3B0aW9uPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpc3RvcnlDb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gZW50cmllc1xuICAgICAgLm1hcCgoW2lkLCBpbmZvXSkgPT4gYDxvcHRpb24gdmFsdWU9XCIke2VzY2FwZUh0bWwoaWQpfVwiPiR7ZXNjYXBlSHRtbChpbmZvLm5hbWUgfHwgaWQpfTwvb3B0aW9uPmApXG4gICAgICAuam9pbignJyk7XG4gICAgaWYgKHByZXZpb3VzICYmIGRhdGFbcHJldmlvdXNdKSBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LnZhbHVlID0gcHJldmlvdXM7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkSGlzdG9yeSgpIHtcbiAgICBpZiAoIWhpc3RvcnlBcmVhIHx8ICFoaXN0b3J5Q29udGFpbmVyU2VsZWN0KSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgIGlmICghY29udGFpbmVySWQpIHtcbiAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0E8L3NwYW4+Tm8gY29udGFpbmVyIHNlbGVjdGVkLjwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IGVuZFRpbWUgLSByYW5nZVRvTXMoY3VycmVudFJhbmdlKTtcbiAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGhpc3RvcnkuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL21vbml0b3JpbmcvaGlzdG9yeS8ke2VuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJJZCl9P3N0YXJ0VGltZT0ke3N0YXJ0VGltZX0mZW5kVGltZT0ke2VuZFRpbWV9YCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgaGlzdG9yeScpO1xuXG4gICAgICBjb25zdCBzYW1wbGVzID0gZGF0YS5zYW1wbGVzIHx8IFtdO1xuICAgICAgY29uc3QgdGllciA9IGRhdGEudGllciB8fCAncmF3JztcblxuICAgICAgaWYgKHNhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0E8L3NwYW4+Tm8gZGF0YSBmb3IgdGhlIGxhc3QgJHtjdXJyZW50UmFuZ2V9LiBUaWVyOiAke3RpZXJMYWJlbCh0aWVyKX0uPC9kaXY+YDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmZXJlbnQgc2hhcGUgYmV0d2VlbiByYXcgdnMgcm9sbGVkLXVwIHNhbXBsZXNcbiAgICAgIGNvbnN0IGlzUmF3ID0gdGllciA9PT0gJ3Jhdyc7XG4gICAgICBjb25zdCBjcHVBY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IHMuY3B1Py5wZXJjZW50IDogKHMpID0+IHMuY3B1Py5hdmc7XG4gICAgICBjb25zdCBtZW1BY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IHMubWVtb3J5Py5wZXJjZW50IDogKHMpID0+IHMubWVtb3J5Py5hdmdQZXJjZW50O1xuICAgICAgY29uc3QgbmV0UnhBY2Nlc3NvciA9IGlzUmF3ID8gKHMpID0+IChzLm5ldHdvcms/LnJ4TUIgfHwgMCkgOiAocykgPT4gKHMubmV0d29yaz8ucnhNQiB8fCAwKTtcbiAgICAgIGNvbnN0IG5ldFR4QWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiAocy5uZXR3b3JrPy50eE1CIHx8IDApIDogKHMpID0+IChzLm5ldHdvcms/LnR4TUIgfHwgMCk7XG5cbiAgICAgIGxldCBodG1sID0gYFxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgJHtzYW1wbGVzLmxlbmd0aH0gc2FtcGxlcyBcdTAwQjcgJHtlc2NhcGVIdG1sKHRpZXJMYWJlbCh0aWVyKSl9IFx1MDBCNyAke25ldyBEYXRlKHN0YXJ0VGltZSkudG9Mb2NhbGVTdHJpbmcoKX0gXHUyMTkyICR7bmV3IERhdGUoZW5kVGltZSkudG9Mb2NhbGVTdHJpbmcoKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgY3B1QWNjZXNzb3IsICcjMmVjYzcxJywgJ0NQVScsICclJyk7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBtZW1BY2Nlc3NvciwgJyMzNDk4ZGInLCAnTWVtb3J5JywgJyUnKTtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIG5ldFJ4QWNjZXNzb3IsICcjOWI1OWI2JywgJ05ldHdvcmsgUlgnLCAnIE1CJyk7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBuZXRUeEFjY2Vzc29yLCAnI2U2N2UyMicsICdOZXR3b3JrIFRYJywgJyBNQicpO1xuXG4gICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlBcmVhLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI2QTBcdUZFMEY8L3NwYW4+RmFpbGVkIHRvIGxvYWQgaGlzdG9yeTogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICByYW5nZUJ1dHRvbnMuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHJhbmdlQnV0dG9ucy5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICBidG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBjdXJyZW50UmFuZ2UgPSBidG4uZGF0YXNldC5yYW5nZTtcbiAgICAgIGxvYWRIaXN0b3J5KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGhpc3RvcnlDb250YWluZXJTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGxvYWRIaXN0b3J5KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInN0YXRzLWhpc3RvcnlcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgcG9wdWxhdGVIaXN0b3J5Q29udGFpbmVyU2VsZWN0KCk7XG4gICAgbG9hZEhpc3RvcnkoKTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBIRUFMVEggQ0hFQ0sgREFTSEJPQVJEID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2hlYWx0aC1tb2RhbCcsIGA8ZGl2IGlkPVwiaGVhbHRoLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MDBweDsgbWF4LXdpZHRoOiAxMDAwcHg7XCI+XG4gICAgICA8aDM+XHVEODNDXHVERkU1IEhlYWx0aCBDaGVjayBEYXNoYm9hcmQ8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBTZXJ2aWNlIHVwdGltZSB0cmFja2luZywgU0xBIG1vbml0b3JpbmcsIGFuZCBpbmNpZGVudCBtYW5hZ2VtZW50LlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJoZWFsdGgtc3RhdHVzXCI+U3RhdHVzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiaGVhbHRoLWluY2lkZW50c1wiPkluY2lkZW50czwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImhlYWx0aC1jb25maWdcIj5Db25maWd1cmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogU3RhdHVzIC0tPlxuICAgICAgPGRpdiBpZD1cImhlYWx0aC1zdGF0dXNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtc3RhdHVzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBoZWFsdGggc3RhdHVzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBJbmNpZGVudHMgLS0+XG4gICAgICA8ZGl2IGlkPVwiaGVhbHRoLWluY2lkZW50c1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWluY2lkZW50cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURFQTg8L3NwYW4+IExvYWRpbmcgaW5jaWRlbnRzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBDb25maWd1cmUgLS0+XG4gICAgICA8ZGl2IGlkPVwiaGVhbHRoLWNvbmZpZ1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWNvbmZpZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI2OTlcdUZFMEY8L3NwYW4+IExvYWRpbmcgY29uZmlndXJhdGlvbi4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEdsb2JhbCBTZXR0aW5nczogcmV0ZW50aW9uLCBwb2xsaW5nIGludGVydmFscywgbWF4IGVudHJpZXMsIGRpc2stdXNhZ2UgdGhyZXNob2xkIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWdsb2JhbC1zZXR0aW5nc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA0cHg7XCI+XHVEODNDXHVERjBEIEdsb2JhbCBTZXR0aW5nczwvaDQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4O1wiPkFwcGxpZXMgdG8gYWxsIGhlYWx0aCBjaGVja3MuIFNldHRpbmdzIGFyZSBzdG9yZWQgbG9jYWxseSBpbiB0aGlzIGJyb3dzZXIuPC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTJweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5IZWFsdGggQ2hlY2sgUG9sbGluZyBJbnRlcnZhbCAoc2Vjb25kcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctaW50ZXJ2YWxcIiB2YWx1ZT1cIjYwXCIgbWluPVwiNVwiIG1heD1cIjM2MDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+SG93IG9mdGVuIGVhY2ggc2VydmljZSdzIGhlYWx0aCBlbmRwb2ludCBpcyBjaGVja2VkLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U3RhdHMgUG9sbGluZyBJbnRlcnZhbCAoc2Vjb25kcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctc3RhdHMtaW50ZXJ2YWxcIiB2YWx1ZT1cIjMwXCIgbWluPVwiNVwiIG1heD1cIjM2MDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+SG93IG9mdGVuIGNvbnRhaW5lciBzdGF0aXN0aWNzIChDUFUvbWVtb3J5KSBhcmUgc2FtcGxlZC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPk1heCBFbnRyaWVzIFBlciBTZXJ2aWNlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLW1heC1lbnRyaWVzXCIgdmFsdWU9XCI1MDBcIiBtaW49XCIxMFwiIG1heD1cIjEwMDAwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5DYXAgb24gc3RvcmVkIGhpc3RvcnkgcmVjb3JkcyBwZXIgc2VydmljZS48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkRhdGEgUmV0ZW50aW9uIChkYXlzKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1yZXRlbnRpb25cIiB2YWx1ZT1cIjMwXCIgbWluPVwiMVwiIG1heD1cIjM2NTBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+SGVhbHRoIGhpc3Rvcnkgb2xkZXIgdGhhbiB0aGlzIGlzIHBydW5lZC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkRpc2stVXNhZ2UgV2FybmluZyAoJSk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctZGlzay10aHJlc2hvbGRcIiB2YWx1ZT1cIjgwXCIgbWluPVwiNTBcIiBtYXg9XCI5OVwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDJweDtcIj5XYXJuIHdoZW4gZGlzayB1c2FnZSBleGNlZWRzIHRoaXMgbGV2ZWwuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWdsb2JhbC1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+U2F2ZSBHbG9iYWwgU2V0dGluZ3M8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZ2xvYmFsLXJlc2V0XCIgY2xhc3M9XCJidG4tc21cIj5SZXNldCB0byBEZWZhdWx0czwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJoZWFsdGgtZ2xvYmFsLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEFkZC9FZGl0IEhlYWx0aCBDaGVjayBGb3JtIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLWNvbmZpZy1mb3JtXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpO1wiPlxuICAgICAgICAgIDxoNCBpZD1cImhlYWx0aC1mb3JtLXRpdGxlXCIgc3R5bGU9XCJtYXJnaW46IDAgMCAxMnB4O1wiPkFkZCBIZWFsdGggQ2hlY2s8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTJweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TZXJ2aWNlIElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS1pZFwiIHBsYWNlaG9sZGVyPVwiZS5nLiBwbGV4XCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkRpc3BsYXkgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0tbmFtZVwiIHBsYWNlaG9sZGVyPVwiZS5nLiBQbGV4IE1lZGlhIFNlcnZlclwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJncmlkLWNvbHVtbjogc3BhbiAyO1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VVJMPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS11cmxcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vcGxleC5ob21lXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlRpbWVvdXQgKG1zKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtZm9ybS10aW1lb3V0XCIgdmFsdWU9XCIxMDAwMFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5FeHBlY3RlZCBTdGF0dXMgQ29kZXM8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLWNvZGVzXCIgdmFsdWU9XCIyMDBcIiBwbGFjZWhvbGRlcj1cIjIwMCwgMzAxLCAzMDJcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U0xBIFRhcmdldCAoJSk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLWZvcm0tc2xhXCIgdmFsdWU9XCI5OS45XCIgc3RlcD1cIjAuMVwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5TbG93IFJlc3BvbnNlIFRocmVzaG9sZCAobXMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1mb3JtLXNsb3dcIiB2YWx1ZT1cIjUwMDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1mb3JtLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1mb3JtLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtYWRkLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiPisgQWRkIEhlYWx0aCBDaGVjazwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm90dG9tLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cImhlYWx0aC1sYXN0LXVwZGF0ZVwiIGNsYXNzPVwidGV4dC1hdXRvLXJpZ2h0XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNhbmNlbCcpO1xuICBjb25zdCByZWZyZXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBzdGF0dXNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXN0YXR1cy1jb250YWluZXInKTtcbiAgY29uc3QgaW5jaWRlbnRzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1pbmNpZGVudHMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGNvbmZpZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY29uZmlnLWNvbnRhaW5lcicpO1xuICBjb25zdCBsYXN0VXBkYXRlU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtbGFzdC11cGRhdGUnKTtcbiAgY29uc3QgYWRkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1hZGQtYnRuJyk7XG4gIGNvbnN0IGZvcm1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY29uZmlnLWZvcm0nKTtcbiAgY29uc3QgZm9ybVRpdGxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXRpdGxlJyk7XG4gIGNvbnN0IGZvcm1DYW5jZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tY2FuY2VsJyk7XG4gIGNvbnN0IGZvcm1TYXZlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNhdmUnKTtcblxuICAvLyAtLS0tIEdsb2JhbCBoZWFsdGggc2V0dGluZ3MgKHJldGVudGlvbiwgcG9sbGluZyBpbnRlcnZhbHMsIG1heCBlbnRyaWVzLCBkaXNrIHRocmVzaG9sZCkgLS0tLVxuICBjb25zdCBIRUFMVEhfU0VUVElOR1NfS0VZID0gJ2Rhc2hjYWRkeS1oZWFsdGgtc2V0dGluZ3MnO1xuICBjb25zdCBIRUFMVEhfREVGQVVMVFMgPSB7IHJldGVudGlvbkRheXM6IDMwLCBwb2xsaW5nSW50ZXJ2YWw6IDYwLCBzdGF0c1BvbGxpbmdJbnRlcnZhbDogMzAsIG1heEVudHJpZXNQZXJTZXJ2aWNlOiA1MDAsIGRpc2tVc2FnZVRocmVzaG9sZDogODAgfTtcbiAgY29uc3QgZ2xvYmFsU2F2ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZ2xvYmFsLXNhdmUnKTtcbiAgY29uc3QgZ2xvYmFsUmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWdsb2JhbC1yZXNldCcpO1xuICBjb25zdCBnbG9iYWxTdGF0dXNTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1nbG9iYWwtc3RhdHVzJyk7XG4gIGNvbnN0IHJldGVudGlvbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLXJldGVudGlvbicpO1xuICBjb25zdCBpbnRlcnZhbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLWludGVydmFsJyk7XG4gIGNvbnN0IHN0YXRzSW50ZXJ2YWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1zdGF0cy1pbnRlcnZhbCcpO1xuICBjb25zdCBtYXhFbnRyaWVzSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctbWF4LWVudHJpZXMnKTtcbiAgY29uc3QgZGlza1RocmVzaG9sZElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLWRpc2stdGhyZXNob2xkJyk7XG5cbiAgZnVuY3Rpb24gbG9hZEhlYWx0aFNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBzYWZlR2V0KEhFQUxUSF9TRVRUSU5HU19LRVkpO1xuICAgICAgY29uc3Qgc2F2ZWQgPSByYXcgPyBKU09OLnBhcnNlKHJhdykgOiB7fTtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBIRUFMVEhfREVGQVVMVFMsIHNhdmVkKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgSEVBTFRIX0RFRkFVTFRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpIHtcbiAgICBjb25zdCBzID0gbG9hZEhlYWx0aFNldHRpbmdzKCk7XG4gICAgaWYgKHJldGVudGlvbklucHV0KSByZXRlbnRpb25JbnB1dC52YWx1ZSA9IHMucmV0ZW50aW9uRGF5cztcbiAgICBpZiAoaW50ZXJ2YWxJbnB1dCkgaW50ZXJ2YWxJbnB1dC52YWx1ZSA9IHMucG9sbGluZ0ludGVydmFsO1xuICAgIGlmIChzdGF0c0ludGVydmFsSW5wdXQpIHN0YXRzSW50ZXJ2YWxJbnB1dC52YWx1ZSA9IHMuc3RhdHNQb2xsaW5nSW50ZXJ2YWw7XG4gICAgaWYgKG1heEVudHJpZXNJbnB1dCkgbWF4RW50cmllc0lucHV0LnZhbHVlID0gcy5tYXhFbnRyaWVzUGVyU2VydmljZTtcbiAgICBpZiAoZGlza1RocmVzaG9sZElucHV0KSBkaXNrVGhyZXNob2xkSW5wdXQudmFsdWUgPSBzLmRpc2tVc2FnZVRocmVzaG9sZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVIZWFsdGhTZXR0aW5ncygpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICAgIHJldGVudGlvbkRheXM6IE1hdGgubWF4KDEsIE1hdGgubWluKDM2NTAsIHBhcnNlSW50KHJldGVudGlvbklucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLnJldGVudGlvbkRheXMpKSxcbiAgICAgIHBvbGxpbmdJbnRlcnZhbDogTWF0aC5tYXgoNSwgTWF0aC5taW4oMzYwMCwgcGFyc2VJbnQoaW50ZXJ2YWxJbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5wb2xsaW5nSW50ZXJ2YWwpKSxcbiAgICAgIHN0YXRzUG9sbGluZ0ludGVydmFsOiBNYXRoLm1heCg1LCBNYXRoLm1pbigzNjAwLCBwYXJzZUludChzdGF0c0ludGVydmFsSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMuc3RhdHNQb2xsaW5nSW50ZXJ2YWwpKSxcbiAgICAgIG1heEVudHJpZXNQZXJTZXJ2aWNlOiBNYXRoLm1heCgxMCwgTWF0aC5taW4oMTAwMDAwLCBwYXJzZUludChtYXhFbnRyaWVzSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMubWF4RW50cmllc1BlclNlcnZpY2UpKSxcbiAgICAgIGRpc2tVc2FnZVRocmVzaG9sZDogTWF0aC5tYXgoNTAsIE1hdGgubWluKDk5LCBwYXJzZUludChkaXNrVGhyZXNob2xkSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMuZGlza1VzYWdlVGhyZXNob2xkKSlcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBzYWZlU2V0KEhFQUxUSF9TRVRUSU5HU19LRVksIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSk7XG4gICAgICBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpO1xuICAgICAgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIHtcbiAgICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICdTYXZlZCBcdTI3MTMnO1xuICAgICAgICBnbG9iYWxTdGF0dXNTcGFuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoZ2xvYmFsU3RhdHVzU3BhbikgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICcnOyB9LCAyNTAwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykgc2hvd05vdGlmaWNhdGlvbignR2xvYmFsIGhlYWx0aCBzZXR0aW5ncyBzYXZlZCcsICdzdWNjZXNzJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIHsgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICdTYXZlIGZhaWxlZCc7IGdsb2JhbFN0YXR1c1NwYW4uc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7IH1cbiAgICAgIGlmICh0eXBlb2Ygc2hvd05vdGlmaWNhdGlvbiA9PT0gJ2Z1bmN0aW9uJykgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkIHRvIHNhdmUgc2V0dGluZ3M6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0SGVhbHRoU2V0dGluZ3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNhZmVTZXQoSEVBTFRIX1NFVFRJTkdTX0tFWSwgSlNPTi5zdHJpbmdpZnkoSEVBTFRIX0RFRkFVTFRTKSk7XG4gICAgfSBjYXRjaCAoXykgeyAvKiBpZ25vcmUgKi8gfVxuICAgIGFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJKCk7XG4gICAgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIHtcbiAgICAgIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnUmVzZXQgdG8gZGVmYXVsdHMgXHUyNzEzJztcbiAgICAgIGdsb2JhbFN0YXR1c1NwYW4uc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoZ2xvYmFsU3RhdHVzU3BhbikgZ2xvYmFsU3RhdHVzU3Bhbi50ZXh0Q29udGVudCA9ICcnOyB9LCAyNTAwKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpO1xuICBnbG9iYWxTYXZlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNhdmVIZWFsdGhTZXR0aW5ncyk7XG4gIGdsb2JhbFJlc2V0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0SGVhbHRoU2V0dGluZ3MpO1xuICAvLyAtLS0tIEVuZCBnbG9iYWwgaGVhbHRoIHNldHRpbmdzIC0tLS1cblxuICBsZXQgZWRpdGluZ0lkID0gbnVsbDtcblxuICBmdW5jdGlvbiB1cHRpbWVDb2xvcihwY3QpIHtcbiAgICBpZiAocGN0ID49IDk5LjkpIHJldHVybiAndmFyKC0tb2stZmcpJztcbiAgICBpZiAocGN0ID49IDk1KSByZXR1cm4gJyNmMzljMTInO1xuICAgIHJldHVybiAndmFyKC0tYmFkLWZnKSc7XG4gIH1cblxuICBmdW5jdGlvbiBzZXZlcml0eUJhZGdlKHNldikge1xuICAgIGNvbnN0IGNvbG9ycyA9IHsgY3JpdGljYWw6ICd2YXIoLS1iYWQtZmcpJywgaGlnaDogJyNmZjZiNmInLCBtZWRpdW06ICcjZjM5YzEyJywgbG93OiAndmFyKC0tbXV0ZWQpJyB9O1xuICAgIHJldHVybiBgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogJHtjb2xvcnNbc2V2XSB8fCAndmFyKC0tbXV0ZWQpJ30yMDsgY29sb3I6ICR7Y29sb3JzW3Nldl0gfHwgJ3ZhcigtLW11dGVkKSd9O1wiPiR7c2V2fTwvc3Bhbj5gO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFN0YXR1cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuc3RhdHVzIHx8IE9iamVjdC5rZXlzKGRhdGEuc3RhdHVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc3RhdHVzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0NcdURGRTU8L3NwYW4+Tm8gaGVhbHRoIGNoZWNrcyBjb25maWd1cmVkLiBHbyB0byB0aGUgQ29uZmlndXJlIHRhYiB0byBhZGQgc2VydmljZXMuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VydmljZXMgPSBPYmplY3QudmFsdWVzKGRhdGEuc3RhdHVzKTtcbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBsZWZ0O1wiPic7XG4gICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+U2VydmljZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlN0YXR1czwvdGg+JztcbiAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5VcHRpbWUgMjRoPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+VXB0aW1lIDdkPC90aD4nO1xuICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPkF2ZyBSZXNwb25zZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPkxhc3QgQ2hlY2s8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXJ2aWNlcykge1xuICAgICAgICBjb25zdCBpc1VwID0gcy5zdGF0dXMgPT09ICd1cCc7XG4gICAgICAgIGNvbnN0IGRvdENvbG9yID0gaXNVcCA/ICd2YXIoLS1kb3Qtb2spJyA6ICd2YXIoLS1kb3QtYmFkKSc7XG4gICAgICAgIGNvbnN0IHUyNCA9IHMudXB0aW1lPy5bJzI0aCddID8/ICctJztcbiAgICAgICAgY29uc3QgdTdkID0gcy51cHRpbWU/LlsnN2QnXSA/PyAnLSc7XG4gICAgICAgIGNvbnN0IGF2Z1J0ID0gcy5hdmdSZXNwb25zZVRpbWUgIT0gbnVsbCA/IE1hdGgucm91bmQocy5hdmdSZXNwb25zZVRpbWUpICsgJ21zJyA6ICctJztcbiAgICAgICAgY29uc3QgbGFzdENoZWNrID0gcy50aW1lc3RhbXAgPyB0aW1lQWdvKHMudGltZXN0YW1wKSA6ICctJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBkYXRhLWhlYWx0aC1pZD1cIiR7ZXNjYXBlSHRtbChzLnNlcnZpY2VJZCl9XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChzLm5hbWUgfHwgcy5zZXJ2aWNlSWQpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogOHB4OyBoZWlnaHQ6IDhweDsgYm9yZGVyLXJhZGl1czogNTAlOyBiYWNrZ3JvdW5kOiAke2RvdENvbG9yfTsgbWFyZ2luLXJpZ2h0OiA2cHg7XCI+PC9zcGFuPiR7aXNVcCA/ICdVcCcgOiAnRG93bid9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiAke3R5cGVvZiB1MjQgPT09ICdudW1iZXInID8gdXB0aW1lQ29sb3IodTI0KSA6ICd2YXIoLS1tdXRlZCknfTtcIj4ke3R5cGVvZiB1MjQgPT09ICdudW1iZXInID8gdTI0LnRvRml4ZWQoMSkgKyAnJScgOiB1MjR9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiAke3R5cGVvZiB1N2QgPT09ICdudW1iZXInID8gdXB0aW1lQ29sb3IodTdkKSA6ICd2YXIoLS1tdXRlZCknfTtcIj4ke3R5cGVvZiB1N2QgPT09ICdudW1iZXInID8gdTdkLnRvRml4ZWQoMSkgKyAnJScgOiB1N2R9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+JHthdmdSdH08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2xhc3RDaGVja308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaHRtbCArPSBgPHRyIGlkPVwiaGVhbHRoLWRldGFpbC0ke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48dGQgY29sc3Bhbj1cIjZcIiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+PGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGRldGFpbHMuLi48L2Rpdj48L3RkPjwvdHI+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIHN0YXR1c0NvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgbGFzdFVwZGF0ZVNwYW4udGV4dENvbnRlbnQgPSAnVXBkYXRlZCAnICsgbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcblxuICAgICAgLy8gUm93IGNsaWNrIHRvIGV4cGFuZCBkZXRhaWxzXG4gICAgICBzdGF0dXNDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgndHJbZGF0YS1oZWFsdGgtaWRdJykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSByb3cuZGF0YXNldC5oZWFsdGhJZDtcbiAgICAgICAgICBjb25zdCBkZXRhaWxSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWRldGFpbC0nICsgaWQpO1xuICAgICAgICAgIGlmICghZGV0YWlsUm93KSByZXR1cm47XG4gICAgICAgICAgaWYgKGRldGFpbFJvdy5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGRldGFpbFJvdy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXRhaWxSb3cuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2lkfS9zdGF0cz9ob3Vycz0yNGApO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2VzcyAmJiBkLnN0YXRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0ID0gZC5zdGF0cztcbiAgICAgICAgICAgICAgY29uc3QgcnQgPSBzdC5yZXNwb25zZVRpbWUgfHwge307XG4gICAgICAgICAgICAgIGRldGFpbFJvdy5xdWVyeVNlbGVjdG9yKCd0ZCcpLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgMWZyKTsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Ub3RhbCBDaGVja3M8L3NwYW4+PGJyPjxzdHJvbmc+JHtzdC50b3RhbENoZWNrcyB8fCAwfTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VXB0aW1lPC9zcGFuPjxicj48c3Ryb25nIHN0eWxlPVwiY29sb3I6ICR7dXB0aW1lQ29sb3Ioc3QudXB0aW1lIHx8IDApfTtcIj4keyhzdC51cHRpbWUgfHwgMCkudG9GaXhlZCgyKX0lPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdmcgUmVzcG9uc2U8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0LmF2ZyB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UDk1IC8gUDk5PC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5wOTUgfHwgMCl9bXMgLyAke01hdGgucm91bmQocnQucDk5IHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5NaW4gUmVzcG9uc2U8L3NwYW4+PGJyPjxzdHJvbmc+JHtNYXRoLnJvdW5kKHJ0Lm1pbiB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWF4IFJlc3BvbnNlPC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5tYXggfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlVwIENoZWNrczwvc3Bhbj48YnI+PHN0cm9uZyBzdHlsZT1cImNvbG9yOiB2YXIoLS1vay1mZyk7XCI+JHtzdC51cENoZWNrcyB8fCAwfTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+RG93biBDaGVja3M8L3NwYW4+PGJyPjxzdHJvbmcgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4ke3N0LmRvd25DaGVja3MgfHwgMH08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJ3RkJykuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGRldGFpbGVkIHN0YXRzIGF2YWlsYWJsZSBmb3IgdGhpcyBwZXJpb2QuPC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcigndGQnKS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1c0NvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQgdG8gbG9hZCBoZWFsdGggc3RhdHVzOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRJbmNpZGVudHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtvcGVuUmVzLCBoaXN0UmVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9pbmNpZGVudHMnKSxcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9pbmNpZGVudHMvaGlzdG9yeT9saW1pdD01MCcpXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IG9wZW5EYXRhID0gYXdhaXQgb3BlblJlcy5qc29uKCk7XG4gICAgICBjb25zdCBoaXN0RGF0YSA9IGF3YWl0IGhpc3RSZXMuanNvbigpO1xuICAgICAgbGV0IGh0bWwgPSAnJztcblxuICAgICAgLy8gT3BlbiBpbmNpZGVudHNcbiAgICAgIGNvbnN0IG9wZW4gPSAob3BlbkRhdGEuc3VjY2VzcyAmJiBvcGVuRGF0YS5pbmNpZGVudHMpID8gb3BlbkRhdGEuaW5jaWRlbnRzIDogW107XG4gICAgICBpZiAob3Blbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPjxoNCBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpOyBtYXJnaW46IDAgMCA4cHg7XCI+T3BlbiBJbmNpZGVudHMgKCcgKyBvcGVuLmxlbmd0aCArICcpPC9oND4nO1xuICAgICAgICBmb3IgKGNvbnN0IGluYyBvZiBvcGVuKSB7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTJweDsgbWFyZ2luLWJvdHRvbTogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1iYWQtZmcpMzA7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFkLWJnKTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwoaW5jLnNlcnZpY2VJZCl9PC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj4ke3NldmVyaXR5QmFkZ2UoaW5jLnNldmVyaXR5KX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj4ke2VzY2FwZUh0bWwoaW5jLm1lc3NhZ2UpfTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPlN0YXJ0ZWQgJHt0aW1lQWdvKGluYy5jcmVhdGVkQXQpfSBcdTAwQjcgJHtpbmMub2NjdXJyZW5jZXMgfHwgMX0gb2NjdXJyZW5jZShzKTwvZGl2PlxuICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1vay1mZykzMDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1vay1iZyk7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW9rLWZnKTsgZm9udC1zaXplOiAwLjlyZW07XCI+QWxsIHNlcnZpY2VzIG9wZXJhdGlvbmFsIFx1MjAxNCBubyBvcGVuIGluY2lkZW50czwvZGl2Pic7XG4gICAgICB9XG5cbiAgICAgIC8vIEluY2lkZW50IGhpc3RvcnlcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSAoaGlzdERhdGEuc3VjY2VzcyAmJiBoaXN0RGF0YS5oaXN0b3J5KSA/IGhpc3REYXRhLmhpc3RvcnkgOiBbXTtcbiAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaHRtbCArPSAnPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkluY2lkZW50IEhpc3Rvcnk8L2g0Pic7XG4gICAgICAgIGh0bWwgKz0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNlcnZpY2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5UeXBlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2V2ZXJpdHk8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TdGF0dXM8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5EdXJhdGlvbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPldoZW48L3RoPjwvdHI+JztcbiAgICAgICAgZm9yIChjb25zdCBpbmMgb2YgaGlzdG9yeSkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gaW5jLnN0YXR1cyA9PT0gJ3Jlc29sdmVkJztcbiAgICAgICAgICBjb25zdCBkdXIgPSByZXNvbHZlZCAmJiBpbmMuZHVyYXRpb24gPyAoaW5jLmR1cmF0aW9uIDwgNjAwMDAgPyBNYXRoLnJvdW5kKGluYy5kdXJhdGlvbiAvIDEwMDApICsgJ3MnIDogTWF0aC5yb3VuZChpbmMuZHVyYXRpb24gLyA2MDAwMCkgKyAnbScpIDogJy0nO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChpbmMuc2VydmljZUlkKX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChpbmMudHlwZSl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke3NldmVyaXR5QmFkZ2UoaW5jLnNldmVyaXR5KX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6ICR7cmVzb2x2ZWQgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1iYWQtZmcpJ307XCI+JHtpbmMuc3RhdHVzfTwvc3Bhbj48L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZHVyfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHt0aW1lQWdvKGluYy5jcmVhdGVkQXQpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgfVxuXG4gICAgICBpbmNpZGVudHNDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbCB8fCAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERUE4PC9zcGFuPk5vIGluY2lkZW50cyByZWNvcmRlZCB5ZXQuPC9kaXY+JztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbmNpZGVudHNDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3Mvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gZGF0YS5zdWNjZXNzICYmIGRhdGEuc3RhdHVzID8gT2JqZWN0LnZhbHVlcyhkYXRhLnN0YXR1cykgOiBbXTtcbiAgICAgIGlmIChzZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI2OTlcdUZFMEY8L3NwYW4+Tm8gaGVhbHRoIGNoZWNrcyBjb25maWd1cmVkIHlldC4gQ2xpY2sgXCJBZGQgSGVhbHRoIENoZWNrXCIgYmVsb3cuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNlcnZpY2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TdGF0dXM8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TTEEgVGFyZ2V0PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXJ2aWNlcykge1xuICAgICAgICBjb25zdCBpc1VwID0gcy5zdGF0dXMgPT09ICd1cCc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwocy5uYW1lIHx8IHMuc2VydmljZUlkKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6ICR7aXNVcCA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke2lzVXAgPyAnVXAnIDogJ0Rvd24nfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPiR7cy5zbGE/LnRhcmdldCA/IHMuc2xhLnRhcmdldCArICclJyA6ICctJ308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBvbmNsaWNrPVwiZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hlYWx0aC1lZGl0Jywge2RldGFpbDonJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX0nfSkpXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBtYXJnaW4tcmlnaHQ6IDRweDtcIj5FZGl0PC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBvbmNsaWNrPVwiZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2hlYWx0aC1kZWxldGUnLCB7ZGV0YWlsOicke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfSd9KSlcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVsZXRlPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSAnPC90ZD48L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb25maWdDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25maWdDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dGb3JtKGlkLCBuYW1lLCB1cmwsIHRpbWVvdXQsIGNvZGVzLCBzbGEsIHNsb3cpIHtcbiAgICBlZGl0aW5nSWQgPSBpZCB8fCBudWxsO1xuICAgIGZvcm1UaXRsZS50ZXh0Q29udGVudCA9IGlkID8gJ0VkaXQgSGVhbHRoIENoZWNrJyA6ICdBZGQgSGVhbHRoIENoZWNrJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0taWQnKS52YWx1ZSA9IGlkIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1pZCcpLmRpc2FibGVkID0gISFpZDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tbmFtZScpLnZhbHVlID0gbmFtZSB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdXJsJykudmFsdWUgPSB1cmwgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXRpbWVvdXQnKS52YWx1ZSA9IHRpbWVvdXQgfHwgMTAwMDA7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWNvZGVzJykudmFsdWUgPSBjb2RlcyB8fCAnMjAwJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xhJykudmFsdWUgPSBzbGEgfHwgOTkuOTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xvdycpLnZhbHVlID0gc2xvdyB8fCA1MDAwO1xuICAgIGZvcm1FbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgYWRkQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlRm9ybSgpIHtcbiAgICBmb3JtRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBhZGRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGVkaXRpbmdJZCA9IG51bGw7XG4gIH1cblxuICBhZGRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2hvd0Zvcm0oJycsICcnLCAnJywgMTAwMDAsICcyMDAnLCA5OS45LCA1MDAwKSk7XG4gIGZvcm1DYW5jZWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGlkZUZvcm0pO1xuXG4gIGZvcm1TYXZlPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpZCA9IGVkaXRpbmdJZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0taWQnKS52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFpZCkgcmV0dXJuIHNob3dOb3RpZmljYXRpb24oJ1NlcnZpY2UgSUQgaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS11cmwnKS52YWx1ZS50cmltKCk7XG4gICAgaWYgKCF1cmwpIHJldHVybiBzaG93Tm90aWZpY2F0aW9uKCdVUkwgaXMgcmVxdWlyZWQnLCAnd2FybmluZycpO1xuXG4gICAgY29uc3QgY29kZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tY29kZXMnKS52YWx1ZS5zcGxpdCgnLCcpLm1hcChjID0+IHBhcnNlSW50KGMudHJpbSgpKSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICBuYW1lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tbmFtZScpLnZhbHVlLnRyaW0oKSB8fCBpZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS10aW1lb3V0JykudmFsdWUpIHx8IDEwMDAwLFxuICAgICAgZXhwZWN0ZWRTdGF0dXNDb2RlczogY29kZXMubGVuZ3RoID8gY29kZXMgOiBbMjAwXSxcbiAgICAgIHNsYTogeyB0YXJnZXQ6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsYScpLnZhbHVlKSB8fCA5OS45IH0sXG4gICAgICBzbG93UmVzcG9uc2VUaHJlc2hvbGQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zbG93JykudmFsdWUpIHx8IDUwMDBcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvcm1TYXZlLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgICBmb3JtU2F2ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9oZWFsdGgtY2hlY2tzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0vY29uZmlndXJlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdTYXZlIGZhaWxlZCcpO1xuICAgICAgaGlkZUZvcm0oKTtcbiAgICAgIGxvYWRDb25maWcoKTtcbiAgICAgIGxvYWRTdGF0dXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGZvcm1TYXZlLnRleHRDb250ZW50ID0gJ1NhdmUnO1xuICAgICAgZm9ybVNhdmUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hlYWx0aC1lZGl0JywgYXN5bmMgKGUpID0+IHtcbiAgICBjb25zdCBpZCA9IGUuZGV0YWlsO1xuICAgIC8vIExvYWQgZXhpc3RpbmcgY29uZmlnIHRvIHBvcHVsYXRlIGZvcm0gXHUyMDE0IHVzZSBjdXJyZW50IHN0YXR1cyBkYXRhIGFzIGZhbGxiYWNrXG4gICAgc2hvd0Zvcm0oaWQsICcnLCAnJywgMTAwMDAsICcyMDAnLCA5OS45LCA1MDAwKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaGVhbHRoLWRlbGV0ZScsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlLmRldGFpbDtcbiAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBoZWFsdGggY2hlY2sgZm9yIFwiJHtpZH1cIj9gKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9oZWFsdGgtY2hlY2tzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0vY29uZmlndXJlYCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuICAgICAgbG9hZENvbmZpZygpO1xuICAgICAgbG9hZFN0YXR1cygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRTdGF0dXMoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcbiAgcmVmcmVzaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkU3RhdHVzKTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImhlYWx0aC1pbmNpZGVudHNcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkSW5jaWRlbnRzKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJoZWFsdGgtY29uZmlnXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZENvbmZpZyk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBVUERBVEUgTUFOQUdFTUVOVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCd1cGRhdGVzLW1vZGFsJywgYDxkaXYgaWQ9XCJ1cGRhdGVzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3NTBweDsgbWF4LXdpZHRoOiA5NTBweDtcIj5cbiAgICAgIDxoMz5cdTJCMDZcdUZFMEYgVXBkYXRlIE1hbmFnZW1lbnQ8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPlxuICAgICAgICBDaGVjayBmb3IgY29udGFpbmVyIGltYWdlIHVwZGF0ZXMsIGFwcGx5IHRoZW0sIGFuZCBtYW5hZ2Ugcm9sbGJhY2tzLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWF2YWlsYWJsZVwiPkF2YWlsYWJsZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInVwZGF0ZXMtaGlzdG9yeVwiPkhpc3Rvcnk8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWF1dG9cIj5BdXRvLVVwZGF0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cInVwZGF0ZXMtZGFzaGNhZGR5XCIgaWQ9XCJ1cGRhdGVzLWRhc2hjYWRkeS10YWJcIj5EYXNoQ2FkZHk8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQXZhaWxhYmxlIFVwZGF0ZXMgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdmFpbGFibGVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidXBkYXRlcy1jaGVjay1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5cdUQ4M0RcdUREMEQgQ2hlY2sgZm9yIFVwZGF0ZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidXBkYXRlcy11cGRhdGUtYWxsLWJ0blwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgYmFja2dyb3VuZDogI2Y5NzMxNjsgY29sb3I6ICNmZmY7IGJvcmRlcjogMXB4IHNvbGlkICNmOTczMTY7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1MkIwNlx1RkUwRiBVcGRhdGUgQWxsPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJ1cGRhdGVzLWNvdW50LWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogMTJweDsgZm9udC1zaXplOiAwLjc4cmVtOyBmb250LXdlaWdodDogNjAwOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmcpO1wiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF2YWlsYWJsZS1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQ1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj4gQ2xpY2sgXCJDaGVjayBmb3IgVXBkYXRlc1wiIHRvIHNjYW4gY29udGFpbmVycy48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEhpc3RvcnkgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1oaXN0b3J5XCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWhpc3RvcnktY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIHVwZGF0ZSBoaXN0b3J5Li4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBBdXRvLVVwZGF0ZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF1dG9cIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtYXV0by1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0VcdUREMTY8L3NwYW4+IExvYWRpbmcgYXV0by11cGRhdGUgY29uZmlndXJhdGlvbi4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogRGFzaENhZGR5IFNlbGYtVXBkYXRlIC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtZGFzaGNhZGR5XCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktdmVyc2lvbi1pbmZvXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDE2cHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMXJlbTtcIj5EYXNoQ2FkZHk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktY3VycmVudC12ZXJzaW9uXCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuODVyZW07XCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktdXBkYXRlLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA0cHggMTJweDsgYm9yZGVyLXJhZGl1czogMTJweDsgZm9udC1zaXplOiAwLjc4cmVtOyBmb250LXdlaWdodDogNjAwOyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYmcpO1wiPlVwZGF0ZSBhdmFpbGFibGU8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktdXBkYXRlLWRldGFpbHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7XCI+TmV3IHZlcnNpb246IDxzcGFuIGlkPVwiZGFzaGNhZGR5LW5ldy12ZXJzaW9uXCI+PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJkYXNoY2FkZHktYXBwbHktYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlVwZGF0ZSBOb3c8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LWNoYW5nZWxvZ1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1heC1oZWlnaHQ6IDEyMHB4OyBvdmVyZmxvdy15OiBhdXRvOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOyBsaW5lLWhlaWdodDogMS41O1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1zdGF0dXMtYmFyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LWNoZWNrLWJ0blwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5DaGVjayBmb3IgVXBkYXRlczwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkYXNoY2FkZHktcm9sbGJhY2stYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtOyBtYXJnaW4tbGVmdDogNnB4O1wiPlJvbGxiYWNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LWhpc3RvcnktY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAyNTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gc2VsZi11cGRhdGUgaGlzdG9yeS48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvdHRvbS1iYXJcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJ1cGRhdGVzLWxhc3QtY2hlY2tcIiBjbGFzcz1cInRleHQtYXV0by1yaWdodFwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY2FuY2VsJyk7XG4gIGNvbnN0IGNoZWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY2hlY2stYnRuJyk7XG4gIGNvbnN0IGF2YWlsYWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWF2YWlsYWJsZS1jb250YWluZXInKTtcbiAgY29uc3QgaGlzdG9yeUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWhpc3RvcnktY29udGFpbmVyJyk7XG4gIGNvbnN0IGF1dG9Db250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1hdXRvLWNvbnRhaW5lcicpO1xuICBjb25zdCBsYXN0Q2hlY2tTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtbGFzdC1jaGVjaycpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdmFpbGFibGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvYXZhaWxhYmxlJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvcik7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZXMgPSBkYXRhLnVwZGF0ZXMgfHwgW107XG4gICAgICBpZiAodXBkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTI3MDU8L3NwYW4+QWxsIGNvbnRhaW5lcnMgYXJlIHVwIHRvIGRhdGUuPC9kaXY+JztcbiAgICAgICAgbGFzdENoZWNrU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy11cGRhdGUtYWxsLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNvdW50LWJhZGdlJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgd2luZG93Ll9wZW5kaW5nVXBkYXRlcyA9IFtdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Db250YWluZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5JbWFnZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkN1cnJlbnQ8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5MYXRlc3Q8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgLy8gTWF0Y2ggYXBwIGJ5IGNvbnRhaW5lcklkIGZpcnN0LCB0aGVuIG5hbWVcbiAgICAgICAgY29uc3QgYXBwSWQgPSAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFwcHMgPSB3aW5kb3cuQVBQUyB8fCBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXBwcykge1xuICAgICAgICAgICAgaWYgKGEuY29udGFpbmVySWQgPT09IHUuY29udGFpbmVySWQgfHwgYS5uYW1lID09PSB1LmNvbnRhaW5lck5hbWUgfHwgYS5pZCA9PT0gdS5jb250YWluZXJOYW1lKSByZXR1cm4gYS5pZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHUuY29udGFpbmVyTmFtZTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgaHRtbCArPSBgPHRyIGRhdGEtYXBwLWlkPVwiJHtlc2NhcGVIdG1sKGFwcElkKX1cIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwodS5jb250YWluZXJOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwodS5pbWFnZU5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxjb2RlIHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj4ke2VzY2FwZUh0bWwodS5jdXJyZW50RGlnZXN0KX08L2NvZGU+PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+PGNvZGUgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnKTsgY29sb3I6IHZhcigtLW9rLWZnKTsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPiR7ZXNjYXBlSHRtbCh1LmxhdGVzdERpZ2VzdCl9PC9jb2RlPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwidXBkYXRlLW5vdy1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKHUuY29udGFpbmVySWQpfVwiIGRhdGEtbmFtZT1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lck5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tcmlnaHQ6IDRweDtcIj5VcGRhdGU8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwicm9sbGJhY2stYnRuXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lcklkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJOYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07XCI+Um9sbGJhY2s8L2J1dHRvbj5gO1xuICAgICAgICBodG1sICs9ICc8L3RkPjwvdHI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgbGFzdENoZWNrU3Bhbi50ZXh0Q29udGVudCA9IHVwZGF0ZXMubGVuZ3RoICsgJyB1cGRhdGUocykgYXZhaWxhYmxlJztcblxuICAgICAgLy8gU2hvdyBjb3VudCBiYWRnZSBhbmQgVXBkYXRlIEFsbCBidXR0b25cbiAgICAgIGNvbnN0IGNvdW50QmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1jb3VudC1iYWRnZScpO1xuICAgICAgY29uc3QgdXBkYXRlQWxsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKTtcbiAgICAgIGlmIChjb3VudEJhZGdlKSB7XG4gICAgICAgIGNvdW50QmFkZ2UudGV4dENvbnRlbnQgPSB1cGRhdGVzLmxlbmd0aCArICcgcGVuZGluZyc7XG4gICAgICAgIGNvdW50QmFkZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZUFsbEJ0biAmJiB1cGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXBkYXRlQWxsQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdXBkYXRlcyBmb3IgVXBkYXRlIEFsbCBidXR0b25cbiAgICAgIHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgPSB1cGRhdGVzO1xuXG4gICAgICAvLyBXaXJlIHVwZGF0ZSBidXR0b25zXG4gICAgICBhdmFpbGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1ub3ctYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnRuLmRhdGFzZXQubmFtZTtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYFVwZGF0ZSBcIiR7bmFtZX1cIiB0byB0aGUgbGF0ZXN0IHZlcnNpb24/IFRoZSBjb250YWluZXIgd2lsbCByZXN0YXJ0LmApKSByZXR1cm47XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvdXBkYXRlcy91cGRhdGUvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF1dG9Sb2xsYmFjazogdHJ1ZSB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgICAgICBpZiAoZC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEb25lISc7XG4gICAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbG9hZEF2YWlsYWJsZSgpLCAyMDAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yIHx8ICdVcGRhdGUgZmFpbGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0ZhaWxlZCc7XG4gICAgICAgICAgICBidG4uc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdVcGRhdGUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGUnOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgYnRuLnN0eWxlLmNvbG9yID0gJyc7IGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyc7IH0sIDMwMDApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gV2lyZSByb2xsYmFjayBidXR0b25zXG4gICAgICBhdmFpbGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnJvbGxiYWNrLWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gYnRuLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0Lm5hbWU7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBSb2xsYmFjayBcIiR7bmFtZX1cIiB0byBpdHMgcHJldmlvdXMgdmVyc2lvbj9gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdSb2xsaW5nIGJhY2suLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL3JvbGxiYWNrLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnUm9sbGVkIGJhY2shJztcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBsb2FkQXZhaWxhYmxlKCksIDIwMDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGQuZXJyb3IgfHwgJ1JvbGxiYWNrIGZhaWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdGYWlsZWQnO1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUm9sbGJhY2sgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdSb2xsYmFjayc7IGJ0bi5kaXNhYmxlZCA9IGZhbHNlOyB9LCAzMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGUgQWxsIFx1MjAxNCBzZXF1ZW50aWFsbHksIHNraXAgZmFpbHVyZXNcbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsQ29udGFpbmVycygpIHtcbiAgICBjb25zdCB1cGRhdGVzID0gd2luZG93Ll9wZW5kaW5nVXBkYXRlcyB8fCBbXTtcbiAgICBpZiAoIXVwZGF0ZXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKTtcbiAgICBpZiAoIWNvbmZpcm0oYFVwZGF0ZSBhbGwgJHt1cGRhdGVzLmxlbmd0aH0gY29udGFpbmVycz8gRWFjaCB3aWxsIHJlc3RhcnQuYCkpIHJldHVybjtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyM0YzIFVwZGF0aW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGxldCBzdWNjZXNzID0gMCwgZmFpbGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXBkYXRlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHUuY29udGFpbmVySWQpfWAsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF1dG9Sb2xsYmFjazogdHJ1ZSB9KVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICBpZiAoZC5zdWNjZXNzKSBzdWNjZXNzKys7XG4gICAgICAgIGVsc2UgZmFpbGVkKys7XG4gICAgICB9IGNhdGNoIChfKSB7IGZhaWxlZCsrOyB9XG4gICAgfVxuICAgIGJ0bi50ZXh0Q29udGVudCA9IGBcdTI3MDUgRG9uZWA7XG4gICAgc2hvd05vdGlmaWNhdGlvbihgVXBkYXRlIGFsbDogJHtzdWNjZXNzfSBzdWNjZWVkZWQsICR7ZmFpbGVkfSBmYWlsZWQuYCwgc3VjY2VzcyA+IDAgJiYgZmFpbGVkID09PSAwID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyQjA2XHVGRTBGIFVwZGF0ZSBBbGwnO1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBsb2FkQXZhaWxhYmxlKCk7XG4gICAgfSwgMzAwMCk7XG4gIH1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy11cGRhdGUtYWxsLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHVwZGF0ZUFsbENvbnRhaW5lcnMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrRm9yVXBkYXRlcygpIHtcbiAgICBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMEQgQ2hlY2tpbmcuLi4nO1xuICAgIGNoZWNrQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9jaGVjaycsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvcik7XG4gICAgICBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdTI3MDUgRG9uZSEnO1xuICAgICAgYXdhaXQgbG9hZEF2YWlsYWJsZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNoZWNrQnRuLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ2hlY2sgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEIENoZWNrIGZvciBVcGRhdGVzJzsgY2hlY2tCdG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgMzAwMCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkSGlzdG9yeSgpIHtcbiAgICB0cnkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvaGlzdG9yeT9saW1pdD01MCcpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBjb25zdCBoaXN0b3J5ID0gZGF0YS5zdWNjZXNzICYmIGRhdGEuaGlzdG9yeSA/IGRhdGEuaGlzdG9yeSA6IFtdO1xuICAgICAgaWYgKGhpc3RvcnkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj5ObyB1cGRhdGUgaGlzdG9yeSB5ZXQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPldoZW48L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Db250YWluZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5JbWFnZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkR1cmF0aW9uPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGggb2YgaGlzdG9yeSkge1xuICAgICAgICBjb25zdCBvayA9IGguc3RhdHVzID09PSAnc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IGR1ciA9IGguZHVyYXRpb24gPyAoaC5kdXJhdGlvbiA8IDEwMDAgPyBoLmR1cmF0aW9uICsgJ21zJyA6IE1hdGgucm91bmQoaC5kdXJhdGlvbiAvIDEwMDApICsgJ3MnKSA6ICctJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7dGltZUFnbyhoLnRpbWVzdGFtcCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKGguY29udGFpbmVyTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKGguaW1hZ2VOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2R1cn08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke29rID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYmFkLWZnKSd9O1wiPiR7b2sgPyAnXHUyNzEzIHN1Y2Nlc3MnIDogJ1x1MjcxNyBmYWlsZWQnfTwvc3Bhbj48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaWYgKCFvayAmJiBoLmVycm9yKSB7XG4gICAgICAgICAgaHRtbCArPSBgPHRyPjx0ZCBjb2xzcGFuPVwiNVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JHtlc2NhcGVIdG1sKGguZXJyb3IpfTwvdGQ+PC90cj5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEF1dG9Db25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG5cbiAgICAgIC8vIEZldGNoIGNvbnRhaW5lcnMgYW5kIHNhdmVkIGF1dG8tdXBkYXRlIGNvbmZpZyBpbiBwYXJhbGxlbFxuICAgICAgY29uc3QgW2NvbnRhaW5lcnNSZXMsIGNvbmZpZ1Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3N0YXRzL2NvbnRhaW5lcnMnKSxcbiAgICAgICAgZmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9hdXRvLXVwZGF0ZScpXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnNEYXRhID0gYXdhaXQgY29udGFpbmVyc1Jlcy5qc29uKCk7XG4gICAgICBjb25zdCBjb25maWdEYXRhID0gYXdhaXQgY29uZmlnUmVzLmpzb24oKTtcblxuICAgICAgY29uc3QgY29udGFpbmVycyA9IGNvbnRhaW5lcnNEYXRhLnN1Y2Nlc3MgJiYgY29udGFpbmVyc0RhdGEuc3RhdHMgPyBjb250YWluZXJzRGF0YS5zdGF0cyA6IFtdO1xuICAgICAgY29uc3Qgc2F2ZWRDb25maWcgPSBjb25maWdEYXRhLnN1Y2Nlc3MgJiYgY29uZmlnRGF0YS5jb25maWcgPyBjb25maWdEYXRhLmNvbmZpZyA6IHt9O1xuXG4gICAgICBpZiAoY29udGFpbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXV0b0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPk5vIHJ1bm5pbmcgY29udGFpbmVycyBmb3VuZC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdXRvLXVwZGF0ZXMgcnVuIGR1cmluZyBtYWludGVuYW5jZSB3aW5kb3cgKGRlZmF1bHQgMkFNLTRBTSkuIERhaWx5ID0gZXZlcnkgZGF5LCBXZWVrbHkgPSBTdW5kYXlzLCBNb250aGx5ID0gMXN0IG9mIG1vbnRoLjwvZGl2Pic7XG4gICAgICBodG1sICs9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U2NoZWR1bGU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaW5kb3c8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Sb2xsYmFjazwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkxhc3QgUnVuPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgYyBvZiBjb250YWluZXJzKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBjLm5hbWUgfHwgYy5OYW1lcz8uWzBdPy5yZXBsYWNlKC9eXFwvLywgJycpIHx8IGMuSWQ/LnN1YnN0cmluZygwLCAxMik7XG4gICAgICAgIGNvbnN0IGNpZCA9IGMuY29udGFpbmVySWQgfHwgYy5JZDtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSBzYXZlZENvbmZpZ1tjaWRdIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2hlZHVsZVZhbCA9IHNhdmVkLmVuYWJsZWQgPyAoc2F2ZWQuc2NoZWR1bGUgfHwgJ3dlZWtseScpIDogJyc7XG4gICAgICAgIGNvbnN0IHJvbGxiYWNrVmFsID0gc2F2ZWQuYXV0b1JvbGxiYWNrICE9PSBmYWxzZTtcbiAgICAgICAgY29uc3Qgd2luZG93VmFsID0gc2F2ZWQubWFpbnRlbmFuY2VXaW5kb3cgfHwgJyc7XG4gICAgICAgIGNvbnN0IGxhc3RSdW4gPSBzYXZlZC5sYXN0QXV0b1VwZGF0ZSA/IHRpbWVBZ28oc2F2ZWQubGFzdEF1dG9VcGRhdGUpIDogJ05ldmVyJztcblxuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIiBkYXRhLWNvbnRhaW5lci1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwobmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImF1dG8tc2NoZWR1bGVcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiJHshc2NoZWR1bGVWYWwgPyAnIHNlbGVjdGVkJyA6ICcnfT5EaXNhYmxlZDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRhaWx5XCIke3NjaGVkdWxlVmFsID09PSAnZGFpbHknID8gJyBzZWxlY3RlZCcgOiAnJ30+RGFpbHk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3ZWVrbHlcIiR7c2NoZWR1bGVWYWwgPT09ICd3ZWVrbHknID8gJyBzZWxlY3RlZCcgOiAnJ30+V2Vla2x5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhseVwiJHtzY2hlZHVsZVZhbCA9PT0gJ21vbnRobHknID8gJyBzZWxlY3RlZCcgOiAnJ30+TW9udGhseTwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXV0by13aW5kb3dcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIgdmFsdWU9XCIke2VzY2FwZUh0bWwod2luZG93VmFsKX1cIiBwbGFjZWhvbGRlcj1cIjAyOjAwLTA0OjAwXCIgc3R5bGU9XCJ3aWR0aDogOTBweDsgcGFkZGluZzogM3B4IDZweDsgZm9udC1zaXplOiAwLjc4cmVtOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImF1dG8tcm9sbGJhY2tcIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIke3JvbGxiYWNrVmFsID8gJyBjaGVja2VkJyA6ICcnfSAvPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtsYXN0UnVufTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj48YnV0dG9uIGNsYXNzPVwic2F2ZS1hdXRvLWJ0blwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwobmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlNhdmU8L2J1dHRvbj48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgLy8gV2lyZSBzYXZlIGJ1dHRvbnNcbiAgICAgIGF1dG9Db250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNhdmUtYXV0by1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGJ0bi5kYXRhc2V0LmlkO1xuICAgICAgICAgIGNvbnN0IHJvdyA9IGJ0bi5jbG9zZXN0KCd0cicpO1xuICAgICAgICAgIGNvbnN0IHNjaGVkdWxlID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5hdXRvLXNjaGVkdWxlJykudmFsdWU7XG4gICAgICAgICAgY29uc3Qgcm9sbGJhY2sgPSByb3cucXVlcnlTZWxlY3RvcignLmF1dG8tcm9sbGJhY2snKS5jaGVja2VkO1xuICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuYXV0by13aW5kb3cnKS52YWx1ZS50cmltKCk7XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvYXV0by11cGRhdGUvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVuYWJsZWQ6ICEhc2NoZWR1bGUsIHNjaGVkdWxlOiBzY2hlZHVsZSB8fCAnd2Vla2x5JywgYXV0b1JvbGxiYWNrOiByb2xsYmFjaywgbWFpbnRlbmFuY2VXaW5kb3c6IHdpbmRvdyB8fCB1bmRlZmluZWQgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzEzIFNhdmVkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzE3IEVycm9yJztcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NhdmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1NhdmUnOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgMjAwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXV0b0NvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT0gREFTSENBRERZIFNFTEYtVVBEQVRFID09PT09XG5cbiAgY29uc3QgZGNWZXJzaW9uSW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktY3VycmVudC12ZXJzaW9uJyk7XG4gIGNvbnN0IGRjVXBkYXRlQmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXVwZGF0ZS1iYWRnZScpO1xuICBjb25zdCBkY1VwZGF0ZURldGFpbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXVwZGF0ZS1kZXRhaWxzJyk7XG4gIGNvbnN0IGRjTmV3VmVyc2lvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktbmV3LXZlcnNpb24nKTtcbiAgY29uc3QgZGNDaGFuZ2Vsb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWNoYW5nZWxvZycpO1xuICBjb25zdCBkY0FwcGx5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1hcHBseS1idG4nKTtcbiAgY29uc3QgZGNDaGVja0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktY2hlY2stYnRuJyk7XG4gIGNvbnN0IGRjUm9sbGJhY2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXJvbGxiYWNrLWJ0bicpO1xuICBjb25zdCBkY1N0YXR1c0JhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktc3RhdHVzLWJhcicpO1xuICBjb25zdCBkY0hpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWhpc3RvcnktY29udGFpbmVyJyk7XG5cbiAgbGV0IGRjTGFzdENoZWNrID0gbnVsbDtcblxuICBmdW5jdGlvbiBkY1Nob3dTdGF0dXMobXNnLCB0eXBlKSB7XG4gICAgaWYgKCFkY1N0YXR1c0JhcikgcmV0dXJuO1xuICAgIGRjU3RhdHVzQmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGRjU3RhdHVzQmFyLnN0eWxlLmJhY2tncm91bmQgPSB0eXBlID09PSAnZXJyb3InID8gJ3ZhcigtLWJhZC1iZyknIDogdHlwZSA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW9rLWJnKScgOiAndmFyKC0tYmcpJztcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5jb2xvciA9IHR5cGUgPT09ICdlcnJvcicgPyAndmFyKC0tYmFkLWZnKScgOiB0eXBlID09PSAnc3VjY2VzcycgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1mZyknO1xuICAgIGRjU3RhdHVzQmFyLnRleHRDb250ZW50ID0gbXNnO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNMb2FkVmVyc2lvbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3ZlcnNpb24nKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBjb21taXQgPSBkYXRhLmNvbW1pdCAmJiBkYXRhLmNvbW1pdCAhPT0gJ3Vua25vd24nID8gZGF0YS5jb21taXQgOiBudWxsO1xuICAgICAgICBkY1ZlcnNpb25JbmZvLnRleHRDb250ZW50ID0gJ3YnICsgZGF0YS52ZXJzaW9uICsgKGNvbW1pdCA/ICcgKCcgKyBjb21taXQuc3Vic3RyaW5nKDAsIDcpICsgJyknIDogJycpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIGRjVmVyc2lvbkluZm8udGV4dENvbnRlbnQgPSAnVW5hYmxlIHRvIGZldGNoIHZlcnNpb24nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjQ2hlY2tGb3JVcGRhdGUoc2lsZW50KSB7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIGRjQ2hlY2tCdG4udGV4dENvbnRlbnQgPSAnQ2hlY2tpbmcuLi4nO1xuICAgICAgZGNDaGVja0J0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vdXBkYXRlLWNoZWNrJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGRjTGFzdENoZWNrID0gZGF0YTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLmF2YWlsYWJsZSAmJiBkYXRhLnJlbW90ZSkge1xuICAgICAgICBkY1VwZGF0ZUJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgZGNVcGRhdGVEZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgZGNOZXdWZXJzaW9uLnRleHRDb250ZW50ID0gJ3YnICsgZGF0YS5yZW1vdGUudmVyc2lvbjtcbiAgICAgICAgZGNDaGFuZ2Vsb2cudGV4dENvbnRlbnQgPSBkYXRhLnJlbW90ZS5jaGFuZ2Vsb2cgfHwgJ05vIGNoYW5nZWxvZyBhdmFpbGFibGUuJztcblxuICAgICAgICAvLyBBZGQgbm90aWZpY2F0aW9uIGRvdCB0byB0aGUgVXBkYXRlcyBidXR0b25cbiAgICAgICAgY29uc3QgdXBkYXRlc0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWJ0bicpO1xuICAgICAgICBpZiAodXBkYXRlc0J0biAmJiAhdXBkYXRlc0J0bi5xdWVyeVNlbGVjdG9yKCcudXBkYXRlLWRvdCcpKSB7XG4gICAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAndXBkYXRlLWRvdCc7XG4gICAgICAgICAgZG90LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDtyaWdodDoycHg7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQpOyc7XG4gICAgICAgICAgdXBkYXRlc0J0bi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgdXBkYXRlc0J0bi5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsc28gYWRkIGRvdCB0byB0aGUgRGFzaENhZGR5IHRhYlxuICAgICAgICBjb25zdCBkY1RhYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWRhc2hjYWRkeS10YWInKTtcbiAgICAgICAgaWYgKGRjVGFiICYmICFkY1RhYi5xdWVyeVNlbGVjdG9yKCcudXBkYXRlLWRvdCcpKSB7XG4gICAgICAgICAgY29uc3QgZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAndXBkYXRlLWRvdCc7XG4gICAgICAgICAgZG90LnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NnB4O2hlaWdodDo2cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQpO21hcmdpbi1sZWZ0OjRweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7JztcbiAgICAgICAgICBkY1RhYi5hcHBlbmRDaGlsZChkb3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkY1VwZGF0ZUJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRjVXBkYXRlRGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBhd2FpdCBkY0xvYWRWZXJzaW9uKCk7XG4gICAgICAgIGlmICghc2lsZW50KSBkY1Nob3dTdGF0dXMoJ1lvdSBhcmUgcnVubmluZyB0aGUgbGF0ZXN0IHZlcnNpb24uJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZGNDaGVja0J0bi50ZXh0Q29udGVudCA9ICdDaGVjayBmb3IgVXBkYXRlcyc7XG4gICAgICAgIGRjQ2hlY2tCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ0ZhaWxlZCB0byBjaGVjazogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgIGRjQ2hlY2tCdG4udGV4dENvbnRlbnQgPSAnQ2hlY2sgZm9yIFVwZGF0ZXMnO1xuICAgICAgICBkY0NoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNBcHBseVVwZGF0ZSgpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ0FwcGx5IERhc2hDYWRkeSB1cGRhdGU/IFRoZSBBUEkgY29udGFpbmVyIHdpbGwgcmVzdGFydC4nKSkgcmV0dXJuIGZhbHNlO1xuICAgIGRjQXBwbHlCdG4udGV4dENvbnRlbnQgPSAnVXBkYXRpbmcuLi4nO1xuICAgIGRjQXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGRjU2hvd1N0YXR1cygnRG93bmxvYWRpbmcgYW5kIGFwcGx5aW5nIHVwZGF0ZS4uLicsICdpbmZvJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3N5c3RlbS91cGRhdGUtYXBwbHknLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGRjU2hvd1N0YXR1cygnVXBkYXRlIGluaXRpYXRlZDogdicgKyAoZGF0YS5mcm9tVmVyc2lvbiB8fCAnPycpICsgJyBcdTIxOTIgdicgKyAoZGF0YS50b1ZlcnNpb24gfHwgJz8nKSArICcuIFRoZSBjb250YWluZXIgd2lsbCByZXN0YXJ0IHNob3J0bHkuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgZGNBcHBseUJ0bi50ZXh0Q29udGVudCA9ICdBcHBsaWVkISc7XG4gICAgICAgIC8vIFJlbW92ZSBub3RpZmljYXRpb24gZG90c1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXBkYXRlLWRvdCcpLmZvckVhY2goZCA9PiBkLnJlbW92ZSgpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnVXBkYXRlIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRjU2hvd1N0YXR1cygnVXBkYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICBkY0FwcGx5QnRuLnRleHRDb250ZW50ID0gJ1VwZGF0ZSBOb3cnO1xuICAgICAgZGNBcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY0xvYWRIaXN0b3J5KCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vdXBkYXRlLWhpc3RvcnknKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLmhpc3RvcnkgPyBkYXRhLmhpc3RvcnkgOiBbXTtcbiAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkY0hpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj5ObyBzZWxmLXVwZGF0ZSBoaXN0b3J5LjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+VmVyc2lvbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkZyb208L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TdGF0dXM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgaCBvZiBoaXN0b3J5KSB7XG4gICAgICAgIGNvbnN0IHN0ID0gaC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICdcdTI3MTMgc3VjY2VzcycgOiBoLnN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gJ1x1MjNGMyBwZW5kaW5nJyA6IGguc3RhdHVzID09PSAncGFydGlhbCcgPyAnXHUyNkEwIHBhcnRpYWwnIDogJ1x1MjcxNyAnICsgaC5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHN0Q29sb3IgPSBoLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW9rLWZnKScgOiBoLnN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gJ3ZhcigtLW11dGVkKScgOiAndmFyKC0tYmFkLWZnKSc7XG4gICAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgdGltZUFnbyhoLnRpbWVzdGFtcCkgKyAnPC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+dicgKyBlc2NhcGVIdG1sKGgudmVyc2lvbikgKyAoaC5yb2xsYmFjayA/ICcgKHJvbGxiYWNrKScgOiAnJykgKyAnPC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+dicgKyBlc2NhcGVIdG1sKGguZnJvbVZlcnNpb24gfHwgJz8nKSArICc8L3RkPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAnICsgc3RDb2xvciArICc7XCI+JyArIHN0ICsgJzwvc3Bhbj48L3RkPic7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgICAgaWYgKGguZXJyb3IpIHtcbiAgICAgICAgICBodG1sICs9ICc8dHI+PHRkIGNvbHNwYW49XCI0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggNnB4IDhweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4nICsgZXNjYXBlSHRtbChoLmVycm9yKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaC5ub3RlKSB7XG4gICAgICAgICAgaHRtbCArPSAnPHRyPjx0ZCBjb2xzcGFuPVwiNFwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgZXNjYXBlSHRtbChoLm5vdGUpICsgJzwvdGQ+PC90cj4nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBkY0hpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkY0hpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNTaG93Um9sbGJhY2soKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N5c3RlbS9yb2xsYmFjay12ZXJzaW9ucycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBjb25zdCB2ZXJzaW9ucyA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLnZlcnNpb25zID8gZGF0YS52ZXJzaW9ucyA6IFtdO1xuICAgICAgaWYgKHZlcnNpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdObyByb2xsYmFjayB2ZXJzaW9ucyBhdmFpbGFibGUuJywgJ2luZm8nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdmVyc2lvbiA9IHByb21wdCgnQXZhaWxhYmxlIHJvbGxiYWNrIHZlcnNpb25zOlxcbicgKyB2ZXJzaW9ucy5qb2luKCdcXG4nKSArICdcXG5cXG5FbnRlciB2ZXJzaW9uIHRvIHJvbGxiYWNrIHRvOicpO1xuICAgICAgaWYgKCF2ZXJzaW9uKSByZXR1cm47XG4gICAgICBpZiAoIXZlcnNpb25zLmluY2x1ZGVzKHZlcnNpb24pKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ludmFsaWQgdmVyc2lvbjogJyArIHZlcnNpb24sICdlcnJvcicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWNvbmZpcm0oJ1JvbGxiYWNrIERhc2hDYWRkeSB0byB2JyArIHZlcnNpb24gKyAnPyBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydC4nKSkgcmV0dXJuO1xuICAgICAgZGNTaG93U3RhdHVzKCdSb2xsaW5nIGJhY2sgdG8gdicgKyB2ZXJzaW9uICsgJy4uLicsICdpbmZvJyk7XG4gICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvc3lzdGVtL3JvbGxiYWNrJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdmVyc2lvbiB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICBpZiAoZC5zdWNjZXNzKSB7XG4gICAgICAgIGRjU2hvd1N0YXR1cygnUm9sbGJhY2sgdG8gdicgKyB2ZXJzaW9uICsgJyBpbml0aWF0ZWQuIENvbnRhaW5lciB3aWxsIHJlc3RhcnQuJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yIHx8ICdSb2xsYmFjayBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkY1Nob3dTdGF0dXMoJ1JvbGxiYWNrIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgZGNDaGVja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBkY0NoZWNrRm9yVXBkYXRlKGZhbHNlKSk7XG4gIGRjQXBwbHlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZGNBcHBseVVwZGF0ZSgpLmNhdGNoKCgpID0+IHt9KSk7XG4gIGRjUm9sbGJhY2tCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGNTaG93Um9sbGJhY2spO1xuXG4gIGNoZWNrQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoZWNrRm9yVXBkYXRlcyk7XG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZEF2YWlsYWJsZSgpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjYW5jZWxCdG4pO1xuXG4gIC8vIE9wZW4gVXBkYXRlIE1hbmFnZW1lbnQgbW9kYWwsIG9wdGlvbmFsbHkgc2Nyb2xsZWQgdG8gYSBzcGVjaWZpYyBhcHBcbiAgd2luZG93Lm9wZW5VcGRhdGVNb2RhbCA9IGZ1bmN0aW9uKGFwcElkKSB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkQXZhaWxhYmxlKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWFwcElkKSByZXR1cm47XG4gICAgICAvLyBTY3JvbGwgdG8gYW5kIGhpZ2hsaWdodCB0aGUgbWF0Y2hpbmcgcm93XG4gICAgICBjb25zdCByb3cgPSBhdmFpbGFibGVDb250YWluZXIucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwLWlkPVwiJHthcHBJZH1cIl1gKTtcbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgcm93LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgICAgIHJvdy5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMjQ5LDExNSwyMiwwLjE1KSc7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyByb3cuc3R5bGUuYmFja2dyb3VuZCA9ICcnOyB9LCAzMDAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInVwZGF0ZXMtaGlzdG9yeVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRIaXN0b3J5KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJ1cGRhdGVzLWF1dG9cIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkQXV0b0NvbmZpZyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwidXBkYXRlcy1kYXNoY2FkZHlcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZGNMb2FkVmVyc2lvbigpO1xuICAgIGRjTG9hZEhpc3RvcnkoKTtcbiAgICBpZiAoIWRjTGFzdENoZWNrKSBkY0NoZWNrRm9yVXBkYXRlKHRydWUpO1xuICB9KTtcblxuICB3aW5kb3cuZGNBcHBseVVwZGF0ZSA9IGRjQXBwbHlVcGRhdGU7XG4gIHdpbmRvdy5kY0NoZWNrRm9yVXBkYXRlID0gZGNDaGVja0ZvclVwZGF0ZTtcblxuICAvLyBOb24tYmxvY2tpbmcgY2hlY2sgb24gcGFnZSBsb2FkIFx1MjAxNCBqdXN0IGFkZHMgbm90aWZpY2F0aW9uIGRvdCBpZiB1cGRhdGUgYXZhaWxhYmxlXG4gIHNldFRpbWVvdXQoKCkgPT4gZGNDaGVja0ZvclVwZGF0ZSh0cnVlKSwgNTAwMCk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBET0NLRVIgUkVTT1VSQ0VTIChWb2x1bWVzLCBOZXR3b3JrcywgRGlzayBVc2FnZSkgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnZG9ja2VyLXJlc291cmNlcy1tb2RhbCcsIGA8ZGl2IGlkPVwiZG9ja2VyLXJlc291cmNlcy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzUwcHg7IG1heC13aWR0aDogOTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQzMzIERvY2tlciBSZXNvdXJjZXM8L2gzPlxuICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiPk1hbmFnZSB2b2x1bWVzLCBuZXR3b3JrcywgYW5kIHZpZXcgZGlzayB1c2FnZS48L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cImRyLXZvbHVtZXNcIj5Wb2x1bWVzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiZHItbmV0d29ya3NcIj5OZXR3b3JrczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImRyLWRpc2tcIj5EaXNrIFVzYWdlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBWb2x1bWVzIC0tPlxuICAgICAgPGRpdiBpZD1cImRyLXZvbHVtZXNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRyLXZvbC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJWb2x1bWUgbmFtZVwiIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiIC8+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRyLXZvbC1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07XCI+Q3JlYXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZHItdm9sLWxpc3RcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDQwMHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE5ldHdvcmtzIC0tPlxuICAgICAgPGRpdiBpZD1cImRyLW5ldHdvcmtzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRyLW5ldC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJOZXR3b3JrIG5hbWVcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJkci1uZXQtZHJpdmVyXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJpZGdlXCI+YnJpZGdlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwib3ZlcmxheVwiPm92ZXJsYXk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJob3N0XCI+aG9zdDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkci1uZXQtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPkNyZWF0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRyLW5ldC1saXN0XCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEaXNrIFVzYWdlIC0tPlxuICAgICAgPGRpdiBpZD1cImRyLWRpc2tcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImRyLWRpc2stY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImRyLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2NrZXItcmVzb3VyY2VzLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9ja2VyLXJlc291cmNlcy1idG4nKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItY2xvc2UnKTtcblxuICBmdW5jdGlvbiBmbXRCeXRlcyhieXRlcykge1xuICAgIGlmICghYnl0ZXMgfHwgYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKE1hdGguYWJzKGJ5dGVzKSkgLyBNYXRoLmxvZygxMDI0KSk7XG4gICAgcmV0dXJuIChieXRlcyAvIE1hdGgucG93KDEwMjQsIGkpKS50b0ZpeGVkKDEpICsgJyAnICsgdW5pdHNbaV07XG4gIH1cblxuICAvLyA9PT09PSBWT0xVTUVTID09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRWb2x1bWVzKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci12b2wtbGlzdCcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9kb2NrZXIvdm9sdW1lcycpO1xuICAgICAgY29uc3Qgdm9scyA9IGRhdGEudm9sdW1lcyB8fCBbXTtcbiAgICAgIGlmICh2b2xzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENFNjwvc3Bhbj5ObyB2b2x1bWVzIGZvdW5kLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5OYW1lPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+RHJpdmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+U2NvcGU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCB2IG9mIHZvbHMpIHtcbiAgICAgICAgY29uc3QgaXNTeXN0ZW0gPSB2Lm5hbWUgPT09ICdidWlsZGtpdCcgfHwgdi5uYW1lLmxlbmd0aCA9PT0gNjQ7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDsgbWF4LXdpZHRoOiAzMDBweDsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwodi5uYW1lKX1cIj4ke2VzY2FwZUh0bWwodi5uYW1lLmxlbmd0aCA+IDQwID8gdi5uYW1lLnN1YnN0cmluZygwLCAzNykgKyAnLi4uJyA6IHYubmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwodi5kcml2ZXIpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHYuc2NvcGUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5gO1xuICAgICAgICBpZiAoIWlzU3lzdGVtKSB7XG4gICAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cImRyLXZvbC1kZWxcIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwodi5uYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVsZXRlPC9idXR0b24+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9IGA8L3RkPjwvdHI+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmRyLXZvbC1kZWwnKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSB2b2x1bWUgXCIke2J0bi5kYXRhc2V0Lm5hbWV9XCI/IERhdGEgd2lsbCBiZSBsb3N0LmApKSByZXR1cm47XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlQVBJKGAvYXBpL3YxL2RvY2tlci92b2x1bWVzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJ0bi5kYXRhc2V0Lm5hbWUpfT9mb3JjZT10cnVlYCk7XG4gICAgICAgICAgICBsb2FkVm9sdW1lcygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0RlbGV0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0RlbGV0ZSc7XG4gICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItdm9sLWNyZWF0ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItdm9sLW5hbWUnKTtcbiAgICBjb25zdCBuYW1lID0gbmFtZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHsgc2hvd05vdGlmaWNhdGlvbignRW50ZXIgYSB2b2x1bWUgbmFtZScsICd3YXJuaW5nJyk7IHJldHVybjsgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwb3N0SlNPTignL2FwaS92MS9kb2NrZXIvdm9sdW1lcycsIHsgbmFtZSB9KTtcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgVm9sdW1lIFwiJHtuYW1lfVwiIGNyZWF0ZWRgLCAnc3VjY2VzcycpO1xuICAgICAgbG9hZFZvbHVtZXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDcmVhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IE5FVFdPUktTID09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWROZXR3b3JrcygpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItbmV0LWxpc3QnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvZG9ja2VyL25ldHdvcmtzJyk7XG4gICAgICBjb25zdCBuZXRzID0gZGF0YS5uZXR3b3JrcyB8fCBbXTtcbiAgICAgIGlmIChuZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzQ1x1REYxMDwvc3Bhbj5ObyBuZXR3b3JrcyBmb3VuZC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TmFtZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkRyaXZlcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPlNjb3BlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+Q29udGFpbmVyczwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IG4gb2YgbmV0cykge1xuICAgICAgICBjb25zdCBpc1N5c3RlbSA9IFsnYnJpZGdlJywgJ2hvc3QnLCAnbm9uZSddLmluY2x1ZGVzKG4ubmFtZSk7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwobi5uYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChuLmRyaXZlcil9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwobi5zY29wZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4ke24uY29udGFpbmVyc308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaWYgKCFpc1N5c3RlbSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9XCJkci1uZXQtZGVsXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChuLmlkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwobi5uYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVsZXRlPC9idXR0b24+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9IGA8L3RkPjwvdHI+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmRyLW5ldC1kZWwnKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpcm0oYERlbGV0ZSBuZXR3b3JrIFwiJHtidG4uZGF0YXNldC5uYW1lfVwiP2ApKSByZXR1cm47XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlQVBJKGAvYXBpL3YxL2RvY2tlci9uZXR3b3Jrcy8ke2VuY29kZVVSSUNvbXBvbmVudChidG4uZGF0YXNldC5pZCl9YCk7XG4gICAgICAgICAgICBsb2FkTmV0d29ya3MoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZWxldGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZWxldGUnO1xuICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1jcmVhdGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1uYW1lJyk7XG4gICAgY29uc3QgZHJpdmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1kcml2ZXInKTtcbiAgICBjb25zdCBuYW1lID0gbmFtZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHsgc2hvd05vdGlmaWNhdGlvbignRW50ZXIgYSBuZXR3b3JrIG5hbWUnLCAnd2FybmluZycpOyByZXR1cm47IH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvZG9ja2VyL25ldHdvcmtzJywgeyBuYW1lLCBkcml2ZXI6IGRyaXZlclNlbGVjdC52YWx1ZSB9KTtcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgTmV0d29yayBcIiR7bmFtZX1cIiBjcmVhdGVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIGxvYWROZXR3b3JrcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NyZWF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gPT09PT0gRElTSyBVU0FHRSA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkRGlza1VzYWdlKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1kaXNrLWNvbnRlbnQnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvZG9ja2VyL2Rpc2stdXNhZ2UnKTtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gW1xuICAgICAgICB7IGxhYmVsOiAnSW1hZ2VzJywgaWNvbjogJ1x1RDgzRFx1RENDMCcsIGNvdW50OiBkYXRhLmltYWdlcy5jb3VudCwgc2l6ZTogZGF0YS5pbWFnZXMuc2l6ZSwgcmVjbGFpbWFibGU6IGRhdGEuaW1hZ2VzLnJlY2xhaW1hYmxlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb250YWluZXJzJywgaWNvbjogJ1x1RDgzRFx1RENFNicsIGNvdW50OiBkYXRhLmNvbnRhaW5lcnMuY291bnQsIHNpemU6IGRhdGEuY29udGFpbmVycy5zaXplLCBleHRyYTogYCR7ZGF0YS5jb250YWluZXJzLnJ1bm5pbmd9IHJ1bm5pbmdgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdWb2x1bWVzJywgaWNvbjogJ1x1RDgzRFx1RENCRScsIGNvdW50OiBkYXRhLnZvbHVtZXMuY291bnQsIHNpemU6IGRhdGEudm9sdW1lcy5zaXplLCByZWNsYWltYWJsZTogZGF0YS52b2x1bWVzLnJlY2xhaW1hYmxlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdCdWlsZCBDYWNoZScsIGljb246ICdcdUQ4M0RcdUREMjcnLCBjb3VudDogZGF0YS5idWlsZENhY2hlLmNvdW50LCBzaXplOiBkYXRhLmJ1aWxkQ2FjaGUuc2l6ZSwgcmVjbGFpbWFibGU6IGRhdGEuYnVpbGRDYWNoZS5yZWNsYWltYWJsZSB9LFxuICAgICAgXTtcblxuICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtOyBmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlRvdGFsOiAke2ZtdEJ5dGVzKGRhdGEudG90YWxTaXplKX08L2Rpdj5gO1xuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4O1wiPic7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VjdGlvbnMpIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+JHtzLmljb259ICR7cy5sYWJlbH0gPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXdlaWdodDogNDAwOyBmb250LXNpemU6IDAuODJyZW07XCI+KCR7cy5jb3VudH0pPC9zcGFuPjwvZGl2PmA7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+JHtmbXRCeXRlcyhzLnNpemUpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzLnJlY2xhaW1hYmxlID4gMCkgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5SZWNsYWltYWJsZTogJHtmbXRCeXRlcyhzLnJlY2xhaW1hYmxlKX08L2Rpdj5gO1xuICAgICAgICBpZiAocy5leHRyYSkgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3MuZXh0cmF9PC9kaXY+YDtcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1vZGFsIGV2ZW50c1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRWb2x1bWVzKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcblxuICAvLyBMYXp5LWxvYWQgdGFic1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImRyLW5ldHdvcmtzXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZE5ldHdvcmtzKTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJkci1kaXNrXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZERpc2tVc2FnZSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBET0NLRVIgQ09NUE9TRSBJTVBPUlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnY29tcG9zZS1pbXBvcnQtbW9kYWwnLCBgPGRpdiBpZD1cImNvbXBvc2UtaW1wb3J0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2NTBweDsgbWF4LXdpZHRoOiA4MDBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDRTYgSW1wb3J0IERvY2tlciBDb21wb3NlPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5QYXN0ZSBhIGRvY2tlci1jb21wb3NlLnltbCB0byBpbXBvcnQgYW5kIGRlcGxveSBzZXJ2aWNlcy48L3A+XG5cbiAgICAgIDwhLS0gU3RlcCAxOiBQYXN0ZSBZQU1MIC0tPlxuICAgICAgPGRpdiBpZD1cImNvbXBvc2Utc3RlcC1wYXN0ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlN0YWNrIE5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY29tcG9zZS1zdGFjay1uYW1lXCIgcGxhY2Vob2xkZXI9XCJteS1zdGFja1wiIHZhbHVlPVwiXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPmRvY2tlci1jb21wb3NlLnltbDwvbGFiZWw+XG4gICAgICAgICAgPHRleHRhcmVhIGlkPVwiY29tcG9zZS15YW1sXCIgcm93cz1cIjE0XCIgcGxhY2Vob2xkZXI9XCJ2ZXJzaW9uOiAnMycmIzEwO3NlcnZpY2VzOiYjMTA7ICB3ZWI6JiMxMDsgICAgaW1hZ2U6IG5naW54OmxhdGVzdCYjMTA7ICAgIHBvcnRzOiYjMTA7ICAgICAgLSAnODA4MDo4MCdcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODJyZW07IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyByZXNpemU6IHZlcnRpY2FsO1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiY29tcG9zZS1maWxlLXVwbG9hZFwiIGFjY2VwdD1cIi55bWwsLnlhbWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcIj5vciB1cGxvYWQgYSBmaWxlPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLXBhcnNlLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHg7XCI+UGFyc2UgJiBQcmV2aWV3PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbXBvc2UtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAyOiBQcmV2aWV3IC0tPlxuICAgICAgPGRpdiBpZD1cImNvbXBvc2Utc3RlcC1wcmV2aWV3XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwiY29tcG9zZS1wcmV2aWV3LWNvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLWRlcGxveS1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4O1wiPkRlcGxveSBBbGw8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1iYWNrLWJ0blwiPkJhY2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDM6IFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cImNvbXBvc2Utc3RlcC1wcm9ncmVzc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cImNvbXBvc2UtcHJvZ3Jlc3MtY29udGVudFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtaW1wb3J0LW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1pbXBvcnQtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWNhbmNlbCcpO1xuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICBsZXQgcGFyc2VkRGF0YSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gc2hvd1N0ZXAoc3RlcCkge1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0ZXAtcGFzdGUnKS5zdHlsZS5kaXNwbGF5ID0gc3RlcCA9PT0gJ3Bhc3RlJyA/ICcnIDogJ25vbmUnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0ZXAtcHJldmlldycpLnN0eWxlLmRpc3BsYXkgPSBzdGVwID09PSAncHJldmlldycgPyAnJyA6ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXByb2dyZXNzJykuc3R5bGUuZGlzcGxheSA9IHN0ZXAgPT09ICdwcm9ncmVzcycgPyAnJyA6ICdub25lJztcbiAgfVxuXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHNob3dTdGVwKCdwYXN0ZScpO1xuICAgIHBhcnNlZERhdGEgPSBudWxsO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXlhbWwnKS52YWx1ZSA9ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0YWNrLW5hbWUnKS52YWx1ZSA9ICcnO1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH0pO1xuXG4gIC8vIEZpbGUgdXBsb2FkXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWZpbGUtdXBsb2FkJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UteWFtbCcpLnZhbHVlID0gcmVhZGVyLnJlc3VsdDsgfTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgfSk7XG5cbiAgLy8gUGFyc2VcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcGFyc2UtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhbWxTdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS15YW1sJykudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXN0YWNrLW5hbWUnKS52YWx1ZS50cmltKCkgfHwgJ3N0YWNrJztcbiAgICBpZiAoIXlhbWxTdHIpIHsgc2hvd05vdGlmaWNhdGlvbignUGFzdGUgYSBkb2NrZXItY29tcG9zZS55bWwnLCAnd2FybmluZycpOyByZXR1cm47IH1cblxuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXBhcnNlLWJ0bicpO1xuICAgIGNvbnN0IG9yaWdUZXh0ID0gYnRuLnRleHRDb250ZW50O1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdQYXJzaW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwb3N0SlNPTignL2FwaS92MS9hcHBzL2ltcG9ydC1jb21wb3NlJywgeyB5YW1sOiB5YW1sU3RyLCBzdGFja05hbWUgfSk7XG4gICAgICBwYXJzZWREYXRhID0gZGF0YTtcbiAgICAgIHBhcnNlZERhdGEuc3RhY2tOYW1lID0gc3RhY2tOYW1lO1xuICAgICAgcmVuZGVyUHJldmlldyhkYXRhKTtcbiAgICAgIHNob3dTdGVwKCdwcmV2aWV3Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGFyc2UgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ1RleHQ7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHJlbmRlclByZXZpZXcoZGF0YSkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXByZXZpZXctY29udGVudCcpO1xuICAgIGxldCBodG1sID0gJyc7XG5cbiAgICBpZiAoZGF0YS5uZXR3b3JrcyAmJiBkYXRhLm5ldHdvcmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TmV0d29ya3M6ICR7ZGF0YS5uZXR3b3Jrcy5tYXAobiA9PiBgPGNvZGU+JHtlc2NhcGVIdG1sKG4pfTwvY29kZT5gKS5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgfVxuICAgIGlmIChkYXRhLnZvbHVtZXMgJiYgZGF0YS52b2x1bWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Vm9sdW1lczogJHtkYXRhLnZvbHVtZXMubWFwKHYgPT4gYDxjb2RlPiR7ZXNjYXBlSHRtbCh2KX08L2NvZGU+YCkuam9pbignLCAnKX08L2Rpdj5gO1xuICAgIH1cblxuICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JHtkYXRhLnNlcnZpY2VzLmxlbmd0aH0gc2VydmljZShzKTwvZGl2PmA7XG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDM1MHB4O1wiPic7XG5cbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBkYXRhLnNlcnZpY2VzKSB7XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IHN2Yy5za2lwID8gJ3ZhcigtLWJhZC1mZyknIDogJ3ZhcigtLWJvcmRlciknO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTRweDsgYm9yZGVyOiAxcHggc29saWQgJHtib3JkZXJDb2xvcn07IGJvcmRlci1yYWRpdXM6IDhweDsgbWFyZ2luLWJvdHRvbTogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7XCI+YDtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwoc3ZjLm5hbWUpfWA7XG4gICAgICBpZiAoc3ZjLnNraXApIGh0bWwgKz0gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpOyBmb250LXdlaWdodDogNDAwOyBmb250LXNpemU6IDAuNzhyZW07XCI+XHUyMDE0IHNraXBwZWQ6ICR7ZXNjYXBlSHRtbChzdmMucmVhc29uKX08L3NwYW4+YDtcbiAgICAgIGh0bWwgKz0gYDwvZGl2PmA7XG5cbiAgICAgIGlmICghc3ZjLnNraXApIHtcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+SW1hZ2U6IDxjb2RlPiR7ZXNjYXBlSHRtbChzdmMuaW1hZ2UpfTwvY29kZT48L2Rpdj5gO1xuICAgICAgICBpZiAoc3ZjLnBvcnRzPy5sZW5ndGgpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Qb3J0czogJHtzdmMucG9ydHMubWFwKHAgPT4gYCR7cC5ob3N0fToke3AuY29udGFpbmVyfWApLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy52b2x1bWVzPy5sZW5ndGgpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Wb2x1bWVzOiAke3N2Yy52b2x1bWVzLmxlbmd0aH08L2Rpdj5gO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50IHx8IHt9KS5sZW5ndGgpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5FbnYgdmFyczogJHtPYmplY3Qua2V5cyhzdmMuZW52aXJvbm1lbnQpLmxlbmd0aH08L2Rpdj5gO1xuICAgICAgICBpZiAoc3ZjLmVudkZpbGVXYXJuaW5nKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdTI2QTAgJHtlc2NhcGVIdG1sKHN2Yy5lbnZGaWxlV2FybmluZyl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5yZXNvdXJjZXM/LmNwdXMgfHwgc3ZjLnJlc291cmNlcz8ubWVtb3J5KSB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgICAgICBpZiAoc3ZjLnJlc291cmNlcy5jcHVzKSBwYXJ0cy5wdXNoKGBDUFU6ICR7c3ZjLnJlc291cmNlcy5jcHVzfWApO1xuICAgICAgICAgIGlmIChzdmMucmVzb3VyY2VzLm1lbW9yeSkgcGFydHMucHVzaChgTWVtOiAke3N2Yy5yZXNvdXJjZXMubWVtb3J5fU1CYCk7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxpbWl0czogJHtwYXJ0cy5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxuXG4gIC8vIEJhY2sgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWJhY2stYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2hvd1N0ZXAoJ3Bhc3RlJykpO1xuXG4gIC8vIERlcGxveVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1kZXBsb3ktYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcGFyc2VkRGF0YSkgcmV0dXJuO1xuXG4gICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZGVwbG95LWJ0bicpO1xuICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZXBsb3lpbmcuLi4nO1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgc2hvd1N0ZXAoJ3Byb2dyZXNzJyk7XG5cbiAgICBjb25zdCBwcm9ncmVzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcHJvZ3Jlc3MtY29udGVudCcpO1xuICAgIHByb2dyZXNzRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gRGVwbG95aW5nIHNlcnZpY2VzLi4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb3N0SlNPTignL2FwaS92MS9hcHBzL2RlcGxveS1jb21wb3NlJywge1xuICAgICAgICBzZXJ2aWNlczogcGFyc2VkRGF0YS5zZXJ2aWNlcyxcbiAgICAgICAgbmV0d29ya3M6IHBhcnNlZERhdGEubmV0d29ya3MsXG4gICAgICAgIHN0YWNrTmFtZTogcGFyc2VkRGF0YS5zdGFja05hbWVcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgaHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5TdGFjayBcIiR7ZXNjYXBlSHRtbChyZXN1bHQuc3RhY2tOYW1lKX1cIiBcdTIwMTQgRGVwbG95bWVudCBDb21wbGV0ZTwvZGl2PmA7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzUwcHg7XCI+JztcblxuICAgICAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGljb24gPSByLnN0YXR1cyA9PT0gJ2RlcGxveWVkJyB8fCByLnN0YXR1cyA9PT0gJ2NyZWF0ZWQnID8gJ1x1MjcwNScgOiByLnN0YXR1cyA9PT0gJ2V4aXN0cycgPyAnXHUyNkExJyA6IHIuc3RhdHVzID09PSAnc2tpcHBlZCcgPyAnXHUyM0VEJyA6ICdcdTI3NEMnO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogOHB4IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBmb250LXNpemU6IDAuODVyZW07XCI+YDtcbiAgICAgICAgaHRtbCArPSBgJHtpY29ufSA8c3Ryb25nPiR7ZXNjYXBlSHRtbChyLm5hbWUpfTwvc3Ryb25nPiAoJHtyLnR5cGV9KSBcdTIwMTQgJHtlc2NhcGVIdG1sKHIuc3RhdHVzKX1gO1xuICAgICAgICBpZiAoci5lcnJvcikgaHRtbCArPSBgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JHtlc2NhcGVIdG1sKHIuZXJyb3IpfTwvc3Bhbj5gO1xuICAgICAgICBpZiAoci5zdWJkb21haW4pIGh0bWwgKz0gYCBcdTIxOTIgPGNvZGU+JHtlc2NhcGVIdG1sKHIuc3ViZG9tYWluKX08L2NvZGU+YDtcbiAgICAgICAgaWYgKHIucmVhc29uKSBodG1sICs9IGAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPigke2VzY2FwZUh0bWwoci5yZWFzb24pfSk8L3NwYW4+YDtcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+PGJ1dHRvbiBpZD1cImNvbXBvc2UtZG9uZS1idG5cIj5Eb25lPC9idXR0b24+PC9kaXY+JztcblxuICAgICAgcHJvZ3Jlc3NFbC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZG9uZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIG1vZGFsPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmxvYWRTZXJ2aWNlcyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LmxvYWRTZXJ2aWNlcygpLnRoZW4oKCkgPT4geyBpZiAodHlwZW9mIHdpbmRvdy5idWlsZEdyaWQgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5idWlsZEdyaWQoKTsgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2hvd05vdGlmaWNhdGlvbihgU3RhY2sgXCIke3Jlc3VsdC5zdGFja05hbWV9XCIgZGVwbG95ZWRgLCAnc3VjY2VzcycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByb2dyZXNzRWwuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGVwbG95bWVudCBmYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7XCI+PGJ1dHRvbiBpZD1cImNvbXBvc2UtcmV0cnktYnRuXCI+QmFjazwvYnV0dG9uPjwvZGl2PmA7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1yZXRyeS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzaG93U3RlcCgncGFzdGUnKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZXBsb3kgQWxsJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBDT05UQUlORVIgRVhFQyAvIFNIRUxMIChXZWJTb2NrZXQgKyB4dGVybS5qcykgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnZXhlYy1tb2RhbCcsIGA8ZGl2IGlkPVwiZXhlYy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzAwcHg7IG1heC13aWR0aDogOTAwcHg7IHBhZGRpbmctYm90dG9tOiAwO1wiPlxuICAgICAgPGgzIGlkPVwiZXhlYy10aXRsZVwiPlRlcm1pbmFsPC9oMz5cbiAgICAgIDxkaXYgaWQ9XCJleGVjLXRlcm1pbmFsXCIgc3R5bGU9XCJoZWlnaHQ6IDQyMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IG92ZXJmbG93OiBoaWRkZW47IGJhY2tncm91bmQ6ICMxZTFlMWU7XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZy1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJleGVjLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLW1vZGFsJyk7XG4gIGNvbnN0IHRlcm1FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLXRlcm1pbmFsJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtY2xvc2UnKTtcblxuICBsZXQgdGVybSA9IG51bGw7XG4gIGxldCB3cyA9IG51bGw7XG4gIGxldCBmaXRBZGRvbiA9IG51bGw7XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBpZiAod3MpIHsgdHJ5IHsgd3MuY2xvc2UoKTsgfSBjYXRjaCAoXykge30gd3MgPSBudWxsOyB9XG4gICAgaWYgKHRlcm0pIHsgdHJ5IHsgdGVybS5kaXNwb3NlKCk7IH0gY2F0Y2ggKF8pIHt9IHRlcm0gPSBudWxsOyB9XG4gICAgZml0QWRkb24gPSBudWxsO1xuICAgIHRlcm1FbC5pbm5lckhUTUwgPSAnJztcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5FeGVjKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgY2xlYW51cCgpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtdGl0bGUnKS50ZXh0Q29udGVudCA9IGBUZXJtaW5hbCBcdTIwMTQgJHtjb250YWluZXJOYW1lIHx8IGNvbnRhaW5lcklkfWA7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIEVuc3VyZSB4dGVybSBpcyBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIFRlcm1pbmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGVybUVsLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwiY29sb3I6ICNmNDQ7IHBhZGRpbmc6IDIwcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+eHRlcm0uanMgbm90IGxvYWRlZDwvZGl2Pic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGVybSA9IG5ldyBUZXJtaW5hbCh7XG4gICAgICBjdXJzb3JCbGluazogdHJ1ZSxcbiAgICAgIGZvbnRTaXplOiAxNCxcbiAgICAgIGZvbnRGYW1pbHk6IFwiJ0Nhc2NhZGlhIENvZGUnLCAnRmlyYSBDb2RlJywgJ0NvbnNvbGFzJywgbW9ub3NwYWNlXCIsXG4gICAgICB0aGVtZToge1xuICAgICAgICBiYWNrZ3JvdW5kOiAnIzFlMWUxZScsXG4gICAgICAgIGZvcmVncm91bmQ6ICcjZDRkNGQ0JyxcbiAgICAgICAgY3Vyc29yOiAnI2FlYWZhZCcsXG4gICAgICAgIHNlbGVjdGlvbkJhY2tncm91bmQ6ICcjMjY0Zjc4JyxcbiAgICAgIH0sXG4gICAgICBzY3JvbGxiYWNrOiA1MDAwLFxuICAgIH0pO1xuXG4gICAgLy8gRml0IGFkZG9uXG4gICAgaWYgKHR5cGVvZiBGaXRBZGRvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZpdEFkZG9uID0gbmV3IEZpdEFkZG9uLkZpdEFkZG9uKCk7XG4gICAgICB0ZXJtLmxvYWRBZGRvbihmaXRBZGRvbik7XG4gICAgfVxuXG4gICAgdGVybS5vcGVuKHRlcm1FbCk7XG4gICAgaWYgKGZpdEFkZG9uKSB7XG4gICAgICAvLyBTbWFsbCBkZWxheSBmb3IgRE9NIHRvIHNldHRsZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBmaXRBZGRvbi5maXQoKSwgNTApO1xuICAgIH1cblxuICAgIC8vIENvbm5lY3QgV2ViU29ja2V0XG4gICAgY29uc3QgcHJvdG9jb2wgPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOicgOiAnd3M6JztcbiAgICB3cyA9IG5ldyBXZWJTb2NrZXQoYCR7cHJvdG9jb2x9Ly8ke2xvY2F0aW9uLmhvc3R9L3dzL2V4ZWMvJHtlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVySWQpfWApO1xuICAgIHdzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuXG4gICAgd3Mub25vcGVuID0gKCkgPT4ge1xuICAgICAgdGVybS53cml0ZWxuKCdcXHgxYlszMm1Db25uZWN0aW5nLi4uXFx4MWJbMG0nKTtcbiAgICAgIC8vIFNlbmQgaW5pdGlhbCByZXNpemVcbiAgICAgIGlmIChmaXRBZGRvbikge1xuICAgICAgICBjb25zdCBkaW1zID0gZml0QWRkb24ucHJvcG9zZURpbWVuc2lvbnMoKTtcbiAgICAgICAgaWYgKGRpbXMpIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3Jlc2l6ZScsIGNvbHM6IGRpbXMuY29scywgcm93czogZGltcy5yb3dzIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB3cy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBlLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgIHRlcm0ud3JpdGVsbihgXFx4MWJbMzJtQ29ubmVjdGVkICgke21zZy5zaGVsbH0pXFx4MWJbMG1cXHJcXG5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1zZy50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICB0ZXJtLndyaXRlbG4oYFxceDFiWzMxbUVycm9yOiAke21zZy5tZXNzYWdlfVxceDFiWzBtYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2V4aXQnKSB7XG4gICAgICAgICAgICB0ZXJtLndyaXRlbG4oJ1xcclxcblxceDFiWzMzbVNlc3Npb24gZW5kZWQuXFx4MWJbMG0nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIC8vIFBsYWluIHRleHRcbiAgICAgICAgdGVybS53cml0ZShlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQmluYXJ5IGRhdGFcbiAgICAgICAgdGVybS53cml0ZShuZXcgVWludDhBcnJheShlLmRhdGEpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd3Mub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIGlmICh0ZXJtKSB0ZXJtLndyaXRlbG4oJ1xcclxcblxceDFiWzMzbURpc2Nvbm5lY3RlZC5cXHgxYlswbScpO1xuICAgIH07XG5cbiAgICB3cy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgaWYgKHRlcm0pIHRlcm0ud3JpdGVsbignXFxyXFxuXFx4MWJbMzFtQ29ubmVjdGlvbiBlcnJvci5cXHgxYlswbScpO1xuICAgIH07XG5cbiAgICAvLyBUZXJtaW5hbCBpbnB1dCBcdTIxOTIgV2ViU29ja2V0XG4gICAgdGVybS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgIGlmICh3cyAmJiB3cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICB3cy5zZW5kKGRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIHJlc2l6ZVxuICAgIHRlcm0ub25SZXNpemUoKHsgY29scywgcm93cyB9KSA9PiB7XG4gICAgICBpZiAod3MgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdyZXNpemUnLCBjb2xzLCByb3dzIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFJlLWZpdCBvbiB3aW5kb3cgcmVzaXplXG4gICAgY29uc3QgcmVzaXplSGFuZGxlciA9ICgpID0+IHsgaWYgKGZpdEFkZG9uKSBmaXRBZGRvbi5maXQoKTsgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgcmVzaXplSGFuZGxlcik7XG5cbiAgICAvLyBTdG9yZSBoYW5kbGVyIGZvciBjbGVhbnVwXG4gICAgbW9kYWwuX3Jlc2l6ZUhhbmRsZXIgPSByZXNpemVIYW5kbGVyO1xuICB9XG5cbiAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAobW9kYWwuX3Jlc2l6ZUhhbmRsZXIpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtb2RhbC5fcmVzaXplSGFuZGxlcik7XG4gICAgfVxuICAgIG1vZGFsPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIC8vIEFsc28gY2xvc2Ugb24gYmFja2Ryb3AgY2xpY2tcbiAgbW9kYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgICBpZiAobW9kYWwuX3Jlc2l6ZUhhbmRsZXIpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG1vZGFsLl9yZXNpemVIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIG1vZGFsPy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBFeHBvcnRcbiAgd2luZG93Lm9wZW5FeGVjTW9kYWwgPSBvcGVuRXhlYztcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IEFVRElUIExPRyBWSUVXRVIgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnYXVkaXQtbW9kYWwnLCBgPGRpdiBpZD1cImF1ZGl0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA4NTBweDsgbWF4LXdpZHRoOiAxMDUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0RDIEF1ZGl0IExvZzwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFRyYWNrIGFsbCBhY3Rpb25zIHBlcmZvcm1lZCB0aHJvdWdoIHRoZSBBUEkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5GaWx0ZXI6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImF1ZGl0LWZpbHRlclwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBBY3Rpb25zPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNlcnZpY2VcIj5TZXJ2aWNlczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjb250YWluZXJcIj5Db250YWluZXJzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5XCI+Q2FkZHk8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZG5zXCI+RE5TPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJhY2t1cFwiPkJhY2t1cHM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY29uZmlnXCI+Q29uZmlnPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImF1dGhcIj5BdXRoPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtcmVmcmVzaC1idG5cIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1jbGVhci1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdUQ4M0RcdURERDFcdUZFMEYgQ2xlYXIgTG9nPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImF1ZGl0LWxvZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGF1ZGl0IGxvZy4uLjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1sb2FkLW1vcmVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDZweCAxNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5Mb2FkIE1vcmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1ZGl0LWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1sb2ctYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1jYW5jZWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1yZWZyZXNoLWJ0bicpO1xuICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1jbGVhci1idG4nKTtcbiAgY29uc3QgZmlsdGVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWZpbHRlcicpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9nLWNvbnRhaW5lcicpO1xuICBjb25zdCBsb2FkTW9yZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1sb2FkLW1vcmUnKTtcbiAgbGV0IGN1cnJlbnRPZmZzZXQgPSAwO1xuICBjb25zdCBQQUdFX1NJWkUgPSA1MDtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQXVkaXQoYXBwZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGN1cnJlbnRPZmZzZXQgPSAwO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJTZWxlY3QudmFsdWU7XG4gICAgICBsZXQgdXJsID0gYC9hcGkvdjEvYXVkaXQtbG9ncz9saW1pdD0ke1BBR0VfU0laRX0mb2Zmc2V0PSR7Y3VycmVudE9mZnNldH1gO1xuICAgICAgaWYgKGZpbHRlcikgdXJsICs9IGAmYWN0aW9uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbHRlcil9YDtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5lbnRyaWVzID8gZGF0YS5lbnRyaWVzIDogW107XG5cbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiAhYXBwZW5kKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0RDPC9zcGFuPk5vIGF1ZGl0IGxvZyBlbnRyaWVzIHlldC4gQWN0aW9ucyB3aWxsIGJlIGxvZ2dlZCBhdXRvbWF0aWNhbGx5LjwvZGl2Pic7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPklQPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+QWN0aW9uPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+UmVzb3VyY2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5SZXN1bHQ8L3RoPjwvdHI+JztcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3Qgb2sgPSBlLm91dGNvbWUgPT09ICdzdWNjZXNzJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImF1ZGl0LXJvd1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWVBZ28oZS50aW1lc3RhbXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07XCI+JHtlc2NhcGVIdG1sKGUuaXAgfHwgJy0nKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwoZS5hY3Rpb24gfHwgJy0nKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2VzY2FwZUh0bWwoZS5yZXNvdXJjZSB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6ICR7b2sgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1iYWQtZmcpJ307XCI+JHtvayA/ICdcdTI3MTMnIDogJ1x1MjcxNyd9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAoZS5kZXRhaWxzICYmIE9iamVjdC5rZXlzKGUuZGV0YWlscykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImF1ZGl0LWRldGFpbFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48dGQgY29sc3Bhbj1cIjVcIiBzdHlsZT1cInBhZGRpbmc6IDZweCA2cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjxwcmUgc3R5bGU9XCJtYXJnaW46IDA7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj4ke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoZS5kZXRhaWxzLCBudWxsLCAyKSl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFwcGVuZCByb3dzIHRvIGV4aXN0aW5nIHRhYmxlXG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSBlbnRyaWVzLmxlbmd0aCA+PSBQQUdFX1NJWkUgPyAnJyA6ICdub25lJztcblxuICAgICAgLy8gVG9nZ2xlIGRldGFpbCByb3dzIG9uIGNsaWNrXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmF1ZGl0LXJvdycpLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhc2V0LndpcmVkKSByZXR1cm47XG4gICAgICAgIHJvdy5kYXRhc2V0LndpcmVkID0gJ3RydWUnO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlsID0gcm93Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICBpZiAoZGV0YWlsICYmIGRldGFpbC5jbGFzc0xpc3QuY29udGFpbnMoJ2F1ZGl0LWRldGFpbCcpKSB7XG4gICAgICAgICAgICBkZXRhaWwuc3R5bGUuZGlzcGxheSA9IGRldGFpbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6ICdub25lJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdWRpdChmYWxzZSk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIGZpbHRlclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIGxvYWRNb3JlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGxvYWRBdWRpdCh0cnVlKSk7XG5cbiAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBhdWRpdCBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hdWRpdC1sb2dzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSBsb2FkQXVkaXQoZmFsc2UpO1xuICAgICAgZWxzZSBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIChkYXRhLmVycm9yIHx8ICdDbGVhciBmYWlsZWQnKSwgJ2Vycm9yJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTRUNVUklUWSBDRU5URVIgPT09PT09PT09PVxuLy8gTXVsdGktc291cmNlIHNlY3VyaXR5IGV2ZW50IHZpZXdlciArIGhvc3QgcmVnaXN0cnkgVUkuXG4vL1xuLy8gU2hvd3MgbGl2ZSBldmVudHMgZnJvbSBhbnkgc291cmNlIChBUEkgYXVkaXQsIENhZGR5IGFjY2VzcyBsb2csIGZhaWwyYmFuLFxuLy8gc2hhcmVkX2JhbnMpIG9uIGFueSByZWdpc3RlcmVkIGhvc3QgKHRoaXMgRGFzaENhZGR5LCBmdXR1cmUgcmVtb3RlIGFnZW50cykuXG4vL1xuLy8gTGl2ZS10YWlsIHVzZXMgU1NFICgvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdHJlYW0pLlxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnc2VjdXJpdHktbW9kYWwnLCBgPGRpdiBpZD1cInNlY3VyaXR5LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5ODBweDsgbWF4LXdpZHRoOiAxMjgwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVERUUxXHVGRTBGIFNlY3VyaXR5IENlbnRlcjwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIExpdmUgZXZlbnRzIGZyb20gQVBJLCBDYWRkeSwgZmFpbDJiYW4gJiBzaGFyZWRfYmFucy4gTGl2ZS10YWlsIHZpYSBTU0UuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWMtdGFic1wiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxNHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiIGFjdGl2ZVwiIGRhdGEtdGFiPVwib3ZlcnZpZXdcIj5PdmVydmlldzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VjLXRhYlwiIGRhdGEtdGFiPVwiZXZlbnRzXCI+RXZlbnRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiXCIgZGF0YS10YWI9XCJob3N0c1wiPkhvc3RzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBPVkVSVklFVyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cIm92ZXJ2aWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdHNcIiBpZD1cInNlYy1zdGF0c1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE4MHB4LDFmcikpO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MThweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cInRvdGFsXCI+XHUyMDE0IGV2ZW50czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwid2FyblwiPlx1MjAxNCB3YXJuaW5nczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwiZXJyb3JcIj5cdTIwMTQgZXJyb3JzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJkZW5pZWRcIj5cdTIwMTQgZGVuaWVkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJob3N0c1wiPlx1MjAxNCBob3N0czwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgQWN0b3JzICgyNGgpPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWMtdG9wLWFjdG9yc1wiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDoyNDBweDtcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgVGFyZ2V0cyAoMjRoKTwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VjLXRvcC10YXJnZXRzXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjI0MHB4O1wiPlx1MjAxNDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVWRU5UUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImV2ZW50c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zb3VyY2VcIiBjbGFzcz1cInNlYy1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgc291cmNlczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFwaVwiPkFQSTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5XCI+Q2FkZHk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsMmJhblwiPmZhaWwyYmFuPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2hhcmVkLWJhbnNcIj5zaGFyZWRfYmFuczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFnZW50XCI+QWdlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zZXZlcml0eVwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBzZXZlcml0aWVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3JpdGljYWxcIj5jcml0aWNhbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+ZXJyb3I8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuXCI+d2Fybjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vdGljZVwiPm5vdGljZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZm9cIj5pbmZvPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNlYy1maWx0ZXItaG9zdFwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxpbnB1dCBpZD1cInNlYy1maWx0ZXItYWN0b3JcIiBjbGFzcz1cInNlYy1maWx0ZXJcIiBwbGFjZWhvbGRlcj1cImFjdG9yIChJUCBvciB1c2VyKVwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2VjLWxpdmUtdGFpbFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICA8c3Bhbj5MaXZlIHRhaWw8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzZWMtZXZlbnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIT1NUUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImhvc3RzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNlYy1ob3N0LXJlZ2lzdGVyLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHUyNzk1IFJlZ2lzdGVyIEhvc3Q8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLWhvc3RzLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic2VjLWhvc3RzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICAvLyA9PT09PT09PT09PT09IFNUQVRFID09PT09PT09PT09PT1cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdXJpdHktbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN1cml0eS1jZW50ZXItYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtY2FuY2VsJyk7XG4gIGNvbnN0IHRhYnMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXRhYicpO1xuICBjb25zdCBwYW5lbHMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXBhbmVsJyk7XG5cbiAgbGV0IGFsbEV2ZW50cyA9IFtdOyAvLyBuZXdlc3QgZmlyc3RcbiAgbGV0IGFsbEhvc3RzID0gW107XG4gIGxldCBzc2VTb3VyY2UgPSBudWxsO1xuXG4gIC8vID09PT09PT09PT09PT0gVEFCIFNXSVRDSElORyA9PT09PT09PT09PT09XG4gIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRhYnMuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgdCA9PT0gdGFiKSk7XG4gICAgICBwYW5lbHMuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9IHAuZGF0YXNldC5wYW5lbCA9PT0gdGFiLmRhdGFzZXQudGFiID8gJycgOiAnbm9uZScpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ292ZXJ2aWV3JykgcmVmcmVzaE92ZXJ2aWV3KCk7XG4gICAgICBpZiAodGFiLmRhdGFzZXQudGFiID09PSAnZXZlbnRzJykgcmVmcmVzaEV2ZW50cygpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ2hvc3RzJykgcmVmcmVzaEhvc3RzKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT0gT1BFTi9DTE9TRSA9PT09PT09PT09PT09XG4gIGlmIChvcGVuQnRuKSB7XG4gICAgb3BlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgc3RhcnRMaXZlVGFpbCgpO1xuICAgIH0pO1xuICB9XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBjbG9zZU1vZGFsKCk7IH0pO1xuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT0gTElWRSBUQUlMIChTU0UpID09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gc3RhcnRMaXZlVGFpbCgpIHtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtbGl2ZS10YWlsJykuY2hlY2tlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgRXZlbnRTb3VyY2UgPT09ICd1bmRlZmluZWQnKSByZXR1cm47IC8vIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIHNzZVNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2FwaS92MS9zZWN1cml0eS9ldmVudHMvc3RyZWFtJyk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignaW5pdCcsIChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgICAgICByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VjdXJpdHknLCAoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV2ID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgIGFsbEV2ZW50cy51bnNoaWZ0KGV2KTtcbiAgICAgICAgICBpZiAoYWxsRXZlbnRzLmxlbmd0aCA+IDUwMCkgYWxsRXZlbnRzLmxlbmd0aCA9IDUwMDtcbiAgICAgICAgICAvLyBBdXRvLXJlZnJlc2ggd2hpY2hldmVyIHBhbmVsIGlzIHNob3dpbmdcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2VjLXRhYi5hY3RpdmUnKT8uZGF0YXNldD8udGFiO1xuICAgICAgICAgIGlmIChhY3RpdmUgPT09ICdldmVudHMnKSByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgICBlbHNlIGlmIChhY3RpdmUgPT09ICdvdmVydmlldycpIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9KTtcbiAgICAgIHNzZVNvdXJjZS5vbmVycm9yID0gKCkgPT4geyAvKiBicm93c2VyIGF1dG8tcmVjb25uZWN0cyAqLyB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSBTU0UgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHN0b3BMaXZlVGFpbCgpIHtcbiAgICBpZiAoc3NlU291cmNlKSB7IHRyeSB7IHNzZVNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIHt9IHNzZVNvdXJjZSA9IG51bGw7IH1cbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWxpdmUtdGFpbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAobW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHN0YXJ0TGl2ZVRhaWwoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PSBPVkVSVklFVyA9PT09PT09PT09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hPdmVydmlldygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjQqNjAqNjAqMTAwMCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IFtzdGF0c1JlcywgaG9zdHNSZXMsIGV2ZW50c1Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdGF0cz9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudChzaW5jZSl9YCksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyksXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cz9saW1pdD0xJnNpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNpbmNlKX1gKSxcbiAgICAgIF0pO1xuICAgICAgY29uc3Qgc3RhdHMgPSAoYXdhaXQgc3RhdHNSZXMuanNvbigpKS5kYXRhIHx8IHt9O1xuICAgICAgY29uc3QgaG9zdHMgPSAoYXdhaXQgaG9zdHNSZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGV2ZW50c0NvdW50ID0gKGF3YWl0IGV2ZW50c1Jlcy5qc29uKCkpLmRhdGE/LnRvdGFsIHx8IDA7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwidG90YWxcIl0nKS50ZXh0Q29udGVudCA9IGAke2V2ZW50c0NvdW50fSBldmVudHMgKDI0aClgO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJ3YXJuXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8ud2FybiB8fCAwfSB3YXJuaW5nc2A7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cImVycm9yXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8uZXJyb3IgfHwgMH0gZXJyb3JzYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiZGVuaWVkXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9vdXRjb21lPy5kZW5pZWQgfHwgMH0gZGVuaWVkYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiaG9zdHNcIl0nKS50ZXh0Q29udGVudCA9IGAke2hvc3RzLmxlbmd0aH0gaG9zdHNgO1xuXG4gICAgICByZW5kZXJUb3BMaXN0KCdzZWMtdG9wLWFjdG9ycycsIHN0YXRzLnRvcF9hY3RvcnMgfHwgW10pO1xuICAgICAgcmVuZGVyVG9wTGlzdCgnc2VjLXRvcC10YXJnZXRzJywgc3RhdHMudG9wX3RhcmdldHMgfHwgW10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSByZWZyZXNoT3ZlcnZpZXcgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbmRlclRvcExpc3QoaWQsIGl0ZW1zKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGRhdGE8L2Rpdj4nOyByZXR1cm47IH1cbiAgICBlbC5pbm5lckhUTUwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44NXJlbTtcIj4nICtcbiAgICAgIGl0ZW1zLm1hcChpdCA9PiBgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6M3B4IDA7d29yZC1icmVhazpicmVhay1hbGw7XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhpdC5rZXkpKX08L3RkPjx0ZCBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPiR7aXQuY291bnR9PC90ZD48L3RyPmApLmpvaW4oJycpICtcbiAgICAgICc8L3RhYmxlPic7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEVWRU5UUyA9PT09PT09PT09PT09XG4gIGNvbnN0IGZpbHRlclNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNvdXJjZScpO1xuICBjb25zdCBmaWx0ZXJTZXZlcml0eSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNldmVyaXR5Jyk7XG4gIGNvbnN0IGZpbHRlckhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWZpbHRlci1ob3N0Jyk7XG4gIGNvbnN0IGZpbHRlckFjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1maWx0ZXItYWN0b3InKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtcmVmcmVzaC1idG4nKTtcblxuICBbZmlsdGVyU291cmNlLCBmaWx0ZXJTZXZlcml0eSwgZmlsdGVySG9zdF0uZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZWZyZXNoRXZlbnRzKSk7XG4gIGZpbHRlckFjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2UocmVmcmVzaEV2ZW50cywgMjUwKSk7XG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoRXZlbnRzKTtcblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoRXZlbnRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBwYXJhbXMuc2V0KCdsaW1pdCcsICcyMDAnKTtcbiAgICAgIGlmIChmaWx0ZXJTb3VyY2UudmFsdWUpICBwYXJhbXMuc2V0KCdzb3VyY2VfdHlwZScsIGZpbHRlclNvdXJjZS52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyU2V2ZXJpdHkudmFsdWUpIHBhcmFtcy5zZXQoJ3NldmVyaXR5JywgZmlsdGVyU2V2ZXJpdHkudmFsdWUpO1xuICAgICAgaWYgKGZpbHRlckhvc3QudmFsdWUpICAgIHBhcmFtcy5zZXQoJ3NvdXJjZV9ob3N0JywgZmlsdGVySG9zdC52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyQWN0b3IudmFsdWUpICAgcGFyYW1zLnNldCgnYWN0b3JfcHJlZml4JywgZmlsdGVyQWN0b3IudmFsdWUpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWN1cml0eS9ldmVudHM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE7XG4gICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgIHJlbmRlckV2ZW50cygpO1xuXG4gICAgICAvLyBSZWZyZXNoIGhvc3QgZHJvcGRvd24gaWYgd2UgZG9uJ3QgaGF2ZSBpdCB5ZXRcbiAgICAgIGlmICghZmlsdGVySG9zdC5vcHRpb25zLmxlbmd0aCB8fCBmaWx0ZXJIb3N0Lm9wdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGF3YWl0IHJlZnJlc2hIb3N0RmlsdGVyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ldmVudHMtY29udGFpbmVyJykuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPkxvYWQgZmFpbGVkOiAnK2VzY2FwZUh0bWwoZS5tZXNzYWdlKSsnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudHMoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWV2ZW50cy1jb250YWluZXInKTtcbiAgICBpZiAoIWFsbEV2ZW50cy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGV2ZW50czwvZGl2Pic7IHJldHVybjsgfVxuICAgIGVsLmlubmVySFRNTCA9IGFsbEV2ZW50cy5zbGljZSgwLCAyMDApLm1hcChyZW5kZXJFdmVudFJvdykuam9pbignJyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudFJvdyhldikge1xuICAgIGNvbnN0IHNldiA9IGV2LnNldmVyaXR5IHx8ICdpbmZvJztcbiAgICBjb25zdCBzZXZDb2xvciA9IHtcbiAgICAgIGNyaXRpY2FsOiAnI2MwMzkyYicsIGVycm9yOiAnI2U3NGMzYycsIHdhcm46ICcjZjM5YzEyJyxcbiAgICAgIG5vdGljZTogJyMzNDk4ZGInLCBpbmZvOiAnIzdmOGM4ZCcsXG4gICAgfVtzZXZdIHx8ICcjN2Y4YzhkJztcbiAgICBjb25zdCB0aW1lID0gZXYudHMgPyBuZXcgRGF0ZShldi50cykudG9Mb2NhbGVUaW1lU3RyaW5nKCkgOiAnJztcbiAgICBjb25zdCBzb3VyY2UgPSBldi5zb3VyY2VfdHlwZSB8fCAnJztcbiAgICBjb25zdCBhY3RvciA9IGV2LmFjdG9yIHx8ICdcdTIwMTQnO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2LnRhcmdldCB8fCAnJztcbiAgICBjb25zdCBhY3Rpb24gPSBldi5hY3Rpb24gfHwgJyc7XG4gICAgY29uc3Qgb3V0Y29tZSA9IGV2Lm91dGNvbWUgfHwgJyc7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2VjLWV2ZW50LXJvd1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczo4NHB4IDgwcHggMWZyIDFmciAxMDBweCA5MHB4O2dhcDo4cHg7cGFkZGluZzo1cHggOHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Zm9udC1zaXplOjAuODJyZW07YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjoke3NldkNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKHNldil9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKHNvdXJjZSl9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwoYWN0b3IpfVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChhY3Rvcil9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwodGFyZ2V0KX1cIiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoYWN0aW9uKX0gJHtlc2NhcGVIdG1sKHRhcmdldCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKG91dGNvbWUpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjc1cmVtO3RleHQtYWxpZ246cmlnaHQ7XCI+JHtlc2NhcGVIdG1sKHRpbWUpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhvc3RGaWx0ZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyk7XG4gICAgICBjb25zdCBob3N0cyA9IChhd2FpdCByZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBmaWx0ZXJIb3N0LnZhbHVlO1xuICAgICAgZmlsdGVySG9zdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPicgK1xuICAgICAgICBob3N0cy5tYXAoaCA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChoLmlkKX1cIj4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L29wdGlvbj5gKS5qb2luKCcnKTtcbiAgICAgIGlmIChjdXJyZW50KSBmaWx0ZXJIb3N0LnZhbHVlID0gY3VycmVudDtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhPU1RTID09PT09PT09PT09PT1cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0LXJlZ2lzdGVyLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVnaXN0ZXJIb3N0UHJvbXB0KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1yZWZyZXNoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoSG9zdHMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hIb3N0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VjdXJpdHkvaG9zdHMnKTtcbiAgICAgIGNvbnN0IGhvc3RzID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE/Lmhvc3RzIHx8IFtdO1xuICAgICAgYWxsSG9zdHMgPSBob3N0cztcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKTtcbiAgICAgIGlmICghaG9zdHMubGVuZ3RoKSB7IGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBob3N0cyByZWdpc3RlcmVkLiBDbGljayBcdTI3OTUgUmVnaXN0ZXIgSG9zdCB0byBhZGQgb25lLjwvZGl2Pic7IHJldHVybjsgfVxuICAgICAgZWwuaW5uZXJIVE1MID0gaG9zdHMubWFwKGggPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSAhaC5lbmFibGVkID8gJ1x1RDgzRFx1REQzNCBkaXNhYmxlZCdcbiAgICAgICAgICAgICAgICAgICAgIDogIWgubGFzdF9zZWVuX2F0ID8gJ1x1MjZBQSByZWdpc3RlcmVkJ1xuICAgICAgICAgICAgICAgICAgICAgOiAoRGF0ZS5ub3coKSAtIERhdGUucGFyc2UoaC5sYXN0X3NlZW5fYXQpID4gMzAqNjAqMTAwMCkgPyAnXHVEODNEXHVERkUxIHN0YWxlJ1xuICAgICAgICAgICAgICAgICAgICAgOiAnXHVEODNEXHVERkUyIG9ubGluZSc7XG4gICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1sZWZ0OjhweDtmb250LXNpemU6MC44cmVtO1wiPiR7ZXNjYXBlSHRtbChoLnR5cGUpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzhyZW07bWFyZ2luLXRvcDoycHg7XCI+XG4gICAgICAgICAgICAgIGlkOiAke2VzY2FwZUh0bWwoaC5pZCl9IFx1MDBCN1xuICAgICAgICAgICAgICByZWdpc3RlcmVkICR7bmV3IERhdGUoaC5yZWdpc3RlcmVkX2F0KS50b0xvY2FsZURhdGVTdHJpbmcoKX0gXHUwMEI3XG4gICAgICAgICAgICAgIGxhc3Qgc2VlbiAke2gubGFzdF9zZWVuX2F0ID8gbmV3IERhdGUoaC5sYXN0X3NlZW5fYXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnbmV2ZXInfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVyZW07bWFyZ2luLXJpZ2h0OjEycHg7XCI+JHtzdGF0dXN9PC9zcGFuPlxuICAgICAgICAgICAgJHtoLmlkID09PSAnc2VsZicgPyAnJyA6IGA8YnV0dG9uIGNsYXNzPVwiYnRuLXNtIHNlYy1ob3N0LWRlbFwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoaC5pZCl9XCIgc3R5bGU9XCJjb2xvcjp2YXIoLS1iYWQtZmcpO1wiPlJlbW92ZTwvYnV0dG9uPmB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcblxuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnNlYy1ob3N0LWRlbCcpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybShgUmVtb3ZlIGhvc3QgJHtidG4uZGF0YXNldC5pZH0/IEV2ZW50cyBhbHJlYWR5IHJlY2VpdmVkIHdpbGwgcmVtYWluIGluIHRoZSBzdG9yZS5gKSkgcmV0dXJuO1xuICAgICAgICAgIGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2hvc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJ0bi5kYXRhc2V0LmlkKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgcmVmcmVzaEhvc3RzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+TG9hZCBmYWlsZWQ6ICcrZXNjYXBlSHRtbChlLm1lc3NhZ2UpKyc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVySG9zdFByb21wdCgpIHtcbiAgICBjb25zdCBpZCA9IHByb21wdCgnSG9zdCBpZCAobG93ZXJjYXNlLCBubyBzcGFjZXMpOicpO1xuICAgIGlmICghaWQpIHJldHVybjtcbiAgICBjb25zdCBsYWJlbCA9IHByb21wdCgnRGlzcGxheSBsYWJlbDonLCBpZCkgfHwgaWQ7XG4gICAgY29uc3QgdHlwZSAgPSBwcm9tcHQoJ1R5cGUgKFwiZGFzaGNhZGR5XCIsIFwic2VydmljZVwiLCBvciBcImFnZW50XCIpOicsICdhZ2VudCcpIHx8ICdhZ2VudCc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQsIGxhYmVsLCB0eXBlIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghcmVzLm9rKSB7IGFsZXJ0KCdGYWlsZWQ6ICcgKyAoZGF0YT8uZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzLnN0YXR1c1RleHQpKTsgcmV0dXJuOyB9XG4gICAgICAvLyBTaG93IHRoZSBhcGlfa2V5IE9OQ0UgaW4gYSBkaWFsb2dcbiAgICAgIGFsZXJ0KGBcdTI3MDUgSG9zdCByZWdpc3RlcmVkIVxcblxcbmlkOiAke2RhdGEuZGF0YS5ob3N0LmlkfVxcbmxhYmVsOiAke2RhdGEuZGF0YS5ob3N0LmxhYmVsfVxcbnR5cGU6ICR7ZGF0YS5kYXRhLmhvc3QudHlwZX1cXG5cXG5cdUQ4M0RcdUREMTEgQVBJIEtFWSAoc2F2ZSB0aGlzIE5PVyBcdTIwMTQgd29uJ3QgYmUgc2hvd24gYWdhaW4pOlxcblxcbiR7ZGF0YS5kYXRhLmFwaV9rZXl9XFxuXFxuU2VuZCB0aGlzIGtleSBhczogQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhcGlfa2V5PlxcblRvIGVuZHBvaW50OiBQT1NUIC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzL2luZ2VzdCBvciAvZXZlbnRzL2JhdGNoYCk7XG4gICAgICByZWZyZXNoSG9zdHMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhbGVydCgnRmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhFTFBFUlMgPT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHtcbiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD5cIiddL2csIGMgPT4gKHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfVtjXSkpO1xuICB9XG4gIGZ1bmN0aW9uIGRlYm91bmNlKGZuLCBtcykge1xuICAgIGxldCB0OyByZXR1cm4gZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0KTsgdCA9IHNldFRpbWVvdXQoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgbXMpOyB9O1xuICB9XG59KSgpOztcbi8vID09PT09PT09PT0gV0VBVEhFUiBXSURHRVQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCd3ZWF0aGVyLW1vZGFsJywgYDxkaXYgaWQ9XCJ3ZWF0aGVyLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+PGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiPjxoMz5XZWF0aGVyIFNldHRpbmdzPC9oMz5cbiAgICA8bGFiZWwgZm9yPVwid2VhdGhlci1sb2NhdGlvbi1pbnB1dFwiPkxvY2F0aW9uOjwvbGFiZWw+XG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ3ZWF0aGVyLWxvY2F0aW9uLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJDaXR5IG5hbWUgb3IgWklQIChlLmcuLCBIYW1idXJnLCA5MDIxMClcIiBtYXhsZW5ndGg9XCIxMDBcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+RW50ZXIgYSBjaXR5IG5hbWUsIHBvc3RhbCBjb2RlLCBvciAmbGRxdW87Q2l0eSwgQ291bnRyeSZyZHF1bzs8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTRweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWZnKTtcIj5Vbml0czwvbGFiZWw+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIndlYXRoZXItdW5pdC1vcHRpb25cIj48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIndlYXRoZXItdW5pdC1yYWRpb1wiIHZhbHVlPVwiaW1wZXJpYWxcIj48c3BhbiBjbGFzcz1cIndlYXRoZXItdW5pdC1jYXJkXCI+JmRlZztGIC8gbXBoPC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIndlYXRoZXItdW5pdC1vcHRpb25cIj48aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIndlYXRoZXItdW5pdC1yYWRpb1wiIHZhbHVlPVwibWV0cmljXCI+PHNwYW4gY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtY2FyZFwiPiZkZWc7QyAvIGttL2g8L3NwYW4+PC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIj48YnV0dG9uIGlkPVwid2VhdGhlci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj48YnV0dG9uIGlkPVwid2VhdGhlci1zYXZlXCI+U2F2ZTwvYnV0dG9uPjwvZGl2PjwvZGl2PjwvZGl2PmApO1xuXG4gIC8qIFdlYXRoZXIgV2lkZ2V0IFx1MjAxNCBwb3dlcmVkIGJ5IE9wZW4tTWV0ZW8gKGZyZWUsIG5vIEFQSSBrZXkpICovXG4gIGNvbnN0IExPQ0FUSU9OX0tFWSA9ICd3ZWF0aGVyLWxvY2F0aW9uJztcbiAgY29uc3QgTEVHQUNZX0tFWSA9ICd3ZWF0aGVyLXppcCc7XG4gIGNvbnN0IEdFT19DQUNIRV9LRVkgPSAnd2VhdGhlci1nZW8nO1xuICBjb25zdCBVTklUX0tFWSA9ICd3ZWF0aGVyLXVuaXQnO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBvbGQgWklQLW9ubHkga2V5XG4gIGlmICghc2FmZUdldChMT0NBVElPTl9LRVkpICYmIHNhZmVHZXQoTEVHQUNZX0tFWSkpIHtcbiAgICBzYWZlU2V0KExPQ0FUSU9OX0tFWSwgc2FmZUdldChMRUdBQ1lfS0VZKSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRVbml0KCkge1xuICAgIHJldHVybiBzYWZlR2V0KFVOSVRfS0VZKSB8fCAnaW1wZXJpYWwnO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0V2VhdGhlckVsZW1lbnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpY29uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1pY29uJyksXG4gICAgICB0ZW1wOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci10ZW1wJyksXG4gICAgICBjb25kaXRpb246IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLWNvbmRpdGlvbicpLFxuICAgICAgbG9jYXRpb246IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWF0aGVyLWxvY2F0aW9uJyksXG4gICAgICB3aW5kOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci13aW5kJylcbiAgICB9O1xuICB9XG5cbiAgLy8gV01PIFdlYXRoZXIgQ29kZSBtYXBwaW5nXG4gIGNvbnN0IHdtb0Rlc2NyaXB0aW9ucyA9IHtcbiAgICAwOiAnQ2xlYXIgc2t5JywgMTogJ01haW5seSBjbGVhcicsIDI6ICdQYXJ0bHkgY2xvdWR5JywgMzogJ092ZXJjYXN0JyxcbiAgICA0NTogJ0ZvZycsIDQ4OiAnUmltZSBmb2cnLFxuICAgIDUxOiAnTGlnaHQgZHJpenpsZScsIDUzOiAnRHJpenpsZScsIDU1OiAnRGVuc2UgZHJpenpsZScsXG4gICAgNTY6ICdGcmVlemluZyBkcml6emxlJywgNTc6ICdEZW5zZSBmcmVlemluZyBkcml6emxlJyxcbiAgICA2MTogJ0xpZ2h0IHJhaW4nLCA2MzogJ01vZGVyYXRlIHJhaW4nLCA2NTogJ0hlYXZ5IHJhaW4nLFxuICAgIDY2OiAnTGlnaHQgZnJlZXppbmcgcmFpbicsIDY3OiAnSGVhdnkgZnJlZXppbmcgcmFpbicsXG4gICAgNzE6ICdMaWdodCBzbm93JywgNzM6ICdNb2RlcmF0ZSBzbm93JywgNzU6ICdIZWF2eSBzbm93JywgNzc6ICdTbm93IGdyYWlucycsXG4gICAgODA6ICdMaWdodCBzaG93ZXJzJywgODE6ICdNb2RlcmF0ZSBzaG93ZXJzJywgODI6ICdWaW9sZW50IHNob3dlcnMnLFxuICAgIDg1OiAnTGlnaHQgc25vdyBzaG93ZXJzJywgODY6ICdIZWF2eSBzbm93IHNob3dlcnMnLFxuICAgIDk1OiAnVGh1bmRlcnN0b3JtJywgOTY6ICdUaHVuZGVyc3Rvcm0gd2l0aCBoYWlsJywgOTk6ICdTZXZlcmUgdGh1bmRlcnN0b3JtJ1xuICB9O1xuXG4gIGNvbnN0IHdtb0ljb25zID0ge1xuICAgIDA6ICdcdTI2MDBcdUZFMEYnLCAxOiAnXHVEODNDXHVERjI0XHVGRTBGJywgMjogJ1x1MjZDNScsIDM6ICdcdTI2MDFcdUZFMEYnLFxuICAgIDQ1OiAnXHVEODNDXHVERjJCXHVGRTBGJywgNDg6ICdcdUQ4M0NcdURGMkJcdUZFMEYnLFxuICAgIDUxOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNTM6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLCA1NTogJ1x1RDgzQ1x1REYyNlx1RkUwRicsXG4gICAgNTY6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA1NzogJ1x1RDgzQ1x1REYyOFx1RkUwRicsXG4gICAgNjE6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLCA2MzogJ1x1RDgzQ1x1REYyN1x1RkUwRicsIDY1OiAnXHVEODNDXHVERjI3XHVGRTBGJyxcbiAgICA2NjogJ1x1RDgzQ1x1REYyOFx1RkUwRicsIDY3OiAnXHVEODNDXHVERjI4XHVGRTBGJyxcbiAgICA3MTogJ1x1RDgzQ1x1REYyOFx1RkUwRicsIDczOiAnXHUyNzQ0XHVGRTBGJywgNzU6ICdcdTI3NDRcdUZFMEYnLCA3NzogJ1x1Mjc0NFx1RkUwRicsXG4gICAgODA6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLCA4MTogJ1x1RDgzQ1x1REYyN1x1RkUwRicsIDgyOiAnXHVEODNDXHVERjI3XHVGRTBGJyxcbiAgICA4NTogJ1x1RDgzQ1x1REYyOFx1RkUwRicsIDg2OiAnXHUyNzQ0XHVGRTBGJyxcbiAgICA5NTogJ1x1MjZDOFx1RkUwRicsIDk2OiAnXHUyNkM4XHVGRTBGJywgOTk6ICdcdTI2QzhcdUZFMEYnXG4gIH07XG5cbiAgLy8gV2luZCBkaXJlY3Rpb24gZnJvbSBkZWdyZWVzXG4gIGNvbnN0IHdpbmREaXJzID0gWydOJywnTk5FJywnTkUnLCdFTkUnLCdFJywnRVNFJywnU0UnLCdTU0UnLCdTJywnU1NXJywnU1cnLCdXU1cnLCdXJywnV05XJywnTlcnLCdOTlcnXTtcbiAgZnVuY3Rpb24gZGVnVG9EaXIoZGVnKSB7XG4gICAgcmV0dXJuIHdpbmREaXJzW01hdGgucm91bmQoZGVnIC8gMjIuNSkgJSAxNl07XG4gIH1cblxuICAvLyBHZW9jb2RlIGxvY2F0aW9uIHZpYSBPcGVuLU1ldGVvLCB3aXRoIGxvY2FsU3RvcmFnZSBjYWNoZVxuICBhc3luYyBmdW5jdGlvbiBnZW9jb2RlTG9jYXRpb24ocXVlcnkpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBzYWZlR2V0KEdFT19DQUNIRV9LRVkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGdlbyA9IEpTT04ucGFyc2UoY2FjaGVkKTtcbiAgICAgICAgaWYgKGdlby5xdWVyeSA9PT0gcXVlcnkpIHJldHVybiBnZW87XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9nZW9jb2RpbmctYXBpLm9wZW4tbWV0ZW8uY29tL3YxL3NlYXJjaD9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0mY291bnQ9MSZsYW5ndWFnZT1lbiZmb3JtYXQ9anNvbmApO1xuICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKCdHZW9jb2RpbmcgZmFpbGVkJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgIGlmICghZGF0YS5yZXN1bHRzIHx8ICFkYXRhLnJlc3VsdHMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0xvY2F0aW9uIG5vdCBmb3VuZCcpO1xuICAgIGNvbnN0IHIgPSBkYXRhLnJlc3VsdHNbMF07XG4gICAgY29uc3QgZ2VvID0ge1xuICAgICAgcXVlcnksXG4gICAgICBsYXQ6IHIubGF0aXR1ZGUsXG4gICAgICBsb246IHIubG9uZ2l0dWRlLFxuICAgICAgY2l0eTogci5uYW1lLFxuICAgICAgc3RhdGU6IHIuYWRtaW4xIHx8ICcnLFxuICAgICAgY291bnRyeTogci5jb3VudHJ5IHx8ICcnLFxuICAgICAgY291bnRyeUNvZGU6IHIuY291bnRyeV9jb2RlIHx8ICcnXG4gICAgfTtcbiAgICBzYWZlU2V0KEdFT19DQUNIRV9LRVksIEpTT04uc3RyaW5naWZ5KGdlbykpO1xuICAgIHJldHVybiBnZW87XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtYXRMb2NhdGlvbihnZW8pIHtcbiAgICAvLyBGb3IgVVMgbG9jYXRpb25zIHNob3cgXCJDaXR5LCBTdGF0ZVwiLCBmb3Igb3RoZXJzIHNob3cgXCJDaXR5LCBDb3VudHJ5XCJcbiAgICBpZiAoZ2VvLmNvdW50cnlDb2RlID09PSAnVVMnICYmIGdlby5zdGF0ZSkge1xuICAgICAgcmV0dXJuIGAke2dlby5jaXR5fSwgJHtnZW8uc3RhdGV9YDtcbiAgICB9XG4gICAgaWYgKGdlby5jb3VudHJ5KSB7XG4gICAgICByZXR1cm4gYCR7Z2VvLmNpdHl9LCAke2dlby5jb3VudHJ5fWA7XG4gICAgfVxuICAgIHJldHVybiBnZW8uY2l0eTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoV2VhdGhlcihsb2NhdGlvbikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBnZW8gPSBhd2FpdCBnZW9jb2RlTG9jYXRpb24obG9jYXRpb24pO1xuICAgICAgY29uc3QgdW5pdCA9IGdldFVuaXQoKTtcbiAgICAgIGNvbnN0IHRlbXBVbml0ID0gdW5pdCA9PT0gJ21ldHJpYycgPyAnY2Vsc2l1cycgOiAnZmFocmVuaGVpdCc7XG4gICAgICBjb25zdCB3aW5kVW5pdCA9IHVuaXQgPT09ICdtZXRyaWMnID8gJ2ttaCcgOiAnbXBoJztcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5vcGVuLW1ldGVvLmNvbS92MS9mb3JlY2FzdD9sYXRpdHVkZT0ke2dlby5sYXR9JmxvbmdpdHVkZT0ke2dlby5sb259JmN1cnJlbnQ9dGVtcGVyYXR1cmVfMm0sd2VhdGhlcl9jb2RlLHdpbmRfc3BlZWRfMTBtLHdpbmRfZGlyZWN0aW9uXzEwbSZ0ZW1wZXJhdHVyZV91bml0PSR7dGVtcFVuaXR9JndpbmRfc3BlZWRfdW5pdD0ke3dpbmRVbml0fWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKCdXZWF0aGVyIGZldGNoIGZhaWxlZCcpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgY29uc3QgYyA9IGRhdGEuY3VycmVudDtcbiAgICAgIGNvbnN0IGNvZGUgPSBjLndlYXRoZXJfY29kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlbXA6IE1hdGgucm91bmQoYy50ZW1wZXJhdHVyZV8ybSksXG4gICAgICAgIGNvbmRpdGlvbjogd21vRGVzY3JpcHRpb25zW2NvZGVdIHx8ICdVbmtub3duJyxcbiAgICAgICAgaWNvbjogd21vSWNvbnNbY29kZV0gfHwgJ1x1RDgzQ1x1REYyNFx1RkUwRicsXG4gICAgICAgIGxvY2F0aW9uU3RyOiBmb3JtYXRMb2NhdGlvbihnZW8pLFxuICAgICAgICB3aW5kU3BlZWQ6IE1hdGgucm91bmQoYy53aW5kX3NwZWVkXzEwbSksXG4gICAgICAgIHdpbmREaXI6IGRlZ1RvRGlyKGMud2luZF9kaXJlY3Rpb25fMTBtKSxcbiAgICAgICAgdW5pdFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdXZWF0aGVyIGZldGNoIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVXZWF0aGVyKCkge1xuICAgIGNvbnN0IHdlYXRoZXJXaWRnZXQgPSBnZXRXZWF0aGVyRWxlbWVudHMoKTtcbiAgICBpZiAoIXdlYXRoZXJXaWRnZXQuaWNvbiB8fCAhd2VhdGhlcldpZGdldC50ZW1wIHx8ICF3ZWF0aGVyV2lkZ2V0LmNvbmRpdGlvbiB8fCAhd2VhdGhlcldpZGdldC5sb2NhdGlvbiB8fCAhd2VhdGhlcldpZGdldC53aW5kKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1dlYXRoZXIgd2lkZ2V0IGVsZW1lbnRzIG5vdCBmb3VuZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2F0aW9uID0gc2FmZUdldChMT0NBVElPTl9LRVkpO1xuICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSAnU2V0IExvY2F0aW9uJztcbiAgICAgIHdlYXRoZXJXaWRnZXQudGVtcC50ZXh0Q29udGVudCA9ICctLVxcdTAwQjAnO1xuICAgICAgd2VhdGhlcldpZGdldC5jb25kaXRpb24udGV4dENvbnRlbnQgPSAnQ2xpY2sgXFx1MjY5OVxcdUZFMEYgdG8gY29uZmlndXJlJztcbiAgICAgIHdlYXRoZXJXaWRnZXQud2luZC50ZXh0Q29udGVudCA9ICctLSc7XG4gICAgICB3ZWF0aGVyV2lkZ2V0Lmljb24uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwid2VhdGhlci1lbW9qaVwiPlxcdUQ4M0NcXHVERjI0XFx1RkUwRjwvc3Bhbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWF0aGVyID0gYXdhaXQgZmV0Y2hXZWF0aGVyKGxvY2F0aW9uKTtcbiAgICAgIGlmICh3ZWF0aGVyKSB7XG4gICAgICAgIGNvbnN0IHRlbXBTdWZmaXggPSB3ZWF0aGVyLnVuaXQgPT09ICdtZXRyaWMnID8gJ1xcdTAwQjBDJyA6ICdcXHUwMEIwRic7XG4gICAgICAgIGNvbnN0IHdpbmRMYWJlbCA9IHdlYXRoZXIudW5pdCA9PT0gJ21ldHJpYycgPyAna20vaCcgOiAnbXBoJztcbiAgICAgICAgd2VhdGhlcldpZGdldC5sb2NhdGlvbi50ZXh0Q29udGVudCA9IHdlYXRoZXIubG9jYXRpb25TdHI7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQudGVtcC50ZXh0Q29udGVudCA9IGAke3dlYXRoZXIudGVtcH0ke3RlbXBTdWZmaXh9YDtcbiAgICAgICAgd2VhdGhlcldpZGdldC5jb25kaXRpb24udGV4dENvbnRlbnQgPSB3ZWF0aGVyLmNvbmRpdGlvbjtcbiAgICAgICAgd2VhdGhlcldpZGdldC53aW5kLnRleHRDb250ZW50ID0gYFdpbmQ6ICR7d2VhdGhlci53aW5kU3BlZWR9ICR7d2luZExhYmVsfSAke3dlYXRoZXIud2luZERpcn1gO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0Lmljb24uaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwid2VhdGhlci1lbW9qaVwiPiR7ZXNjYXBlSHRtbCh3ZWF0aGVyLmljb24pfTwvc3Bhbj5gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tXZWF0aGVyXSBVcGRhdGUgRXJyb3InLCBlcnJvciwgeyBmdW5jdGlvbjogJ3VwZGF0ZVdlYXRoZXInIH0pO1xuICAgICAgd2VhdGhlcldpZGdldC5sb2NhdGlvbi50ZXh0Q29udGVudCA9ICdXZWF0aGVyIEVycm9yJztcbiAgICAgIHdlYXRoZXJXaWRnZXQudGVtcC50ZXh0Q29udGVudCA9ICdFcnJvcic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LmNvbmRpdGlvbi50ZXh0Q29udGVudCA9ICdGYWlsZWQgdG8gbG9hZCc7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LndpbmQudGV4dENvbnRlbnQgPSAnLS0nO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlYXRoZXIgc2V0dGluZ3MgbW9kYWxcbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VhdGhlci1tb2RhbCcpO1xuICBjb25zdCBsb2NhdGlvbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItbG9jYXRpb24taW5wdXQnKTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VhdGhlci1zZXR0aW5ncycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2NhdGlvbklucHV0LnZhbHVlID0gc2FmZUdldChMT0NBVElPTl9LRVkpIHx8ICcnO1xuICAgIC8vIFNldCB1bml0IHJhZGlvXG4gICAgY29uc3QgdW5pdCA9IGdldFVuaXQoKTtcbiAgICBjb25zdCByYWRpbyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoYGlucHV0W25hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIl1bdmFsdWU9XCIke3VuaXR9XCJdYCk7XG4gICAgaWYgKHJhZGlvKSByYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9jYXRpb25JbnB1dC5mb2N1cygpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VhdGhlci1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VhdGhlci1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IGxvYyA9IGxvY2F0aW9uSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmIChsb2MpIHtcbiAgICAgIC8vIENsZWFyIGdlbyBjYWNoZSB3aGVuIGxvY2F0aW9uIGNoYW5nZXMgc28gaXQgcmUtZ2VvY29kZXNcbiAgICAgIGNvbnN0IG9sZExvYyA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKTtcbiAgICAgIGlmIChvbGRMb2MgIT09IGxvYykgc2FmZVNldChHRU9fQ0FDSEVfS0VZLCAnJyk7XG4gICAgICBzYWZlU2V0KExPQ0FUSU9OX0tFWSwgbG9jKTtcbiAgICAgIC8vIFNhdmUgdW5pdCBwcmVmZXJlbmNlXG4gICAgICBjb25zdCB1bml0UmFkaW8gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwid2VhdGhlci11bml0LXJhZGlvXCJdOmNoZWNrZWQnKTtcbiAgICAgIGNvbnN0IG5ld1VuaXQgPSB1bml0UmFkaW8gPyB1bml0UmFkaW8udmFsdWUgOiAnaW1wZXJpYWwnO1xuICAgICAgY29uc3Qgb2xkVW5pdCA9IGdldFVuaXQoKTtcbiAgICAgIHNhZmVTZXQoVU5JVF9LRVksIG5ld1VuaXQpO1xuICAgICAgLy8gQ2xlYXIgZ2VvIGNhY2hlIGlmIHVuaXQgY2hhbmdlZCAobmVlZCBmcmVzaCB3ZWF0aGVyIGRhdGEpXG4gICAgICBpZiAob2xkVW5pdCAhPT0gbmV3VW5pdCkgc2FmZVNldChHRU9fQ0FDSEVfS0VZLCAnJyk7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICB1cGRhdGVXZWF0aGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIGxvY2F0aW9uIChlLmcuLCBIYW1idXJnLCBMb25kb24sIDkwMjEwKScsICd3YXJuaW5nJyk7XG4gICAgfVxuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwpO1xuXG4gIC8vIENsb3NlIG1vZGFsIG9uIEVzY2FwZSBrZXlcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJyAmJiBtb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkge1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB3ZWF0aGVyXG4gIHVwZGF0ZVdlYXRoZXIoKTtcbiAgLy8gVXBkYXRlIHdlYXRoZXIgZXZlcnkgMTAgbWludXRlc1xuICBzZXRJbnRlcnZhbCh1cGRhdGVXZWF0aGVyLCBEQy5QT0xMLldFQVRIRVIpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRElHSVRBTCBDTE9DSyBXSURHRVQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBjb25zdCB3aWRnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2std2lkZ2V0Jyk7XG4gIGNvbnN0IHJlbmRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1yZW5kZXInKTtcbiAgaWYgKCF3aWRnZXQgfHwgIXJlbmRlcikgcmV0dXJuO1xuXG4gIGNvbnN0IERBWVMgPSBbJ1N1bmRheScsJ01vbmRheScsJ1R1ZXNkYXknLCdXZWRuZXNkYXknLCdUaHVyc2RheScsJ0ZyaWRheScsJ1NhdHVyZGF5J107XG4gIGNvbnN0IE1PTlRIUyA9IFsnSmFudWFyeScsJ0ZlYnJ1YXJ5JywnTWFyY2gnLCdBcHJpbCcsJ01heScsJ0p1bmUnLCdKdWx5JywnQXVndXN0JywnU2VwdGVtYmVyJywnT2N0b2JlcicsJ05vdmVtYmVyJywnRGVjZW1iZXInXTtcbiAgY29uc3QgUk9NQU4gPSBbJ1hJSScsJ0knLCdJSScsJ0lJSScsJ0lWJywnVicsJ1ZJJywnVklJJywnVklJSScsJ0lYJywnWCcsJ1hJJ107XG5cbiAgbGV0IGN1cnJlbnRTdHlsZSA9IHNhZmVHZXQoJ2Nsb2NrLXN0eWxlJykgfHwgJ2RlZmF1bHQnO1xuICBsZXQgbGFzdENoaW1lSG91ciA9IC0xO1xuICBsZXQgY2hpbWVQbGF5aW5nID0gZmFsc2U7XG4gIGxldCBwcmV2RmxpcERpZ2l0cyA9ICcnO1xuICBsZXQgYWN0aXZlTGF5b3V0ID0gJyc7XG4gIGxldCBkaWdpdGFsUmVmcyA9IG51bGw7XG4gIGxldCB0aWNrVGltZXIgPSBudWxsO1xuXG4gIC8vID09PT09IENISU1FUyA9PT09PVxuICBmdW5jdGlvbiBwbGF5Q2hpbWVzKGNvdW50KSB7XG4gICAgaWYgKGNoaW1lUGxheWluZykgcmV0dXJuO1xuICAgIGlmIChzYWZlR2V0KCdjbG9jay1jaGltZXMnKSAhPT0gJ3RydWUnKSByZXR1cm47XG4gICAgY2hpbWVQbGF5aW5nID0gdHJ1ZTtcbiAgICBjb25zdCB2b2wgPSBwYXJzZUludChzYWZlR2V0KCdjbG9jay1jaGltZS12b2x1bWUnKSB8fCAnNTAnLCAxMCkgLyAxMDA7XG4gICAgbGV0IGkgPSAwO1xuICAgIGZ1bmN0aW9uIHN0cmlrZSgpIHtcbiAgICAgIGlmIChpID49IGNvdW50KSB7IGNoaW1lUGxheWluZyA9IGZhbHNlOyByZXR1cm47IH1cbiAgICAgIGNvbnN0IGJlbGwgPSBuZXcgQXVkaW8oJy9hc3NldHMvc291bmRzL2NodXJjaC1iZWxsLm1wMycpO1xuICAgICAgYmVsbC52b2x1bWUgPSB2b2w7XG4gICAgICBiZWxsLnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBpKys7XG4gICAgICBpZiAoaSA8IGNvdW50KSBzZXRUaW1lb3V0KHN0cmlrZSwgMjUwMCk7XG4gICAgICBlbHNlIHNldFRpbWVvdXQoKCkgPT4geyBjaGltZVBsYXlpbmcgPSBmYWxzZTsgfSwgMjUwMCk7XG4gICAgfVxuICAgIHN0cmlrZSgpO1xuICB9XG5cbiAgLy8gPT09PT0gREFURSBTVFJJTkcgPT09PT1cbiAgZnVuY3Rpb24gZGF0ZVN0cihub3cpIHtcbiAgICByZXR1cm4gREFZU1tub3cuZ2V0RGF5KCldICsgJywgJyArIE1PTlRIU1tub3cuZ2V0TW9udGgoKV0gKyAnICcgKyBub3cuZ2V0RGF0ZSgpICsgJywgJyArIG5vdy5nZXRGdWxsWWVhcigpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRSZW5kZXJMYXlvdXQoKSB7XG4gICAgYWN0aXZlTGF5b3V0ID0gJyc7XG4gICAgZGlnaXRhbFJlZnMgPSBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5zdXJlRGlnaXRhbExheW91dCgpIHtcbiAgICBpZiAoYWN0aXZlTGF5b3V0ICE9PSAnZGlnaXRhbCcpIHtcbiAgICAgIHJlbmRlci5pbm5lckhUTUwgPVxuICAgICAgICAnPGRpdiBjbGFzcz1cImNsb2NrLXRpbWVcIj48c3BhbiBjbGFzcz1cImNsb2NrLW1haW5cIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJjbG9jay1zZWNvbmRzXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stYW1wbVwiPjwvc3Bhbj48L2Rpdj4nICtcbiAgICAgICAgJzxkaXYgY2xhc3M9XCJjbG9jay1kYXRlXCI+PC9kaXY+JztcbiAgICAgIGRpZ2l0YWxSZWZzID0ge1xuICAgICAgICBtYWluOiByZW5kZXIucXVlcnlTZWxlY3RvcignLmNsb2NrLW1haW4nKSxcbiAgICAgICAgc2Vjb25kczogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1zZWNvbmRzJyksXG4gICAgICAgIGFtcG06IHJlbmRlci5xdWVyeVNlbGVjdG9yKCcuY2xvY2stYW1wbScpLFxuICAgICAgICBkYXRlOiByZW5kZXIucXVlcnlTZWxlY3RvcignLmNsb2NrLWRhdGUnKVxuICAgICAgfTtcbiAgICAgIGFjdGl2ZUxheW91dCA9ICdkaWdpdGFsJztcbiAgICB9XG4gICAgcmV0dXJuIGRpZ2l0YWxSZWZzO1xuICB9XG5cbiAgLy8gPT09PT0gU1RZTEUgUkVOREVSRVJTID09PT09XG5cbiAgZnVuY3Rpb24gcmVuZGVyRGVmYXVsdChub3cpIHtcbiAgICBjb25zdCBoMjQgPSBub3cuZ2V0SG91cnMoKSwgbSA9IG5vdy5nZXRNaW51dGVzKCksIHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuICAgIGNvbnN0IGFtcG0gPSBoMjQgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICBjb25zdCBoID0gaDI0ICUgMTIgfHwgMTI7XG4gICAgY29uc3QgcmVmcyA9IGVuc3VyZURpZ2l0YWxMYXlvdXQoKTtcbiAgICByZWZzLm1haW4udGV4dENvbnRlbnQgPSBgJHtofToke1N0cmluZyhtKS5wYWRTdGFydCgyLCcwJyl9YDtcbiAgICByZWZzLnNlY29uZHMudGV4dENvbnRlbnQgPSBgOiR7U3RyaW5nKHMpLnBhZFN0YXJ0KDIsJzAnKX1gO1xuICAgIHJlZnMuYW1wbS50ZXh0Q29udGVudCA9IGFtcG07XG4gICAgcmVmcy5kYXRlLnRleHRDb250ZW50ID0gZGF0ZVN0cihub3cpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyTGNkKG5vdywgY2xzKSB7XG4gICAgY29uc3QgaDI0ID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBhbXBtID0gaDI0ID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IHJlZnMgPSBlbnN1cmVEaWdpdGFsTGF5b3V0KCk7XG4gICAgcmVmcy5tYWluLnRleHRDb250ZW50ID0gYCR7U3RyaW5nKGgpLnBhZFN0YXJ0KDIsJzAnKX06JHtTdHJpbmcobSkucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5zZWNvbmRzLnRleHRDb250ZW50ID0gYDoke1N0cmluZyhzKS5wYWRTdGFydCgyLCcwJyl9YDtcbiAgICByZWZzLmFtcG0udGV4dENvbnRlbnQgPSBhbXBtO1xuICAgIHJlZnMuZGF0ZS50ZXh0Q29udGVudCA9IGRhdGVTdHIobm93KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckZsaXAobm93KSB7XG4gICAgY29uc3QgaDI0ID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBhbXBtID0gaDI0ID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IGRpZ2l0cyA9IFN0cmluZyhoKS5wYWRTdGFydCgyLCcgJykgKyBTdHJpbmcobSkucGFkU3RhcnQoMiwnMCcpICsgU3RyaW5nKHMpLnBhZFN0YXJ0KDIsJzAnKTtcblxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJmbGlwLWNsb2NrLXJvd1wiPic7XG4gICAgLy8gSG91cnNcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1swXSwgMCk7XG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbMV0sIDEpO1xuICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPVwiZmxpcC1jb2xvblwiPjo8L3NwYW4+JztcbiAgICAvLyBNaW51dGVzXG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbMl0sIDIpO1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzNdLCAzKTtcbiAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cImZsaXAtY29sb25cIj46PC9zcGFuPic7XG4gICAgLy8gU2Vjb25kc1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzRdLCA0KTtcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1s1XSwgNSk7XG4gICAgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJmbGlwLWFtcG1cIj4ke2FtcG19PC9zcGFuPmA7XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiY2xvY2stZGF0ZVwiPiR7ZGF0ZVN0cihub3cpfTwvZGl2PmA7XG4gICAgcmVuZGVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYWN0aXZlTGF5b3V0ID0gJ2ZsaXAnO1xuXG4gICAgLy8gVHJpZ2dlciBmbGlwIGFuaW1hdGlvbiBvbiBjaGFuZ2VkIGRpZ2l0c1xuICAgIGlmIChwcmV2RmxpcERpZ2l0cykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgICAgaWYgKGRpZ2l0c1tpXSAhPT0gcHJldkZsaXBEaWdpdHNbaV0pIHtcbiAgICAgICAgICBjb25zdCBjYXJkID0gcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoYC5mbGlwLWNhcmRbZGF0YS1pZHg9XCIke2l9XCJdYCk7XG4gICAgICAgICAgaWYgKGNhcmQpIGNhcmQuY2xhc3NMaXN0LmFkZCgnZmxpcHBpbmcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcmV2RmxpcERpZ2l0cyA9IGRpZ2l0cztcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsaXBDYXJkKGRpZ2l0LCBpZHgpIHtcbiAgICBjb25zdCBkID0gZGlnaXQgPT09ICcgJyA/ICcnIDogZGlnaXQ7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiZmxpcC1jYXJkXCIgZGF0YS1pZHg9XCIke2lkeH1cIj48ZGl2IGNsYXNzPVwiZmxpcC10b3BcIj4ke2R9PC9kaXY+PGRpdiBjbGFzcz1cImZsaXAtYm90dG9tXCI+JHtkfTwvZGl2PjwvZGl2PmA7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJCaW5hcnkobm93KSB7XG4gICAgY29uc3QgaDI0ID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBoID0gaDI0ICUgMTIgfHwgMTI7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIC8vIDYgY29sdW1uczogSCB0ZW5zLCBIIG9uZXMsIE0gdGVucywgTSBvbmVzLCBTIHRlbnMsIFMgb25lc1xuICAgIGNvbnN0IGNvbHMgPSBbXG4gICAgICBNYXRoLmZsb29yKGggLyAxMCksIGggJSAxMCxcbiAgICAgIE1hdGguZmxvb3IobSAvIDEwKSwgbSAlIDEwLFxuICAgICAgTWF0aC5mbG9vcihzIC8gMTApLCBzICUgMTBcbiAgICBdO1xuXG4gICAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cImJpbmFyeS1jbG9ja1wiPic7XG4gICAgLy8gTGFiZWxzXG4gICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImJpbmFyeS1sYWJlbHNcIj48c3Bhbj5IPC9zcGFuPjxzcGFuPkg8L3NwYW4+PHNwYW4+TTwvc3Bhbj48c3Bhbj5NPC9zcGFuPjxzcGFuPlM8L3NwYW4+PHNwYW4+Uzwvc3Bhbj48L2Rpdj4nO1xuICAgIC8vIDQgcm93cyBmb3IgYml0cyA4LDQsMiwxXG4gICAgZm9yIChsZXQgYml0ID0gMzsgYml0ID49IDA7IGJpdC0tKSB7XG4gICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYmluYXJ5LXJvd1wiPic7XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCA2OyBjb2wrKykge1xuICAgICAgICBjb25zdCBvbiA9IChjb2xzW2NvbF0gPj4gYml0KSAmIDE7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJiaW5hcnktZG90ICR7b24gPyAnb24nIDogJyd9XCI+PC9kaXY+YDtcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfVxuICAgIC8vIFZhbHVlIHJvd1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJiaW5hcnktdmFsdWVzXCI+JztcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCA2OyBjb2wrKykge1xuICAgICAgaHRtbCArPSBgPHNwYW4+JHtjb2xzW2NvbF19PC9zcGFuPmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImJpbmFyeS1hbXBtXCI+JHthbXBtfTwvZGl2PmA7XG4gICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiY2xvY2stZGF0ZVwiPiR7ZGF0ZVN0cihub3cpfTwvZGl2PmA7XG4gICAgcmVuZGVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYWN0aXZlTGF5b3V0ID0gJ2JpbmFyeSc7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJBbmFsb2cobm93LCB1c2VSb21hbikge1xuICAgIGNvbnN0IGggPSBub3cuZ2V0SG91cnMoKSwgbSA9IG5vdy5nZXRNaW51dGVzKCksIHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuICAgIGNvbnN0IHNpemUgPSAxMjA7XG4gICAgY29uc3QgY3ggPSBzaXplIC8gMiwgY3kgPSBzaXplIC8gMjtcblxuICAgIC8vIEFuZ2xlc1xuICAgIGNvbnN0IHNBbmdsZSA9IChzIC8gNjApICogMzYwIC0gOTA7XG4gICAgY29uc3QgbUFuZ2xlID0gKChtICsgcyAvIDYwKSAvIDYwKSAqIDM2MCAtIDkwO1xuICAgIGNvbnN0IGhBbmdsZSA9ICgoKGggJSAxMikgKyBtIC8gNjApIC8gMTIpICogMzYwIC0gOTA7XG5cbiAgICAvLyBOdW1iZXIgbGFiZWxzXG4gICAgbGV0IGxhYmVscyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gKGkgLyAxMikgKiAyICogTWF0aC5QSSAtIE1hdGguUEkgLyAyO1xuICAgICAgY29uc3QgciA9IDQ3O1xuICAgICAgY29uc3QgeCA9IGN4ICsgciAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgIGNvbnN0IHkgPSBjeSArIHIgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgICBjb25zdCBsYWJlbCA9IHVzZVJvbWFuID8gUk9NQU5baSAlIDEyXSA6IGk7XG4gICAgICBjb25zdCBmcyA9IHVzZVJvbWFuID8gJzcnIDogJzknO1xuICAgICAgbGFiZWxzICs9IGA8dGV4dCB4PVwiJHt4fVwiIHk9XCIke3l9XCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiBkb21pbmFudC1iYXNlbGluZT1cImNlbnRyYWxcIiBmaWxsPVwidmFyKC0tZmcpXCIgZm9udC1zaXplPVwiJHtmc31cIiBmb250LXdlaWdodD1cIjYwMFwiIGZvbnQtZmFtaWx5PVwiJ1NhbWkgR3JvdGVzaycsc2Fucy1zZXJpZlwiPiR7bGFiZWx9PC90ZXh0PmA7XG4gICAgfVxuXG4gICAgLy8gVGljayBtYXJrc1xuICAgIGxldCB0aWNrcyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjA7IGkrKykge1xuICAgICAgY29uc3QgYW5nbGUgPSAoaSAvIDYwKSAqIDIgKiBNYXRoLlBJIC0gTWF0aC5QSSAvIDI7XG4gICAgICBjb25zdCBvdXRlciA9IDU2O1xuICAgICAgY29uc3QgaW5uZXIgPSBpICUgNSA9PT0gMCA/IDUyIDogNTQ7XG4gICAgICBjb25zdCB4MSA9IGN4ICsgaW5uZXIgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICBjb25zdCB5MSA9IGN5ICsgaW5uZXIgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgICBjb25zdCB4MiA9IGN4ICsgb3V0ZXIgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICBjb25zdCB5MiA9IGN5ICsgb3V0ZXIgKiBNYXRoLnNpbihhbmdsZSk7XG4gICAgICBjb25zdCB3ID0gaSAlIDUgPT09IDAgPyAxLjUgOiAwLjU7XG4gICAgICB0aWNrcyArPSBgPGxpbmUgeDE9XCIke3gxfVwiIHkxPVwiJHt5MX1cIiB4Mj1cIiR7eDJ9XCIgeTI9XCIke3kyfVwiIHN0cm9rZT1cInZhcigtLW11dGVkKVwiIHN0cm9rZS13aWR0aD1cIiR7d31cIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPmA7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ZnID0gYDxzdmcgY2xhc3M9XCJhbmFsb2ctY2xvY2stc3ZnXCIgdmlld0JveD1cIjAgMCAke3NpemV9ICR7c2l6ZX1cIiB3aWR0aD1cIiR7c2l6ZX1cIiBoZWlnaHQ9XCIke3NpemV9XCI+XG4gICAgICA8Y2lyY2xlIGN4PVwiJHtjeH1cIiBjeT1cIiR7Y3l9XCIgcj1cIjU4XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJ2YXIoLS1ib3JkZXIpXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cbiAgICAgICR7dGlja3N9XG4gICAgICAke2xhYmVsc31cbiAgICAgIDxsaW5lIHgxPVwiJHtjeH1cIiB5MT1cIiR7Y3l9XCIgeDI9XCIke2N4ICsgMjggKiBNYXRoLmNvcyhoQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiB5Mj1cIiR7Y3kgKyAyOCAqIE1hdGguc2luKGhBbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHN0cm9rZT1cInZhcigtLWZnKVwiIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGxpbmUgeDE9XCIke2N4fVwiIHkxPVwiJHtjeX1cIiB4Mj1cIiR7Y3ggKyAzOCAqIE1hdGguY29zKG1BbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHkyPVwiJHtjeSArIDM4ICogTWF0aC5zaW4obUFuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgc3Ryb2tlPVwidmFyKC0tZmcpXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICA8bGluZSB4MT1cIiR7Y3h9XCIgeTE9XCIke2N5fVwiIHgyPVwiJHtjeCArIDQyICogTWF0aC5jb3Moc0FuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgeTI9XCIke2N5ICsgNDIgKiBNYXRoLnNpbihzQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiBzdHJva2U9XCIjZTc0YzNjXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIi8+XG4gICAgICA8Y2lyY2xlIGN4PVwiJHtjeH1cIiBjeT1cIiR7Y3l9XCIgcj1cIjNcIiBmaWxsPVwidmFyKC0tZmcpXCIvPlxuICAgIDwvc3ZnPmA7XG5cbiAgICBjb25zdCBhbXBtID0gbm93LmdldEhvdXJzKCkgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICByZW5kZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJhbmFsb2ctY2xvY2std3JhcFwiPiR7c3ZnfTxkaXYgY2xhc3M9XCJhbmFsb2ctaW5mb1wiPjxzcGFuIGNsYXNzPVwiYW5hbG9nLWRpZ2l0YWxcIj4keyhub3cuZ2V0SG91cnMoKSAlIDEyIHx8IDEyKX06JHtTdHJpbmcobSkucGFkU3RhcnQoMiwnMCcpfSAke2FtcG19PC9zcGFuPjxzcGFuIGNsYXNzPVwiYW5hbG9nLWRhdGUtc21cIj4ke2RhdGVTdHIobm93KX08L3NwYW4+PC9kaXY+PC9kaXY+YDtcbiAgICBhY3RpdmVMYXlvdXQgPSAnYW5hbG9nJztcbiAgfVxuXG4gIC8vID09PT09IE1BSU4gVElDSyA9PT09PVxuICBmdW5jdGlvbiB0aWNrKCkge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgaCA9IG5vdy5nZXRIb3VycygpICUgMTIgfHwgMTI7XG4gICAgY29uc3QgbSA9IG5vdy5nZXRNaW51dGVzKCk7XG4gICAgY29uc3QgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG5cbiAgICAvLyBTZXQgc3R5bGUgY2xhc3Mgb24gd2lkZ2V0XG4gICAgY29uc3QgbmV4dENsYXNzTmFtZSA9ICdjbG9jay13aWRnZXQnICsgKGN1cnJlbnRTdHlsZSAhPT0gJ2RlZmF1bHQnID8gJyAnICsgY3VycmVudFN0eWxlIDogJycpO1xuICAgIGlmICh3aWRnZXQuY2xhc3NOYW1lICE9PSBuZXh0Q2xhc3NOYW1lKSB7XG4gICAgICB3aWRnZXQuY2xhc3NOYW1lID0gbmV4dENsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGN1cnJlbnRTdHlsZSkge1xuICAgICAgY2FzZSAnbGNkJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLWJsdWUnOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdsY2QtYW1iZXInOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdsY2QtcmV0cm8nOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdsY2QtdGF4aSc6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2ZsaXAnOiByZW5kZXJGbGlwKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnYmluYXJ5JzogcmVuZGVyQmluYXJ5KG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnYW5hbG9nJzogcmVuZGVyQW5hbG9nKG5vdywgZmFsc2UpOyBicmVhaztcbiAgICAgIGNhc2UgJ3JvbWFuJzogcmVuZGVyQW5hbG9nKG5vdywgdHJ1ZSk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmVuZGVyRGVmYXVsdChub3cpO1xuICAgIH1cblxuICAgIC8vIEhvdXJseSBjaGltZXNcbiAgICBpZiAobSA9PT0gMCAmJiBzID09PSAwICYmIGggIT09IGxhc3RDaGltZUhvdXIpIHtcbiAgICAgIGxhc3RDaGltZUhvdXIgPSBoO1xuICAgICAgcGxheUNoaW1lcyhoKTtcbiAgICB9XG4gICAgaWYgKG0gIT09IDApIGxhc3RDaGltZUhvdXIgPSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlTmV4dFRpY2soKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpY2tUaW1lcik7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBkb2N1bWVudC5oaWRkZW4gPyA2MDAwMCA6IDEwMDA7XG4gICAgY29uc3QgZGVsYXkgPSBpbnRlcnZhbCAtIChEYXRlLm5vdygpICUgaW50ZXJ2YWwpICsgMjU7XG4gICAgdGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aWNrKCk7XG4gICAgICBzY2hlZHVsZU5leHRUaWNrKCk7XG4gICAgfSwgZGVsYXkpO1xuICB9XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsICgpID0+IHtcbiAgICBwcmV2RmxpcERpZ2l0cyA9ICcnO1xuICAgIHJlc2V0UmVuZGVyTGF5b3V0KCk7XG4gICAgdGljaygpO1xuICAgIHNjaGVkdWxlTmV4dFRpY2soKTtcbiAgfSk7XG5cbiAgdGljaygpO1xuICBzY2hlZHVsZU5leHRUaWNrKCk7XG5cbiAgLy8gPT09PT0gU0VUVElOR1MgTU9EQUwgPT09PT1cbiAgY29uc3QgU1RZTEVTID0gW1xuICAgIHsgaWQ6ICdkZWZhdWx0JywgbGFiZWw6ICdEZWZhdWx0JywgaWNvbjogJ1x1RDgzRFx1REQ1MCcgfSxcbiAgICB7IGlkOiAnbGNkJywgbGFiZWw6ICdMQ0QgR3JlZW4nLCBpY29uOiAnXHVEODNEXHVEQzlBJyB9LFxuICAgIHsgaWQ6ICdsY2QtYmx1ZScsIGxhYmVsOiAnTENEIEJsdWUnLCBpY29uOiAnXHVEODNEXHVEQzk5JyB9LFxuICAgIHsgaWQ6ICdsY2QtYW1iZXInLCBsYWJlbDogJ0xDRCBBbWJlcicsIGljb246ICdcdUQ4M0RcdURGRTAnIH0sXG4gICAgeyBpZDogJ2xjZC1yZXRybycsIGxhYmVsOiAnTENEIFJldHJvJywgaWNvbjogJ1x1RDgzRFx1REZFOScgfSxcbiAgICB7IGlkOiAnbGNkLXRheGknLCBsYWJlbDogJ0xDRCBUYXhpJywgaWNvbjogJ1x1RDgzRFx1REZFMScgfSxcbiAgICB7IGlkOiAnZmxpcCcsIGxhYmVsOiAnRmxpcCBDbG9jaycsIGljb246ICdcdUQ4M0RcdURDREYnIH0sXG4gICAgeyBpZDogJ2JpbmFyeScsIGxhYmVsOiAnQmluYXJ5JywgaWNvbjogJ1x1RDgzRFx1RENCQicgfSxcbiAgICB7IGlkOiAnYW5hbG9nJywgbGFiZWw6ICdBbmFsb2cnLCBpY29uOiAnXHUyM0YwJyB9LFxuICAgIHsgaWQ6ICdyb21hbicsIGxhYmVsOiAnUm9tYW4nLCBpY29uOiAnXHVEODNDXHVERkRCXHVGRTBGJyB9LFxuICBdO1xuXG4gIGxldCBzdHlsZU9wdGlvbnNIdG1sID0gJzxkaXYgY2xhc3M9XCJjbG9jay1zdHlsZS1ncmlkXCI+JztcbiAgU1RZTEVTLmZvckVhY2gocyA9PiB7XG4gICAgc3R5bGVPcHRpb25zSHRtbCArPSBgPGxhYmVsIGNsYXNzPVwiY2xvY2stc3R5bGUtb3B0aW9uXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImNsb2NrLXN0eWxlLXJhZGlvXCIgdmFsdWU9XCIke3MuaWR9XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNsb2NrLXN0eWxlLWNhcmRcIj48c3BhbiBjbGFzcz1cImNsb2NrLXN0eWxlLWljb25cIj4ke3MuaWNvbn08L3NwYW4+PHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1sYWJlbFwiPiR7cy5sYWJlbH08L3NwYW4+PC9zcGFuPlxuICAgIDwvbGFiZWw+YDtcbiAgfSk7XG4gIHN0eWxlT3B0aW9uc0h0bWwgKz0gJzwvZGl2Pic7XG5cbiAgaW5qZWN0TW9kYWwoJ2Nsb2NrLXNldHRpbmdzLW1vZGFsJywgYDxkaXYgaWQ9XCJjbG9jay1zZXR0aW5ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1heC13aWR0aDogNDIwcHg7XCI+XG4gICAgICA8aDM+Q2xvY2sgU2V0dGluZ3M8L2gzPlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA4cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1mZyk7XCI+U3R5bGU8L2xhYmVsPlxuICAgICAgICAke3N0eWxlT3B0aW9uc0h0bWx9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nLXRvcDogMTJweDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1mZyk7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2xvY2stY2hpbWVzLXRvZ2dsZVwiPiBIb3VybHkgY2h1cmNoIGJlbGwgY2hpbWVzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDsgbWFyZ2luLWxlZnQ6IDI0cHg7XCI+XG4gICAgICAgICAgU3RyaWtlcyB0aGUgbnVtYmVyIG9mIHRoZSBob3VyIChlLmcuLCAzIGJlbGxzIGF0IDM6MDApXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDtcIiBpZD1cImNsb2NrLXZvbHVtZS1zZWN0aW9uXCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1mZyk7XCI+Vm9sdW1lPC9sYWJlbD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMDg8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIGlkPVwiY2xvY2stY2hpbWUtdm9sdW1lXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHZhbHVlPVwiNTBcIiBzdHlsZT1cImZsZXg6IDE7IGFjY2VudC1jb2xvcjogdmFyKC0tb2stZmcpO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1RDgzRFx1REQwQTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2xvY2stY2hpbWUtdGVzdFwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xvY2stc2V0dGluZ3MtY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjbG9jay1zZXR0aW5ncy1zYXZlXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXNldHRpbmdzLW1vZGFsJyk7XG4gIGNvbnN0IGNoaW1lc1RvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1jaGltZXMtdG9nZ2xlJyk7XG4gIGNvbnN0IHZvbHVtZVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1jaGltZS12b2x1bWUnKTtcbiAgY29uc3Qgdm9sdW1lU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay12b2x1bWUtc2VjdGlvbicpO1xuXG4gIGZ1bmN0aW9uIGxvYWRTZXR0aW5ncygpIHtcbiAgICBjb25zdCBzdHlsZSA9IHNhZmVHZXQoJ2Nsb2NrLXN0eWxlJykgfHwgJ2RlZmF1bHQnO1xuICAgIGNvbnN0IHJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcihgaW5wdXRbdmFsdWU9XCIke3N0eWxlfVwiXWApO1xuICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgY2hpbWVzVG9nZ2xlLmNoZWNrZWQgPSBzYWZlR2V0KCdjbG9jay1jaGltZXMnKSA9PT0gJ3RydWUnO1xuICAgIHZvbHVtZVNsaWRlci52YWx1ZSA9IHNhZmVHZXQoJ2Nsb2NrLWNoaW1lLXZvbHVtZScpIHx8ICc1MCc7XG4gICAgdm9sdW1lU2VjdGlvbi5zdHlsZS5vcGFjaXR5ID0gY2hpbWVzVG9nZ2xlLmNoZWNrZWQgPyAnMScgOiAnMC40JztcbiAgfVxuXG4gIGNoaW1lc1RvZ2dsZT8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUub3BhY2l0eSA9IGNoaW1lc1RvZ2dsZS5jaGVja2VkID8gJzEnIDogJzAuNCc7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2FkU2V0dGluZ3MoKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1jaGltZS10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHZvbCA9IHBhcnNlSW50KHZvbHVtZVNsaWRlci52YWx1ZSwgMTApIC8gMTAwO1xuICAgIGNvbnN0IGJlbGwgPSBuZXcgQXVkaW8oJy9hc3NldHMvc291bmRzL2NodXJjaC1iZWxsLm1wMycpO1xuICAgIGJlbGwudm9sdW1lID0gdm9sO1xuICAgIGJlbGwucGxheSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXNldHRpbmdzLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiY2xvY2stc3R5bGUtcmFkaW9cIl06Y2hlY2tlZCcpO1xuICAgIGNvbnN0IHN0eWxlID0gcmFkaW8gPyByYWRpby52YWx1ZSA6ICdkZWZhdWx0JztcbiAgICBzYWZlU2V0KCdjbG9jay1zdHlsZScsIHN0eWxlKTtcbiAgICBzYWZlU2V0KCdjbG9jay1jaGltZXMnLCBTdHJpbmcoY2hpbWVzVG9nZ2xlLmNoZWNrZWQpKTtcbiAgICBzYWZlU2V0KCdjbG9jay1jaGltZS12b2x1bWUnLCB2b2x1bWVTbGlkZXIudmFsdWUpO1xuICAgIGN1cnJlbnRTdHlsZSA9IHN0eWxlO1xuICAgIHByZXZGbGlwRGlnaXRzID0gJyc7XG4gICAgcmVzZXRSZW5kZXJMYXlvdXQoKTtcbiAgICB0aWNrKCk7XG4gICAgc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBzaG93Tm90aWZpY2F0aW9uKCdDbG9jayBzZXR0aW5ncyBzYXZlZCcsICdzdWNjZXNzJywgMjAwMCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1jYW5jZWwnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwpO1xuXG4gIC8vIExpdmUgcHJldmlldyB3aGVuIGNsaWNraW5nIHN0eWxlIG9wdGlvbnNcbiAgbW9kYWw/LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJjbG9jay1zdHlsZS1yYWRpb1wiXScpLmZvckVhY2gocmFkaW8gPT4ge1xuICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGN1cnJlbnRTdHlsZSA9IHJhZGlvLnZhbHVlO1xuICAgICAgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgICAgIHJlc2V0UmVuZGVyTGF5b3V0KCk7XG4gICAgICB0aWNrKCk7XG4gICAgfSk7XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ0FSRCBIRUFMVEggJiBVUERBVEUgQkFER0VTID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gRmV0Y2ggaGVhbHRoIGRhdGEgYW5kIHVwZGF0ZSBjYXJkIFVJXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hDYXJkSGVhbHRoKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5zdGF0dXMpIHJldHVybjtcblxuICAgICAgZm9yIChjb25zdCBbc2VydmljZUlkLCBzdmNdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEuc3RhdHVzKSkge1xuICAgICAgICBjb25zdCB1cHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHRpbWUtJyArIHNlcnZpY2VJZCk7XG4gICAgICAgIGNvbnN0IGJhckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwdGltZS1iYXItJyArIHNlcnZpY2VJZCk7XG4gICAgICAgIGlmICghdXB0aW1lRWwpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHVwdGltZTI0ID0gc3ZjLnVwdGltZT8uWycyNGgnXTtcbiAgICAgICAgaWYgKHVwdGltZTI0ICE9PSB1bmRlZmluZWQgJiYgdXB0aW1lMjQgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBwY3QgPSB1cHRpbWUyNC50b0ZpeGVkKDEpO1xuICAgICAgICAgIHVwdGltZUVsLnRleHRDb250ZW50ID0gYCR7cGN0fSUgdXB0aW1lYDtcbiAgICAgICAgICAvLyBDb2xvciBjbGFzc1xuICAgICAgICAgIHVwdGltZUVsLmNsYXNzTmFtZSA9ICd1cHRpbWUtY2hpcCc7XG4gICAgICAgICAgaWYgKHVwdGltZTI0ID49IDk5LjkpIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ2V4Y2VsbGVudCcpO1xuICAgICAgICAgIGVsc2UgaWYgKHVwdGltZTI0ID49IDk5KSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdnb29kJyk7XG4gICAgICAgICAgZWxzZSBpZiAodXB0aW1lMjQgPj0gOTUpIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ2RlZ3JhZGVkJyk7XG4gICAgICAgICAgZWxzZSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdwb29yJyk7XG5cbiAgICAgICAgICBpZiAoYmFyRWwpIGJhckVsLnN0eWxlLndpZHRoID0gcGN0ICsgJyUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLyogSGVhbHRoIGNoZWNrIEFQSSB1bmF2YWlsYWJsZSBcdTIwMTQgdXB0aW1lIGNoaXBzIHN0YXkgaGlkZGVuICovXG4gICAgICBjb25zb2xlLndhcm4oJ1tDYXJkIEJhZGdlc10gSGVhbHRoIGNoZWNrIEFQSSB1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRyYWNrIGRpc21pc3NlZCB1cGRhdGVzIChwZXIgc2Vzc2lvbilcbiAgbGV0IGRpc21pc3NlZFVwZGF0ZXM7XG4gIHRyeSB7XG4gICAgZGlzbWlzc2VkVXBkYXRlcyA9IG5ldyBTZXQoSlNPTi5wYXJzZShzYWZlU2Vzc2lvbkdldCgnZGlzbWlzc2VkLXVwZGF0ZXMnKSB8fCAnW10nKSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvKiBTZXNzaW9uIHN0b3JhZ2UgdW5hdmFpbGFibGUgKi9cbiAgICBkaXNtaXNzZWRVcGRhdGVzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgLy8gVHJhY2sgZ2xvYmFsIHVwZGF0ZSBzdGF0ZSBmb3IgY3Jvc3MtY29tcG9uZW50IGFjY2Vzc1xuICBsZXQga25vd25VcGRhdGVzID0gW107XG5cbiAgLy8gRmV0Y2ggdXBkYXRlIGRhdGEgYW5kIHNob3cgYmFkZ2VzXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hDYXJkVXBkYXRlcyhub3RpZnlOZXcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9hdmFpbGFibGUnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHJldHVybjtcblxuICAgICAgLy8gQ2xlYXIgYWxsIHVwZGF0ZSBiYWRnZXMgZmlyc3RcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGRhdGUtYXZhaWxhYmxlLWJhZGdlJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJykpO1xuXG4gICAgICBjb25zdCB1cGRhdGVzID0gZGF0YS51cGRhdGVzIHx8IFtdO1xuICAgICAga25vd25VcGRhdGVzID0gdXBkYXRlczsgLy8gc3RvcmUgZ2xvYmFsbHlcblxuICAgICAgLy8gTm90aWZ5IGlmIG5ldyB1cGRhdGVzIGFwcGVhcmVkIChwZXJpb2RpYyBjaGVjayB3aXRoIG5vdGlmaWNhdGlvbilcbiAgICAgIGlmIChub3RpZnlOZXcgJiYgdXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSB3aW5kb3cuX2xhc3RLbm93blVwZGF0ZUNvdW50IHx8IDA7XG4gICAgICAgIGlmIChwcmV2ID4gMCAmJiB1cGRhdGVzLmxlbmd0aCA+IHByZXYpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke3VwZGF0ZXMubGVuZ3RofSBjb250YWluZXIgdXBkYXRlKHMpIGF2YWlsYWJsZSBcdTIwMTQgY2xpY2sgVXBkYXRlIE1hbmFnZW1lbnQgdG8gcmV2aWV3LmAsICdpbmZvJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93Ll9sYXN0S25vd25VcGRhdGVDb3VudCA9IHVwZGF0ZXMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGZvciAoY29uc3QgdXBkIG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGJ5IGNvbnRhaW5lciBuYW1lIHRvIHNlcnZpY2UgaWRcbiAgICAgICAgY29uc3QgYXBwcyA9IHdpbmRvdy5BUFBTIHx8IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGFwcCBvZiBhcHBzKSB7XG4gICAgICAgICAgaWYgKGFwcC5jb250YWluZXJJZCA9PT0gdXBkLmNvbnRhaW5lcklkIHx8IGFwcC5pZCA9PT0gdXBkLmNvbnRhaW5lck5hbWUgfHwgYXBwLm5hbWUgPT09IHVwZC5jb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGRpc21pc3NlZCB1cGRhdGVzXG4gICAgICAgICAgICBpZiAoZGlzbWlzc2VkVXBkYXRlcy5oYXMoYXBwLmlkKSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUtYmFkZ2UtJyArIGFwcC5pZCk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlLWJ0bi0nICsgYXBwLmlkKTtcbiAgICAgICAgICAgIGlmIChiYWRnZSkge1xuICAgICAgICAgICAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgIGJhZGdlLnRpdGxlID0gYFVwZGF0ZSBhdmFpbGFibGUgXHUyMDE0IGNsaWNrIHRvIG9wZW4gVXBkYXRlIE1hbmFnZW1lbnQuYDtcbiAgICAgICAgICAgICAgYmFkZ2Uuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgICAgICBiYWRnZS5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIE9wZW4gVXBkYXRlIE1hbmFnZW1lbnQgbW9kYWwgZm9jdXNlZCBvbiB0aGlzIGFwcFxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cub3BlblVwZGF0ZU1vZGFsKSB3aW5kb3cub3BlblVwZGF0ZU1vZGFsKGFwcC5pZCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIaWdobGlnaHQgdXBkYXRlIGJ1dHRvbiBpZiB1cGRhdGUgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAodXBkYXRlQnRuKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOTczMTYnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2Y5NzMxNic7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi5zdHlsZS5ib3hTaGFkb3cgPSAnMCAwIDZweCAjZjk3MzE2ODgnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSBgVXBkYXRlIGF2YWlsYWJsZSBcdTIwMTQgY2xpY2sgdG8gb3BlbiBVcGRhdGUgTWFuYWdlbWVudC5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLyogVXBkYXRlcyBBUEkgdW5hdmFpbGFibGUgXHUyMDE0IGJhZGdlcyBzdGF5IGhpZGRlbiAqL1xuICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIFVwZGF0ZXMgQVBJIHVuYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUnVuIGhlYWx0aCBhbmQgdXBkYXRlIGNoZWNrcyBhZnRlciBtYWluIHJlZnJlc2gsIGFuZCBwZXJpb2RpY2FsbHlcbiAgZnVuY3Rpb24gc2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzKCkge1xuICAgIC8vIEluaXRpYWwgbG9hZCAoZGVsYXllZCB0byBub3QgY29tcGV0ZSB3aXRoIG1haW4gcHJvYmUgY2hlY2tzKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcmVzaENhcmRIZWFsdGgoKTtcbiAgICAgIHJlZnJlc2hDYXJkVXBkYXRlcygpO1xuICAgIH0sIDUwMDApO1xuXG4gICAgLy8gUGVyaW9kaWMgcmVmcmVzaCBldmVyeSA2MCBzZWNvbmRzIFx1MjAxNCBub3RpZnkgb24gbmV3IHVwZGF0ZXMgZGV0ZWN0ZWRcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICByZWZyZXNoQ2FyZEhlYWx0aCgpO1xuICAgICAgcmVmcmVzaENhcmRVcGRhdGVzKHRydWUpOyAvLyB0cnVlID0gbm90aWZ5IGlmIG5ldyB1cGRhdGVzIGZvdW5kXG4gICAgfSwgNjAwMDApO1xuICB9XG5cbiAgLy8gSG9vayBpbnRvIG1haW4gcmVmcmVzaCBjeWNsZVxuICBjb25zdCBvcmlnUmVmcmVzaEFsbCA9IHdpbmRvdy5yZWZyZXNoQWxsO1xuICBpZiAob3JpZ1JlZnJlc2hBbGwpIHtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ1JlZnJlc2hBbGwoKTtcbiAgICAgICAgLy8gUmVmcmVzaCBoZWFsdGggZGF0YSBhZnRlciBtYWluIHN0YXR1cyBjaGVja1xuICAgICAgICBzZXRUaW1lb3V0KHJlZnJlc2hDYXJkSGVhbHRoLCAxMDAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIEVycm9yIGluIHJlZnJlc2hBbGwgaG9vazonLCBlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzY2hlZHVsZUNhcmRFbmhhbmNlbWVudHMoKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFRIRU1FIFBJQ0tFUiArIFRIRU1FIEJVSUxERVIgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoZW1lQmVmb3JlQnVpbGRlciA9IG51bGw7XG4gIHZhciBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gIHZhciBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9OyAvLyB0cmFja3Mgd2hpY2ggYWR2YW5jZWQgZmllbGRzIHVzZXIgbWFudWFsbHkgY2hhbmdlZFxuXG4gIC8vIERpc3BsYXkgbmFtZXMgZm9yIGJ1aWx0LWluIHRoZW1lc1xuICB2YXIgVEhFTUVfTEFCRUxTID0ge1xuICAgIGRhcms6ICdEYXJrJyxcbiAgICBsaWdodDogJ0xpZ2h0JyxcbiAgICBibHVlOiAnQmx1ZScsXG4gICAgYmxhY2s6ICdCbGFjaycsXG4gICAgbm9yZDogJ05vcmQnLFxuICAgIGRyYWN1bGE6ICdEcmFjdWxhJyxcbiAgICAnc29sYXJpemVkLWRhcmsnOiAnU29sYXJpemVkIERhcmsnLFxuICAgICdzb2xhcml6ZWQtbGlnaHQnOiAnU29sYXJpemVkIExpZ2h0JyxcbiAgICB0YXhpOiAnVGF4aScsXG4gICAgb2NlYW46ICdPY2VhbicsXG4gIH07XG5cbiAgLy8gQ29sb3IgcGlja2VyIGZpZWxkIGRlZmluaXRpb25zOiBbY3NzLXByb3AsIGxhYmVsLCBzZWN0aW9uXVxuICB2YXIgRklFTERTID0gW1xuICAgIFsnYmcnLCAgICAgICAgICAgICdCYWNrZ3JvdW5kJywgICAgJ2Jhc2UnXSxcbiAgICBbJ2NhcmQtYmFzZScsICAgICAnQ2FyZCcsICAgICAgICAgICdiYXNlJ10sXG4gICAgWydmZycsICAgICAgICAgICAgJ1RleHQnLCAgICAgICAgICAnYmFzZSddLFxuICAgIFsnbXV0ZWQnLCAgICAgICAgICdNdXRlZCBUZXh0JywgICAgJ2Jhc2UnXSxcbiAgICBbJ2JvcmRlcicsICAgICAgICAnQm9yZGVyJywgICAgICAgICdiYXNlJ10sXG4gICAgWydhY2NlbnQnLCAgICAgICAgJ0FjY2VudCcsICAgICAgICAnYWNjZW50J10sXG4gICAgWydhY2NlbnQtc3Ryb25nJywgJ0FjY2VudCBTdHJvbmcnLCAnYWNjZW50J10sXG4gICAgWydvay1iZycsICAgICAgICAgJ09LIEJhY2tncm91bmQnLCAnc3RhdHVzJ10sXG4gICAgWydvay1mZycsICAgICAgICAgJ09LIFRleHQnLCAgICAgICAnc3RhdHVzJ10sXG4gICAgWydiYWQtYmcnLCAgICAgICAgJ0Vycm9yIEJnJywgICAgICAnc3RhdHVzJ10sXG4gICAgWydiYWQtZmcnLCAgICAgICAgJ0Vycm9yIFRleHQnLCAgICAnc3RhdHVzJ10sXG4gICAgWydkb3Qtb2snLCAgICAgICAgJ0RvdCBPSycsICAgICAgICAnc3RhdHVzJ10sXG4gICAgWydkb3QtYmFkJywgICAgICAgJ0RvdCBFcnJvcicsICAgICAnc3RhdHVzJ10sXG4gICAgWyd1cHRpbWUnLCAgICAgICAgJ1VwdGltZSBCYXInLCAgICAnc3RhdHVzJ10sXG4gICAgWydob3ZlcicsICAgICAgICAgJ0hvdmVyJywgICAgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2NhcmQtaG92ZXInLCAgICAnQ2FyZCBIb3ZlcicsICAgICdhZHZhbmNlZCddLFxuICAgIFsnYmFzZScsICAgICAgICAgICdUYWdzL0JhZGdlcycsICAgJ2FkdmFuY2VkJ10sXG4gICAgWydmZy1tdXRlZCcsICAgICAgJ0RpbSBUZXh0JywgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ3N1Y2Nlc3MnLCAgICAgICAnU3VjY2VzcycsICAgICAgICdhZHZhbmNlZCddLFxuICAgIFsnZXJyb3InLCAgICAgICAgICdFcnJvcicsICAgICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWyd3YXJuaW5nJywgICAgICAgJ1dhcm5pbmcnLCAgICAgICAnYWR2YW5jZWQnXSxcbiAgXTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlbWUgQ3ljbGUgQnV0dG9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIHZhciB0aGVtZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZScpO1xuICBpZiAoIXRoZW1lQnRuKSByZXR1cm47XG4gIHZhciB0aGVtZUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWxhYmVsJyk7XG5cbiAgZnVuY3Rpb24gZ2V0TGFiZWxGb3IodCkge1xuICAgIGlmIChUSEVNRV9MQUJFTFNbdF0pIHJldHVybiBUSEVNRV9MQUJFTFNbdF07XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgaWYgKHVzZXJUaGVtZXNbdF0pIHJldHVybiB1c2VyVGhlbWVzW3RdLm5hbWUgfHwgdDtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxhYmVsKCkge1xuICAgIGlmICh0aGVtZUxhYmVsKSB0aGVtZUxhYmVsLnRleHRDb250ZW50ID0gZ2V0TGFiZWxGb3Iod2luZG93LmdldEFjdGl2ZVRoZW1lKCkpO1xuICB9XG5cbiAgdGhlbWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxpc3QgPSB3aW5kb3cuVEhFTUVTLnNsaWNlKCk7XG4gICAgdmFyIGN1cnJlbnQgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICB2YXIgaWR4ID0gbGlzdC5pbmRleE9mKGN1cnJlbnQpO1xuICAgIHZhciBuZXh0ID0gbGlzdFsoaWR4ICsgMSkgJSBsaXN0Lmxlbmd0aF07XG4gICAgd2luZG93LmFwcGx5VGhlbWUobmV4dCk7XG4gICAgdXBkYXRlTGFiZWwoKTtcbiAgfSk7XG5cbiAgdXBkYXRlTGFiZWwoKTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlbWUgQnVpbGRlciBNb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBidWlsZEZpZWxkc0hUTUwoKSB7XG4gICAgdmFyIHNlY3Rpb25zID0geyBiYXNlOiAnQmFzZSBDb2xvcnMnLCBhY2NlbnQ6ICdBY2NlbnQnLCBzdGF0dXM6ICdTdGF0dXMnLCBhZHZhbmNlZDogJ0FkdmFuY2VkIChhdXRvLWRlcml2ZWQpJyB9O1xuICAgIHZhciBncm91cGVkID0ge307XG4gICAgRklFTERTLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgIGlmICghZ3JvdXBlZFtmWzJdXSkgZ3JvdXBlZFtmWzJdXSA9IFtdO1xuICAgICAgZ3JvdXBlZFtmWzJdXS5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgdmFyIGh0bWwgPSAnJztcbiAgICBPYmplY3Qua2V5cyhzZWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnYWR2YW5jZWQnKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLWFkdmFuY2VkLXRvZ2dsZVwiIGNsYXNzPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGVcIiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgNHB4O2N1cnNvcjpwb2ludGVyO2NvbG9yOnZhcigtLWFjY2VudCk7Zm9udC1zaXplOi44NXJlbTt1c2VyLXNlbGVjdDpub25lO1wiPlNob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDs8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZFwiIGNsYXNzPVwidGhlbWUtYnVpbGRlci1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXNlY3Rpb25cIj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItc2VjdGlvbi10aXRsZVwiPicgKyBzZWN0aW9uc1trZXldICsgJzwvZGl2Pic7XG4gICAgICAoZ3JvdXBlZFtrZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXJvd1wiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItbGFiZWxcIj4nICsgZlsxXSArICc8L3NwYW4+JyArXG4gICAgICAgICAgJzxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItY29sb3JcIiBkYXRhLXByb3A9XCInICsgZlswXSArICdcIicgKyAoa2V5ID09PSAnYWR2YW5jZWQnID8gJyBkYXRhLWFkdmFuY2VkPVwiMVwiJyA6ICcnKSArICcgdmFsdWU9XCIjMDAwMDAwXCIgLz4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWhleFwiIGRhdGEtaGV4PVwiJyArIGZbMF0gKyAnXCI+IzAwMDAwMDwvc3Bhbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9KTtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3RhcnRGcm9tT3B0aW9ucygpIHtcbiAgICByZXR1cm4gd2luZG93LlRIRU1FUy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAnPG9wdGlvbiB2YWx1ZT1cIicgKyB0ICsgJ1wiPicgKyBnZXRMYWJlbEZvcih0KSArICc8L29wdGlvbj4nO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgdmFyIG1vZGFsSFRNTCA9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6NDIwcHg7bWF4LXdpZHRoOjU2MHB4O1wiPicgK1xuICAgICc8aDM+VGhlbWUgQnVpbGRlcjwvaDM+JyArXG5cbiAgICAvLyBFZGl0IGV4aXN0aW5nIHVzZXIgdGhlbWVzIGRyb3Bkb3duXG4gICAgJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLWV4aXN0aW5nXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7ZGlzcGxheTpub25lO1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPkVkaXQ6PC9sYWJlbD4nICtcbiAgICAnPHNlbGVjdCBpZD1cInRoZW1lLWJ1aWxkZXItZWRpdC1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1jYXJkLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouODVyZW07bWFyZ2luLXJpZ2h0OjhweDtcIj4nICtcbiAgICAnPG9wdGlvbiB2YWx1ZT1cIlwiPlx1MjAxNCBOZXcgVGhlbWUgXHUyMDE0PC9vcHRpb24+JyArXG4gICAgJzwvc2VsZWN0PicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1kZWxldGVcIiBzdHlsZT1cInBhZGRpbmc6NHB4IDEwcHg7YmFja2dyb3VuZDpjb2xvci1taXgoaW4gc3JnYix2YXIoLS1iYWQtZmcpIDE1JSx0cmFuc3BhcmVudCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1iYWQtZmcpO2NvbG9yOnZhcigtLWJhZC1mZyk7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44cmVtO2N1cnNvcjpwb2ludGVyO1wiPkRlbGV0ZTwvYnV0dG9uPicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPk5hbWU6PC9sYWJlbD4nICtcbiAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0aGVtZS1idWlsZGVyLW5hbWVcIiBtYXhsZW5ndGg9XCIyMFwiIHBsYWNlaG9sZGVyPVwiTXkgVGhlbWVcIiAnICtcbiAgICAnc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6Ljg1cmVtO3dpZHRoOjE0MHB4O1wiIC8+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtjdXJzb3I6cG9pbnRlcjtcIiBmb3I9XCJ0aGVtZS1idWlsZGVyLWxpZ2h0YmdcIj4nICtcbiAgICAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwidGhlbWUtYnVpbGRlci1saWdodGJnXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NnB4O2N1cnNvcjpwb2ludGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIiAvPicgK1xuICAgICdMaWdodCBiYWNrZ3JvdW5kICh1c2UgZGFyayBsb2dvKTwvbGFiZWw+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+JyArXG4gICAgJzxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTouODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1yaWdodDo4cHg7XCI+U3RhcnQgZnJvbTo8L2xhYmVsPicgK1xuICAgICc8c2VsZWN0IGlkPVwidGhlbWUtYnVpbGRlci1zdGFydFwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44NXJlbTtcIj4nICtcbiAgICBidWlsZFN0YXJ0RnJvbU9wdGlvbnMoKSArXG4gICAgJzwvc2VsZWN0PicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1wcmV2aWV3XCIgaWQ9XCJ0aGVtZS1idWlsZGVyLXByZXZpZXdcIj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItY2FyZFwiIGlkPVwidGhlbWUtcHJldmlldy1jYXJkXCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LXRpdGxlXCI+U2FtcGxlIENhcmQ8L2Rpdj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInByZXZpZXctbXV0ZWRcIj5TZWNvbmRhcnkgdGV4dCBwcmV2aWV3PC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LWJhZGdlc1wiPicgK1xuICAgICc8c3BhbiBjbGFzcz1cInByZXZpZXctYmFkZ2VcIiBpZD1cInByZXZpZXctYmFkZ2Utb2tcIj5PTjwvc3Bhbj4nICtcbiAgICAnPHNwYW4gY2xhc3M9XCJwcmV2aWV3LWJhZGdlXCIgaWQ9XCJwcmV2aWV3LWJhZGdlLWJhZFwiPk9GRjwvc3Bhbj4nICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LWRvdHNcIj4nICtcbiAgICAnPHNwYW4+PHNwYW4gY2xhc3M9XCJwcmV2aWV3LWRvdFwiIGlkPVwicHJldmlldy1kb3Qtb2tcIj48L3NwYW4+IE9ubGluZTwvc3Bhbj4nICtcbiAgICAnPHNwYW4+PHNwYW4gY2xhc3M9XCJwcmV2aWV3LWRvdFwiIGlkPVwicHJldmlldy1kb3QtYmFkXCI+PC9zcGFuPiBPZmZsaW5lPC9zcGFuPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPGJ1dHRvbiBjbGFzcz1cInByZXZpZXctYnRuXCIgaWQ9XCJwcmV2aWV3LWFjY2VudC1idG5cIj5BY2NlbnQgQnV0dG9uPC9idXR0b24+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgIGJ1aWxkRmllbGRzSFRNTCgpICtcblxuICAgICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1pbXBvcnRcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87XCIgdGl0bGU9XCJJbXBvcnQgdGhlbWUgZnJvbSBKU09OIGZpbGVcIj5JbXBvcnQ8L2J1dHRvbj4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItZXhwb3J0XCIgdGl0bGU9XCJFeHBvcnQgdGhlbWUgYXMgSlNPTiBmaWxlXCI+RXhwb3J0PC9idXR0b24+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlIFRoZW1lPC9idXR0b24+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8L2Rpdj48L2Rpdj4nO1xuXG4gIGluamVjdE1vZGFsKCd0aGVtZS1idWlsZGVyLW1vZGFsJywgbW9kYWxIVE1MKTtcblxuICB2YXIgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1tb2RhbCcpO1xuICB2YXIgc3RhcnRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1zdGFydCcpO1xuICB2YXIgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbmFtZScpO1xuICB2YXIgZWRpdFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWVkaXQtc2VsZWN0Jyk7XG4gIHZhciBleGlzdGluZ1NlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leGlzdGluZycpO1xuICB2YXIgbGlnaHRCZ0NoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbGlnaHRiZycpO1xuICB2YXIgcGlja2VycyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGVtZS1idWlsZGVyLWNvbG9yJyk7XG4gIHZhciBhZHZhbmNlZFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1hZHZhbmNlZCcpO1xuICB2YXIgYWR2YW5jZWRUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGUnKTtcbiAgdmFyIGV4cG9ydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWV4cG9ydCcpO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZHZhbmNlZCB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgdmFyIGFkdmFuY2VkVmlzaWJsZSA9IGZhbHNlO1xuICBhZHZhbmNlZFRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBhZHZhbmNlZFZpc2libGUgPSAhYWR2YW5jZWRWaXNpYmxlO1xuICAgIGFkdmFuY2VkU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gYWR2YW5jZWRWaXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgYWR2YW5jZWRUb2dnbGUuaW5uZXJIVE1MID0gYWR2YW5jZWRWaXNpYmxlXG4gICAgICA/ICdIaWRlIGFkdmFuY2VkIGNvbG9ycyAmIzk2NTA7J1xuICAgICAgOiAnU2hvdyBhZHZhbmNlZCBjb2xvcnMgJiM5NjYwOyc7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb2xvciBwaWNrZXIgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRDdXJyZW50Q29sb3JzKCkge1xuICAgIHZhciBjb2xvcnMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGNvbG9yc1twLmRhdGFzZXQucHJvcF0gPSBwLnZhbHVlO1xuICAgIH0pO1xuICAgIGNvbG9yc1snY2FyZC1iZyddID0gY29sb3JzWydjYXJkLWJhc2UnXTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmFzZUNvbG9ycygpIHtcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAoIXAuZGF0YXNldC5hZHZhbmNlZCkgY29sb3JzW3AuZGF0YXNldC5wcm9wXSA9IHAudmFsdWU7XG4gICAgfSk7XG4gICAgY29sb3JzWydjYXJkLWJnJ10gPSBjb2xvcnNbJ2NhcmQtYmFzZSddO1xuICAgIGlmIChsaWdodEJnQ2hlY2suY2hlY2tlZCkgY29sb3JzLmxpZ2h0QmcgPSB0cnVlO1xuICAgIHJldHVybiBjb2xvcnM7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCkge1xuICAgIHZhciBiYXNlID0gZ2V0QmFzZUNvbG9ycygpO1xuICAgIHZhciBkZXJpdmVkID0gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzID8gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzKGJhc2UpIDoge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkICYmICFhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgdmFyIHZhbCA9IGRlcml2ZWRbcC5kYXRhc2V0LnByb3BdIHx8ICcjMzMzMzMzJztcbiAgICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gdmFsLnRvVXBwZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkVGhlbWVJbnRvUGlja2Vycyh0aGVtZU5hbWUpIHtcbiAgICB2YXIgY29sb3JzID0gd2luZG93LlRIRU1FX0NPTE9SU1t0aGVtZU5hbWVdO1xuICAgIGlmICghY29sb3JzKSByZXR1cm47XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIHZhciB2YWwgPSBjb2xvcnNbcC5kYXRhc2V0LnByb3BdIHx8ICcjMDAwMDAwJztcbiAgICAgIGlmICh2YWwuc3RhcnRzV2l0aCgncmdiYScpIHx8IHZhbC5zdGFydHNXaXRoKCdjb2xvci1taXgnKSkgdmFsID0gJyMzMzMzMzMnO1xuICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgICBsaWdodEJnQ2hlY2suY2hlY2tlZCA9ICEhY29sb3JzLmxpZ2h0Qmc7XG4gICAgdXBkYXRlUHJldmlldygpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZFVzZXJUaGVtZUludG9QaWNrZXJzKHNsdWcpIHtcbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgdGhlbWUgPSB1c2VyVGhlbWVzW3NsdWddO1xuICAgIGlmICghdGhlbWUpIHJldHVybjtcbiAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgdmFyIHZhbCA9IHRoZW1lW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgLy8gSWYgdGhlbWUgaGFzIGV4cGxpY2l0IGFkdmFuY2VkIHZhbHVlcywgbWFyayBhcyBvdmVycmlkZGVuXG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkICYmIHRoZW1lW3AuZGF0YXNldC5wcm9wXSkge1xuICAgICAgICBhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5hbWVJbnB1dC52YWx1ZSA9IHRoZW1lLm5hbWUgfHwgJyc7XG4gICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIXRoZW1lLmxpZ2h0Qmc7XG4gICAgLy8gRmlsbCBhbnkgbWlzc2luZyBhZHZhbmNlZCBmaWVsZHMgZnJvbSBkZXJpdmF0aW9uXG4gICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVByZXZpZXcoKSB7XG4gICAgdmFyIGMgPSBnZXRDdXJyZW50Q29sb3JzKCk7XG4gICAgdmFyIHByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1wcmV2aWV3Jyk7XG4gICAgdmFyIGNhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtcHJldmlldy1jYXJkJyk7XG4gICAgdmFyIHRpdGxlID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucHJldmlldy10aXRsZScpO1xuICAgIHZhciBtdXRlZCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnByZXZpZXctbXV0ZWQnKTtcbiAgICB2YXIgYmFkZ2VPayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWJhZGdlLW9rJyk7XG4gICAgdmFyIGJhZGdlQmFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctYmFkZ2UtYmFkJyk7XG4gICAgdmFyIGRvdE9rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctZG90LW9rJyk7XG4gICAgdmFyIGRvdEJhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWRvdC1iYWQnKTtcbiAgICB2YXIgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctYWNjZW50LWJ0bicpO1xuICAgIHZhciBkb3RzID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucHJldmlldy1kb3RzJyk7XG5cbiAgICBwcmV2aWV3LnN0eWxlLmJhY2tncm91bmQgPSBjWydiZyddO1xuICAgIGNhcmQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2NhcmQtYmFzZSddO1xuICAgIGNhcmQuc3R5bGUuYm9yZGVyQ29sb3IgPSBjWydib3JkZXInXTtcbiAgICB0aXRsZS5zdHlsZS5jb2xvciA9IGNbJ2ZnJ107XG4gICAgbXV0ZWQuc3R5bGUuY29sb3IgPSBjWydtdXRlZCddO1xuICAgIGJhZGdlT2suc3R5bGUuYmFja2dyb3VuZCA9IGNbJ29rLWJnJ107XG4gICAgYmFkZ2VPay5zdHlsZS5jb2xvciA9IGNbJ29rLWZnJ107XG4gICAgYmFkZ2VCYWQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2JhZC1iZyddO1xuICAgIGJhZGdlQmFkLnN0eWxlLmNvbG9yID0gY1snYmFkLWZnJ107XG4gICAgZG90T2suc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2RvdC1vayddO1xuICAgIGRvdEJhZC5zdHlsZS5iYWNrZ3JvdW5kID0gY1snZG90LWJhZCddO1xuICAgIGRvdHMuc3R5bGUuY29sb3IgPSBjWydmZyddO1xuICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gY1snYWNjZW50J107XG4gICAgYnRuLnN0eWxlLmNvbG9yID0gY1snYmcnXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5Q29sb3JzTGl2ZShjb2xvcnMpIHtcbiAgICAvLyBJbmNsdWRlIGRlcml2ZWQgY29sb3JzIGZvciBmdWxsIGxpdmUgcHJldmlld1xuICAgIHZhciBkZXJpdmVkID0gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzID8gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzKGNvbG9ycykgOiB7fTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgdmFyIHZhbCA9IGNvbG9yc1twcm9wXSB8fCBkZXJpdmVkW3Byb3BdO1xuICAgICAgaWYgKHZhbCkge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tJyArIHByb3AsIHZhbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIHVwIGNvbG9yIHBpY2tlcnNcbiAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgcC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSBwLnZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIC8vIFRyYWNrIG1hbnVhbCBhZHZhbmNlZCBvdmVycmlkZXNcbiAgICAgIGlmIChwLmRhdGFzZXQuYWR2YW5jZWQpIHtcbiAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJhc2UgY29sb3IgY2hhbmdlZCBcdTIwMTQgcmUtZGVyaXZlIGFkdmFuY2VkIHZhbHVlcyAodW5sZXNzIG92ZXJyaWRkZW4pXG4gICAgICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlUHJldmlldygpO1xuICAgICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIExpZ2h0LWJnIGNoZWNrYm94IHNob3VsZCByZS1kZXJpdmUgYWR2YW5jZWQgY29sb3JzXG4gIGxpZ2h0QmdDaGVjay5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgfSk7XG5cbiAgc3RhcnRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgbG9hZFRoZW1lSW50b1BpY2tlcnMoc3RhcnRTZWxlY3QudmFsdWUpO1xuICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICB9KTtcblxuICAvLyBQb3B1bGF0ZSBhbmQgcmVmcmVzaCB0aGUgZWRpdC1leGlzdGluZyBkcm9wZG93blxuICBmdW5jdGlvbiByZWZyZXNoRWRpdERyb3Bkb3duKCkge1xuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBzbHVncyA9IE9iamVjdC5rZXlzKHVzZXJUaGVtZXMpO1xuICAgIGVkaXRTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTmV3IFRoZW1lIFx1MjAxNDwvb3B0aW9uPic7XG4gICAgc2x1Z3MuZm9yRWFjaChmdW5jdGlvbiAoc2x1Zykge1xuICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0LnZhbHVlID0gc2x1ZztcbiAgICAgIG9wdC50ZXh0Q29udGVudCA9IHVzZXJUaGVtZXNbc2x1Z10ubmFtZSB8fCBzbHVnO1xuICAgICAgZWRpdFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgIH0pO1xuICAgIGV4aXN0aW5nU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gc2x1Z3MubGVuZ3RoID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICAvLyBBbHNvIHJlZnJlc2ggXCJTdGFydCBmcm9tXCIgb3B0aW9uc1xuICBmdW5jdGlvbiByZWZyZXNoU3RhcnRGcm9tKCkge1xuICAgIHN0YXJ0U2VsZWN0LmlubmVySFRNTCA9IGJ1aWxkU3RhcnRGcm9tT3B0aW9ucygpO1xuICB9XG5cbiAgLy8gRWRpdCBkcm9wZG93biBjaGFuZ2VcbiAgZWRpdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNsdWcgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChzbHVnKSB7XG4gICAgICBlZGl0aW5nU2x1ZyA9IHNsdWc7XG4gICAgICBsb2FkVXNlclRoZW1lSW50b1BpY2tlcnMoc2x1Zyk7XG4gICAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc3RhcnRTZWxlY3QudmFsdWUgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICAgIGxvYWRUaGVtZUludG9QaWNrZXJzKHN0YXJ0U2VsZWN0LnZhbHVlKTtcbiAgICB9XG4gICAgZXhwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSBlZGl0aW5nU2x1ZyA/ICcnIDogJ25vbmUnO1xuICB9KTtcblxuICBmdW5jdGlvbiBvcGVuQnVpbGRlcigpIHtcbiAgICB0aGVtZUJlZm9yZUJ1aWxkZXIgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcblxuICAgIC8vIFJlc2V0IGFkdmFuY2VkIHNlY3Rpb24gdG8gY29sbGFwc2VkXG4gICAgYWR2YW5jZWRWaXNpYmxlID0gZmFsc2U7XG4gICAgYWR2YW5jZWRTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYWR2YW5jZWRUb2dnbGUuaW5uZXJIVE1MID0gJ1Nob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDsnO1xuXG4gICAgcmVmcmVzaEVkaXREcm9wZG93bigpO1xuICAgIHJlZnJlc2hTdGFydEZyb20oKTtcblxuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIGlmICh1c2VyVGhlbWVzW3RoZW1lQmVmb3JlQnVpbGRlcl0pIHtcbiAgICAgIC8vIEFjdGl2ZSB0aGVtZSBpcyBhIHVzZXIgdGhlbWUgXHUyMDE0IG9wZW4gaXQgZm9yIGVkaXRpbmdcbiAgICAgIGVkaXRTZWxlY3QudmFsdWUgPSB0aGVtZUJlZm9yZUJ1aWxkZXI7XG4gICAgICBlZGl0aW5nU2x1ZyA9IHRoZW1lQmVmb3JlQnVpbGRlcjtcbiAgICAgIGxvYWRVc2VyVGhlbWVJbnRvUGlja2Vycyh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0U2VsZWN0LnZhbHVlID0gJyc7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHN0YXJ0U2VsZWN0LnZhbHVlID0gdGhlbWVCZWZvcmVCdWlsZGVyO1xuICAgICAgbG9hZFRoZW1lSW50b1BpY2tlcnModGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9XG5cbiAgICBleHBvcnRCdG4uc3R5bGUuZGlzcGxheSA9IGVkaXRpbmdTbHVnID8gJycgOiAnbm9uZSc7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgdmFyIGN1c3RvbWl6ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1jdXN0b21pemUtYnRuJyk7XG4gIGlmIChjdXN0b21pemVCdG4pIHtcbiAgICBjdXN0b21pemVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IG9wZW5CdWlsZGVyKCk7IH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNhdmUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItc2F2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb2xvcnMgPSBnZXRDdXJyZW50Q29sb3JzKCk7XG4gICAgdmFyIG5hbWUgPSBuYW1lSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdGhlbWUgbmFtZScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgICBuYW1lSW5wdXQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgc2x1ZztcbiAgICB2YXIgb2xkU2x1ZyA9IG51bGw7XG5cbiAgICBpZiAoZWRpdGluZ1NsdWcpIHtcbiAgICAgIHNsdWcgPSBlZGl0aW5nU2x1ZztcbiAgICAgIC8vIElmIG5hbWUgY2hhbmdlZCwgcmUtc2x1Z2lmeSBhbmQgcG90ZW50aWFsbHkgcmVuYW1lXG4gICAgICB2YXIgbmV3U2x1ZyA9IHdpbmRvdy5zbHVnaWZ5VGhlbWVOYW1lKG5hbWUsIGVkaXRpbmdTbHVnKTtcbiAgICAgIGlmIChuZXdTbHVnICE9PSBlZGl0aW5nU2x1Zykge1xuICAgICAgICBvbGRTbHVnID0gZWRpdGluZ1NsdWc7XG4gICAgICAgIGRlbGV0ZSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXTtcbiAgICAgICAgdmFyIGlkeCA9IHdpbmRvdy5USEVNRVMuaW5kZXhPZihlZGl0aW5nU2x1Zyk7XG4gICAgICAgIGlmIChpZHggIT09IC0xKSB3aW5kb3cuVEhFTUVTLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBkZWxldGUgd2luZG93LlRIRU1FX0NPTE9SU1tlZGl0aW5nU2x1Z107XG4gICAgICAgIHNsdWcgPSBuZXdTbHVnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzbHVnID0gd2luZG93LnNsdWdpZnlUaGVtZU5hbWUobmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlbWUgZGF0YSB3aXRoIEFMTCBjb2xvciBwcm9wZXJ0aWVzXG4gICAgdmFyIHRoZW1lRGF0YSA9IHsgbmFtZTogbmFtZSB9O1xuICAgIGlmIChsaWdodEJnQ2hlY2suY2hlY2tlZCkgdGhlbWVEYXRhLmxpZ2h0QmcgPSB0cnVlO1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAoY29sb3JzW3BdKSB0aGVtZURhdGFbcF0gPSBjb2xvcnNbcF07XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIGNhY2hlIGltbWVkaWF0ZWx5IGZvciBpbnN0YW50IFVJXG4gICAgdXNlclRoZW1lc1tzbHVnXSA9IHRoZW1lRGF0YTtcbiAgICBzYWZlU2V0KHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIEpTT04uc3RyaW5naWZ5KHVzZXJUaGVtZXMpKTtcblxuICAgIC8vIENsZWFyIGlubGluZSBwcmV2aWV3IHByb3BlcnRpZXNcbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG5cbiAgICAvLyBSZS1pbmplY3QgQ1NTIGFuZCBhcHBseVxuICAgIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMoKTtcbiAgICB3aW5kb3cuYXBwbHlUaGVtZShzbHVnKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgdXBkYXRlTGFiZWwoKTtcblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgdmFyIGFwaUNvbG9ycyA9IHt9O1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmIChjb2xvcnNbcF0pIGFwaUNvbG9yc1twXSA9IGNvbG9yc1twXTsgfSk7XG5cbiAgICAvLyBJZiBzbHVnIGNoYW5nZWQsIGRlbGV0ZSB0aGUgb2xkIG9uZSBmcm9tIHNlcnZlclxuICAgIGlmIChvbGRTbHVnKSB7XG4gICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIG9sZFNsdWcsIHsgbWV0aG9kOiAnREVMRVRFJyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgfVxuXG4gICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBzbHVnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBuYW1lLCBjb2xvcnM6IGFwaUNvbG9ycywgbGlnaHRCZzogbGlnaHRCZ0NoZWNrLmNoZWNrZWQgfSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgc2F2ZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgc2F2ZWQgbG9jYWxseSAoc2VydmVyIHN5bmMgZmFpbGVkKScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDYW5jZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICBpZiAodGhlbWVCZWZvcmVCdWlsZGVyKSB7XG4gICAgICB3aW5kb3cuYXBwbHlUaGVtZSh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIERlbGV0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1kZWxldGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWVkaXRpbmdTbHVnKSByZXR1cm47XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgbmFtZSA9IHVzZXJUaGVtZXNbZWRpdGluZ1NsdWddID8gdXNlclRoZW1lc1tlZGl0aW5nU2x1Z10ubmFtZSA6IGVkaXRpbmdTbHVnO1xuXG4gICAgaWYgKCFjb25maXJtKCdEZWxldGUgXCInICsgbmFtZSArICdcIiB0aGVtZT8nKSkgcmV0dXJuO1xuXG4gICAgdmFyIHNsdWdUb0RlbGV0ZSA9IGVkaXRpbmdTbHVnO1xuXG4gICAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSBjYWNoZSBpbW1lZGlhdGVseVxuICAgIGRlbGV0ZSB1c2VyVGhlbWVzW3NsdWdUb0RlbGV0ZV07XG4gICAgc2FmZVNldCh3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VyVGhlbWVzKSk7XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBydW50aW1lXG4gICAgdmFyIGlkeCA9IHdpbmRvdy5USEVNRVMuaW5kZXhPZihzbHVnVG9EZWxldGUpO1xuICAgIGlmIChpZHggIT09IC0xKSB3aW5kb3cuVEhFTUVTLnNwbGljZShpZHgsIDEpO1xuICAgIGRlbGV0ZSB3aW5kb3cuVEhFTUVfQ09MT1JTW3NsdWdUb0RlbGV0ZV07XG5cbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgd2luZG93LmluamVjdFVzZXJUaGVtZVN0eWxlcygpO1xuXG4gICAgdmFyIGZhbGxiYWNrID0gdGhlbWVCZWZvcmVCdWlsZGVyICYmIHRoZW1lQmVmb3JlQnVpbGRlciAhPT0gc2x1Z1RvRGVsZXRlID8gdGhlbWVCZWZvcmVCdWlsZGVyIDogJ2RhcmsnO1xuICAgIHdpbmRvdy5hcHBseVRoZW1lKGZhbGxiYWNrKTtcblxuICAgIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgdXBkYXRlTGFiZWwoKTtcblxuICAgIC8vIERlbGV0ZSBmcm9tIHNlcnZlclxuICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Z1RvRGVsZXRlLCB7IG1ldGhvZDogJ0RFTEVURScgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIGRlbGV0ZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgZGVsZXRlZCBsb2NhbGx5IChzZXJ2ZXIgc3luYyBmYWlsZWQpJywgJ3dhcm5pbmcnLCAzMDAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV4cG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leHBvcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWVkaXRpbmdTbHVnKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdTYXZlIHRoZSB0aGVtZSBmaXJzdCwgdGhlbiBleHBvcnQnLCAnd2FybmluZycsIDMwMDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgdGhlbWUgPSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXTtcbiAgICBpZiAoIXRoZW1lKSByZXR1cm47XG5cbiAgICB2YXIgZXhwb3J0RGF0YSA9IHtcbiAgICAgIF9kYXNoY2FkZHlfdGhlbWU6IHRydWUsXG4gICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgIGV4cG9ydERhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHNsdWc6IGVkaXRpbmdTbHVnLFxuICAgICAgbmFtZTogdGhlbWUubmFtZSxcbiAgICAgIGxpZ2h0Qmc6IHRoZW1lLmxpZ2h0QmcgfHwgZmFsc2UsXG4gICAgICBjb2xvcnM6IHt9XG4gICAgfTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKHRoZW1lW3BdKSBleHBvcnREYXRhLmNvbG9yc1twXSA9IHRoZW1lW3BdO1xuICAgIH0pO1xuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZXhwb3J0RGF0YSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGVkaXRpbmdTbHVnICsgJy10aGVtZS5qc29uJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICBzaG93Tm90aWZpY2F0aW9uKCdUaGVtZSBleHBvcnRlZCBhcyAnICsgZWRpdGluZ1NsdWcgKyAnLXRoZW1lLmpzb24nLCAnc3VjY2VzcycsIDMwMDApO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW1wb3J0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWltcG9ydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBpbnB1dC5hY2NlcHQgPSAnLmpzb24nO1xuICAgIGlucHV0Lm9uY2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShldi50YXJnZXQucmVzdWx0KTtcblxuICAgICAgICAgIC8vIFN1cHBvcnQgYm90aCB3cmFwcGVkIGZvcm1hdCBhbmQgcmF3IHRoZW1lIGZvcm1hdFxuICAgICAgICAgIHZhciB0aGVtZU5hbWUsIHRoZW1lQ29sb3JzLCB0aGVtZUxpZ2h0Qmc7XG4gICAgICAgICAgaWYgKGRhdGEuX2Rhc2hjYWRkeV90aGVtZSAmJiBkYXRhLmNvbG9ycykge1xuICAgICAgICAgICAgLy8gV3JhcHBlZCBleHBvcnQgZm9ybWF0XG4gICAgICAgICAgICB0aGVtZU5hbWUgPSBkYXRhLm5hbWUgfHwgJ0ltcG9ydGVkJztcbiAgICAgICAgICAgIHRoZW1lQ29sb3JzID0gZGF0YS5jb2xvcnM7XG4gICAgICAgICAgICB0aGVtZUxpZ2h0QmcgPSBkYXRhLmxpZ2h0QmcgfHwgZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm5hbWUgJiYgKGRhdGEuYmcgfHwgZGF0YVsnY2FyZC1iYXNlJ10pKSB7XG4gICAgICAgICAgICAvLyBSYXcgdGhlbWUgSlNPTiAoc2FtZSBmb3JtYXQgYXMgc2VydmVyIGZpbGVzKVxuICAgICAgICAgICAgdGhlbWVOYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgdGhlbWVDb2xvcnMgPSB7fTtcbiAgICAgICAgICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmIChkYXRhW3BdKSB0aGVtZUNvbG9yc1twXSA9IGRhdGFbcF07IH0pO1xuICAgICAgICAgICAgdGhlbWVMaWdodEJnID0gZGF0YS5saWdodEJnIHx8IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIERhc2hDYWRkeSB0aGVtZSBmaWxlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTG9hZCBpbnRvIGJ1aWxkZXJcbiAgICAgICAgICBuYW1lSW5wdXQudmFsdWUgPSB0aGVtZU5hbWU7XG4gICAgICAgICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIXRoZW1lTGlnaHRCZztcbiAgICAgICAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgICAgICAgZWRpdFNlbGVjdC52YWx1ZSA9ICcnO1xuICAgICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG5cbiAgICAgICAgICAvLyBBcHBseSBjb2xvcnMgdG8gcGlja2Vyc1xuICAgICAgICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoZW1lQ29sb3JzW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICAgICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgICAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCAmJiB0aGVtZUNvbG9yc1twLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEZpbGwgYW55IG1pc3NpbmcgYWR2YW5jZWQgZmllbGRzXG4gICAgICAgICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgICAgICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICAgICAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgICAgICAgICBleHBvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcIicgKyB0aGVtZU5hbWUgKyAnXCIgbG9hZGVkIGludG8gYnVpbGRlci4gQ2xpY2sgU2F2ZSB0byBrZWVwIGl0LicsICdzdWNjZXNzJywgNTAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ltcG9ydCBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICB9O1xuICAgIGlucHV0LmNsaWNrKCk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBNb2RhbCBjbG9zZSBoYW5kbGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICB3aXJlTW9kYWwobW9kYWwpO1xuXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgICBpZiAodGhlbWVCZWZvcmVCdWlsZGVyKSB3aW5kb3cuYXBwbHlUaGVtZSh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuO1xuLy8gTGljZW5zZSBNYW5hZ2VtZW50IFVJXG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBsaWNlbnNlIG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2xpY2Vuc2UtbW9kYWwnLCBgPGRpdiBpZD1cImxpY2Vuc2UtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQyMHB4OyBtYXgtd2lkdGg6IDUyMHB4O1wiPlxuICAgICAgPGgzPkRhc2hDYWRkeSBMaWNlbnNlPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBBY3RpdmF0ZSBhIGxpY2Vuc2UgY29kZSB0byB1bmxvY2sgcHJlbWl1bSBmZWF0dXJlcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2Utc3RhdHVzLXNlY3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IHBhZGRpbmc6IDZweCAxNHB4OyBib3JkZXItcmFkaXVzOiAyMHB4OyBmb250LXNpemU6IDAuODVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJsaWNlbnNlLWJhZGdlLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJsaWNlbnNlLWJhZGdlLXRleHRcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1kZXRhaWxzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGxpbmUtaGVpZ2h0OiAxLjY7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtYWN0aXZhdGUtc2VjdGlvblwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5MaWNlbnNlIENvZGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJsaWNlbnNlLWNvZGUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkRDLVhYWFhYLVhYWFhYLVhYWFhYLVhYWFhYLVhYWFhYXCJcbiAgICAgICAgICBtYXhsZW5ndGg9XCIzNVwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAxcHg7XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5FbnRlciB5b3VyIGxpY2Vuc2UgY29kZSB0byBhY3RpdmF0ZSBwcmVtaXVtIGZlYXR1cmVzPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWZlYXR1cmVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDhweDsgZGlzcGxheTogYmxvY2s7XCI+UHJlbWl1bSBGZWF0dXJlczo8L2xhYmVsPlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1mZWF0dXJlLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWVycm9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMTUpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2Utc3VjY2Vzc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xNSk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxpY2Vuc2UtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxpY2Vuc2UtZGVhY3RpdmF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgYmFja2dyb3VuZDogdmFyKC0tYmFkLWJnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZWFjdGl2YXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsaWNlbnNlLWFjdGl2YXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+QWN0aXZhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLW1vZGFsJyk7XG4gIGNvbnN0IGNvZGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWNvZGUtaW5wdXQnKTtcbiAgY29uc3QgYWN0aXZhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1hY3RpdmF0ZScpO1xuICBjb25zdCBkZWFjdGl2YXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZGVhY3RpdmF0ZScpO1xuICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZXJyb3InKTtcbiAgY29uc3Qgc3VjY2Vzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2Utc3VjY2VzcycpO1xuICBjb25zdCBiYWRnZUljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZS1pY29uJyk7XG4gIGNvbnN0IGJhZGdlVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWJhZGdlLXRleHQnKTtcbiAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZScpO1xuICBjb25zdCBkZXRhaWxzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1kZXRhaWxzJyk7XG4gIGNvbnN0IGZlYXR1cmVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZmVhdHVyZS1saXN0Jyk7XG4gIGNvbnN0IGFjdGl2YXRlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWFjdGl2YXRlLXNlY3Rpb24nKTtcblxuICBsZXQgY3VycmVudFN0YXR1cyA9IG51bGw7XG5cbiAgZnVuY3Rpb24gaGlkZU1lc3NhZ2VzKCkge1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93U3VjY2Vzcyhtc2cpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBzdWNjZXNzRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyU3RhdHVzKHN0YXR1cykge1xuICAgIGN1cnJlbnRTdGF0dXMgPSBzdGF0dXM7XG5cbiAgICBpZiAoc3RhdHVzLmFjdGl2ZSkge1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDQ2LDIwNCwxMTMsMC4xNSknO1xuICAgICAgYmFkZ2Uuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICAgIGJhZGdlSWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNjA1JztcbiAgICAgIGJhZGdlVGV4dC50ZXh0Q29udGVudCA9ICdQcmVtaXVtIEFjdGl2ZSc7XG4gICAgICBjb25zdCBleHBpcnlMaW5lID0gc3RhdHVzLmxpZmV0aW1lXG4gICAgICAgID8gJzxkaXY+TGljZW5zZTogPHN0cm9uZz5MSUZFVElNRTwvc3Ryb25nPjwvZGl2PidcbiAgICAgICAgOiBgPGRpdj5FeHBpcmVzOiA8c3Ryb25nPiR7bmV3IERhdGUoc3RhdHVzLmV4cGlyZXNBdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9PC9zdHJvbmc+ICgke3N0YXR1cy5kYXlzUmVtYWluaW5nfSBkYXlzIHJlbWFpbmluZyk8L2Rpdj5gO1xuICAgICAgZGV0YWlsc0VsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdj5Db2RlOiA8Y29kZSBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+JHtzdGF0dXMuY29kZSB8fCAnKioqJ308L2NvZGU+PC9kaXY+XG4gICAgICAgICR7ZXhwaXJ5TGluZX1cbiAgICAgIGA7XG4gICAgICBhY3RpdmF0ZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBkZWFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDE0OSwxNjUsMTY2LDAuMTUpJztcbiAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICBiYWRnZUljb24udGV4dENvbnRlbnQgPSAnXFx1MjYwNic7XG4gICAgICBiYWRnZVRleHQudGV4dENvbnRlbnQgPSBzdGF0dXMuZXhwaXJlZCA/ICdMaWNlbnNlIEV4cGlyZWQnIDogJ0ZyZWUgVGllcic7XG4gICAgICBkZXRhaWxzRWwuaW5uZXJIVE1MID0gc3RhdHVzLmV4cGlyZWRcbiAgICAgICAgPyAnPGRpdj5Zb3VyIGxpY2Vuc2UgaGFzIGV4cGlyZWQuIEVudGVyIGEgbmV3IGNvZGUgdG8gcmVuZXcuPC9kaXY+J1xuICAgICAgICA6ICc8ZGl2PkVudGVyIGEgbGljZW5zZSBjb2RlIHRvIHVubG9jayBwcmVtaXVtIGZlYXR1cmVzLjwvZGl2Pic7XG4gICAgICBhY3RpdmF0ZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYWN0aXZhdGVCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgZGVhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBmZWF0dXJlIGxpc3RcbiAgICBjb25zdCBmZWF0dXJlcyA9IHN0YXR1cy5wcmVtaXVtRmVhdHVyZXMgfHwge307XG4gICAgY29uc3QgYWN0aXZlRmVhdHVyZXMgPSBuZXcgU2V0KHN0YXR1cy5mZWF0dXJlcyB8fCBbXSk7XG4gICAgZmVhdHVyZUxpc3QuaW5uZXJIVE1MID0gT2JqZWN0LmVudHJpZXMoZmVhdHVyZXMpLm1hcCgoW2tleSwgaW5mb10pID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZUZlYXR1cmVzLmhhcyhrZXkpO1xuICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7YWN0aXZlID8gJ1xcdTI3MDUnIDogJ1xcdUQ4M0RcXHVERDEyJ308L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPiR7aW5mby5uYW1lfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtpbmZvLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbGljZW5zZS9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmVuZGVyU3RhdHVzKGRhdGEubGljZW5zZSk7XG4gICAgICAgIHVwZGF0ZUhlYWRlckJhZGdlKGRhdGEubGljZW5zZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBsaWNlbnNlIHN0YXR1czonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlTGljZW5zZSgpIHtcbiAgICBjb25zdCBjb2RlID0gY29kZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHNob3dFcnJvcignUGxlYXNlIGVudGVyIGEgbGljZW5zZSBjb2RlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIGFjdGl2YXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdBY3RpdmF0aW5nLi4uJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbGljZW5zZS9hY3RpdmF0ZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dTdWNjZXNzKGRhdGEubWVzc2FnZSk7XG4gICAgICAgIGNvZGVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICByZW5kZXJTdGF0dXMoZGF0YS5saWNlbnNlKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTGljZW5zZSBhY3RpdmF0ZWQhIFByZW1pdW0gZmVhdHVyZXMgdW5sb2NrZWQuJywgJ3N1Y2Nlc3MnLCA1MDAwKTtcbiAgICAgICAgdXBkYXRlSGVhZGVyQmFkZ2UoZGF0YS5saWNlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dFcnJvcihkYXRhLmVycm9yIHx8ICdBY3RpdmF0aW9uIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2YXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdBY3RpdmF0ZSc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVhY3RpdmF0ZUxpY2Vuc2UoKSB7XG4gICAgaWYgKCFjb25maXJtKCdEZWFjdGl2YXRlIHlvdXIgbGljZW5zZT8gWW91IGNhbiByZXVzZSB0aGUgY29kZSBvbiBhbm90aGVyIG1hY2hpbmUuJykpIHJldHVybjtcblxuICAgIGRlYWN0aXZhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGRlYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnRGVhY3RpdmF0aW5nLi4uJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbGljZW5zZS9kZWFjdGl2YXRlJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93U3VjY2VzcyhkYXRhLm1lc3NhZ2UpO1xuICAgICAgICBhd2FpdCBsb2FkU3RhdHVzKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0xpY2Vuc2UgZGVhY3RpdmF0ZWQuJywgJ2luZm8nLCAzMDAwKTtcbiAgICAgICAgdXBkYXRlSGVhZGVyQmFkZ2UoeyBhY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd0Vycm9yKGRhdGEuZXJyb3IgfHwgJ0RlYWN0aXZhdGlvbiBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkZWFjdGl2YXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBkZWFjdGl2YXRlQnRuLnRleHRDb250ZW50ID0gJ0RlYWN0aXZhdGUnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUhlYWRlckJhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IHRvcGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN0YXR1cy10b3BiYXInKTtcbiAgICBjb25zdCBpY29uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS10b3BiYXItaWNvbicpO1xuICAgIGNvbnN0IHRleHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXRvcGJhci10ZXh0Jyk7XG4gICAgY29uc3QgdGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtdG9wYmFyLXRpbWUnKTtcbiAgICBpZiAoIXRvcGJhcikgcmV0dXJuO1xuXG4gICAgdG9wYmFyLmNsYXNzTmFtZSA9ICdsaWNlbnNlLXN0YXR1cy10b3BiYXIgJyArIChzdGF0dXMuYWN0aXZlID8gJ3ByZW1pdW0nIDogJ2ZyZWUnKTtcblxuICAgIGlmIChzdGF0dXMuYWN0aXZlKSB7XG4gICAgICBpY29uRWwudGV4dENvbnRlbnQgPSAnXFx1MjYwNSc7XG4gICAgICB0ZXh0RWwudGV4dENvbnRlbnQgPSAnUFJFTUlVTSc7XG4gICAgICBpZiAoc3RhdHVzLmxpZmV0aW1lKSB7XG4gICAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9ICdcXHUwMGI3IExJRkVUSU1FJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRheXMgPSBzdGF0dXMuZGF5c1JlbWFpbmluZztcbiAgICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gZGF5cyAhPSBudWxsID8gJ1xcdTAwYjcgJyArIGRheXMgKyAnZCByZW1haW5pbmcnIDogJyc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb25FbC50ZXh0Q29udGVudCA9ICdcXHUyNjA2JztcbiAgICAgIHRleHRFbC50ZXh0Q29udGVudCA9IHN0YXR1cy5leHBpcmVkID8gJ0VYUElSRUQnIDogJ0ZSRUUgVElFUic7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTGljZW5zZU1vZGFsKCkge1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIGxvYWRTdGF0dXMoKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICAvLyBGb3JtYXQgY29kZSBpbnB1dCBhcyB1c2VyIHR5cGVzIChhdXRvLWFkZCBkYXNoZXMpXG4gIGNvZGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkge1xuICAgIGxldCB2YWwgPSB0aGlzLnZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvW15BLVowLTktXS9nLCAnJyk7XG4gICAgLy8gRG9uJ3QgYXV0by1mb3JtYXQgaWYgdXNlciBpcyBkZWxldGluZ1xuICAgIGlmICh2YWwubGVuZ3RoID4gdGhpcy5fcHJldkxlbmd0aCkge1xuICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLy0vZywgJycpO1xuICAgICAgaWYgKHZhbC5sZW5ndGggPiAyICYmICF2YWwuc3RhcnRzV2l0aCgnREMnKSkge1xuICAgICAgICB2YWwgPSAnREMnICsgdmFsO1xuICAgICAgfVxuICAgICAgLy8gQWRkIGRhc2hlcyBhZnRlciBEQyBhbmQgZXZlcnkgNSBjaGFyc1xuICAgICAgaWYgKHZhbC5zdGFydHNXaXRoKCdEQycpICYmIHZhbC5sZW5ndGggPiAyKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gWydEQyddO1xuICAgICAgICBjb25zdCByZXN0ID0gdmFsLnN1YnN0cmluZygyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSA1KSB7XG4gICAgICAgICAgcGFydHMucHVzaChyZXN0LnN1YnN0cmluZyhpLCBpICsgNSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhbCA9IHBhcnRzLmpvaW4oJy0nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcHJldkxlbmd0aCA9IHZhbC5sZW5ndGg7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfSk7XG5cbiAgLy8gV2lyZSB1cCBldmVudHNcbiAgYWN0aXZhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhY3RpdmF0ZUxpY2Vuc2UpO1xuICBkZWFjdGl2YXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVhY3RpdmF0ZUxpY2Vuc2UpO1xuICBjb2RlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBhY3RpdmF0ZUxpY2Vuc2UoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtY2FuY2VsJykpO1xuICBjb25zdCB0b3BiYXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN0YXR1cy10b3BiYXInKTtcbiAgaWYgKHRvcGJhckVsKSB0b3BiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsICYmIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCkpO1xuXG4gIC8vIEV4cG9zZSBmb3Igb3RoZXIgbW9kdWxlcyB0byBvcGVuXG4gIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsID0gb3BlbkxpY2Vuc2VNb2RhbDtcblxuICAvLyBFeHBvc2UgZmVhdHVyZSBjaGVjayBmb3IgZnJvbnRlbmQgZ2F0aW5nXG4gIHdpbmRvdy5jaGVja1ByZW1pdW1GZWF0dXJlID0gYXN5bmMgZnVuY3Rpb24oZmVhdHVyZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvbGljZW5zZS9mZWF0dXJlLyR7ZmVhdHVyZX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIHJldHVybiBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgLy8gTG9hZCBzdGF0dXMgb24gcGFnZSBsb2FkXG4gIGxvYWRTdGF0dXMoKS50aGVuKHN0YXR1cyA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGF0dXMpIHVwZGF0ZUhlYWRlckJhZGdlKGN1cnJlbnRTdGF0dXMpO1xuICB9KTtcbn0pKCk7XG47XG4vLyBTaGFyZSBNb2RhbCBcdTIwMTQgREMtMDU4XG4vL1xuLy8gQWRtaW4gVUkgZm9yIERDLTA1MyBzaGFyZSByb3V0ZXMuIE9wZW5lZCBmcm9tIHRoZSBcIlNoYXJlXCIgYnV0dG9uIG9uIGVhY2hcbi8vIHNlcnZpY2UgY2FyZCAoYWRkZWQgaW4gY29yZS9ncmlkLmpzIG5leHQgdG8gdGhlIGV4aXN0aW5nIG9wdGlvbnMvZGVsZXRlXG4vLyBidXR0b25zKS4gVHdvIHRhYnM6XG4vLyAgIC0gUHVibGljIGxpbms6IHBpY2sgYSBUVEwgKDFoLzI0aC83ZCksIFBPU1QgL2FwaS92MS9zaGFyZSwgcmVuZGVyIHRoZVxuLy8gICAgIHJldHVybmVkIHVybFBhdGggd2l0aCBhIGNvcHkgYnV0dG9uICsgcmV2b2tlIGNvbnRyb2wuXG4vLyAgIC0gVGFpbHNjYWxlIGludml0ZTogZW50ZXIgYW4gZW1haWwsIFBPU1QgL2FwaS92MS9zaGFyZS90YWlsc2NhbGUsIHJlbmRlclxuLy8gICAgIGRlbGl2ZXJlZCBzdGF0dXMgKGluYm94IHZzIGRldi1jb25zb2xlIGZhbGxiYWNrIHZzIFVSTCBmYWxsYmFjaykuXG4vL1xuLy8gTW9kYWwgYWxzbyBsaXN0cyBvdXRzdGFuZGluZyBzaGFyZXMgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlIChHRVQgL2FwaS92MS9zaGFyZSlcbi8vIHdpdGggcmV2b2tlIGJ1dHRvbnMuIFRoZSBsaXN0IHJlZnJlc2hlcyBhZnRlciBldmVyeSBpc3N1ZS9yZXZva2UuXG4vL1xuLy8gQm90aCBpc3N1ZSBlbmRwb2ludHMgYXJlIFByby1nYXRlZCBvbiB0aGUgc2VydmVyIFx1MjAxNCB0aGUgbW9kYWwgc3VyZmFjZXMgYSA0MDJcbi8vIGFzIGFuIHVwZ3JhZGUgcHJvbXB0IChcIlNoYXJlIGlzIGEgUHJvIGZlYXR1cmUuIEFjdGl2YXRlIGEgbGljZW5zZSB0byB1bmxvY2suXCIpLlxuLy8gVGFpbHNjYWxlIGludml0ZXMgYWRkaXRpb25hbGx5IHJlcXVpcmUgdGFpbHNjYWxlQ29vcmQgY29uZmlndXJlZCBvbiB0aGUgaG9zdDtcbi8vIHRoZSBzZXJ2ZXIgcmV0dXJucyA0MDAgd2l0aCBhIGNsZWFyIG1lc3NhZ2Ugd2hlbiBtaXNzaW5nLlxuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAod2luZG93Ll9fZGNfMDU4X3NoYXJlX21vZGFsX2xvYWRlZCkgcmV0dXJuO1xuICB3aW5kb3cuX19kY18wNThfc2hhcmVfbW9kYWxfbG9hZGVkID0gdHJ1ZTtcblxuICBjb25zdCBUVExfT1BUSU9OUyA9IFtcbiAgICB7IG1zOiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICcxIGhvdXInIH0sXG4gICAgeyBtczogMjQgKiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICcyNCBob3VycycgfSxcbiAgICB7IG1zOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICc3IGRheXMnIH0sXG4gIF07XG5cbiAgaW5qZWN0TW9kYWwoJ3NoYXJlLW1vZGFsJywgYFxuICAgIDxkaXYgaWQ9XCJzaGFyZS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzaGFyZS1tb2RhbC10aXRsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0NjBweDsgbWF4LXdpZHRoOiA1ODBweDtcIj5cbiAgICAgICAgPGgzIGlkPVwic2hhcmUtbW9kYWwtdGl0bGVcIj5TaGFyZSA8c3BhbiBpZD1cInNoYXJlLW1vZGFsLXNlcnZpY2UtbmFtZVwiPlx1MjAyNjwvc3Bhbj48L2gzPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDtcIj5cbiAgICAgICAgICBDcmVhdGUgYSBwdWJsaWMgbGluayBvciBUYWlsc2NhbGUgaW52aXRlIHNvIHNvbWVvbmUgb3V0c2lkZSB5b3VyIG5ldHdvcmsgY2FuIGFjY2VzcyB0aGlzIHNlcnZpY2UuXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtdGFic1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS10YWIgYWN0aXZlXCIgZGF0YS10YWI9XCJwdWJsaWNcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMDsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWFjY2VudCk7IHBhZGRpbmc6IDhweCAxNHB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBQdWJsaWMgbGlua1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS10YWJcIiBkYXRhLXRhYj1cInRhaWxzY2FsZVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAwOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7IHBhZGRpbmc6IDhweCAxNHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBUYWlsc2NhbGUgaW52aXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGFyZS10YWItcGFuZWxcIiBkYXRhLXBhbmVsPVwicHVibGljXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgZm9yPVwic2hhcmUtcHVibGljLXR0bFwiPkxpbmsgZHVyYXRpb246PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2hhcmUtcHVibGljLXR0bFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW46IDZweCAwIDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgICAgJHtUVExfT1BUSU9OUy5tYXAobyA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7by5tc31cIj4ke28ubGFiZWx9PC9vcHRpb24+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLXB1YmxpYy1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgQ3JlYXRlIHNoYXJlIGxpbmtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXRhYi1wYW5lbFwiIGRhdGEtcGFuZWw9XCJ0YWlsc2NhbGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgZm9yPVwic2hhcmUtdHMtZW1haWxcIj5SZWNpcGllbnQgZW1haWw6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJzaGFyZS10cy1lbWFpbFwiIHR5cGU9XCJlbWFpbFwiIHBsYWNlaG9sZGVyPVwiYWxpY2VAZXhhbXBsZS5jb21cIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBtYXJnaW46IDZweCAwIDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDEycHg7XCI+XG4gICAgICAgICAgICBBIHNpbmdsZS11c2UgVGFpbHNjYWxlIHByZS1hdXRoIGtleSBpcyBnZW5lcmF0ZWQgYW5kIGVtYWlsZWQuIFRoZSBkZXZpY2Ugam9pbnMgeW91ciB0YWlsbmV0IGFuZCBpcyByb3V0ZWQgdG8gdGhpcyBzZXJ2aWNlIHZpYSBDYWRkeS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLXRzLWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6ICMwNDE0MWY7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBDcmVhdGUgVGFpbHNjYWxlIGludml0ZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwic2hhcmUtaXNzdWVkXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPlNoYXJlIGxpbms6PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwic2hhcmUtaXNzdWVkLXVybFwiIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHlcbiAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLWlzc3VlZC1jb3B5XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICBDb3B5XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwic2hhcmUtaXNzdWVkLW1ldGFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA4cHg7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDIzMSw3Niw2MCwwLjE1KTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLXN1Y2Nlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSg0NiwyMDQsMTEzLDAuMTUpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLW91dHN0YW5kaW5nXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPk91dHN0YW5kaW5nIHNoYXJlcyBmb3IgdGhpcyBzZXJ2aWNlPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwic2hhcmUtb3V0c3RhbmRpbmctbGlzdFwiIHN0eWxlPVwibWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLWNhbmNlbFwiIHR5cGU9XCJidXR0b25cIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1tb2RhbCcpO1xuICBjb25zdCBzZXJ2aWNlTmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLW1vZGFsLXNlcnZpY2UtbmFtZScpO1xuICBjb25zdCBpc3N1ZWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQnKTtcbiAgY29uc3QgaXNzdWVkVXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkLXVybCcpO1xuICBjb25zdCBpc3N1ZWRDb3B5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWlzc3VlZC1jb3B5Jyk7XG4gIGNvbnN0IGlzc3VlZE1ldGFFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQtbWV0YScpO1xuICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWVycm9yJyk7XG4gIGNvbnN0IHN1Y2Nlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1zdWNjZXNzJyk7XG4gIGNvbnN0IG91dHN0YW5kaW5nTGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLW91dHN0YW5kaW5nLWxpc3QnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWNhbmNlbCcpO1xuICBjb25zdCBwdWJsaWNDcmVhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtcHVibGljLWNyZWF0ZScpO1xuICBjb25zdCB0c0NyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS10cy1jcmVhdGUnKTtcbiAgY29uc3QgdHNFbWFpbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXRzLWVtYWlsJyk7XG4gIGNvbnN0IHB1YmxpY1R0bFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1wdWJsaWMtdHRsJyk7XG5cbiAgbGV0IGN1cnJlbnRTZXJ2aWNlID0gbnVsbDsgLy8geyBpZCwgbmFtZSB9XG4gIGxldCBhY3RpdmVUYWIgPSAncHVibGljJztcblxuICBmdW5jdGlvbiBoaWRlTWVzc2FnZXMoKSB7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93U3VjY2Vzcyhtc2cpIHtcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VjY2Vzc0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIGZ1bmN0aW9uIF9vcmlnaW5Gcm9tUGFnZSgpIHtcbiAgICAvLyBCdWlsZCB0aGUgYWJzb2x1dGUgc2hhcmUgVVJMIGZyb20gdGhlIHBhZ2UncyBjdXJyZW50IG9yaWdpbiBzbyB0aGVcbiAgICAvLyBsaW5rIGlzIGNvcnJlY3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB1c2VyIGlzIG9uIGh0dHA6Ly9sb2NhbGhvc3RcbiAgICAvLyAoZGV2KSBvciBodHRwczovL3N0YXR1cy5zYW1pIChwcm9kKS4gVGhlIHVybFBhdGggcmV0dXJuZWQgYnkgdGhlIEFQSVxuICAgIC8vIGlzIGEgcGF0aC1vbmx5IHN0cmluZyBzdGFydGluZyB3aXRoIC9zaGFyZS8uXG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gIH1cblxuICBmdW5jdGlvbiBfYWJzVXJsKHVybFBhdGgpIHtcbiAgICBpZiAodXJsUGF0aC5zdGFydHNXaXRoKCdodHRwJykpIHJldHVybiB1cmxQYXRoO1xuICAgIHJldHVybiBfb3JpZ2luRnJvbVBhZ2UoKSArIHVybFBhdGg7XG4gIH1cblxuICBmdW5jdGlvbiBfZm9ybWF0RXhwaXJ5KGlzbykge1xuICAgIGlmICghaXNvKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzbyk7XG4gICAgaWYgKE51bWJlci5pc05hTihkLmdldFRpbWUoKSkpIHJldHVybiAnJztcbiAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Zvcm1hdFJlbWFpbmluZyhtcykge1xuICAgIGlmIChtcyA8PSAwKSByZXR1cm4gJ2V4cGlyZWQnO1xuICAgIGNvbnN0IGggPSBNYXRoLmZsb29yKG1zIC8gMzYwMDAwMCk7XG4gICAgaWYgKGggPj0gMjQpIHJldHVybiBgJHtNYXRoLmZsb29yKGggLyAyNCl9ZCAke2ggJSAyNH1oIGxlZnRgO1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKChtcyAlIDM2MDAwMDApIC8gNjAwMDApO1xuICAgIHJldHVybiBgJHtofWggJHttfW0gbGVmdGA7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBY3RpdmVUYWIobmFtZSkge1xuICAgIGFjdGl2ZVRhYiA9IG5hbWU7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYnRuLmRhdGFzZXQudGFiID09PSBuYW1lO1xuICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGlzQWN0aXZlKTtcbiAgICAgIGJ0bi5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGlzQWN0aXZlID8gJ3ZhcigtLWFjY2VudCknIDogJ3RyYW5zcGFyZW50JztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGlzQWN0aXZlID8gJ3ZhcigtLWZnKScgOiAndmFyKC0tbXV0ZWQpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gaXNBY3RpdmUgPyAnNjAwJyA6ICc0MDAnO1xuICAgIH0pO1xuICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS10YWItcGFuZWwnKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgcC5zdHlsZS5kaXNwbGF5ID0gcC5kYXRhc2V0LnBhbmVsID09PSBuYW1lID8gJycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkT3V0c3RhbmRpbmcoKSB7XG4gICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nXHUyMDI2PC9zcGFuPic7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zaGFyZScsIHsgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBzaGFyZXMgbGlzdGVkLjwvc3Bhbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBjb25zdCBsaXN0ID0gKGJvZHkgJiYgYm9keS5kYXRhKSB8fCBbXTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gbGlzdC5maWx0ZXIocyA9PiBzLnNlcnZpY2VJZCA9PT0gY3VycmVudFNlcnZpY2UuaWQpO1xuICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vIG91dHN0YW5kaW5nIHNoYXJlcyBmb3IgdGhpcyBzZXJ2aWNlLjwvc3Bhbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSBmaWx0ZXJlZC5tYXAocyA9PiB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHMuZXhwaXJlc0F0ID8gX2Zvcm1hdFJlbWFpbmluZyhuZXcgRGF0ZShzLmV4cGlyZXNBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgOiAnJztcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtcm93XCIgZGF0YS1zaGFyZS1pZD1cIiR7ZXNjYXBlSHRtbChzLmlkKX1cIlxuICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDA7IGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz4ke3Mua2luZCA9PT0gJ3RhaWxzY2FsZScgPyAnVGFpbHNjYWxlJyA6ICdQdWJsaWMnfTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+IFx1MDBCNyBleHBpcmVzICR7ZXNjYXBlSHRtbChfZm9ybWF0RXhwaXJ5KHMuZXhwaXJlc0F0KSl9ICgke3JlbWFpbmluZ30pPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNoYXJlLXJldm9rZVwiIGRhdGEtc2hhcmUtaWQ9XCIke2VzY2FwZUh0bWwocy5pZCl9XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICBSZXZva2VcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSkuam9pbignJyk7XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtcmV2b2tlJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiByZXZva2VTaGFyZShidG4uZGF0YXNldC5zaGFyZUlkKSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBsb2FkIG91dHN0YW5kaW5nIHNoYXJlcy48L3NwYW4+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZXZva2VTaGFyZShpZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2hhcmUvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICAgIHNob3dFcnJvcihib2R5ICYmIGJvZHkuZXJyb3IgfHwgYFJldm9rZSBmYWlsZWQgKEhUVFAgJHtyZXNwLnN0YXR1c30pLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VjY2VzcygnU2hhcmUgcmV2b2tlZC4nKTtcbiAgICAgIGxvYWRPdXRzdGFuZGluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvciB3aGlsZSByZXZva2luZy4nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBpc3N1ZVB1YmxpYygpIHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgcHVibGljQ3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHB1YmxpY0NyZWF0ZUJ0bi50ZXh0Q29udGVudDtcbiAgICBwdWJsaWNDcmVhdGVCdG4udGV4dENvbnRlbnQgPSAnQ3JlYXRpbmdcdTIwMjYnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0dGxNcyA9IHBhcnNlSW50KHB1YmxpY1R0bFNlbGVjdC52YWx1ZSwgMTApO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NoYXJlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2VJZDogY3VycmVudFNlcnZpY2UuaWQsIHR0bE1zIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIXJlc3Aub2sgfHwgIWJvZHkuc3VjY2Vzcykge1xuICAgICAgICBfcmVuZGVyQXBpRXJyb3IocmVzcC5zdGF0dXMsIGJvZHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmxQYXRoID0gYm9keS5kYXRhLnVybFBhdGg7XG4gICAgICBpc3N1ZWRVcmxJbnB1dC52YWx1ZSA9IF9hYnNVcmwodXJsUGF0aCk7XG4gICAgICBpc3N1ZWRNZXRhRWwudGV4dENvbnRlbnQgPSBgUHVibGljIGxpbmsgXHUwMEI3IGV4cGlyZXMgJHtfZm9ybWF0RXhwaXJ5KGJvZHkuZGF0YS5leHBpcmVzQXQpfWA7XG4gICAgICBpc3N1ZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHNob3dTdWNjZXNzKCdTaGFyZSBsaW5rIGNyZWF0ZWQuJyk7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgY3JlYXRpbmcgc2hhcmUuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHB1YmxpY0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgcHVibGljQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaXNzdWVUYWlsc2NhbGUoKSB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVtYWlsID0gKHRzRW1haWxJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgIHNob3dFcnJvcignQSB2YWxpZCByZWNpcGllbnQgZW1haWwgaXMgcmVxdWlyZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHRzQ3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRzQ3JlYXRlQnRuLnRleHRDb250ZW50O1xuICAgIHRzQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nXHUyMDI2JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NoYXJlL3RhaWxzY2FsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlSWQ6IGN1cnJlbnRTZXJ2aWNlLmlkLCBlbWFpbCB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFyZXNwLm9rIHx8ICFib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgX3JlbmRlckFwaUVycm9yKHJlc3Auc3RhdHVzLCBib2R5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGFpbHNjYWxlIHNoYXJlcyBzaG93IHRoZSByYXcgdXJsUGF0aCAod2hpY2ggaXMgdGhlIHNoYXJlIFVSTCkgaWZcbiAgICAgIC8vIGVtYWlsIGRlbGl2ZXJ5IGZhaWxlZC4gVGhlIHNoYXJlIGl0c2VsZiBpcyBvbmUtc2hvdCBzbyB0aGUgYWRtaW5cbiAgICAgIC8vIGNhbiBtYW51YWxseSBwYXN0ZSB0aGUgbGluayBpbnRvIGEgY2hhdCBpZiBTTVRQIGZhaWxlZC5cbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gYm9keS5kYXRhICYmIGJvZHkuZGF0YS51cmxQYXRoO1xuICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgIGlzc3VlZFVybElucHV0LnZhbHVlID0gX2Fic1VybChmYWxsYmFjayk7XG4gICAgICAgIGlzc3VlZE1ldGFFbC50ZXh0Q29udGVudCA9IGBUYWlsc2NhbGUgaW52aXRlIFx1MDBCNyBlbWFpbGVkIHRvICR7ZW1haWx9IChvciB1c2UgdGhpcyBVUkwgbWFudWFsbHkgaWYgZGVsaXZlcnkgZmFpbGVkKS5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNzdWVkVXJsSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgaXNzdWVkTWV0YUVsLnRleHRDb250ZW50ID0gYFRhaWxzY2FsZSBpbnZpdGUgc2VudCB0byAke2VtYWlsfS5gO1xuICAgICAgfVxuICAgICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBzaG93U3VjY2VzcygnVGFpbHNjYWxlIGludml0ZSBjcmVhdGVkLicpO1xuICAgICAgdHNFbWFpbElucHV0LnZhbHVlID0gJyc7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgY3JlYXRpbmcgVGFpbHNjYWxlIGludml0ZS4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHNDcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRzQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckFwaUVycm9yKHN0YXR1cywgYm9keSkge1xuICAgIGNvbnN0IGVyciA9IChib2R5ICYmIGJvZHkuZXJyb3IpIHx8ICcnO1xuICAgIGlmIChzdGF0dXMgPT09IDQwMikge1xuICAgICAgc2hvd0Vycm9yKCdTaGFyZSBpcyBhIFBybyBmZWF0dXJlLiBBY3RpdmF0ZSBhIGxpY2Vuc2UgdG8gdW5sb2NrLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSA0MDAgJiYgL3RhaWxzY2FsZS9pLnRlc3QoZXJyKSkge1xuICAgICAgc2hvd0Vycm9yKCdUYWlsc2NhbGUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBob3N0LiBTZXQgdXAgVGFpbHNjYWxlIGluIHRoZSBkYXNoYm9hcmQgZmlyc3QuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgc2hvd0Vycm9yKCdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBzaGFyZSBzZXJ2aWNlcy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBzaG93RXJyb3IoJ1NlcnZpY2Ugbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNob3dFcnJvcihlcnIgfHwgYFJlcXVlc3QgZmFpbGVkIChIVFRQICR7c3RhdHVzfSkuYCk7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuU2hhcmVNb2RhbChzZXJ2aWNlKSB7XG4gICAgaWYgKCFzZXJ2aWNlIHx8ICFzZXJ2aWNlLmlkKSByZXR1cm47XG4gICAgY3VycmVudFNlcnZpY2UgPSB7IGlkOiBzZXJ2aWNlLmlkLCBuYW1lOiBzZXJ2aWNlLm5hbWUgfHwgc2VydmljZS5pZCB9O1xuICAgIHNlcnZpY2VOYW1lRWwudGV4dENvbnRlbnQgPSBjdXJyZW50U2VydmljZS5uYW1lO1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHNldEFjdGl2ZVRhYigncHVibGljJyk7XG4gICAgdHNFbWFpbElucHV0LnZhbHVlID0gJyc7XG4gICAgcHVibGljVHRsU2VsZWN0LnZhbHVlID0gU3RyaW5nKFRUTF9PUFRJT05TWzFdLm1zKTsgLy8gMjRoIGRlZmF1bHRcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gIH1cblxuICAvLyBXaXJlIGV2ZW50c1xuICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtdGFiJykuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldEFjdGl2ZVRhYihidG4uZGF0YXNldC50YWIpKTtcbiAgfSk7XG4gIHB1YmxpY0NyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGlzc3VlUHVibGljKTtcbiAgdHNDcmVhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpc3N1ZVRhaWxzY2FsZSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyBDb3B5LXRvLWNsaXBib2FyZCBmb3IgdGhlIGlzc3VlZCBzaGFyZSBVUkxcbiAgaXNzdWVkQ29weUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cmwgPSBpc3N1ZWRVcmxJbnB1dC52YWx1ZTtcbiAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIGJyb3dzZXJzIC8gdW5zYWZlIGNvbnRleHRzXG4gICAgICAgIGlzc3VlZFVybElucHV0LnNlbGVjdCgpO1xuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBpc3N1ZWRDb3B5QnRuLnRleHRDb250ZW50O1xuICAgICAgaXNzdWVkQ29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3BpZWQhJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpc3N1ZWRDb3B5QnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7IH0sIDEyMDApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignQ291bGQgbm90IGNvcHkgdG8gY2xpcGJvYXJkLiBTZWxlY3QgdGhlIFVSTCBtYW51YWxseS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEV4cG9zZSBmb3Igb3RoZXIgbW9kdWxlcyB0byBvcGVuXG4gIHdpbmRvdy5vcGVuU2hhcmVNb2RhbCA9IG9wZW5TaGFyZU1vZGFsO1xufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJDQUNDLFVBQVcsQ0FFVixZQUFZLGFBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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RUFBTSxVQUFVLElBQUksTUFBTSxFQUMxQncyQixFQUFnQixFQUNsQixDQUdBeDJCLEVBQU0saUJBQWlCLFlBQVksRUFBRSxRQUFROUUsR0FBTyxDQUNsREEsRUFBSSxpQkFBaUIsUUFBUyxJQUFNbzdCLEVBQWFwN0IsRUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUNuRSxDQUFDLEVBQ0R3NkIsRUFBZ0IsaUJBQWlCLFFBQVNrQixDQUFXLEVBQ3JEakIsRUFBWSxpQkFBaUIsUUFBU3FCLENBQWMsRUFDcEQzdUIsRUFBVSxpQkFBaUIsUUFBUyxJQUFNckksRUFBTSxVQUFVLE9BQU8sTUFBTSxDQUFDLEVBQ3hFLFVBQVVBLEVBQU9xSSxDQUFTLEVBRzFCa3RCLEVBQWMsaUJBQWlCLFFBQVMsU0FBWSxDQUNsRCxNQUFNNXZCLEVBQU0ydkIsRUFBZSxNQUMzQixHQUFLM3ZCLEVBQ0wsR0FBSSxDQUNFLFVBQVUsV0FBYSxVQUFVLFVBQVUsVUFDN0MsTUFBTSxVQUFVLFVBQVUsVUFBVUEsQ0FBRyxHQUd2QzJ2QixFQUFlLE9BQU8sRUFDdEIsU0FBUyxZQUFZLE1BQU0sR0FFN0IsTUFBTXVCLEVBQVd0QixFQUFjLFlBQy9CQSxFQUFjLFlBQWMsVUFDNUIsV0FBVyxJQUFNLENBQUVBLEVBQWMsWUFBY3NCLENBQVUsRUFBRyxJQUFJLENBQ2xFLE1BQVksQ0FDVjdDLEVBQVUsdURBQXVELENBQ25FLENBQ0YsQ0FBQyxFQUdELE9BQU8sZUFBaUJpRCxDQUMxQixHQUFHIiwKICAibmFtZXMiOiBbImxvZ29Nb2RhbCIsICJwcmV2aWV3RGFyayIsICJwcmV2aWV3TGlnaHQiLCAibG9nb1N0YXR1cyIsICJzYW1lQm90aENoZWNrYm94IiwgImR1YWxVcGxvYWRzIiwgInNpbmdsZVVwbG9hZCIsICJ1cGxvYWREYXJrIiwgInVwbG9hZExpZ2h0IiwgInVwbG9hZFNpbmdsZSIsICJicmFuZExvZ29EYXJrIiwgImJyYW5kTG9nb0xpZ2h0IiwgInRvcFJvdyIsICJkYXNoYm9hcmRUaXRsZUlucHV0IiwgIkRFRkFVTFRfVElUTEUiLCAicGVuZGluZ0RhcmtEYXRhIiwgInBlbmRpbmdMaWdodERhdGEiLCAicGVuZGluZ1NpbmdsZURhdGEiLCAiY3VycmVudFBvc2l0aW9uIiwgImN1cnJlbnRUaXRsZSIsICJyZWFkRmlsZUFzRGF0YVVSTCIsICJmaWxlIiwgImNhbGxiYWNrIiwgInJlYWRlciIsICJlIiwgImRhdGEiLCAiYXBwbHlMb2dvUG9zaXRpb24iLCAicG9zIiwgImJ0biIsICJhcHBseURhc2hib2FyZFRpdGxlIiwgInRpdGxlIiwgImhlYWRlclRpdGxlIiwgImxvYWRDdXN0b21Mb2dvIiwgInJlc3BvbnNlIiwgImVycm9yIiwgImlzQ3VzdG9tIiwgIm5ld1RpdGxlIiwgInBheWxvYWQiLCAidCIsICJmYXZpY29uTGluayIsICJmYXZpY29uUHJldmlldyIsICJmYXZpY29uU3RhdHVzIiwgInBlbmRpbmdGYXZpY29uRGF0YSIsICJmYXZpY29uVXBsb2FkIiwgImxvYWRDdXN0b21GYXZpY29uIiwgImV2ZW50IiwgInNldHRpbmdzVHpTZWxlY3QiLCAiY3VycmVudFR6IiwgInJlcyIsICJ0eiIsICJjZmciLCAic2VsZWN0RWwiLCAic2VsZWN0ZWRUeiIsICJ0aW1lem9uZXMiLCAiZGV0ZWN0ZWQiLCAib3B0IiwgImN1cnJlbnRDb25maWdUeXBlIiwgInNlcnZlckNvbmZpZyIsICJjaGVja1NlcnZlckNvbmZpZyIsICJzZXR1cFR6U2VsZWN0IiwgInNob3dTdGVwIiwgInN0ZXBJZCIsICJzdGVwIiwgInRhcmdldFN0ZXAiLCAic2hvd1N1bW1hcnkiLCAic3VtbWFyeUNvbnRlbnQiLCAiaHRtbCIsICJ0bGQiLCAiY2FOYW1lIiwgImRuc0lQIiwgImRuc1BvcnQiLCAiaXAiLCAiZG9tYWluIiwgImVtYWlsIiwgInJvdXRpbmdNb2RlIiwgImV4YW1wbGVVcmxzIiwgInNhdmVDb25maWdUb1NlcnZlciIsICJjb25maWciLCAiZmluaXNoU2V0dXAiLCAic2VsZWN0ZWRQcm92aWRlciIsICJzYXZlZFRvU2VydmVyIiwgImNvbmZpZ05hbWUiLCAic2F2ZUxvY2F0aW9uIiwgInN0ZXAxTmV4dCIsICJzZWxlY3RlZCIsICJza2lwQnRuIiwgInRsZElucHV0IiwgInByZXZpZXcxIiwgInByZXZpZXcyIiwgImhvbWVsYWJCYWNrIiwgImhvbWVsYWJOZXh0IiwgInNpbXBsZUJhY2siLCAic2ltcGxlTmV4dCIsICJyYWRpbyIsICJub3RlIiwgInB1YmxpY0JhY2siLCAicHVibGljTmV4dCIsICJzdW1tYXJ5QmFjayIsICJzdW1tYXJ5TmV4dCIsICJkaXNrU2FmZXR5QmFjayIsICJmaW5pc2hCdG4iLCAiY29uZmlnU3RyIiwgImVycm9ySGFuZGxlciIsICJBUFBTX0tFWSIsICJhcGlUZW1wbGF0ZXMiLCAiYXBpQ2F0ZWdvcmllcyIsICJtb2RhbCIsICJncmlkIiwgImZldGNoQXBwVGVtcGxhdGVzIiwgImNoZWNrUG9ydEF2YWlsYWJpbGl0eSIsICJwb3J0IiwgImdldFN1Z2dlc3RlZFBvcnQiLCAiYmFzZVBvcnQiLCAiYnVpbGRBcHBTZWxlY3RvciIsICJieUNhdGVnb3J5IiwgImFwcElkIiwgInRlbXBsYXRlIiwgImNhdGVnb3J5IiwgImNhdGVnb3J5T3JkZXIiLCAiYXBwcyIsICJhIiwgImIiLCAiaGVhZGVyIiwgImNhdGVnb3J5SW5mbyIsICJhcHAiLCAib3B0aW9uIiwgImlzV2lkZ2V0IiwgIndpZGdldEVuYWJsZWQiLCAid2lkZ2V0QmFkZ2UiLCAiZGlmZmljdWx0eUJhZGdlIiwgInRvZ2dsZURhc2hib2FyZFdpZGdldCIsICJzaG93RGVwbG95Q29uZmlnIiwgIm9wdGlvbkVsIiwgImtleSIsICJuZXdTdGF0ZSIsICJzZWxlY3RvciIsICJlbCIsICJiYWRnZSIsICJhcHBUZW1wbGF0ZSIsICJkZXBsb3lNb2RhbCIsICJzdWJkb21haW5JbnB1dCIsICJ1cmxQcmV2aWV3IiwgImlwSW5wdXQiLCAicG9ydElucHV0IiwgInRhaWxzY2FsZUNoZWNrYm94IiwgInRhaWxzY2FsZVN0YXR1cyIsICJjaGVja1Jlc3VsdCIsICJjb250YWluZXIiLCAiZGVmYXVsdFN1YmRvbWFpbiIsICJzdWJwYXRoV2FybmluZyIsICJzdXBwb3J0IiwgImNmZ0Ruc1R5cGUiLCAiY2ZnU3NsVHlwZSIsICJkbnNSYWRpbyIsICJzc2xSYWRpbyIsICJkbnNTZWN0aW9uIiwgImFkdmFuY2VkRGV0YWlscyIsICJhZHZhbmNlZENvbnRlbnQiLCAiZG5zU2VjdGlvbkVsIiwgInNzbFNlY3Rpb25FbCIsICJtZWRpYVBhdGhTZWN0aW9uIiwgIm1lZGlhUGF0aElucHV0IiwgIm1lZGlhUGF0aERlc2NyaXB0aW9uIiwgImRldGVjdGVkTW91bnRzQ29udGFpbmVyIiwgImRldGVjdGVkTW91bnRzTGlzdCIsICJtb3VudHNSZXN1bHQiLCAiYXV0b1BhdGhzIiwgIm0iLCAibW91bnQiLCAiaXNTZWxlY3RlZCIsICJjdXJyZW50UGF0aHMiLCAicCIsICJpZHgiLCAicGxleENsYWltU2VjdGlvbiIsICJ2b2x1bWVTZWN0aW9uIiwgInZvbHVtZUxpc3QiLCAibWVkaWFDb250YWluZXJQYXRoIiwgIm5vbk1lZGlhVm9sdW1lcyIsICJ2IiwgInZvbCIsICJpIiwgImhvc3REZWZhdWx0IiwgImNvbnRhaW5lclBhdGgiLCAicm93IiwgImlucHV0IiwgImRlZmF1bHRQb3J0IiwgInBvcnRTdGF0dXMiLCAiY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzIiwgInBvcnRUb0NoZWNrIiwgInJlc3VsdCIsICJzdWdnZXN0ZWRQb3J0IiwgInVzZUJ0biIsICJwb3J0Q2hlY2tUaW1lb3V0IiwgInVwZGF0ZVVybFByZXZpZXciLCAic3ViZG9tYWluIiwgImRuc1R5cGUiLCAic3NsVHlwZSIsICJ1cmwiLCAicHJvdG9jb2wiLCAiYWRkQXBwVG9HcmlkIiwgImRlcGxveUNvbmZpZyIsICJjdXN0b21BcHBzIiwgInVzaW5nRXhpc3RpbmciLCAiZXhpc3RpbmdBcHAiLCAiaW5kZXgiLCAicG9ydFRvVXNlIiwgInBvcnRDaGVjayIsICJhcGlEZXBsb3lDb25maWciLCAibmV3QXBwIiwgIm1lc3NhZ2UiLCAiY2hlY2tTU0xDZXJ0aWZpY2F0ZSIsICJpbnN0cnVjdGlvbnMiLCAiYXBwTmFtZSIsICJhdHRlbXB0cyIsICJtYXhBdHRlbXB0cyIsICJjaGVja0NlcnQiLCAibG9hZEN1c3RvbUFwcHMiLCAibWVkaWFQYXRoIiwgImN1c3RvbVZvbHVtZXMiLCAiZm9sZGVyQnJvd3Nlck1vZGFsIiwgImZvbGRlckJyb3dzZXJQYXRoIiwgImZvbGRlckJyb3dzZXJMaXN0IiwgImZvbGRlckJyb3dzZXJTZWxlY3RlZCIsICJmb2xkZXJCcm93c2VyU2VsZWN0ZWRMaXN0IiwgImN1cnJlbnRCcm93c2VyUGF0aCIsICJzZWxlY3RlZEZvbGRlcnMiLCAidGFyZ2V0TWVkaWFJbnB1dCIsICJtZWRpYUlucHV0IiwgInVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkiLCAibG9hZEZvbGRlckNvbnRlbnRzIiwgInBhdGgiLCAiaXRlbSIsICJpY29uIiwgInNlbGVjdGVkU3R5bGUiLCAicmVjaXBlVGVtcGxhdGVzIiwgInJlY2lwZUNhdGVnb3JpZXMiLCAiY3VycmVudFJlY2lwZSIsICJjdXJyZW50U3RlcCIsICJpc1ByZW1pdW0iLCAiY2FuY2VsQnRuIiwgInByZXZCdG4iLCAibmV4dEJ0biIsICJmZXRjaFJlY2lwZVRlbXBsYXRlcyIsICJyZXNwIiwgImNoZWNrUmVjaXBlUHJlbWl1bSIsICJyZWNpcGVzIiwgImdldFByZXZpZXdSZWNpcGVzIiwgInJlY2lwZUxpc3QiLCAicmVjaXBlIiwgImNvbXBvbmVudEJhZGdlIiwgImxvY2tPdmVybGF5IiwgIm9wZW5SZWNpcGVEZXBsb3lXaXphcmQiLCAiYXBwU2VsZWN0b3JNb2RhbCIsICJ1cGRhdGVTdGVwVUkiLCAicmVuZGVyU3RlcDEiLCAicGFuZWwiLCAibGlzdCIsICJjb21wb25lbnRzIiwgImNvbXAiLCAiaXNSZXF1aXJlZCIsICJpc0ludGVybmFsIiwgInJlbmRlclN0ZXAyIiwgInNoYXJlZFZvbHVtZXMiLCAicmVuZGVyU3RlcDMiLCAiY29udGVudCIsICJzZWxlY3RlZENvbXBvbmVudHMiLCAiZ2V0U2VsZWN0ZWRDb21wb25lbnRzIiwgInZvbHVtZUlucHV0cyIsICJ2b2x1bWVzIiwgInRhaWxzY2FsZSIsICJjIiwgImsiLCAiY2hlY2tib3hlcyIsICJzZWxlY3RlZElkcyIsICJjYiIsICJleGVjdXRlRGVwbG95IiwgInByb2dyZXNzTGlzdCIsICJyZXN1bHRFbCIsICJ1cGRhdGVQcm9ncmVzc0l0ZW0iLCAiZGVwbG95ZWQiLCAiZXJyIiwgInMiLCAiY29tcG9uZW50SWQiLCAic3RhdHVzIiwgInRleHQiLCAic3RhdHVzRWwiLCAiY2FyZHMiLCAiZ3JvdXBzIiwgImNhcmQiLCAicmVjaXBlSWQiLCAiZ3JvdXBDYXJkcyIsICJsYWJlbCIsICJhY3Rpb24iLCAiZW5kcG9pbnQiLCAibWV0aG9kIiwgInIiLCAic3R5bGUiLCAiYnV0dG9uIiwgIm9yaWdpbmFsVGV4dCIsICJ2aWV3QnRuIiwgInJlZnJlc2hCdG4iLCAiY2xlYXJCdG4iLCAiY2xvc2VCdG4iLCAibG9hZEVycm9yTG9ncyIsICJsb2ciLCAiY2xlYXJFcnJvckxvZ3MiLCAiY29udGFpbmVyU2VsZWN0IiwgImxvZ0NvbnRlbnQiLCAibG9nU2VhcmNoIiwgImxvZ1RhaWwiLCAic3RyZWFtQnRuIiwgImRvd25sb2FkQnRuIiwgImNsZWFyU2VhcmNoQnRuIiwgImNsb3NlQnRuMiIsICJzdHJlYW1TdGF0dXMiLCAic3RyZWFtSW5kaWNhdG9yIiwgInN0cmVhbVRleHQiLCAibGluZUNvdW50IiwgImZpbHRlckNvdW50IiwgImltYWdlRWwiLCAiY3JlYXRlZEVsIiwgImN1cnJlbnRDb250YWluZXJJZCIsICJjdXJyZW50TG9ncyIsICJmaWx0ZXJlZExvZ3MiLCAiZXZlbnRTb3VyY2UiLCAiaXNTdHJlYW1pbmciLCAic2VhcmNoVGltZW91dCIsICJmb3JtYXREYXRlIiwgImRhdGVTdHIiLCAiZCIsICJlc2NhcGVIdG1sIiwgInN0ciIsICJkaXYiLCAiZm9ybWF0TG9nRW50cnkiLCAic3RyZWFtQ2xhc3MiLCAic3RyZWFtSWNvbiIsICJyZW5kZXJMb2dzIiwgImxvZ3MiLCAic2VhcmNoVGVybSIsICJsb2FkQ29udGFpbmVycyIsICJjb250YWluZXJzIiwgImN1cnJlbnRWYWwiLCAibG9hZENvbnRhaW5lckluZm8iLCAiY29udGFpbmVySWQiLCAibG9hZExvZ3MiLCAic3RvcFN0cmVhbSIsICJ0YWlsIiwgInN0YXJ0U3RyZWFtIiwgImVudHJ5IiwgImVudHJ5RGl2IiwgImRvd25sb2FkTG9ncyIsICJjb250YWluZXJOYW1lIiwgInRpbWVzdGFtcCIsICJmaWxlbmFtZSIsICJzdHJlYW0iLCAiYmxvYiIsICJjbG9zZU1vZGFsIiwgIm9wZW5CdG4iLCAiZGV0YWlsc0RpdiIsICJjcmVhdGVCdG4iLCAiY3JlYXRlU3RhdHVzIiwgInNob3dDb250YWluZXJEZXRhaWxzIiwgImNyZWF0ZVNuYXBzaG90IiwgIm5hbWUiLCAibGVhdmVSdW5uaW5nIiwgIm9wZW5Nb2RhbCIsICJ0YWIiLCAiY29ubmVjdEJ0biIsICJwaGFzZURldGVjdCIsICJwaGFzZUNyZWRlbnRpYWxzIiwgInBoYXNlUHJvZ3Jlc3MiLCAicGhhc2VSZXN1bHRzIiwgImRldGVjdFJlc3VsdHMiLCAiY3JlZGVudGlhbElucHV0cyIsICJwcm9ncmVzc1N0ZXBzIiwgInJlc3VsdHNDb250ZW50IiwgInBsZXhMaWJyYXJpZXMiLCAicmV0cnlCdG4iLCAiZGV0ZWN0ZWREYXRhIiwgInNlcnZpY2VJY29ucyIsICJzZXJ2aWNlTGFiZWxzIiwgInNob3dQaGFzZSIsICJwaGFzZSIsICJzdGF0dXNCYWRnZSIsICJjb2xvcnMiLCAic21hcnREZXRlY3QiLCAic3ZjIiwgImluZm8iLCAic291cmNlIiwgInZlcnNpb24iLCAia2V5U2F2ZWQiLCAiYnVpbGRDcmVkZW50aWFsSW5wdXRzIiwgInNlcnZpY2VzIiwgImFyclNlcnZpY2VzIiwgImlzQ29ubmVjdGVkIiwgInBsZXgiLCAicGxleENvbm5lY3RlZCIsICJzZWVyciIsICJzZWVyck9rIiwgImNvbmZpZ3VyZWRIdG1sIiwgImNzIiwgInNlcnZpY2UiLCAidXJsSW5wdXQiLCAia2V5SW5wdXQiLCAic3RhdHVzU3BhbiIsICJhcGlLZXkiLCAic21hcnRDb25uZWN0IiwgInN0ZXBzSHRtbCIsICJkZXRhaWxDb2xvciIsICJzaG93UmVzdWx0cyIsICJhbGxHb29kIiwgImhlYWRlckNvbG9yIiwgImhlYWRlckljb24iLCAiaGVhZGVyVGV4dCIsICJzdCIsICJmZXRjaFBsZXhMaWJyYXJpZXMiLCAibGliIiwgInR5cGVJY29uIiwgInNhdmVCdG4iLCAicHJvdmlkZXIiLCAiY2hlY2tib3giLCAiaGVhbHRoQ2hlY2tFbmFibGVkIiwgImhlYWx0aENoZWNrQ29uZmlnIiwgImxvYWROb3RpZmljYXRpb25Db25maWciLCAibG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkiLCAiZGF0ZSIsICJzYXZlTm90aWZpY2F0aW9uQ29uZmlnIiwgInRlc3RQcm92aWRlciIsICJsb2FkTm90aWZpY2F0aW9uU3RhdHVzIiwgImxhc3RTZW50RWwiLCAicGFuZWxJZCIsICJ0YWJCYXIiLCAibW9kYWxDb250ZW50IiwgInRhcmdldCIsICJCUk9XU0VSX1NUQVRFX0tFWVMiLCAiY29sbGVjdEJyb3dzZXJTdGF0ZSIsICJzdGF0ZSIsICJ2YWwiLCAiaiIsICJyZXN0b3JlQnJvd3NlclN0YXRlIiwgImJyb3dzZXJTdGF0ZSIsICJjb3VudCIsICJpc0xlZ2FjeUZvcm1hdCIsICJyZXN0b3JlTGVnYWN5Rm9ybWF0IiwgInNsdWciLCAiZXhwb3J0QnRuIiwgInNlbGVjdEZpbGVCdG4iLCAiZmlsZUlucHV0IiwgImZpbGVOYW1lRGl2IiwgInByZXZpZXdEaXYiLCAicHJldmlld0NvbnRlbnQiLCAicmVzdG9yZUJ0biIsICJyZXN1bHREaXYiLCAic2NoZWR1bGVDb250YWluZXIiLCAiaGlzdG9yeUNvbnRhaW5lciIsICJkaXNrQ29udGFpbmVyIiwgInBvaW50aW50aW1lQ29udGFpbmVyIiwgInNlbGVjdGVkQmFja3VwIiwgInN0YXRlQ291bnQiLCAidGhlbWVDb3VudCIsICJiYWNrdXAiLCAicHJldmlldyIsICJyZWxvYWRDYWRkeSIsICJicm93c2VyQ291bnQiLCAibXNnIiwgImxvYWRTY2hlZHVsZXNUYWIiLCAic2NoZWR1bGVzIiwgInNjaCIsICJuZXh0UnVuU3RyIiwgImxhc3RSdW5TdHIiLCAidG9nZ2xlIiwgInVwZGF0ZVNjaGVkdWxlIiwgInNlbCIsICJpbnAiLCAicnVuQmFja3VwTm93IiwgImRlbGV0ZVNjaGVkdWxlIiwgImFkZE5ld1NjaGVkdWxlIiwgInVwZGF0ZXMiLCAiaW50ZXJ2YWwiLCAicmV0ZW50aW9uIiwgImFwcElkSW5wdXQiLCAibG9hZERpc2tCYWNrdXBzIiwgImZpbGVzIiwgImJ5QXBwIiwgImYiLCAiYXBwSWRzIiwgImFwcEZpbGVzIiwgImNvbXBhcmVCYWNrdXBGaWxlIiwgInJlc3RvcmVCYWNrdXBGaWxlIiwgImxvYWRCYWNrdXBIaXN0b3J5IiwgImJrIiwgInNpemVNQiIsICJiYWNrdXBJZCIsICJsb2FkUG9pbnRJblRpbWVUYWIiLCAibGljZW5zZVJlcyIsICJsaWNlbnNlRGF0YSIsICJzZXJ2aWNlc1JlcyIsICJzZXJ2aWNlc0RhdGEiLCAibG9hZFBvaW50SW5UaW1lQmFja3VwcyIsICJsaXN0RWwiLCAiZGlmZiIsICJzdmNDaGFuZ2VkIiwgImNmZ0NoYW5nZWQiLCAiYXV0b1JlZnJlc2hDaGVja2JveCIsICJhZ2dyZWdhdGVkQ29udGFpbmVyIiwgImFsZXJ0c0NvbnRhaW5lciIsICJsYXN0VXBkYXRlU3BhbiIsICJyZWZyZXNoSW50ZXJ2YWwiLCAiY2FjaGVkTW9uaXRvcmluZ0RhdGEiLCAiZm9ybWF0Qnl0ZXMiLCAiYnl0ZXMiLCAic2l6ZXMiLCAiZ2V0Q3B1Q29sb3IiLCAicGVyY2VudCIsICJnZXRNZW1Db2xvciIsICJsb2FkU3RhdHMiLCAic3RhdHMiLCAiaXNOZXdBcGkiLCAiaWQiLCAiY3VyIiwgImNwdSIsICJtZW0iLCAiY3B1Q29sb3IiLCAibWVtQ29sb3IiLCAibWVtVXNlZCIsICJtZW1MaW1pdCIsICJuZXRSeCIsICJuZXRUeCIsICJhZ2ciLCAibG9hZEFnZ3JlZ2F0ZWQiLCAibG9hZEFsZXJ0cyIsICJhbGVydEhpc3RvcnkiLCAiaGQiLCAiYWxsQ29uZmlncyIsICJjZCIsICJjb250YWluZXJSb3dzIiwgImhpc3RvcnlSb3dzIiwgInRpbWUiLCAibm90aWZpZWRNYXJrIiwgImNvbmZpZ1NlY3Rpb24iLCAiY29uZmlncyIsICJjSWQiLCAic3RvcEF1dG9SZWZyZXNoIiwgIm9yaWciLCAic3RhcnRBdXRvUmVmcmVzaCIsICJoaXN0b3J5Q29udGFpbmVyU2VsZWN0IiwgImhpc3RvcnlBcmVhIiwgInJhbmdlQnV0dG9ucyIsICJjdXJyZW50UmFuZ2UiLCAicmFuZ2VUb01zIiwgInJhbmdlIiwgInRpZXJMYWJlbCIsICJ0aWVyIiwgInJlbmRlclNwYXJrbGluZSIsICJzYW1wbGVzIiwgImFjY2Vzc29yIiwgImNvbG9yIiwgInVuaXQiLCAidmFsdWVzIiwgIm1heCIsICJtaW4iLCAidyIsICJoIiwgInBhZCIsICJzdGVwWCIsICJwb2ludHMiLCAieCIsICJ5IiwgImxhc3QiLCAiYXZnIiwgInBvcHVsYXRlSGlzdG9yeUNvbnRhaW5lclNlbGVjdCIsICJwcmV2aW91cyIsICJlbnRyaWVzIiwgImxvYWRIaXN0b3J5IiwgImVuZFRpbWUiLCAic3RhcnRUaW1lIiwgImlzUmF3IiwgImNwdUFjY2Vzc29yIiwgIm1lbUFjY2Vzc29yIiwgIm5ldFJ4QWNjZXNzb3IiLCAibmV0VHhBY2Nlc3NvciIsICJzdGF0dXNDb250YWluZXIiLCAiaW5jaWRlbnRzQ29udGFpbmVyIiwgImNvbmZpZ0NvbnRhaW5lciIsICJhZGRCdG4iLCAiZm9ybUVsIiwgImZvcm1UaXRsZSIsICJmb3JtQ2FuY2VsIiwgImZvcm1TYXZlIiwgIkhFQUxUSF9TRVRUSU5HU19LRVkiLCAiSEVBTFRIX0RFRkFVTFRTIiwgImdsb2JhbFNhdmVCdG4iLCAiZ2xvYmFsUmVzZXRCdG4iLCAiZ2xvYmFsU3RhdHVzU3BhbiIsICJyZXRlbnRpb25JbnB1dCIsICJpbnRlcnZhbElucHV0IiwgInN0YXRzSW50ZXJ2YWxJbnB1dCIsICJtYXhFbnRyaWVzSW5wdXQiLCAiZGlza1RocmVzaG9sZElucHV0IiwgImxvYWRIZWFsdGhTZXR0aW5ncyIsICJyYXciLCAic2F2ZWQiLCAiYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkiLCAic2F2ZUhlYWx0aFNldHRpbmdzIiwgInNldHRpbmdzIiwgInJlc2V0SGVhbHRoU2V0dGluZ3MiLCAiZWRpdGluZ0lkIiwgInVwdGltZUNvbG9yIiwgInBjdCIsICJzZXZlcml0eUJhZGdlIiwgInNldiIsICJsb2FkU3RhdHVzIiwgImlzVXAiLCAiZG90Q29sb3IiLCAidTI0IiwgInU3ZCIsICJhdmdSdCIsICJsYXN0Q2hlY2siLCAiZGV0YWlsUm93IiwgInJ0IiwgImxvYWRJbmNpZGVudHMiLCAib3BlblJlcyIsICJoaXN0UmVzIiwgIm9wZW5EYXRhIiwgImhpc3REYXRhIiwgIm9wZW4iLCAiaW5jIiwgImhpc3RvcnkiLCAicmVzb2x2ZWQiLCAiZHVyIiwgImxvYWRDb25maWciLCAic2hvd0Zvcm0iLCAidGltZW91dCIsICJjb2RlcyIsICJzbGEiLCAic2xvdyIsICJoaWRlRm9ybSIsICJib2R5IiwgImNoZWNrQnRuIiwgImF2YWlsYWJsZUNvbnRhaW5lciIsICJhdXRvQ29udGFpbmVyIiwgImxhc3RDaGVja1NwYW4iLCAibG9hZEF2YWlsYWJsZSIsICJ1IiwgImNvdW50QmFkZ2UiLCAidXBkYXRlQWxsQnRuIiwgInVwZGF0ZUFsbENvbnRhaW5lcnMiLCAic3VjY2VzcyIsICJmYWlsZWQiLCAiY2hlY2tGb3JVcGRhdGVzIiwgIm9rIiwgImxvYWRBdXRvQ29uZmlnIiwgImNvbnRhaW5lcnNSZXMiLCAiY29uZmlnUmVzIiwgImNvbnRhaW5lcnNEYXRhIiwgImNvbmZpZ0RhdGEiLCAic2F2ZWRDb25maWciLCAiY2lkIiwgInNjaGVkdWxlVmFsIiwgInJvbGxiYWNrVmFsIiwgIndpbmRvd1ZhbCIsICJsYXN0UnVuIiwgInNjaGVkdWxlIiwgInJvbGxiYWNrIiwgIndpbmRvdyIsICJkY1ZlcnNpb25JbmZvIiwgImRjVXBkYXRlQmFkZ2UiLCAiZGNVcGRhdGVEZXRhaWxzIiwgImRjTmV3VmVyc2lvbiIsICJkY0NoYW5nZWxvZyIsICJkY0FwcGx5QnRuIiwgImRjQ2hlY2tCdG4iLCAiZGNSb2xsYmFja0J0biIsICJkY1N0YXR1c0JhciIsICJkY0hpc3RvcnlDb250YWluZXIiLCAiZGNMYXN0Q2hlY2siLCAiZGNTaG93U3RhdHVzIiwgInR5cGUiLCAiZGNMb2FkVmVyc2lvbiIsICJjb21taXQiLCAiZGNDaGVja0ZvclVwZGF0ZSIsICJzaWxlbnQiLCAidXBkYXRlc0J0biIsICJkb3QiLCAiZGNUYWIiLCAiZGNBcHBseVVwZGF0ZSIsICJkY0xvYWRIaXN0b3J5IiwgInN0Q29sb3IiLCAiZGNTaG93Um9sbGJhY2siLCAidmVyc2lvbnMiLCAiZm10Qnl0ZXMiLCAidW5pdHMiLCAibG9hZFZvbHVtZXMiLCAidm9scyIsICJpc1N5c3RlbSIsICJuYW1lSW5wdXQiLCAibG9hZE5ldHdvcmtzIiwgIm5ldHMiLCAibiIsICJkcml2ZXJTZWxlY3QiLCAibG9hZERpc2tVc2FnZSIsICJzZWN0aW9ucyIsICJwYXJzZWREYXRhIiwgInlhbWxTdHIiLCAic3RhY2tOYW1lIiwgIm9yaWdUZXh0IiwgInJlbmRlclByZXZpZXciLCAiYm9yZGVyQ29sb3IiLCAicGFydHMiLCAicHJvZ3Jlc3NFbCIsICJ0ZXJtRWwiLCAidGVybSIsICJ3cyIsICJmaXRBZGRvbiIsICJjbGVhbnVwIiwgIm9wZW5FeGVjIiwgImRpbXMiLCAiY29scyIsICJyb3dzIiwgInJlc2l6ZUhhbmRsZXIiLCAiZmlsdGVyU2VsZWN0IiwgImxvYWRNb3JlQnRuIiwgImN1cnJlbnRPZmZzZXQiLCAiUEFHRV9TSVpFIiwgImxvYWRBdWRpdCIsICJhcHBlbmQiLCAiZmlsdGVyIiwgInRhYmxlIiwgImRldGFpbCIsICJ0YWJzIiwgInBhbmVscyIsICJhbGxFdmVudHMiLCAiYWxsSG9zdHMiLCAic3NlU291cmNlIiwgInJlZnJlc2hPdmVydmlldyIsICJyZWZyZXNoRXZlbnRzIiwgInJlZnJlc2hIb3N0cyIsICJzdGFydExpdmVUYWlsIiwgInN0b3BMaXZlVGFpbCIsICJyZW5kZXJFdmVudHMiLCAiZXYiLCAiYWN0aXZlIiwgInNpbmNlIiwgInN0YXRzUmVzIiwgImhvc3RzUmVzIiwgImV2ZW50c1JlcyIsICJob3N0cyIsICJldmVudHNDb3VudCIsICJyZW5kZXJUb3BMaXN0IiwgIml0ZW1zIiwgIml0IiwgImZpbHRlclNvdXJjZSIsICJmaWx0ZXJTZXZlcml0eSIsICJmaWx0ZXJIb3N0IiwgImZpbHRlckFjdG9yIiwgImRlYm91bmNlIiwgInBhcmFtcyIsICJyZWZyZXNoSG9zdEZpbHRlciIsICJyZW5kZXJFdmVudFJvdyIsICJzZXZDb2xvciIsICJhY3RvciIsICJvdXRjb21lIiwgImN1cnJlbnQiLCAicmVnaXN0ZXJIb3N0UHJvbXB0IiwgImZuIiwgIm1zIiwgIkxPQ0FUSU9OX0tFWSIsICJMRUdBQ1lfS0VZIiwgIkdFT19DQUNIRV9LRVkiLCAiVU5JVF9LRVkiLCAiZ2V0VW5pdCIsICJnZXRXZWF0aGVyRWxlbWVudHMiLCAid21vRGVzY3JpcHRpb25zIiwgIndtb0ljb25zIiwgIndpbmREaXJzIiwgImRlZ1RvRGlyIiwgImRlZyIsICJnZW9jb2RlTG9jYXRpb24iLCAicXVlcnkiLCAiY2FjaGVkIiwgImdlbyIsICJmb3JtYXRMb2NhdGlvbiIsICJmZXRjaFdlYXRoZXIiLCAibG9jYXRpb24iLCAidGVtcFVuaXQiLCAid2luZFVuaXQiLCAiY29kZSIsICJ1cGRhdGVXZWF0aGVyIiwgIndlYXRoZXJXaWRnZXQiLCAid2VhdGhlciIsICJ0ZW1wU3VmZml4IiwgIndpbmRMYWJlbCIsICJsb2NhdGlvbklucHV0IiwgImxvYyIsICJ1bml0UmFkaW8iLCAibmV3VW5pdCIsICJvbGRVbml0IiwgIndpZGdldCIsICJyZW5kZXIiLCAiREFZUyIsICJNT05USFMiLCAiUk9NQU4iLCAiY3VycmVudFN0eWxlIiwgImxhc3RDaGltZUhvdXIiLCAiY2hpbWVQbGF5aW5nIiwgInByZXZGbGlwRGlnaXRzIiwgImFjdGl2ZUxheW91dCIsICJkaWdpdGFsUmVmcyIsICJ0aWNrVGltZXIiLCAicGxheUNoaW1lcyIsICJzdHJpa2UiLCAiYmVsbCIsICJub3ciLCAicmVzZXRSZW5kZXJMYXlvdXQiLCAiZW5zdXJlRGlnaXRhbExheW91dCIsICJyZW5kZXJEZWZhdWx0IiwgImgyNCIsICJhbXBtIiwgInJlZnMiLCAicmVuZGVyTGNkIiwgImNscyIsICJyZW5kZXJGbGlwIiwgImRpZ2l0cyIsICJmbGlwQ2FyZCIsICJkaWdpdCIsICJyZW5kZXJCaW5hcnkiLCAiYml0IiwgImNvbCIsICJvbiIsICJyZW5kZXJBbmFsb2ciLCAidXNlUm9tYW4iLCAic2l6ZSIsICJjeCIsICJjeSIsICJzQW5nbGUiLCAibUFuZ2xlIiwgImhBbmdsZSIsICJsYWJlbHMiLCAiYW5nbGUiLCAidGlja3MiLCAib3V0ZXIiLCAiaW5uZXIiLCAieDEiLCAieTEiLCAieDIiLCAieTIiLCAic3ZnIiwgInRpY2siLCAibmV4dENsYXNzTmFtZSIsICJzY2hlZHVsZU5leHRUaWNrIiwgImRlbGF5IiwgIlNUWUxFUyIsICJzdHlsZU9wdGlvbnNIdG1sIiwgImNoaW1lc1RvZ2dsZSIsICJ2b2x1bWVTbGlkZXIiLCAibG9hZFNldHRpbmdzIiwgInJlZnJlc2hDYXJkSGVhbHRoIiwgInNlcnZpY2VJZCIsICJ1cHRpbWVFbCIsICJiYXJFbCIsICJ1cHRpbWUyNCIsICJkaXNtaXNzZWRVcGRhdGVzIiwgImtub3duVXBkYXRlcyIsICJyZWZyZXNoQ2FyZFVwZGF0ZXMiLCAibm90aWZ5TmV3IiwgInByZXYiLCAidXBkIiwgInVwZGF0ZUJ0biIsICJzY2hlZHVsZUNhcmRFbmhhbmNlbWVudHMiLCAib3JpZ1JlZnJlc2hBbGwiLCAidGhlbWVCZWZvcmVCdWlsZGVyIiwgImVkaXRpbmdTbHVnIiwgImFkdmFuY2VkT3ZlcnJpZGVzIiwgIlRIRU1FX0xBQkVMUyIsICJGSUVMRFMiLCAidGhlbWVCdG4iLCAidGhlbWVMYWJlbCIsICJnZXRMYWJlbEZvciIsICJ1c2VyVGhlbWVzIiwgInVwZGF0ZUxhYmVsIiwgIm5leHQiLCAiYnVpbGRGaWVsZHNIVE1MIiwgImdyb3VwZWQiLCAiYnVpbGRTdGFydEZyb21PcHRpb25zIiwgIm1vZGFsSFRNTCIsICJzdGFydFNlbGVjdCIsICJlZGl0U2VsZWN0IiwgImV4aXN0aW5nU2VjdGlvbiIsICJsaWdodEJnQ2hlY2siLCAicGlja2VycyIsICJhZHZhbmNlZFNlY3Rpb24iLCAiYWR2YW5jZWRUb2dnbGUiLCAiYWR2YW5jZWRWaXNpYmxlIiwgImdldEN1cnJlbnRDb2xvcnMiLCAiZ2V0QmFzZUNvbG9ycyIsICJ1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkIiwgImJhc2UiLCAiZGVyaXZlZCIsICJoZXgiLCAibG9hZFRoZW1lSW50b1BpY2tlcnMiLCAidGhlbWVOYW1lIiwgInVwZGF0ZVByZXZpZXciLCAibG9hZFVzZXJUaGVtZUludG9QaWNrZXJzIiwgInRoZW1lIiwgIm11dGVkIiwgImJhZGdlT2siLCAiYmFkZ2VCYWQiLCAiZG90T2siLCAiZG90QmFkIiwgImRvdHMiLCAiYXBwbHlDb2xvcnNMaXZlIiwgInByb3AiLCAicmVmcmVzaEVkaXREcm9wZG93biIsICJzbHVncyIsICJyZWZyZXNoU3RhcnRGcm9tIiwgIm9wZW5CdWlsZGVyIiwgImN1c3RvbWl6ZUJ0biIsICJvbGRTbHVnIiwgIm5ld1NsdWciLCAidGhlbWVEYXRhIiwgImFwaUNvbG9ycyIsICJzbHVnVG9EZWxldGUiLCAiZmFsbGJhY2siLCAiZXhwb3J0RGF0YSIsICJ0aGVtZUNvbG9ycyIsICJ0aGVtZUxpZ2h0QmciLCAiY29kZUlucHV0IiwgImFjdGl2YXRlQnRuIiwgImRlYWN0aXZhdGVCdG4iLCAiZXJyb3JFbCIsICJzdWNjZXNzRWwiLCAiYmFkZ2VJY29uIiwgImJhZGdlVGV4dCIsICJkZXRhaWxzRWwiLCAiZmVhdHVyZUxpc3QiLCAiYWN0aXZhdGVTZWN0aW9uIiwgImN1cnJlbnRTdGF0dXMiLCAiaGlkZU1lc3NhZ2VzIiwgInNob3dFcnJvciIsICJzaG93U3VjY2VzcyIsICJyZW5kZXJTdGF0dXMiLCAiZXhwaXJ5TGluZSIsICJmZWF0dXJlcyIsICJhY3RpdmVGZWF0dXJlcyIsICJ1cGRhdGVIZWFkZXJCYWRnZSIsICJhY3RpdmF0ZUxpY2Vuc2UiLCAiZGVhY3RpdmF0ZUxpY2Vuc2UiLCAidG9wYmFyIiwgImljb25FbCIsICJ0ZXh0RWwiLCAidGltZUVsIiwgImRheXMiLCAib3BlbkxpY2Vuc2VNb2RhbCIsICJyZXN0IiwgInRvcGJhckVsIiwgImZlYXR1cmUiLCAiVFRMX09QVElPTlMiLCAibyIsICJzZXJ2aWNlTmFtZUVsIiwgImlzc3VlZEVsIiwgImlzc3VlZFVybElucHV0IiwgImlzc3VlZENvcHlCdG4iLCAiaXNzdWVkTWV0YUVsIiwgIm91dHN0YW5kaW5nTGlzdEVsIiwgInB1YmxpY0NyZWF0ZUJ0biIsICJ0c0NyZWF0ZUJ0biIsICJ0c0VtYWlsSW5wdXQiLCAicHVibGljVHRsU2VsZWN0IiwgImN1cnJlbnRTZXJ2aWNlIiwgImFjdGl2ZVRhYiIsICJfb3JpZ2luRnJvbVBhZ2UiLCAiX2Fic1VybCIsICJ1cmxQYXRoIiwgIl9mb3JtYXRFeHBpcnkiLCAiaXNvIiwgIl9mb3JtYXRSZW1haW5pbmciLCAic2V0QWN0aXZlVGFiIiwgImlzQWN0aXZlIiwgImxvYWRPdXRzdGFuZGluZyIsICJmaWx0ZXJlZCIsICJyZW1haW5pbmciLCAicmV2b2tlU2hhcmUiLCAiaXNzdWVQdWJsaWMiLCAib3JpZ2luYWwiLCAidHRsTXMiLCAiX3JlbmRlckFwaUVycm9yIiwgImlzc3VlVGFpbHNjYWxlIiwgIm9wZW5TaGFyZU1vZGFsIl0KfQo=