// ==UserScript==
// @name Sniffies Tools Userscript
// @namespace https://sniffies.com
// @author Beam
// @version 0.3
// @description Recreating and expanding features on top of Sniffies.com
// @match https://sniffies.com/*
// @match https://*.sniffies.com/*
// @run-at document-start
// @grant none
// ==/UserScript==
// @buildTime 2026-09-13T06:24:34.259Z
// @buildLocation remote
"use strict";(()=>{var fe=e=>`[sniffies-${e}]`,v=e=>{let t=fe(e),o=((...n)=>{});return o.warn=(...n)=>{console.warn(t,...n)},o.error=(...n)=>{console.error(t,...n)},o};var z=(e,t)=>{let o=v("geo"),n=navigator.geolocation;if(!n||n.__sniffiesPatched)return null;let r=n.getCurrentPosition.bind(n),c=n.watchPosition.bind(n),l=n.clearWatch.bind(n),f=new Map,g=i=>{let s=e();if(!s?.enabled)return o("override disabled, passing real coords",i.coords),i;let b={coords:{latitude:s.latitude,longitude:s.longitude,accuracy:10,altitude:null,altitudeAccuracy:null,heading:null,speed:null},timestamp:Date.now()};return o("applying override",b.coords),b},m=i=>s=>{t?.({latitude:s.coords.latitude,longitude:s.coords.longitude}),i(g(s))};n.getCurrentPosition=(i,s,b)=>{o("getCurrentPosition intercepted"),r(m(i),s,b)},n.watchPosition=(i,s,b)=>{o("watchPosition intercepted");let u=m(i),d=c(u,s,b);return f.set(d,u),d},n.clearWatch=i=>{f.delete(i),l(i)};let a=()=>{f.size!==0&&r(i=>{for(let s of f.values())s(i)},void 0,{maximumAge:0})};return n.__sniffiesPatched=!0,{nativeGetCurrentPosition:r,nativeWatchPosition:c,refreshWatches:a}};var $e="prod.ws.sniffies.com",Je=e=>{try{let t=new URL(e,typeof location<"u"?location.href:void 0);return t.host!==$e?null:t.searchParams.get("userId")}catch{return null}},q=e=>{let t=v("user-id"),o=typeof WebSocket<"u"?WebSocket:void 0;if(!o||o.__sniffiesUserIdPatched)return t("hook not installed (no WebSocket or already patched)"),!1;let n=function(r,c){let l=Je(r);return l&&(t("observed userId on WebSocket connect",l),e(l)),c===void 0?new o(r):new o(r,c)};return n.prototype=o.prototype,n.CONNECTING=o.CONNECTING,n.OPEN=o.OPEN,n.CLOSING=o.CLOSING,n.CLOSED=o.CLOSED,n.__sniffiesUserIdPatched=!0,window.WebSocket=n,t("hook installed"),!0};var Xe="/api/post-authentication",Ye="/api/v2/post-authentication/chat-data",Qe="/api/messages",Ze="prod.ws.sniffies.com",R=(e,t,o)=>e?.filter(n=>t.has(n._id)?(o?.add(n._id),!1):!0),ue=(e,t,o)=>(t.size===0||(e.nearbyVisitors?.visitors&&(e.nearbyVisitors.visitors=R(e.nearbyVisitors.visitors,t,o)),e.partialVisitorData&&(e.partialVisitorData=R(e.partialVisitorData,t,o))),e),ge=(e,t,o)=>{if(t.size===0)return e;let n=r=>{let c=!1;for(let l of[r.participants,r.author1,r.author2])l&&t.has(l)&&(o?.add(l),c=!0);return c};return e.conversationData?.conversations&&(e.conversationData.conversations=e.conversationData.conversations.filter(r=>!n(r))),e.conversationData?.userIds&&(e.conversationData.userIds=e.conversationData.userIds.filter(r=>t.has(r)?(o?.add(r),!1):!0)),e.partialVisitorData&&(e.partialVisitorData=R(e.partialVisitorData,t,o)),e},be=(e,t,o)=>(t.size===0||(e.messages&&(e.messages=e.messages.filter(n=>n.author&&t.has(n.author)?(o?.add(n.author),!1):!0)),e.partialUsers&&(e.partialUsers=R(e.partialUsers,t,o))),e),et=(e,t,o,n)=>{switch(e){case"post-authentication":return ue(t,o,n);case"chat-data":return ge(t,o,n);case"messages":return be(t,o,n)}},tt=e=>{let t;try{t=JSON.parse(e)}catch{return null}if(typeof t.eventName!="string")return null;if(t.eventName==="userJoined"||t.eventName==="userUpdated"){let o=t.data?._id;return{eventName:t.eventName,id:typeof o=="string"?o:null}}if(t.eventName==="userAwake"||t.eventName==="userDisconnected"||t.eventName==="userRemoved")return{eventName:t.eventName,id:typeof t.data=="string"?t.data:null};if(t.eventName==="newMsg"){let o=t.data?.message?.author;return{eventName:t.eventName,id:typeof o=="string"?o:null}}if(t.eventName==="newConversation"){let o=t.data?.partialUser?._id;return{eventName:t.eventName,id:typeof o=="string"?o:null}}return{eventName:t.eventName,id:null}};var ot=e=>e==="sniffies.com"||e.endsWith(".sniffies.com"),nt=e=>{try{let t=new URL(e,typeof location<"u"?location.href:void 0);return ot(t.host)?t.pathname===Xe?"post-authentication":t.pathname===Ye?"chat-data":t.pathname===Qe?"messages":null:null}catch{return null}},rt=(e,t,o)=>{let n=XMLHttpRequest.prototype;if(n.__sniffiesBotBlockPatched)return o("XHR filter not installed (already patched)"),!1;let r=n.open,c=n.send,l=Object.getOwnPropertyDescriptor(n,"responseText"),f=Object.getOwnPropertyDescriptor(n,"response");return!l?.get||!f?.get?(o.warn("XHR filter not installed (responseText/response are not accessor properties)"),!1):(n.open=function(g,m,...a){return this.__sniffiesFilterKind=nt(m.toString()),r.apply(this,[g,m,...a])},n.send=function(...g){let m=this.__sniffiesFilterKind;if(m){let a=this.responseType||"";if(a===""||a==="text"||a==="json"){let i=null,s=()=>{if(i)return i;let b=e(),u=b.enabled&&b.blockedIds.size>0,d,p="";if(a==="json")d=f.get.call(this);else if(p=l.get.call(this),u)try{d=JSON.parse(p)}catch{return i={text:p,json:void 0},i}if(u){let E=new Set;if(d=et(m,d,b.blockedIds,E),E.size>0){let y=[...E];o.warn(`filtered blocked account(s) from ${m} response:`,y),t?.(y)}a!=="json"&&(p=JSON.stringify(d))}return i={text:p,json:d},i};a!=="json"&&Object.defineProperty(this,"responseText",{configurable:!0,get:()=>s().text}),Object.defineProperty(this,"response",{configurable:!0,get:()=>a==="json"?s().json:s().text})}else o.warn(`unsupported responseType "${a}" for ${m}, not filtering`)}return c.apply(this,g)},n.__sniffiesBotBlockPatched=!0,o("XHR filter installed"),!0)},it=e=>{try{return new URL(e,typeof location<"u"?location.href:void 0).host===Ze}catch{return!1}},st=(e,t,o,n,r)=>{let c=a=>{if(!(a instanceof MessageEvent)||typeof a.data!="string")return!1;let i=t();if(!i.enabled||i.blockedIds.size===0)return!1;let s=tt(a.data);return s?.id&&i.blockedIds.has(s.id)?(r.warn(`filtered blocked account from WS ${s.eventName} frame:`,s.id),o?.([s.id]),!0):!1},l=e.addEventListener.bind(e),f=e.removeEventListener.bind(e),g=new WeakMap,m=a=>{let i=g.get(a);if(i)return i;let s=typeof a=="function"?a:a.handleEvent.bind(a),b=u=>{c(u)||s(u)};return g.set(a,b),b};if(e.addEventListener=((a,i,s)=>a!=="message"||!i?l(a,i,s):l(a,m(i),s)),e.removeEventListener=((a,i,s)=>a!=="message"||!i?f(a,i,s):f(a,g.get(i)??i,s)),n?.get&&n.set){let a=null;Object.defineProperty(e,"onmessage",{configurable:!0,enumerable:!0,get:()=>a,set:i=>{if(a=i,typeof i!="function"){n.set.call(e,i);return}n.set.call(e,function(s){c(s)||i.call(this,s)})}})}},at=(e,t,o)=>{let n=typeof WebSocket<"u"?WebSocket:void 0;if(!n||n.__sniffiesBotBlockPatched)return o("WebSocket filter not installed (no WebSocket or already patched)"),!1;let r=Object.getOwnPropertyDescriptor(n.prototype,"onmessage"),c=function(l,f){let g=f===void 0?new n(l):new n(l,f);return it(l)&&st(g,e,t,r,o),g};return c.prototype=n.prototype,c.CONNECTING=n.CONNECTING,c.OPEN=n.OPEN,c.CLOSING=n.CLOSING,c.CLOSED=n.CLOSED,c.__sniffiesBotBlockPatched=!0,window.WebSocket=c,o("WebSocket filter installed"),!0},$=(e,t)=>{let o=v("bot-block");return{xhrInstalled:rt(e,t,o),wsInstalled:at(e,t,o)}};var T=e=>e.toISOString().slice(0,10),me=e=>new Date(e.getTime()-864e5),J=(e,t,o=new Date)=>{if(t.length===0)return e;let n=T(o),r=T(me(o)),c=new Set([...e[n]??[],...t]),l={[n]:[...c]};return e[r]&&(l[r]=e[r]),l},X=(e,t=new Date)=>{let o=T(t),n=T(me(t));return new Set([...e[o]??[],...e[n]??[]]).size};var Ee={MARKER_CONTAINER_SELECTOR:'[data-testid="markerUserContainer"]',MARKER_AVATAR_SELECTOR:'[data-testid="cv-marker-avatar-image"]',APP_SCREEN_SELECTOR:"#app-screen",NAME_LABEL_SELECTOR:'[data-testid="cruiserNameLabel"]',PIN_BUTTON_SELECTOR:'[data-testid="pinUserButton"]',SITELINKS_NAV_SELECTOR:'[title="Sitelinks"]'},{MARKER_CONTAINER_SELECTOR:Y,MARKER_AVATAR_SELECTOR:Q,APP_SCREEN_SELECTOR:B,NAME_LABEL_SELECTOR:I,PIN_BUTTON_SELECTOR:L,SITELINKS_NAV_SELECTOR:Z}=Ee;var ee=e=>{let t=v("profile-border"),o=n=>{let r=e();if(!r.enabled)return;let c=n.target;if(!(c instanceof Element))return;let l=c.closest(Y);if(!l||l.dataset.withinRadius!=="false"||!l.id)return;n.preventDefault(),n.stopPropagation(),n.stopImmediatePropagation();let f=`https://sniffies.com/profile/${l.id}`;t("redirecting to out-of-radius profile",l.id),r.openInNewTab?window.open(f,"_blank"):window.location.assign(f)};return document.addEventListener("click",o,!0),{uninstall:()=>document.removeEventListener("click",o,!0)}};var te=async e=>{let t=v("log-init"),{serverBase:o,clientSecret:n,userId:r,clientType:c,version:l}=e;if(!o||!r){t("skipping, missing serverBase or userId",{serverBase:o,userId:r});return}t("sending init ping",{userId:r,clientType:c,version:l});try{let f=o.replace(/\/+$/,""),g=await fetch(`${f}/api/logInit`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({userId:r,clientType:c,version:l})});g.ok?t("init ping sent"):t.error("init ping rejected",g.status)}catch(f){t.error("init ping failed",f)}};var w=`
Location Spoofing
`;var C=`/* Section shell \u2014 lifted from popup.css .section, details.collapsible, .collapsible-body */
#snp-geo-root .section {
background: #0e1825;
border: 1px solid #1c2b3a;
border-radius: 8px;
padding: 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
#snp-geo-root .section h2 {
margin: 0;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
color: #7a90a4;
}
#snp-geo-root details.collapsible {
padding: 0;
display: block;
}
#snp-geo-root details.collapsible summary {
list-style: none;
cursor: pointer;
padding: 14px;
display: flex;
align-items: center;
gap: 6px;
user-select: none;
}
#snp-geo-root details.collapsible summary::-webkit-details-marker {
display: none;
}
#snp-geo-root details.collapsible summary::after {
content: "\u203A";
margin-left: auto;
font-size: 16px;
line-height: 1;
color: #7a90a4;
transform: rotate(90deg);
transition: transform 0.15s;
}
#snp-geo-root details.collapsible[open] summary::after {
transform: rotate(270deg);
}
#snp-geo-root details.collapsible summary h2 {
margin: 0;
}
#snp-geo-root .collapsible-body {
padding: 0 14px 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
/* Form fields \u2014 lifted from popup.css .row, .hint, .field, button.primary/secondary, .actions */
#snp-geo-root .row {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
cursor: pointer;
color: #ffffff;
}
#snp-geo-root .row input[type="checkbox"] {
accent-color: #ff5500;
width: 14px;
height: 14px;
}
#snp-geo-root .hint {
font-size: 11px;
color: #7a90a4;
margin: 0;
}
#snp-geo-root button.primary {
font-size: 12px;
font-weight: 700;
padding: 7px 16px;
border-radius: 20px;
border: none;
background: #ff5500;
color: #fff;
cursor: pointer;
letter-spacing: 0.02em;
transition: background 0.15s;
}
#snp-geo-root button.primary:hover:not(:disabled) {
background: #e04a00;
}
#snp-geo-root button.primary:disabled {
background: #1c2b3a;
color: #7a90a4;
cursor: not-allowed;
}
#snp-geo-root button.secondary {
font-size: 12px;
font-weight: 600;
padding: 7px 16px;
border-radius: 20px;
border: 1px solid #1c2b3a;
background: transparent;
color: #7a90a4;
cursor: pointer;
transition:
border-color 0.15s,
color 0.15s;
}
#snp-geo-root button.secondary:hover:not(:disabled) {
border-color: #7a90a4;
color: #ffffff;
}
#snp-geo-root button.secondary:disabled {
color: #1c2b3a;
border-color: #1c2b3a;
cursor: not-allowed;
}
#snp-geo-root .field {
display: flex;
flex-direction: column;
gap: 4px;
font-size: 11px;
color: #7a90a4;
}
#snp-geo-root .field input {
font-size: 13px;
padding: 7px 10px;
border-radius: 6px;
border: 1px solid #1c2b3a;
background: #080e18;
color: #ffffff;
outline: none;
transition: border-color 0.15s;
}
#snp-geo-root .field input::placeholder {
color: #3a4f62;
}
#snp-geo-root .field input:focus {
border-color: #ff5500;
}
#snp-geo-root .actions {
display: flex;
gap: 8px;
align-items: center;
}
#snp-geo-root #geo-fields {
display: flex;
flex-direction: column;
gap: 10px;
}
`;var oe=(e,t)=>{let o=S=>e.querySelector(`#${S}`),n=e.querySelector("#geo-details"),r=o("geo-enabled"),c=o("geo-fields"),l=o("geo-lat"),f=o("geo-lng"),g=o("geo-fill-current"),m=o("geo-save"),a=o("geo-status");n&&(n.open=t.initialOpen,n.addEventListener("toggle",()=>t.onToggle(n.open)));let i=S=>{a.textContent=S},s=()=>({enabled:r.checked,latitude:parseFloat(l.value)||0,longitude:parseFloat(f.value)||0}),b=null,u=(S,qe)=>{let K={aborted:!1};b=K,i("Getting location\u2026"),t.getNativePosition(O=>{K.aborted||(b=null,l.value=String(O.coords.latitude),f.value=String(O.coords.longitude),y(),S())},O=>{K.aborted||(b=null,i(`Could not get location: ${O.message} (code ${O.code})`),qe?.())},{timeout:1e4})},{initial:d}=t,p={...d},E=()=>{let S=s();return S.enabled===p.enabled&&S.latitude===p.latitude&&S.longitude===p.longitude},y=()=>{let S=l.value.trim()!==""&&f.value.trim()!=="";m.style.display=S&&!E()?"":"none"},h=()=>Promise.resolve(t.onSave(s())).then(()=>{p=s(),i("Saved."),y()});r.checked=d.enabled,c.style.display=d.enabled?"":"none",l.value=d.latitude!==0?String(d.latitude):"",f.value=d.longitude!==0?String(d.longitude):"",y(),r.addEventListener("change",()=>{c.style.display=r.checked?"":"none",y(),r.checked?b&&(b.aborted=!0,b=null,i("")):(h(),u(()=>void h(),()=>void h()))});for(let S of[l,f])S.addEventListener("input",y);g.addEventListener("click",()=>{u(()=>i(""))}),m.addEventListener("click",()=>{h()})};var P=`.snp-version {
font-size: 10px;
font-weight: 400;
color: #7a90a4;
letter-spacing: 0.02em;
}
`;var ne=(e,t)=>{let o=e.querySelector("#snp-version");o&&(o.textContent=`v${t}`)};var N=`
Report profile
Flag this profile as a suspected bot for manual review.
`;var D=`/* Injected directly into the Sniffies page (not a popup/settings root), so
this is scoped under #snp-report-backdrop rather than relying on :root
variables that don't exist in that context \u2014 same approach as
geo-override.css. Palette lifted from popup.css. */
#snp-report-backdrop {
display: none;
position: fixed;
inset: 0;
z-index: 2147483647;
background: rgba(8, 14, 24, 0.65);
align-items: center;
justify-content: center;
font-family:
system-ui,
-apple-system,
"Segoe UI",
sans-serif;
}
#snp-report-backdrop .snp-report-modal {
width: min(320px, calc(100vw - 32px));
background: #0e1825;
border: 1px solid #1c2b3a;
border-radius: 8px;
padding: 16px;
display: flex;
flex-direction: column;
gap: 10px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
}
#snp-report-backdrop h3 {
margin: 0;
font-size: 14px;
font-weight: 700;
color: #ffffff;
}
#snp-report-backdrop .hint {
font-size: 11px;
color: #7a90a4;
margin: 0;
}
#snp-report-backdrop .field {
display: flex;
flex-direction: column;
gap: 4px;
font-size: 11px;
color: #7a90a4;
}
#snp-report-backdrop .field textarea {
font-size: 13px;
padding: 7px 10px;
border-radius: 6px;
border: 1px solid #1c2b3a;
background: #080e18;
color: #ffffff;
outline: none;
resize: vertical;
font-family: inherit;
transition: border-color 0.15s;
}
#snp-report-backdrop .field textarea:focus {
border-color: #ff5500;
}
#snp-report-backdrop .actions {
display: flex;
gap: 8px;
justify-content: flex-end;
}
#snp-report-backdrop button.primary {
font-size: 12px;
font-weight: 700;
padding: 7px 16px;
border-radius: 20px;
border: none;
background: #ff5500;
color: #fff;
cursor: pointer;
letter-spacing: 0.02em;
transition: background 0.15s;
}
#snp-report-backdrop button.primary:hover:not(:disabled) {
background: #e04a00;
}
#snp-report-backdrop button.primary:disabled {
background: #1c2b3a;
color: #7a90a4;
cursor: not-allowed;
}
#snp-report-backdrop button.secondary {
font-size: 12px;
font-weight: 600;
padding: 7px 16px;
border-radius: 20px;
border: 1px solid #1c2b3a;
background: transparent;
color: #7a90a4;
cursor: pointer;
transition:
border-color 0.15s,
color 0.15s;
}
#snp-report-backdrop button.secondary:hover:not(:disabled) {
border-color: #7a90a4;
color: #ffffff;
}
`;var re=(e,t)=>{let o=s=>e.querySelector(`#${s}`),n=o("snp-report-backdrop"),r=o("snp-report-message"),c=o("snp-report-status"),l=o("snp-report-cancel"),f=o("snp-report-submit");n.style.display="none";let g=s=>{c.textContent=s},m=0,a=()=>{n.style.display="none",r.value="",g(""),f.disabled=!1},i=()=>{m+=1,n.style.display="flex",g(""),f.disabled=!1,r.focus()};return l.addEventListener("click",()=>{t.onCancel?.(),a()}),n.addEventListener("click",s=>{s.target===n&&(t.onCancel?.(),a())}),f.addEventListener("click",()=>{let s=m;f.disabled=!0,g("Submitting\u2026"),Promise.resolve(t.onSubmit(r.value.trim())).then(()=>{m===s&&(g("Reported. Thanks."),setTimeout(a,1200))}).catch(()=>{m===s&&(g("Failed to submit report. Try again."),f.disabled=!1)})}),{open:i,close:a}};var A=v("report-button"),ie="data-sniffies-report-injection",ut="snp-report-root",ye=1e3,he=100,gt=3e3,bt=300,mt=e=>{try{let o=new URL(e).pathname.split("/").filter(Boolean)[0];return o&&/^[a-f0-9]{16,}$/i.test(o)?o:null}catch{return null}},Se=e=>{let t=e.split("/").filter(Boolean),o=t[0]==="profile"?t[1]:void 0;return o&&/^[a-f0-9]{16,}$/i.test(o)?o:null},Et=e=>{let t=e.style.backgroundImage||getComputedStyle(e).backgroundImage;if(!t||t==="none")return null;let n=t.match(/url\((['"]?)(.*?)\1\)/)?.[2];if(!n)return null;let r=mt(n);return r?{userId:r,profilePicUrl:n}:null},se=e=>{let t=null,o=0,n=null,r=null,c=async(d,p)=>{if(!e.serverBase)throw new Error("server not configured");let E=await fetch(`${e.serverBase}/api/report`,{method:"POST",headers:e.getAuthHeaders(),body:JSON.stringify({reportType:"bot_suspected",reportedUserId:d,reporterUserId:e.getReporterUserId(),message:p||void 0})});if(!E.ok)throw new Error(`report failed with status ${E.status}`)},l=()=>{if(n)return n;let d=document.createElement("style");d.textContent=D,document.head.appendChild(d);let p=document.createElement("div");return p.id=ut,p.innerHTML=N,document.body.appendChild(p),n=re(p,{onSubmit:async E=>{r&&await c(r,E)},onCancel:()=>{r=null}}),n},f=d=>{let p=document.createElement("button");return p.type="button",p.setAttribute(ie,d),p.setAttribute("aria-label","Report profile"),p.title="Report as suspected bot",p.style.cssText=["background:transparent","border:none","padding:0 8px","cursor:pointer","font-size:16px","line-height:1","color:#f04438","display:flex","align-items:center"].join(";"),p.textContent="\u{1F6A9}",p.addEventListener("click",E=>{if(E.stopPropagation(),!e.getReporterUserId()){A.warn("no sniffies user id observed yet \u2014 cannot report");return}r=d,l().open()}),p},g=(d,p)=>{if(!e.reportingEnabled)return;let y=d.querySelector(L)?.parentElement;if(!y)return;let h=y.querySelector(`[${ie}]`);if(h){if(h.getAttribute(ie)===p)return;h.remove()}y.prepend(f(p))},m=d=>{let p=Se(location.pathname);p&&t!==p&&(t=p),t&&(e.onProfileResolved?.(d,t),g(d,t))},a=(d,p=ye,E=he)=>{let y=performance.now()+p,h=()=>{if(d!==o)return;let S=document.querySelector(B);S&&m(S),performance.now(){o+=1,d&&(t=d);let y=document.querySelector(B);y&&m(y),a(o,p,E)},s=new MutationObserver(d=>{for(let p of d)for(let E of p.addedNodes){if(!(E instanceof HTMLElement))continue;let y=E.matches?.(I)||!!E.querySelector?.(I),h=E.matches?.(L)||!!E.querySelector?.(L);if(!y&&!h)continue;let S=document.querySelector(B);S&&m(S)}}),b=()=>{s.observe(document.body,{childList:!0,subtree:!0})};document.addEventListener("click",d=>{let p=d.target;if(!(p instanceof Element))return;let E=p.closest(Q);if(!E)return;let y=Et(E);e.onMarkerClick?.(E,y),A(y?"marker clicked":"marker clicked but no id in its image \u2014 resolving from URL",y??E),i(y?.userId??null)},!0),document.body?b():document.addEventListener("DOMContentLoaded",b,{once:!0});let u=Se(location.pathname);u&&(A("initial page load on a profile URL",u),i(u,gt,bt))},ve=async(e,t,o)=>{if(e)try{let n=await fetch(`${e}/api/blocked-bots`,{headers:t()});if(!n.ok)return;let r=await n.json();o(r.userIds??[],Date.now())}catch(n){A.error("fetchBlockedBots failed",n)}},yt=1440*60*1e3,ae=(e,t,o,n)=>{Date.now()-e>yt&&ve(t,o,n)};var M=`
Open Profiles Outside Boundary
`;var F=`/* Section shell \u2014 shared with geo-override.css (popup.css .section, details.collapsible, .collapsible-body) */
#snp-profile-border-root .section {
background: #0e1825;
border: 1px solid #1c2b3a;
border-radius: 8px;
padding: 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
#snp-profile-border-root .section h2 {
margin: 0;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
color: #7a90a4;
}
#snp-profile-border-root details.collapsible {
padding: 0;
display: block;
}
#snp-profile-border-root details.collapsible summary {
list-style: none;
cursor: pointer;
padding: 14px;
display: flex;
align-items: center;
gap: 6px;
user-select: none;
}
#snp-profile-border-root details.collapsible summary::-webkit-details-marker {
display: none;
}
#snp-profile-border-root details.collapsible summary::after {
content: "\u203A";
margin-left: auto;
font-size: 16px;
line-height: 1;
color: #7a90a4;
transform: rotate(90deg);
transition: transform 0.15s;
}
#snp-profile-border-root details.collapsible[open] summary::after {
transform: rotate(270deg);
}
#snp-profile-border-root details.collapsible summary h2 {
margin: 0;
}
#snp-profile-border-root .collapsible-body {
padding: 0 14px 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
/* Form fields \u2014 shared with geo-override.css (popup.css .row, .hint, .field, button.primary/secondary, .actions) */
#snp-profile-border-root .row {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
cursor: pointer;
color: #ffffff;
}
#snp-profile-border-root .row input[type="checkbox"] {
accent-color: #ff5500;
width: 14px;
height: 14px;
}
#snp-profile-border-root .hint {
font-size: 11px;
color: #7a90a4;
margin: 0;
}
#snp-profile-border-root button.primary {
font-size: 12px;
font-weight: 700;
padding: 7px 16px;
border-radius: 20px;
border: none;
background: #ff5500;
color: #fff;
cursor: pointer;
letter-spacing: 0.02em;
transition: background 0.15s;
}
#snp-profile-border-root button.primary:hover:not(:disabled) {
background: #e04a00;
}
#snp-profile-border-root button.primary:disabled {
background: #1c2b3a;
color: #7a90a4;
cursor: not-allowed;
}
#snp-profile-border-root .field {
display: flex;
flex-direction: column;
gap: 4px;
font-size: 11px;
color: #7a90a4;
}
#snp-profile-border-root .field select {
font-size: 13px;
padding: 7px 10px;
border-radius: 6px;
border: 1px solid #1c2b3a;
background: #080e18;
color: #ffffff;
outline: none;
transition: border-color 0.15s;
}
#snp-profile-border-root .field select:focus {
border-color: #ff5500;
}
#snp-profile-border-root .actions {
display: flex;
gap: 8px;
align-items: center;
}
`;var H={current:"Current tab",currentSaved:"Current tab (saved)",new:"New tab",newSaved:"New tab (saved)"},le=(e,t)=>{let o=u=>e.querySelector(`#${u}`),n=e.querySelector("#profile-border-details"),r=o("profile-border-enabled"),c=o("profile-border-tab-field"),l=o("profile-border-tab"),f=l.querySelector('option[value="current-tab"]'),g=l.querySelector('option[value="new-tab"]'),m=o("profile-border-save");n&&(n.open=t.initialOpen,n.addEventListener("toggle",()=>t.onToggle(n.open)));let a=u=>{f.text=u?H.current:H.currentSaved,g.text=u?H.newSaved:H.new},i=()=>({enabled:r.checked,openInNewTab:l.value==="new-tab"}),{initial:s}=t,b=s.openInNewTab;r.checked=s.enabled,c.style.display=s.enabled?"":"none",l.value=s.openInNewTab?"new-tab":"current-tab",a(s.openInNewTab),m.style.display="none",r.addEventListener("change",()=>{c.style.display=r.checked?"":"none",t.onSave(i())}),l.addEventListener("change",()=>{let u=l.value==="new-tab"!==b;m.style.display=u?"":"none"}),m.addEventListener("click",()=>{let u=i();Promise.resolve(t.onSave(u)).then(()=>{a(u.openInNewTab),b=u.openInNewTab,m.style.display="none"})})};var G=`
Block Bot Accounts
`;var U=`/* Section shell \u2014 shared with geo-override.css/profile-border.css (popup.css .section, details.collapsible, .collapsible-body) */
#snp-bot-block-root .section {
background: #0e1825;
border: 1px solid #1c2b3a;
border-radius: 8px;
padding: 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
#snp-bot-block-root .section h2 {
margin: 0;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
color: #7a90a4;
}
#snp-bot-block-root details.collapsible {
padding: 0;
display: block;
}
#snp-bot-block-root details.collapsible summary {
list-style: none;
cursor: pointer;
padding: 14px;
display: flex;
align-items: center;
gap: 6px;
user-select: none;
}
#snp-bot-block-root details.collapsible summary::-webkit-details-marker {
display: none;
}
#snp-bot-block-root details.collapsible summary::after {
content: "\u203A";
margin-left: auto;
font-size: 16px;
line-height: 1;
color: #7a90a4;
transform: rotate(90deg);
transition: transform 0.15s;
}
#snp-bot-block-root details.collapsible[open] summary::after {
transform: rotate(270deg);
}
#snp-bot-block-root details.collapsible summary h2 {
margin: 0;
}
#snp-bot-block-root .collapsible-body {
padding: 0 14px 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
/* Form fields \u2014 shared with geo-override.css/profile-border.css (popup.css .row, .hint) */
#snp-bot-block-root .row {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
cursor: pointer;
color: #ffffff;
}
#snp-bot-block-root .row input[type="checkbox"] {
accent-color: #ff5500;
width: 14px;
height: 14px;
}
#snp-bot-block-root .hint {
font-size: 11px;
color: #7a90a4;
margin: 0;
}
#snp-bot-block-root .stat {
font-size: 12px;
font-weight: 700;
color: #ffffff;
margin: 0;
}
#snp-bot-block-root .stat:empty {
display: none;
}
`;var ce=(e,t)=>{let o=g=>e.querySelector(`#${g}`),n=e.querySelector("#bot-block-details"),r=o("bot-block-count"),c=o("bot-block-hint"),l=o("bot-block-enabled"),f=o("bot-block-enable-label");if(n&&(n.open=t.initialOpen,n.addEventListener("toggle",()=>t.onToggle(n.open))),!t.reportingEnabled){l.checked=!1,l.disabled=!0,c.textContent="Coming soon!",f.style.textDecoration="line-through";return}l.checked=t.initialEnabled,c.textContent="Hide profiles that have been confirmed as bots from the map and live updates.",r.textContent=t.initialCount>0?`${t.initialCount} bot${t.initialCount===1?"":"s"} blocked in the last 24 hours`:"",l.addEventListener("change",()=>{t.onToggleEnabled(l.checked)})};var k={enabled:!1,latitude:0,longitude:0},x={enabled:!1,openInNewTab:!0};var ke=`#snp-fab {
position: fixed;
/* TODO This may still need reworking */
bottom: calc(80px + 5vh);
right: 16px;
z-index: 2147483646;
background: rgba(14, 24, 37, 0.85);
border: 1px solid #1c2b3a;
border-radius: 50%;
cursor: pointer;
font-size: 20px;
line-height: 1;
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.9;
transition: opacity 0.15s;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
}
#snp-fab:hover {
opacity: 1;
}
#snp-panel {
position: fixed;
top: 60px;
right: 12px;
z-index: 2147483647;
width: 280px;
background: #0e1825;
border: 1px solid #1c2b3a;
border-radius: 8px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
font-family:
system-ui,
-apple-system,
"Segoe UI",
sans-serif;
color: #ffffff;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 12px;
}
.snp-header {
display: flex;
align-items: center;
justify-content: space-between;
}
.snp-title {
display: flex;
align-items: baseline;
gap: 6px;
}
.snp-header h1 {
font-size: 14px;
font-weight: 700;
margin: 0;
letter-spacing: 0.01em;
}
.snp-close {
background: transparent;
border: none;
color: #7a90a4;
font-size: 18px;
cursor: pointer;
line-height: 1;
padding: 2px 4px;
transition: color 0.15s;
}
.snp-close:hover {
color: #fff;
}
`;var xe=`
`;var Oe="sniffies-geo",Be="sniffies-profile-border",Le="sniffies-blocked-bots",_e="sniffies-blocked-bots-fetched-at",Re="sniffies-bot-blocking-enabled",Te="sniffies-bot-blocking-section-open",Ie="sniffies-blocked-bot-events",we=()=>{try{let e=localStorage.getItem(Oe);return e?{...k,...JSON.parse(e)}:{...k}}catch{return{...k}}},Ce=e=>{localStorage.setItem(Oe,JSON.stringify(e))},Pe=()=>{try{let e=localStorage.getItem(Be);return e?{...x,...JSON.parse(e)}:{...x}}catch{return{...x}}},Ne=e=>{localStorage.setItem(Be,JSON.stringify(e))},De=()=>{try{let e=localStorage.getItem(Le),t=e?JSON.parse(e):[];return Array.isArray(t)?t.filter(o=>typeof o=="string"):[]}catch{return[]}},Ae=()=>{let e=localStorage.getItem(_e),t=e?Number(e):0;return Number.isFinite(t)?t:0},Me=(e,t)=>{localStorage.setItem(Le,JSON.stringify(e)),localStorage.setItem(_e,String(t))},j=()=>{let e=localStorage.getItem(Re);return e===null?!0:e==="true"},Fe=e=>{localStorage.setItem(Re,String(e))},He=()=>localStorage.getItem(Te)==="true",Ge=e=>{localStorage.setItem(Te,String(e))},de=()=>{try{let e=localStorage.getItem(Ie);return e?JSON.parse(e):{}}catch{return{}}},Ue=e=>{let t=J(de(),e);localStorage.setItem(Ie,JSON.stringify(t))};var _="https://sniffies-projects.vercel.app",W="ed6fd0cd-fe58-4dcc-83cd-65651771e0e9";var Bt=v("user-id-logger"),je=e=>{let t=!1;return q(o=>{Bt("user id observed",o),e?.(o),!t&&(t=!0,te({serverBase:_,clientSecret:W,userId:o,clientType:"userscript",version:"0.3"}))})};var We=()=>({"Content-Type":"application/json",Authorization:`Bearer ${W}`}),Ve=()=>{let e={currentSniffiesUserId:"",botBlockState:{blockedIds:new Set(De()),enabled:j()}};return $(()=>e.botBlockState,t=>Ue(t)),!1,e},Ke=e=>{!1};var Lt=v("tools"),_t=e=>{let t=()=>{let n=document.querySelector(Z);return n?.parentElement?(n.parentElement.insertBefore(e,n.nextSibling),!0):!1};if(t())return;let o=new MutationObserver(()=>{t()&&o.disconnect()});o.observe(document.body,{childList:!0,subtree:!0})};function Rt(){let e=Ve();je(a=>{e.currentSniffiesUserId=a}),Ke(e);let t=we(),o=z(()=>t),n=o?.nativeGetCurrentPosition??navigator.geolocation.getCurrentPosition.bind(navigator.geolocation),r=window.fetch.bind(window),c=null,l=null,f=a=>{let i={lat:a.latitude,lng:a.longitude};if(c)try{let s=JSON.parse(c.init.body??"{}");s.virtualLocation=i,s.physicalLocation=i,r(c.url,{...c.init,body:JSON.stringify(s)});return}catch{}l&&r(`${l}/api/visitor/current/location?state=loaded`,{method:"PUT",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({virtualLocation:i,physicalLocation:i,homeDistanceInMiles:null})})};window.fetch=async(a,i)=>{let s=typeof a=="string"?a:a instanceof URL?a.href:a.url,b=s.match(/^(https?:\/\/[^/]*sniffies\.com)/);if(b&&!l&&(l=b[1]??null),s.includes("/api/visitor/current/location")&&(c={url:s,init:{...i}},t.enabled))try{let u=JSON.parse(i?.body??"{}"),d={lat:t.latitude,lng:t.longitude};u.virtualLocation=d,u.physicalLocation=d,i={...i,body:JSON.stringify(u)}}catch{}return r(a,i)};let g=Pe();return ee(()=>g),{currentOverride:t,hook:o,nativeGetCurrentPosition:n,sendLocationUpdate:f,currentProfileBorderOpen:g,updateProfileBorderOpen:a=>{g=a},reportState:e}}function ze(e){let t=e?.hook??null,o=e?.nativeGetCurrentPosition??(()=>{throw new Error("geolocation unavailable")}),n=e?.sendLocationUpdate??(()=>{}),r=e?.currentOverride??{...k},c=e?.updateProfileBorderOpen??(()=>{}),l=e?.currentProfileBorderOpen??{...x},f=e?.reportState??{currentSniffiesUserId:"",botBlockState:{blockedIds:new Set,enabled:!0}},g=document.createElement("style");g.textContent=ke,document.head.appendChild(g);let m=document.createElement("style");m.textContent=C,document.head.appendChild(m);let a=document.createElement("style");a.textContent=F,document.head.appendChild(a);let i=document.createElement("style");i.textContent=U,document.head.appendChild(i);let s=document.createElement("style");s.textContent=P,document.head.appendChild(s);let b=document.createElement("button");b.id="snp-fab",b.title="Sniffies Tools",b.textContent="\u{1F4CD}",_t(b);let u=document.createElement("div");u.id="snp-panel",u.style.display="none",u.innerHTML=xe,document.body.appendChild(u),ne(u,"0.3");let d=u.querySelector("#snp-geo-root");d.innerHTML=w,oe(d,{initial:r,onSave:h=>{Ce(h),r=h,t?.refreshWatches(),h.enabled&&n(h)},getNativePosition:o,initialOpen:!1,onToggle:()=>{}});let p=u.querySelector("#snp-profile-border-root");p.innerHTML=M,le(p,{initial:l,onSave:h=>{Ne(h),c(h)},initialOpen:!1,onToggle:()=>{}});let E=u.querySelector("#snp-bot-block-root");E.innerHTML=G,ce(E,{reportingEnabled:!1,initialEnabled:j(),initialCount:X(de()),initialOpen:He(),onToggle:Ge,onToggleEnabled:h=>{Fe(h),f.botBlockState={...f.botBlockState,enabled:h}}});let y=u.querySelector("#snp-close");b.addEventListener("click",()=>{u.style.display=u.style.display==="none"?"flex":"none"}),y.addEventListener("click",()=>{u.style.display="none"})}if(!window.__sniffiesInjected){window.__sniffiesInjected=!0;let e=null;try{e=Rt()}catch(t){Lt.error("hook install failed:",t)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>ze(e),{once:!0}):ze(e)}})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vY29yZS9zcmMvbG9nLnRzIiwgIi4uLy4uL2NvcmUvc3JjL2dlby1ob29rLnRzIiwgIi4uLy4uL2NvcmUvc3JjL3VzZXItaWQtaG9vay50cyIsICIuLi8uLi9jb3JlL3NyYy9ib3QtYmxvY2staG9vay50cyIsICIuLi8uLi9jb3JlL3NyYy9ibG9ja2VkLWJvdC1sb2cudHMiLCAiLi4vLi4vY29yZS9zcmMvc25pZmZpZXMtc2VsZWN0b3JzLnRzIiwgIi4uLy4uL2NvcmUvc3JjL3Byb2ZpbGUtYm9yZGVyLWhvb2sudHMiLCAiLi4vLi4vY29yZS9zcmMvbG9nLWluaXQudHMiLCAiLi4vLi4vY29yZS9zcmMvZ2VvLW92ZXJyaWRlLmh0bWwiLCAiLi4vLi4vY29yZS9zcmMvZ2VvLW92ZXJyaWRlLmNzcyIsICIuLi8uLi9jb3JlL3NyYy9nZW8tb3ZlcnJpZGUtdWkudHMiLCAiLi4vLi4vY29yZS9zcmMvdmVyc2lvbi1iYWRnZS5jc3MiLCAiLi4vLi4vY29yZS9zcmMvdmVyc2lvbi1iYWRnZS50cyIsICIuLi8uLi9jb3JlL3NyYy9yZXBvcnQtbW9kYWwuaHRtbCIsICIuLi8uLi9jb3JlL3NyYy9yZXBvcnQtbW9kYWwuY3NzIiwgIi4uLy4uL2NvcmUvc3JjL3JlcG9ydC11aS50cyIsICIuLi8uLi9jb3JlL3NyYy9yZXBvcnQtYnV0dG9uLWhvb2sudHMiLCAiLi4vLi4vY29yZS9zcmMvcHJvZmlsZS1ib3JkZXIuaHRtbCIsICIuLi8uLi9jb3JlL3NyYy9wcm9maWxlLWJvcmRlci5jc3MiLCAiLi4vLi4vY29yZS9zcmMvcHJvZmlsZS1ib3JkZXItdWkudHMiLCAiLi4vLi4vY29yZS9zcmMvYm90LWJsb2NrLmh0bWwiLCAiLi4vLi4vY29yZS9zcmMvYm90LWJsb2NrLmNzcyIsICIuLi8uLi9jb3JlL3NyYy9ib3QtYmxvY2stdWkudHMiLCAiLi4vLi4vY29yZS9zcmMvc2V0dGluZ3MudHMiLCAiLi4vc3JjL3BhbmVsLmNzcyIsICIuLi9zcmMvcGFuZWwuaHRtbCIsICIuLi9zcmMvc2hhcmVkL3NldHRpbmdzLnRzIiwgIi4uL3NyYy9zaGFyZWQvZW52LnRzIiwgIi4uL3NyYy91c2VyLWlkLWxvZ2dlci50cyIsICIuLi9zcmMvcmVwb3J0LnRzIiwgIi4uL3NyYy91c2Vyc2NyaXB0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBUYWdnZWQgbG9nZ2VyLCBzaGFyZWQgYnkgZXZlcnkgcGFja2FnZSB0aGF0IGJ1bmRsZXMgY29yZS4gVGhlIGJhc2UgY2FsbFxuLy8gKGxvZyguLi4pKSBpcyBkZWJ1Zy1nYXRlZCBzbyBwcm9kdWN0aW9uIGJ1aWxkcyBkZWFkLWNvZGUtZWxpbWluYXRlIGl0XG4vLyAoZXNidWlsZCBpbmxpbmVzIF9fREVCVUdfXz1mYWxzZSkuIGB3YXJuYCBhbmQgYGVycm9yYCBhbHdheXMgbG9nIFx1MjAxNCB0aGV5XG4vLyBzaWduYWwgcmVhbCBwcm9ibGVtcyBhbmQgc2hvdWxkIGJlIHZpc2libGUgaW4gcHJvZC5cbi8vXG4vLyBSZWxpZXMgb24gdGhlIGBfX0RFQlVHX19gIGdsb2JhbCwgd2hpY2ggZWFjaCBjb25zdW1lcidzIGVzYnVpbGQgY29uZmlnXG4vLyBkZWZpbmVzIChzZWUgY29yZS9zcmMvYW1iaWVudC5kLnRzIGZvciB0aGUgZGVjbGFyYXRpb24pLlxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkO1xuICB3YXJuOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuICBlcnJvcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZDtcbn1cblxuLy8gQWxsIGNsaWVudCBjb25zb2xlIHRhZ3MgZm9sbG93IHRoZSBcIltzbmlmZmllcy08bmFtZT5dXCIgZm9ybWF0LlxuZXhwb3J0IGNvbnN0IGZvcm1hdFRhZyA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gYFtzbmlmZmllcy0ke25hbWV9XWA7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAobmFtZTogc3RyaW5nKTogTG9nZ2VyID0+IHtcbiAgY29uc3QgdGFnID0gZm9ybWF0VGFnKG5hbWUpO1xuICBjb25zdCBsb2cgPSAoKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQgPT4ge1xuICAgIGlmIChfX0RFQlVHX18pIHtcbiAgICAgIGNvbnNvbGUubG9nKHRhZywgLi4uYXJncyk7XG4gICAgfVxuICB9KSBhcyBMb2dnZXI7XG4gIGxvZy53YXJuID0gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQgPT4ge1xuICAgIGNvbnNvbGUud2Fybih0YWcsIC4uLmFyZ3MpO1xuICB9O1xuICBsb2cuZXJyb3IgPSAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCA9PiB7XG4gICAgY29uc29sZS5lcnJvcih0YWcsIC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4gbG9nO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEdlb092ZXJyaWRlIH0gZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuL2xvZy5qc1wiO1xuXG50eXBlIFBhdGNoZWRHZW8gPSBHZW9sb2NhdGlvbiAmIHsgX19zbmlmZmllc1BhdGNoZWQ/OiBib29sZWFuIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VvSG9va1Jlc3VsdCB7XG4gIG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbjogR2VvbG9jYXRpb25bXCJnZXRDdXJyZW50UG9zaXRpb25cIl07XG4gIG5hdGl2ZVdhdGNoUG9zaXRpb246IEdlb2xvY2F0aW9uW1wid2F0Y2hQb3NpdGlvblwiXTtcbiAgLyoqIFJlLWZpcmVzIGFsbCBhY3RpdmUgd2F0Y2hQb3NpdGlvbiBzdWJzY3JpYmVycyB3aXRoIHRoZSBjdXJyZW50IHJlYWwgcG9zaXRpb24uIENhbGwgdGhpcyB3aGVuZXZlciB0aGUgb3ZlcnJpZGUgY2hhbmdlcyBzbyBhY3RpdmUgd2F0Y2hlcyByZWZsZWN0IHRoZSBuZXcgc3RhdGUgaW1tZWRpYXRlbHkuICovXG4gIHJlZnJlc2hXYXRjaGVzOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFdyYXBzIG5hdmlnYXRvci5nZW9sb2NhdGlvbiB0byBpbnRlcmNlcHQgcG9zaXRpb24gY2FsbHMuXG4gKlxuICogQHBhcmFtIGdldE92ZXJyaWRlIC0gQ2FsbGVkIG9uIGV2ZXJ5IHBvc2l0aW9uIHJlcXVlc3Q7IHJldHVybiBudWxsIHRvIHBhc3MgdGhyb3VnaCByZWFsIGNvb3Jkcy5cbiAqIEBwYXJhbSBvblBvc2l0aW9uICAtIE9wdGlvbmFsIGNhbGxiYWNrIGZpcmVkIHdpdGggdGhlIHJlYWwgKHByZS1zcG9vZikgY29vcmRzLCB1c2VmdWwgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICByZWxheWluZyBvYnNlcnZlZCBwb3NpdGlvbnMgYmFjayB0byBhIHN0b3JhZ2UgbGF5ZXIuXG4gKiBAcmV0dXJucyBOYXRpdmUgZ2VvIG1ldGhvZHMgKG5lZWRlZCBieSBjYWxsZXJzIHRoYXQgbXVzdCBieXBhc3MgdGhlIGhvb2ssIGUuZy4gXCJmaWxsIHdpdGhcbiAqICAgICAgICAgIGN1cnJlbnRcIiBpbiBhIFVJIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFnZSksIG9yIG51bGwgaWYgYWxyZWFkeSBwYXRjaGVkLlxuICovXG5leHBvcnQgY29uc3QgaW5zdGFsbEdlb0hvb2sgPSAoXG4gIGdldE92ZXJyaWRlOiAoKSA9PiBHZW9PdmVycmlkZSB8IG51bGwsXG4gIG9uUG9zaXRpb24/OiAoY29vcmRzOiB7IGxhdGl0dWRlOiBudW1iZXI7IGxvbmdpdHVkZTogbnVtYmVyIH0pID0+IHZvaWQsXG4pOiBHZW9Ib29rUmVzdWx0IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihcImdlb1wiKTtcbiAgY29uc3QgZ2VvID0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uIGFzIFBhdGNoZWRHZW8gfCB1bmRlZmluZWQ7XG4gIGlmICghZ2VvIHx8IGdlby5fX3NuaWZmaWVzUGF0Y2hlZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uID0gZ2VvLmdldEN1cnJlbnRQb3NpdGlvbi5iaW5kKGdlbyk7XG4gIGNvbnN0IG5hdGl2ZVdhdGNoUG9zaXRpb24gPSBnZW8ud2F0Y2hQb3NpdGlvbi5iaW5kKGdlbyk7XG4gIGNvbnN0IG5hdGl2ZUNsZWFyV2F0Y2ggPSBnZW8uY2xlYXJXYXRjaC5iaW5kKGdlbyk7XG5cbiAgY29uc3QgYWN0aXZlV2F0Y2hlcnMgPSBuZXcgTWFwPG51bWJlciwgUG9zaXRpb25DYWxsYmFjaz4oKTtcblxuICBjb25zdCBhcHBseU92ZXJyaWRlID0gKHBvc2l0aW9uOiBHZW9sb2NhdGlvblBvc2l0aW9uKTogR2VvbG9jYXRpb25Qb3NpdGlvbiA9PiB7XG4gICAgY29uc3Qgb3YgPSBnZXRPdmVycmlkZSgpO1xuICAgIGlmICghb3Y/LmVuYWJsZWQpIHtcbiAgICAgIGxvZyhcIm92ZXJyaWRlIGRpc2FibGVkLCBwYXNzaW5nIHJlYWwgY29vcmRzXCIsIHBvc2l0aW9uLmNvb3Jkcyk7XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuICAgIGNvbnN0IHNwb29mZWQgPSB7XG4gICAgICBjb29yZHM6IHtcbiAgICAgICAgbGF0aXR1ZGU6IG92LmxhdGl0dWRlLFxuICAgICAgICBsb25naXR1ZGU6IG92LmxvbmdpdHVkZSxcbiAgICAgICAgYWNjdXJhY3k6IDEwLFxuICAgICAgICBhbHRpdHVkZTogbnVsbCxcbiAgICAgICAgYWx0aXR1ZGVBY2N1cmFjeTogbnVsbCxcbiAgICAgICAgaGVhZGluZzogbnVsbCxcbiAgICAgICAgc3BlZWQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0gYXMgR2VvbG9jYXRpb25Qb3NpdGlvbjtcbiAgICBsb2coXCJhcHBseWluZyBvdmVycmlkZVwiLCBzcG9vZmVkLmNvb3Jkcyk7XG4gICAgcmV0dXJuIHNwb29mZWQ7XG4gIH07XG5cbiAgY29uc3Qgd3JhcFN1Y2Nlc3MgPVxuICAgIChjYWxsYmFjazogUG9zaXRpb25DYWxsYmFjayk6IFBvc2l0aW9uQ2FsbGJhY2sgPT5cbiAgICAocG9zaXRpb24pID0+IHtcbiAgICAgIG9uUG9zaXRpb24/Lih7XG4gICAgICAgIGxhdGl0dWRlOiBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsXG4gICAgICAgIGxvbmdpdHVkZTogcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSxcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2soYXBwbHlPdmVycmlkZShwb3NpdGlvbikpO1xuICAgIH07XG5cbiAgZ2VvLmdldEN1cnJlbnRQb3NpdGlvbiA9IChzdWNjZXNzLCBlcnJvciwgb3B0aW9ucykgPT4ge1xuICAgIGxvZyhcImdldEN1cnJlbnRQb3NpdGlvbiBpbnRlcmNlcHRlZFwiKTtcbiAgICBuYXRpdmVHZXRDdXJyZW50UG9zaXRpb24od3JhcFN1Y2Nlc3Moc3VjY2VzcyksIGVycm9yLCBvcHRpb25zKTtcbiAgfTtcblxuICBnZW8ud2F0Y2hQb3NpdGlvbiA9IChzdWNjZXNzLCBlcnJvciwgb3B0aW9ucykgPT4ge1xuICAgIGxvZyhcIndhdGNoUG9zaXRpb24gaW50ZXJjZXB0ZWRcIik7XG4gICAgY29uc3Qgd3JhcHBlZCA9IHdyYXBTdWNjZXNzKHN1Y2Nlc3MpO1xuICAgIGNvbnN0IGlkID0gbmF0aXZlV2F0Y2hQb3NpdGlvbih3cmFwcGVkLCBlcnJvciwgb3B0aW9ucyk7XG4gICAgYWN0aXZlV2F0Y2hlcnMuc2V0KGlkLCB3cmFwcGVkKTtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgZ2VvLmNsZWFyV2F0Y2ggPSAoaWQpID0+IHtcbiAgICBhY3RpdmVXYXRjaGVycy5kZWxldGUoaWQpO1xuICAgIG5hdGl2ZUNsZWFyV2F0Y2goaWQpO1xuICB9O1xuXG4gIGNvbnN0IHJlZnJlc2hXYXRjaGVzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChhY3RpdmVXYXRjaGVycy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgIChwb3MpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjYiBvZiBhY3RpdmVXYXRjaGVycy52YWx1ZXMoKSkge1xuICAgICAgICAgIGNiKHBvcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IG1heGltdW1BZ2U6IDAgfSxcbiAgICApO1xuICB9O1xuXG4gIGdlby5fX3NuaWZmaWVzUGF0Y2hlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHsgbmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uLCBuYXRpdmVXYXRjaFBvc2l0aW9uLCByZWZyZXNoV2F0Y2hlcyB9O1xufTtcbiIsICJpbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi9sb2cuanNcIjtcblxudHlwZSBQYXRjaGVkV2ViU29ja2V0Q3RvciA9IHR5cGVvZiBXZWJTb2NrZXQgJiB7IF9fc25pZmZpZXNVc2VySWRQYXRjaGVkPzogYm9vbGVhbiB9O1xuXG5jb25zdCBXU19IT1NUID0gXCJwcm9kLndzLnNuaWZmaWVzLmNvbVwiO1xuXG5jb25zdCBleHRyYWN0VXNlcklkID0gKHVybDogc3RyaW5nIHwgVVJMKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwsIHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLmhyZWYgOiB1bmRlZmluZWQpO1xuICAgIGlmIChwYXJzZWQuaG9zdCAhPT0gV1NfSE9TVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQuc2VhcmNoUGFyYW1zLmdldChcInVzZXJJZFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogV3JhcHMgdGhlIGdsb2JhbCBXZWJTb2NrZXQgY29uc3RydWN0b3IgdG8gcmVhZCB0aGUgYHVzZXJJZGAgcXVlcnkgcGFyYW0gb2ZmXG4gKiBjb25uZWN0aW9ucyB0byBwcm9kLndzLnNuaWZmaWVzLmNvbSBcdTIwMTQgdGhhdCBzb2NrZXQgY2FycmllcyB0aGUgbG9nZ2VkLWluXG4gKiB1c2VyJ3Mgb3duIGlkIG9uIGV2ZXJ5IGNvbm5lY3QsIGUuZy5cbiAqIHdzczovL3Byb2Qud3Muc25pZmZpZXMuY29tLz91c2VySWQ9PGlkPiZsYXQ9Li4uJmxuZz0uLi5cbiAqIFRoZSBzb2NrZXQgaXRzZWxmIGlzIGxlZnQgdW50b3VjaGVkOyB0aGlzIG9ubHkgb2JzZXJ2ZXMgdGhlIGNvbm5lY3QgVVJMLlxuICpcbiAqIEByZXR1cm5zIGZhbHNlIGlmIFdlYlNvY2tldCBpcyB1bmF2YWlsYWJsZSBvciBhbHJlYWR5IHBhdGNoZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsVXNlcklkSG9vayA9IChvblVzZXJJZDogKHVzZXJJZDogc3RyaW5nKSA9PiB2b2lkKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihcInVzZXItaWRcIik7XG4gIGNvbnN0IE5hdGl2ZVdlYlNvY2tldCA9ICh0eXBlb2YgV2ViU29ja2V0ICE9PSBcInVuZGVmaW5lZFwiID8gV2ViU29ja2V0IDogdW5kZWZpbmVkKSBhc1xuICAgIHwgUGF0Y2hlZFdlYlNvY2tldEN0b3JcbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKCFOYXRpdmVXZWJTb2NrZXQgfHwgTmF0aXZlV2ViU29ja2V0Ll9fc25pZmZpZXNVc2VySWRQYXRjaGVkKSB7XG4gICAgbG9nKFwiaG9vayBub3QgaW5zdGFsbGVkIChubyBXZWJTb2NrZXQgb3IgYWxyZWFkeSBwYXRjaGVkKVwiKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBQYXRjaGVkV2ViU29ja2V0ID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IFdlYlNvY2tldCxcbiAgICB1cmw6IHN0cmluZyB8IFVSTCxcbiAgICBwcm90b2NvbHM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogV2ViU29ja2V0IHtcbiAgICBjb25zdCB1c2VySWQgPSBleHRyYWN0VXNlcklkKHVybCk7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgbG9nKFwib2JzZXJ2ZWQgdXNlcklkIG9uIFdlYlNvY2tldCBjb25uZWN0XCIsIHVzZXJJZCk7XG4gICAgICBvblVzZXJJZCh1c2VySWQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvdG9jb2xzID09PSB1bmRlZmluZWQgPyBuZXcgTmF0aXZlV2ViU29ja2V0KHVybCkgOiBuZXcgTmF0aXZlV2ViU29ja2V0KHVybCwgcHJvdG9jb2xzKTtcbiAgfSBhcyB1bmtub3duIGFzIFBhdGNoZWRXZWJTb2NrZXRDdG9yO1xuXG4gIC8vIFRPRE86IEkgaGF0ZSB0aGlzXG4gIFBhdGNoZWRXZWJTb2NrZXQucHJvdG90eXBlID0gTmF0aXZlV2ViU29ja2V0LnByb3RvdHlwZTtcbiAgKFBhdGNoZWRXZWJTb2NrZXQgYXMgdW5rbm93biBhcyB7IENPTk5FQ1RJTkc6IG51bWJlciB9KS5DT05ORUNUSU5HID0gTmF0aXZlV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG4gIChQYXRjaGVkV2ViU29ja2V0IGFzIHVua25vd24gYXMgeyBPUEVOOiBudW1iZXIgfSkuT1BFTiA9IE5hdGl2ZVdlYlNvY2tldC5PUEVOO1xuICAoUGF0Y2hlZFdlYlNvY2tldCBhcyB1bmtub3duIGFzIHsgQ0xPU0lORzogbnVtYmVyIH0pLkNMT1NJTkcgPSBOYXRpdmVXZWJTb2NrZXQuQ0xPU0lORztcbiAgKFBhdGNoZWRXZWJTb2NrZXQgYXMgdW5rbm93biBhcyB7IENMT1NFRDogbnVtYmVyIH0pLkNMT1NFRCA9IE5hdGl2ZVdlYlNvY2tldC5DTE9TRUQ7XG4gIFBhdGNoZWRXZWJTb2NrZXQuX19zbmlmZmllc1VzZXJJZFBhdGNoZWQgPSB0cnVlO1xuXG4gIHdpbmRvdy5XZWJTb2NrZXQgPSBQYXRjaGVkV2ViU29ja2V0O1xuICBsb2coXCJob29rIGluc3RhbGxlZFwiKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuIiwgImltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiLi9sb2cuanNcIjtcblxuLy8gRmlsdGVycyBibG9ja2VkLWJvdCBhY2NvdW50cyBvdXQgb2YgU25pZmZpZXMnIG93biBkYXRhIGJlZm9yZSB0aGUgcGFnZSBldmVyXG4vLyBwYXJzZXMgaXQsIGFjcm9zcyBmb3VyIHJldmVyc2UtZW5naW5lZXJlZCBzdXJmYWNlcyAoc2VlIFRPRE8ubWQgc2VjdGlvbiA1XG4vLyBmb3IgdGhlIEhBUi1kZXJpdmVkIGZpZWxkIHBhdGhzIHRoaXMgd2FzIGJ1aWx0IGFnYWluc3QpOlxuLy8gICAtIFBPU1QgLi4uL2FwaS9wb3N0LWF1dGhlbnRpY2F0aW9uIChtYXAgaW5pdClcbi8vICAgLSBHRVQgIC4uLi9hcGkvdjIvcG9zdC1hdXRoZW50aWNhdGlvbi9jaGF0LWRhdGEgKGNoYXQgaW5pdClcbi8vICAgLSBHRVQgIC4uLi9hcGkvbWVzc2FnZXM/Y29udmVyc2F0aW9uSWQ9Li4uIChhbiBvcGVuZWQgY2hhdCB0aHJlYWQpXG4vLyAgIC0gd3NzOi8vcHJvZC53cy5zbmlmZmllcy5jb20vIChsaXZlIHByZXNlbmNlIGV2ZW50cywgbGl2ZSAxOjEgY2hhdFxuLy8gICAgIG1lc3NhZ2VzIHZpYSBhIFwibmV3TXNnXCIgZnJhbWUsIGFuZCBuZXcgY29udmVyc2F0aW9uIHRocmVhZHMgdmlhIGFcbi8vICAgICBcIm5ld0NvbnZlcnNhdGlvblwiIGZyYW1lIFx1MjAxNCBjb25maXJtZWQgYnkgSEFSLCBzZWUgYmVsb3cpXG4vLyBUaGUgQVBJIGhvc3QgaXRzZWxmIGlzbid0IHN0YWJsZTogYSBzZWNvbmQgY2FwdHVyZSwgdGFrZW4gbWludXRlcyBhZnRlciB0aGVcbi8vIGZpcnN0LCBzYXcgZXZlcnkgL2FwaS8qIGNhbGwgbW92ZSBmcm9tIHVzd2FwaTIuc25pZmZpZXMuY29tIHRvXG4vLyB1c3cuYXBpLnNuaWZmaWVzLmNvbSBcdTIwMTQgc28gWEhSIG1hdGNoaW5nIGlzIGRvbmUgYnkgKnBhdGgqIGFnYWluc3QgYW55XG4vLyAqLnNuaWZmaWVzLmNvbSBob3N0LCBub3QgYnkgYSBmaXhlZCBob3N0bmFtZSAodGhhdCBtaXNtYXRjaCB3YXMgdGhlIHJvb3Rcbi8vIGNhdXNlIG9mIGEgcmVhbCBmaWx0ZXJpbmcgbWlzcyBkdXJpbmcgdGVzdGluZykuXG4vLyBUaGlzIGlzIGluaGVyZW50bHkgZnJhZ2lsZTogU25pZmZpZXMgY2FuIGNoYW5nZSBhbnkgb2YgdGhlc2Ugd2lyZSBmb3JtYXRzXG4vLyB3aXRob3V0IG5vdGljZSwgc2lsZW50bHkgdHVybmluZyBvZmYgZmlsdGVyaW5nLiBUaGVyZSdzIG5vIHJlYWxpc3RpYyB3YXkgdG9cbi8vIHVuaXQtdGVzdCB0aGUgZmlsdGVyaW5nIGxvZ2ljIGFnYWluc3QgbGl2ZSBTbmlmZmllcyB0cmFmZmljIFx1MjAxNCB0aGUgcHVyZVxuLy8gZmlsdGVyL2RlY2lzaW9uIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY292ZXJlZCwgYnV0IHRoZSBhY3R1YWwgaG9vayBvbmx5IGdldHNcbi8vIG1hbnVhbCB2ZXJpZmljYXRpb24uIEV2ZXJ5IHN1Y2Nlc3NmdWwgZmlsdGVyIGxvZ3MgdmlhIGxvZy53YXJuIChzbyBpdCdzXG4vLyB2aXNpYmxlIHdpdGhvdXQgZmxpcHBpbmcgb24gX19ERUJVR19fKSBuYW1pbmcgd2hpY2ggYmxvY2tlZCBpZChzKSB3ZXJlXG4vLyByZW1vdmVkIGFuZCBmcm9tIHdoZXJlIFx1MjAxNCBjaGVjayB0aGUgY29uc29sZSBpZiBmaWx0ZXJpbmcgc2VlbXMgdG8gYmVcbi8vIG1pc3Npbmcgc29tZXRoaW5nLlxuXG5leHBvcnQgaW50ZXJmYWNlIEJvdEJsb2NrU3RhdGUge1xuICBibG9ja2VkSWRzOiBSZWFkb25seVNldDxzdHJpbmc+O1xuICBlbmFibGVkOiBib29sZWFuO1xufVxuXG4vKiogQ2FsbGVkIHdpdGggdGhlIGRpc3RpbmN0IGJsb2NrZWQgaWRzIHJlbW92ZWQgZnJvbSBhIHNpbmdsZSByZXNwb25zZS9mcmFtZS4gKi9cbmV4cG9ydCB0eXBlIE9uQm90c0ZpbHRlcmVkID0gKGlkczogc3RyaW5nW10pID0+IHZvaWQ7XG5cbmNvbnN0IFBPU1RfQVVUSF9QQVRIID0gXCIvYXBpL3Bvc3QtYXV0aGVudGljYXRpb25cIjtcbmNvbnN0IENIQVRfREFUQV9QQVRIID0gXCIvYXBpL3YyL3Bvc3QtYXV0aGVudGljYXRpb24vY2hhdC1kYXRhXCI7XG5jb25zdCBNRVNTQUdFU19QQVRIID0gXCIvYXBpL21lc3NhZ2VzXCI7XG5jb25zdCBXU19IT1NUID0gXCJwcm9kLndzLnNuaWZmaWVzLmNvbVwiO1xuXG50eXBlIEZpbHRlcktpbmQgPSBcInBvc3QtYXV0aGVudGljYXRpb25cIiB8IFwiY2hhdC1kYXRhXCIgfCBcIm1lc3NhZ2VzXCI7XG5cbmludGVyZmFjZSBXaXRoSWQge1xuICBfaWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5lYXJieVZpc2l0b3JzUGF5bG9hZCB7XG4gIG5lYXJieVZpc2l0b3JzPzogeyB2aXNpdG9ycz86IFdpdGhJZFtdIH07XG4gIHBhcnRpYWxWaXNpdG9yRGF0YT86IFdpdGhJZFtdO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgQ29udmVyc2F0aW9uIHtcbiAgcGFydGljaXBhbnRzPzogc3RyaW5nO1xuICBhdXRob3IxPzogc3RyaW5nO1xuICBhdXRob3IyPzogc3RyaW5nIHwgbnVsbDtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIENoYXREYXRhUGF5bG9hZCB7XG4gIGNvbnZlcnNhdGlvbkRhdGE/OiB7XG4gICAgY29udmVyc2F0aW9ucz86IENvbnZlcnNhdGlvbltdO1xuICAgIHVzZXJJZHM/OiBzdHJpbmdbXTtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICB9O1xuICBwYXJ0aWFsVmlzaXRvckRhdGE/OiBXaXRoSWRbXTtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICBhdXRob3I/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmludGVyZmFjZSBNZXNzYWdlc1BheWxvYWQge1xuICBtZXNzYWdlcz86IE1lc3NhZ2VbXTtcbiAgcGFydGlhbFVzZXJzPzogV2l0aElkW107XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmNvbnN0IGZpbHRlckJ5SWQgPSA8VCBleHRlbmRzIFdpdGhJZD4oXG4gIGl0ZW1zOiBUW10gfCB1bmRlZmluZWQsXG4gIGJsb2NrZWRJZHM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gIHJlbW92ZWQ/OiBTZXQ8c3RyaW5nPixcbik6IFRbXSB8IHVuZGVmaW5lZCA9PlxuICBpdGVtcz8uZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgaWYgKCFibG9ja2VkSWRzLmhhcyhpdGVtLl9pZCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZW1vdmVkPy5hZGQoaXRlbS5faWQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbi8qKlxuICogUmVtb3ZlcyBibG9ja2VkIGFjY291bnRzIGZyb20gdGhlIG1hcCBpbml0IHBheWxvYWQncyB2aXNpdG9yIGxpc3RzLiBJZlxuICogYHJlbW92ZWRgIGlzIHBhc3NlZCwgZXZlcnkgc3RyaXBwZWQgaWQgaXMgYWRkZWQgdG8gaXQgYXMgZmlsdGVyaW5nIGhhcHBlbnNcbiAqIFx1MjAxNCBhIHNpbmdsZSBwYXNzLCByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIHByZS1zY2FuIHRvIGZpbmQgd2hpY2ggaWRzIHdlcmVcbiAqIHByZXNlbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBmaWx0ZXJQb3N0QXV0aGVudGljYXRpb25QYXlsb2FkID0gKFxuICBwYXlsb2FkOiBOZWFyYnlWaXNpdG9yc1BheWxvYWQsXG4gIGJsb2NrZWRJZHM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gIHJlbW92ZWQ/OiBTZXQ8c3RyaW5nPixcbik6IE5lYXJieVZpc2l0b3JzUGF5bG9hZCA9PiB7XG4gIGlmIChibG9ja2VkSWRzLnNpemUgPT09IDApIHtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuICBpZiAocGF5bG9hZC5uZWFyYnlWaXNpdG9ycz8udmlzaXRvcnMpIHtcbiAgICBwYXlsb2FkLm5lYXJieVZpc2l0b3JzLnZpc2l0b3JzID0gZmlsdGVyQnlJZChcbiAgICAgIHBheWxvYWQubmVhcmJ5VmlzaXRvcnMudmlzaXRvcnMsXG4gICAgICBibG9ja2VkSWRzLFxuICAgICAgcmVtb3ZlZCxcbiAgICApO1xuICB9XG4gIGlmIChwYXlsb2FkLnBhcnRpYWxWaXNpdG9yRGF0YSkge1xuICAgIHBheWxvYWQucGFydGlhbFZpc2l0b3JEYXRhID0gZmlsdGVyQnlJZChwYXlsb2FkLnBhcnRpYWxWaXNpdG9yRGF0YSwgYmxvY2tlZElkcywgcmVtb3ZlZCk7XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59O1xuXG4vKiogUmVtb3ZlcyBibG9ja2VkIGFjY291bnRzIGZyb20gdGhlIGNoYXQgaW5pdCBwYXlsb2FkJ3MgY29udmVyc2F0aW9uIGxpc3RzLiAqL1xuZXhwb3J0IGNvbnN0IGZpbHRlckNoYXREYXRhUGF5bG9hZCA9IChcbiAgcGF5bG9hZDogQ2hhdERhdGFQYXlsb2FkLFxuICBibG9ja2VkSWRzOiBSZWFkb25seVNldDxzdHJpbmc+LFxuICByZW1vdmVkPzogU2V0PHN0cmluZz4sXG4pOiBDaGF0RGF0YVBheWxvYWQgPT4ge1xuICBpZiAoYmxvY2tlZElkcy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbiAgY29uc3QgaXNCbG9ja2VkQ29udmVyc2F0aW9uID0gKGM6IENvbnZlcnNhdGlvbik6IGJvb2xlYW4gPT4ge1xuICAgIGxldCBibG9ja2VkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBpZCBvZiBbYy5wYXJ0aWNpcGFudHMsIGMuYXV0aG9yMSwgYy5hdXRob3IyXSkge1xuICAgICAgaWYgKGlkICYmIGJsb2NrZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICByZW1vdmVkPy5hZGQoaWQpO1xuICAgICAgICBibG9ja2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJsb2NrZWQ7XG4gIH07XG5cbiAgaWYgKHBheWxvYWQuY29udmVyc2F0aW9uRGF0YT8uY29udmVyc2F0aW9ucykge1xuICAgIHBheWxvYWQuY29udmVyc2F0aW9uRGF0YS5jb252ZXJzYXRpb25zID0gcGF5bG9hZC5jb252ZXJzYXRpb25EYXRhLmNvbnZlcnNhdGlvbnMuZmlsdGVyKFxuICAgICAgKGMpID0+ICFpc0Jsb2NrZWRDb252ZXJzYXRpb24oYyksXG4gICAgKTtcbiAgfVxuICBpZiAocGF5bG9hZC5jb252ZXJzYXRpb25EYXRhPy51c2VySWRzKSB7XG4gICAgcGF5bG9hZC5jb252ZXJzYXRpb25EYXRhLnVzZXJJZHMgPSBwYXlsb2FkLmNvbnZlcnNhdGlvbkRhdGEudXNlcklkcy5maWx0ZXIoKGlkKSA9PiB7XG4gICAgICBpZiAoIWJsb2NrZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJlbW92ZWQ/LmFkZChpZCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHBheWxvYWQucGFydGlhbFZpc2l0b3JEYXRhKSB7XG4gICAgcGF5bG9hZC5wYXJ0aWFsVmlzaXRvckRhdGEgPSBmaWx0ZXJCeUlkKHBheWxvYWQucGFydGlhbFZpc2l0b3JEYXRhLCBibG9ja2VkSWRzLCByZW1vdmVkKTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZDtcbn07XG5cbi8qKiBSZW1vdmVzIGEgYmxvY2tlZCBhY2NvdW50J3MgbWVzc2FnZXMgKGFuZCBwcm9maWxlIGNhcmQpIGZyb20gYW4gb3BlbmVkIGNoYXQgdGhyZWFkLiAqL1xuZXhwb3J0IGNvbnN0IGZpbHRlck1lc3NhZ2VzUGF5bG9hZCA9IChcbiAgcGF5bG9hZDogTWVzc2FnZXNQYXlsb2FkLFxuICBibG9ja2VkSWRzOiBSZWFkb25seVNldDxzdHJpbmc+LFxuICByZW1vdmVkPzogU2V0PHN0cmluZz4sXG4pOiBNZXNzYWdlc1BheWxvYWQgPT4ge1xuICBpZiAoYmxvY2tlZElkcy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbiAgaWYgKHBheWxvYWQubWVzc2FnZXMpIHtcbiAgICBwYXlsb2FkLm1lc3NhZ2VzID0gcGF5bG9hZC5tZXNzYWdlcy5maWx0ZXIoKG0pID0+IHtcbiAgICAgIGlmICghKG0uYXV0aG9yICYmIGJsb2NrZWRJZHMuaGFzKG0uYXV0aG9yKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZW1vdmVkPy5hZGQobS5hdXRob3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG4gIGlmIChwYXlsb2FkLnBhcnRpYWxVc2Vycykge1xuICAgIHBheWxvYWQucGFydGlhbFVzZXJzID0gZmlsdGVyQnlJZChwYXlsb2FkLnBhcnRpYWxVc2VycywgYmxvY2tlZElkcywgcmVtb3ZlZCk7XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59O1xuXG5jb25zdCBhcHBseUZpbHRlciA9IChcbiAga2luZDogRmlsdGVyS2luZCxcbiAgcGF5bG9hZDogdW5rbm93bixcbiAgYmxvY2tlZElkczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgcmVtb3ZlZD86IFNldDxzdHJpbmc+LFxuKTogdW5rbm93biA9PiB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgXCJwb3N0LWF1dGhlbnRpY2F0aW9uXCI6XG4gICAgICByZXR1cm4gZmlsdGVyUG9zdEF1dGhlbnRpY2F0aW9uUGF5bG9hZChwYXlsb2FkIGFzIE5lYXJieVZpc2l0b3JzUGF5bG9hZCwgYmxvY2tlZElkcywgcmVtb3ZlZCk7XG4gICAgY2FzZSBcImNoYXQtZGF0YVwiOlxuICAgICAgcmV0dXJuIGZpbHRlckNoYXREYXRhUGF5bG9hZChwYXlsb2FkIGFzIENoYXREYXRhUGF5bG9hZCwgYmxvY2tlZElkcywgcmVtb3ZlZCk7XG4gICAgY2FzZSBcIm1lc3NhZ2VzXCI6XG4gICAgICByZXR1cm4gZmlsdGVyTWVzc2FnZXNQYXlsb2FkKHBheWxvYWQgYXMgTWVzc2FnZXNQYXlsb2FkLCBibG9ja2VkSWRzLCByZW1vdmVkKTtcbiAgfVxufTtcblxuaW50ZXJmYWNlIFdzRnJhbWVJbmZvIHtcbiAgZXZlbnROYW1lOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogUHVsbHMgdGhlIGV2ZW50IG5hbWUgKyBzdWJqZWN0IHVzZXIgaWQgKGlmIGFueSkgb3V0IG9mIGEgcmF3IFdTIGZyYW1lLiAqL1xuY29uc3QgcGFyc2VXc0ZyYW1lID0gKHJhdzogc3RyaW5nKTogV3NGcmFtZUluZm8gfCBudWxsID0+IHtcbiAgbGV0IG9iajogeyBldmVudE5hbWU/OiB1bmtub3duOyBkYXRhPzogdW5rbm93biB9O1xuICB0cnkge1xuICAgIG9iaiA9IEpTT04ucGFyc2UocmF3KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBvYmouZXZlbnROYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKG9iai5ldmVudE5hbWUgPT09IFwidXNlckpvaW5lZFwiIHx8IG9iai5ldmVudE5hbWUgPT09IFwidXNlclVwZGF0ZWRcIikge1xuICAgIGNvbnN0IGlkID0gKG9iai5kYXRhIGFzIHsgX2lkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uX2lkO1xuICAgIHJldHVybiB7IGV2ZW50TmFtZTogb2JqLmV2ZW50TmFtZSwgaWQ6IHR5cGVvZiBpZCA9PT0gXCJzdHJpbmdcIiA/IGlkIDogbnVsbCB9O1xuICB9XG4gIGlmIChcbiAgICBvYmouZXZlbnROYW1lID09PSBcInVzZXJBd2FrZVwiIHx8XG4gICAgb2JqLmV2ZW50TmFtZSA9PT0gXCJ1c2VyRGlzY29ubmVjdGVkXCIgfHxcbiAgICBvYmouZXZlbnROYW1lID09PSBcInVzZXJSZW1vdmVkXCJcbiAgKSB7XG4gICAgcmV0dXJuIHsgZXZlbnROYW1lOiBvYmouZXZlbnROYW1lLCBpZDogdHlwZW9mIG9iai5kYXRhID09PSBcInN0cmluZ1wiID8gb2JqLmRhdGEgOiBudWxsIH07XG4gIH1cbiAgaWYgKG9iai5ldmVudE5hbWUgPT09IFwibmV3TXNnXCIpIHtcbiAgICAvLyBMaXZlIDE6MSBjaGF0IG1lc3NhZ2UuIENvbmZpcm1lZCB2aWEgSEFSOiB0aGUgYXBwIHJlYWN0cyB0byB0aGlzIGZyYW1lXG4gICAgLy8gYnkgaW1tZWRpYXRlbHkgZmV0Y2hpbmcgL2FwaS9jb252ZXJzYXRpb24vdmlzaXRvciBmb3IgdGhlIGF1dGhvciAoYW5kLFxuICAgIC8vIHBlciB1c2VyIHJlcG9ydCwgdGhhdCByb3VuZC10cmlwIGlzIHdoYXQgY2F1c2VzIHRoZSBjb3VudGVycGFydCB0byBzZWVcbiAgICAvLyBhIHJlYWQgcmVjZWlwdCkgXHUyMDE0IGRyb3BwaW5nIHRoZSBmcmFtZSBoZXJlIGlzIHdoYXQgYWN0dWFsbHkgc3RvcHMgdGhhdFxuICAgIC8vIGNoYWluLCBzaW5jZSB3ZSBvbmx5IHJld3JpdGUgWEhSICpyZXNwb25zZXMqIGFuZCBjYW4ndCBpbnRlcmNlcHQgYVxuICAgIC8vIHJlcXVlc3QgdGhhdCBuZXZlciBnZXRzIHNlbnQuXG4gICAgY29uc3QgYXV0aG9yID0gKG9iai5kYXRhIGFzIHsgbWVzc2FnZT86IHsgYXV0aG9yPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlPy5hdXRob3I7XG4gICAgcmV0dXJuIHsgZXZlbnROYW1lOiBvYmouZXZlbnROYW1lLCBpZDogdHlwZW9mIGF1dGhvciA9PT0gXCJzdHJpbmdcIiA/IGF1dGhvciA6IG51bGwgfTtcbiAgfVxuICBpZiAob2JqLmV2ZW50TmFtZSA9PT0gXCJuZXdDb252ZXJzYXRpb25cIikge1xuICAgIC8vIEZpcmVzIHdoZW4gYSBicmFuZC1uZXcgY29udmVyc2F0aW9uIHRocmVhZCBzdGFydHMgXHUyMDE0IHNhbWUgbGVhayBhc1xuICAgIC8vIG5ld01zZyBhYm92ZSwganVzdCBmb3IgYSBmaXJzdCBtZXNzYWdlIGluc3RlYWQgb2Ygb25lIGluIGFuIGV4aXN0aW5nXG4gICAgLy8gdGhyZWFkLiBDb25maXJtZWQgdmlhIEhBUjogZGF0YS5wYXJ0aWFsVXNlciBpcyB0aGUgY291bnRlcnBhcnQnc1xuICAgIC8vIGxpZ2h0d2VpZ2h0IHByb2ZpbGUsIHRoZSBzYW1lIHtfaWQsIC4uLn0gc2hhcGUgYXMgcGFydGlhbFZpc2l0b3JEYXRhL1xuICAgIC8vIHBhcnRpYWxVc2VycyBlbHNld2hlcmUsIHNvIGl0J3MgdGhlIGRlZmluaXRpdmUgaWQgcmVnYXJkbGVzcyBvZlxuICAgIC8vIHdoZXRoZXIgdGhlIGJsb2NrZWQgYWNjb3VudCBpcyBkYXRhLmNvbnZlcnNhdGlvbidzIGF1dGhvcjEgb3IgYXV0aG9yMi5cbiAgICBjb25zdCBpZCA9IChvYmouZGF0YSBhcyB7IHBhcnRpYWxVc2VyPzogeyBfaWQ/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnBhcnRpYWxVc2VyPy5faWQ7XG4gICAgcmV0dXJuIHsgZXZlbnROYW1lOiBvYmouZXZlbnROYW1lLCBpZDogdHlwZW9mIGlkID09PSBcInN0cmluZ1wiID8gaWQgOiBudWxsIH07XG4gIH1cbiAgcmV0dXJuIHsgZXZlbnROYW1lOiBvYmouZXZlbnROYW1lLCBpZDogbnVsbCB9O1xufTtcblxuLyoqIERlY2lkZXMgd2hldGhlciBhIHNpbmdsZSBsaXZlIFdlYlNvY2tldCBmcmFtZSBjYXJyaWVzIGEgYmxvY2tlZCBhY2NvdW50LiAqL1xuZXhwb3J0IGNvbnN0IHNob3VsZEZpbHRlcldlYlNvY2tldEZyYW1lID0gKFxuICByYXc6IHN0cmluZyxcbiAgYmxvY2tlZElkczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoYmxvY2tlZElkcy5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGZyYW1lID0gcGFyc2VXc0ZyYW1lKHJhdyk7XG4gIHJldHVybiAhIWZyYW1lPy5pZCAmJiBibG9ja2VkSWRzLmhhcyhmcmFtZS5pZCk7XG59O1xuXG4vLyBcdTI1MDBcdTI1MDAgWEhSIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU25pZmZpZXMgY2FsbHMgdGhlc2UgZW5kcG9pbnRzIHZpYSBYTUxIdHRwUmVxdWVzdCwgbm90IGZldGNoIChjb25maXJtZWRcbi8vIGZyb20gdGhlIEhBUikuIFNoYWRvd2luZyByZXNwb25zZVRleHQvcmVzcG9uc2UgYXMgaW5zdGFuY2UtbGV2ZWwgYWNjZXNzb3Jcbi8vIHByb3BlcnRpZXMgKHJhdGhlciB0aGFuIHJhY2luZyB0aGUgYXBwJ3Mgb3duIGxvYWQvcmVhZHlzdGF0ZWNoYW5nZVxuLy8gbGlzdGVuZXJzKSBtZWFucyB3aGVuZXZlciB0aGUgYXBwIHJlYWRzIHRoZSByZXNwb25zZSwgaXQgZ2V0cyB0aGUgZmlsdGVyZWRcbi8vIHZlcnNpb24gcmVnYXJkbGVzcyBvZiB3aGVuIHRoYXQgcmVhZCBoYXBwZW5zLlxuXG50eXBlIFBhdGNoZWRYSFJQcm90b3R5cGUgPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlICYge1xuICBfX3NuaWZmaWVzQm90QmxvY2tQYXRjaGVkPzogYm9vbGVhbjtcbn07XG50eXBlIFhocldpdGhGaWx0ZXJLaW5kID0gWE1MSHR0cFJlcXVlc3QgJiB7IF9fc25pZmZpZXNGaWx0ZXJLaW5kPzogRmlsdGVyS2luZCB8IG51bGwgfTtcblxuLy8gTWF0Y2hlZCBieSBwYXRoIG9ubHksIG5vdCBob3N0bmFtZSBcdTIwMTQgc2VlIHRoZSBmaWxlIGhlYWRlciBvbiB3aHkuXG5jb25zdCBpc1NuaWZmaWVzQXBpSG9zdCA9IChob3N0OiBzdHJpbmcpOiBib29sZWFuID0+XG4gIGhvc3QgPT09IFwic25pZmZpZXMuY29tXCIgfHwgaG9zdC5lbmRzV2l0aChcIi5zbmlmZmllcy5jb21cIik7XG5cbmNvbnN0IGNsYXNzaWZ5WGhyVXJsID0gKHVybDogc3RyaW5nKTogRmlsdGVyS2luZCB8IG51bGwgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsLCB0eXBlb2YgbG9jYXRpb24gIT09IFwidW5kZWZpbmVkXCIgPyBsb2NhdGlvbi5ocmVmIDogdW5kZWZpbmVkKTtcbiAgICBpZiAoIWlzU25pZmZpZXNBcGlIb3N0KHBhcnNlZC5ob3N0KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChwYXJzZWQucGF0aG5hbWUgPT09IFBPU1RfQVVUSF9QQVRIKSB7XG4gICAgICByZXR1cm4gXCJwb3N0LWF1dGhlbnRpY2F0aW9uXCI7XG4gICAgfVxuICAgIGlmIChwYXJzZWQucGF0aG5hbWUgPT09IENIQVRfREFUQV9QQVRIKSB7XG4gICAgICByZXR1cm4gXCJjaGF0LWRhdGFcIjtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5wYXRobmFtZSA9PT0gTUVTU0FHRVNfUEFUSCkge1xuICAgICAgcmV0dXJuIFwibWVzc2FnZXNcIjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBpbnN0YWxsWGhyRmlsdGVyID0gKFxuICBnZXRTdGF0ZTogKCkgPT4gQm90QmxvY2tTdGF0ZSxcbiAgb25GaWx0ZXJlZDogT25Cb3RzRmlsdGVyZWQgfCB1bmRlZmluZWQsXG4gIGxvZzogTG9nZ2VyLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHByb3RvID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlIGFzIFBhdGNoZWRYSFJQcm90b3R5cGU7XG4gIGlmIChwcm90by5fX3NuaWZmaWVzQm90QmxvY2tQYXRjaGVkKSB7XG4gICAgbG9nKFwiWEhSIGZpbHRlciBub3QgaW5zdGFsbGVkIChhbHJlYWR5IHBhdGNoZWQpXCIpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5hdGl2ZU9wZW4gPSBwcm90by5vcGVuO1xuICBjb25zdCBuYXRpdmVTZW5kID0gcHJvdG8uc2VuZDtcbiAgY29uc3QgcmVzcG9uc2VUZXh0RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIFwicmVzcG9uc2VUZXh0XCIpO1xuICBjb25zdCByZXNwb25zZURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBcInJlc3BvbnNlXCIpO1xuICBpZiAoIXJlc3BvbnNlVGV4dERlc2NyaXB0b3I/LmdldCB8fCAhcmVzcG9uc2VEZXNjcmlwdG9yPy5nZXQpIHtcbiAgICBsb2cud2FybihcIlhIUiBmaWx0ZXIgbm90IGluc3RhbGxlZCAocmVzcG9uc2VUZXh0L3Jlc3BvbnNlIGFyZSBub3QgYWNjZXNzb3IgcHJvcGVydGllcylcIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdG8ub3BlbiA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiBYaHJXaXRoRmlsdGVyS2luZCxcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICB1cmw6IHN0cmluZyB8IFVSTCxcbiAgICAuLi5yZXN0OiB1bmtub3duW11cbiAgKSB7XG4gICAgdGhpcy5fX3NuaWZmaWVzRmlsdGVyS2luZCA9IGNsYXNzaWZ5WGhyVXJsKHVybC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gKG5hdGl2ZU9wZW4gYXMgKC4uLmE6IHVua25vd25bXSkgPT4gdW5rbm93bikuYXBwbHkodGhpcywgW21ldGhvZCwgdXJsLCAuLi5yZXN0XSk7XG4gIH0gYXMgdHlwZW9mIHByb3RvLm9wZW47XG5cbiAgcHJvdG8uc2VuZCA9IGZ1bmN0aW9uICh0aGlzOiBYaHJXaXRoRmlsdGVyS2luZCwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgY29uc3Qga2luZCA9IHRoaXMuX19zbmlmZmllc0ZpbHRlcktpbmQ7XG4gICAgaWYgKGtpbmQpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlIHx8IFwiXCI7XG4gICAgICBpZiAocmVzcG9uc2VUeXBlID09PSBcIlwiIHx8IHJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCIgfHwgcmVzcG9uc2VUeXBlID09PSBcImpzb25cIikge1xuICAgICAgICBsZXQgY2FjaGVkOiB7IHRleHQ6IHN0cmluZzsganNvbjogdW5rbm93biB9IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGNvbXB1dGUgPSAoKTogeyB0ZXh0OiBzdHJpbmc7IGpzb246IHVua25vd24gfSA9PiB7XG4gICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRTdGF0ZSgpO1xuICAgICAgICAgIGNvbnN0IHNob3VsZEZpbHRlciA9IHN0YXRlLmVuYWJsZWQgJiYgc3RhdGUuYmxvY2tlZElkcy5zaXplID4gMDtcbiAgICAgICAgICBsZXQganNvbjogdW5rbm93bjtcbiAgICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gXCJqc29uXCIpIHtcbiAgICAgICAgICAgIGpzb24gPSByZXNwb25zZURlc2NyaXB0b3IuZ2V0IS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gcmVzcG9uc2VUZXh0RGVzY3JpcHRvci5nZXQhLmNhbGwodGhpcykgYXMgc3RyaW5nO1xuICAgICAgICAgICAgLy8gT25seSBwYXJzZSB3aGVuIHdlJ3JlIGFjdHVhbGx5IGdvaW5nIHRvIGZpbHRlciBcdTIwMTQgYW4gdW5maWx0ZXJlZFxuICAgICAgICAgICAgLy8gKGRpc2FibGVkLCBvciBlbXB0eSBibG9ja2xpc3QpIHJlc3BvbnNlIGp1c3QgcGFzc2VzIHRoZSByYXdcbiAgICAgICAgICAgIC8vIHRleHQgdGhyb3VnaCB1bnRvdWNoZWQgYmVsb3cuXG4gICAgICAgICAgICBpZiAoc2hvdWxkRmlsdGVyKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNhY2hlZCA9IHsgdGV4dCwganNvbjogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkRmlsdGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICBqc29uID0gYXBwbHlGaWx0ZXIoa2luZCwganNvbiwgc3RhdGUuYmxvY2tlZElkcywgcmVtb3ZlZCk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZC5zaXplID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkSWRzID0gWy4uLnJlbW92ZWRdO1xuICAgICAgICAgICAgICBsb2cud2FybihgZmlsdGVyZWQgYmxvY2tlZCBhY2NvdW50KHMpIGZyb20gJHtraW5kfSByZXNwb25zZTpgLCBtYXRjaGVkSWRzKTtcbiAgICAgICAgICAgICAgb25GaWx0ZXJlZD8uKG1hdGNoZWRJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSAhPT0gXCJqc29uXCIpIHtcbiAgICAgICAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYWNoZWQgPSB7IHRleHQsIGpzb24gfTtcbiAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9O1xuICAgICAgICBpZiAocmVzcG9uc2VUeXBlICE9PSBcImpzb25cIikge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlc3BvbnNlVGV4dFwiLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6ICgpID0+IGNvbXB1dGUoKS50ZXh0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlc3BvbnNlXCIsIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiAocmVzcG9uc2VUeXBlID09PSBcImpzb25cIiA/IGNvbXB1dGUoKS5qc29uIDogY29tcHV0ZSgpLnRleHQpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGB1bnN1cHBvcnRlZCByZXNwb25zZVR5cGUgXCIke3Jlc3BvbnNlVHlwZX1cIiBmb3IgJHtraW5kfSwgbm90IGZpbHRlcmluZ2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKG5hdGl2ZVNlbmQgYXMgKC4uLmE6IHVua25vd25bXSkgPT4gdW5rbm93bikuYXBwbHkodGhpcywgYXJncyk7XG4gIH0gYXMgdHlwZW9mIHByb3RvLnNlbmQ7XG5cbiAgcHJvdG8uX19zbmlmZmllc0JvdEJsb2NrUGF0Y2hlZCA9IHRydWU7XG4gIGxvZyhcIlhIUiBmaWx0ZXIgaW5zdGFsbGVkXCIpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBXZWJTb2NrZXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBXcmFwcyB0aGUgV2ViU29ja2V0ICppbnN0YW5jZSogcmV0dXJuZWQgYnkgdGhlIGNvbnN0cnVjdG9yIChub3QganVzdCB0aGVcbi8vIGNvbm5lY3QgVVJMLCBsaWtlIGluc3RhbGxVc2VySWRIb29rIGRvZXMpIHNvIGJsb2NrZWQtYWNjb3VudCBmcmFtZXMgbmV2ZXJcbi8vIHJlYWNoIHRoZSBwYWdlJ3Mgb3duIG1lc3NhZ2UgbGlzdGVuZXJzIFx1MjAxNCB2aWEgYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIixcbi8vIC4uLikgb3IgdGhlIG9ubWVzc2FnZSBwcm9wZXJ0eSwgYm90aCBvZiB3aGljaCBTbmlmZmllcyBtYXkgdXNlLlxuXG50eXBlIFBhdGNoZWRXZWJTb2NrZXRDdG9yID0gdHlwZW9mIFdlYlNvY2tldCAmIHsgX19zbmlmZmllc0JvdEJsb2NrUGF0Y2hlZD86IGJvb2xlYW4gfTtcblxuY29uc3QgaXNXc1RhcmdldEhvc3QgPSAodXJsOiBzdHJpbmcgfCBVUkwpOiBib29sZWFuID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCwgdHlwZW9mIGxvY2F0aW9uICE9PSBcInVuZGVmaW5lZFwiID8gbG9jYXRpb24uaHJlZiA6IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHBhcnNlZC5ob3N0ID09PSBXU19IT1NUO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IHBhdGNoU29ja2V0SW5zdGFuY2UgPSAoXG4gIHNvY2tldDogV2ViU29ja2V0LFxuICBnZXRTdGF0ZTogKCkgPT4gQm90QmxvY2tTdGF0ZSxcbiAgb25GaWx0ZXJlZDogT25Cb3RzRmlsdGVyZWQgfCB1bmRlZmluZWQsXG4gIG5hdGl2ZU9uTWVzc2FnZURlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCxcbiAgbG9nOiBMb2dnZXIsXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvdWxkU3VwcHJlc3MgPSAoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCEoZXZlbnQgaW5zdGFuY2VvZiBNZXNzYWdlRXZlbnQpIHx8IHR5cGVvZiBldmVudC5kYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gZ2V0U3RhdGUoKTtcbiAgICBpZiAoIXN0YXRlLmVuYWJsZWQgfHwgc3RhdGUuYmxvY2tlZElkcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZyYW1lID0gcGFyc2VXc0ZyYW1lKGV2ZW50LmRhdGEpO1xuICAgIGlmIChmcmFtZT8uaWQgJiYgc3RhdGUuYmxvY2tlZElkcy5oYXMoZnJhbWUuaWQpKSB7XG4gICAgICBsb2cud2FybihgZmlsdGVyZWQgYmxvY2tlZCBhY2NvdW50IGZyb20gV1MgJHtmcmFtZS5ldmVudE5hbWV9IGZyYW1lOmAsIGZyYW1lLmlkKTtcbiAgICAgIG9uRmlsdGVyZWQ/LihbZnJhbWUuaWRdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gV2ViU29ja2V0J3MgYWRkRXZlbnRMaXN0ZW5lci9yZW1vdmVFdmVudExpc3RlbmVyIG92ZXJsb2FkcyAodW5saWtlIHRoZVxuICAvLyBiYXNlIEV2ZW50VGFyZ2V0IG9uZXMpIGRvbid0IGFjY2VwdCBhIG51bGwgbGlzdGVuZXIgXHUyMDE0IGxvb3NlbiB0aGUgdHlwZVxuICAvLyBoZXJlIHNpbmNlIHdlIGRlbGliZXJhdGVseSBwYXNzIHRocm91Z2ggd2hhdGV2ZXIgdGhlIGNhbGxlciBnYXZlIHVzLFxuICAvLyBudWxsIGluY2x1ZGVkLCByYXRoZXIgdGhhbiBzcGVjaWFsLWNhc2luZyBpdC5cbiAgY29uc3QgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lciA9IHNvY2tldC5hZGRFdmVudExpc3RlbmVyLmJpbmQoc29ja2V0KSBhcyAoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0IHwgbnVsbCxcbiAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICApID0+IHZvaWQ7XG4gIGNvbnN0IG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIgPSBzb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lci5iaW5kKHNvY2tldCkgYXMgKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCB8IG51bGwsXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyxcbiAgKSA9PiB2b2lkO1xuICBjb25zdCB3cmFwcGVkTGlzdGVuZXJzID0gbmV3IFdlYWtNYXA8RXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgRXZlbnRMaXN0ZW5lcj4oKTtcblxuICBjb25zdCB3cmFwID0gKGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0KTogRXZlbnRMaXN0ZW5lciA9PiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB3cmFwcGVkTGlzdGVuZXJzLmdldChsaXN0ZW5lcik7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZSA9IHR5cGVvZiBsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiID8gbGlzdGVuZXIgOiBsaXN0ZW5lci5oYW5kbGVFdmVudC5iaW5kKGxpc3RlbmVyKTtcbiAgICBjb25zdCB3cmFwcGVkOiBFdmVudExpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoc2hvdWxkU3VwcHJlc3MoZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGhhbmRsZShldmVudCk7XG4gICAgfTtcbiAgICB3cmFwcGVkTGlzdGVuZXJzLnNldChsaXN0ZW5lciwgd3JhcHBlZCk7XG4gICAgcmV0dXJuIHdyYXBwZWQ7XG4gIH07XG5cbiAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIgPSAoKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCB8IG51bGwsXG4gICAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyxcbiAgKSA9PiB7XG4gICAgaWYgKHR5cGUgIT09IFwibWVzc2FnZVwiIHx8ICFsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gbmF0aXZlQWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB3cmFwKGxpc3RlbmVyKSwgb3B0aW9ucyk7XG4gIH0pIGFzIHR5cGVvZiBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcjtcblxuICBzb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciA9ICgoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0IHwgbnVsbCxcbiAgICBvcHRpb25zPzogYm9vbGVhbiB8IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICApID0+IHtcbiAgICBpZiAodHlwZSAhPT0gXCJtZXNzYWdlXCIgfHwgIWxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHdyYXBwZWRMaXN0ZW5lcnMuZ2V0KGxpc3RlbmVyKSA/PyBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gIH0pIGFzIHR5cGVvZiBzb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcjtcblxuICBpZiAobmF0aXZlT25NZXNzYWdlRGVzY3JpcHRvcj8uZ2V0ICYmIG5hdGl2ZU9uTWVzc2FnZURlc2NyaXB0b3Iuc2V0KSB7XG4gICAgbGV0IGN1cnJlbnRIYW5kbGVyOiAoKHRoaXM6IFdlYlNvY2tldCwgZXY6IE1lc3NhZ2VFdmVudCkgPT4gdW5rbm93bikgfCBudWxsID0gbnVsbDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc29ja2V0LCBcIm9ubWVzc2FnZVwiLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiAoKSA9PiBjdXJyZW50SGFuZGxlcixcbiAgICAgIHNldDogKGhhbmRsZXI6ICgodGhpczogV2ViU29ja2V0LCBldjogTWVzc2FnZUV2ZW50KSA9PiB1bmtub3duKSB8IG51bGwpID0+IHtcbiAgICAgICAgY3VycmVudEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG5hdGl2ZU9uTWVzc2FnZURlc2NyaXB0b3Iuc2V0IS5jYWxsKHNvY2tldCwgaGFuZGxlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5hdGl2ZU9uTWVzc2FnZURlc2NyaXB0b3Iuc2V0IS5jYWxsKFxuICAgICAgICAgIHNvY2tldCxcbiAgICAgICAgICBmdW5jdGlvbiAodGhpczogV2ViU29ja2V0LCBldmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkU3VwcHJlc3MoZXZlbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGluc3RhbGxXZWJTb2NrZXRGaWx0ZXIgPSAoXG4gIGdldFN0YXRlOiAoKSA9PiBCb3RCbG9ja1N0YXRlLFxuICBvbkZpbHRlcmVkOiBPbkJvdHNGaWx0ZXJlZCB8IHVuZGVmaW5lZCxcbiAgbG9nOiBMb2dnZXIsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgTmF0aXZlV2ViU29ja2V0ID0gKHR5cGVvZiBXZWJTb2NrZXQgIT09IFwidW5kZWZpbmVkXCIgPyBXZWJTb2NrZXQgOiB1bmRlZmluZWQpIGFzXG4gICAgfCBQYXRjaGVkV2ViU29ja2V0Q3RvclxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAoIU5hdGl2ZVdlYlNvY2tldCB8fCBOYXRpdmVXZWJTb2NrZXQuX19zbmlmZmllc0JvdEJsb2NrUGF0Y2hlZCkge1xuICAgIGxvZyhcIldlYlNvY2tldCBmaWx0ZXIgbm90IGluc3RhbGxlZCAobm8gV2ViU29ja2V0IG9yIGFscmVhZHkgcGF0Y2hlZClcIik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbmF0aXZlT25NZXNzYWdlRGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgTmF0aXZlV2ViU29ja2V0LnByb3RvdHlwZSxcbiAgICBcIm9ubWVzc2FnZVwiLFxuICApO1xuXG4gIGNvbnN0IFBhdGNoZWRXZWJTb2NrZXQgPSBmdW5jdGlvbiAoXG4gICAgdGhpczogV2ViU29ja2V0LFxuICAgIHVybDogc3RyaW5nIHwgVVJMLFxuICAgIHByb3RvY29scz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICApOiBXZWJTb2NrZXQge1xuICAgIGNvbnN0IHNvY2tldCA9XG4gICAgICBwcm90b2NvbHMgPT09IHVuZGVmaW5lZCA/IG5ldyBOYXRpdmVXZWJTb2NrZXQodXJsKSA6IG5ldyBOYXRpdmVXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMpO1xuICAgIGlmIChpc1dzVGFyZ2V0SG9zdCh1cmwpKSB7XG4gICAgICBwYXRjaFNvY2tldEluc3RhbmNlKHNvY2tldCwgZ2V0U3RhdGUsIG9uRmlsdGVyZWQsIG5hdGl2ZU9uTWVzc2FnZURlc2NyaXB0b3IsIGxvZyk7XG4gICAgfVxuICAgIHJldHVybiBzb2NrZXQ7XG4gIH0gYXMgdW5rbm93biBhcyBQYXRjaGVkV2ViU29ja2V0Q3RvcjtcblxuICAvLyBUT0RPOiBJIGhhdGUgdGhpc1xuICBQYXRjaGVkV2ViU29ja2V0LnByb3RvdHlwZSA9IE5hdGl2ZVdlYlNvY2tldC5wcm90b3R5cGU7XG4gIChQYXRjaGVkV2ViU29ja2V0IGFzIHVua25vd24gYXMgeyBDT05ORUNUSU5HOiBudW1iZXIgfSkuQ09OTkVDVElORyA9IE5hdGl2ZVdlYlNvY2tldC5DT05ORUNUSU5HO1xuICAoUGF0Y2hlZFdlYlNvY2tldCBhcyB1bmtub3duIGFzIHsgT1BFTjogbnVtYmVyIH0pLk9QRU4gPSBOYXRpdmVXZWJTb2NrZXQuT1BFTjtcbiAgKFBhdGNoZWRXZWJTb2NrZXQgYXMgdW5rbm93biBhcyB7IENMT1NJTkc6IG51bWJlciB9KS5DTE9TSU5HID0gTmF0aXZlV2ViU29ja2V0LkNMT1NJTkc7XG4gIChQYXRjaGVkV2ViU29ja2V0IGFzIHVua25vd24gYXMgeyBDTE9TRUQ6IG51bWJlciB9KS5DTE9TRUQgPSBOYXRpdmVXZWJTb2NrZXQuQ0xPU0VEO1xuICBQYXRjaGVkV2ViU29ja2V0Ll9fc25pZmZpZXNCb3RCbG9ja1BhdGNoZWQgPSB0cnVlO1xuXG4gIHdpbmRvdy5XZWJTb2NrZXQgPSBQYXRjaGVkV2ViU29ja2V0O1xuICBsb2coXCJXZWJTb2NrZXQgZmlsdGVyIGluc3RhbGxlZFwiKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJvdEJsb2NrSG9va1Jlc3VsdCB7XG4gIHhockluc3RhbGxlZDogYm9vbGVhbjtcbiAgd3NJbnN0YWxsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYm90aCBmaWx0ZXJzIChYSFIgKyBXZWJTb2NrZXQpLiBTYWZlIHRvIGNhbGwgb25jZSBwZXIgcGFnZSBsb2FkO1xuICogZWFjaCBoYWxmIG5vLW9wcyBpZiBhbHJlYWR5IHBhdGNoZWQuXG4gKlxuICogQHBhcmFtIGdldFN0YXRlIC0gQ2FsbGVkIG9uIGV2ZXJ5IGludGVyY2VwdGVkIHJlc3BvbnNlL2ZyYW1lLCBzbyB0aGVcbiAqICAgICAgICAgICAgICAgICAgICBibG9ja2xpc3QgYW5kIGVuYWJsZWQgZmxhZyBjYW4gYmUgdXBkYXRlZCBsaXZlIGFmdGVyXG4gKiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCAobWlycm9ycyBpbnN0YWxsR2VvSG9vaydzIGdldE92ZXJyaWRlIHBhdHRlcm4pLlxuICogICAgICAgICAgICAgICAgICAgIFRoaXMgaG9vayBydW5zIGF0IGRvY3VtZW50X3N0YXJ0LCBiZWZvcmUgdGhlIGlzb2xhdGVkXG4gKiAgICAgICAgICAgICAgICAgICAgd29ybGQgaGFzIHJlYWQgY2hyb21lLnN0b3JhZ2UgYW5kIHJlbGF5ZWQgdGhlIGJsb2NrbGlzdFxuICogICAgICAgICAgICAgICAgICAgIG92ZXIgXHUyMDE0IHVudGlsIHRoZSBmaXJzdCByZWxheSBtZXNzYWdlIGFycml2ZXMsIGdldFN0YXRlKClcbiAqICAgICAgICAgICAgICAgICAgICBzaG91bGQgcmV0dXJuIGBlbmFibGVkOiBmYWxzZWAgc28gZWFybHkgcmVzcG9uc2VzIHBhc3NcbiAqICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIHVuZmlsdGVyZWQgcmF0aGVyIHRoYW4gcmFjaW5nIHRoZSByZWxheS5cbiAqIEBwYXJhbSBvbkZpbHRlcmVkIC0gT3B0aW9uYWwuIENhbGxlZCB3aXRoIHRoZSBkaXN0aW5jdCBibG9ja2VkIGlkcyByZW1vdmVkXG4gKiAgICAgICAgICAgICAgICAgICAgICBmcm9tIGEgc2luZ2xlIHJlc3BvbnNlL2ZyYW1lLCBlYWNoIHRpbWUgZmlsdGVyaW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxseSBoYXBwZW5zLiBGaXJlcyBhbG9uZ3NpZGUgKG5vdCBpbnN0ZWFkIG9mKSB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuIGRpYWdub3N0aWMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsQm90QmxvY2tIb29rID0gKFxuICBnZXRTdGF0ZTogKCkgPT4gQm90QmxvY2tTdGF0ZSxcbiAgb25GaWx0ZXJlZD86IE9uQm90c0ZpbHRlcmVkLFxuKTogQm90QmxvY2tIb29rUmVzdWx0ID0+IHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwiYm90LWJsb2NrXCIpO1xuICByZXR1cm4ge1xuICAgIHhockluc3RhbGxlZDogaW5zdGFsbFhockZpbHRlcihnZXRTdGF0ZSwgb25GaWx0ZXJlZCwgbG9nKSxcbiAgICB3c0luc3RhbGxlZDogaW5zdGFsbFdlYlNvY2tldEZpbHRlcihnZXRTdGF0ZSwgb25GaWx0ZXJlZCwgbG9nKSxcbiAgfTtcbn07XG4iLCAiLy8gQSBkYXktYnVja2V0ZWQgbG9nIG9mIHdoaWNoIGFjY291bnRzIHRoZSBib3QtYmxvY2sgaG9vayBoYXMgYWN0dWFsbHlcbi8vIGZpbHRlcmVkLCB1c2VkIHRvIHJlcG9ydCBcIk4gYm90cyBibG9ja2VkIGluIHRoZSBsYXN0IDI0IGhvdXJzXCIgaW4gdGhlXG4vLyBwb3B1cC4gVGhpcyBpcyBhIHJvdWdoIHByb3h5IGZvciBhIHRydWUgcm9sbGluZyAyNGggd2luZG93LCBub3QgYW4gZXhhY3Rcbi8vIG9uZTogYSBkYXkgYnVja2V0IHVzZXMgdGhlIFVUQyBjYWxlbmRhciBkYXkgKGRldGVybWluaXN0aWMsIG5vIERTVC9sb2NhbGVcbi8vIGVkZ2UgY2FzZXMpLCBhbmQgXCJsYXN0IDI0IGhvdXJzXCIgaXMgYXBwcm94aW1hdGVkIGFzIHRoZSB1bmlvbiBvZiB0b2RheSdzXG4vLyBhbmQgeWVzdGVyZGF5J3MgYnVja2V0cyByYXRoZXIgdGhhbiBhIHByZWNpc2UgdGltZXN0YW1wIGN1dG9mZi5cblxuZXhwb3J0IGludGVyZmFjZSBCbG9ja2VkQm90RGFpbHlMb2cge1xuICBbZGF0ZUtleTogc3RyaW5nXTogc3RyaW5nW107XG59XG5cbmNvbnN0IGRhdGVLZXlGb3IgPSAoZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiBkYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuXG5jb25zdCB5ZXN0ZXJkYXlPZiA9IChkYXRlOiBEYXRlKTogRGF0ZSA9PiBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSAtIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuXG4vKipcbiAqIE1lcmdlcyBuZXdseS1maWx0ZXJlZCBpZHMgaW50byB0b2RheSdzIGJ1Y2tldCBhbmQgZHJvcHMgZXZlcnkgYnVja2V0XG4gKiBleGNlcHQgdG9kYXkgYW5kIHllc3RlcmRheSwgc28gdGhlIGxvZyBjYW4ndCBncm93IHVuYm91bmRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlY29yZEJsb2NrZWRCb3RJZHMgPSAoXG4gIGxvZzogQmxvY2tlZEJvdERhaWx5TG9nLFxuICBpZHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBub3c6IERhdGUgPSBuZXcgRGF0ZSgpLFxuKTogQmxvY2tlZEJvdERhaWx5TG9nID0+IHtcbiAgaWYgKGlkcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbG9nO1xuICB9XG4gIGNvbnN0IHRvZGF5S2V5ID0gZGF0ZUtleUZvcihub3cpO1xuICBjb25zdCB5ZXN0ZXJkYXlLZXkgPSBkYXRlS2V5Rm9yKHllc3RlcmRheU9mKG5vdykpO1xuICBjb25zdCB0b2RheSA9IG5ldyBTZXQoWy4uLihsb2dbdG9kYXlLZXldID8/IFtdKSwgLi4uaWRzXSk7XG4gIGNvbnN0IG5leHQ6IEJsb2NrZWRCb3REYWlseUxvZyA9IHsgW3RvZGF5S2V5XTogWy4uLnRvZGF5XSB9O1xuICBpZiAobG9nW3llc3RlcmRheUtleV0pIHtcbiAgICBuZXh0W3llc3RlcmRheUtleV0gPSBsb2dbeWVzdGVyZGF5S2V5XTtcbiAgfVxuICByZXR1cm4gbmV4dDtcbn07XG5cbi8qKiBEaXN0aW5jdCBhY2NvdW50cyBmaWx0ZXJlZCBhY3Jvc3MgdG9kYXkncyBhbmQgeWVzdGVyZGF5J3MgYnVja2V0cy4gKi9cbmV4cG9ydCBjb25zdCBjb3VudERpc3RpbmN0QmxvY2tlZEJvdHNMYXN0MjRoID0gKFxuICBsb2c6IEJsb2NrZWRCb3REYWlseUxvZyxcbiAgbm93OiBEYXRlID0gbmV3IERhdGUoKSxcbik6IG51bWJlciA9PiB7XG4gIGNvbnN0IHRvZGF5S2V5ID0gZGF0ZUtleUZvcihub3cpO1xuICBjb25zdCB5ZXN0ZXJkYXlLZXkgPSBkYXRlS2V5Rm9yKHllc3RlcmRheU9mKG5vdykpO1xuICBjb25zdCB1bmlvbiA9IG5ldyBTZXQoWy4uLihsb2dbdG9kYXlLZXldID8/IFtdKSwgLi4uKGxvZ1t5ZXN0ZXJkYXlLZXldID8/IFtdKV0pO1xuICByZXR1cm4gdW5pb24uc2l6ZTtcbn07XG4iLCAiLy8gRXZlcnkgcmVhbC1zbmlmZmllcy5jb20gRE9NIHNlbGVjdG9yIG91ciBjb2RlIGRlcGVuZHMgb24sIGNlbnRyYWxpemVkIGhlcmVcbi8vIGluc3RlYWQgb2YgZHVwbGljYXRlZCBhcyBzdHJpbmcgbGl0ZXJhbHMgYWNyb3NzIGNsaWVudC8sIHVzZXJzY3JpcHQvLCBhbmRcbi8vIGJvb2ttYXJrbGV0LyAod2hpY2ggaXMgd2hhdCBjYXVzZWQgdGhlIEZBQiBtb3VudCBzZWxlY3RvciB0byBleGlzdCBhcyB0d29cbi8vIGluZGVwZW5kZW50IGNvcGllcyBiZWZvcmUgdGhpcyBmaWxlKS4gVGhlc2UgYXJlIHJldmVyc2UtZW5naW5lZXJlZCBhbmQgY2FuXG4vLyBjaGFuZ2Ugd2l0aG91dCBub3RpY2UgXHUyMDE0IHNlZSBjb3JlL3NyYy9ib3QtYmxvY2staG9vay50cydzIGhlYWRlciBmb3IgYSBjYXNlXG4vLyB3aGVyZSB0aGF0IGFscmVhZHkgaGFwcGVuZWQgdG8gYW4gQVBJIGhvc3QuXG4vL1xuLy8gU05JRkZJRVNfU0VMRUNUT1JTIGJlbG93IGlzIHRoZSBhY3R1YWwgc291cmNlIG9mIHRydXRoOyB0aGUgaW5kaXZpZHVhbFxuLy8gbmFtZWQgY29uc3RzIGFyZSBkZXN0cnVjdHVyZWQgZnJvbSBpdCBwdXJlbHkgc28gZXhpc3RpbmcgY2FsbCBzaXRlcyBjYW5cbi8vIGtlZXAgaW1wb3J0aW5nIHRoZW0gYnkgbmFtZS4gZTJlL3NpdGUtY29udHJhY3QudHMgKHRoZSBkcmlmdCBjYW5hcnkpIGtleXNcbi8vIGl0cyBtZXRhZGF0YSBvZmYgYFNuaWZmaWVzU2VsZWN0b3JOYW1lYCAoZGVyaXZlZCBmcm9tIHRoaXMgb2JqZWN0J3Mga2V5cyksXG4vLyBzbyBhZGRpbmcgYSBzZWxlY3RvciBoZXJlIHdpdGhvdXQgYWxzbyBkZXNjcmliaW5nIGl0IHRoZXJlIGlzIGEgdHlwZVxuLy8gZXJyb3IgaW4gc2l0ZS1jb250cmFjdC50cywgbm90IGEgc2lsZW50IGdhcC5cblxuZXhwb3J0IGNvbnN0IFNOSUZGSUVTX1NFTEVDVE9SUyA9IHtcbiAgLyoqXG4gICAqIE1hcmtlciBjb250YWluZXIgY2FycnlpbmcgZGF0YS13aXRoaW4tcmFkaXVzIFx1MjAxNCBwcm9maWxlLWJvcmRlci1ob29rLnRzJ3NcbiAgICogcmVkaXJlY3QgdGFyZ2V0LiBDb25maXJtZWQgbGl2ZSAoMjAyNi0wOS0wMSk6IGEgemVyby1zaXplIHBvc2l0aW9uaW5nXG4gICAqIGFuY2hvciAoMHgwIGJvdW5kaW5nIGJveCwgYHZpc2liaWxpdHk6dmlzaWJsZWApIFx1MjAxNCB0aGUgYWN0dWFsIHBpeGVscyBjb21lXG4gICAqIGZyb20gYW4gYWJzb2x1dGVseS1wb3NpdGlvbmVkIGNoaWxkLiBPbmx5IGV2ZXIgcXVlcmllZCB2aWEgYC5jbG9zZXN0KClgXG4gICAqIG9uIGEgY2xpY2sgYW5kIHJlYWQgZm9yIGl0cyBkYXRhIGF0dHJpYnV0ZXMsIG5ldmVyIGV4cGVjdGVkIHRvIGhhdmUgYVxuICAgKiBsYXlvdXQgYm94IG9mIGl0cyBvd24gXHUyMDE0IHNvIGEgcHJlc2VuY2UgY2hlY2sgKFBsYXl3cmlnaHQncyBgdG9CZUF0dGFjaGVkYClcbiAgICogaXMgY29ycmVjdCBoZXJlLCBub3QgYSB2aXNpYmlsaXR5IGNoZWNrIChgdG9CZVZpc2libGVgLCB3aGljaCByZXF1aXJlcyBhXG4gICAqIG5vbi1lbXB0eSBib3VuZGluZyBib3ggYW5kIHdpbGwgYWx3YXlzIGZhaWwgb24gdGhpcyBlbGVtZW50KS5cbiAgICovXG4gIE1BUktFUl9DT05UQUlORVJfU0VMRUNUT1I6ICdbZGF0YS10ZXN0aWQ9XCJtYXJrZXJVc2VyQ29udGFpbmVyXCJdJyxcbiAgLyoqIE1hcCBtYXJrZXIgYXZhdGFyIGltYWdlIFx1MjAxNCBjbGljayB0YXJnZXQgdGhhdCByZXNvbHZlcyBhIHByb2ZpbGUncyB1c2VyIGlkLiAqL1xuICBNQVJLRVJfQVZBVEFSX1NFTEVDVE9SOiAnW2RhdGEtdGVzdGlkPVwiY3YtbWFya2VyLWF2YXRhci1pbWFnZVwiXScsXG4gIC8qKiBQcm9maWxlIHBhbmVsIHJvb3QsIGhvc3RzIHRoZSBuYW1lIGxhYmVsIGFuZCBwaW4gYnV0dG9uLiAqL1xuICBBUFBfU0NSRUVOX1NFTEVDVE9SOiBcIiNhcHAtc2NyZWVuXCIsXG4gIC8qKiBDcnVpc2VyIG5hbWUgbGFiZWwgaW5zaWRlIHRoZSBvcGVuIHByb2ZpbGUgcGFuZWwuICovXG4gIE5BTUVfTEFCRUxfU0VMRUNUT1I6ICdbZGF0YS10ZXN0aWQ9XCJjcnVpc2VyTmFtZUxhYmVsXCJdJyxcbiAgLyoqIFBpbi11c2VyIGJ1dHRvbiBcdTIwMTQgdGhlIHJlcG9ydCBidXR0b24gaXMgYW5jaG9yZWQgdG8gaXRzIHBhcmVudC4gKi9cbiAgUElOX0JVVFRPTl9TRUxFQ1RPUjogJ1tkYXRhLXRlc3RpZD1cInBpblVzZXJCdXR0b25cIl0nLFxuICAvKiogU2lkZWJhciBuYXYgbGluayB1c2VkIGFzIHRoZSBGQUIncyBtb3VudCBhbmNob3IgKHVzZXJzY3JpcHQvYm9va21hcmtsZXQgb25seSkuICovXG4gIFNJVEVMSU5LU19OQVZfU0VMRUNUT1I6ICdbdGl0bGU9XCJTaXRlbGlua3NcIl0nLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU25pZmZpZXNTZWxlY3Rvck5hbWUgPSBrZXlvZiB0eXBlb2YgU05JRkZJRVNfU0VMRUNUT1JTO1xuXG5leHBvcnQgY29uc3Qge1xuICBNQVJLRVJfQ09OVEFJTkVSX1NFTEVDVE9SLFxuICBNQVJLRVJfQVZBVEFSX1NFTEVDVE9SLFxuICBBUFBfU0NSRUVOX1NFTEVDVE9SLFxuICBOQU1FX0xBQkVMX1NFTEVDVE9SLFxuICBQSU5fQlVUVE9OX1NFTEVDVE9SLFxuICBTSVRFTElOS1NfTkFWX1NFTEVDVE9SLFxufSA9IFNOSUZGSUVTX1NFTEVDVE9SUztcbiIsICJpbXBvcnQgdHlwZSB7IFByb2ZpbGVCb3JkZXJPcGVuIH0gZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuL2xvZy5qc1wiO1xuaW1wb3J0IHsgTUFSS0VSX0NPTlRBSU5FUl9TRUxFQ1RPUiB9IGZyb20gXCIuL3NuaWZmaWVzLXNlbGVjdG9ycy5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2ZpbGVCb3JkZXJIb29rUmVzdWx0IHtcbiAgdW5pbnN0YWxsOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGEgY2FwdHVyaW5nIGRvY3VtZW50IGNsaWNrIGxpc3RlbmVyIHRoYXQgb3BlbnMgYSBwcm9maWxlIG1hcmtlcidzXG4gKiBwYWdlIGRpcmVjdGx5IHdoZW4gaXQgZmFsbHMgb3V0c2lkZSB0aGUgdmlld2VyJ3MgYm91bmRhcnkgcmFkaXVzXG4gKiAoZGF0YXNldC53aXRoaW5SYWRpdXMgPT09IFwiZmFsc2VcIiksIGJ5cGFzc2luZyBTbmlmZmllcycgb3duIHBheXdhbGwtZ2F0ZWRcbiAqIGNsaWNrIGhhbmRsaW5nLiBVc2VzIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiBzbyBvdGhlciBjYXB0dXJlLXBoYXNlIGNsaWNrXG4gKiBsaXN0ZW5lcnMgb24gZG9jdW1lbnQgKGUuZy4gZmF2b3JpdGVzIG1hcmtlciBoYW5kbGluZykgZG9uJ3QgYWxzbyBmaXJlIGZvclxuICogdGhlIHNhbWUgY2xpY2suXG4gKlxuICogQHBhcmFtIGdldFNldHRpbmdzIC0gQ2FsbGVkIG9uIGV2ZXJ5IGNsaWNrIHRvIHJlYWQgdGhlIGN1cnJlbnQgZW5hYmxlZC9vcGVuSW5OZXdUYWIgc3RhdGUuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsUHJvZmlsZUJvcmRlclJlZGlyZWN0ID0gKFxuICBnZXRTZXR0aW5nczogKCkgPT4gUHJvZmlsZUJvcmRlck9wZW4sXG4pOiBQcm9maWxlQm9yZGVySG9va1Jlc3VsdCA9PiB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihcInByb2ZpbGUtYm9yZGVyXCIpO1xuXG4gIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oTUFSS0VSX0NPTlRBSU5FUl9TRUxFQ1RPUik7XG4gICAgaWYgKCFjb250YWluZXIgfHwgY29udGFpbmVyLmRhdGFzZXQud2l0aGluUmFkaXVzICE9PSBcImZhbHNlXCIgfHwgIWNvbnRhaW5lci5pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovL3NuaWZmaWVzLmNvbS9wcm9maWxlLyR7Y29udGFpbmVyLmlkfWA7XG4gICAgbG9nKFwicmVkaXJlY3RpbmcgdG8gb3V0LW9mLXJhZGl1cyBwcm9maWxlXCIsIGNvbnRhaW5lci5pZCk7XG4gICAgaWYgKHNldHRpbmdzLm9wZW5Jbk5ld1RhYikge1xuICAgICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmwpO1xuICAgIH1cbiAgfTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlciwgdHJ1ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICB1bmluc3RhbGw6ICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVyLCB0cnVlKSxcbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4vbG9nLmpzXCI7XG5cbmV4cG9ydCB0eXBlIENsaWVudFR5cGUgPSBcImNocm9tZS1jbGllbnRcIiB8IFwidXNlcnNjcmlwdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ0luaXRPcHRpb25zIHtcbiAgc2VydmVyQmFzZTogc3RyaW5nO1xuICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGNsaWVudFR5cGU6IENsaWVudFR5cGU7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCB0ZWxlbWV0cnkgcGluZyBmaXJlZCBvbmNlIHBlciBjbGllbnQgaW5pdCwgc28gdGhlIHNlcnZlciBjYW5cbiAqIHRyYWNrIHdoaWNoIHVzZXIgaWRzIGFyZSBydW5uaW5nIHdoaWNoIGNsaWVudC92ZXJzaW9uIGNvbWJpbmF0aW9ucy5cbiAqIEZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgXHUyMDE0IHRlbGVtZXRyeSBtdXN0IG5ldmVyIGJsb2NrIG9yIGJyZWFrIHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dJbml0ID0gYXN5bmMgKG9wdGlvbnM6IExvZ0luaXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihcImxvZy1pbml0XCIpO1xuICBjb25zdCB7IHNlcnZlckJhc2UsIGNsaWVudFNlY3JldCwgdXNlcklkLCBjbGllbnRUeXBlLCB2ZXJzaW9uIH0gPSBvcHRpb25zO1xuICBpZiAoIXNlcnZlckJhc2UgfHwgIXVzZXJJZCkge1xuICAgIGxvZyhcInNraXBwaW5nLCBtaXNzaW5nIHNlcnZlckJhc2Ugb3IgdXNlcklkXCIsIHsgc2VydmVyQmFzZSwgdXNlcklkIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2coXCJzZW5kaW5nIGluaXQgcGluZ1wiLCB7IHVzZXJJZCwgY2xpZW50VHlwZSwgdmVyc2lvbiB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBiYXNlID0gc2VydmVyQmFzZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2Jhc2V9L2FwaS9sb2dJbml0YCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjbGllbnRTZWNyZXR9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJJZCwgY2xpZW50VHlwZSwgdmVyc2lvbiB9KSxcbiAgICB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBsb2coXCJpbml0IHBpbmcgc2VudFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmVycm9yKFwiaW5pdCBwaW5nIHJlamVjdGVkXCIsIHJlcy5zdGF0dXMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQmVzdC1lZmZvcnQgXHUyMDE0IG5ldHdvcmsvc2VydmVyIGZhaWx1cmVzIGFyZSBub3QgYWN0aW9uYWJsZSBoZXJlLlxuICAgIGxvZy5lcnJvcihcImluaXQgcGluZyBmYWlsZWRcIiwgZXJyKTtcbiAgfVxufTtcbiIsICI8ZGV0YWlscyBjbGFzcz1cInNlY3Rpb24gY29sbGFwc2libGVcIiBpZD1cImdlby1kZXRhaWxzXCI+XG4gIDxzdW1tYXJ5PjxoMj5Mb2NhdGlvbiBTcG9vZmluZzwvaDI+PC9zdW1tYXJ5PlxuICA8ZGl2IGNsYXNzPVwiY29sbGFwc2libGUtYm9keVwiPlxuICAgIDxwIGNsYXNzPVwiaGludFwiPlNwb29mIHRoZSBjb29yZGluYXRlcyBTbmlmZmllcyBzZWVzLjwvcD5cbiAgICA8bGFiZWwgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxpbnB1dCBpZD1cImdlby1lbmFibGVkXCIgdHlwZT1cImNoZWNrYm94XCIgLz5cbiAgICAgIDxzcGFuPkVuYWJsZTwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgaWQ9XCJnZW8tZmllbGRzXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZFwiPlxuICAgICAgICA8c3Bhbj5MYXRpdHVkZTwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGlkPVwiZ2VvLWxhdFwiIHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiYW55XCIgcGxhY2Vob2xkZXI9XCI0Ny42MTQ3N1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICA8L2xhYmVsPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgPHNwYW4+TG9uZ2l0dWRlPC9zcGFuPlxuICAgICAgICA8aW5wdXQgaWQ9XCJnZW8tbG5nXCIgdHlwZT1cIm51bWJlclwiIHN0ZXA9XCJhbnlcIiBwbGFjZWhvbGRlcj1cIi0xMjIuMzI1MjVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxidXR0b24gaWQ9XCJnZW8tZmlsbC1jdXJyZW50XCIgY2xhc3M9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCI+RmlsbCB3aXRoIGN1cnJlbnQ8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJnZW8tc2F2ZVwiIGNsYXNzPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGlkPVwiZ2VvLXN0YXR1c1wiIGNsYXNzPVwiaGludFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2RldGFpbHM+XG4iLCAiLyogU2VjdGlvbiBzaGVsbCBcdTIwMTQgbGlmdGVkIGZyb20gcG9wdXAuY3NzIC5zZWN0aW9uLCBkZXRhaWxzLmNvbGxhcHNpYmxlLCAuY29sbGFwc2libGUtYm9keSAqL1xuXG4jc25wLWdlby1yb290IC5zZWN0aW9uIHtcbiAgYmFja2dyb3VuZDogIzBlMTgyNTtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBwYWRkaW5nOiAxNHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG5cbiNzbnAtZ2VvLXJvb3QgLnNlY3Rpb24gaDIge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBjb2xvcjogIzdhOTBhNDtcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHtcbiAgcGFkZGluZzogMDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbiNzbnAtZ2VvLXJvb3QgZGV0YWlscy5jb2xsYXBzaWJsZSBzdW1tYXJ5IHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAxNHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDZweDtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbiNzbnAtZ2VvLXJvb3QgZGV0YWlscy5jb2xsYXBzaWJsZSBzdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnk6OmFmdGVyIHtcbiAgY29udGVudDogXCJcdTIwM0FcIjtcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cztcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlW29wZW5dIHN1bW1hcnk6OmFmdGVyIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnkgaDIge1xuICBtYXJnaW46IDA7XG59XG5cbiNzbnAtZ2VvLXJvb3QgLmNvbGxhcHNpYmxlLWJvZHkge1xuICBwYWRkaW5nOiAwIDE0cHggMTRweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxMHB4O1xufVxuXG4vKiBGb3JtIGZpZWxkcyBcdTIwMTQgbGlmdGVkIGZyb20gcG9wdXAuY3NzIC5yb3csIC5oaW50LCAuZmllbGQsIGJ1dHRvbi5wcmltYXJ5L3NlY29uZGFyeSwgLmFjdGlvbnMgKi9cblxuI3NucC1nZW8tcm9vdCAucm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogI2ZmZmZmZjtcbn1cblxuI3NucC1nZW8tcm9vdCAucm93IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIGFjY2VudC1jb2xvcjogI2ZmNTUwMDtcbiAgd2lkdGg6IDE0cHg7XG4gIGhlaWdodDogMTRweDtcbn1cblxuI3NucC1nZW8tcm9vdCAuaGludCB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6ICM3YTkwYTQ7XG4gIG1hcmdpbjogMDtcbn1cblxuI3NucC1nZW8tcm9vdCBidXR0b24ucHJpbWFyeSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgcGFkZGluZzogN3B4IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogI2ZmNTUwMDtcbiAgY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cztcbn1cblxuI3NucC1nZW8tcm9vdCBidXR0b24ucHJpbWFyeTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQ6ICNlMDRhMDA7XG59XG5cbiNzbnAtZ2VvLXJvb3QgYnV0dG9uLnByaW1hcnk6ZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kOiAjMWMyYjNhO1xuICBjb2xvcjogIzdhOTBhNDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuI3NucC1nZW8tcm9vdCBidXR0b24uc2Vjb25kYXJ5IHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBwYWRkaW5nOiA3cHggMTZweDtcbiAgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246XG4gICAgYm9yZGVyLWNvbG9yIDAuMTVzLFxuICAgIGNvbG9yIDAuMTVzO1xufVxuXG4jc25wLWdlby1yb290IGJ1dHRvbi5zZWNvbmRhcnk6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICBib3JkZXItY29sb3I6ICM3YTkwYTQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxuXG4jc25wLWdlby1yb290IGJ1dHRvbi5zZWNvbmRhcnk6ZGlzYWJsZWQge1xuICBjb2xvcjogIzFjMmIzYTtcbiAgYm9yZGVyLWNvbG9yOiAjMWMyYjNhO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4jc25wLWdlby1yb290IC5maWVsZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiAjN2E5MGE0O1xufVxuXG4jc25wLWdlby1yb290IC5maWVsZCBpbnB1dCB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZzogN3B4IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYmFja2dyb3VuZDogIzA4MGUxODtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cztcbn1cblxuI3NucC1nZW8tcm9vdCAuZmllbGQgaW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6ICMzYTRmNjI7XG59XG5cbiNzbnAtZ2VvLXJvb3QgLmZpZWxkIGlucHV0OmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjZmY1NTAwO1xufVxuXG4jc25wLWdlby1yb290IC5hY3Rpb25zIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA4cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbiNzbnAtZ2VvLXJvb3QgI2dlby1maWVsZHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG4iLCAiaW1wb3J0IEdFT19PVkVSUklERV9IVE1MIGZyb20gXCIuL2dlby1vdmVycmlkZS5odG1sXCI7XG5pbXBvcnQgR0VPX09WRVJSSURFX0NTUyBmcm9tIFwiLi9nZW8tb3ZlcnJpZGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IEdlb092ZXJyaWRlIH0gZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgR2VvT3ZlcnJpZGVGb3JtQ29udHJhY3QgfSBmcm9tIFwiLi9nZW8tb3ZlcnJpZGUtZm9ybS1jb250cmFjdC5qc1wiO1xuXG5leHBvcnQgeyBHRU9fT1ZFUlJJREVfSFRNTCwgR0VPX09WRVJSSURFX0NTUyB9O1xuZXhwb3J0IHR5cGUgeyBHZW9PdmVycmlkZUZvcm1Db250cmFjdCB9O1xuXG5leHBvcnQgY29uc3Qgd2lyZUdlb092ZXJyaWRlRm9ybSA9IChjb250YWluZXI6IEVsZW1lbnQsIG9wdGlvbnM6IEdlb092ZXJyaWRlRm9ybUNvbnRyYWN0KTogdm9pZCA9PiB7XG4gIGNvbnN0IGVsID0gPFQgZXh0ZW5kcyBFbGVtZW50PihpZDogc3RyaW5nKTogVCA9PiBjb250YWluZXIucXVlcnlTZWxlY3RvcjxUPihgIyR7aWR9YCkgYXMgVDtcblxuICBjb25zdCBkZXRhaWxzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTERldGFpbHNFbGVtZW50PihcIiNnZW8tZGV0YWlsc1wiKTtcbiAgY29uc3QgZ2VvRW5hYmxlZCA9IGVsPEhUTUxJbnB1dEVsZW1lbnQ+KFwiZ2VvLWVuYWJsZWRcIik7XG4gIGNvbnN0IGdlb0ZpZWxkcyA9IGVsPEhUTUxFbGVtZW50PihcImdlby1maWVsZHNcIik7XG4gIGNvbnN0IGdlb0xhdCA9IGVsPEhUTUxJbnB1dEVsZW1lbnQ+KFwiZ2VvLWxhdFwiKTtcbiAgY29uc3QgZ2VvTG5nID0gZWw8SFRNTElucHV0RWxlbWVudD4oXCJnZW8tbG5nXCIpO1xuICBjb25zdCBmaWxsQ3VycmVudCA9IGVsPEhUTUxCdXR0b25FbGVtZW50PihcImdlby1maWxsLWN1cnJlbnRcIik7XG4gIGNvbnN0IHNhdmVCdG4gPSBlbDxIVE1MQnV0dG9uRWxlbWVudD4oXCJnZW8tc2F2ZVwiKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBlbDxIVE1MRWxlbWVudD4oXCJnZW8tc3RhdHVzXCIpO1xuXG4gIC8vIFdpcmUgY29sbGFwc2libGVcbiAgaWYgKGRldGFpbHMpIHtcbiAgICBkZXRhaWxzLm9wZW4gPSBvcHRpb25zLmluaXRpYWxPcGVuO1xuICAgIGRldGFpbHMuYWRkRXZlbnRMaXN0ZW5lcihcInRvZ2dsZVwiLCAoKSA9PiBvcHRpb25zLm9uVG9nZ2xlKGRldGFpbHMub3BlbikpO1xuICB9XG5cbiAgY29uc3Qgc2V0U3RhdHVzID0gKHRleHQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfTtcblxuICBjb25zdCByZWFkRm9ybSA9ICgpOiBHZW9PdmVycmlkZSA9PiAoe1xuICAgIGVuYWJsZWQ6IGdlb0VuYWJsZWQuY2hlY2tlZCxcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChnZW9MYXQudmFsdWUpIHx8IDAsXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGdlb0xuZy52YWx1ZSkgfHwgMCxcbiAgfSk7XG5cbiAgLy8gVHJhY2tzIHRoZSBpbi1mbGlnaHQgZ2V0TmF0aXZlUG9zaXRpb24gY2FsbCB0cmlnZ2VyZWQgYnkgZGlzYWJsaW5nLiBBIG5ld1xuICAvLyBvYmplY3QgaXMgY3JlYXRlZCBlYWNoIHRpbWU7IG1hcmtpbmcgaXQgYWJvcnRlZCBwcmV2ZW50cyBzdGFsZSBjYWxsYmFja3NcbiAgLy8gZnJvbSBtdXRhdGluZyBzdGF0ZSBhZnRlciB0aGUgdXNlciBoYXMgcmUtZW5hYmxlZCBzcG9vZmluZy5cbiAgbGV0IHBlbmRpbmdGZXRjaDogeyBhYm9ydGVkOiBib29sZWFuIH0gfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBmaWxsV2l0aEN1cnJlbnRQb3NpdGlvbiA9IChvblN1Y2Nlc3M6ICgpID0+IHZvaWQsIG9uRXJyb3I/OiAoKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSB7IGFib3J0ZWQ6IGZhbHNlIH07XG4gICAgcGVuZGluZ0ZldGNoID0gdG9rZW47XG4gICAgc2V0U3RhdHVzKFwiR2V0dGluZyBsb2NhdGlvblx1MjAyNlwiKTtcbiAgICBvcHRpb25zLmdldE5hdGl2ZVBvc2l0aW9uKFxuICAgICAgKHBvcykgPT4ge1xuICAgICAgICBpZiAodG9rZW4uYWJvcnRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwZW5kaW5nRmV0Y2ggPSBudWxsO1xuICAgICAgICBnZW9MYXQudmFsdWUgPSBTdHJpbmcocG9zLmNvb3Jkcy5sYXRpdHVkZSk7XG4gICAgICAgIGdlb0xuZy52YWx1ZSA9IFN0cmluZyhwb3MuY29vcmRzLmxvbmdpdHVkZSk7XG4gICAgICAgIHVwZGF0ZVNhdmVWaXNpYmlsaXR5KCk7XG4gICAgICAgIG9uU3VjY2VzcygpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgaWYgKHRva2VuLmFib3J0ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ0ZldGNoID0gbnVsbDtcbiAgICAgICAgc2V0U3RhdHVzKGBDb3VsZCBub3QgZ2V0IGxvY2F0aW9uOiAke2Vyci5tZXNzYWdlfSAoY29kZSAke2Vyci5jb2RlfSlgKTtcbiAgICAgICAgb25FcnJvcj8uKCk7XG4gICAgICB9LFxuICAgICAgeyB0aW1lb3V0OiAxMDAwMCB9LFxuICAgICk7XG4gIH07XG5cbiAgLy8gUG9wdWxhdGUgaW5pdGlhbCB2YWx1ZXNcbiAgY29uc3QgeyBpbml0aWFsIH0gPSBvcHRpb25zO1xuICBsZXQgbGFzdFNhdmVkOiBHZW9PdmVycmlkZSA9IHsgLi4uaW5pdGlhbCB9O1xuXG4gIGNvbnN0IGZvcm1NYXRjaGVzU2F2ZWQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgZm9ybSA9IHJlYWRGb3JtKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGZvcm0uZW5hYmxlZCA9PT0gbGFzdFNhdmVkLmVuYWJsZWQgJiZcbiAgICAgIGZvcm0ubGF0aXR1ZGUgPT09IGxhc3RTYXZlZC5sYXRpdHVkZSAmJlxuICAgICAgZm9ybS5sb25naXR1ZGUgPT09IGxhc3RTYXZlZC5sb25naXR1ZGVcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVNhdmVWaXNpYmlsaXR5ID0gKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGhhc0Nvb3JkcyA9IGdlb0xhdC52YWx1ZS50cmltKCkgIT09IFwiXCIgJiYgZ2VvTG5nLnZhbHVlLnRyaW0oKSAhPT0gXCJcIjtcbiAgICBzYXZlQnRuLnN0eWxlLmRpc3BsYXkgPSBoYXNDb29yZHMgJiYgIWZvcm1NYXRjaGVzU2F2ZWQoKSA/IFwiXCIgOiBcIm5vbmVcIjtcbiAgfTtcblxuICBjb25zdCBjb21taXRTYXZlID0gKCk6IFByb21pc2U8dm9pZD4gPT5cbiAgICBQcm9taXNlLnJlc29sdmUob3B0aW9ucy5vblNhdmUocmVhZEZvcm0oKSkpLnRoZW4oKCkgPT4ge1xuICAgICAgbGFzdFNhdmVkID0gcmVhZEZvcm0oKTtcbiAgICAgIHNldFN0YXR1cyhcIlNhdmVkLlwiKTtcbiAgICAgIHVwZGF0ZVNhdmVWaXNpYmlsaXR5KCk7XG4gICAgfSk7XG4gIGdlb0VuYWJsZWQuY2hlY2tlZCA9IGluaXRpYWwuZW5hYmxlZDtcbiAgZ2VvRmllbGRzLnN0eWxlLmRpc3BsYXkgPSBpbml0aWFsLmVuYWJsZWQgPyBcIlwiIDogXCJub25lXCI7XG4gIGdlb0xhdC52YWx1ZSA9IGluaXRpYWwubGF0aXR1ZGUgIT09IDAgPyBTdHJpbmcoaW5pdGlhbC5sYXRpdHVkZSkgOiBcIlwiO1xuICBnZW9MbmcudmFsdWUgPSBpbml0aWFsLmxvbmdpdHVkZSAhPT0gMCA/IFN0cmluZyhpbml0aWFsLmxvbmdpdHVkZSkgOiBcIlwiO1xuICB1cGRhdGVTYXZlVmlzaWJpbGl0eSgpO1xuXG4gIGdlb0VuYWJsZWQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgZ2VvRmllbGRzLnN0eWxlLmRpc3BsYXkgPSBnZW9FbmFibGVkLmNoZWNrZWQgPyBcIlwiIDogXCJub25lXCI7XG4gICAgdXBkYXRlU2F2ZVZpc2liaWxpdHkoKTtcbiAgICBpZiAoZ2VvRW5hYmxlZC5jaGVja2VkKSB7XG4gICAgICBpZiAocGVuZGluZ0ZldGNoKSB7XG4gICAgICAgIHBlbmRpbmdGZXRjaC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgcGVuZGluZ0ZldGNoID0gbnVsbDtcbiAgICAgICAgc2V0U3RhdHVzKFwiXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQZXJzaXN0IGVuYWJsZWQ6IGZhbHNlIGltbWVkaWF0ZWx5LCBpbmRlcGVuZGVudCBvZiB0aGUgcG9zaXRpb25cbiAgICAgIC8vIGZldGNoIGJlbG93IFx1MjAxNCB0aGF0IGZldGNoIGNhbiB0YWtlIHVwIHRvIDEwcyAob3IgaGFuZyBvbiBhIHN0YWxsZWRcbiAgICAgIC8vIHBlcm1pc3Npb24gcHJvbXB0KSwgYW5kIGNsb3NpbmcgdGhlIHBvcHVwIGJlZm9yZSBpdCByZXNvbHZlcyBtdXN0XG4gICAgICAvLyBub3QgbGVhdmUgdGhlIHByZXZpb3VzIGVuYWJsZWQ6IHRydWUgc3RhdGUgcGVyc2lzdGVkLlxuICAgICAgdm9pZCBjb21taXRTYXZlKCk7XG4gICAgICBmaWxsV2l0aEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgKCkgPT4gdm9pZCBjb21taXRTYXZlKCksXG4gICAgICAgICgpID0+IHZvaWQgY29tbWl0U2F2ZSgpLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmllbGQgb2YgW2dlb0xhdCwgZ2VvTG5nXSkge1xuICAgIGZpZWxkLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB1cGRhdGVTYXZlVmlzaWJpbGl0eSk7XG4gIH1cblxuICBmaWxsQ3VycmVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgIGZpbGxXaXRoQ3VycmVudFBvc2l0aW9uKCgpID0+IHNldFN0YXR1cyhcIlwiKSk7XG4gIH0pO1xuXG4gIHNhdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICB2b2lkIGNvbW1pdFNhdmUoKTtcbiAgfSk7XG59O1xuIiwgIi5zbnAtdmVyc2lvbiB7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgY29sb3I6ICM3YTkwYTQ7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG59XG4iLCAiaW1wb3J0IFZFUlNJT05fQkFER0VfSFRNTCBmcm9tIFwiLi92ZXJzaW9uLWJhZGdlLmh0bWxcIjtcbmltcG9ydCBWRVJTSU9OX0JBREdFX0NTUyBmcm9tIFwiLi92ZXJzaW9uLWJhZGdlLmNzc1wiO1xuXG5leHBvcnQgeyBWRVJTSU9OX0JBREdFX0hUTUwsIFZFUlNJT05fQkFER0VfQ1NTIH07XG5cbi8qKiBSZW5kZXJzIGB2ZXJzaW9uYCBpbnRvIHRoZSBgI3NucC12ZXJzaW9uYCBlbGVtZW50IGluc2lkZSBgY29udGFpbmVyYC4gKi9cbmV4cG9ydCBjb25zdCB3aXJlVmVyc2lvbkJhZGdlID0gKGNvbnRhaW5lcjogRWxlbWVudCwgdmVyc2lvbjogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGNvbnN0IGVsID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiI3NucC12ZXJzaW9uXCIpO1xuICBpZiAoZWwpIHtcbiAgICBlbC50ZXh0Q29udGVudCA9IGB2JHt2ZXJzaW9ufWA7XG4gIH1cbn07XG4iLCAiPGRpdiBpZD1cInNucC1yZXBvcnQtYmFja2Ryb3BcIj5cbiAgPGRpdiBjbGFzcz1cInNucC1yZXBvcnQtbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJzbnAtcmVwb3J0LXRpdGxlXCI+XG4gICAgPGgzIGlkPVwic25wLXJlcG9ydC10aXRsZVwiPlJlcG9ydCBwcm9maWxlPC9oMz5cbiAgICA8cCBjbGFzcz1cImhpbnRcIj5GbGFnIHRoaXMgcHJvZmlsZSBhcyBhIHN1c3BlY3RlZCBib3QgZm9yIG1hbnVhbCByZXZpZXcuPC9wPlxuICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkXCI+XG4gICAgICA8c3Bhbj5NZXNzYWdlIChvcHRpb25hbCk8L3NwYW4+XG4gICAgICA8dGV4dGFyZWFcbiAgICAgICAgaWQ9XCJzbnAtcmVwb3J0LW1lc3NhZ2VcIlxuICAgICAgICByb3dzPVwiM1wiXG4gICAgICAgIG1heGxlbmd0aD1cIjUwMFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiQW55dGhpbmcgdGhhdCB3b3VsZCBoZWxwIHJldmlldyB0aGlzIHJlcG9ydFwiXG4gICAgICA+PC90ZXh0YXJlYT5cbiAgICA8L2xhYmVsPlxuICAgIDxwIGlkPVwic25wLXJlcG9ydC1zdGF0dXNcIiBjbGFzcz1cImhpbnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj48L3A+XG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgIDxidXR0b24gaWQ9XCJzbnAtcmVwb3J0LWNhbmNlbFwiIGNsYXNzPVwic2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBpZD1cInNucC1yZXBvcnQtc3VibWl0XCIgY2xhc3M9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiPlJlcG9ydCBib3Q8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiIsICIvKiBJbmplY3RlZCBkaXJlY3RseSBpbnRvIHRoZSBTbmlmZmllcyBwYWdlIChub3QgYSBwb3B1cC9zZXR0aW5ncyByb290KSwgc29cbiAgIHRoaXMgaXMgc2NvcGVkIHVuZGVyICNzbnAtcmVwb3J0LWJhY2tkcm9wIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gOnJvb3RcbiAgIHZhcmlhYmxlcyB0aGF0IGRvbid0IGV4aXN0IGluIHRoYXQgY29udGV4dCBcdTIwMTQgc2FtZSBhcHByb2FjaCBhc1xuICAgZ2VvLW92ZXJyaWRlLmNzcy4gUGFsZXR0ZSBsaWZ0ZWQgZnJvbSBwb3B1cC5jc3MuICovXG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBpbnNldDogMDtcbiAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgYmFja2dyb3VuZDogcmdiYSg4LCAxNCwgMjQsIDAuNjUpO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZm9udC1mYW1pbHk6XG4gICAgc3lzdGVtLXVpLFxuICAgIC1hcHBsZS1zeXN0ZW0sXG4gICAgXCJTZWdvZSBVSVwiLFxuICAgIHNhbnMtc2VyaWY7XG59XG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIC5zbnAtcmVwb3J0LW1vZGFsIHtcbiAgd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDMycHgpKTtcbiAgYmFja2dyb3VuZDogIzBlMTgyNTtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBwYWRkaW5nOiAxNnB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG4gIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjQpO1xufVxuXG4jc25wLXJlcG9ydC1iYWNrZHJvcCBoMyB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogI2ZmZmZmZjtcbn1cblxuI3NucC1yZXBvcnQtYmFja2Ryb3AgLmhpbnQge1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICBtYXJnaW46IDA7XG59XG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIC5maWVsZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiAjN2E5MGE0O1xufVxuXG4jc25wLXJlcG9ydC1iYWNrZHJvcCAuZmllbGQgdGV4dGFyZWEge1xuICBmb250LXNpemU6IDEzcHg7XG4gIHBhZGRpbmc6IDdweCAxMHB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMxYzJiM2E7XG4gIGJhY2tncm91bmQ6ICMwODBlMTg7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBvdXRsaW5lOiBub25lO1xuICByZXNpemU6IHZlcnRpY2FsO1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzO1xufVxuXG4jc25wLXJlcG9ydC1iYWNrZHJvcCAuZmllbGQgdGV4dGFyZWE6Zm9jdXMge1xuICBib3JkZXItY29sb3I6ICNmZjU1MDA7XG59XG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIC5hY3Rpb25zIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA4cHg7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIGJ1dHRvbi5wcmltYXJ5IHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBwYWRkaW5nOiA3cHggMTZweDtcbiAgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgYm9yZGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiAjZmY1NTAwO1xuICBjb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzO1xufVxuXG4jc25wLXJlcG9ydC1iYWNrZHJvcCBidXR0b24ucHJpbWFyeTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQ6ICNlMDRhMDA7XG59XG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIGJ1dHRvbi5wcmltYXJ5OmRpc2FibGVkIHtcbiAgYmFja2dyb3VuZDogIzFjMmIzYTtcbiAgY29sb3I6ICM3YTkwYTQ7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIGJ1dHRvbi5zZWNvbmRhcnkge1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIHBhZGRpbmc6IDdweCAxNnB4O1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjMWMyYjNhO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6ICM3YTkwYTQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjpcbiAgICBib3JkZXItY29sb3IgMC4xNXMsXG4gICAgY29sb3IgMC4xNXM7XG59XG5cbiNzbnAtcmVwb3J0LWJhY2tkcm9wIGJ1dHRvbi5zZWNvbmRhcnk6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICBib3JkZXItY29sb3I6ICM3YTkwYTQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxuIiwgImltcG9ydCBSRVBPUlRfTU9EQUxfSFRNTCBmcm9tIFwiLi9yZXBvcnQtbW9kYWwuaHRtbFwiO1xuaW1wb3J0IFJFUE9SVF9NT0RBTF9DU1MgZnJvbSBcIi4vcmVwb3J0LW1vZGFsLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXBvcnRGb3JtQ29udHJhY3QgfSBmcm9tIFwiLi9yZXBvcnQtZm9ybS1jb250cmFjdC5qc1wiO1xuXG5leHBvcnQgeyBSRVBPUlRfTU9EQUxfSFRNTCwgUkVQT1JUX01PREFMX0NTUyB9O1xuZXhwb3J0IHR5cGUgeyBSZXBvcnRGb3JtQ29udHJhY3QgfTtcblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRNb2RhbEhhbmRsZSB7XG4gIG9wZW46ICgpID0+IHZvaWQ7XG4gIGNsb3NlOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3Qgd2lyZVJlcG9ydE1vZGFsID0gKFxuICBjb250YWluZXI6IEVsZW1lbnQsXG4gIG9wdGlvbnM6IFJlcG9ydEZvcm1Db250cmFjdCxcbik6IFJlcG9ydE1vZGFsSGFuZGxlID0+IHtcbiAgY29uc3QgZWwgPSA8VCBleHRlbmRzIEVsZW1lbnQ+KGlkOiBzdHJpbmcpOiBUID0+IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPFQ+KGAjJHtpZH1gKSBhcyBUO1xuXG4gIGNvbnN0IGJhY2tkcm9wID0gZWw8SFRNTEVsZW1lbnQ+KFwic25wLXJlcG9ydC1iYWNrZHJvcFwiKTtcbiAgY29uc3QgbWVzc2FnZUZpZWxkID0gZWw8SFRNTFRleHRBcmVhRWxlbWVudD4oXCJzbnAtcmVwb3J0LW1lc3NhZ2VcIik7XG4gIGNvbnN0IHN0YXR1c0VsID0gZWw8SFRNTEVsZW1lbnQ+KFwic25wLXJlcG9ydC1zdGF0dXNcIik7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGVsPEhUTUxCdXR0b25FbGVtZW50PihcInNucC1yZXBvcnQtY2FuY2VsXCIpO1xuICBjb25zdCBzdWJtaXRCdG4gPSBlbDxIVE1MQnV0dG9uRWxlbWVudD4oXCJzbnAtcmVwb3J0LXN1Ym1pdFwiKTtcblxuICAvLyBUaGUgc3R5bGVzaGVldCBkZWZhdWx0cyAjc25wLXJlcG9ydC1iYWNrZHJvcCB0byBkaXNwbGF5Om5vbmUsIGJ1dCB0aGF0XG4gIC8vIHN0eWxlc2hlZXQgaXNuJ3QgZ3VhcmFudGVlZCB0byBiZSBsb2FkZWQgd2hlcmV2ZXIgdGhpcyBjb250YWluZXIgbGl2ZXNcbiAgLy8gKGUuZy4gdGVzdHMgcmVuZGVyIFJFUE9SVF9NT0RBTF9IVE1MIHdpdGhvdXQgUkVQT1JUX01PREFMX0NTUyksIHNvIHNldFxuICAvLyB0aGUgaW5saW5lIHN0YXRlIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBDU1MgZm9yIHRoZSBpbml0aWFsXG4gIC8vIGhpZGRlbiBzdGF0ZS5cbiAgYmFja2Ryb3Auc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gIGNvbnN0IHNldFN0YXR1cyA9ICh0ZXh0OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH07XG5cbiAgLy8gQnVtcGVkIG9uIGV2ZXJ5IG9wZW4oKSBzbyBhIHN1Ym1pdCdzIGFzeW5jIHJlc3VsdCBjYW4gdGVsbCB3aGV0aGVyIHRoZVxuICAvLyBtb2RhbCBoYXMgc2luY2UgYmVlbiByZW9wZW5lZCAoZS5nLiBmb3IgYSBkaWZmZXJlbnQgcHJvZmlsZSkgYW5kLCBpZiBzbyxcbiAgLy8gc2tpcCB1cGRhdGluZyBzdGF0dXMvY2xvc2luZyBcdTIwMTQgdGhpcyBpbnN0YW5jZSBpcyByZXVzZWQgYWNyb3NzIG9wZW5zLlxuICBsZXQgZ2VuZXJhdGlvbiA9IDA7XG5cbiAgY29uc3QgY2xvc2UgPSAoKTogdm9pZCA9PiB7XG4gICAgYmFja2Ryb3Auc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIG1lc3NhZ2VGaWVsZC52YWx1ZSA9IFwiXCI7XG4gICAgc2V0U3RhdHVzKFwiXCIpO1xuICAgIHN1Ym1pdEJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IG9wZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgZ2VuZXJhdGlvbiArPSAxO1xuICAgIGJhY2tkcm9wLnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcbiAgICBzZXRTdGF0dXMoXCJcIik7XG4gICAgc3VibWl0QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgbWVzc2FnZUZpZWxkLmZvY3VzKCk7XG4gIH07XG5cbiAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgb3B0aW9ucy5vbkNhbmNlbD8uKCk7XG4gICAgY2xvc2UoKTtcbiAgfSk7XG5cbiAgYmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IGJhY2tkcm9wKSB7XG4gICAgICBvcHRpb25zLm9uQ2FuY2VsPy4oKTtcbiAgICAgIGNsb3NlKCk7XG4gICAgfVxuICB9KTtcblxuICBzdWJtaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICBjb25zdCBzdWJtaXR0ZWRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjtcbiAgICBzdWJtaXRCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHNldFN0YXR1cyhcIlN1Ym1pdHRpbmdcdTIwMjZcIik7XG4gICAgUHJvbWlzZS5yZXNvbHZlKG9wdGlvbnMub25TdWJtaXQobWVzc2FnZUZpZWxkLnZhbHVlLnRyaW0oKSkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSBzdWJtaXR0ZWRHZW5lcmF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldFN0YXR1cyhcIlJlcG9ydGVkLiBUaGFua3MuXCIpO1xuICAgICAgICBzZXRUaW1lb3V0KGNsb3NlLCAxMjAwKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gc3VibWl0dGVkR2VuZXJhdGlvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRTdGF0dXMoXCJGYWlsZWQgdG8gc3VibWl0IHJlcG9ydC4gVHJ5IGFnYWluLlwiKTtcbiAgICAgICAgc3VibWl0QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgb3BlbiwgY2xvc2UgfTtcbn07XG4iLCAiLy8gU2hhcmVkIHJlcG9ydC1idXR0b24gaW5qZWN0aW9uOiBmaW5kcyB0aGUgY3VycmVudCBwcm9maWxlIHBhbmVsLCBpbmplY3RzIGFcbi8vIFx1RDgzRFx1REVBOSBidXR0b24gbmV4dCB0byB0aGUgcGluIGJ1dHRvbiwgYW5kIHdpcmVzIGl0IHRvIHRoZSByZXBvcnQgbW9kYWwuIFVzZWRcbi8vIGlkZW50aWNhbGx5IGJ5IHRoZSBDaHJvbWUgY2xpZW50IChjbGllbnQvc3JjL2NvbnRlbnQvc25pZmZpZXMtcHJvZmlsZS1pZC50cylcbi8vIGFuZCB0aGUgdXNlcnNjcmlwdCAodXNlcnNjcmlwdC9zcmMvcmVwb3J0LnRzKSBcdTIwMTQgcHJldmlvdXNseSBlYWNoIHBvcnRlZCB0aGlzXG4vLyBtYWNoaW5lcnkgYnkgaGFuZCwgaW5jbHVkaW5nIHRoZSBwYW5lbC1zd2l0Y2ggcmFjZSBoYW5kbGluZyBkb2N1bWVudGVkIGluXG4vLyBUT0RPLm1kIHNlY3Rpb24gNCAoYSBjbGljay10cmlnZ2VyZWQgcGFuZWwgc3dpdGNoIHJhY2VzIFNuaWZmaWVzJyBvd25cbi8vIGNsaWNrIGhhbmRsaW5nLCBhbmQgYSBuby1waG90byBtYXJrZXIgY2FuJ3QgaWRlbnRpZnkgaXRzZWxmIGZyb20gaXRzIGltYWdlXG4vLyBhbG9uZSksIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgZml4IHRoYXQncyBlYXN5IHRvIHNpbGVudGx5IGxvc2UgaW5cbi8vIG9uZSBjb3B5IHdoaWxlIGZpeGluZyB0aGUgb3RoZXIuXG4vL1xuLy8gVGhlIENocm9tZSBjbGllbnQgYWxzbyBkcml2ZXMgaXRzIGZhdm9yaXRlcy1zdGFyIGluamVjdGlvbiBvZmYgdGhlIHNhbWVcbi8vIHBhbmVsLXJlc29sdXRpb24vcmV0cnkgbWFjaGluZXJ5IChpbmRlcGVuZGVudCBvZiBSRVBPUlRJTkdfRU5BQkxFRCwgc2luY2Vcbi8vIGZhdm9yaXRlcyBpcyBhIHNlcGFyYXRlIGZsYWcpIFx1MjAxNCBgb25Qcm9maWxlUmVzb2x2ZWRgIGFuZCBgb25NYXJrZXJDbGlja2Bcbi8vIGV4aXN0IGZvciB0aGF0IG9uZSByZWFsIGRpZmZlcmVuY2UsIG5vdCBzcGVjdWxhdGl2ZSBleHRlbnNpYmlsaXR5LlxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi9sb2cuanNcIjtcbmltcG9ydCB7IFJFUE9SVF9NT0RBTF9IVE1MLCBSRVBPUlRfTU9EQUxfQ1NTLCB3aXJlUmVwb3J0TW9kYWwsIHR5cGUgUmVwb3J0TW9kYWxIYW5kbGUgfSBmcm9tIFwiLi9yZXBvcnQtdWkuanNcIjtcbmltcG9ydCB7XG4gIE1BUktFUl9BVkFUQVJfU0VMRUNUT1IgYXMgTUFSS0VSX1NFTEVDVE9SLFxuICBBUFBfU0NSRUVOX1NFTEVDVE9SLFxuICBOQU1FX0xBQkVMX1NFTEVDVE9SLFxuICBQSU5fQlVUVE9OX1NFTEVDVE9SLFxufSBmcm9tIFwiLi9zbmlmZmllcy1zZWxlY3RvcnMuanNcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwicmVwb3J0LWJ1dHRvblwiKTtcbmNvbnN0IFJFUE9SVF9JTkpFQ1RFRF9BVFRSID0gXCJkYXRhLXNuaWZmaWVzLXJlcG9ydC1pbmplY3Rpb25cIjtcbmNvbnN0IFJFUE9SVF9NT0RBTF9ST09UX0lEID0gXCJzbnAtcmVwb3J0LXJvb3RcIjtcblxuY29uc3QgQ0xJQ0tfUkVJTkpFQ1RfUkVUUllfV0lORE9XX01TID0gMTAwMDtcbmNvbnN0IENMSUNLX1JFSU5KRUNUX1JFVFJZX0lOVEVSVkFMX01TID0gMTAwO1xuXG5jb25zdCBJTklUSUFMX0xPQURfUkVJTkpFQ1RfUkVUUllfV0lORE9XX01TID0gMzAwMDtcbmNvbnN0IElOSVRJQUxfTE9BRF9SRUlOSkVDVF9SRVRSWV9JTlRFUlZBTF9NUyA9IDMwMDtcblxuZXhwb3J0IGludGVyZmFjZSBNYXJrZXJTZWxlY3Rpb24ge1xuICB1c2VySWQ6IHN0cmluZztcbiAgcHJvZmlsZVBpY1VybDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRCdXR0b25JbmplY3Rpb25PcHRpb25zIHtcbiAgc2VydmVyQmFzZTogc3RyaW5nO1xuICBnZXRBdXRoSGVhZGVyczogKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVwb3J0aW5nRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSBjdXJyZW50IHVzZXIncyBvd24gU25pZmZpZXMgaWQuIEVtcHR5IG1lYW5zIFwibm90IG9ic2VydmVkIHlldFwiLiAqL1xuICBnZXRSZXBvcnRlclVzZXJJZDogKCkgPT4gc3RyaW5nO1xuICAvKipcbiAgICogRmlyZWQgZXZlcnkgdGltZSB0aGUgY3VycmVudCBwcm9maWxlIHBhbmVsIGlzIChyZS0pcmVzb2x2ZWQgKGEgbWFya2VyXG4gICAqIGNsaWNrLCBhIGRlZXAtbGluayBsb2FkLCBvciB0aGUgTXV0YXRpb25PYnNlcnZlciBjYXRjaGluZyB1cCkgd2l0aCB0aGVcbiAgICogc2NyZWVuIGVsZW1lbnQgYW5kIHRoZSByZXNvbHZlZCB1c2VyIGlkLCBqdXN0IGJlZm9yZSB0aGUgcmVwb3J0IGJ1dHRvblxuICAgKiBpcyAocmUpaW5zZXJ0ZWQuIExldHMgYSBjb25zdW1lciBpbmplY3QgYWRkaXRpb25hbCBwZXItcHJvZmlsZSBVSSBpbnRvXG4gICAqIHRoZSBzYW1lIHBhbmVsIChsaWtlIGEgZmF2b3JpdGVzIHN0YXIpLlxuICAgKi9cbiAgb25Qcm9maWxlUmVzb2x2ZWQ/OiAoc2NyZWVuOiBFbGVtZW50LCB1c2VySWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEZpcmVkIG9uIGV2ZXJ5IG1hcmtlciBjbGljayB3aXRoIHRoZSByYXcgbWFya2VyIGVsZW1lbnQgYW5kIHdoYXRldmVyIHdhc1xuICAgKiBleHRyYWN0ZWQgZnJvbSBpdHMgYmFja2dyb3VuZC1pbWFnZSAobnVsbCBmb3IgYSBuby1waG90byBhY2NvdW50LCB3aGljaFxuICAgKiB0aGlzIGhvb2sgc3RpbGwgcmVzb2x2ZXMgdmlhIHRoZSBVUkwpLiBMZXRzIGEgY29uc3VtZXIgcHVsbCBhZGRpdGlvbmFsXG4gICAqIGRhdGEgb2ZmIHRoZSBtYXJrZXIgaXRzZWxmIHdpdGhvdXQgcmUtcGFyc2luZyBpdCAodGhlIENocm9tZSBjbGllbnRcbiAgICogcmVhZHMgYHByb2ZpbGVQaWNVcmxgIGZvciBhIGZhdm9yaXRlJ3MgcGF5bG9hZCkuXG4gICAqL1xuICBvbk1hcmtlckNsaWNrPzogKG1hcmtlcjogSFRNTEVsZW1lbnQsIHNlbGVjdGlvbjogTWFya2VyU2VsZWN0aW9uIHwgbnVsbCkgPT4gdm9pZDtcbn1cblxuY29uc3QgZXh0cmFjdFVzZXJJZEZyb21VcmwgPSAodXJsOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgY29uc3QgZmlyc3QgPSBwYXJzZWQucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKVswXTtcbiAgICByZXR1cm4gZmlyc3QgJiYgL15bYS1mMC05XXsxNix9JC9pLnRlc3QoZmlyc3QpID8gZmlyc3QgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuLy8gTWF0Y2hlcyAvcHJvZmlsZS88aWQ+IChhbmQgc3VicGF0aHMgbGlrZSAvcHJvZmlsZS88aWQ+L2NoYXQpIGZvciBhIHBhZ2Vcbi8vIHRoYXQgbG9hZHMgZGlyZWN0bHkgb250byBhIHByb2ZpbGUgXHUyMDE0IG5vIG1hcmtlciBjbGljayBmaXJlcyBpbiB0aGF0IGNhc2UsXG4vLyBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBsZWFybiB3aGljaCBwcm9maWxlIGlzIHNob3dpbmcgb24gaW5pdC5cbmNvbnN0IGV4dHJhY3RVc2VySWRGcm9tUHJvZmlsZVBhdGggPSAocGF0aG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IGlkID0gc2VnbWVudHNbMF0gPT09IFwicHJvZmlsZVwiID8gc2VnbWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBpZCAmJiAvXlthLWYwLTldezE2LH0kL2kudGVzdChpZCkgPyBpZCA6IG51bGw7XG59O1xuXG5jb25zdCBleHRyYWN0RnJvbU1hcmtlciA9IChlbDogSFRNTEVsZW1lbnQpOiBNYXJrZXJTZWxlY3Rpb24gfCBudWxsID0+IHtcbiAgY29uc3QgYmcgPSBlbC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgfHwgZ2V0Q29tcHV0ZWRTdHlsZShlbCkuYmFja2dyb3VuZEltYWdlO1xuICBpZiAoIWJnIHx8IGJnID09PSBcIm5vbmVcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gYmcubWF0Y2goL3VybFxcKChbJ1wiXT8pKC4qPylcXDFcXCkvKTtcbiAgY29uc3QgcmF3VXJsID0gbWF0Y2g/LlsyXTtcbiAgaWYgKCFyYXdVcmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB1c2VySWQgPSBleHRyYWN0VXNlcklkRnJvbVVybChyYXdVcmwpO1xuICBpZiAoIXVzZXJJZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7IHVzZXJJZCwgcHJvZmlsZVBpY1VybDogcmF3VXJsIH07XG59O1xuXG5leHBvcnQgY29uc3QgaW5zdGFsbFJlcG9ydEJ1dHRvbkluamVjdGlvbiA9IChvcHRpb25zOiBSZXBvcnRCdXR0b25JbmplY3Rpb25PcHRpb25zKTogdm9pZCA9PiB7XG4gIGxldCBsYXN0VXNlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLy8gQnVtcGVkIG9uIGV2ZXJ5IG1hcmtlciBjbGljayAvIGluaXRpYWwtbG9hZCByZXNvbHV0aW9uLiBBIHJldHJ5IGNoYWluXG4gIC8vIGNhcHR1cmVzIHRoZSB2YWx1ZSBhdCBzY2hlZHVsZSB0aW1lIHNvIGl0IGNhbiB0ZWxsIGl0J3MgYmVlbiBzdXBlcnNlZGVkXG4gIC8vIGJ5IGEgbmV3ZXIgY2xpY2sgYW5kIHN0b3AuXG4gIGxldCBzZWxlY3Rpb25HZW5lcmF0aW9uID0gMDtcbiAgbGV0IHJlcG9ydE1vZGFsOiBSZXBvcnRNb2RhbEhhbmRsZSB8IG51bGwgPSBudWxsO1xuICBsZXQgcmVwb3J0VGFyZ2V0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzdWJtaXRSZXBvcnQgPSBhc3luYyAocmVwb3J0ZWRVc2VySWQ6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFvcHRpb25zLnNlcnZlckJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcnZlciBub3QgY29uZmlndXJlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7b3B0aW9ucy5zZXJ2ZXJCYXNlfS9hcGkvcmVwb3J0YCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IG9wdGlvbnMuZ2V0QXV0aEhlYWRlcnMoKSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmVwb3J0VHlwZTogXCJib3Rfc3VzcGVjdGVkXCIsXG4gICAgICAgIHJlcG9ydGVkVXNlcklkLFxuICAgICAgICByZXBvcnRlclVzZXJJZDogb3B0aW9ucy5nZXRSZXBvcnRlclVzZXJJZCgpLFxuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlcG9ydCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXMuc3RhdHVzfWApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBlbnN1cmVSZXBvcnRNb2RhbCA9ICgpOiBSZXBvcnRNb2RhbEhhbmRsZSA9PiB7XG4gICAgaWYgKHJlcG9ydE1vZGFsKSB7XG4gICAgICByZXR1cm4gcmVwb3J0TW9kYWw7XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gUkVQT1JUX01PREFMX0NTUztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblxuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHJvb3QuaWQgPSBSRVBPUlRfTU9EQUxfUk9PVF9JRDtcbiAgICByb290LmlubmVySFRNTCA9IFJFUE9SVF9NT0RBTF9IVE1MO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocm9vdCk7XG5cbiAgICByZXBvcnRNb2RhbCA9IHdpcmVSZXBvcnRNb2RhbChyb290LCB7XG4gICAgICBvblN1Ym1pdDogYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFyZXBvcnRUYXJnZXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VibWl0UmVwb3J0KHJlcG9ydFRhcmdldCwgbWVzc2FnZSk7XG4gICAgICB9LFxuICAgICAgb25DYW5jZWw6ICgpID0+IHtcbiAgICAgICAgcmVwb3J0VGFyZ2V0ID0gbnVsbDtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcG9ydE1vZGFsO1xuICB9O1xuXG4gIGNvbnN0IGJ1aWxkUmVwb3J0QnV0dG9uID0gKHVzZXJJZDogc3RyaW5nKTogSFRNTEJ1dHRvbkVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnRuLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgIGJ0bi5zZXRBdHRyaWJ1dGUoUkVQT1JUX0lOSkVDVEVEX0FUVFIsIHVzZXJJZCk7XG4gICAgYnRuLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJSZXBvcnQgcHJvZmlsZVwiKTtcbiAgICBidG4udGl0bGUgPSBcIlJlcG9ydCBhcyBzdXNwZWN0ZWQgYm90XCI7XG4gICAgYnRuLnN0eWxlLmNzc1RleHQgPSBbXG4gICAgICBcImJhY2tncm91bmQ6dHJhbnNwYXJlbnRcIixcbiAgICAgIFwiYm9yZGVyOm5vbmVcIixcbiAgICAgIFwicGFkZGluZzowIDhweFwiLFxuICAgICAgXCJjdXJzb3I6cG9pbnRlclwiLFxuICAgICAgXCJmb250LXNpemU6MTZweFwiLFxuICAgICAgXCJsaW5lLWhlaWdodDoxXCIsXG4gICAgICBcImNvbG9yOiNmMDQ0MzhcIixcbiAgICAgIFwiZGlzcGxheTpmbGV4XCIsXG4gICAgICBcImFsaWduLWl0ZW1zOmNlbnRlclwiLFxuICAgIF0uam9pbihcIjtcIik7XG4gICAgYnRuLnRleHRDb250ZW50ID0gXCJcdUQ4M0RcdURFQTlcIjtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoIW9wdGlvbnMuZ2V0UmVwb3J0ZXJVc2VySWQoKSkge1xuICAgICAgICBsb2cud2FybihcIm5vIHNuaWZmaWVzIHVzZXIgaWQgb2JzZXJ2ZWQgeWV0IFx1MjAxNCBjYW5ub3QgcmVwb3J0XCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXBvcnRUYXJnZXQgPSB1c2VySWQ7XG4gICAgICBlbnN1cmVSZXBvcnRNb2RhbCgpLm9wZW4oKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYnRuO1xuICB9O1xuXG4gIGNvbnN0IGluamVjdFJlcG9ydEJ1dHRvbiA9IChzY3JlZW46IEVsZW1lbnQsIHVzZXJJZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKCFvcHRpb25zLnJlcG9ydGluZ0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGluQnV0dG9uID0gc2NyZWVuLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFBJTl9CVVRUT05fU0VMRUNUT1IpO1xuICAgIGNvbnN0IGNvbnRyb2xzQ29udGFpbmVyID0gcGluQnV0dG9uPy5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghY29udHJvbHNDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBjb250cm9sc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgWyR7UkVQT1JUX0lOSkVDVEVEX0FUVFJ9XWApO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgaWYgKGV4aXN0aW5nLmdldEF0dHJpYnV0ZShSRVBPUlRfSU5KRUNURURfQVRUUikgPT09IHVzZXJJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBleGlzdGluZy5yZW1vdmUoKTtcbiAgICB9XG4gICAgY29udHJvbHNDb250YWluZXIucHJlcGVuZChidWlsZFJlcG9ydEJ1dHRvbih1c2VySWQpKTtcbiAgfTtcblxuICAvLyBSZS1yZXNvbHZlcyB0aGUgaWQgZnJvbSB0aGUgVVJMIG9uIGV2ZXJ5IGNhbGwgKG5vdCBqdXN0IG9uY2UgYXQgY2xpY2tcbiAgLy8gdGltZSkgc28gaXQgY2FuIG92ZXJyaWRlIGEgc3RhbGUgb3IgYWJzZW50IGxhc3RVc2VySWQgXHUyMDE0IHRoaXMgaXMgd2hhdFxuICAvLyBtYWtlcyBpbmplY3Rpb24gc2VsZi1jb3JyZWN0IG5vIG1hdHRlciB3aGljaCB0cmlnZ2VyIGJlbG93IGNhbGxzIGl0LFxuICAvLyBpbmNsdWRpbmcgbm8tcGhvdG8gbWFya2VyIGNsaWNrcyB0aGF0IGNhbid0IGlkZW50aWZ5IGFueW9uZSB0aGVtc2VsdmVzLlxuICBjb25zdCB0cnlJbmplY3RJbnRvU2NyZWVuID0gKHNjcmVlbjogRWxlbWVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHVybFVzZXJJZCA9IGV4dHJhY3RVc2VySWRGcm9tUHJvZmlsZVBhdGgobG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIGlmICh1cmxVc2VySWQgJiYgbGFzdFVzZXJJZCAhPT0gdXJsVXNlcklkKSB7XG4gICAgICBsYXN0VXNlcklkID0gdXJsVXNlcklkO1xuICAgIH1cbiAgICBpZiAoIWxhc3RVc2VySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb3B0aW9ucy5vblByb2ZpbGVSZXNvbHZlZD8uKHNjcmVlbiwgbGFzdFVzZXJJZCk7XG4gICAgaW5qZWN0UmVwb3J0QnV0dG9uKHNjcmVlbiwgbGFzdFVzZXJJZCk7XG4gIH07XG5cbiAgLy8gUmVydW5zIHRyeUluamVjdEludG9TY3JlZW4gZXZlcnkgaW50ZXJ2YWxNcyB1bnRpbCB3aW5kb3dNcyBlbGFwc2VzLlxuICAvLyBVbmNvbmRpdGlvbmFsLCBubyBcImRpZCBpdCB3b3JrXCIgY2hlY2s6IGluamVjdFJlcG9ydEJ1dHRvbiBhbHdheXMgc3RhbXBzXG4gIC8vIHdoYXRldmVyIGNvbnRhaW5lciBpdCBmaW5kcywgc28gY2hlY2tpbmcgb3VyIG93biBhdHRyaWJ1dGUgYWZ0ZXJ3YXJkXG4gIC8vIHdvdWxkIGxvb2sgXCJkb25lXCIgaW1tZWRpYXRlbHkgZXZlbiBtaWQtdHJhbnNpdGlvbiwgaW50byB0aGUgd3JvbmdcbiAgLy8gKG91dGdvaW5nKSBwYW5lbC4gSWRlbXBvdGVudCBhbmQgY2hlYXAsIHNvIHBvbGxpbmcgcGFzdCB0aGUgcG9pbnQgb2ZcbiAgLy8gYWN0dWFsbHkgc3VjY2VlZGluZyBjb3N0cyBub3RoaW5nLiBCYWlscyBvdXQgb25jZSBgZ2VuZXJhdGlvbmAgaXMgc3RhbGVcbiAgLy8gXHUyMDE0IGEgbmV3ZXIgY2xpY2svbG9hZCBoYXMgYWR2YW5jZWQgc2VsZWN0aW9uR2VuZXJhdGlvbiBzaW5jZSB0aGlzIGNoYWluXG4gIC8vIHdhcyBzY2hlZHVsZWQuXG4gIGNvbnN0IHNjaGVkdWxlUmVpbmplY3Rpb25SZXRyaWVzID0gKFxuICAgIGdlbmVyYXRpb246IG51bWJlcixcbiAgICB3aW5kb3dNczogbnVtYmVyID0gQ0xJQ0tfUkVJTkpFQ1RfUkVUUllfV0lORE9XX01TLFxuICAgIGludGVydmFsTXM6IG51bWJlciA9IENMSUNLX1JFSU5KRUNUX1JFVFJZX0lOVEVSVkFMX01TLFxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IHBlcmZvcm1hbmNlLm5vdygpICsgd2luZG93TXM7XG4gICAgY29uc3QgYXR0ZW1wdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChnZW5lcmF0aW9uICE9PSBzZWxlY3Rpb25HZW5lcmF0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNjcmVlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoQVBQX1NDUkVFTl9TRUxFQ1RPUik7XG4gICAgICBpZiAoc2NyZWVuKSB7XG4gICAgICAgIHRyeUluamVjdEludG9TY3JlZW4oc2NyZWVuKTtcbiAgICAgIH1cbiAgICAgIGlmIChwZXJmb3JtYW5jZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYXR0ZW1wdCwgaW50ZXJ2YWxNcyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBzZXRUaW1lb3V0KGF0dGVtcHQsIGludGVydmFsTXMpO1xuICB9O1xuXG4gIC8vIFNoYXJlZCBlbnRyeSBwb2ludCBmb3IgYm90aCB0cmlnZ2VycyBiZWxvdy4gQWR2YW5jZXMgc2VsZWN0aW9uR2VuZXJhdGlvblxuICAvLyAoaW52YWxpZGF0aW5nIGFueSBvbGRlciByZXRyeSBjaGFpbiBzdGlsbCBydW5uaW5nKSwgdGFrZXMgb25lIGltbWVkaWF0ZVxuICAvLyBhdHRlbXB0LCB0aGVuIHN0YXJ0cyBwb2xsaW5nIGluIGNhc2UgdGhlIHBhbmVsIGhhc24ndCByZW5kZXJlZCB5ZXQuXG4gIC8vIGB1c2VySWRgIG1heSBiZSBudWxsIChlLmcuIGEgbm8tcGhvdG8gbWFya2VyIGNsaWNrKSBzaW5jZVxuICAvLyB0cnlJbmplY3RJbnRvU2NyZWVuIGNhbiByZXNvbHZlIHRoZSBpZCBmcm9tIHRoZSBVUkwgb24gaXRzIG93bi5cbiAgY29uc3QgdHJpZ2dlckluamVjdGlvbiA9IChcbiAgICB1c2VySWQ6IHN0cmluZyB8IG51bGwsXG4gICAgd2luZG93TXM6IG51bWJlciA9IENMSUNLX1JFSU5KRUNUX1JFVFJZX1dJTkRPV19NUyxcbiAgICBpbnRlcnZhbE1zOiBudW1iZXIgPSBDTElDS19SRUlOSkVDVF9SRVRSWV9JTlRFUlZBTF9NUyxcbiAgKTogdm9pZCA9PiB7XG4gICAgc2VsZWN0aW9uR2VuZXJhdGlvbiArPSAxO1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIGxhc3RVc2VySWQgPSB1c2VySWQ7XG4gICAgfVxuICAgIGNvbnN0IHNjcmVlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoQVBQX1NDUkVFTl9TRUxFQ1RPUik7XG4gICAgaWYgKHNjcmVlbikge1xuICAgICAgdHJ5SW5qZWN0SW50b1NjcmVlbihzY3JlZW4pO1xuICAgIH1cbiAgICBzY2hlZHVsZVJlaW5qZWN0aW9uUmV0cmllcyhzZWxlY3Rpb25HZW5lcmF0aW9uLCB3aW5kb3dNcywgaW50ZXJ2YWxNcyk7XG4gIH07XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgLy8gTm8gbGFzdFVzZXJJZCBndWFyZCBoZXJlOiB0cnlJbmplY3RJbnRvU2NyZWVuIHJlc29sdmVzIHRoZSBpZCBmcm9tIHRoZVxuICAgIC8vIFVSTCBpdHNlbGYsIHdoaWNoIG1hdHRlcnMgd2hlbiB0aGUgdmVyeSBmaXJzdCBwcm9maWxlIGV2ZXIgdmlld2VkIGhhc1xuICAgIC8vIG5vIHBob3RvIChubyBjbGljay1kZXJpdmVkIHNlbGVjdGlvbiB0byBmYWxsIGJhY2sgb24gZWl0aGVyKS5cbiAgICBmb3IgKGNvbnN0IG0gb2YgbXV0YXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgbS5hZGRlZE5vZGVzKSB7XG4gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaGVzTmFtZUxhYmVsID1cbiAgICAgICAgICBub2RlLm1hdGNoZXM/LihOQU1FX0xBQkVMX1NFTEVDVE9SKSB8fCAhIW5vZGUucXVlcnlTZWxlY3Rvcj8uKE5BTUVfTEFCRUxfU0VMRUNUT1IpO1xuICAgICAgICBjb25zdCBtYXRjaGVzUGluQnV0dG9uID1cbiAgICAgICAgICBub2RlLm1hdGNoZXM/LihQSU5fQlVUVE9OX1NFTEVDVE9SKSB8fCAhIW5vZGUucXVlcnlTZWxlY3Rvcj8uKFBJTl9CVVRUT05fU0VMRUNUT1IpO1xuICAgICAgICBpZiAoIW1hdGNoZXNOYW1lTGFiZWwgJiYgIW1hdGNoZXNQaW5CdXR0b24pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY3JlZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKEFQUF9TQ1JFRU5fU0VMRUNUT1IpO1xuICAgICAgICBpZiAoc2NyZWVuKSB7XG4gICAgICAgICAgdHJ5SW5qZWN0SW50b1NjcmVlbihzY3JlZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBzdGFydE9ic2VydmluZyA9ICgpOiB2b2lkID0+IHtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuICB9O1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgXCJjbGlja1wiLFxuICAgIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXJrZXIgPSB0YXJnZXQuY2xvc2VzdDxIVE1MRWxlbWVudD4oTUFSS0VSX1NFTEVDVE9SKTtcbiAgICAgIGlmICghbWFya2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgbGlzdGVuZXIgcnVucyBpbiB0aGUgY2FwdHVyZSBwaGFzZSwgYmVmb3JlIFNuaWZmaWVzJyBvd24gY2xpY2tcbiAgICAgIC8vIGhhbmRsaW5nIGhhcyBzd2l0Y2hlZCB0aGUgcGFuZWwgXHUyMDE0IHNvIGlkZW50aXR5IGFuZCB0aW1pbmcgYm90aCBuZWVkXG4gICAgICAvLyBoYW5kbGluZyBkb3duc3RyZWFtOiBleHRyYWN0RnJvbU1hcmtlciBjYW4ndCBpZGVudGlmeSBhIG5vLXBob3RvXG4gICAgICAvLyBhY2NvdW50IGF0IGFsbCwgYW5kIGV2ZW4gd2hlbiBpdCBjYW4sIHRoZSBwYW5lbCBpdCdzIHJlYWRpbmcgZnJvbVxuICAgICAgLy8gbWF5IHN0aWxsIGJlIHNob3dpbmcgdGhlICpwcmV2aW91cyogcHJvZmlsZS4gdHJpZ2dlckluamVjdGlvbidzXG4gICAgICAvLyBpbW1lZGlhdGUgYXR0ZW1wdCArIHJldHJ5IGxvb3AsIGFuZCB0cnlJbmplY3RJbnRvU2NyZWVuJ3MgVVJMXG4gICAgICAvLyByZXNvbHV0aW9uLCBjb3ZlciBib3RoLlxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZXh0cmFjdEZyb21NYXJrZXIobWFya2VyKTtcbiAgICAgIG9wdGlvbnMub25NYXJrZXJDbGljaz8uKG1hcmtlciwgc2VsZWN0aW9uKTtcbiAgICAgIGxvZyhcbiAgICAgICAgc2VsZWN0aW9uID8gXCJtYXJrZXIgY2xpY2tlZFwiIDogXCJtYXJrZXIgY2xpY2tlZCBidXQgbm8gaWQgaW4gaXRzIGltYWdlIFx1MjAxNCByZXNvbHZpbmcgZnJvbSBVUkxcIixcbiAgICAgICAgc2VsZWN0aW9uID8/IG1hcmtlcixcbiAgICAgICk7XG4gICAgICB0cmlnZ2VySW5qZWN0aW9uKHNlbGVjdGlvbj8udXNlcklkID8/IG51bGwpO1xuICAgIH0sXG4gICAgdHJ1ZSxcbiAgKTtcblxuICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgIHN0YXJ0T2JzZXJ2aW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgc3RhcnRPYnNlcnZpbmcsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8vIExhbmRpbmcgZGlyZWN0bHkgb24gYSBwcm9maWxlIFVSTCAoZGVlcCBsaW5rLCBoYXJkIHJlZnJlc2gpIHNob3dzIHRoYXRcbiAgLy8gcHJvZmlsZSdzIHBhbmVsIHdpdGhvdXQgYW55IG1hcmtlciBjbGljayBldmVyIGZpcmluZy5cbiAgY29uc3QgaW5pdGlhbFByb2ZpbGVVc2VySWQgPSBleHRyYWN0VXNlcklkRnJvbVByb2ZpbGVQYXRoKGxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgaWYgKGluaXRpYWxQcm9maWxlVXNlcklkKSB7XG4gICAgbG9nKFwiaW5pdGlhbCBwYWdlIGxvYWQgb24gYSBwcm9maWxlIFVSTFwiLCBpbml0aWFsUHJvZmlsZVVzZXJJZCk7XG4gICAgdHJpZ2dlckluamVjdGlvbihcbiAgICAgIGluaXRpYWxQcm9maWxlVXNlcklkLFxuICAgICAgSU5JVElBTF9MT0FEX1JFSU5KRUNUX1JFVFJZX1dJTkRPV19NUyxcbiAgICAgIElOSVRJQUxfTE9BRF9SRUlOSkVDVF9SRVRSWV9JTlRFUlZBTF9NUyxcbiAgICApO1xuICB9XG59O1xuXG4vKiogU2hhcmVkIDI0aCBzdGFsZW5lc3MgY2hlY2sgKyBmZXRjaCBmb3IgdGhlIGNsaWVudCdzIGNhY2hlZCBcImJsb2NrZWQgYm90c1wiIGxpc3QuICovXG5leHBvcnQgY29uc3QgZmV0Y2hCbG9ja2VkQm90cyA9IGFzeW5jIChcbiAgc2VydmVyQmFzZTogc3RyaW5nLFxuICBnZXRBdXRoSGVhZGVyczogKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb25SZXN1bHQ6ICh1c2VySWRzOiBzdHJpbmdbXSwgZmV0Y2hlZEF0OiBudW1iZXIpID0+IHZvaWQsXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYgKCFzZXJ2ZXJCYXNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7c2VydmVyQmFzZX0vYXBpL2Jsb2NrZWQtYm90c2AsIHsgaGVhZGVyczogZ2V0QXV0aEhlYWRlcnMoKSB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHsgb2s6IGJvb2xlYW47IHVzZXJJZHM6IHN0cmluZ1tdIH07XG4gICAgb25SZXN1bHQoZGF0YS51c2VySWRzID8/IFtdLCBEYXRlLm5vdygpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKFwiZmV0Y2hCbG9ja2VkQm90cyBmYWlsZWRcIiwgZXJyKTtcbiAgfVxufTtcblxuY29uc3QgQkxPQ0tFRF9CT1RTX01BWF9BR0VfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG5leHBvcnQgY29uc3QgcmVmcmVzaEJsb2NrZWRCb3RzSWZTdGFsZSA9IChcbiAgYmxvY2tlZEJvdHNGZXRjaGVkQXQ6IG51bWJlcixcbiAgc2VydmVyQmFzZTogc3RyaW5nLFxuICBnZXRBdXRoSGVhZGVyczogKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb25SZXN1bHQ6ICh1c2VySWRzOiBzdHJpbmdbXSwgZmV0Y2hlZEF0OiBudW1iZXIpID0+IHZvaWQsXG4pOiB2b2lkID0+IHtcbiAgaWYgKERhdGUubm93KCkgLSBibG9ja2VkQm90c0ZldGNoZWRBdCA+IEJMT0NLRURfQk9UU19NQVhfQUdFX01TKSB7XG4gICAgdm9pZCBmZXRjaEJsb2NrZWRCb3RzKHNlcnZlckJhc2UsIGdldEF1dGhIZWFkZXJzLCBvblJlc3VsdCk7XG4gIH1cbn07XG4iLCAiPGRldGFpbHMgY2xhc3M9XCJzZWN0aW9uIGNvbGxhcHNpYmxlXCIgaWQ9XCJwcm9maWxlLWJvcmRlci1kZXRhaWxzXCI+XG4gIDxzdW1tYXJ5PjxoMj5PcGVuIFByb2ZpbGVzIE91dHNpZGUgQm91bmRhcnk8L2gyPjwvc3VtbWFyeT5cbiAgPGRpdiBjbGFzcz1cImNvbGxhcHNpYmxlLWJvZHlcIj5cbiAgICA8cCBjbGFzcz1cImhpbnRcIj5cbiAgICAgIEJ5cGFzcyB0aGUgcGF5d2FsbCBieSBkaXJlY3RseSBvcGVuaW5nIHByb2ZpbGVzIG91dHNpZGUgeW91ciBib3VuZGFyeS4gUmVjb21tZW5kIG9wZW5pbmcgaW4gYVxuICAgICAgbmV3IHRhYiwgY3VycmVudCB0YWIgdHJpZ2dlcnMgY3VycmVudCBwYWdlIHJlbG9hZC5cbiAgICA8L3A+XG4gICAgPGxhYmVsIGNsYXNzPVwicm93XCI+XG4gICAgICA8aW5wdXQgaWQ9XCJwcm9maWxlLWJvcmRlci1lbmFibGVkXCIgdHlwZT1cImNoZWNrYm94XCIgLz5cbiAgICAgIDxzcGFuPkVuYWJsZTwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxsYWJlbCBpZD1cInByb2ZpbGUtYm9yZGVyLXRhYi1maWVsZFwiIGNsYXNzPVwiZmllbGRcIj5cbiAgICAgIDxzcGFuPk9wZW4gaW48L3NwYW4+XG4gICAgICA8c2VsZWN0IGlkPVwicHJvZmlsZS1ib3JkZXItdGFiXCI+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJjdXJyZW50LXRhYlwiPkN1cnJlbnQgdGFiPC9vcHRpb24+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJuZXctdGFiXCI+TmV3IHRhYjwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgPGJ1dHRvbiBpZD1cInByb2ZpbGUtYm9yZGVyLXNhdmVcIiBjbGFzcz1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+XG4gICAgICAgIFNhdmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGV0YWlscz5cbiIsICIvKiBTZWN0aW9uIHNoZWxsIFx1MjAxNCBzaGFyZWQgd2l0aCBnZW8tb3ZlcnJpZGUuY3NzIChwb3B1cC5jc3MgLnNlY3Rpb24sIGRldGFpbHMuY29sbGFwc2libGUsIC5jb2xsYXBzaWJsZS1ib2R5KSAqL1xuXG4jc25wLXByb2ZpbGUtYm9yZGVyLXJvb3QgLnNlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiAjMGUxODI1O1xuICBib3JkZXI6IDFweCBzb2xpZCAjMWMyYjNhO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIHBhZGRpbmc6IDE0cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTBweDtcbn1cblxuI3NucC1wcm9maWxlLWJvcmRlci1yb290IC5zZWN0aW9uIGgyIHtcbiAgbWFyZ2luOiAwO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAwLjFlbTtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgY29sb3I6ICM3YTkwYTQ7XG59XG5cbiNzbnAtcHJvZmlsZS1ib3JkZXItcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHtcbiAgcGFkZGluZzogMDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbiNzbnAtcHJvZmlsZS1ib3JkZXItcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnkge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDE0cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuI3NucC1wcm9maWxlLWJvcmRlci1yb290IGRldGFpbHMuY29sbGFwc2libGUgc3VtbWFyeTo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbiNzbnAtcHJvZmlsZS1ib3JkZXItcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnk6OmFmdGVyIHtcbiAgY29udGVudDogXCJcdTIwM0FcIjtcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cztcbn1cblxuI3NucC1wcm9maWxlLWJvcmRlci1yb290IGRldGFpbHMuY29sbGFwc2libGVbb3Blbl0gc3VtbWFyeTo6YWZ0ZXIge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xufVxuXG4jc25wLXByb2ZpbGUtYm9yZGVyLXJvb3QgZGV0YWlscy5jb2xsYXBzaWJsZSBzdW1tYXJ5IGgyIHtcbiAgbWFyZ2luOiAwO1xufVxuXG4jc25wLXByb2ZpbGUtYm9yZGVyLXJvb3QgLmNvbGxhcHNpYmxlLWJvZHkge1xuICBwYWRkaW5nOiAwIDE0cHggMTRweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxMHB4O1xufVxuXG4vKiBGb3JtIGZpZWxkcyBcdTIwMTQgc2hhcmVkIHdpdGggZ2VvLW92ZXJyaWRlLmNzcyAocG9wdXAuY3NzIC5yb3csIC5oaW50LCAuZmllbGQsIGJ1dHRvbi5wcmltYXJ5L3NlY29uZGFyeSwgLmFjdGlvbnMpICovXG5cbiNzbnAtcHJvZmlsZS1ib3JkZXItcm9vdCAucm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogI2ZmZmZmZjtcbn1cblxuI3NucC1wcm9maWxlLWJvcmRlci1yb290IC5yb3cgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgYWNjZW50LWNvbG9yOiAjZmY1NTAwO1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xufVxuXG4jc25wLXByb2ZpbGUtYm9yZGVyLXJvb3QgLmhpbnQge1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICBtYXJnaW46IDA7XG59XG5cbiNzbnAtcHJvZmlsZS1ib3JkZXItcm9vdCBidXR0b24ucHJpbWFyeSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgcGFkZGluZzogN3B4IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogI2ZmNTUwMDtcbiAgY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cztcbn1cblxuI3NucC1wcm9maWxlLWJvcmRlci1yb290IGJ1dHRvbi5wcmltYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZDogI2UwNGEwMDtcbn1cblxuI3NucC1wcm9maWxlLWJvcmRlci1yb290IGJ1dHRvbi5wcmltYXJ5OmRpc2FibGVkIHtcbiAgYmFja2dyb3VuZDogIzFjMmIzYTtcbiAgY29sb3I6ICM3YTkwYTQ7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbiNzbnAtcHJvZmlsZS1ib3JkZXItcm9vdCAuZmllbGQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDRweDtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogIzdhOTBhNDtcbn1cblxuI3NucC1wcm9maWxlLWJvcmRlci1yb290IC5maWVsZCBzZWxlY3Qge1xuICBmb250LXNpemU6IDEzcHg7XG4gIHBhZGRpbmc6IDdweCAxMHB4O1xuICBib3JkZXItcmFkaXVzOiA2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMxYzJiM2E7XG4gIGJhY2tncm91bmQ6ICMwODBlMTg7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBvdXRsaW5lOiBub25lO1xuICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXM7XG59XG5cbiNzbnAtcHJvZmlsZS1ib3JkZXItcm9vdCAuZmllbGQgc2VsZWN0OmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjZmY1NTAwO1xufVxuXG4jc25wLXByb2ZpbGUtYm9yZGVyLXJvb3QgLmFjdGlvbnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDhweDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cbiIsICJpbXBvcnQgUFJPRklMRV9CT1JERVJfSFRNTCBmcm9tIFwiLi9wcm9maWxlLWJvcmRlci5odG1sXCI7XG5pbXBvcnQgUFJPRklMRV9CT1JERVJfQ1NTIGZyb20gXCIuL3Byb2ZpbGUtYm9yZGVyLmNzc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9maWxlQm9yZGVyT3BlbiB9IGZyb20gXCIuL3NldHRpbmdzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2ZpbGVCb3JkZXJGb3JtQ29udHJhY3QgfSBmcm9tIFwiLi9wcm9maWxlLWJvcmRlci1mb3JtLWNvbnRyYWN0LmpzXCI7XG5cbmV4cG9ydCB7IFBST0ZJTEVfQk9SREVSX0hUTUwsIFBST0ZJTEVfQk9SREVSX0NTUyB9O1xuZXhwb3J0IHR5cGUgeyBQcm9maWxlQm9yZGVyRm9ybUNvbnRyYWN0IH07XG5cbmNvbnN0IFRBQl9MQUJFTFMgPSB7XG4gIGN1cnJlbnQ6IFwiQ3VycmVudCB0YWJcIixcbiAgY3VycmVudFNhdmVkOiBcIkN1cnJlbnQgdGFiIChzYXZlZClcIixcbiAgbmV3OiBcIk5ldyB0YWJcIixcbiAgbmV3U2F2ZWQ6IFwiTmV3IHRhYiAoc2F2ZWQpXCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgd2lyZVByb2ZpbGVCb3JkZXJGb3JtID0gKFxuICBjb250YWluZXI6IEVsZW1lbnQsXG4gIG9wdGlvbnM6IFByb2ZpbGVCb3JkZXJGb3JtQ29udHJhY3QsXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgZWwgPSA8VCBleHRlbmRzIEVsZW1lbnQ+KGlkOiBzdHJpbmcpOiBUID0+IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPFQ+KGAjJHtpZH1gKSBhcyBUO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcjxIVE1MRGV0YWlsc0VsZW1lbnQ+KFwiI3Byb2ZpbGUtYm9yZGVyLWRldGFpbHNcIik7XG4gIGNvbnN0IGVuYWJsZWRDaGVja2JveCA9IGVsPEhUTUxJbnB1dEVsZW1lbnQ+KFwicHJvZmlsZS1ib3JkZXItZW5hYmxlZFwiKTtcbiAgY29uc3QgdGFiRmllbGQgPSBlbDxIVE1MRWxlbWVudD4oXCJwcm9maWxlLWJvcmRlci10YWItZmllbGRcIik7XG4gIGNvbnN0IHRhYlNlbGVjdCA9IGVsPEhUTUxTZWxlY3RFbGVtZW50PihcInByb2ZpbGUtYm9yZGVyLXRhYlwiKTtcbiAgY29uc3Qgb3B0aW9uQ3VycmVudCA9IHRhYlNlbGVjdC5xdWVyeVNlbGVjdG9yPEhUTUxPcHRpb25FbGVtZW50Pignb3B0aW9uW3ZhbHVlPVwiY3VycmVudC10YWJcIl0nKSE7XG4gIGNvbnN0IG9wdGlvbk5ldyA9IHRhYlNlbGVjdC5xdWVyeVNlbGVjdG9yPEhUTUxPcHRpb25FbGVtZW50Pignb3B0aW9uW3ZhbHVlPVwibmV3LXRhYlwiXScpITtcbiAgY29uc3Qgc2F2ZUJ0biA9IGVsPEhUTUxCdXR0b25FbGVtZW50PihcInByb2ZpbGUtYm9yZGVyLXNhdmVcIik7XG5cbiAgLy8gV2lyZSBjb2xsYXBzaWJsZVxuICBpZiAoZGV0YWlscykge1xuICAgIGRldGFpbHMub3BlbiA9IG9wdGlvbnMuaW5pdGlhbE9wZW47XG4gICAgZGV0YWlscy5hZGRFdmVudExpc3RlbmVyKFwidG9nZ2xlXCIsICgpID0+IG9wdGlvbnMub25Ub2dnbGUoZGV0YWlscy5vcGVuKSk7XG4gIH1cblxuICBjb25zdCBhcHBseUxhYmVscyA9IChvcGVuSW5OZXdUYWI6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBvcHRpb25DdXJyZW50LnRleHQgPSBvcGVuSW5OZXdUYWIgPyBUQUJfTEFCRUxTLmN1cnJlbnQgOiBUQUJfTEFCRUxTLmN1cnJlbnRTYXZlZDtcbiAgICBvcHRpb25OZXcudGV4dCA9IG9wZW5Jbk5ld1RhYiA/IFRBQl9MQUJFTFMubmV3U2F2ZWQgOiBUQUJfTEFCRUxTLm5ldztcbiAgfTtcblxuICBjb25zdCByZWFkRm9ybSA9ICgpOiBQcm9maWxlQm9yZGVyT3BlbiA9PiAoe1xuICAgIGVuYWJsZWQ6IGVuYWJsZWRDaGVja2JveC5jaGVja2VkLFxuICAgIG9wZW5Jbk5ld1RhYjogdGFiU2VsZWN0LnZhbHVlID09PSBcIm5ldy10YWJcIixcbiAgfSk7XG5cbiAgLy8gUG9wdWxhdGUgaW5pdGlhbCB2YWx1ZXNcbiAgY29uc3QgeyBpbml0aWFsIH0gPSBvcHRpb25zO1xuICBsZXQgc2F2ZWRPcGVuSW5OZXdUYWIgPSBpbml0aWFsLm9wZW5Jbk5ld1RhYjtcblxuICBlbmFibGVkQ2hlY2tib3guY2hlY2tlZCA9IGluaXRpYWwuZW5hYmxlZDtcbiAgdGFiRmllbGQuc3R5bGUuZGlzcGxheSA9IGluaXRpYWwuZW5hYmxlZCA/IFwiXCIgOiBcIm5vbmVcIjtcbiAgdGFiU2VsZWN0LnZhbHVlID0gaW5pdGlhbC5vcGVuSW5OZXdUYWIgPyBcIm5ldy10YWJcIiA6IFwiY3VycmVudC10YWJcIjtcbiAgYXBwbHlMYWJlbHMoaW5pdGlhbC5vcGVuSW5OZXdUYWIpO1xuICBzYXZlQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblxuICBlbmFibGVkQ2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgdGFiRmllbGQuc3R5bGUuZGlzcGxheSA9IGVuYWJsZWRDaGVja2JveC5jaGVja2VkID8gXCJcIiA6IFwibm9uZVwiO1xuICAgIHZvaWQgb3B0aW9ucy5vblNhdmUocmVhZEZvcm0oKSk7XG4gIH0pO1xuXG4gIHRhYlNlbGVjdC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICBjb25zdCBpc0NoYW5nZWQgPSAodGFiU2VsZWN0LnZhbHVlID09PSBcIm5ldy10YWJcIikgIT09IHNhdmVkT3BlbkluTmV3VGFiO1xuICAgIHNhdmVCdG4uc3R5bGUuZGlzcGxheSA9IGlzQ2hhbmdlZCA/IFwiXCIgOiBcIm5vbmVcIjtcbiAgfSk7XG5cbiAgc2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSByZWFkRm9ybSgpO1xuICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKG9wdGlvbnMub25TYXZlKG5leHQpKS50aGVuKCgpID0+IHtcbiAgICAgIGFwcGx5TGFiZWxzKG5leHQub3BlbkluTmV3VGFiKTtcbiAgICAgIHNhdmVkT3BlbkluTmV3VGFiID0gbmV4dC5vcGVuSW5OZXdUYWI7XG4gICAgICBzYXZlQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICB9KTtcbiAgfSk7XG59O1xuIiwgIjxkZXRhaWxzIGNsYXNzPVwic2VjdGlvbiBjb2xsYXBzaWJsZVwiIGlkPVwiYm90LWJsb2NrLWRldGFpbHNcIj5cbiAgPHN1bW1hcnk+PGgyPkJsb2NrIEJvdCBBY2NvdW50czwvaDI+PC9zdW1tYXJ5PlxuICA8ZGl2IGNsYXNzPVwiY29sbGFwc2libGUtYm9keVwiPlxuICAgIDxwIGlkPVwiYm90LWJsb2NrLWNvdW50XCIgY2xhc3M9XCJzdGF0XCI+PC9wPlxuICAgIDxwIGlkPVwiYm90LWJsb2NrLWhpbnRcIiBjbGFzcz1cImhpbnRcIj48L3A+XG4gICAgPGxhYmVsIGNsYXNzPVwicm93XCI+XG4gICAgICA8aW5wdXQgaWQ9XCJib3QtYmxvY2stZW5hYmxlZFwiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICA8c3BhbiBpZD1cImJvdC1ibG9jay1lbmFibGUtbGFiZWxcIj5FbmFibGU8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgPC9kaXY+XG48L2RldGFpbHM+XG4iLCAiLyogU2VjdGlvbiBzaGVsbCBcdTIwMTQgc2hhcmVkIHdpdGggZ2VvLW92ZXJyaWRlLmNzcy9wcm9maWxlLWJvcmRlci5jc3MgKHBvcHVwLmNzcyAuc2VjdGlvbiwgZGV0YWlscy5jb2xsYXBzaWJsZSwgLmNvbGxhcHNpYmxlLWJvZHkpICovXG5cbiNzbnAtYm90LWJsb2NrLXJvb3QgLnNlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiAjMGUxODI1O1xuICBib3JkZXI6IDFweCBzb2xpZCAjMWMyYjNhO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIHBhZGRpbmc6IDE0cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTBweDtcbn1cblxuI3NucC1ib3QtYmxvY2stcm9vdCAuc2VjdGlvbiBoMiB7XG4gIG1hcmdpbjogMDtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4xZW07XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiAjN2E5MGE0O1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IGRldGFpbHMuY29sbGFwc2libGUge1xuICBwYWRkaW5nOiAwO1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuI3NucC1ib3QtYmxvY2stcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnkge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDE0cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogNnB4O1xuICB1c2VyLXNlbGVjdDogbm9uZTtcbn1cblxuI3NucC1ib3QtYmxvY2stcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IGRldGFpbHMuY29sbGFwc2libGUgc3VtbWFyeTo6YWZ0ZXIge1xuICBjb250ZW50OiBcIlx1MjAzQVwiO1xuICBtYXJnaW4tbGVmdDogYXV0bztcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6ICM3YTkwYTQ7XG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzO1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IGRldGFpbHMuY29sbGFwc2libGVbb3Blbl0gc3VtbWFyeTo6YWZ0ZXIge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IGRldGFpbHMuY29sbGFwc2libGUgc3VtbWFyeSBoMiB7XG4gIG1hcmdpbjogMDtcbn1cblxuI3NucC1ib3QtYmxvY2stcm9vdCAuY29sbGFwc2libGUtYm9keSB7XG4gIHBhZGRpbmc6IDAgMTRweCAxNHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG5cbi8qIEZvcm0gZmllbGRzIFx1MjAxNCBzaGFyZWQgd2l0aCBnZW8tb3ZlcnJpZGUuY3NzL3Byb2ZpbGUtYm9yZGVyLmNzcyAocG9wdXAuY3NzIC5yb3csIC5oaW50KSAqL1xuXG4jc25wLWJvdC1ibG9jay1yb290IC5yb3cge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDhweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IC5yb3cgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgYWNjZW50LWNvbG9yOiAjZmY1NTAwO1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IC5oaW50IHtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBjb2xvcjogIzdhOTBhNDtcbiAgbWFyZ2luOiAwO1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IC5zdGF0IHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBjb2xvcjogI2ZmZmZmZjtcbiAgbWFyZ2luOiAwO1xufVxuXG4jc25wLWJvdC1ibG9jay1yb290IC5zdGF0OmVtcHR5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsICJpbXBvcnQgQk9UX0JMT0NLX0hUTUwgZnJvbSBcIi4vYm90LWJsb2NrLmh0bWxcIjtcbmltcG9ydCBCT1RfQkxPQ0tfQ1NTIGZyb20gXCIuL2JvdC1ibG9jay5jc3NcIjtcbmltcG9ydCB0eXBlIHsgQm90QmxvY2tGb3JtQ29udHJhY3QgfSBmcm9tIFwiLi9ib3QtYmxvY2stZm9ybS1jb250cmFjdC5qc1wiO1xuXG5leHBvcnQgeyBCT1RfQkxPQ0tfSFRNTCwgQk9UX0JMT0NLX0NTUyB9O1xuZXhwb3J0IHR5cGUgeyBCb3RCbG9ja0Zvcm1Db250cmFjdCB9O1xuXG5leHBvcnQgY29uc3Qgd2lyZUJvdEJsb2NrRm9ybSA9IChjb250YWluZXI6IEVsZW1lbnQsIG9wdGlvbnM6IEJvdEJsb2NrRm9ybUNvbnRyYWN0KTogdm9pZCA9PiB7XG4gIGNvbnN0IGVsID0gPFQgZXh0ZW5kcyBFbGVtZW50PihpZDogc3RyaW5nKTogVCA9PiBjb250YWluZXIucXVlcnlTZWxlY3RvcjxUPihgIyR7aWR9YCkgYXMgVDtcblxuICBjb25zdCBkZXRhaWxzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTERldGFpbHNFbGVtZW50PihcIiNib3QtYmxvY2stZGV0YWlsc1wiKTtcbiAgY29uc3QgY291bnRFbCA9IGVsPEhUTUxFbGVtZW50PihcImJvdC1ibG9jay1jb3VudFwiKTtcbiAgY29uc3QgaGludEVsID0gZWw8SFRNTEVsZW1lbnQ+KFwiYm90LWJsb2NrLWhpbnRcIik7XG4gIGNvbnN0IGVuYWJsZWRDaGVja2JveCA9IGVsPEhUTUxJbnB1dEVsZW1lbnQ+KFwiYm90LWJsb2NrLWVuYWJsZWRcIik7XG4gIGNvbnN0IGVuYWJsZUxhYmVsID0gZWw8SFRNTEVsZW1lbnQ+KFwiYm90LWJsb2NrLWVuYWJsZS1sYWJlbFwiKTtcblxuICBpZiAoZGV0YWlscykge1xuICAgIGRldGFpbHMub3BlbiA9IG9wdGlvbnMuaW5pdGlhbE9wZW47XG4gICAgZGV0YWlscy5hZGRFdmVudExpc3RlbmVyKFwidG9nZ2xlXCIsICgpID0+IG9wdGlvbnMub25Ub2dnbGUoZGV0YWlscy5vcGVuKSk7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMucmVwb3J0aW5nRW5hYmxlZCkge1xuICAgIGVuYWJsZWRDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgZW5hYmxlZENoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICBoaW50RWwudGV4dENvbnRlbnQgPSBcIkNvbWluZyBzb29uIVwiO1xuICAgIGVuYWJsZUxhYmVsLnN0eWxlLnRleHREZWNvcmF0aW9uID0gXCJsaW5lLXRocm91Z2hcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbmFibGVkQ2hlY2tib3guY2hlY2tlZCA9IG9wdGlvbnMuaW5pdGlhbEVuYWJsZWQ7XG4gIGhpbnRFbC50ZXh0Q29udGVudCA9XG4gICAgXCJIaWRlIHByb2ZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbmZpcm1lZCBhcyBib3RzIGZyb20gdGhlIG1hcCBhbmQgbGl2ZSB1cGRhdGVzLlwiO1xuICBjb3VudEVsLnRleHRDb250ZW50ID1cbiAgICBvcHRpb25zLmluaXRpYWxDb3VudCA+IDBcbiAgICAgID8gYCR7b3B0aW9ucy5pbml0aWFsQ291bnR9IGJvdCR7b3B0aW9ucy5pbml0aWFsQ291bnQgPT09IDEgPyBcIlwiIDogXCJzXCJ9IGJsb2NrZWQgaW4gdGhlIGxhc3QgMjQgaG91cnNgXG4gICAgICA6IFwiXCI7XG5cbiAgZW5hYmxlZENoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIHZvaWQgb3B0aW9ucy5vblRvZ2dsZUVuYWJsZWQoZW5hYmxlZENoZWNrYm94LmNoZWNrZWQpO1xuICB9KTtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBCbG9ja2VkQm90RGFpbHlMb2cgfSBmcm9tIFwiLi9ibG9ja2VkLWJvdC1sb2cuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBHZW9PdmVycmlkZSB7XG4gIGVuYWJsZWQ6IGJvb2xlYW47XG4gIGxhdGl0dWRlOiBudW1iZXI7XG4gIGxvbmdpdHVkZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9HRU9fT1ZFUlJJREU6IEdlb092ZXJyaWRlID0ge1xuICBlbmFibGVkOiBmYWxzZSxcbiAgbGF0aXR1ZGU6IDAsXG4gIGxvbmdpdHVkZTogMCxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZmlsZUJvcmRlck9wZW4ge1xuICBlbmFibGVkOiBib29sZWFuO1xuICBvcGVuSW5OZXdUYWI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BST0ZJTEVfQk9SREVSX09QRU46IFByb2ZpbGVCb3JkZXJPcGVuID0ge1xuICBlbmFibGVkOiBmYWxzZSxcbiAgb3BlbkluTmV3VGFiOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IFBIT05FX0UxNjRfUkVHRVggPSAvXlxcK1sxLTldXFxkezYsMTR9JC87XG5cbi8vIFNuaWZmaWVzIHVzZXIgaWRzIGFyZSAyNC1jaGFyYWN0ZXIgaGV4IE1vbmdvIE9iamVjdElkcyAoY29uZmlybWVkIHZpYSBIQVIpLlxuZXhwb3J0IGNvbnN0IFNOSUZGSUVTX1VTRVJfSURfUkVHRVggPSAvXlthLWYwLTldezI0fSQvaTtcblxuZXhwb3J0IGNvbnN0IFNFVFRJTkdTX0tFWVMgPSB7XG4gIGd1aWQ6IFwiZ3VpZFwiLFxuICBwaG9uZTogXCJwaG9uZVwiLFxuICBnZW9PdmVycmlkZTogXCJnZW9PdmVycmlkZVwiLFxuICBnZW9TZWN0aW9uT3BlbjogXCJnZW9TZWN0aW9uT3BlblwiLFxuICBwcm9maWxlQm9yZGVyT3BlbjogXCJwcm9maWxlQm9yZGVyT3BlblwiLFxuICBwcm9maWxlQm9yZGVyU2VjdGlvbk9wZW46IFwicHJvZmlsZUJvcmRlclNlY3Rpb25PcGVuXCIsXG4gIGZhdm9yaXRlc0VuYWJsZWQ6IFwiZmF2b3JpdGVzRW5hYmxlZFwiLFxuICBmYXZvcml0ZXNTZWN0aW9uT3BlbjogXCJmYXZvcml0ZXNTZWN0aW9uT3BlblwiLFxuICBzbmlmZmllc1VzZXJJZDogXCJzbmlmZmllc1VzZXJJZFwiLFxuICBibG9ja2VkQm90czogXCJibG9ja2VkQm90c1wiLFxuICBibG9ja2VkQm90c0ZldGNoZWRBdDogXCJibG9ja2VkQm90c0ZldGNoZWRBdFwiLFxuICBib3RCbG9ja2luZ0VuYWJsZWQ6IFwiYm90QmxvY2tpbmdFbmFibGVkXCIsXG4gIGJvdEJsb2NraW5nU2VjdGlvbk9wZW46IFwiYm90QmxvY2tpbmdTZWN0aW9uT3BlblwiLFxuICBibG9ja2VkQm90RXZlbnRzQnlEYXk6IFwiYmxvY2tlZEJvdEV2ZW50c0J5RGF5XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbkxvY2FsU2V0dGluZ3Mge1xuICBndWlkOiBzdHJpbmc7XG4gIHBob25lOiBzdHJpbmc7XG4gIGdlb092ZXJyaWRlOiBHZW9PdmVycmlkZTtcbiAgZ2VvU2VjdGlvbk9wZW46IGJvb2xlYW47XG4gIHByb2ZpbGVCb3JkZXJPcGVuOiBQcm9maWxlQm9yZGVyT3BlbjtcbiAgcHJvZmlsZUJvcmRlclNlY3Rpb25PcGVuOiBib29sZWFuO1xuICBmYXZvcml0ZXNFbmFibGVkOiBib29sZWFuO1xuICBmYXZvcml0ZXNTZWN0aW9uT3BlbjogYm9vbGVhbjtcbiAgc25pZmZpZXNVc2VySWQ6IHN0cmluZztcbiAgYmxvY2tlZEJvdHM6IHN0cmluZ1tdO1xuICBibG9ja2VkQm90c0ZldGNoZWRBdDogbnVtYmVyO1xuICBib3RCbG9ja2luZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIGJvdEJsb2NraW5nU2VjdGlvbk9wZW46IGJvb2xlYW47XG4gIGJsb2NrZWRCb3RFdmVudHNCeURheTogQmxvY2tlZEJvdERhaWx5TG9nO1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0NBTF9TRVRUSU5HUzogRXh0ZW5zaW9uTG9jYWxTZXR0aW5ncyA9IHtcbiAgZ3VpZDogXCJcIixcbiAgcGhvbmU6IFwiXCIsXG4gIGdlb092ZXJyaWRlOiBERUZBVUxUX0dFT19PVkVSUklERSxcbiAgZ2VvU2VjdGlvbk9wZW46IGZhbHNlLFxuICBwcm9maWxlQm9yZGVyT3BlbjogREVGQVVMVF9QUk9GSUxFX0JPUkRFUl9PUEVOLFxuICBwcm9maWxlQm9yZGVyU2VjdGlvbk9wZW46IGZhbHNlLFxuICBmYXZvcml0ZXNFbmFibGVkOiBmYWxzZSxcbiAgZmF2b3JpdGVzU2VjdGlvbk9wZW46IGZhbHNlLFxuICBzbmlmZmllc1VzZXJJZDogXCJcIixcbiAgYmxvY2tlZEJvdHM6IFtdLFxuICBibG9ja2VkQm90c0ZldGNoZWRBdDogMCxcbiAgYm90QmxvY2tpbmdFbmFibGVkOiB0cnVlLFxuICBib3RCbG9ja2luZ1NlY3Rpb25PcGVuOiBmYWxzZSxcbiAgYmxvY2tlZEJvdEV2ZW50c0J5RGF5OiB7fSxcbn07XG4iLCAiI3NucC1mYWIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIC8qIFRPRE8gVGhpcyBtYXkgc3RpbGwgbmVlZCByZXdvcmtpbmcgKi9cbiAgYm90dG9tOiBjYWxjKDgwcHggKyA1dmgpO1xuICByaWdodDogMTZweDtcbiAgei1pbmRleDogMjE0NzQ4MzY0NjtcbiAgYmFja2dyb3VuZDogcmdiYSgxNCwgMjQsIDM3LCAwLjg1KTtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHdpZHRoOiA0NHB4O1xuICBoZWlnaHQ6IDQ0cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBvcGFjaXR5OiAwLjk7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXM7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7XG59XG4jc25wLWZhYjpob3ZlciB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbiNzbnAtcGFuZWwge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogNjBweDtcbiAgcmlnaHQ6IDEycHg7XG4gIHotaW5kZXg6IDIxNDc0ODM2NDc7XG4gIHdpZHRoOiAyODBweDtcbiAgYmFja2dyb3VuZDogIzBlMTgyNTtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBib3gtc2hhZG93OiAwIDRweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41KTtcbiAgZm9udC1mYW1pbHk6XG4gICAgc3lzdGVtLXVpLFxuICAgIC1hcHBsZS1zeXN0ZW0sXG4gICAgXCJTZWdvZSBVSVwiLFxuICAgIHNhbnMtc2VyaWY7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMTJweDtcbn1cblxuLnNucC1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG4uc25wLXRpdGxlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGJhc2VsaW5lO1xuICBnYXA6IDZweDtcbn1cbi5zbnAtaGVhZGVyIGgxIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBtYXJnaW46IDA7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG59XG5cbi5zbnAtY2xvc2Uge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiBub25lO1xuICBjb2xvcjogIzdhOTBhNDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBwYWRkaW5nOiAycHggNHB4O1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cztcbn1cbi5zbnAtY2xvc2U6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbiIsICI8ZGl2IGNsYXNzPVwic25wLWhlYWRlclwiPlxuICA8ZGl2IGNsYXNzPVwic25wLXRpdGxlXCI+XG4gICAgPGgxPlNuaWZmaWVzIFBsdWctaW5zPC9oMT5cbiAgICA8c3BhbiBpZD1cInNucC12ZXJzaW9uXCIgY2xhc3M9XCJzbnAtdmVyc2lvblwiPjwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxidXR0b24gY2xhc3M9XCJzbnAtY2xvc2VcIiBpZD1cInNucC1jbG9zZVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj5cdTI3MTU8L2J1dHRvbj5cbjwvZGl2PlxuPGRpdiBpZD1cInNucC1nZW8tcm9vdFwiPjwvZGl2PlxuPGRpdiBpZD1cInNucC1wcm9maWxlLWJvcmRlci1yb290XCI+PC9kaXY+XG48ZGl2IGlkPVwic25wLWJvdC1ibG9jay1yb290XCI+PC9kaXY+XG4iLCAiaW1wb3J0IHtcbiAgQmxvY2tlZEJvdERhaWx5TG9nLFxuICBERUZBVUxUX0dFT19PVkVSUklERSxcbiAgREVGQVVMVF9QUk9GSUxFX0JPUkRFUl9PUEVOLFxuICBHZW9PdmVycmlkZSxcbiAgUHJvZmlsZUJvcmRlck9wZW4sXG4gIHJlY29yZEJsb2NrZWRCb3RJZHMsXG59IGZyb20gXCJAc25pZmZpZXMtcHJvamVjdHMvY29yZVwiO1xuXG5jb25zdCBHRU9fU1RPUkFHRV9LRVkgPSBcInNuaWZmaWVzLWdlb1wiO1xuY29uc3QgUFJPRklMRV9CT1JERVJfU1RPUkFHRV9LRVkgPSBcInNuaWZmaWVzLXByb2ZpbGUtYm9yZGVyXCI7XG5jb25zdCBCTE9DS0VEX0JPVFNfU1RPUkFHRV9LRVkgPSBcInNuaWZmaWVzLWJsb2NrZWQtYm90c1wiO1xuY29uc3QgQkxPQ0tFRF9CT1RTX0ZFVENIRURfQVRfU1RPUkFHRV9LRVkgPSBcInNuaWZmaWVzLWJsb2NrZWQtYm90cy1mZXRjaGVkLWF0XCI7XG5jb25zdCBCT1RfQkxPQ0tJTkdfRU5BQkxFRF9TVE9SQUdFX0tFWSA9IFwic25pZmZpZXMtYm90LWJsb2NraW5nLWVuYWJsZWRcIjtcbmNvbnN0IEJPVF9CTE9DS0lOR19TRUNUSU9OX09QRU5fU1RPUkFHRV9LRVkgPSBcInNuaWZmaWVzLWJvdC1ibG9ja2luZy1zZWN0aW9uLW9wZW5cIjtcbmNvbnN0IEJMT0NLRURfQk9UX0VWRU5UU19TVE9SQUdFX0tFWSA9IFwic25pZmZpZXMtYmxvY2tlZC1ib3QtZXZlbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRHZW9PdmVycmlkZSA9ICgpOiBHZW9PdmVycmlkZSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oR0VPX1NUT1JBR0VfS0VZKTtcbiAgICByZXR1cm4gcmF3ID8geyAuLi5ERUZBVUxUX0dFT19PVkVSUklERSwgLi4uSlNPTi5wYXJzZShyYXcpIH0gOiB7IC4uLkRFRkFVTFRfR0VPX09WRVJSSURFIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfR0VPX09WRVJSSURFIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRHZW9PdmVycmlkZSA9IChuZXh0OiBHZW9PdmVycmlkZSk6IHZvaWQgPT4ge1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShHRU9fU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KG5leHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9maWxlQm9yZGVyT3BlbiA9ICgpOiBQcm9maWxlQm9yZGVyT3BlbiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oUFJPRklMRV9CT1JERVJfU1RPUkFHRV9LRVkpO1xuICAgIHJldHVybiByYXdcbiAgICAgID8geyAuLi5ERUZBVUxUX1BST0ZJTEVfQk9SREVSX09QRU4sIC4uLkpTT04ucGFyc2UocmF3KSB9XG4gICAgICA6IHsgLi4uREVGQVVMVF9QUk9GSUxFX0JPUkRFUl9PUEVOIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfUFJPRklMRV9CT1JERVJfT1BFTiB9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0UHJvZmlsZUJvcmRlck9wZW4gPSAobmV4dDogUHJvZmlsZUJvcmRlck9wZW4pOiB2b2lkID0+IHtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oUFJPRklMRV9CT1JERVJfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KG5leHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCbG9ja2VkQm90cyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQkxPQ0tFRF9CT1RTX1NUT1JBR0VfS0VZKTtcbiAgICBjb25zdCBwYXJzZWQ6IHVua25vd24gPSByYXcgPyBKU09OLnBhcnNlKHJhdykgOiBbXTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiKSA6IFtdO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCbG9ja2VkQm90c0ZldGNoZWRBdCA9ICgpOiBudW1iZXIgPT4ge1xuICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShCTE9DS0VEX0JPVFNfRkVUQ0hFRF9BVF9TVE9SQUdFX0tFWSk7XG4gIGNvbnN0IHBhcnNlZCA9IHJhdyA/IE51bWJlcihyYXcpIDogMDtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogMDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRCbG9ja2VkQm90cyA9ICh1c2VySWRzOiBzdHJpbmdbXSwgZmV0Y2hlZEF0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQkxPQ0tFRF9CT1RTX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VySWRzKSk7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEJMT0NLRURfQk9UU19GRVRDSEVEX0FUX1NUT1JBR0VfS0VZLCBTdHJpbmcoZmV0Y2hlZEF0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm90QmxvY2tpbmdFbmFibGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShCT1RfQkxPQ0tJTkdfRU5BQkxFRF9TVE9SQUdFX0tFWSk7XG4gIHJldHVybiByYXcgPT09IG51bGwgPyB0cnVlIDogcmF3ID09PSBcInRydWVcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRCb3RCbG9ja2luZ0VuYWJsZWQgPSAoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShCT1RfQkxPQ0tJTkdfRU5BQkxFRF9TVE9SQUdFX0tFWSwgU3RyaW5nKGVuYWJsZWQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3RCbG9ja2luZ1NlY3Rpb25PcGVuID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQk9UX0JMT0NLSU5HX1NFQ1RJT05fT1BFTl9TVE9SQUdFX0tFWSkgPT09IFwidHJ1ZVwiO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEJvdEJsb2NraW5nU2VjdGlvbk9wZW4gPSAob3BlbjogYm9vbGVhbik6IHZvaWQgPT4ge1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShCT1RfQkxPQ0tJTkdfU0VDVElPTl9PUEVOX1NUT1JBR0VfS0VZLCBTdHJpbmcob3BlbikpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJsb2NrZWRCb3RFdmVudHNCeURheSA9ICgpOiBCbG9ja2VkQm90RGFpbHlMb2cgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEJMT0NLRURfQk9UX0VWRU5UU19TVE9SQUdFX0tFWSk7XG4gICAgcmV0dXJuIHJhdyA/IChKU09OLnBhcnNlKHJhdykgYXMgQmxvY2tlZEJvdERhaWx5TG9nKSA6IHt9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZWNvcmRCbG9ja2VkQm90RXZlbnQgPSAoaWRzOiBzdHJpbmdbXSk6IHZvaWQgPT4ge1xuICBjb25zdCBuZXh0ID0gcmVjb3JkQmxvY2tlZEJvdElkcyhnZXRCbG9ja2VkQm90RXZlbnRzQnlEYXkoKSwgaWRzKTtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQkxPQ0tFRF9CT1RfRVZFTlRTX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShuZXh0KSk7XG59O1xuIiwgImRlY2xhcmUgY29uc3QgX19TRVJWRVJfQkFTRV9fOiBzdHJpbmc7XG5kZWNsYXJlIGNvbnN0IF9fQ0xJRU5UX1NFQ1JFVF9fOiBzdHJpbmc7XG5kZWNsYXJlIGNvbnN0IF9fVkVSU0lPTl9fOiBzdHJpbmc7XG5kZWNsYXJlIGNvbnN0IF9fUkVQT1JUSU5HX0VOQUJMRURfXzogYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9CQVNFID0gX19TRVJWRVJfQkFTRV9fO1xuZXhwb3J0IGNvbnN0IENMSUVOVF9TRUNSRVQgPSBfX0NMSUVOVF9TRUNSRVRfXztcbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gX19WRVJTSU9OX187XG5leHBvcnQgY29uc3QgUkVQT1JUSU5HX0VOQUJMRUQgPSBfX1JFUE9SVElOR19FTkFCTEVEX187XG4iLCAiLy8gSW5zdGFsbHMgdGhlIHNoYXJlZCB1c2VyLWlkIGhvb2sgYW5kIHJlcG9ydHMgY2xpZW50IGluaXQgdGVsZW1ldHJ5IHRvIHRoZVxuLy8gc2VydmVyIG9uY2UgcGVyIHVzZXJzY3JpcHQgbGlmZXRpbWUuIFVubGlrZSB0aGUgQ2hyb21lIGV4dGVuc2lvbiwgdGhlXG4vLyB1c2Vyc2NyaXB0IHJ1bnMgZW50aXJlbHkgaW4gdGhlIHBhZ2UncyBvd24gd29ybGQsIHNvIHRoZSBvYnNlcnZlZCB1c2VySWRcbi8vIGNhbiBiZSByZXBvcnRlZCBkaXJlY3RseSBcdTIwMTQgbm8gcG9zdE1lc3NhZ2UgcmVsYXkgaXMgbmVlZGVkLlxuXG5pbXBvcnQgeyBpbnN0YWxsVXNlcklkSG9vaywgbG9nSW5pdCwgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIkBzbmlmZmllcy1wcm9qZWN0cy9jb3JlXCI7XG5pbXBvcnQgeyBDTElFTlRfU0VDUkVULCBTRVJWRVJfQkFTRSwgVkVSU0lPTiB9IGZyb20gXCIuL3NoYXJlZC9lbnYuanNcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwidXNlci1pZC1sb2dnZXJcIik7XG5cbmV4cG9ydCBjb25zdCBpbnN0YWxsVXNlcklkTG9nZ2luZyA9IChvblVzZXJJZD86ICh1c2VySWQ6IHN0cmluZykgPT4gdm9pZCk6IGJvb2xlYW4gPT4ge1xuICBsZXQgaW5pdExvZ2dlZCA9IGZhbHNlO1xuICByZXR1cm4gaW5zdGFsbFVzZXJJZEhvb2soKHVzZXJJZCkgPT4ge1xuICAgIGxvZyhcInVzZXIgaWQgb2JzZXJ2ZWRcIiwgdXNlcklkKTtcbiAgICBvblVzZXJJZD8uKHVzZXJJZCk7XG4gICAgaWYgKGluaXRMb2dnZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5pdExvZ2dlZCA9IHRydWU7XG4gICAgdm9pZCBsb2dJbml0KHtcbiAgICAgIHNlcnZlckJhc2U6IFNFUlZFUl9CQVNFLFxuICAgICAgY2xpZW50U2VjcmV0OiBDTElFTlRfU0VDUkVULFxuICAgICAgdXNlcklkLFxuICAgICAgY2xpZW50VHlwZTogXCJ1c2Vyc2NyaXB0XCIsXG4gICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgIH0pO1xuICB9KTtcbn07XG4iLCAiLy8gV2lyZXMgdGhlIHJlcG9ydC1idXR0b24gaW5qZWN0aW9uIChjb3JlL3NyYy9yZXBvcnQtYnV0dG9uLWhvb2sudHMsIHNoYXJlZFxuLy8gdmVyYmF0aW0gd2l0aCB0aGUgQ2hyb21lIGNsaWVudCdzIHNyYy9jb250ZW50L3NuaWZmaWVzLXByb2ZpbGUtaWQudHMgXHUyMDE0IHNlZVxuLy8gdGhhdCBtb2R1bGUncyBoZWFkZXIgZm9yIHRoZSBwYW5lbC1zd2l0Y2gvZGVlcC1saW5rL25vLXBob3RvIHJhY2UgaGFuZGxpbmdcbi8vIGl0IGNvdmVycykgYW5kIHRoZSBib3QtYmxvY2tpbmcgbmV0d29yayBmaWx0ZXIuIFRoZSB1c2Vyc2NyaXB0IHJ1bnNcbi8vIGVudGlyZWx5IGluIHRoZSBwYWdlJ3Mgb3duIHdvcmxkIChubyBpc29sYXRlZC13b3JsZCByZWxheSBuZWVkZWQsIHNlZVxuLy8gdXNlci1pZC1sb2dnZXIudHMpLCBzbyBib3RoIGluc3RhbGwgZGlyZWN0bHkgaGVyZSByYXRoZXIgdGhhbiBuZWVkaW5nIGFcbi8vIHBvc3RNZXNzYWdlIGJyaWRnZS4gRmF2b3JpdGVzL3N0YXIgaW5qZWN0aW9uIGlzIGV4Y2x1ZGVkIFx1MjAxNCB0aGUgdXNlcnNjcmlwdFxuLy8gaGFzIG5vIGZhdm9yaXRlcyBmZWF0dXJlLlxuXG5pbXBvcnQge1xuICBpbnN0YWxsQm90QmxvY2tIb29rLFxuICBpbnN0YWxsUmVwb3J0QnV0dG9uSW5qZWN0aW9uLFxuICByZWZyZXNoQmxvY2tlZEJvdHNJZlN0YWxlIGFzIHJlZnJlc2hCbG9ja2VkQm90c0lmU3RhbGVTaGFyZWQsXG4gIHR5cGUgQm90QmxvY2tTdGF0ZSxcbn0gZnJvbSBcIkBzbmlmZmllcy1wcm9qZWN0cy9jb3JlXCI7XG5pbXBvcnQgeyBDTElFTlRfU0VDUkVULCBSRVBPUlRJTkdfRU5BQkxFRCwgU0VSVkVSX0JBU0UgfSBmcm9tIFwiLi9zaGFyZWQvZW52LmpzXCI7XG5pbXBvcnQge1xuICBnZXRCbG9ja2VkQm90cyxcbiAgZ2V0QmxvY2tlZEJvdHNGZXRjaGVkQXQsXG4gIGdldEJvdEJsb2NraW5nRW5hYmxlZCxcbiAgcmVjb3JkQmxvY2tlZEJvdEV2ZW50LFxuICBzZXRCbG9ja2VkQm90cyxcbn0gZnJvbSBcIi4vc2hhcmVkL3NldHRpbmdzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0RmVhdHVyZVN0YXRlIHtcbiAgY3VycmVudFNuaWZmaWVzVXNlcklkOiBzdHJpbmc7XG4gIGJvdEJsb2NrU3RhdGU6IEJvdEJsb2NrU3RhdGU7XG59XG5cbmNvbnN0IGNsaWVudEhlYWRlcnMgPSAoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiAoe1xuICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke0NMSUVOVF9TRUNSRVR9YCxcbn0pO1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBib3QtYmxvY2sgbmV0d29yayBob29rIChhbHdheXMsIG1pcnJvcmluZyB0aGUgQ2hyb21lIGNsaWVudCdzXG4gKiBNQUlOLXdvcmxkIGhvb2sgc2NyaXB0KSBhbmQsIGlmIFJFUE9SVElOR19FTkFCTEVELCB0aGUgcmVwb3J0LWJ1dHRvblxuICogaW5qZWN0aW9uIG1hY2hpbmVyeS4gUmV0dXJucyB0aGUgbXV0YWJsZSBzdGF0ZSBvYmplY3QgXHUyMDE0IHRoZSBjYWxsZXIgd2lyZXNcbiAqIGN1cnJlbnRTbmlmZmllc1VzZXJJZCBmcm9tIGluc3RhbGxVc2VySWRMb2dnaW5nJ3MgY2FsbGJhY2ssIGFuZCB0aGVcbiAqIGJvdC1ibG9jayBwYW5lbCBVSSByZWFkcy93cml0ZXMgYm90QmxvY2tTdGF0ZSBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbGxSZXBvcnRGZWF0dXJlID0gKCk6IFJlcG9ydEZlYXR1cmVTdGF0ZSA9PiB7XG4gIGNvbnN0IHN0YXRlOiBSZXBvcnRGZWF0dXJlU3RhdGUgPSB7XG4gICAgY3VycmVudFNuaWZmaWVzVXNlcklkOiBcIlwiLFxuICAgIGJvdEJsb2NrU3RhdGU6IHsgYmxvY2tlZElkczogbmV3IFNldChnZXRCbG9ja2VkQm90cygpKSwgZW5hYmxlZDogZ2V0Qm90QmxvY2tpbmdFbmFibGVkKCkgfSxcbiAgfTtcblxuICBpbnN0YWxsQm90QmxvY2tIb29rKFxuICAgICgpID0+IHN0YXRlLmJvdEJsb2NrU3RhdGUsXG4gICAgKGlkcykgPT4gcmVjb3JkQmxvY2tlZEJvdEV2ZW50KGlkcyksXG4gICk7XG5cbiAgaWYgKFJFUE9SVElOR19FTkFCTEVEKSB7XG4gICAgaW5zdGFsbFJlcG9ydEJ1dHRvbkluamVjdGlvbih7XG4gICAgICBzZXJ2ZXJCYXNlOiBTRVJWRVJfQkFTRSxcbiAgICAgIGdldEF1dGhIZWFkZXJzOiBjbGllbnRIZWFkZXJzLFxuICAgICAgcmVwb3J0aW5nRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGdldFJlcG9ydGVyVXNlcklkOiAoKSA9PiBzdGF0ZS5jdXJyZW50U25pZmZpZXNVc2VySWQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgcmVmcmVzaEJsb2NrZWRCb3RzSWZTdGFsZSA9IChzdGF0ZTogUmVwb3J0RmVhdHVyZVN0YXRlKTogdm9pZCA9PiB7XG4gIGlmICghUkVQT1JUSU5HX0VOQUJMRUQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVmcmVzaEJsb2NrZWRCb3RzSWZTdGFsZVNoYXJlZChcbiAgICBnZXRCbG9ja2VkQm90c0ZldGNoZWRBdCgpLFxuICAgIFNFUlZFUl9CQVNFLFxuICAgIGNsaWVudEhlYWRlcnMsXG4gICAgKHVzZXJJZHMsIGZldGNoZWRBdCkgPT4ge1xuICAgICAgc2V0QmxvY2tlZEJvdHModXNlcklkcywgZmV0Y2hlZEF0KTtcbiAgICAgIHN0YXRlLmJvdEJsb2NrU3RhdGUgPSB7IC4uLnN0YXRlLmJvdEJsb2NrU3RhdGUsIGJsb2NrZWRJZHM6IG5ldyBTZXQodXNlcklkcykgfTtcbiAgICB9LFxuICApO1xufTtcbiIsICIvLyBTbmlmZmllcyBUb29scyBcdTIwMTQgaU9TIHVzZXJzY3JpcHRcbi8vIEluc3RhbGwgdmlhIGEgdXNlcnNjcmlwdCBtYW5hZ2VyIGFwcCAoZS5nLiBVc2Vyc2NyaXB0cywgU3RheSkgdGhhdCBzdXBwb3J0c1xuLy8gdGhlID09VXNlclNjcmlwdD09IG1ldGFkYXRhIGZvcm1hdC4gVGhlIG1ldGFkYXRhIGhlYWRlciBpcyBwcmVwZW5kZWQgYnkgdGhlXG4vLyBidWlsZCBzY3JpcHQ7IHRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBydW50aW1lIGxvZ2ljLlxuXG5pbXBvcnQge1xuICBpbnN0YWxsR2VvSG9vayxcbiAgdHlwZSBHZW9PdmVycmlkZSxcbiAgREVGQVVMVF9HRU9fT1ZFUlJJREUsXG4gIEdFT19PVkVSUklERV9IVE1MLFxuICBHRU9fT1ZFUlJJREVfQ1NTLFxuICB3aXJlR2VvT3ZlcnJpZGVGb3JtLFxuICBWRVJTSU9OX0JBREdFX0NTUyxcbiAgd2lyZVZlcnNpb25CYWRnZSxcbiAgaW5zdGFsbFByb2ZpbGVCb3JkZXJSZWRpcmVjdCxcbiAgdHlwZSBQcm9maWxlQm9yZGVyT3BlbixcbiAgREVGQVVMVF9QUk9GSUxFX0JPUkRFUl9PUEVOLFxuICBQUk9GSUxFX0JPUkRFUl9IVE1MLFxuICBQUk9GSUxFX0JPUkRFUl9DU1MsXG4gIHdpcmVQcm9maWxlQm9yZGVyRm9ybSxcbiAgY3JlYXRlTG9nZ2VyLFxuICBTSVRFTElOS1NfTkFWX1NFTEVDVE9SLFxuICBjb3VudERpc3RpbmN0QmxvY2tlZEJvdHNMYXN0MjRoLFxuICBCT1RfQkxPQ0tfSFRNTCxcbiAgQk9UX0JMT0NLX0NTUyxcbiAgd2lyZUJvdEJsb2NrRm9ybSxcbn0gZnJvbSBcIkBzbmlmZmllcy1wcm9qZWN0cy9jb3JlXCI7XG5pbXBvcnQgUEFORUxfQ1NTIGZyb20gXCIuL3BhbmVsLmNzc1wiO1xuaW1wb3J0IFBBTkVMX0hUTUwgZnJvbSBcIi4vcGFuZWwuaHRtbFwiO1xuaW1wb3J0IHtcbiAgZ2V0R2VvT3ZlcnJpZGUsXG4gIHNldEdlb092ZXJyaWRlLFxuICBnZXRQcm9maWxlQm9yZGVyT3BlbixcbiAgc2V0UHJvZmlsZUJvcmRlck9wZW4sXG4gIGdldEJvdEJsb2NraW5nRW5hYmxlZCxcbiAgc2V0Qm90QmxvY2tpbmdFbmFibGVkLFxuICBnZXRCb3RCbG9ja2luZ1NlY3Rpb25PcGVuLFxuICBzZXRCb3RCbG9ja2luZ1NlY3Rpb25PcGVuLFxuICBnZXRCbG9ja2VkQm90RXZlbnRzQnlEYXksXG59IGZyb20gXCIuL3NoYXJlZC9zZXR0aW5ncy5qc1wiO1xuaW1wb3J0IHsgaW5zdGFsbFVzZXJJZExvZ2dpbmcgfSBmcm9tIFwiLi91c2VyLWlkLWxvZ2dlci5qc1wiO1xuaW1wb3J0IHsgaW5zdGFsbFJlcG9ydEZlYXR1cmUsIHJlZnJlc2hCbG9ja2VkQm90c0lmU3RhbGUsIHR5cGUgUmVwb3J0RmVhdHVyZVN0YXRlIH0gZnJvbSBcIi4vcmVwb3J0LmpzXCI7XG5pbXBvcnQgeyBSRVBPUlRJTkdfRU5BQkxFRCwgVkVSU0lPTiB9IGZyb20gXCIuL3NoYXJlZC9lbnYuanNcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwidG9vbHNcIik7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX19zbmlmZmllc0luamVjdGVkPzogYm9vbGVhbjtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgRkFCIG1vdW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5jb25zdCBtb3VudEZhYiA9IChmYWI6IEhUTUxCdXR0b25FbGVtZW50KTogdm9pZCA9PiB7XG4gIGNvbnN0IHRyeUluc2VydCA9ICgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBuYXZUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihTSVRFTElOS1NfTkFWX1NFTEVDVE9SKTtcbiAgICBpZiAobmF2VGFyZ2V0Py5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBuYXZUYXJnZXQucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoZmFiLCBuYXZUYXJnZXQubmV4dFNpYmxpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBpZiAodHJ5SW5zZXJ0KCkpIHJldHVybjtcblxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICBpZiAodHJ5SW5zZXJ0KCkpIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSk7XG4gIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG59O1xuXG4vLyBcdTI1MDBcdTI1MDAgSG9va3MgKHJ1bnMgYXQgZG9jdW1lbnQtc3RhcnQsIGJlZm9yZSBwYWdlIHNjcmlwdHMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5pbnRlcmZhY2UgSG9va1N0YXRlIHtcbiAgY3VycmVudE92ZXJyaWRlOiBHZW9PdmVycmlkZTtcbiAgaG9vazogUmV0dXJuVHlwZTx0eXBlb2YgaW5zdGFsbEdlb0hvb2s+O1xuICBuYXRpdmVHZXRDdXJyZW50UG9zaXRpb246IEdlb2xvY2F0aW9uW1wiZ2V0Q3VycmVudFBvc2l0aW9uXCJdO1xuICBzZW5kTG9jYXRpb25VcGRhdGU6IChvdmVycmlkZTogR2VvT3ZlcnJpZGUpID0+IHZvaWQ7XG4gIGN1cnJlbnRQcm9maWxlQm9yZGVyT3BlbjogUHJvZmlsZUJvcmRlck9wZW47XG4gIHVwZGF0ZVByb2ZpbGVCb3JkZXJPcGVuOiAobmV4dDogUHJvZmlsZUJvcmRlck9wZW4pID0+IHZvaWQ7XG4gIHJlcG9ydFN0YXRlOiBSZXBvcnRGZWF0dXJlU3RhdGU7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxIb29rcygpOiBIb29rU3RhdGUge1xuICBjb25zdCByZXBvcnRTdGF0ZSA9IGluc3RhbGxSZXBvcnRGZWF0dXJlKCk7XG4gIGluc3RhbGxVc2VySWRMb2dnaW5nKCh1c2VySWQpID0+IHtcbiAgICByZXBvcnRTdGF0ZS5jdXJyZW50U25pZmZpZXNVc2VySWQgPSB1c2VySWQ7XG4gIH0pO1xuICByZWZyZXNoQmxvY2tlZEJvdHNJZlN0YWxlKHJlcG9ydFN0YXRlKTtcblxuICBsZXQgY3VycmVudE92ZXJyaWRlOiBHZW9PdmVycmlkZSA9IGdldEdlb092ZXJyaWRlKCk7XG4gIGNvbnN0IGhvb2sgPSBpbnN0YWxsR2VvSG9vaygoKSA9PiBjdXJyZW50T3ZlcnJpZGUpO1xuICBjb25zdCBuYXRpdmVHZXRDdXJyZW50UG9zaXRpb24gPVxuICAgIGhvb2s/Lm5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbiA/P1xuICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24uYmluZChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pO1xuXG4gIGNvbnN0IG5hdGl2ZUZldGNoID0gd2luZG93LmZldGNoLmJpbmQod2luZG93KTtcbiAgbGV0IGxhc3RMb2NhdGlvblJlcXVlc3Q6IHsgdXJsOiBzdHJpbmc7IGluaXQ6IFJlcXVlc3RJbml0IH0gfCBudWxsID0gbnVsbDtcbiAgbGV0IGFwaUJhc2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNlbmRMb2NhdGlvblVwZGF0ZSA9IChvdmVycmlkZTogR2VvT3ZlcnJpZGUpOiB2b2lkID0+IHtcbiAgICBjb25zdCBzcG9vZmVkID0geyBsYXQ6IG92ZXJyaWRlLmxhdGl0dWRlLCBsbmc6IG92ZXJyaWRlLmxvbmdpdHVkZSB9O1xuICAgIGlmIChsYXN0TG9jYXRpb25SZXF1ZXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZSgobGFzdExvY2F0aW9uUmVxdWVzdC5pbml0LmJvZHkgYXMgc3RyaW5nKSA/PyBcInt9XCIpIGFzIFJlY29yZDxcbiAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgdW5rbm93blxuICAgICAgICA+O1xuICAgICAgICBib2R5LnZpcnR1YWxMb2NhdGlvbiA9IHNwb29mZWQ7XG4gICAgICAgIGJvZHkucGh5c2ljYWxMb2NhdGlvbiA9IHNwb29mZWQ7XG4gICAgICAgIHZvaWQgbmF0aXZlRmV0Y2gobGFzdExvY2F0aW9uUmVxdWVzdC51cmwsIHtcbiAgICAgICAgICAuLi5sYXN0TG9jYXRpb25SZXF1ZXN0LmluaXQsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHByb2FjdGl2ZSByZXF1ZXN0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcGlCYXNlKSB7XG4gICAgICB2b2lkIG5hdGl2ZUZldGNoKGAke2FwaUJhc2V9L2FwaS92aXNpdG9yL2N1cnJlbnQvbG9jYXRpb24/c3RhdGU9bG9hZGVkYCwge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdmlydHVhbExvY2F0aW9uOiBzcG9vZmVkLFxuICAgICAgICAgIHBoeXNpY2FsTG9jYXRpb246IHNwb29mZWQsXG4gICAgICAgICAgaG9tZURpc3RhbmNlSW5NaWxlczogbnVsbCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgd2luZG93LmZldGNoID0gYXN5bmMgKGlucHV0LCBpbml0KSA9PiB7XG4gICAgY29uc3QgdXJsID1cbiAgICAgIHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGlucHV0XG4gICAgICAgIDogaW5wdXQgaW5zdGFuY2VvZiBVUkxcbiAgICAgICAgICA/IGlucHV0LmhyZWZcbiAgICAgICAgICA6IChpbnB1dCBhcyBSZXF1ZXN0KS51cmw7XG4gICAgY29uc3QgYmFzZU1hdGNoID0gdXJsLm1hdGNoKC9eKGh0dHBzPzpcXC9cXC9bXi9dKnNuaWZmaWVzXFwuY29tKS8pO1xuICAgIGlmIChiYXNlTWF0Y2ggJiYgIWFwaUJhc2UpIHtcbiAgICAgIGFwaUJhc2UgPSBiYXNlTWF0Y2hbMV0gPz8gbnVsbDtcbiAgICB9XG4gICAgaWYgKHVybC5pbmNsdWRlcyhcIi9hcGkvdmlzaXRvci9jdXJyZW50L2xvY2F0aW9uXCIpKSB7XG4gICAgICBsYXN0TG9jYXRpb25SZXF1ZXN0ID0geyB1cmwsIGluaXQ6IHsgLi4uaW5pdCB9IH07XG4gICAgICBpZiAoY3VycmVudE92ZXJyaWRlLmVuYWJsZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZSgoaW5pdD8uYm9keSBhcyBzdHJpbmcpID8/IFwie31cIikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgY29uc3Qgc3Bvb2ZlZCA9IHsgbGF0OiBjdXJyZW50T3ZlcnJpZGUubGF0aXR1ZGUsIGxuZzogY3VycmVudE92ZXJyaWRlLmxvbmdpdHVkZSB9O1xuICAgICAgICAgIGJvZHkudmlydHVhbExvY2F0aW9uID0gc3Bvb2ZlZDtcbiAgICAgICAgICBib2R5LnBoeXNpY2FsTG9jYXRpb24gPSBzcG9vZmVkO1xuICAgICAgICAgIGluaXQgPSB7IC4uLmluaXQsIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpIH07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGxlYXZlIHVubW9kaWZpZWQgaWYgcGFyc2luZyBmYWlsc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVGZXRjaChpbnB1dCwgaW5pdCk7XG4gIH07XG5cbiAgbGV0IGN1cnJlbnRQcm9maWxlQm9yZGVyT3BlbjogUHJvZmlsZUJvcmRlck9wZW4gPSBnZXRQcm9maWxlQm9yZGVyT3BlbigpO1xuICBpbnN0YWxsUHJvZmlsZUJvcmRlclJlZGlyZWN0KCgpID0+IGN1cnJlbnRQcm9maWxlQm9yZGVyT3Blbik7XG4gIGNvbnN0IHVwZGF0ZVByb2ZpbGVCb3JkZXJPcGVuID0gKG5leHQ6IFByb2ZpbGVCb3JkZXJPcGVuKTogdm9pZCA9PiB7XG4gICAgY3VycmVudFByb2ZpbGVCb3JkZXJPcGVuID0gbmV4dDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnRPdmVycmlkZSxcbiAgICBob29rLFxuICAgIG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbixcbiAgICBzZW5kTG9jYXRpb25VcGRhdGUsXG4gICAgY3VycmVudFByb2ZpbGVCb3JkZXJPcGVuLFxuICAgIHVwZGF0ZVByb2ZpbGVCb3JkZXJPcGVuLFxuICAgIHJlcG9ydFN0YXRlLFxuICB9O1xufVxuXG4vLyBcdTI1MDBcdTI1MDAgVUkgKHJ1bnMgYWZ0ZXIgRE9NQ29udGVudExvYWRlZCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudFVJKHN0YXRlOiBIb29rU3RhdGUgfCBudWxsKTogdm9pZCB7XG4gIGNvbnN0IGhvb2sgPSBzdGF0ZT8uaG9vayA/PyBudWxsO1xuICBjb25zdCBuYXRpdmVHZXRDdXJyZW50UG9zaXRpb24gPVxuICAgIHN0YXRlPy5uYXRpdmVHZXRDdXJyZW50UG9zaXRpb24gPz9cbiAgICAoKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2VvbG9jYXRpb24gdW5hdmFpbGFibGVcIik7XG4gICAgfSk7XG4gIGNvbnN0IHNlbmRMb2NhdGlvblVwZGF0ZSA9IHN0YXRlPy5zZW5kTG9jYXRpb25VcGRhdGUgPz8gKCgpID0+IHt9KTtcbiAgbGV0IGN1cnJlbnRPdmVycmlkZSA9IHN0YXRlPy5jdXJyZW50T3ZlcnJpZGUgPz8geyAuLi5ERUZBVUxUX0dFT19PVkVSUklERSB9O1xuICBjb25zdCB1cGRhdGVQcm9maWxlQm9yZGVyT3BlbiA9IHN0YXRlPy51cGRhdGVQcm9maWxlQm9yZGVyT3BlbiA/PyAoKCkgPT4ge30pO1xuICBjb25zdCBjdXJyZW50UHJvZmlsZUJvcmRlck9wZW4gPSBzdGF0ZT8uY3VycmVudFByb2ZpbGVCb3JkZXJPcGVuID8/IHtcbiAgICAuLi5ERUZBVUxUX1BST0ZJTEVfQk9SREVSX09QRU4sXG4gIH07XG4gIGNvbnN0IHJlcG9ydFN0YXRlID0gc3RhdGU/LnJlcG9ydFN0YXRlID8/IHtcbiAgICBjdXJyZW50U25pZmZpZXNVc2VySWQ6IFwiXCIsXG4gICAgYm90QmxvY2tTdGF0ZTogeyBibG9ja2VkSWRzOiBuZXcgU2V0PHN0cmluZz4oKSwgZW5hYmxlZDogdHJ1ZSB9LFxuICB9O1xuXG4gIGNvbnN0IHNoZWxsU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIHNoZWxsU3R5bGUudGV4dENvbnRlbnQgPSBQQU5FTF9DU1M7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2hlbGxTdHlsZSk7XG5cbiAgY29uc3QgZ2VvU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIGdlb1N0eWxlLnRleHRDb250ZW50ID0gR0VPX09WRVJSSURFX0NTUztcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChnZW9TdHlsZSk7XG5cbiAgY29uc3QgcHJvZmlsZUJvcmRlclN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBwcm9maWxlQm9yZGVyU3R5bGUudGV4dENvbnRlbnQgPSBQUk9GSUxFX0JPUkRFUl9DU1M7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocHJvZmlsZUJvcmRlclN0eWxlKTtcblxuICBjb25zdCBib3RCbG9ja1N0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBib3RCbG9ja1N0eWxlLnRleHRDb250ZW50ID0gQk9UX0JMT0NLX0NTUztcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChib3RCbG9ja1N0eWxlKTtcblxuICBjb25zdCB2ZXJzaW9uU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIHZlcnNpb25TdHlsZS50ZXh0Q29udGVudCA9IFZFUlNJT05fQkFER0VfQ1NTO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHZlcnNpb25TdHlsZSk7XG5cbiAgY29uc3QgZmFiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgZmFiLmlkID0gXCJzbnAtZmFiXCI7XG4gIGZhYi50aXRsZSA9IFwiU25pZmZpZXMgVG9vbHNcIjtcbiAgZmFiLnRleHRDb250ZW50ID0gXCJcdUQ4M0RcdURDQ0RcIjtcbiAgbW91bnRGYWIoZmFiKTtcblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHBhbmVsLmlkID0gXCJzbnAtcGFuZWxcIjtcbiAgcGFuZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICBwYW5lbC5pbm5lckhUTUwgPSBQQU5FTF9IVE1MO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhbmVsKTtcblxuICB3aXJlVmVyc2lvbkJhZGdlKHBhbmVsLCBWRVJTSU9OKTtcblxuICBjb25zdCBnZW9Sb290ID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIjc25wLWdlby1yb290XCIpITtcbiAgZ2VvUm9vdC5pbm5lckhUTUwgPSBHRU9fT1ZFUlJJREVfSFRNTDtcblxuICB3aXJlR2VvT3ZlcnJpZGVGb3JtKGdlb1Jvb3QsIHtcbiAgICBpbml0aWFsOiBjdXJyZW50T3ZlcnJpZGUsXG4gICAgb25TYXZlOiAobmV4dCkgPT4ge1xuICAgICAgc2V0R2VvT3ZlcnJpZGUobmV4dCk7XG4gICAgICBjdXJyZW50T3ZlcnJpZGUgPSBuZXh0O1xuICAgICAgaG9vaz8ucmVmcmVzaFdhdGNoZXMoKTtcbiAgICAgIGlmIChuZXh0LmVuYWJsZWQpIHtcbiAgICAgICAgc2VuZExvY2F0aW9uVXBkYXRlKG5leHQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0TmF0aXZlUG9zaXRpb246IG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbixcbiAgICBpbml0aWFsT3BlbjogZmFsc2UsXG4gICAgb25Ub2dnbGU6ICgpID0+IHt9LFxuICB9KTtcblxuICBjb25zdCBwcm9maWxlQm9yZGVyUm9vdCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiI3NucC1wcm9maWxlLWJvcmRlci1yb290XCIpITtcbiAgcHJvZmlsZUJvcmRlclJvb3QuaW5uZXJIVE1MID0gUFJPRklMRV9CT1JERVJfSFRNTDtcblxuICB3aXJlUHJvZmlsZUJvcmRlckZvcm0ocHJvZmlsZUJvcmRlclJvb3QsIHtcbiAgICBpbml0aWFsOiBjdXJyZW50UHJvZmlsZUJvcmRlck9wZW4sXG4gICAgb25TYXZlOiAobmV4dCkgPT4ge1xuICAgICAgc2V0UHJvZmlsZUJvcmRlck9wZW4obmV4dCk7XG4gICAgICB1cGRhdGVQcm9maWxlQm9yZGVyT3BlbihuZXh0KTtcbiAgICB9LFxuICAgIGluaXRpYWxPcGVuOiBmYWxzZSxcbiAgICBvblRvZ2dsZTogKCkgPT4ge30sXG4gIH0pO1xuXG4gIGNvbnN0IGJvdEJsb2NrUm9vdCA9IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiI3NucC1ib3QtYmxvY2stcm9vdFwiKSE7XG4gIGJvdEJsb2NrUm9vdC5pbm5lckhUTUwgPSBCT1RfQkxPQ0tfSFRNTDtcblxuICB3aXJlQm90QmxvY2tGb3JtKGJvdEJsb2NrUm9vdCwge1xuICAgIHJlcG9ydGluZ0VuYWJsZWQ6IFJFUE9SVElOR19FTkFCTEVELFxuICAgIGluaXRpYWxFbmFibGVkOiBnZXRCb3RCbG9ja2luZ0VuYWJsZWQoKSxcbiAgICBpbml0aWFsQ291bnQ6IGNvdW50RGlzdGluY3RCbG9ja2VkQm90c0xhc3QyNGgoZ2V0QmxvY2tlZEJvdEV2ZW50c0J5RGF5KCkpLFxuICAgIGluaXRpYWxPcGVuOiBnZXRCb3RCbG9ja2luZ1NlY3Rpb25PcGVuKCksXG4gICAgb25Ub2dnbGU6IHNldEJvdEJsb2NraW5nU2VjdGlvbk9wZW4sXG4gICAgb25Ub2dnbGVFbmFibGVkOiAoZW5hYmxlZCkgPT4ge1xuICAgICAgc2V0Qm90QmxvY2tpbmdFbmFibGVkKGVuYWJsZWQpO1xuICAgICAgcmVwb3J0U3RhdGUuYm90QmxvY2tTdGF0ZSA9IHsgLi4ucmVwb3J0U3RhdGUuYm90QmxvY2tTdGF0ZSwgZW5hYmxlZCB9O1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGNsb3NlQnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oXCIjc25wLWNsb3NlXCIpITtcbiAgZmFiLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgcGFuZWwuc3R5bGUuZGlzcGxheSA9IHBhbmVsLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJmbGV4XCIgOiBcIm5vbmVcIjtcbiAgfSk7XG4gIGNsb3NlQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgcGFuZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICB9KTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIEVudHJ5IHBvaW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gTXVzdCBydW4gYWZ0ZXIgYWxsIGNvbnN0IGRlY2xhcmF0aW9ucyBhYm92ZSBhcmUgaW5pdGlhbGl6ZWQuXG5cbmlmICh3aW5kb3cuX19zbmlmZmllc0luamVjdGVkKSB7XG4gIC8vIEFscmVhZHkgaW5zdGFsbGVkIFx1MjAxNCBub3RoaW5nIHRvIGRvLlxufSBlbHNlIHtcbiAgd2luZG93Ll9fc25pZmZpZXNJbmplY3RlZCA9IHRydWU7XG4gIGxldCBob29rU3RhdGU6IEhvb2tTdGF0ZSB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIGhvb2tTdGF0ZSA9IGluc3RhbGxIb29rcygpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3IoXCJob29rIGluc3RhbGwgZmFpbGVkOlwiLCBlcnIpO1xuICB9XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImxvYWRpbmdcIikge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IG1vdW50VUkoaG9va1N0YXRlKSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9IGVsc2Uge1xuICAgIG1vdW50VUkoaG9va1N0YXRlKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIm1CQWVPLElBQU1BLEdBQWFDLEdBQXlCLGFBQWFBLENBQUksSUFFdkRDLEVBQWdCRCxHQUF5QixDQUNwRCxJQUFNRSxFQUFNSCxHQUFVQyxDQUFJLEVBQ3BCRyxHQUFPLElBQUlDLElBQTBCLENBSTNDLEdBQ0EsT0FBQUQsRUFBSSxLQUFPLElBQUlDLElBQTBCLENBQ3ZDLFFBQVEsS0FBS0YsRUFBSyxHQUFHRSxDQUFJLENBQzNCLEVBQ0FELEVBQUksTUFBUSxJQUFJQyxJQUEwQixDQUN4QyxRQUFRLE1BQU1GLEVBQUssR0FBR0UsQ0FBSSxDQUM1QixFQUNPRCxDQUNULEVDVk8sSUFB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SixDQUNMLE9BQU8sbUJBQXFCLEdBQzVCLElBQUlrQixFQUE4QixLQUNsQyxHQUFJLENBQ0ZBLEVBQVkzRCxHQUFhLENBQzNCLE9BQVM0RCxFQUFLLENBQ1pwRSxHQUFJLE1BQU0sdUJBQXdCb0UsQ0FBRyxDQUN2QyxDQUNJLFNBQVMsYUFBZSxVQUMxQixTQUFTLGlCQUFpQixtQkFBb0IsSUFBTWxDLEdBQVFpQyxDQUFTLEVBQUcsQ0FBRSxLQUFNLEVBQUssQ0FBQyxFQUV0RmpDLEdBQVFpQyxDQUFTLENBRXJCIiwKICAibmFtZXMiOiBbImZvcm1hdFRhZyIsICJuYW1lIiwgImNyZWF0ZUxvZ2dlciIsICJ0YWciLCAibG9nIiwgImFyZ3MiLCAiaW5zdGFsbEdlb0hvb2siLCAiZ2V0T3ZlcnJpZGUiLCAib25Qb3NpdGlvbiIsICJsb2ciLCAiY3JlYXRlTG9nZ2VyIiwgImdlbyIsICJuYXRpdmVHZXRDdXJyZW50UG9zaXRpb24iLCAibmF0aXZlV2F0Y2hQb3NpdGlvbiIsICJuYXRpdmVDbGVhcldhdGNoIiwgImFjdGl2ZVdhdGNoZXJzIiwgImFwcGx5T3ZlcnJpZGUiLCAicG9zaXRpb24iLCAib3YiLCAic3Bvb2ZlZCIsICJ3cmFwU3VjY2VzcyIsICJjYWxsYmFjayIsICJzdWNjZXNzIiwgImVycm9yIiwgIm9wdGlvbnMiLCAid3JhcHBlZCIsICJpZCIsICJyZWZyZXNoV2F0Y2hlcyIsICJwb3MiLCAiY2IiLCAiV1NfSE9TVCIsICJleHRyYWN0VXNlcklkIiwgInVybCIsICJwYXJzZWQiLCAiaW5zdGFsbFVzZXJJZEhvb2siLCAib25Vc2VySWQiLCAibG9nIiwgImNyZWF0ZUxvZ2dlciIsICJOYXRpdmVXZWJTb2NrZXQiLCAiUGF0Y2hlZFdlYlNvY2tldCIsICJwcm90b2NvbHMiLCAidXNlcklkIiwgIlBPU1RfQVVUSF9QQVRIIiwgIkNIQVRfREFUQV9QQVRIIiwgIk1FU1NBR0VTX1BBVEgiLCAiV1NfSE9TVCIsICJmaWx0ZXJCeUlkIiwgIml0ZW1zIiwgImJsb2NrZWRJZHMiLCAicmVtb3ZlZCIsICJpdGVtIiwgImZpbHRlclBvc3RBdXRoZW50aWNhdGlvblBheWxvYWQiLCAicGF5bG9hZCIsICJmaWx0ZXJDaGF0RGF0YVBheWxvYWQiLCAiaXNCbG9ja2VkQ29udmVyc2F0aW9uIiwgImMiLCAiYmxvY2tlZCIsICJpZCIsICJmaWx0ZXJNZXNzYWdlc1BheWxvYWQiLCAibSIsICJhcHBseUZpbHRlciIsICJraW5kIiwgInBhcnNlV3NGcmFtZSIsICJyYXciLCAib2JqIiwgImF1dGhvciIsICJpc1NuaWZmaWVzQXBpSG9zdCIsICJob3N0IiwgImNsYXNzaWZ5WGhyVXJsIiwgInVybCIsICJwYXJzZWQiLCAiUE9TVF9BVVRIX1BBVEgiLCAiQ0hBVF9EQVRBX1BBVEgiLCAiTUVTU0FHRVNfUEFUSCIsICJpbnN0YWxsWGhyRmlsdGVyIiwgImdldFN0YXRlIiwgIm9uRmlsdGVyZWQiLCAibG9nIiwgInByb3RvIiwgIm5hdGl2ZU9wZW4iLCAibmF0aXZlU2VuZCIsICJyZXNwb25zZVRleHREZXNjcmlwdG9yIiwgInJlc3BvbnNlRGVzY3JpcHRvciIsICJtZXRob2QiLCAicmVzdCIsICJhcmdzIiwgImtpbmQiLCAicmVzcG9uc2VUeXBlIiwgImNhY2hlZCIsICJjb21wdXRlIiwgInN0YXRlIiwgInNob3VsZEZpbHRlciIsICJqc29uIiwgInRleHQiLCAicmVtb3ZlZCIsICJhcHBseUZpbHRlciIsICJtYXRjaGVkSWRzIiwgImlzV3NUYXJnZXRIb3N0IiwgIldTX0hPU1QiLCAicGF0Y2hTb2NrZXRJbnN0YW5jZSIsICJzb2NrZXQiLCAibmF0aXZlT25NZXNzYWdlRGVzY3JpcHRvciIsICJzaG91bGRTdXBwcmVzcyIsICJldmVudCIsICJmcmFtZSIsICJwYXJzZVdzRnJhbWUiLCAibmF0aXZlQWRkRXZlbnRMaXN0ZW5lciIsICJuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyIiwgIndyYXBwZWRMaXN0ZW5lcnMiLCAid3JhcCIsICJsaXN0ZW5lciIsICJleGlzdGluZyIsICJoYW5kbGUiLCAid3JhcHBlZCIsICJ0eXBlIiwgIm9wdGlvbnMiLCAiY3VycmVudEhhbmRsZXIiLCAiaGFuZGxlciIsICJpbnN0YWxsV2ViU29ja2V0RmlsdGVyIiwgIk5hdGl2ZVdlYlNvY2tldCIsICJQYXRjaGVkV2ViU29ja2V0IiwgInByb3RvY29scyIsICJpbnN0YWxsQm90QmxvY2tIb29rIiwgImNyZWF0ZUxvZ2dlciIsICJkYXRlS2V5Rm9yIiwgImRhdGUiLCAieWVzdGVyZGF5T2YiLCAicmVjb3JkQmxvY2tlZEJvdElkcyIsICJsb2ciLCAiaWRzIiwgIm5vdyIsICJ0b2RheUtleSIsICJ5ZXN0ZXJkYXlLZXkiLCAidG9kYXkiLCAibmV4dCIsICJjb3VudERpc3RpbmN0QmxvY2tlZEJvdHNMYXN0MjRoIiwgIlNOSUZGSUVTX1NFTEVDVE9SUyIsICJNQVJLRVJfQ09OVEFJTkVSX1NFTEVDVE9SIiwgIk1BUktFUl9BVkFUQVJfU0VMRUNUT1IiLCAiQVBQX1NDUkVFTl9TRUxFQ1RPUiIsICJOQU1FX0xBQkVMX1NFTEVDVE9SIiwgIlBJTl9CVVRUT05fU0VMRUNUT1IiLCAiU0lURUxJTktTX05BVl9TRUxFQ1RPUiIsICJpbnN0YWxsUHJvZmlsZUJvcmRlclJlZGlyZWN0IiwgImdldFNldHRpbmdzIiwgImxvZyIsICJjcmVhdGVMb2dnZXIiLCAiaGFuZGxlciIsICJldmVudCIsICJzZXR0aW5ncyIsICJ0YXJnZXQiLCAiY29udGFpbmVyIiwgIk1BUktFUl9DT05UQUlORVJfU0VMRUNUT1IiLCAidXJsIiwgImxvZ0luaXQiLCAib3B0aW9ucyIsICJsb2ciLCAiY3JlYXRlTG9nZ2VyIiwgInNlcnZlckJhc2UiLCAiY2xpZW50U2VjcmV0IiwgInVzZXJJZCIsICJjbGllbnRUeXBlIiwgInZlcnNpb24iLCAiYmFzZSIsICJyZXMiLCAiZXJyIiwgImdlb19vdmVycmlkZV9kZWZhdWx0IiwgImdlb19vdmVycmlkZV9kZWZhdWx0IiwgIndpcmVHZW9PdmVycmlkZUZvcm0iLCAiY29udGFpbmVyIiwgIm9wdGlvbnMiLCAiZWwiLCAiaWQiLCAiZGV0YWlscyIsICJnZW9FbmFibGVkIiwgImdlb0ZpZWxkcyIsICJnZW9MYXQiLCAiZ2VvTG5nIiwgImZpbGxDdXJyZW50IiwgInNhdmVCdG4iLCAic3RhdHVzRWwiLCAic2V0U3RhdHVzIiwgInRleHQiLCAicmVhZEZvcm0iLCAicGVuZGluZ0ZldGNoIiwgImZpbGxXaXRoQ3VycmVudFBvc2l0aW9uIiwgIm9uU3VjY2VzcyIsICJvbkVycm9yIiwgInRva2VuIiwgInBvcyIsICJ1cGRhdGVTYXZlVmlzaWJpbGl0eSIsICJlcnIiLCAiaW5pdGlhbCIsICJsYXN0U2F2ZWQiLCAiZm9ybU1hdGNoZXNTYXZlZCIsICJmb3JtIiwgImhhc0Nvb3JkcyIsICJjb21taXRTYXZlIiwgImZpZWxkIiwgInZlcnNpb25fYmFkZ2VfZGVmYXVsdCIsICJ3aXJlVmVyc2lvbkJhZGdlIiwgImNvbnRhaW5lciIsICJ2ZXJzaW9uIiwgImVsIiwgInJlcG9ydF9tb2RhbF9kZWZhdWx0IiwgInJlcG9ydF9tb2RhbF9kZWZhdWx0IiwgIndpcmVSZXBvcnRNb2RhbCIsICJjb250YWluZXIiLCAib3B0aW9ucyIsICJlbCIsICJpZCIsICJiYWNrZHJvcCIsICJtZXNzYWdlRmllbGQiLCAic3RhdHVzRWwiLCAiY2FuY2VsQnRuIiwgInN1Ym1pdEJ0biIsICJzZXRTdGF0dXMiLCAidGV4dCIsICJnZW5lcmF0aW9uIiwgImNsb3NlIiwgIm9wZW4iLCAiZXZlbnQiLCAic3VibWl0dGVkR2VuZXJhdGlvbiIsICJsb2ciLCAiY3JlYXRlTG9nZ2VyIiwgIlJFUE9SVF9JTkpFQ1RFRF9BVFRSIiwgIlJFUE9SVF9NT0RBTF9ST09UX0lEIiwgIkNMSUNLX1JFSU5KRUNUX1JFVFJZX1dJTkRPV19NUyIsICJDTElDS19SRUlOSkVDVF9SRVRSWV9JTlRFUlZBTF9NUyIsICJJTklUSUFMX0xPQURfUkVJTkpFQ1RfUkVUUllfV0lORE9XX01TIiwgIklOSVRJQUxfTE9BRF9SRUlOSkVDVF9SRVRSWV9JTlRFUlZBTF9NUyIsICJleHRyYWN0VXNlcklkRnJvbVVybCIsICJ1cmwiLCAiZmlyc3QiLCAiZXh0cmFjdFVzZXJJZEZyb21Qcm9maWxlUGF0aCIsICJwYXRobmFtZSIsICJzZWdtZW50cyIsICJpZCIsICJleHRyYWN0RnJvbU1hcmtlciIsICJlbCIsICJiZyIsICJyYXdVcmwiLCAidXNlcklkIiwgImluc3RhbGxSZXBvcnRCdXR0b25JbmplY3Rpb24iLCAib3B0aW9ucyIsICJsYXN0VXNlcklkIiwgInNlbGVjdGlvbkdlbmVyYXRpb24iLCAicmVwb3J0TW9kYWwiLCAicmVwb3J0VGFyZ2V0IiwgInN1Ym1pdFJlcG9ydCIsICJyZXBvcnRlZFVzZXJJZCIsICJtZXNzYWdlIiwgInJlcyIsICJlbnN1cmVSZXBvcnRNb2RhbCIsICJzdHlsZSIsICJyZXBvcnRfbW9kYWxfZGVmYXVsdCIsICJyb290IiwgIndpcmVSZXBvcnRNb2RhbCIsICJidWlsZFJlcG9ydEJ1dHRvbiIsICJidG4iLCAiZXZlbnQiLCAiaW5qZWN0UmVwb3J0QnV0dG9uIiwgInNjcmVlbiIsICJjb250cm9sc0NvbnRhaW5lciIsICJQSU5fQlVUVE9OX1NFTEVDVE9SIiwgImV4aXN0aW5nIiwgInRyeUluamVjdEludG9TY3JlZW4iLCAidXJsVXNlcklkIiwgInNjaGVkdWxlUmVpbmplY3Rpb25SZXRyaWVzIiwgImdlbmVyYXRpb24iLCAid2luZG93TXMiLCAiaW50ZXJ2YWxNcyIsICJkZWFkbGluZSIsICJhdHRlbXB0IiwgIkFQUF9TQ1JFRU5fU0VMRUNUT1IiLCAidHJpZ2dlckluamVjdGlvbiIsICJvYnNlcnZlciIsICJtdXRhdGlvbnMiLCAibSIsICJub2RlIiwgIm1hdGNoZXNOYW1lTGFiZWwiLCAiTkFNRV9MQUJFTF9TRUxFQ1RPUiIsICJtYXRjaGVzUGluQnV0dG9uIiwgInN0YXJ0T2JzZXJ2aW5nIiwgInRhcmdldCIsICJtYXJrZXIiLCAiTUFSS0VSX0FWQVRBUl9TRUxFQ1RPUiIsICJzZWxlY3Rpb24iLCAiaW5pdGlhbFByb2ZpbGVVc2VySWQiLCAiZmV0Y2hCbG9ja2VkQm90cyIsICJzZXJ2ZXJCYXNlIiwgImdldEF1dGhIZWFkZXJzIiwgIm9uUmVzdWx0IiwgImRhdGEiLCAiZXJyIiwgIkJMT0NLRURfQk9UU19NQVhfQUdFX01TIiwgInJlZnJlc2hCbG9ja2VkQm90c0lmU3RhbGUiLCAiYmxvY2tlZEJvdHNGZXRjaGVkQXQiLCAicHJvZmlsZV9ib3JkZXJfZGVmYXVsdCIsICJwcm9maWxlX2JvcmRlcl9kZWZhdWx0IiwgIlRBQl9MQUJFTFMiLCAid2lyZVByb2ZpbGVCb3JkZXJGb3JtIiwgImNvbnRhaW5lciIsICJvcHRpb25zIiwgImVsIiwgImlkIiwgImRldGFpbHMiLCAiZW5hYmxlZENoZWNrYm94IiwgInRhYkZpZWxkIiwgInRhYlNlbGVjdCIsICJvcHRpb25DdXJyZW50IiwgIm9wdGlvbk5ldyIsICJzYXZlQnRuIiwgImFwcGx5TGFiZWxzIiwgIm9wZW5Jbk5ld1RhYiIsICJyZWFkRm9ybSIsICJpbml0aWFsIiwgInNhdmVkT3BlbkluTmV3VGFiIiwgImlzQ2hhbmdlZCIsICJuZXh0IiwgImJvdF9ibG9ja19kZWZhdWx0IiwgImJvdF9ibG9ja19kZWZhdWx0IiwgIndpcmVCb3RCbG9ja0Zvcm0iLCAiY29udGFpbmVyIiwgIm9wdGlvbnMiLCAiZWwiLCAiaWQiLCAiZGV0YWlscyIsICJjb3VudEVsIiwgImhpbnRFbCIsICJlbmFibGVkQ2hlY2tib3giLCAiZW5hYmxlTGFiZWwiLCAiREVGQVVMVF9HRU9fT1ZFUlJJREUiLCAiREVGQVVMVF9QUk9GSUxFX0JPUkRFUl9PUEVOIiwgInBhbmVsX2RlZmF1bHQiLCAicGFuZWxfZGVmYXVsdCIsICJHRU9fU1RPUkFHRV9LRVkiLCAiUFJPRklMRV9CT1JERVJfU1RPUkFHRV9LRVkiLCAiQkxPQ0tFRF9CT1RTX1NUT1JBR0VfS0VZIiwgIkJMT0NLRURfQk9UU19GRVRDSEVEX0FUX1NUT1JBR0VfS0VZIiwgIkJPVF9CTE9DS0lOR19FTkFCTEVEX1NUT1JBR0VfS0VZIiwgIkJPVF9CTE9DS0lOR19TRUNUSU9OX09QRU5fU1RPUkFHRV9LRVkiLCAiQkxPQ0tFRF9CT1RfRVZFTlRTX1NUT1JBR0VfS0VZIiwgImdldEdlb092ZXJyaWRlIiwgInJhdyIsICJERUZBVUxUX0dFT19PVkVSUklERSIsICJzZXRHZW9PdmVycmlkZSIsICJuZXh0IiwgImdldFByb2ZpbGVCb3JkZXJPcGVuIiwgIkRFRkFVTFRfUFJPRklMRV9CT1JERVJfT1BFTiIsICJzZXRQcm9maWxlQm9yZGVyT3BlbiIsICJnZXRCbG9ja2VkQm90cyIsICJwYXJzZWQiLCAiaWQiLCAiZ2V0QmxvY2tlZEJvdHNGZXRjaGVkQXQiLCAic2V0QmxvY2tlZEJvdHMiLCAidXNlcklkcyIsICJmZXRjaGVkQXQiLCAiZ2V0Qm90QmxvY2tpbmdFbmFibGVkIiwgInNldEJvdEJsb2NraW5nRW5hYmxlZCIsICJlbmFibGVkIiwgImdldEJvdEJsb2NraW5nU2VjdGlvbk9wZW4iLCAic2V0Qm90QmxvY2tpbmdTZWN0aW9uT3BlbiIsICJvcGVuIiwgImdldEJsb2NrZWRCb3RFdmVudHNCeURheSIsICJyZWNvcmRCbG9ja2VkQm90RXZlbnQiLCAiaWRzIiwgInJlY29yZEJsb2NrZWRCb3RJZHMiLCAiU0VSVkVSX0JBU0UiLCAiQ0xJRU5UX1NFQ1JFVCIsICJsb2ciLCAiY3JlYXRlTG9nZ2VyIiwgImluc3RhbGxVc2VySWRMb2dnaW5nIiwgIm9uVXNlcklkIiwgImluaXRMb2dnZWQiLCAiaW5zdGFsbFVzZXJJZEhvb2siLCAidXNlcklkIiwgImxvZ0luaXQiLCAiU0VSVkVSX0JBU0UiLCAiQ0xJRU5UX1NFQ1JFVCIsICJjbGllbnRIZWFkZXJzIiwgIkNMSUVOVF9TRUNSRVQiLCAiaW5zdGFsbFJlcG9ydEZlYXR1cmUiLCAic3RhdGUiLCAiZ2V0QmxvY2tlZEJvdHMiLCAiZ2V0Qm90QmxvY2tpbmdFbmFibGVkIiwgImluc3RhbGxCb3RCbG9ja0hvb2siLCAiaWRzIiwgInJlY29yZEJsb2NrZWRCb3RFdmVudCIsICJyZWZyZXNoQmxvY2tlZEJvdHNJZlN0YWxlIiwgImxvZyIsICJjcmVhdGVMb2dnZXIiLCAibW91bnRGYWIiLCAiZmFiIiwgInRyeUluc2VydCIsICJuYXZUYXJnZXQiLCAiU0lURUxJTktTX05BVl9TRUxFQ1RPUiIsICJvYnNlcnZlciIsICJpbnN0YWxsSG9va3MiLCAicmVwb3J0U3RhdGUiLCAiaW5zdGFsbFJlcG9ydEZlYXR1cmUiLCAiaW5zdGFsbFVzZXJJZExvZ2dpbmciLCAidXNlcklkIiwgInJlZnJlc2hCbG9ja2VkQm90c0lmU3RhbGUiLCAiY3VycmVudE92ZXJyaWRlIiwgImdldEdlb092ZXJyaWRlIiwgImhvb2siLCAiaW5zdGFsbEdlb0hvb2siLCAibmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uIiwgIm5hdGl2ZUZldGNoIiwgImxhc3RMb2NhdGlvblJlcXVlc3QiLCAiYXBpQmFzZSIsICJzZW5kTG9jYXRpb25VcGRhdGUiLCAib3ZlcnJpZGUiLCAic3Bvb2ZlZCIsICJib2R5IiwgImlucHV0IiwgImluaXQiLCAidXJsIiwgImJhc2VNYXRjaCIsICJjdXJyZW50UHJvZmlsZUJvcmRlck9wZW4iLCAiZ2V0UHJvZmlsZUJvcmRlck9wZW4iLCAiaW5zdGFsbFByb2ZpbGVCb3JkZXJSZWRpcmVjdCIsICJuZXh0IiwgIm1vdW50VUkiLCAic3RhdGUiLCAiREVGQVVMVF9HRU9fT1ZFUlJJREUiLCAidXBkYXRlUHJvZmlsZUJvcmRlck9wZW4iLCAiREVGQVVMVF9QUk9GSUxFX0JPUkRFUl9PUEVOIiwgInNoZWxsU3R5bGUiLCAicGFuZWxfZGVmYXVsdCIsICJnZW9TdHlsZSIsICJnZW9fb3ZlcnJpZGVfZGVmYXVsdCIsICJwcm9maWxlQm9yZGVyU3R5bGUiLCAicHJvZmlsZV9ib3JkZXJfZGVmYXVsdCIsICJib3RCbG9ja1N0eWxlIiwgImJvdF9ibG9ja19kZWZhdWx0IiwgInZlcnNpb25TdHlsZSIsICJ2ZXJzaW9uX2JhZGdlX2RlZmF1bHQiLCAicGFuZWwiLCAid2lyZVZlcnNpb25CYWRnZSIsICJnZW9Sb290IiwgIndpcmVHZW9PdmVycmlkZUZvcm0iLCAic2V0R2VvT3ZlcnJpZGUiLCAicHJvZmlsZUJvcmRlclJvb3QiLCAid2lyZVByb2ZpbGVCb3JkZXJGb3JtIiwgInNldFByb2ZpbGVCb3JkZXJPcGVuIiwgImJvdEJsb2NrUm9vdCIsICJ3aXJlQm90QmxvY2tGb3JtIiwgImdldEJvdEJsb2NraW5nRW5hYmxlZCIsICJjb3VudERpc3RpbmN0QmxvY2tlZEJvdHNMYXN0MjRoIiwgImdldEJsb2NrZWRCb3RFdmVudHNCeURheSIsICJnZXRCb3RCbG9ja2luZ1NlY3Rpb25PcGVuIiwgInNldEJvdEJsb2NraW5nU2VjdGlvbk9wZW4iLCAiZW5hYmxlZCIsICJzZXRCb3RCbG9ja2luZ0VuYWJsZWQiLCAiY2xvc2VCdG4iLCAiaG9va1N0YXRlIiwgImVyciJdCn0K