333 lines
102 KiB
JavaScript
333 lines
102 KiB
JavaScript
(function(){function v(){const i=safeGet("custom-services");if(i)try{JSON.parse(i).forEach(e=>{window.APPS.find(a=>a.id===e.id)||window.APPS.push(e)})}catch(n){console.warn("Failed to load custom services:",n)}}v();function k(){const i=document.querySelectorAll(".top .card");i.forEach((n,e)=>{n.style.transitionDelay=`${Math.min(e*60,300)}ms`}),requestAnimationFrame(()=>{i.forEach(n=>n.classList.add("loaded"))})}function u(){if(!("serviceWorker"in navigator)||!window.isSecureContext&&location.hostname!=="localhost"&&location.hostname!=="127.0.0.1")return;const i=()=>{navigator.serviceWorker.register("/sw.js",{updateViaCache:"none"}).catch(n=>{console.warn("[init] Service worker registration failed:",n)})};document.readyState==="complete"?i():window.addEventListener("load",i,{once:!0})}let h=!1;async function f(){if(h){console.warn("[init] initializeDashboard called again, skipping duplicate");return}if(h=!0,await window.loadServices(),await y(),window.buildGrid(),k(),window.refreshAll(),setInterval(window.refreshAll,DC.POLL.DASHBOARD),typeof window.refreshCredsButtons=="function"&&window.refreshCredsButtons(),typeof window.refreshMonitoringWidgets=="function"&&window.refreshMonitoringWidgets(),typeof window._updateAuthCard=="function")try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();n.success&&window._updateAuthCard(n.config.enabled&&n.config.isSetUp,n.config.sessionDuration)}catch{}if(window.__dashcaddySiteConfigLoaded)try{await window.__dashcaddySiteConfigLoaded}catch{}if(S(),C()&&b(),window.AdminPanel&&typeof window.AdminPanel.attachTrigger=="function")try{await window.AdminPanel.attachTrigger(document.body)}catch(i){console.warn("[init] AdminPanel attachTrigger failed:",i)}}function b(){if(document.querySelector('script[src="/dist/onboarding.js"]'))return;const i=document.createElement("script");if(i.src="/dist/onboarding.js",i.defer=!0,document.head.appendChild(i),!document.querySelector('link[href="/css/driver.min.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/driver.min.css",document.head.appendChild(n)}if(!document.querySelector('link[href="/css/onboarding.css"]')){const n=document.createElement("link");n.rel="stylesheet",n.href="/css/onboarding.css",document.head.appendChild(n)}}function C(){if(typeof SITE<"u"&&SITE.onboardingCompleted)return!1;try{const i=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));return!i||!i.tourCompleted&&i.currentStep===0}catch{return!0}}function E(){const i=document.querySelectorAll(".tools-section");if(!i.length)return;let n={};try{n=JSON.parse(localStorage.getItem("toolbar-sections")||"{}")}catch{}i.forEach(e=>{const a=e.dataset.section,c=e.querySelector(".tools-section-header");c&&(n[a]&&(e.classList.add("open"),c.setAttribute("aria-expanded","true")),c.addEventListener("click",s=>{s.preventDefault();const l=e.classList.toggle("open");c.setAttribute("aria-expanded",l?"true":"false");const m={};document.querySelectorAll(".tools-section").forEach(t=>{m[t.dataset.section]=t.classList.contains("open")}),localStorage.setItem("toolbar-sections",JSON.stringify(m))}))})}E();function S(){if(document.getElementById("restart-tour-btn"))return;let i=typeof SITE<"u"&&SITE.onboardingCompleted;try{const a=JSON.parse(localStorage.getItem("dashcaddy_onboarding"));i=i||!!(a&&a.tourCompleted)}catch{}const n=i?document.querySelector('.tools-section[data-section="admin"] .tools-section-items'):document.querySelector(".tools-primary");if(!n)return;const e=document.createElement("button");e.id="restart-tour-btn",e.textContent=i?"Help Tour":"\u{1F393} Help Tour",e.title="Restart the onboarding tour",e.onclick=()=>{if(window.DashCaddyOnboarding)window.DashCaddyOnboarding.restartTour();else{b();const a=setInterval(()=>{window.DashCaddyOnboarding&&(clearInterval(a),window.DashCaddyOnboarding.restartTour())},100);setTimeout(()=>clearInterval(a),5e3)}},n.appendChild(e)}window.initializeDashboard=f,window.loadCustomServices=v,u();async function y(){try{const i=await fetch("/api/v1/templates",{cache:"no-store"});if(!i.ok)return;const n=await i.json();n&&n.categories&&(window.DC_CATEGORIES=n.categories,typeof DC<"u"&&(DC.CATEGORIES=n.categories),q())}catch(i){console.warn("[init] Failed to load template categories:",i)}}function q(){const i=window.DC_CATEGORIES||typeof DC<"u"&&DC.CATEGORIES;i&&document.querySelectorAll('select[data-role="service-category"]').forEach(n=>{const e=n.dataset.current||"",a=n.querySelector('option[value=""]');if(n.innerHTML="",a)n.appendChild(a);else{const c=document.createElement("option");c.value="",c.textContent="\u2014 Select category \u2014",n.appendChild(c)}Object.entries(i).forEach(([c,s])=>{const l=document.createElement("option");l.value=c,l.textContent=`${s.icon||""} ${c}`.trim(),c===e&&(l.selected=!0),n.appendChild(l)})})}window.populateCategorySelects=q,window.loadTemplateCategories=y,(async()=>{try{const n=await(await fetch("/api/v1/totp/config",{cache:"no-store"})).json();if(n.success&&n.config.enabled&&(await fetch("/api/v1/totp/check-session",{cache:"no-store"})).status===401){window._showTotpOverlay();return}}catch(i){console.warn("TOTP check failed, proceeding normally:",i)}f()})()})(),(function(){const v=document.createElement("style");v.textContent=`
|
|
.dc-monitor {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
|
gap: 12px;
|
|
margin-bottom: 16px;
|
|
padding: 12px 16px;
|
|
background: var(--card-base);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
}
|
|
.dc-monitor-card {
|
|
padding: 10px 12px;
|
|
background: var(--card-bg, rgba(255,255,255,0.04));
|
|
border-radius: 8px;
|
|
border: 1px solid var(--border);
|
|
}
|
|
.dc-monitor-label {
|
|
font-size: 0.7rem;
|
|
color: var(--muted);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
margin-bottom: 4px;
|
|
}
|
|
.dc-monitor-value {
|
|
font-size: 1.4rem;
|
|
font-weight: 600;
|
|
color: var(--fg);
|
|
}
|
|
.dc-monitor-sub {
|
|
font-size: 0.7rem;
|
|
color: var(--muted);
|
|
margin-top: 4px;
|
|
}
|
|
.dc-monitor-bar {
|
|
margin-top: 6px;
|
|
width: 100%;
|
|
height: 4px;
|
|
background: color-mix(in srgb, var(--muted) 20%, transparent);
|
|
border-radius: 2px;
|
|
overflow: hidden;
|
|
}
|
|
.dc-monitor-bar-fill {
|
|
height: 100%;
|
|
width: 0%;
|
|
background: var(--ok-fg, #27ae60);
|
|
transition: width 0.3s ease, background 0.3s ease;
|
|
}
|
|
.dc-monitor-bar-fill.warn { background: #f39c12; }
|
|
.dc-monitor-bar-fill.bad { background: #e74c3c; }
|
|
.dc-monitor-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-bottom: 8px;
|
|
}
|
|
.dc-monitor-title {
|
|
font-size: 0.85rem;
|
|
font-weight: 500;
|
|
color: var(--muted);
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
.dc-monitor-pill {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
padding: 2px 8px;
|
|
border-radius: 999px;
|
|
font-size: 0.7rem;
|
|
font-weight: 500;
|
|
}
|
|
.dc-monitor-pill.ok { background: color-mix(in srgb, #27ae60 20%, transparent); color: #27ae60; }
|
|
.dc-monitor-pill.warn { background: color-mix(in srgb, #f39c12 20%, transparent); color: #f39c12; }
|
|
.dc-monitor-pill.bad { background: color-mix(in srgb, #e74c3c 20%, transparent); color: #e74c3c; }
|
|
.dc-monitor-refresh {
|
|
font-size: 0.7rem;
|
|
color: var(--muted);
|
|
opacity: 0.7;
|
|
}
|
|
`,document.head.appendChild(v);const k=document.getElementById("service-filter-bar");if(!k)return;const u=document.createElement("div");u.className="dc-monitor",u.id="dc-monitor-panel",u.innerHTML=`
|
|
<div class="dc-monitor-header" style="grid-column: 1 / -1;">
|
|
<div class="dc-monitor-title">\u{1F4CA} System Overview</div>
|
|
<span class="dc-monitor-refresh" id="dc-monitor-refresh-stamp">\u2014</span>
|
|
</div>
|
|
<div class="dc-monitor-card">
|
|
<div class="dc-monitor-label">Services</div>
|
|
<div class="dc-monitor-value" id="dc-monitor-services">\u2014</div>
|
|
<div class="dc-monitor-sub" id="dc-monitor-services-sub">loading\u2026</div>
|
|
</div>
|
|
<div class="dc-monitor-card">
|
|
<div class="dc-monitor-label">Containers Up</div>
|
|
<div class="dc-monitor-value" id="dc-monitor-containers">\u2014</div>
|
|
<div class="dc-monitor-sub" id="dc-monitor-containers-sub">loading\u2026</div>
|
|
</div>
|
|
<div class="dc-monitor-card">
|
|
<div class="dc-monitor-label">Avg CPU</div>
|
|
<div class="dc-monitor-value" id="dc-monitor-cpu">\u2014</div>
|
|
<div class="dc-monitor-bar"><div class="dc-monitor-bar-fill" id="dc-monitor-cpu-bar"></div></div>
|
|
</div>
|
|
<div class="dc-monitor-card">
|
|
<div class="dc-monitor-label">Avg Memory</div>
|
|
<div class="dc-monitor-value" id="dc-monitor-mem">\u2014</div>
|
|
<div class="dc-monitor-bar"><div class="dc-monitor-bar-fill" id="dc-monitor-mem-bar"></div></div>
|
|
</div>
|
|
<div class="dc-monitor-card">
|
|
<div class="dc-monitor-label">Health</div>
|
|
<div class="dc-monitor-value" id="dc-monitor-health">\u2014</div>
|
|
<div class="dc-monitor-sub" id="dc-monitor-health-sub">\u2014</div>
|
|
</div>
|
|
`,k.parentNode.insertBefore(u,k);function h(e,a){const c=document.getElementById(e);if(!c)return;const s=Math.max(0,Math.min(100,Number(a)||0));c.style.width=s+"%",c.classList.remove("warn","bad"),s>=85?c.classList.add("bad"):s>=65&&c.classList.add("warn")}function f(e){return e==null||isNaN(e)?"\u2014":Math.round(e*10)/10+"%"}function b(e){if(e==null||isNaN(e))return"\u2014";const a=["B","KB","MB","GB","TB"];let c=0;for(;e>=1024&&c<a.length-1;)e/=1024,c++;return e.toFixed(1)+" "+a[c]}function C(){const e=(window.APPS||[]).length;let a=0;document.querySelectorAll("#cards .card").forEach(l=>{l.dataset.status==="on"&&a++});const c=document.getElementById("dc-monitor-services"),s=document.getElementById("dc-monitor-services-sub");c&&(c.textContent=`${a} / ${e}`),s&&(s.textContent=e===0?"no services yet":`${a} online \xB7 ${e-a} offline`)}function E(e){const a=document.getElementById("dc-monitor-health"),c=document.getElementById("dc-monitor-health-sub");if(!a)return;if(!e||e.summary==null){a.textContent="\u2014",c&&(c.textContent="no data");return}const s=e.summary,l=s.healthy??s.up??0,m=s.unhealthy??s.down??0,t=s.total??l+m;a.textContent=`${l}/${t}`,c&&(m===0?c.innerHTML='<span class="dc-monitor-pill ok">\u25CF all healthy</span>':m<=2?c.innerHTML=`<span class="dc-monitor-pill warn">\u25CF ${m} degraded</span>`:c.innerHTML=`<span class="dc-monitor-pill bad">\u25CF ${m} down</span>`)}async function S(){try{const e=await fetch("/api/v1/monitoring/stats",{cache:"no-store"});if(!e.ok)return null;const a=await e.json();return a&&a.stats?a.stats:null}catch{return null}}async function y(){try{const e=await fetch("/api/v1/health-checks/status",{cache:"no-store"});return e.ok?await e.json():null}catch{return null}}function q(e){const a=document.getElementById("dc-monitor-containers"),c=document.getElementById("dc-monitor-containers-sub"),s=document.getElementById("dc-monitor-cpu"),l=document.getElementById("dc-monitor-mem");if(!e){a&&(a.textContent="\u2014"),s&&(s.textContent="\u2014"),l&&(l.textContent="\u2014");return}const m=Object.values(e);if(m.length===0){a&&(a.textContent="0"),c&&(c.textContent="no containers reporting"),s&&(s.textContent="0%"),l&&(l.textContent="0%"),h("dc-monitor-cpu-bar",0),h("dc-monitor-mem-bar",0);return}let t=0,o=0,r=0,p=0,d=0;m.forEach(g=>{if(g.cpu!=null){const x=Number(g.cpu);isNaN(x)||(t+=x>1?x:x*100,p++)}if(g.memory!=null){const x=Number(g.memory);isNaN(x)||(o+=x,r+=Number(g.memoryUsage||0),d++)}});const w=p?t/p:0,L=d?o/d:0;if(a&&(a.textContent=String(m.length)),c){const g=r?` \xB7 ${b(r)} RAM`:"";c.textContent=`running${g}`}s&&(s.textContent=f(w)),l&&(l.textContent=f(L)),h("dc-monitor-cpu-bar",w),h("dc-monitor-mem-bar",L)}let i=!1;async function n(){if(!i){i=!0;try{C();const[e,a]=await Promise.all([S(),y()]);q(e),E(a);const c=document.getElementById("dc-monitor-refresh-stamp");if(c){const s=new Date;c.textContent=`updated ${s.toLocaleTimeString()}`}}finally{i=!1}}}window.refreshMonitoringWidgets=n,setInterval(n,typeof DC<"u"&&DC.POLL&&DC.POLL.STATS||5e3),setTimeout(n,200)})(),(function(){"use strict";const v=(...t)=>{window.DASHCADDY_DEBUG&&console.log(...t)},k=["#app-selector-modal","#app-deploy-modal","#weather-modal","#token-management-modal","#service-edit-modal","#notifications-modal","#backup-modal","#stats-modal","#arr-setup-modal","#add-service-modal","#error-log-modal","#logs-modal","#dns-template-modal"];let u=null,h=null,f=null;function b(){try{C(),document.addEventListener("keydown",E),v("[Keyboard Shortcuts] Initialized"),v("[Keyboard Shortcuts] Press Ctrl+K to open quick search"),v("[Keyboard Shortcuts] Press Escape to close modals")}catch(t){console.warn("[Keyboard Shortcuts] Failed to initialize:",t.message)}}function C(){u=document.createElement("div"),u.id="quick-search-modal",u.className="quick-search-modal",u.innerHTML=`
|
|
<div class="quick-search-content">
|
|
<div class="quick-search-input-wrapper">
|
|
<span class="quick-search-icon">\u{1F50D}</span>
|
|
<input type="text" id="quick-search-input" placeholder="Search services, apps, or actions..." autocomplete="off">
|
|
<span class="quick-search-shortcut">ESC</span>
|
|
</div>
|
|
<div id="quick-search-results" class="quick-search-results"></div>
|
|
<div class="quick-search-footer">
|
|
<span><kbd>\u2191\u2193</kbd> Navigate</span>
|
|
<span><kbd>Enter</kbd> Select</span>
|
|
<span><kbd>Esc</kbd> Close</span>
|
|
</div>
|
|
</div>
|
|
`;const t=document.createElement("style");t.textContent=`
|
|
.quick-search-modal {
|
|
display: none;
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background: rgba(0, 0, 0, 0.7);
|
|
z-index: 100000;
|
|
justify-content: center;
|
|
align-items: flex-start;
|
|
padding-top: 15vh;
|
|
backdrop-filter: blur(4px);
|
|
}
|
|
|
|
.quick-search-modal.show {
|
|
display: flex;
|
|
}
|
|
|
|
.quick-search-content {
|
|
background: var(--card-base, #1a1a2e);
|
|
border: 1px solid var(--border, #333);
|
|
border-radius: 12px;
|
|
width: 90%;
|
|
max-width: 600px;
|
|
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.quick-search-input-wrapper {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 16px 20px;
|
|
border-bottom: 1px solid var(--border, #333);
|
|
gap: 12px;
|
|
}
|
|
|
|
.quick-search-icon {
|
|
font-size: 20px;
|
|
opacity: 0.6;
|
|
}
|
|
|
|
#quick-search-input {
|
|
flex: 1;
|
|
background: transparent;
|
|
border: none;
|
|
outline: none;
|
|
color: var(--fg, #fff);
|
|
font-size: 18px;
|
|
font-family: inherit;
|
|
}
|
|
|
|
#quick-search-input::placeholder {
|
|
color: var(--muted, #666);
|
|
}
|
|
|
|
.quick-search-shortcut {
|
|
background: var(--card-hover, #2a2a4e);
|
|
padding: 4px 8px;
|
|
border-radius: 4px;
|
|
font-size: 12px;
|
|
color: var(--muted, #666);
|
|
font-family: monospace;
|
|
}
|
|
|
|
.quick-search-results {
|
|
max-height: 400px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.quick-search-category {
|
|
padding: 8px 20px;
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
color: var(--muted, #666);
|
|
background: var(--card-hover, #2a2a4e);
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.quick-search-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 12px 20px;
|
|
cursor: pointer;
|
|
transition: background 0.15s;
|
|
gap: 12px;
|
|
}
|
|
|
|
.quick-search-item:hover,
|
|
.quick-search-item.selected {
|
|
background: var(--accent, #3498db);
|
|
}
|
|
|
|
.quick-search-item-icon {
|
|
font-size: 24px;
|
|
width: 32px;
|
|
text-align: center;
|
|
}
|
|
|
|
.quick-search-item-content {
|
|
flex: 1;
|
|
}
|
|
|
|
.quick-search-item-title {
|
|
font-weight: 500;
|
|
color: var(--fg, #fff);
|
|
}
|
|
|
|
.quick-search-item-description {
|
|
font-size: 12px;
|
|
color: var(--muted, #aaa);
|
|
margin-top: 2px;
|
|
}
|
|
|
|
.quick-search-item-badge {
|
|
padding: 2px 8px;
|
|
border-radius: 4px;
|
|
font-size: 11px;
|
|
background: var(--card-hover, #2a2a4e);
|
|
color: var(--muted, #888);
|
|
}
|
|
|
|
.quick-search-empty {
|
|
padding: 40px 20px;
|
|
text-align: center;
|
|
color: var(--muted, #666);
|
|
}
|
|
|
|
.quick-search-footer {
|
|
display: flex;
|
|
justify-content: center;
|
|
gap: 24px;
|
|
padding: 12px 20px;
|
|
border-top: 1px solid var(--border, #333);
|
|
background: var(--card-hover, #2a2a4e);
|
|
font-size: 12px;
|
|
color: var(--muted, #666);
|
|
}
|
|
|
|
.quick-search-footer kbd {
|
|
background: var(--card-base, #1a1a2e);
|
|
padding: 2px 6px;
|
|
border-radius: 4px;
|
|
font-family: monospace;
|
|
margin-right: 4px;
|
|
}
|
|
`,document.head.appendChild(t),document.body.appendChild(u),h=document.getElementById("quick-search-input"),f=document.getElementById("quick-search-results"),h.addEventListener("input",e),h.addEventListener("keydown",l),u.addEventListener("click",o=>{o.target===u&&y()})}function E(t){try{if((t.ctrlKey||t.metaKey)&&t.key==="k"){t.preventDefault(),S();return}if(t.key==="Escape"){if(u&&u.classList.contains("show")){y();return}q()}}catch(o){console.warn("[Keyboard Shortcuts] Error handling keydown:",o.message)}}function S(){try{u.classList.add("show"),h.value="",h.focus(),i()}catch(t){console.warn("[Keyboard Shortcuts] Error opening quick search:",t.message)}}function y(){try{u.classList.remove("show"),h.value="",f.innerHTML=""}catch(t){console.warn("[Keyboard Shortcuts] Error closing quick search:",t.message)}}function q(){for(const t of k){const o=document.querySelector(t);if(o&&(o.classList.contains("show")||o.style.display==="flex"))return o.classList.remove("show"),o.style.display="none",!0}return!1}function i(){const t=`
|
|
<div class="quick-search-category">Quick Actions</div>
|
|
<div class="quick-search-item" data-action="refresh">
|
|
<span class="quick-search-item-icon">\u{1F504}</span>
|
|
<div class="quick-search-item-content">
|
|
<div class="quick-search-item-title">Refresh Dashboard</div>
|
|
<div class="quick-search-item-description">Refresh all service statuses</div>
|
|
</div>
|
|
</div>
|
|
<div class="quick-search-item" data-action="reload-caddy">
|
|
<span class="quick-search-item-icon">\u26A1</span>
|
|
<div class="quick-search-item-content">
|
|
<div class="quick-search-item-title">Reload Caddy</div>
|
|
<div class="quick-search-item-description">Reload Caddy configuration</div>
|
|
</div>
|
|
</div>
|
|
<div class="quick-search-item" data-action="add-service">
|
|
<span class="quick-search-item-icon">\u2795</span>
|
|
<div class="quick-search-item-content">
|
|
<div class="quick-search-item-title">Add Service</div>
|
|
<div class="quick-search-item-description">Open service configuration modal</div>
|
|
</div>
|
|
</div>
|
|
<div class="quick-search-item" data-action="app-selector">
|
|
<span class="quick-search-item-icon">\u{1F4F1}</span>
|
|
<div class="quick-search-item-content">
|
|
<div class="quick-search-item-title">App Selector</div>
|
|
<div class="quick-search-item-description">Deploy new applications</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="quick-search-category">Services</div>
|
|
${n()}
|
|
`;f.innerHTML=t,s()}function n(){const t=document.querySelectorAll(".card[data-app], #cards .card");let o="";return t.forEach(r=>{const p=r.querySelector(".name")?.textContent||"Unknown",d=r.dataset.status||"unknown",w=r.dataset.app||"";p&&p!=="--"&&(o+=`
|
|
<div class="quick-search-item" data-action="open-service" data-service="${w}">
|
|
<span class="quick-search-item-icon">${d==="on"?"\u{1F7E2}":"\u{1F534}"}</span>
|
|
<div class="quick-search-item-content">
|
|
<div class="quick-search-item-title">${p}</div>
|
|
<div class="quick-search-item-description">Click to open service</div>
|
|
</div>
|
|
<span class="quick-search-item-badge">${d.toUpperCase()}</span>
|
|
</div>
|
|
`)}),o||'<div class="quick-search-empty">No services found</div>'}function e(t){try{const o=t.target.value.toLowerCase().trim();if(!o){i();return}const r=a(o);c(r)}catch(o){console.warn("[Keyboard Shortcuts] Error handling search input:",o.message)}}function a(t){const o={actions:[],services:[]};return[{id:"refresh",title:"Refresh Dashboard",icon:"\u{1F504}",keywords:"refresh reload update status"},{id:"reload-caddy",title:"Reload Caddy",icon:"\u26A1",keywords:"reload caddy proxy config"},{id:"add-service",title:"Add Service",icon:"\u2795",keywords:"add new service create"},{id:"app-selector",title:"App Selector",icon:"\u{1F4F1}",keywords:"app deploy install docker container"},{id:"backup",title:"Backup & Restore",icon:"\u{1F4BE}",keywords:"backup restore export import"},{id:"stats",title:"Container Stats",icon:"\u{1F4CA}",keywords:"stats resources cpu memory"},{id:"logs",title:"View Logs",icon:"\u{1F4CB}",keywords:"logs error debug"},{id:"tokens",title:"Manage Tokens",icon:"\u{1F511}",keywords:"tokens api keys credentials"},{id:"notifications",title:"Notifications",icon:"\u{1F514}",keywords:"alerts notifications discord telegram"},{id:"theme",title:"Change Theme",icon:"\u{1F3A8}",keywords:"theme dark light appearance"},{id:"tour",title:"Help Tour",icon:"\u{1F393}",keywords:"help tour guide onboarding"}].forEach(d=>{(d.title.toLowerCase().includes(t)||d.keywords.includes(t))&&o.actions.push(d)}),document.querySelectorAll(".card[data-app], #cards .card").forEach(d=>{const w=d.querySelector(".name")?.textContent||"",L=d.dataset.app||"",g=d.dataset.status||"unknown";(w.toLowerCase().includes(t)||L.toLowerCase().includes(t))&&o.services.push({id:L,title:w,status:g,icon:g==="on"?"\u{1F7E2}":"\u{1F534}"})}),o}function c(t){let o="";t.actions.length>0&&(o+='<div class="quick-search-category">Actions</div>',t.actions.forEach(r=>{o+=`
|
|
<div class="quick-search-item" data-action="${r.id}">
|
|
<span class="quick-search-item-icon">${r.icon}</span>
|
|
<div class="quick-search-item-content">
|
|
<div class="quick-search-item-title">${r.title}</div>
|
|
</div>
|
|
</div>
|
|
`})),t.services.length>0&&(o+='<div class="quick-search-category">Services</div>',t.services.forEach(r=>{o+=`
|
|
<div class="quick-search-item" data-action="open-service" data-service="${r.id}">
|
|
<span class="quick-search-item-icon">${r.icon}</span>
|
|
<div class="quick-search-item-content">
|
|
<div class="quick-search-item-title">${r.title}</div>
|
|
</div>
|
|
<span class="quick-search-item-badge">${r.status.toUpperCase()}</span>
|
|
</div>
|
|
`})),o||(o='<div class="quick-search-empty">No results found</div>'),f.innerHTML=o,s()}function s(){f.querySelectorAll(".quick-search-item").forEach((o,r)=>{o.addEventListener("click",()=>m(o)),r===0&&o.classList.add("selected")})}function l(t){try{const o=f.querySelectorAll(".quick-search-item"),r=f.querySelector(".quick-search-item.selected"),p=Array.from(o).indexOf(r);if(t.key==="ArrowDown"){t.preventDefault(),r&&r.classList.remove("selected");const d=(p+1)%o.length;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else if(t.key==="ArrowUp"){t.preventDefault(),r&&r.classList.remove("selected");const d=p<=0?o.length-1:p-1;o[d]?.classList.add("selected"),o[d]?.scrollIntoView({block:"nearest"})}else t.key==="Enter"&&(t.preventDefault(),r&&m(r))}catch(o){console.warn("[Keyboard Shortcuts] Error handling search navigation:",o.message)}}function m(t){try{const o=t.dataset.action,r=t.dataset.service;switch(y(),o){case"refresh":document.getElementById("refresh")?.click();break;case"reload-caddy":document.getElementById("reload-caddy-top")?.click();break;case"add-service":document.getElementById("add-service")?.click();break;case"app-selector":document.getElementById("add-service-btn")?.click();break;case"backup":document.getElementById("backup-restore-btn")?.click();break;case"stats":document.getElementById("container-stats-btn")?.click();break;case"logs":document.getElementById("view-error-logs")?.click();break;case"tokens":document.getElementById("manage-tokens")?.click();break;case"notifications":document.getElementById("manage-notifications")?.click();break;case"theme":document.getElementById("theme")?.click();break;case"tour":document.getElementById("restart-tour-btn")?.click();break;case"open-service":if(r){const p=document.querySelector(`[data-app="${r}"] [id$="-open"], [data-app="${r}"] button:not(.restart-btn):not(.logs-btn):not(.settings-btn)`);if(p)p.click();else{const d=document.querySelector(`[data-app="${r}"]`);d&&d.click()}}break;default:v("[Keyboard Shortcuts] Unknown action:",o)}}catch(o){console.warn("[Keyboard Shortcuts] Error executing action:",o.message)}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",b):b(),window.DashCaddyKeyboardShortcuts={openQuickSearch:S,closeQuickSearch:y}})();
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gPT09PT09PT09PSBEQVNIQk9BUkQgSU5JVElBTElaQVRJT04gPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcblxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tU2VydmljZXMoKSB7XG4gICAgY29uc3QgY3VzdG9tU2VydmljZXMgPSBzYWZlR2V0KCdjdXN0b20tc2VydmljZXMnKTtcbiAgICBpZiAoY3VzdG9tU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gSlNPTi5wYXJzZShjdXN0b21TZXJ2aWNlcyk7XG4gICAgICAgIC8vIE1lcmdlIHdpdGggZGVmYXVsdCBBUFBTLCBhdm9pZGluZyBkdXBsaWNhdGVzXG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgaWYgKCF3aW5kb3cuQVBQUy5maW5kKGFwcCA9PiBhcHAuaWQgPT09IHNlcnZpY2UuaWQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKHNlcnZpY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgY3VzdG9tIHNlcnZpY2VzOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgY3VzdG9tIHNlcnZpY2VzIGltbWVkaWF0ZWx5IHNvIHdpbmRvdy5BUFBTIGlzIHBvcHVsYXRlZCBiZWZvcmUgYnVpbGRHcmlkIHJ1bnNcbiAgbG9hZEN1c3RvbVNlcnZpY2VzKCk7XG5cbiAgLy8gU3RhZ2dlcmVkIGFuaW1hdGlvbiBmb3IgdG9wIGNhcmRzIHRvb1xuICBmdW5jdGlvbiBhbmltYXRlVG9wQ2FyZHMoKSB7XG4gICAgY29uc3QgdG9wQ2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudG9wIC5jYXJkJyk7XG4gICAgdG9wQ2FyZHMuZm9yRWFjaCgoY2FyZCwgaW5kZXgpID0+IHtcbiAgICAgIGNhcmQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gYCR7TWF0aC5taW4oaW5kZXggKiA2MCwgMzAwKX1tc2A7XG4gICAgfSk7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRvcENhcmRzLmZvckVhY2goY2FyZCA9PiBjYXJkLmNsYXNzTGlzdC5hZGQoJ2xvYWRlZCcpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpIHtcbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkgcmV0dXJuO1xuICAgIGlmICghd2luZG93LmlzU2VjdXJlQ29udGV4dCAmJiBsb2NhdGlvbi5ob3N0bmFtZSAhPT0gJ2xvY2FsaG9zdCcgJiYgbG9jYXRpb24uaG9zdG5hbWUgIT09ICcxMjcuMC4wLjEnKSByZXR1cm47XG5cbiAgICBjb25zdCByZWdpc3RlciA9ICgpID0+IHtcbiAgICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKCcvc3cuanMnLCB7IHVwZGF0ZVZpYUNhY2hlOiAnbm9uZScgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW2luaXRdIFNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICByZWdpc3RlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlZ2lzdGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBkYXNoYm9hcmQgKGNhbGxlZCBhZnRlciBUT1RQIGdhdGUgY2hlY2sgb3IgZGlyZWN0bHkgaWYgVE9UUCBkaXNhYmxlZClcbiAgLy8gTk9URTogbG9hZFNlcnZpY2VzIGNvbWVzIGZyb20gd2luZG93LmxvYWRTZXJ2aWNlcyAoZXhwb3J0ZWQgYnkgZ3JpZC5qcylcbiAgbGV0IF9kYXNoYm9hcmRJbml0aWFsaXplZCA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplRGFzaGJvYXJkKCkge1xuICAgIGlmIChfZGFzaGJvYXJkSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW2luaXRdIGluaXRpYWxpemVEYXNoYm9hcmQgY2FsbGVkIGFnYWluLCBza2lwcGluZyBkdXBsaWNhdGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Rhc2hib2FyZEluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aW5kb3cubG9hZFNlcnZpY2VzKCk7XG4gICAgYXdhaXQgbG9hZFRlbXBsYXRlQ2F0ZWdvcmllcygpO1xuICAgIHdpbmRvdy5idWlsZEdyaWQoKTtcbiAgICBhbmltYXRlVG9wQ2FyZHMoKTtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCgpO1xuICAgIHNldEludGVydmFsKHdpbmRvdy5yZWZyZXNoQWxsLCBEQy5QT0xMLkRBU0hCT0FSRCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cucmVmcmVzaENyZWRzQnV0dG9ucyA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlZnJlc2hDcmVkc0J1dHRvbnMoKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZWZyZXNoTW9uaXRvcmluZ1dpZGdldHMoKTtcbiAgICAvLyBVcGRhdGUgYXV0aCBjYXJkIChtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gdXBkYXRlZCBieSB0aGUgYXV0by1sb2FkIElJRkUgYnV0IGVuc3VyZSBpdCdzIGNvcnJlY3QpXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuX3VwZGF0ZUF1dGhDYXJkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdG90cC9jb25maWcnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgci5qc29uKCk7XG4gICAgICAgIGlmIChkLnN1Y2Nlc3MpIHdpbmRvdy5fdXBkYXRlQXV0aENhcmQoZC5jb25maWcuZW5hYmxlZCAmJiBkLmNvbmZpZy5pc1NldFVwLCBkLmNvbmZpZy5zZXNzaW9uRHVyYXRpb24pO1xuICAgICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuICAgIH1cbiAgICBpZiAod2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2luZG93Ll9fZGFzaGNhZGR5U2l0ZUNvbmZpZ0xvYWRlZDtcbiAgICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICB9XG4gICAgLy8gTGF6eS1sb2FkIG9uYm9hcmRpbmcgb25seSBvbmNlIHBlciBpbnN0YWxsLCBvdGhlcndpc2UganVzdCBhZGQgdGhlIHRvdXIgYnV0dG9uXG4gICAgYWRkVG91ckJ1dHRvbigpO1xuICAgIGlmIChzaG91bGRMb2FkT25ib2FyZGluZygpKSB7XG4gICAgICBsb2FkT25ib2FyZGluZygpO1xuICAgIH1cblxuICAgIC8vIERDLTA0ODogaW5qZWN0IHRoZSBcIkFkbWluXCIgdHJpZ2dlciBidXR0b24gaW50byB0aGUgdG9wIGJhci4gVGhlXG4gICAgLy8gYnV0dG9uIG9ubHkgcmVuZGVycyB3aGVuIC9tZSByZXR1cm5zIGlzQWRtaW49dHJ1ZTsgdGhlIG1vZHVsZVxuICAgIC8vIHJlLWNoZWNrcyBldmVyeSA2MHMgc28gYSBwZXJtaXNzaW9uIGRvd25ncmFkZSB0YWtlcyBlZmZlY3QuXG4gICAgaWYgKHdpbmRvdy5BZG1pblBhbmVsICYmIHR5cGVvZiB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3aW5kb3cuQWRtaW5QYW5lbC5hdHRhY2hUcmlnZ2VyKGRvY3VtZW50LmJvZHkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tpbml0XSBBZG1pblBhbmVsIGF0dGFjaFRyaWdnZXIgZmFpbGVkOicsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExhenktbG9hZCBvbmJvYXJkaW5nIGJ1bmRsZSAoNTIgS0IpIFx1MjAxNCBvbmx5IGxvYWRlZCB3aGVuIG5lZWRlZFxuICBmdW5jdGlvbiBsb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYz1cIi9kaXN0L29uYm9hcmRpbmcuanNcIl0nKSkgcmV0dXJuOyAvLyBhbHJlYWR5IGxvYWRpbmcvbG9hZGVkXG4gICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHMuc3JjID0gJy9kaXN0L29uYm9hcmRpbmcuanMnO1xuICAgIHMuZGVmZXIgPSB0cnVlO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7XG4gICAgLy8gQWxzbyBsb2FkIG9uYm9hcmRpbmcgQ1NTIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cIi9jc3MvZHJpdmVyLm1pbi5jc3NcIl0nKSkge1xuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgbGluay5ocmVmID0gJy9jc3MvZHJpdmVyLm1pbi5jc3MnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWY9XCIvY3NzL29uYm9hcmRpbmcuY3NzXCJdJykpIHtcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIGxpbmsuaHJlZiA9ICcvY3NzL29uYm9hcmRpbmcuY3NzJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgb25ib2FyZGluZyBzaG91bGQgYXV0by1zdGFydCAoZmlyc3QtdGltZSB1c2VyKVxuICBmdW5jdGlvbiBzaG91bGRMb2FkT25ib2FyZGluZygpIHtcbiAgICBpZiAodHlwZW9mIFNJVEUgIT09ICd1bmRlZmluZWQnICYmIFNJVEUub25ib2FyZGluZ0NvbXBsZXRlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Rhc2hjYWRkeV9vbmJvYXJkaW5nJykpO1xuICAgICAgcmV0dXJuICFkYXRhIHx8ICghZGF0YS50b3VyQ29tcGxldGVkICYmIGRhdGEuY3VycmVudFN0ZXAgPT09IDApO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBObyBkYXRhIG1lYW5zIGZpcnN0LXRpbWUgdXNlclxuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IENvbGxhcHNpYmxlIHRvb2xiYXIgc2VjdGlvbnMgPT09PT1cbiAgZnVuY3Rpb24gaW5pdFRvb2xiYXJTZWN0aW9ucygpIHtcbiAgICBjb25zdCBzZWN0aW9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJyk7XG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIFJlc3RvcmUgc2F2ZWQgc3RhdGUgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBsZXQgc2F2ZWQgPSB7fTtcbiAgICB0cnkgeyBzYXZlZCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnKSB8fCAne30nKTsgfSBjYXRjaCAoXykge31cblxuICAgIHNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBzZWN0aW9uLmRhdGFzZXQuc2VjdGlvbjtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHNlY3Rpb24ucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb24taGVhZGVyJyk7XG4gICAgICBpZiAoIWhlYWRlcikgcmV0dXJuO1xuXG4gICAgICAvLyBSZXN0b3JlIHN0YXRlIChkZWZhdWx0OiBjb2xsYXBzZWQpXG4gICAgICBpZiAoc2F2ZWRba2V5XSkge1xuICAgICAgICBzZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTtcbiAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICB9XG5cbiAgICAgIGhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgaXNPcGVuID0gc2VjdGlvbi5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG4gICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4gPyAndHJ1ZScgOiAnZmFsc2UnKTtcblxuICAgICAgICAvLyBTYXZlIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlID0ge307XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50b29scy1zZWN0aW9uJykuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICBzdGF0ZVtzLmRhdGFzZXQuc2VjdGlvbl0gPSBzLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Rvb2xiYXItc2VjdGlvbnMnLCBKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHRvb2xiYXIgc2VjdGlvbnMgb24gRE9NIHJlYWR5XG4gIGluaXRUb29sYmFyU2VjdGlvbnMoKTtcblxuICAvLyBBZGQgcmVzdGFydCB0b3VyIGJ1dHRvbiAobG9hZHMgYnVuZGxlIG9uIGNsaWNrIGlmIG5vdCBsb2FkZWQpXG4gIC8vIFZpc2libGUgaW4gcHJpbWFyeSB0b29sYmFyIHVudGlsIHRvdXIgY29tcGxldGVkIG9uY2UsIHRoZW4gbW92ZXMgdG8gQWRtaW4gc2VjdGlvblxuICBmdW5jdGlvbiBhZGRUb3VyQnV0dG9uKCkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydC10b3VyLWJ0bicpKSByZXR1cm47XG5cbiAgICBsZXQgdG91ckRvbmUgPSB0eXBlb2YgU0lURSAhPT0gJ3VuZGVmaW5lZCcgJiYgU0lURS5vbmJvYXJkaW5nQ29tcGxldGVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGFzaGNhZGR5X29uYm9hcmRpbmcnKSk7XG4gICAgICB0b3VyRG9uZSA9IHRvdXJEb25lIHx8ICEhKGRhdGEgJiYgZGF0YS50b3VyQ29tcGxldGVkKTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgLy8gQmVmb3JlIGZpcnN0IGNvbXBsZXRpb246IHNob3cgaW4gcHJpbWFyeSB0b29sYmFyLiBBZnRlcjogdHVjayBpbnRvIEFkbWluIHNlY3Rpb24uXG4gICAgY29uc3QgdGFyZ2V0ID0gdG91ckRvbmVcbiAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvb2xzLXNlY3Rpb25bZGF0YS1zZWN0aW9uPVwiYWRtaW5cIl0gLnRvb2xzLXNlY3Rpb24taXRlbXMnKVxuICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudG9vbHMtcHJpbWFyeScpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBidXR0b24uaWQgPSAncmVzdGFydC10b3VyLWJ0bic7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gdG91ckRvbmUgPyAnSGVscCBUb3VyJyA6ICdcdUQ4M0NcdURGOTMgSGVscCBUb3VyJztcbiAgICBidXR0b24udGl0bGUgPSAnUmVzdGFydCB0aGUgb25ib2FyZGluZyB0b3VyJztcbiAgICBidXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZykge1xuICAgICAgICB3aW5kb3cuRGFzaENhZGR5T25ib2FyZGluZy5yZXN0YXJ0VG91cigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZE9uYm9hcmRpbmcoKTtcbiAgICAgICAgLy8gV2FpdCBmb3IgYnVuZGxlIHRvIGxvYWQsIHRoZW4gc3RhcnRcbiAgICAgICAgY29uc3QgY2hlY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrKTtcbiAgICAgICAgICAgIHdpbmRvdy5EYXNoQ2FkZHlPbmJvYXJkaW5nLnJlc3RhcnRUb3VyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGNsZWFySW50ZXJ2YWwoY2hlY2spLCA1MDAwKTsgLy8gZ2l2ZSB1cCBhZnRlciA1c1xuICAgICAgfVxuICAgIH07XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH1cblxuICB3aW5kb3cuaW5pdGlhbGl6ZURhc2hib2FyZCA9IGluaXRpYWxpemVEYXNoYm9hcmQ7XG4gIHdpbmRvdy5sb2FkQ3VzdG9tU2VydmljZXMgPSBsb2FkQ3VzdG9tU2VydmljZXM7XG4gIHJlZ2lzdGVyU2VydmljZVdvcmtlcigpO1xuXG4gIC8vID09PT09IFRFTVBMQVRFIENBVEVHT1JJRVMgPT09PT1cbiAgLy8gQ2FjaGVkIHRlbXBsYXRlIGNhdGVnb3JpZXMgZnJvbSAvYXBpL3YxL3RlbXBsYXRlcyBmb3IgdXNlIGFjcm9zcyB0aGUgVUlcbiAgLy8gKHNlcnZpY2UgY3JlYXRlL2VkaXQsIGZpbHRlciBkcm9wZG93biwgY2F0ZWdvcnkgYmFkZ2VzLCBldGMuKVxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGVtcGxhdGVzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmICghci5vaykgcmV0dXJuO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jYXRlZ29yaWVzKSB7XG4gICAgICAgIHdpbmRvdy5EQ19DQVRFR09SSUVTID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICAvLyBBbHNvIGV4cG9zZSB2aWEgZ2xvYmFscy5qcyBjb25zdGFudCBmb3IgY29udmVuaWVuY2VcbiAgICAgICAgaWYgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcpIERDLkNBVEVHT1JJRVMgPSBkYXRhLmNhdGVnb3JpZXM7XG4gICAgICAgIC8vIFBvcHVsYXRlIGFueSBjYXRlZ29yeSA8c2VsZWN0PiB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgRE9NXG4gICAgICAgIHBvcHVsYXRlQ2F0ZWdvcnlTZWxlY3RzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbaW5pdF0gRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGUgY2F0ZWdvcmllczonLCBlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cygpIHtcbiAgICBjb25zdCBjYXRzID0gd2luZG93LkRDX0NBVEVHT1JJRVMgfHwgKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuQ0FURUdPUklFUyk7XG4gICAgaWYgKCFjYXRzKSByZXR1cm47XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc2VsZWN0W2RhdGEtcm9sZT1cInNlcnZpY2UtY2F0ZWdvcnlcIl0nKS5mb3JFYWNoKHNlbGVjdCA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc2VsZWN0LmRhdGFzZXQuY3VycmVudCB8fCAnJztcbiAgICAgIC8vIENsZWFyIG9wdGlvbnMgYnV0IGtlZXAgdGhlIGZpcnN0IChwbGFjZWhvbGRlcilcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gc2VsZWN0LnF1ZXJ5U2VsZWN0b3IoJ29wdGlvblt2YWx1ZT1cIlwiXScpO1xuICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgICAgaWYgKHBsYWNlaG9sZGVyKSBzZWxlY3QuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgIHBoLnZhbHVlID0gJyc7XG4gICAgICAgIHBoLnRleHRDb250ZW50ID0gJ1x1MjAxNCBTZWxlY3QgY2F0ZWdvcnkgXHUyMDE0JztcbiAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKHBoKTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5lbnRyaWVzKGNhdHMpLmZvckVhY2goKFtuYW1lLCBpbmZvXSkgPT4ge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gbmFtZTtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7aW5mby5pY29uIHx8ICcnfSAke25hbWV9YC50cmltKCk7XG4gICAgICAgIGlmIChuYW1lID09PSBjdXJyZW50KSBvcHQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQWxsb3cgb3RoZXIgbW9kdWxlcyB0byByZS1ydW4gcG9wdWxhdGlvbiBhZnRlciB0aGV5IChyZSlpbmplY3Qgc2VsZWN0c1xuICB3aW5kb3cucG9wdWxhdGVDYXRlZ29yeVNlbGVjdHMgPSBwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cztcbiAgd2luZG93LmxvYWRUZW1wbGF0ZUNhdGVnb3JpZXMgPSBsb2FkVGVtcGxhdGVDYXRlZ29yaWVzO1xuXG4gIC8vIFRPVFAtZ2F0ZWQgaW5pdGlhbGl6YXRpb25cbiAgKGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG90cFJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3RvdHAvY29uZmlnJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGNvbnN0IHRvdHBEYXRhID0gYXdhaXQgdG90cFJlcy5qc29uKCk7XG5cbiAgICAgIGlmICh0b3RwRGF0YS5zdWNjZXNzICYmIHRvdHBEYXRhLmNvbmZpZy5lbmFibGVkKSB7XG4gICAgICAgIC8vIFRPVFAgaXMgZW5hYmxlZCAtIGNoZWNrIGlmIHdlIGhhdmUgYSB2YWxpZCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHRlc3RSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS90b3RwL2NoZWNrLXNlc3Npb24nLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgICBpZiAodGVzdFJlcy5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgIC8vIE5lZWQgVE9UUCB2ZXJpZmljYXRpb24gLSBzaG93IG92ZXJsYXlcbiAgICAgICAgICB3aW5kb3cuX3Nob3dUb3RwT3ZlcmxheSgpO1xuICAgICAgICAgIHJldHVybjsgLy8gaW5pdGlhbGl6ZURhc2hib2FyZCgpIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RPVFAgY2hlY2sgZmFpbGVkLCBwcm9jZWVkaW5nIG5vcm1hbGx5OicsIGUpO1xuICAgIH1cblxuICAgIC8vIFRPVFAgZGlzYWJsZWQgb3Igc2Vzc2lvbiB2YWxpZCAtIGluaXRpYWxpemUgaW1tZWRpYXRlbHlcbiAgICBpbml0aWFsaXplRGFzaGJvYXJkKCk7XG4gIH0pKCk7XG5cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE1PTklUT1JJTkcgV0lER0VUUyA9PT09PT09PT09XG4vLyBFbWJlZHMgYSBjb21wYWN0IHN5c3RlbS1yZXNvdXJjZSArIGhlYWx0aCBzdW1tYXJ5IHBhbmVsIGRpcmVjdGx5IG9uIHRoZVxuLy8gbWFpbiBkYXNoYm9hcmQuIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBhIHNlcGFyYXRlIG1vbml0b3JpbmctZGFzaGJvYXJkLmh0bWxcbi8vIHBhZ2UgXHUyMDE0IHF1aWNrIGF0LWEtZ2xhbmNlIHN0YXRzIHdoZXJlIHlvdSBhbHJlYWR5IGFyZS5cbihmdW5jdGlvbiAoKSB7XG5cbiAgLy8gLS0tLS0gU3R5bGUgaW5qZWN0aW9uIChzY29wZWQgdG8gLmRjLW1vbml0b3Igc28gaXQgZG9lc24ndCBsZWFrKSAtLS0tLVxuICBjb25zdCBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGVFbC50ZXh0Q29udGVudCA9IGBcbiAgICAuZGMtbW9uaXRvciB7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgcGFkZGluZzogMTJweCAxNnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1jYXJkIHtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcsIHJnYmEoMjU1LDI1NSwyNTUsMC4wNCkpO1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBjb2xvcjogdmFyKC0tbXV0ZWQpO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdmFsdWUge1xuICAgICAgZm9udC1zaXplOiAxLjRyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLWZnKTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3Itc3ViIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyIHtcbiAgICAgIG1hcmdpbi10b3A6IDZweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbXV0ZWQpIDIwJSwgdHJhbnNwYXJlbnQpO1xuICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwge1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgd2lkdGg6IDAlO1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcsICMyN2FlNjApO1xuICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlLCBiYWNrZ3JvdW5kIDAuM3MgZWFzZTtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItYmFyLWZpbGwud2FybiB7IGJhY2tncm91bmQ6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1iYXItZmlsbC5iYWQgIHsgYmFja2dyb3VuZDogI2U3NGMzYzsgfVxuICAgIC5kYy1tb25pdG9yLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICB9XG4gICAgLmRjLW1vbml0b3ItdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjg1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCk7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgICAgcGFkZGluZzogMnB4IDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgZm9udC1zaXplOiAwLjdyZW07XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICAuZGMtbW9uaXRvci1waWxsLm9rICAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzI3YWU2MCAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICMyN2FlNjA7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLndhcm4geyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNmMzljMTI7IH1cbiAgICAuZGMtbW9uaXRvci1waWxsLmJhZCAgeyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2U3NGMzYyAyMCUsIHRyYW5zcGFyZW50KTsgY29sb3I6ICNlNzRjM2M7IH1cbiAgICAuZGMtbW9uaXRvci1yZWZyZXNoIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIG9wYWNpdHk6IDAuNztcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7XG5cbiAgLy8gLS0tLS0gQ29udGFpbmVyIGVsZW1lbnQgKGluc2VydGVkIGFib3ZlIHNlcnZpY2UtZmlsdGVyLWJhcikgLS0tLS1cbiAgY29uc3QgZmlsdGVyQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2UtZmlsdGVyLWJhcicpO1xuICBpZiAoIWZpbHRlckJhcikgcmV0dXJuO1xuXG4gIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHBhbmVsLmNsYXNzTmFtZSA9ICdkYy1tb25pdG9yJztcbiAgcGFuZWwuaWQgPSAnZGMtbW9uaXRvci1wYW5lbCc7XG4gIHBhbmVsLmlubmVySFRNTCA9IGBcbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1oZWFkZXJcIiBzdHlsZT1cImdyaWQtY29sdW1uOiAxIC8gLTE7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci10aXRsZVwiPlx1RDgzRFx1RENDQSBTeXN0ZW0gT3ZlcnZpZXc8L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZGMtbW9uaXRvci1yZWZyZXNoXCIgaWQ9XCJkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXBcIj5cdTIwMTQ8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItdmFsdWVcIiBpZD1cImRjLW1vbml0b3Itc2VydmljZXNcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1zZXJ2aWNlcy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5Db250YWluZXJzIFVwPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jb250YWluZXJzXCI+XHUyMDE0PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1zdWJcIiBpZD1cImRjLW1vbml0b3ItY29udGFpbmVycy1zdWJcIj5sb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItY2FyZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItbGFiZWxcIj5BdmcgQ1BVPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1jcHVcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhclwiPjxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWJhci1maWxsXCIgaWQ9XCJkYy1tb25pdG9yLWNwdS1iYXJcIj48L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci1sYWJlbFwiPkF2ZyBNZW1vcnk8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXZhbHVlXCIgaWQ9XCJkYy1tb25pdG9yLW1lbVwiPlx1MjAxNDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyXCI+PGRpdiBjbGFzcz1cImRjLW1vbml0b3ItYmFyLWZpbGxcIiBpZD1cImRjLW1vbml0b3ItbWVtLWJhclwiPjwvZGl2PjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLWxhYmVsXCI+SGVhbHRoPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGMtbW9uaXRvci12YWx1ZVwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGhcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYy1tb25pdG9yLXN1YlwiIGlkPVwiZGMtbW9uaXRvci1oZWFsdGgtc3ViXCI+XHUyMDE0PC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIC8vIEluc2VydCBBQk9WRSB0aGUgZmlsdGVyIGJhclxuICBmaWx0ZXJCYXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocGFuZWwsIGZpbHRlckJhcik7XG5cbiAgLy8gLS0tLS0gSGVscGVycyAtLS0tLVxuICBmdW5jdGlvbiBzZXRCYXIoaWQsIHBjdCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBOdW1iZXIocGN0KSB8fCAwKSk7XG4gICAgZWwuc3R5bGUud2lkdGggPSBwICsgJyUnO1xuICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3dhcm4nLCAnYmFkJyk7XG4gICAgaWYgKHAgPj0gODUpIGVsLmNsYXNzTGlzdC5hZGQoJ2JhZCcpO1xuICAgIGVsc2UgaWYgKHAgPj0gNjUpIGVsLmNsYXNzTGlzdC5hZGQoJ3dhcm4nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdFBjdCh2KSB7XG4gICAgaWYgKHYgPT0gbnVsbCB8fCBpc05hTih2KSkgcmV0dXJuICdcdTIwMTQnO1xuICAgIHJldHVybiAoTWF0aC5yb3VuZCh2ICogMTApIC8gMTApICsgJyUnO1xuICB9XG5cbiAgZnVuY3Rpb24gZm10Qnl0ZXMoYikge1xuICAgIGlmIChiID09IG51bGwgfHwgaXNOYU4oYikpIHJldHVybiAnXHUyMDE0JztcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQiddO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoYiA+PSAxMDI0ICYmIGkgPCB1bml0cy5sZW5ndGggLSAxKSB7IGIgLz0gMTAyNDsgaSsrOyB9XG4gICAgcmV0dXJuIGIudG9GaXhlZCgxKSArICcgJyArIHVuaXRzW2ldO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0U2VydmljZXNDYXJkKCkge1xuICAgIGNvbnN0IHRvdGFsID0gKHdpbmRvdy5BUFBTIHx8IFtdKS5sZW5ndGg7XG4gICAgbGV0IHVwID0gMDtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjY2FyZHMgLmNhcmQnKS5mb3JFYWNoKGMgPT4ge1xuICAgICAgaWYgKGMuZGF0YXNldC5zdGF0dXMgPT09ICdvbicpIHVwKys7XG4gICAgfSk7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGMtbW9uaXRvci1zZXJ2aWNlcycpO1xuICAgIGNvbnN0IHN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXNlcnZpY2VzLXN1YicpO1xuICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBgJHt1cH0gLyAke3RvdGFsfWA7XG4gICAgaWYgKHN1Yikgc3ViLnRleHRDb250ZW50ID0gdG90YWwgPT09IDAgPyAnbm8gc2VydmljZXMgeWV0JyA6IGAke3VwfSBvbmxpbmUgXHUwMEI3ICR7dG90YWwgLSB1cH0gb2ZmbGluZWA7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUhlYWx0aFN1bW1hcnkoZGF0YSkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoJyk7XG4gICAgY29uc3Qgc3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItaGVhbHRoLXN1YicpO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBpZiAoIWRhdGEgfHwgZGF0YS5zdW1tYXJ5ID09IG51bGwpIHtcbiAgICAgIGVsLnRleHRDb250ZW50ID0gJ1x1MjAxNCc7XG4gICAgICBpZiAoc3ViKSBzdWIudGV4dENvbnRlbnQgPSAnbm8gZGF0YSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHMgPSBkYXRhLnN1bW1hcnk7XG4gICAgY29uc3QgaGVhbHRoeSA9IHMuaGVhbHRoeSA/PyBzLnVwID8/IDA7XG4gICAgY29uc3QgdW5oZWFsdGh5ID0gcy51bmhlYWx0aHkgPz8gcy5kb3duID8/IDA7XG4gICAgY29uc3QgdG90YWwgPSBzLnRvdGFsID8/IChoZWFsdGh5ICsgdW5oZWFsdGh5KTtcbiAgICBlbC50ZXh0Q29udGVudCA9IGAke2hlYWx0aHl9LyR7dG90YWx9YDtcbiAgICBpZiAoc3ViKSB7XG4gICAgICBpZiAodW5oZWFsdGh5ID09PSAwKSB7XG4gICAgICAgIHN1Yi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJkYy1tb25pdG9yLXBpbGwgb2tcIj5cdTI1Q0YgYWxsIGhlYWx0aHk8L3NwYW4+JztcbiAgICAgIH0gZWxzZSBpZiAodW5oZWFsdGh5IDw9IDIpIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCB3YXJuXCI+XHUyNUNGICR7dW5oZWFsdGh5fSBkZWdyYWRlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3ViLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImRjLW1vbml0b3ItcGlsbCBiYWRcIj5cdTI1Q0YgJHt1bmhlYWx0aHl9IGRvd248L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSBEYXRhIGZldGNoZXMgLS0tLS1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTdGF0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3Jpbmcvc3RhdHMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgIHJldHVybiAoZGF0YSAmJiBkYXRhLnN0YXRzKSA/IGRhdGEuc3RhdHMgOiBudWxsO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGZldGNoSGVhbHRoKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvaGVhbHRoLWNoZWNrcy9zdGF0dXMnLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgICAgaWYgKCFyLm9rKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhd2FpdCByLmpzb24oKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVN0YXRzKHN0YXRzKSB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNvbnRhaW5lcnMnKTtcbiAgICBjb25zdCBjb250YWluZXJzU3ViID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItY29udGFpbmVycy1zdWInKTtcbiAgICBjb25zdCBjcHVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLWNwdScpO1xuICAgIGNvbnN0IG1lbUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RjLW1vbml0b3ItbWVtJyk7XG5cbiAgICBpZiAoIXN0YXRzKSB7XG4gICAgICBpZiAoY29udGFpbmVycykgY29udGFpbmVycy50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgaWYgKG1lbUVsKSBtZW1FbC50ZXh0Q29udGVudCA9ICdcdTIwMTQnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QudmFsdWVzKHN0YXRzKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gJzAnO1xuICAgICAgaWYgKGNvbnRhaW5lcnNTdWIpIGNvbnRhaW5lcnNTdWIudGV4dENvbnRlbnQgPSAnbm8gY29udGFpbmVycyByZXBvcnRpbmcnO1xuICAgICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9ICcwJSc7XG4gICAgICBpZiAobWVtRWwpIG1lbUVsLnRleHRDb250ZW50ID0gJzAlJztcbiAgICAgIHNldEJhcignZGMtbW9uaXRvci1jcHUtYmFyJywgMCk7XG4gICAgICBzZXRCYXIoJ2RjLW1vbml0b3ItbWVtLWJhcicsIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjcHVTdW0gPSAwLCBtZW1TdW0gPSAwLCBtZW1CeXRlcyA9IDAsIGNwdUNvdW50ID0gMCwgbWVtQ291bnQgPSAwO1xuICAgIGVudHJpZXMuZm9yRWFjaChzID0+IHtcbiAgICAgIC8vIENQVSBtYXkgYmUgcGVyY2VudGFnZSAoMC0xMDApIG9yIGZyYWN0aW9uICgwLTEpIFx1MjAxNCBoYW5kbGUgYm90aFxuICAgICAgaWYgKHMuY3B1ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgY3B1ID0gTnVtYmVyKHMuY3B1KTtcbiAgICAgICAgaWYgKCFpc05hTihjcHUpKSB7XG4gICAgICAgICAgY3B1U3VtICs9IGNwdSA+IDEgPyBjcHUgOiBjcHUgKiAxMDA7XG4gICAgICAgICAgY3B1Q291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMubWVtb3J5ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbWVtID0gTnVtYmVyKHMubWVtb3J5KTtcbiAgICAgICAgaWYgKCFpc05hTihtZW0pKSB7XG4gICAgICAgICAgbWVtU3VtICs9IG1lbTtcbiAgICAgICAgICBtZW1CeXRlcyArPSBOdW1iZXIocy5tZW1vcnlVc2FnZSB8fCAwKTtcbiAgICAgICAgICBtZW1Db3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhdmdDcHUgPSBjcHVDb3VudCA/IGNwdVN1bSAvIGNwdUNvdW50IDogMDtcbiAgICBjb25zdCBhdmdNZW0gPSBtZW1Db3VudCA/IG1lbVN1bSAvIG1lbUNvdW50IDogMDtcblxuICAgIGlmIChjb250YWluZXJzKSBjb250YWluZXJzLnRleHRDb250ZW50ID0gU3RyaW5nKGVudHJpZXMubGVuZ3RoKTtcbiAgICBpZiAoY29udGFpbmVyc1N1Yikge1xuICAgICAgY29uc3QgbWVtVHh0ID0gbWVtQnl0ZXMgPyBgIFx1MDBCNyAke2ZtdEJ5dGVzKG1lbUJ5dGVzKX0gUkFNYCA6ICcnO1xuICAgICAgY29udGFpbmVyc1N1Yi50ZXh0Q29udGVudCA9IGBydW5uaW5nJHttZW1UeHR9YDtcbiAgICB9XG4gICAgaWYgKGNwdUVsKSBjcHVFbC50ZXh0Q29udGVudCA9IGZtdFBjdChhdmdDcHUpO1xuICAgIGlmIChtZW1FbCkgbWVtRWwudGV4dENvbnRlbnQgPSBmbXRQY3QoYXZnTWVtKTtcbiAgICBzZXRCYXIoJ2RjLW1vbml0b3ItY3B1LWJhcicsIGF2Z0NwdSk7XG4gICAgc2V0QmFyKCdkYy1tb25pdG9yLW1lbS1iYXInLCBhdmdNZW0pO1xuICB9XG5cbiAgLy8gLS0tLS0gUHVibGljIHJlZnJlc2ggZnVuY3Rpb24gLS0tLS1cbiAgbGV0IGluRmxpZ2h0ID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goKSB7XG4gICAgaWYgKGluRmxpZ2h0KSByZXR1cm47XG4gICAgaW5GbGlnaHQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBzZXRTZXJ2aWNlc0NhcmQoKTtcbiAgICAgIGNvbnN0IFtzdGF0cywgaGVhbHRoXSA9IGF3YWl0IFByb21pc2UuYWxsKFtmZXRjaFN0YXRzKCksIGZldGNoSGVhbHRoKCldKTtcbiAgICAgIGFwcGx5U3RhdHMoc3RhdHMpO1xuICAgICAgYXBwbHlIZWFsdGhTdW1tYXJ5KGhlYWx0aCk7XG4gICAgICBjb25zdCBzdGFtcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYy1tb25pdG9yLXJlZnJlc2gtc3RhbXAnKTtcbiAgICAgIGlmIChzdGFtcCkge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBzdGFtcC50ZXh0Q29udGVudCA9IGB1cGRhdGVkICR7bm93LnRvTG9jYWxlVGltZVN0cmluZygpfWA7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluRmxpZ2h0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3NlIGZvciBpbml0LmpzIHRvIGNhbGwgb25jZSBhbmQgcmUtY2FsbCBhZnRlciBlYWNoIHJlZnJlc2hBbGwgY3ljbGVcbiAgd2luZG93LnJlZnJlc2hNb25pdG9yaW5nV2lkZ2V0cyA9IHJlZnJlc2g7XG5cbiAgLy8gQXV0by1yZWZyZXNoIG9uIHRoZSBTVEFUUyBpbnRlcnZhbCAoc2VwYXJhdGUgZnJvbSBmdWxsIERBU0hCT0FSRCByZWZyZXNoKVxuICBzZXRJbnRlcnZhbChyZWZyZXNoLCAodHlwZW9mIERDICE9PSAndW5kZWZpbmVkJyAmJiBEQy5QT0xMICYmIERDLlBPTEwuU1RBVFMpIHx8IDUwMDApO1xuXG4gIC8vIFJlZnJlc2ggb25jZSBvbiBmaXJzdCBzY3JpcHQgbG9hZCAoaW5pdC5qcyBhbHNvIGNhbGxzIHRoaXM7IGRvdWJsZS1jYWxsIGlzIGhhcm1sZXNzKVxuICBzZXRUaW1lb3V0KHJlZnJlc2gsIDIwMCk7XG5cbn0pKCk7XG47XG4vKipcbiAqIERhc2hDYWRkeSBLZXlib2FyZCBTaG9ydGN1dHMgU3lzdGVtXG4gKiBQcm92aWRlcyBnbG9iYWwga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciBpbXByb3ZlZCBuYXZpZ2F0aW9uXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgZGVidWcgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmICh3aW5kb3cuREFTSENBRERZX0RFQlVHKSB7IGNvbnNvbGUubG9nKC4uLmFyZ3MpOyB9XG4gIH07XG5cbiAgLy8gQWxsIG1vZGFsIHNlbGVjdG9ycyB0aGF0IGNhbiBiZSBjbG9zZWQgd2l0aCBFc2NhcGVcbiAgY29uc3QgTU9EQUxfU0VMRUNUT1JTID0gW1xuICAgICcjYXBwLXNlbGVjdG9yLW1vZGFsJyxcbiAgICAnI2FwcC1kZXBsb3ktbW9kYWwnLFxuICAgICcjd2VhdGhlci1tb2RhbCcsXG4gICAgJyN0b2tlbi1tYW5hZ2VtZW50LW1vZGFsJyxcbiAgICAnI3NlcnZpY2UtZWRpdC1tb2RhbCcsXG4gICAgJyNub3RpZmljYXRpb25zLW1vZGFsJyxcbiAgICAnI2JhY2t1cC1tb2RhbCcsXG4gICAgJyNzdGF0cy1tb2RhbCcsXG4gICAgJyNhcnItc2V0dXAtbW9kYWwnLFxuICAgICcjYWRkLXNlcnZpY2UtbW9kYWwnLFxuICAgICcjZXJyb3ItbG9nLW1vZGFsJyxcbiAgICAnI2xvZ3MtbW9kYWwnLFxuICAgICcjZG5zLXRlbXBsYXRlLW1vZGFsJ1xuICBdO1xuXG4gIC8vIFF1aWNrIHNlYXJjaCBzdGF0ZVxuICBsZXQgcXVpY2tTZWFyY2hNb2RhbCA9IG51bGw7XG4gIGxldCBxdWlja1NlYXJjaElucHV0ID0gbnVsbDtcbiAgbGV0IHF1aWNrU2VhcmNoUmVzdWx0cyA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGtleWJvYXJkIHNob3J0Y3V0cyBzeXN0ZW1cbiAgICovXG4gIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBxdWljayBzZWFyY2ggbW9kYWxcbiAgICAgIGNyZWF0ZVF1aWNrU2VhcmNoTW9kYWwoKTtcblxuICAgICAgLy8gQWRkIGdsb2JhbCBrZXlib2FyZCBsaXN0ZW5lclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xuXG4gICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gSW5pdGlhbGl6ZWQnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBDdHJsK0sgdG8gb3BlbiBxdWljayBzZWFyY2gnKTtcbiAgICAgIGRlYnVnKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBQcmVzcyBFc2NhcGUgdG8gY2xvc2UgbW9kYWxzJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZTonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUXVpY2tTZWFyY2hNb2RhbCgpIHtcbiAgICBxdWlja1NlYXJjaE1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pZCA9ICdxdWljay1zZWFyY2gtbW9kYWwnO1xuICAgIHF1aWNrU2VhcmNoTW9kYWwuY2xhc3NOYW1lID0gJ3F1aWNrLXNlYXJjaC1tb2RhbCc7XG4gICAgcXVpY2tTZWFyY2hNb2RhbC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaWNvblwiPlx1RDgzRFx1REQwRDwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInF1aWNrLXNlYXJjaC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHNlcnZpY2VzLCBhcHBzLCBvciBhY3Rpb25zLi4uXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtc2hvcnRjdXRcIj5FU0M8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwicXVpY2stc2VhcmNoLXJlc3VsdHNcIiBjbGFzcz1cInF1aWNrLXNlYXJjaC1yZXN1bHRzXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZm9vdGVyXCI+XG4gICAgICAgICAgPHNwYW4+PGtiZD5cdTIxOTFcdTIxOTM8L2tiZD4gTmF2aWdhdGU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5FbnRlcjwva2JkPiBTZWxlY3Q8L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PGtiZD5Fc2M8L2tiZD4gQ2xvc2U8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIC8vIEFkZCBzdHlsZXNcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgICAucXVpY2stc2VhcmNoLW1vZGFsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBib3R0b206IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgICAgICAgei1pbmRleDogMTAwMDAwO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIHBhZGRpbmctdG9wOiAxNXZoO1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1tb2RhbC5zaG93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jb250ZW50IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlLCAjMWExYTJlKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLCAjMzMzKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgd2lkdGg6IDkwJTtcbiAgICAgICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDUwcHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjUpO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWlucHV0LXdyYXBwZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBwYWRkaW5nOiAxNnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuXG4gICAgICAjcXVpY2stc2VhcmNoLWlucHV0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgY29sb3I6IHZhcigtLWZnLCAjZmZmKTtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgIH1cblxuICAgICAgI3F1aWNrLXNlYXJjaC1pbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXNob3J0Y3V0IHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIHBhZGRpbmc6IDRweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLXJlc3VsdHMge1xuICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1jYXRlZ29yeSB7XG4gICAgICAgIHBhZGRpbmc6IDhweCAyMHB4O1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzY2Nik7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtaG92ZXIsICMyYTJhNGUpO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDEycHggMjBweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbTpob3ZlcixcbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS5zZWxlY3RlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCwgIzM0OThkYik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyNHB4O1xuICAgICAgICB3aWR0aDogMzJweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tY29udGVudCB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS10aXRsZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1mZywgI2ZmZik7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjYWFhKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWl0ZW0tYmFkZ2Uge1xuICAgICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3ZlciwgIzJhMmE0ZSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1tdXRlZCwgIzg4OCk7XG4gICAgICB9XG5cbiAgICAgIC5xdWljay1zZWFyY2gtZW1wdHkge1xuICAgICAgICBwYWRkaW5nOiA0MHB4IDIwcHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgY29sb3I6IHZhcigtLW11dGVkLCAjNjY2KTtcbiAgICAgIH1cblxuICAgICAgLnF1aWNrLXNlYXJjaC1mb290ZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAyNHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIsICMzMzMpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWhvdmVyLCAjMmEyYTRlKTtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0tbXV0ZWQsICM2NjYpO1xuICAgICAgfVxuXG4gICAgICAucXVpY2stc2VhcmNoLWZvb3RlciBrYmQge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UsICMxYTFhMmUpO1xuICAgICAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgICAgfVxuICAgIGA7XG5cbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHF1aWNrU2VhcmNoTW9kYWwpO1xuXG4gICAgcXVpY2tTZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdWljay1zZWFyY2gtaW5wdXQnKTtcbiAgICBxdWlja1NlYXJjaFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVpY2stc2VhcmNoLXJlc3VsdHMnKTtcblxuICAgIC8vIElucHV0IGhhbmRsaW5nXG4gICAgcXVpY2tTZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGhhbmRsZVNlYXJjaElucHV0KTtcbiAgICBxdWlja1NlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVTZWFyY2hLZXlEb3duKTtcblxuICAgIC8vIENsb3NlIG9uIGJhY2tkcm9wIGNsaWNrXG4gICAgcXVpY2tTZWFyY2hNb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgPT09IHF1aWNrU2VhcmNoTW9kYWwpIHtcbiAgICAgICAgY2xvc2VRdWlja1NlYXJjaCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBnbG9iYWwga2V5ZG93biBldmVudHNcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDdHJsK0sgb3IgQ21kK0sgdG8gb3BlbiBxdWljayBzZWFyY2hcbiAgICAgIGlmICgoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9wZW5RdWlja1NlYXJjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEVzY2FwZSB0byBjbG9zZSBtb2RhbHNcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgcXVpY2sgc2VhcmNoIGlzIG9wZW5cbiAgICAgICAgaWYgKHF1aWNrU2VhcmNoTW9kYWwgJiYgcXVpY2tTZWFyY2hNb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkge1xuICAgICAgICAgIGNsb3NlUXVpY2tTZWFyY2goKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIGNsb3NlIGFueSBvdGhlciBvcGVuIG1vZGFsXG4gICAgICAgIGNsb3NlVG9wTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBrZXlkb3duOicsIGUyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHF1aWNrIHNlYXJjaCBtb2RhbFxuICAgKi9cbiAgZnVuY3Rpb24gb3BlblF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQuZm9jdXMoKTtcbiAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0tleWJvYXJkIFNob3J0Y3V0c10gRXJyb3Igb3BlbmluZyBxdWljayBzZWFyY2g6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgcXVpY2sgc2VhcmNoIG1vZGFsXG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZVF1aWNrU2VhcmNoKCkge1xuICAgIHRyeSB7XG4gICAgICBxdWlja1NlYXJjaE1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHF1aWNrU2VhcmNoSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHF1aWNrU2VhcmNoUmVzdWx0cy5pbm5lckhUTUwgPSAnJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGNsb3NpbmcgcXVpY2sgc2VhcmNoOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB0b3Btb3N0IG9wZW4gbW9kYWxcbiAgICovXG4gIGZ1bmN0aW9uIGNsb3NlVG9wTW9kYWwoKSB7XG4gICAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBNT0RBTF9TRUxFQ1RPUlMpIHtcbiAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAobW9kYWwgJiYgKG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpIHx8IG1vZGFsLnN0eWxlLmRpc3BsYXkgPT09ICdmbGV4JykpIHtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgZGVmYXVsdC9zdWdnZXN0ZWQgcmVzdWx0c1xuICAgKi9cbiAgZnVuY3Rpb24gc2hvd0RlZmF1bHRSZXN1bHRzKCkge1xuICAgIGNvbnN0IGh0bWwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWNhdGVnb3J5XCI+UXVpY2sgQWN0aW9uczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJyZWZyZXNoXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1RDgzRFx1REQwNDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWZyZXNoIERhc2hib2FyZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPlJlZnJlc2ggYWxsIHNlcnZpY2Ugc3RhdHVzZXM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwicmVsb2FkLWNhZGR5XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPlx1MjZBMTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tdGl0bGVcIj5SZWxvYWQgQ2FkZHk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5SZWxvYWQgQ2FkZHkgY29uZmlndXJhdGlvbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhZGQtc2VydmljZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj5cdTI3OTU8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+QWRkIFNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5PcGVuIHNlcnZpY2UgY29uZmlndXJhdGlvbiBtb2RhbDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCJhcHAtc2VsZWN0b3JcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+XHVEODNEXHVEQ0YxPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS10aXRsZVwiPkFwcCBTZWxlY3RvcjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1kZXNjcmlwdGlvblwiPkRlcGxveSBuZXcgYXBwbGljYXRpb25zPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgJHtnZXRTZXJ2aWNlSXRlbXMoKX1cbiAgICBgO1xuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlcnZpY2UgaXRlbXMgZnJvbSB0aGUgZGFzaGJvYXJkXG4gICAqL1xuICBmdW5jdGlvbiBnZXRTZXJ2aWNlSXRlbXMoKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY2FyZFtkYXRhLWFwcF0sICNjYXJkcyAuY2FyZCcpO1xuICAgIGxldCBodG1sID0gJyc7XG5cbiAgICBjYXJkcy5mb3JFYWNoKGNhcmQgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IGNhcmQucXVlcnlTZWxlY3RvcignLm5hbWUnKT8udGV4dENvbnRlbnQgfHwgJ1Vua25vd24nO1xuICAgICAgY29uc3Qgc3RhdHVzID0gY2FyZC5kYXRhc2V0LnN0YXR1cyB8fCAndW5rbm93bic7XG4gICAgICBjb25zdCBhcHAgPSBjYXJkLmRhdGFzZXQuYXBwIHx8ICcnO1xuXG4gICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSAnLS0nKSB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHthcHB9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWljb25cIj4ke3N0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCd9PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtuYW1lfTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0tZGVzY3JpcHRpb25cIj5DbGljayB0byBvcGVuIHNlcnZpY2U8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1iYWRnZVwiPiR7c3RhdHVzLnRvVXBwZXJDYXNlKCl9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGh0bWwgfHwgJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtZW1wdHlcIj5ObyBzZXJ2aWNlcyBmb3VuZDwvZGl2Pic7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNlYXJjaCBpbnB1dFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoSW5wdXQoZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IGUudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgIHNob3dEZWZhdWx0UmVzdWx0cygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIHNlcnZpY2VzIGFuZCBhY3Rpb25zXG4gICAgICBjb25zdCByZXN1bHRzID0gc2VhcmNoQWxsKHF1ZXJ5KTtcbiAgICAgIGRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3VsdHMpO1xuICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGhhbmRsaW5nIHNlYXJjaCBpbnB1dDonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGFsbCBpdGVtc1xuICAgKi9cbiAgZnVuY3Rpb24gc2VhcmNoQWxsKHF1ZXJ5KSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHtcbiAgICAgIGFjdGlvbnM6IFtdLFxuICAgICAgc2VydmljZXM6IFtdXG4gICAgfTtcblxuICAgIC8vIFNlYXJjaCBhY3Rpb25zXG4gICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgIHsgaWQ6ICdyZWZyZXNoJywgdGl0bGU6ICdSZWZyZXNoIERhc2hib2FyZCcsIGljb246ICdcdUQ4M0RcdUREMDQnLCBrZXl3b3JkczogJ3JlZnJlc2ggcmVsb2FkIHVwZGF0ZSBzdGF0dXMnIH0sXG4gICAgICB7IGlkOiAncmVsb2FkLWNhZGR5JywgdGl0bGU6ICdSZWxvYWQgQ2FkZHknLCBpY29uOiAnXHUyNkExJywga2V5d29yZHM6ICdyZWxvYWQgY2FkZHkgcHJveHkgY29uZmlnJyB9LFxuICAgICAgeyBpZDogJ2FkZC1zZXJ2aWNlJywgdGl0bGU6ICdBZGQgU2VydmljZScsIGljb246ICdcdTI3OTUnLCBrZXl3b3JkczogJ2FkZCBuZXcgc2VydmljZSBjcmVhdGUnIH0sXG4gICAgICB7IGlkOiAnYXBwLXNlbGVjdG9yJywgdGl0bGU6ICdBcHAgU2VsZWN0b3InLCBpY29uOiAnXHVEODNEXHVEQ0YxJywga2V5d29yZHM6ICdhcHAgZGVwbG95IGluc3RhbGwgZG9ja2VyIGNvbnRhaW5lcicgfSxcbiAgICAgIHsgaWQ6ICdiYWNrdXAnLCB0aXRsZTogJ0JhY2t1cCAmIFJlc3RvcmUnLCBpY29uOiAnXHVEODNEXHVEQ0JFJywga2V5d29yZHM6ICdiYWNrdXAgcmVzdG9yZSBleHBvcnQgaW1wb3J0JyB9LFxuICAgICAgeyBpZDogJ3N0YXRzJywgdGl0bGU6ICdDb250YWluZXIgU3RhdHMnLCBpY29uOiAnXHVEODNEXHVEQ0NBJywga2V5d29yZHM6ICdzdGF0cyByZXNvdXJjZXMgY3B1IG1lbW9yeScgfSxcbiAgICAgIHsgaWQ6ICdsb2dzJywgdGl0bGU6ICdWaWV3IExvZ3MnLCBpY29uOiAnXHVEODNEXHVEQ0NCJywga2V5d29yZHM6ICdsb2dzIGVycm9yIGRlYnVnJyB9LFxuICAgICAgeyBpZDogJ3Rva2VucycsIHRpdGxlOiAnTWFuYWdlIFRva2VucycsIGljb246ICdcdUQ4M0RcdUREMTEnLCBrZXl3b3JkczogJ3Rva2VucyBhcGkga2V5cyBjcmVkZW50aWFscycgfSxcbiAgICAgIHsgaWQ6ICdub3RpZmljYXRpb25zJywgdGl0bGU6ICdOb3RpZmljYXRpb25zJywgaWNvbjogJ1x1RDgzRFx1REQxNCcsIGtleXdvcmRzOiAnYWxlcnRzIG5vdGlmaWNhdGlvbnMgZGlzY29yZCB0ZWxlZ3JhbScgfSxcbiAgICAgIHsgaWQ6ICd0aGVtZScsIHRpdGxlOiAnQ2hhbmdlIFRoZW1lJywgaWNvbjogJ1x1RDgzQ1x1REZBOCcsIGtleXdvcmRzOiAndGhlbWUgZGFyayBsaWdodCBhcHBlYXJhbmNlJyB9LFxuICAgICAgeyBpZDogJ3RvdXInLCB0aXRsZTogJ0hlbHAgVG91cicsIGljb246ICdcdUQ4M0NcdURGOTMnLCBrZXl3b3JkczogJ2hlbHAgdG91ciBndWlkZSBvbmJvYXJkaW5nJyB9XG4gICAgXTtcblxuICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgaWYgKGFjdGlvbi50aXRsZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhY3Rpb24ua2V5d29yZHMuaW5jbHVkZXMocXVlcnkpKSB7XG4gICAgICAgIHJlc3VsdHMuYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTZWFyY2ggc2VydmljZXNcbiAgICBjb25zdCBjYXJkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jYXJkW2RhdGEtYXBwXSwgI2NhcmRzIC5jYXJkJyk7XG4gICAgY2FyZHMuZm9yRWFjaChjYXJkID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy5uYW1lJyk/LnRleHRDb250ZW50IHx8ICcnO1xuICAgICAgY29uc3QgYXBwID0gY2FyZC5kYXRhc2V0LmFwcCB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNhcmQuZGF0YXNldC5zdGF0dXMgfHwgJ3Vua25vd24nO1xuXG4gICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSB8fCBhcHAudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSkpIHtcbiAgICAgICAgcmVzdWx0cy5zZXJ2aWNlcy5wdXNoKHtcbiAgICAgICAgICBpZDogYXBwLFxuICAgICAgICAgIHRpdGxlOiBuYW1lLFxuICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgIGljb246IHN0YXR1cyA9PT0gJ29uJyA/ICdcdUQ4M0RcdURGRTInIDogJ1x1RDgzRFx1REQzNCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHNlYXJjaCByZXN1bHRzXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwbGF5U2VhcmNoUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWwgPSAnJztcblxuICAgIGlmIChyZXN1bHRzLmFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1jYXRlZ29yeVwiPkFjdGlvbnM8L2Rpdj4nO1xuICAgICAgcmVzdWx0cy5hY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtXCIgZGF0YS1hY3Rpb249XCIke2FjdGlvbi5pZH1cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicXVpY2stc2VhcmNoLWl0ZW0taWNvblwiPiR7YWN0aW9uLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHthY3Rpb24udGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRzLnNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtY2F0ZWdvcnlcIj5TZXJ2aWNlczwvZGl2Pic7XG4gICAgICByZXN1bHRzLnNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgIGh0bWwgKz0gYFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbVwiIGRhdGEtYWN0aW9uPVwib3Blbi1zZXJ2aWNlXCIgZGF0YS1zZXJ2aWNlPVwiJHtzZXJ2aWNlLmlkfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJxdWljay1zZWFyY2gtaXRlbS1pY29uXCI+JHtzZXJ2aWNlLmljb259PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLXRpdGxlXCI+JHtzZXJ2aWNlLnRpdGxlfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInF1aWNrLXNlYXJjaC1pdGVtLWJhZGdlXCI+JHtzZXJ2aWNlLnN0YXR1cy50b1VwcGVyQ2FzZSgpfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghaHRtbCkge1xuICAgICAgaHRtbCA9ICc8ZGl2IGNsYXNzPVwicXVpY2stc2VhcmNoLWVtcHR5XCI+Tm8gcmVzdWx0cyBmb3VuZDwvZGl2Pic7XG4gICAgfVxuXG4gICAgcXVpY2tTZWFyY2hSZXN1bHRzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgYXR0YWNoUmVzdWx0TGlzdGVuZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGNsaWNrIGxpc3RlbmVycyB0byByZXN1bHQgaXRlbXNcbiAgICovXG4gIGZ1bmN0aW9uIGF0dGFjaFJlc3VsdExpc3RlbmVycygpIHtcbiAgICBjb25zdCBpdGVtcyA9IHF1aWNrU2VhcmNoUmVzdWx0cy5xdWVyeVNlbGVjdG9yQWxsKCcucXVpY2stc2VhcmNoLWl0ZW0nKTtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGV4ZWN1dGVBY3Rpb24oaXRlbSkpO1xuXG4gICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbSBieSBkZWZhdWx0XG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGluIHNlYXJjaFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoS2V5RG93bihlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gcXVpY2tTZWFyY2hSZXN1bHRzLnF1ZXJ5U2VsZWN0b3JBbGwoJy5xdWljay1zZWFyY2gtaXRlbScpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBxdWlja1NlYXJjaFJlc3VsdHMucXVlcnlTZWxlY3RvcignLnF1aWNrLXNlYXJjaC1pdGVtLnNlbGVjdGVkJyk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gQXJyYXkuZnJvbShpdGVtcykuaW5kZXhPZihzZWxlY3RlZCk7XG5cbiAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHNlbGVjdGVkLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IChzZWxlY3RlZEluZGV4ICsgMSkgJSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIGl0ZW1zW25leHRJbmRleF0/LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgY29uc3QgcHJldkluZGV4ID0gc2VsZWN0ZWRJbmRleCA8PSAwID8gaXRlbXMubGVuZ3RoIC0gMSA6IHNlbGVjdGVkSW5kZXggLSAxO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuICAgICAgICBpdGVtc1twcmV2SW5kZXhdPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgZXhlY3V0ZUFjdGlvbihzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgY29uc29sZS53YXJuKCdbS2V5Ym9hcmQgU2hvcnRjdXRzXSBFcnJvciBoYW5kbGluZyBzZWFyY2ggbmF2aWdhdGlvbjonLCBlMi5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhbiBhY3Rpb24gZnJvbSBxdWljayBzZWFyY2hcbiAgICovXG4gIGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpb24oaXRlbSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSBpdGVtLmRhdGFzZXQuYWN0aW9uO1xuICAgICAgY29uc3Qgc2VydmljZSA9IGl0ZW0uZGF0YXNldC5zZXJ2aWNlO1xuXG4gICAgICBjbG9zZVF1aWNrU2VhcmNoKCk7XG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3JlZnJlc2gnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlbG9hZC1jYWRkeSc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWRkLXNlcnZpY2UnOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZScpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhcHAtc2VsZWN0b3InOlxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmFja3VwJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3RvcmUtYnRuJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3N0YXRzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLXN0YXRzLWJ0bicpPy5jbGljaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsb2dzJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1lcnJvci1sb2dzJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Rva2Vucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS10b2tlbnMnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbm90aWZpY2F0aW9ucyc6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hbmFnZS1ub3RpZmljYXRpb25zJyk/LmNsaWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RoZW1lJzpcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUnKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG91cic6XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RhcnQtdG91ci1idG4nKT8uY2xpY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnb3Blbi1zZXJ2aWNlJzpcbiAgICAgICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICAgICAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcD1cIiR7c2VydmljZX1cIl0gW2lkJD1cIi1vcGVuXCJdLCBbZGF0YS1hcHA9XCIke3NlcnZpY2V9XCJdIGJ1dHRvbjpub3QoLnJlc3RhcnQtYnRuKTpub3QoLmxvZ3MtYnRuKTpub3QoLnNldHRpbmdzLWJ0bilgKTtcbiAgICAgICAgICAgIGlmIChvcGVuQnRuKSB7XG4gICAgICAgICAgICAgIG9wZW5CdG4uY2xpY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIHRoZSBjYXJkIGFuZCBjbGljayBpdFxuICAgICAgICAgICAgICBjb25zdCBjYXJkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtYXBwPVwiJHtzZXJ2aWNlfVwiXWApO1xuICAgICAgICAgICAgICBpZiAoY2FyZCkgY2FyZC5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkZWJ1ZygnW0tleWJvYXJkIFNob3J0Y3V0c10gVW5rbm93biBhY3Rpb246JywgYWN0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tLZXlib2FyZCBTaG9ydGN1dHNdIEVycm9yIGV4ZWN1dGluZyBhY3Rpb246JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbml0aWFsaXplIHdoZW4gRE9NIGlzIHJlYWR5XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdCk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdCgpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRvIGdsb2JhbCBzY29wZVxuICB3aW5kb3cuRGFzaENhZGR5S2V5Ym9hcmRTaG9ydGN1dHMgPSB7XG4gICAgb3BlblF1aWNrU2VhcmNoLFxuICAgIGNsb3NlUXVpY2tTZWFyY2hcbiAgfTtcblxufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJDQUNDLFVBQVksQ0FFWCxTQUFTQSxHQUFxQixDQUM1QixNQUFNQyxFQUFpQixRQUFRLGlCQUFpQixFQUNoRCxHQUFJQSxFQUNGLEdBQUksQ0FDZSxLQUFLLE1BQU1BLENBQWMsRUFFakMsUUFBUUMsR0FBVyxDQUNyQixPQUFPLEtBQUssS0FBS0MsR0FBT0EsRUFBSSxLQUFPRCxFQUFRLEVBQUUsR0FDaEQsT0FBTyxLQUFLLEtBQUtBLENBQU8sQ0FFNUIsQ0FBQyxDQUNILE9BQVNFLEVBQUcsQ0FDVixRQUFRLEtBQUssa0NBQW1DQSxDQUFDLENBQ25ELENBRUosQ0FHQUosRUFBbUIsRUFHbkIsU0FBU0ssR0FBa0IsQ0FDekIsTUFBTUMsRUFBVyxTQUFTLGlCQUFpQixZQUFZLEVBQ3ZEQSxFQUFTLFFBQVEsQ0FBQ0MsRUFBTUMsSUFBVSxDQUNoQ0QsRUFBSyxNQUFNLGdCQUFrQixHQUFHLEtBQUssSUFBSUMsRUFBUSxHQUFJLEdBQUcsQ0FBQyxJQUMzRCxDQUFDLEVBQ0Qsc0JBQXNCLElBQU0sQ0FDMUJGLEVBQVMsUUFBUUMsR0FBUUEsRUFBSyxVQUFVLElBQUksUUFBUSxDQUFDLENBQ3ZELENBQUMsQ0FDSCxDQUVBLFNBQVNFLEdBQXdCLENBRS9CLEdBREksRUFBRSxrQkFBbUIsWUFDckIsQ0FBQyxPQUFPLGlCQUFtQixTQUFTLFdBQWEsYUFBZSxTQUFTLFdBQWEsWUFBYSxPQUV2RyxNQUFNQyxFQUFXLElBQU0sQ0FDckIsVUFBVSxjQUFjLFNBQVMsU0FBVSxDQUFFLGVBQWdCLE1BQU8sQ0FBQyxFQUFFLE1BQU9DLEdBQVUsQ0FDdEYsUUFBUSxLQUFLLDZDQUE4Q0EsQ0FBSyxDQUNsRSxDQUFDLENBQ0gsRUFFSSxTQUFTLGFBQWUsV0FDMUJELEVBQVMsRUFFVCxPQUFPLGlCQUFpQixPQUFRQSxFQUFVLENBQUUsS0FBTSxFQUFLLENBQUMsQ0FFNUQsQ0FJ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QUFlLGlCQUFpQixHQUFHLE1BQU0sRUFDbEQsTUFDRixJQUFLLFNBQ0gsU0FBUyxlQUFlLGVBQWUsR0FBRyxNQUFNLEVBQ2hELE1BQ0YsSUFBSyxnQkFDSCxTQUFTLGVBQWUsc0JBQXNCLEdBQUcsTUFBTSxFQUN2RCxNQUNGLElBQUssUUFDSCxTQUFTLGVBQWUsT0FBTyxHQUFHLE1BQU0sRUFDeEMsTUFDRixJQUFLLE9BQ0gsU0FBUyxlQUFlLGtCQUFrQixHQUFHLE1BQU0sRUFDbkQsTUFDRixJQUFLLGVBQ0gsR0FBSXJILEVBQVMsQ0FDWCxNQUFNNkgsRUFBVSxTQUFTLGNBQWMsY0FBYzdILENBQU8sZ0NBQWdDQSxDQUFPLCtEQUErRCxFQUNsSyxHQUFJNkgsRUFDRkEsRUFBUSxNQUFNLE1BQ1QsQ0FFTCxNQUFNeEgsRUFBTyxTQUFTLGNBQWMsY0FBY0wsQ0FBTyxJQUFJLEVBQ3pESyxHQUFNQSxFQUFLLE1BQU0sQ0FDdkIsQ0FDRixDQUNBLE1BQ0YsUUFDRW9GLEVBQU0sdUNBQXdDNEIsQ0FBTSxDQUN4RCxDQUNGLE9BQVNuSCxFQUFHLENBQ1YsUUFBUSxLQUFLLCtDQUFnREEsRUFBRSxPQUFPLENBQ3hFLENBQ0YsQ0FHSSxTQUFTLGFBQWUsVUFDMUIsU0FBUyxpQkFBaUIsbUJBQW9CNkYsQ0FBSSxFQUVsREEsRUFBSyxFQUlQLE9BQU8sMkJBQTZCLENBQ2xDLGdCQUFBTyxFQUNBLGlCQUFBRCxDQUNGLENBRUYsR0FBRyIsCiAgIm5hbWVzIjogWyJsb2FkQ3VzdG9tU2VydmljZXMiLCAiY3VzdG9tU2VydmljZXMiLCAic2VydmljZSIsICJhcHAiLCAiZSIsICJhbmltYXRlVG9wQ2FyZHMiLCAidG9wQ2FyZHMiLCAiY2FyZCIsICJpbmRleCIsICJyZWdpc3RlclNlcnZpY2VXb3JrZXIiLCAicmVnaXN0ZXIiLCAiZXJyb3IiLCAiX2Rhc2hib2FyZEluaXRpYWxpemVkIiwgImluaXRpYWxpemVEYXNoYm9hcmQiLCAibG9hZFRlbXBsYXRlQ2F0ZWdvcmllcyIsICJkIiwgImFkZFRvdXJCdXR0b24iLCAic2hvdWxkTG9hZE9uYm9hcmRpbmciLCAibG9hZE9uYm9hcmRpbmciLCAicyIsICJsaW5rIiwgImRhdGEiLCAiaW5pdFRvb2xiYXJTZWN0aW9ucyIsICJzZWN0aW9ucyIsICJzYXZlZCIsICJzZWN0aW9uIiwgImtleSIsICJoZWFkZXIiLCAiaXNPcGVuIiwgInN0YXRlIiwgInRvdXJEb25lIiwgInRhcmdldCIsICJidXR0b24iLCAiY2hlY2siLCAiciIsICJwb3B1bGF0ZUNhdGVnb3J5U2VsZWN0cyIsICJjYXRzIiwgInNlbGVjdCIsICJjdXJyZW50IiwgInBsYWNlaG9sZGVyIiwgInBoIiwgIm5hbWUiLCAiaW5mbyIsICJvcHQiLCAidG90cERhdGEiLCAic3R5bGVFbCIsICJmaWx0ZXJCYXIiLCAicGFuZWwiLCAic2V0QmFyIiwgImlkIiwgInBjdCIsICJlbCIsICJwIiwgImZtdFBjdCIsICJ2IiwgImZtdEJ5dGVzIiwgImIiLCAidW5pdHMiLCAiaSIsICJzZXRTZXJ2aWNlc0NhcmQiLCAidG90YWwiLCAidXAiLCAiYyIsICJzdWIiLCAiYXBwbHlIZWFsdGhTdW1tYXJ5IiwgImhlYWx0aHkiLCAidW5oZWFsdGh5IiwgImZldGNoU3RhdHMiLCAiZmV0Y2hIZWFsdGgiLCAiYXBwbHlTdGF0cyIsICJzdGF0cyIsICJjb250YWluZXJzIiwgImNvbnRhaW5lcnNTdWIiLCAiY3B1RWwiLCAibWVtRWwiLCAiZW50cmllcyIsICJjcHVTdW0iLCAibWVtU3VtIiwgIm1lbUJ5dGVzIiwgImNwdUNvdW50IiwgIm1lbUNvdW50IiwgImNwdSIsICJtZW0iLCAiYXZnQ3B1IiwgImF2Z01lbSIsICJtZW1UeHQiLCAiaW5GbGlnaHQiLCAicmVmcmVzaCIsICJoZWFsdGgiLCAic3RhbXAiLCAibm93IiwgImRlYnVnIiwgImFyZ3MiLCAiTU9EQUxfU0VMRUNUT1JTIiwgInF1aWNrU2VhcmNoTW9kYWwiLCAicXVpY2tTZWFyY2hJbnB1dCIsICJxdWlja1NlYXJjaFJlc3VsdHMiLCAiaW5pdCIsICJjcmVhdGVRdWlja1NlYXJjaE1vZGFsIiwgImhhbmRsZUtleURvd24iLCAic3R5bGUiLCAiaGFuZGxlU2VhcmNoSW5wdXQiLCAiaGFuZGxlU2VhcmNoS2V5RG93biIsICJjbG9zZVF1aWNrU2VhcmNoIiwgIm9wZW5RdWlja1NlYXJjaCIsICJjbG9zZVRvcE1vZGFsIiwgImUyIiwgInNob3dEZWZhdWx0UmVzdWx0cyIsICJzZWxlY3RvciIsICJtb2RhbCIsICJodG1sIiwgImdldFNlcnZpY2VJdGVtcyIsICJhdHRhY2hSZXN1bHRMaXN0ZW5lcnMiLCAiY2FyZHMiLCAic3RhdHVzIiwgInF1ZXJ5IiwgInJlc3VsdHMiLCAic2VhcmNoQWxsIiwgImRpc3BsYXlTZWFyY2hSZXN1bHRzIiwgImFjdGlvbiIsICJpdGVtIiwgImV4ZWN1dGVBY3Rpb24iLCAiaXRlbXMiLCAic2VsZWN0ZWQiLCAic2VsZWN0ZWRJbmRleCIsICJuZXh0SW5kZXgiLCAicHJldkluZGV4IiwgIm9wZW5CdG4iXQp9Cg==
|