pulse-ui-client 0.0.15 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.bun.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{useEffect as p,useState as a,useMemo as t,createContext as NW,useContext as RW}from"react";import BW,{cloneElement as w,createElement as JW,isValidElement as KW,lazy as wW,Suspense as HW}from"react";var QW="$$fragment",qW="$$";function zW(W){return typeof W==="object"&&W!==null}function FW(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as d,Fragment as LW}from"react/jsx-runtime";class x{client;path;components;cssModules;callbackCache;callbackProps;renderPropKeys;cssProps;constructor(W,Z,$,Q,q=[],z=[],G=[]){this.client=W;this.path=Z;this.components=$;this.cssModules=Q;this.callbackCache=new Map,this.callbackProps=new Map,this.renderPropKeys=new Set(z),this.cssProps=new Set(G),this.setCallbacks(q)}setCallbacks(W){this.callbackProps.clear(),this.callbackCache.clear();for(let Z of W){let[$,Q]=this.splitPropPath(Z);if(!this.callbackProps.has($))this.callbackProps.set($,new Set);this.callbackProps.get($).add(Q)}}applyCallbackDelta(W,Z){let $=new Map,Q=(z)=>{if(!$.has(z))$.set(z,new Set(this.callbackProps.get(z)??[]))};if(W.remove)for(let z of W.remove){let[G,F]=this.splitPropPath(z);Q(G);let J=this.callbackProps.get(G);if(!J){this.callbackCache.delete(z);continue}if(this.callbackCache.delete(z),J.delete(F),J.size===0)this.callbackProps.delete(G)}if(W.add)for(let z of W.add){let[G,F]=this.splitPropPath(z);if(Q(G),!this.callbackProps.has(G))this.callbackProps.set(G,new Set);this.callbackProps.get(G).add(F)}let q=Z;for(let[z,G]of $.entries()){let F=new Set(this.callbackProps.get(z)??[]);if(this.setsEqual(G,F))continue;let J=z?z.split(".").filter((X)=>X.length>0):[];q=this.updateCallbacksOnTree(q,J,0,"",G,F)}return q}setRenderProps(W){this.renderPropKeys=new Set(W)}setCssRefs(W){this.cssProps=new Set(W)}applyRenderPropsDelta(W){if(W.remove)for(let Z of W.remove)this.renderPropKeys.delete(Z);if(W.add)for(let Z of W.add)this.renderPropKeys.add(Z)}applyCssRefsDelta(W){if(W.set)for(let Z of W.set)this.cssProps.add(Z);if(W.remove)for(let Z of W.remove)this.cssProps.delete(Z)}getCallback(W,Z){let $=this.propPath(W,Z),Q=this.callbackCache.get($);if(!Q)Q=(...q)=>this.client.invokeCallback(this.path,$,q),this.callbackCache.set($,Q);return Q}renderNode(W,Z=""){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(zW(W)){let{tag:$,props:Q={},children:q=[]}=W,z={...Q};for(let F of this.getCallbackNames(Z))z[F]=this.getCallback(Z,F);for(let[F,J]of Object.entries(z)){let X=this.propPath(Z,F);if(this.cssProps.has(X))z[F]=this.resolveCssToken(J);if(this.renderPropKeys.has(X))z[F]=this.renderNode(J,X)}if(W.key)z.key=W.key;let G=[];for(let F=0;F<q.length;F+=1){let J=q[F],X=Z?`${Z}.${F}`:String(F);G.push(this.renderNode(J,X))}if(FW(W)){let F=W.tag.slice(qW.length),J=this.components[F];if(!J)throw Error(`Could not find component ${F}. This is a Pulse internal error.`);return JW(J,z,...G)}return JW($===QW?BW.Fragment:$,z,...G)}return null}splitPropPath(W){let Z=W.lastIndexOf(".");if(Z===-1)return["",W];return[W.slice(0,Z),W.slice(Z+1)]}propPath(W,Z){return W?`${W}.${Z}`:Z}getCallbackNames(W){let Z=this.callbackProps.get(W);return Z?Array.from(Z):[]}transformValue(W,Z,$){let Q=this.callbackProps.get(W),q=this.propPath(W,Z);if(Q&&Q.size>0&&Q.has(Z))return this.getCallback(W,Z);if(this.renderPropKeys.has(q))return this.renderNode($,q);if(this.cssProps.has(q))return this.resolveCssToken($);return $}resolveCssToken(W){let Z=W.indexOf(":");if(Z===-1)return W;let $=W.slice(0,Z),Q=W.slice(Z+1);if(!$||!Q)return W;let q=this.cssModules[$];if(!q)throw Error(`Received CSS reference for unknown module '${$}'`);let z=q[Q];if(typeof z!=="string")throw Error(`Received CSS reference for missing class '${Q}' in module '${$}'`);return z}updateCallbacksOnTree(W,Z,$,Q,q,z){if($<Z.length){M(W,Z,$);let D=W,O=Z[$],C=Number(O),V=Q?`${Q}.${O}`:O;if(!Number.isNaN(C)){let A=k(D),N=A[C],R=this.updateCallbacksOnTree(N,Z,$+1,V,q,z);if(R===N)return W;return A[C]=R,w(D,void 0,...A)}else{let A=D.props??{},N=A[O],R=this.updateCallbacksOnTree(N,Z,$+1,V,q,z);if(R===N)return W;return w(D,{...A,[O]:R})}}if(!KW(W))return W;let G=W,F=G.props??{},J=!1,X={...F};for(let D of q)if(!z.has(D)&&D in X)delete X[D],J=!0;for(let D of z){let O=this.getCallback(Q,D);if(X[D]!==O)X[D]=O,J=!0}if(!J)return W;return w(G,X)}setsEqual(W,Z){if(W.size!==Z.size)return!1;for(let $ of W)if(!Z.has($))return!1;return!0}}function k(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}function n(W,Z,$){let Q=W;for(let q of Z){if(q.type==="update_callbacks"){Q=$.applyCallbackDelta(q.data,Q);continue}if(q.type==="update_css_refs"){$.applyCssRefsDelta(q.data);continue}if(q.type==="update_render_props"){$.applyRenderPropsDelta(q.data);continue}let z=q.path.split(".").filter((F)=>F.length>0),G=(F,J,X)=>{if(J<z.length){M(F,z,J);let D=F,O=z[J],C=+O,V=X?`${X}.${O}`:O;if(!Number.isNaN(C)){let A=k(D),N=A[C];return A[C]=G(N,J+1,V),w(D,void 0,...A)}else{let A=D.props??{},N=A[O],R={...A,[O]:G(N,J+1,V)};return w(D,R)}}switch(q.type){case"replace":return $.renderNode(q.data,q.path);case"update_props":{M(F,z,J);let D=F,C={...D.props??{}},V=q.data;if(V.remove&&V.remove.length>0){for(let A of V.remove)if(A in C)delete C[A]}if(V.set)for(let[A,N]of Object.entries(V.set))C[A]=$.transformValue(X,A,N);return w(D,C)}case"insert":{M(F,z,J);let D=F,O=k(D),C=X?`${X}.${q.idx}`:String(q.idx);return O.splice(q.idx,0,$.renderNode(q.data,C)),w(D,null,...O)}case"remove":{M(F,z,J);let D=F,O=k(D);return O.splice(q.idx,1),w(D,null,...O)}case"move":{M(F,z,J);let D=F,O=k(D),C=O.splice(q.data.from_index,1)[0];return O.splice(q.data.to_index,0,C),w(D,null,...O)}default:throw Error(`[Pulse renderer] Unknown update type: ${q.type}`)}};Q=G(Q,0,"")}return Q}function YW(W,Z){let $=wW(W);return({children:Q,...q})=>{return d(HW,{fallback:Z??d(LW,{}),children:d($,{...q,children:Q})})}}function M(W,Z,$){return!0}function H(){function W(Z,$){return(Q)=>{let q={};for(let z of Z)q[z]=Q[z];if($)for(let z in $){let G=$[z];q[z]=G(Q)}return q}}return W}var MW=(W)=>W.tagName.toLowerCase(),bW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],SW=["autofocus","tabIndex","nonce"],yW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],kW=H()(bW,{tagName:MW}),_W=H()(SW),TW=H()(yW);function Y(W){return{...kW(W),..._W(W),...TW(W)}}function U(W,Z){let $=H()(W,Z);return(Q)=>({...Y(Q),...$(Q)})}var gW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],xW=U(gW),vW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],mW=U(vW),hW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],DW=U(hW),EW=(W)=>DW(W),uW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],pW=U(uW),iW=["value"],cW=U(iW),dW=["height","src","type","width","align","name"],nW=U(dW),oW=["disabled","name","type","validationMessage","willValidate"],lW=U(oW),sW=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],rW=U(sW),aW=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],tW=U(aW),eW=["alt","crossOrigin","decoding","height","isMap","loading","naturalHeight","naturalWidth","referrerPolicy","sizes","src","srcset","useMap","width","align","border","complete","hspace","longDesc","lowsrc","name","vspace","x","y","fetchPriority"],W1=U(eW),Z1=["accept","alt","autocomplete","checked","defaultChecked","defaultValue","dirName","disabled","height","indeterminate","max","maxLength","min","minLength","multiple","name","pattern","placeholder","readOnly","required","selectionDirection","selectionEnd","selectionStart","size","src","step","type","value","valueAsNumber","width","align","capture","formAction","formEnctype","formMethod","formNoValidate","formTarget","useMap","validationMessage","willValidate","popoverTargetAction"],$1=U(Z1),Q1=["htmlFor"],q1=U(Q1),z1=["value","type"],F1=U(z1),J1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],X1=U(J1),G1=["name"],U1=U(G1),V1=["high","low","max","min","optimum","value"],D1=U(V1),O1=["cite","dateTime"],XW=U(O1),A1=["reversed","start","type","compact"],C1=U(A1),N1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],R1=U(N1),f1=["disabled","label"],I1=U(f1),P1=["defaultSelected","disabled","index","label","selected","text","value"],j1=U(P1),B1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],K1=U(B1),w1=["max","position","value"],H1=U(w1),Y1=["cite"],GW=U(Y1),L1=(W)=>Y(W),M1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],b1=H()(M1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),S1=(W)=>({...Y(W),...b1(W)}),y1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],k1=U(y1),_1=["name"],T1=U(_1),g1=["height","media","sizes","src","srcset","type","width"],x1=U(g1),v1=["align"],m1=U(v1),h1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],UW=U(h1),E1=["span","align","ch","chOff","vAlign","width"],VW=U(E1),u1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],p1=U(u1),i1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],c1=U(i1),d1=["align","ch","chOff","vAlign"],o=U(d1),n1=(W)=>Y(W),o1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],l1=U(o1),s1=["dateTime"],r1=U(s1),a1=["default","kind","label","readyState","src","srclang"],t1=U(a1),e1=["height","poster","videoHeight","videoWidth","width","playsInline"],W3=H()(e1),Z3=(W)=>({...DW(W),...W3(W)}),$3=["clear"],Q3=U($3),q3=["href","target"],z3=U(q3),F3=["aLink","background","bgColor","link","text","vLink"],J3=U(F3),X3=["compact"],G3=U(X3),U3=["open"],V3=U(U3),D3=["open","returnValue"],O3=U(D3),A3=["align"],C3=U(A3),N3=(W)=>Y(W),R3=["align"],b=U(R3),f3=["align","color","noShade","size","width"],I3=U(f3),P3=["version"],j3=U(P3),B3=(W)=>Y(W),K3=["content","httpEquiv","name","scheme"],w3=U(K3),H3=["align"],Y3=U(H3),L3=(W)=>Y(W),M3=["width"],b3=U(M3),S3=(W)=>Y(W),y3=["media","type","disabled"],k3=U(y3),_3=["text"],T3=U(_3),g3=["compact","type"],x3=U(g3),v3={A:xW,AREA:mW,AUDIO:EW,BASE:z3,BLOCKQUOTE:GW,Q:GW,BODY:J3,BR:Q3,BUTTON:pW,CANVAS:Y,CAPTION:m1,CITE:L1,COL:VW,COLGROUP:VW,DATA:cW,DETAILS:V3,DIALOG:O3,DIV:C3,DL:G3,EMBED:nW,FIELDSET:lW,FORM:rW,H1:b,H2:b,H3:b,H4:b,H5:b,H6:b,HEAD:N3,HR:I3,HTML:j3,IFRAME:tW,IMG:W1,INPUT:$1,LABEL:q1,LI:F1,LINK:X1,MAP:U1,MENU:B3,META:w3,METER:D1,INS:XW,DEL:XW,OBJECT:R1,OL:C1,OPTGROUP:I1,OPTION:j1,OUTPUT:K1,P:Y3,PICTURE:L3,PRE:b3,PROGRESS:H1,SCRIPT:S1,SELECT:k1,SLOT:T1,SOURCE:x1,SPAN:S3,STYLE:k3,TABLE:p1,TBODY:o,THEAD:o,TFOOT:o,TD:UW,TH:UW,TEMPLATE:n1,TEXTAREA:l1,TIME:r1,TITLE:T3,TR:c1,TRACK:t1,UL:x3,VIDEO:Z3};function v(W){let Z=W.tagName.toUpperCase(),$=v3[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var m3=(W)=>v(W.target),_=(W)=>W.relatedTarget?v(W.relatedTarget):null;function I(W,Z){return H()(W,{target:m3,...Z||{}})}var K=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],m=[...K,"detail"],h=[...m,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],h3=[...h,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],E3=I(K),u3=I(m),p3=I(h,{relatedTarget:_}),i3=I(K,{clipboardData:(W)=>OW(W.clipboardData)}),c3=I([...K,"data"]),d3=I(h,{relatedTarget:_,dataTransfer:(W)=>OW(W.dataTransfer)}),n3=I(h3,{relatedTarget:_}),o3=I(K,{relatedTarget:_}),l3=I(K),s3=I(K),r3=I(K),a3=I([...m,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),t3=I([...m,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>l(W.changedTouches),targetTouches:(W)=>l(W.targetTouches),touches:(W)=>l(W.touches)}),e3=I([...h,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:_}),WZ=I([...K,"animationName","elapsedTime","pseudoElement"]),ZZ=I([...K,"oldState","newState"]),$Z=I([...K,"elapsedTime","propertyName","pseudoElement"]);function l(W){return Array.from(W).map((Z)=>({target:v(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function OW(W){if(!W)return null;let Z=[];if(W.items)for(let $=0;$<W.items.length;$++){let Q=W.items[$];Z.push({kind:Q.kind,type:Q.type})}return{drop_effect:W.dropEffect,effect_allowed:W.effectAllowed,items:Z,types:Array.from(W.types||[])}}var P={};function j(W,Z,$){for(let Q of Z)W[Q]=$}j(P,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],n3);j(P,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],p3);j(P,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],d3);j(P,["keydown","keypress","keyup"],a3);j(P,["focus","blur"],o3);j(P,["change","input"],r3);j(P,["invalid"],s3);j(P,["reset","submit"],l3);j(P,["copy","cut","paste"],i3);j(P,["compositionend","compositionstart","compositionupdate"],c3);j(P,["touchcancel","touchend","touchmove","touchstart"],t3);j(P,["scroll"],u3);j(P,["wheel"],e3);j(P,["animationstart","animationend","animationiteration"],WZ);j(P,["transitionend"],$Z);j(P,["toggle"],ZZ);function s(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let Z=W;if(typeof Z.type!=="string")return W;let $=P[Z.type.toLowerCase()];if($)return $(Z);return E3(Z)}return W}function T(W){let Z=new Map,$=[],Q=[],q=[],z=[],G=0;function F(X){if(X==null||typeof X==="number"||typeof X==="string"||typeof X==="boolean")return X;let D=G++,O=Z.get(X);if(O!==void 0)return $.push(D),O;if(Z.set(X,D),X instanceof Date)return Q.push(D),X.getTime();if(Array.isArray(X)){let C=X.length,V=Array(C);for(let A=0;A<C;A++)V[A]=F(X[A]);return V}if(X instanceof Map){z.push(D);let C={};for(let[V,A]of X.entries())C[String(V)]=F(A);return C}if(X instanceof Set){q.push(D);let C=X.size,V=Array(C),A=0;for(let N of X)V[A]=F(N),A+=1;return V}if(typeof X==="object"){let C={},V=Object.keys(X);for(let A=0;A<V.length;A++){let N=V[A];C[N]=F(X[N])}return C}throw Error(`Unsupported value in serialization: ${X}`)}let J=F(W);return[[$,Q,q,z],J]}function r(W,Z){let[[$,Q,q,z],G]=W,F=new Set($),J=new Set(Q),X=new Set(q),D=new Set(z),O=[];function C(V){let A=O.length;if(F.has(A))return O.push(null),O[V];if(J.has(A)){let N=new Date(V);return O.push(N),N}if(V==null||typeof V==="number"||typeof V==="string"||typeof V==="boolean"){if(Z?.coerceNullsToUndefined)return V??void 0;return V}if(Array.isArray(V)){if(X.has(A)){let f=new Set;O.push(f);for(let B=0;B<V.length;B++)f.add(C(V[B]));return f}let N=V.length,R=Array(N);O.push(R);for(let f=0;f<N;f++)R[f]=C(V[f]);return R}if(typeof V==="object"){if(D.has(A)){let f=new Map;O.push(f);let B=Object.keys(V);for(let c=0;c<B.length;c++){let $W=B[c];f.set($W,C(V[$W]))}return f}let N={};O.push(N);let R=Object.keys(V);for(let f=0;f<R.length;f++){let B=R[f];N[B]=C(V[B])}return N}throw Error(`Unsupported value in deserialization: ${V}`)}return C(G)}import{io as JZ}from"socket.io-client";class L extends Error{constructor(W){super(W);this.name="PulseChannelResetError"}}function QZ(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID().replace(/-/g,"");return Math.random().toString(16).slice(2)+Math.random().toString(16).slice(2)}function qZ(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function zZ(W){return typeof W.responseTo==="string"}function FZ(W){return typeof W.event==="string"}class AW{client;id;handlers=new Map;pending=new Map;backlog=[];closed=!1;constructor(W,Z){this.client=W;this.id=Z}emit(W,Z){this.ensureOpen(),this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z})}async request(W,Z){this.ensureOpen();let $=QZ();return new Promise((Q,q)=>{this.pending.set($,{resolve:Q,reject:q}),this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z,requestId:$}).catch((z)=>{this.pending.delete($),q(z)})})}on(W,Z){this.ensureOpen();let $=this.handlers.get(W);if(!$)$=new Set,this.handlers.set(W,$);return $.add(Z),this.flushBacklog(W),()=>{let Q=this.handlers.get(W);if(!Q)return;if(Q.delete(Z),Q.size===0)this.handlers.delete(W)}}handleServerMessage(W){if(zZ(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!FZ(W))return this.closed;if(W.event==="__close__")return this.close(new L("Channel closed by server")),!0;if(W.requestId)this.dispatchRequest(W);else this.dispatchEvent(W);return this.closed}handleDisconnect(W){this.close(W)}dispose(W){this.close(W)}ensureOpen(){if(this.closed)throw new L("Channel is closed")}flushBacklog(W){if(this.backlog.length===0)return;let Z=[];for(let $ of this.backlog)if($.event===W)this.dispatchEvent($);else Z.push($);this.backlog=Z}dispatchEvent(W){let Z=this.handlers.get(W.event);if(!Z||Z.size===0){this.backlog.push(W);return}for(let $ of Z)try{let Q=$(W.payload);if(Q&&typeof Q.then==="function")Q.catch((q)=>{console.error("Pulse channel handler error",q)})}catch(Q){console.error("Pulse channel handler error",Q)}}async dispatchRequest(W){let Z=this.handlers.get(W.event),$,Q;if(Z&&Z.size>0)for(let q of Z)try{let z=q(W.payload);if($=await Promise.resolve(z),$!==void 0)break}catch(z){Q=z;break}if(Q){await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:qZ(Q)});return}await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,payload:$})}resolvePending(W){let Z=W.responseTo?this.pending.get(W.responseTo):void 0;if(!Z)return;if(this.pending.delete(W.responseTo),W.error!==void 0&&W.error!==null)Z.reject(new L(String(W.error)));else Z.resolve(W.payload)}close(W){if(this.closed)return;this.closed=!0;for(let Z of this.pending.values())Z.reject(W);this.pending.clear(),this.handlers.clear(),this.backlog=[]}}function CW(W,Z){return new AW(W,Z)}class E{url;renderId;frameworkNavigate;activeViews;socket=null;messageQueue;connectionListeners=new Set;serverErrors=new Map;serverErrorListeners=new Set;channels=new Map;constructor(W,Z,$){this.url=W;this.renderId=Z;this.frameworkNavigate=$;this.socket=null,this.activeViews=new Map,this.messageQueue=[]}isConnected(){return this.socket?.connected??!1}async connect(){if(this.socket)return;return new Promise((W,Z)=>{let $=JZ(this.url,{transports:["websocket","webtransport"],auth:{renderId:this.renderId}});this.socket=$,$.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let[Q,q]of this.activeViews)$.emit("message",T({type:"mount",path:Q,routeInfo:q.routeInfo}));for(let Q of this.messageQueue){if(Q.type==="mount"&&this.activeViews.has(Q.path))continue;if(Q.type==="navigate")continue;$.emit("message",T(Q))}this.messageQueue=[],this.notifyConnectionListeners(!0),W()}),$.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),Z(Q)}),$.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.handleTransportDisconnect(),this.notifyConnectionListeners(!1)}),$.on("message",(Q)=>this.handleServerMessage(r(Q,{coerceNullsToUndefined:!0})))})}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let Z of this.connectionListeners)Z(W)}onServerError(W){this.serverErrorListeners.add(W);for(let[Z,$]of this.serverErrors)W(Z,$);return()=>{this.serverErrorListeners.delete(W)}}notifyServerError(W,Z){for(let $ of this.serverErrorListeners)$(W,Z)}async sendMessage(W){if(this.isConnected())this.socket.emit("message",T(W));else this.messageQueue.push(W)}async sendChannelMessage(W){await this.sendMessage(W)}mountView(W,Z){if(this.activeViews.has(W))throw Error(`Path ${W} is already mounted`);this.activeViews.set(W,Z),this.sendMessage({type:"mount",path:W,routeInfo:Z.routeInfo})}async navigate(W,Z){await this.sendMessage({type:"navigate",path:W,routeInfo:Z})}unmount(W){this.sendMessage({type:"unmount",path:W}),this.activeViews.delete(W)}disconnect(){this.socket?.disconnect(),this.socket=null,this.messageQueue=[],this.connectionListeners.clear(),this.activeViews.clear(),this.serverErrors.clear(),this.serverErrorListeners.clear();for(let{bridge:W}of this.channels.values())W.dispose(new L("Client disconnected"));this.channels.clear()}handleServerMessage(W){switch(W.type){case"vdom_init":{let Z=this.activeViews.get(W.path);if(!Z)return;if(Z)Z.onInit(W.vdom,W.callbacks,W.render_props,W.css_refs);if(this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"vdom_update":{let Z=this.activeViews.get(W.path);if(!Z)return;if(Z.onUpdate(W.ops),this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"server_error":{if(!this.activeViews.has(W.path))return;this.serverErrors.set(W.path,W.error),this.notifyServerError(W.path,W.error);break}case"api_call":{this.performApiCall(W);break}case"navigate_to":{let Z=!!W.replace,$=W.path||"";if($.startsWith("//"))$=`${window.location.protocol}${$}`;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test($))if($.startsWith("http://")||$.startsWith("https://"))try{let q=new URL($);if(q.origin===window.location.origin){let z=`${q.pathname}${q.search}${q.hash}`;this.frameworkNavigate(z,{replace:Z})}else if(Z)window.location.replace($);else window.location.assign($)}catch{if(Z)window.location.replace($);else window.location.assign($)}else if(Z)window.location.replace($);else window.location.assign($);else this.frameworkNavigate($,{replace:Z});break}case"channel_message":{this.routeChannelMessage(W);break}default:console.error("Unexpected message:",W)}}async performApiCall(W){try{let Z=await fetch(W.url,{method:W.method||"GET",headers:{...W.headers||{},...W.body!=null&&!("content-type"in(W.headers||{}))?{"content-type":"application/json"}:{}},body:W.body!=null?typeof W.body==="string"?W.body:JSON.stringify(W.body):void 0,credentials:W.credentials||"include"}),$={};Z.headers.forEach((G,F)=>$[F]=G);let Q=null;if((Z.headers.get("content-type")||"").includes("application/json"))Q=await Z.json().catch(()=>null);else Q=await Z.text().catch(()=>null);let z={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:Q};await this.sendMessage(z)}catch(Z){let $={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(Z)}};await this.sendMessage($)}}async invokeCallback(W,Z,$){await this.sendMessage({type:"callback",path:W,callback:Z,args:$.map(s)})}acquireChannel(W){let Z=this.ensureChannelEntry(W);return Z.refCount+=1,Z.bridge}releaseChannel(W){let Z=this.channels.get(W);if(!Z)return;if(Z.refCount=Math.max(0,Z.refCount-1),Z.refCount===0)Z.bridge.dispose(new L("Channel released")),this.channels.delete(W)}ensureChannelEntry(W){let Z=this.channels.get(W);if(!Z)Z={bridge:CW(this,W),refCount:0},this.channels.set(W,Z);return Z}routeChannelMessage(W){let Z=this.ensureChannelEntry(W.channel);if(Z.bridge.handleServerMessage(W)&&Z.refCount===0)this.channels.delete(W.channel)}handleTransportDisconnect(){for(let W of this.channels.values())W.bridge.handleDisconnect(new L("Connection lost"))}}import{useLocation as XZ,useParams as GZ,useNavigate as UZ}from"react-router";import{jsx as S,jsxs as u}from"react/jsx-runtime";var fW=NW(null),IW=NW(null),i=()=>{let W=RW(fW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},VZ=(W)=>{let Z=RW(IW);if(!Z)throw Error("usePulsePrerender must be used within a PulseProvider");let $=Z.views[W];if(!$)throw Error(`No prerender found for '${W}'`);return $},e=typeof window<"u";function DZ({children:W,config:Z,prerender:$}){let[Q,q]=a(!0),z=UZ(),{renderId:G}=$,F=t(()=>new E(Z.serverAddress,G,z),[Z.serverAddress,z,G]);return p(()=>F.onConnectionChange(q),[F]),p(()=>{if(e)return F.connect(),()=>F.disconnect()},[F]),S(fW.Provider,{value:F,children:u(IW.Provider,{value:$,children:[!Q&&S("div",{style:{position:"fixed",bottom:"20px",right:"20px",backgroundColor:"red",color:"white",padding:"10px",borderRadius:"5px",zIndex:1000},children:"Failed to connect to the server."}),W]})})}function OZ({externalComponents:W,path:Z,cssModules:$}){let Q=i(),q=VZ(Z),z=q.vdom,G=t(()=>new x(Q,Z,W,$,q.callbacks,q.render_props,q.css_refs),[Q,Z,W,$,q]),[F,J]=a(()=>G.renderNode(z)),[X,D]=a(null),O=XZ(),C=GZ(),V=t(()=>{let{"*":A="",...N}=C,R=new URLSearchParams(O.search);return{hash:O.hash,pathname:O.pathname,query:O.search,queryParams:Object.fromEntries(R.entries()),pathParams:N,catchall:A.length>0?A.split("/"):[]}},[O.hash,O.pathname,O.search,JSON.stringify(C)]);if(p(()=>{if(e){Q.mountView(Z,{routeInfo:V,onInit:(N,R,f,B)=>{G.setCallbacks(R),G.setRenderProps(f),G.setCssRefs(B),J(G.renderNode(N))},onUpdate:(N)=>{J((R)=>R==null?R:n(R,N,G))}});let A=Q.onServerError((N,R)=>{if(N===Z)D(R)});return()=>{A(),Q.unmount(Z)}}},[Q]),p(()=>{if(e)Q.navigate(Z,V)},[Q,Z,V]),X)return S(AZ,{error:X});return F}function AZ({error:W}){return u("div",{style:{padding:16,border:"1px solid #e00",background:"#fff5f5",color:"#900",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',whiteSpace:"pre-wrap"},children:[u("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&S("div",{children:W.message}),W.stack&&u("details",{open:!0,style:{marginTop:8},children:[S("summary",{children:"Stack trace"}),S("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as CZ,useMemo as NZ}from"react";function RZ(W){let Z=i(),$=NZ(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return CZ(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}import{forwardRef as fZ,useCallback as IZ}from"react";import{jsx as jZ}from"react/jsx-runtime";var PZ=fZ(function({onSubmit:Z,action:$,...Q},q){return jZ("form",{...Q,action:$,ref:q,onSubmit:IZ((z)=>PW({event:z,action:$,onSubmit:Z}),[$,Z])})});async function PW({event:W,action:Z,onSubmit:$,formData:Q,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let z=W.currentTarget;W.preventDefault();let G=W.nativeEvent;if(!Q)Q=new FormData(z,G.submitter);let F=new URL(Z,window.location.href);try{await fetch(F,{method:"POST",credentials:"include",body:Q})}catch(J){throw J}}import{io as BZ}from"socket.io-client";class jW{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(W){this.url=W}connect(W){return this.listener=W,new Promise((Z,$)=>{this.socket=BZ(this.url,{transports:["websocket"]}),this.socket.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let Q of this.messageQueue)this.socket?.emit("message",Q);this.messageQueue=[],this.notifyConnectionListeners(!0),Z()}),this.socket.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),$(Q)}),this.socket.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),this.socket.on("message",(Q)=>{this.listener?.(Q)})})}disconnect(){this.socket?.disconnect(),this.socket=null,this.listener=null,this.messageQueue=[],this.connectionListeners.clear()}async sendMessage(W){if(this.isConnected())this.socket.emit("message",W);else this.messageQueue.push(W)}isConnected(){return this.socket?.connected||!1}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let Z of this.connectionListeners)Z(W)}}function KZ({params:W,request:Z}){let{"*":$="",...Q}=W,q=new URL(Z.url);return{hash:q.hash,pathname:q.pathname,query:q.search,queryParams:Object.fromEntries(q.searchParams.entries()),pathParams:Q,catchall:$.length>1?$.split("/"):[]}}function wZ(W){if(W===null||typeof W!=="object")return!1;let Z=Object.getPrototypeOf(W);return Z===Object.prototype||Z===null}function WW(W){return typeof W==="function"||typeof W==="symbol"||typeof W>"u"}async function HZ(W){let Z=await W.arrayBuffer();return Array.from(new Uint8Array(Z))}async function YZ(W){return await g(W,{seen:new WeakMap,nextId:1})}function LZ(W,Z){if(W.seen.get(Z)!==void 0)return null;let Q=W.nextId++;return W.seen.set(Z,Q),Q}async function g(W,Z){if(W===null||typeof W!=="object")return W;if(W instanceof Date)return{__t:"datetime",timestamp:W.getTime()};if(W instanceof FormData){let F=LZ(Z,W);if(F===null)return{__t:"ref",id:Z.seen.get(W)};let J={};for(let[D,O]of W.entries()){let C=await g(O,Z);if(C===void 0)continue;if(Object.prototype.hasOwnProperty.call(J,D)){let V=J[D];if(Array.isArray(V))V.push(C);else J[D]=[V,C]}else J[D]=C}return{__t:"formdata",fields:J,__id:F}}if(W instanceof File){let F=W,J=await HZ(W);return{__t:"file",name:F.name,type:F.type,size:F.size,lastModified:F.lastModified,content:J}}let $=W,Q=Z.seen.get($);if(Q!==void 0)return{__t:"ref",id:Q};let q=Z.nextId++;if(Z.seen.set($,q),Array.isArray(W)){let J=(await Promise.all(W.map((D)=>g(D,Z)))).filter((D)=>D!==void 0);return{__t:"array",__id:q,items:J}}let z={};if(wZ(W))for(let F of Object.keys(W)){let J=W[F];if(WW(J))continue;let X=await g(J,Z);if(X!==void 0)z[F]=X}else for(let F in W){let J=W[F];if(WW(J))continue;let X=await g(J,Z);if(X!==void 0)z[F]=X}return{__t:"object",__id:q,props:z}}function MZ(W){return y(W)}function y(W){if(W===null||typeof W!=="object")return W;let Z=W,$=Z.__t;if($==="datetime"){let q=Z.timestamp;return new Date(q)}if($==="file"){let q=Z.content;if(Array.isArray(q))return{...Z,content:new Uint8Array(q)};return Z}if($==="formdata"){let q=Z.fields,z={};for(let G of Object.keys(q)){let F=q[G];if(Array.isArray(F))z[G]=F.map((J)=>y(J));else z[G]=y(F)}return{__t:"formdata",fields:z}}if($==="array")return Z.items.map((z)=>y(z));if($==="object"){let q=Z.props,z={};for(let G of Object.keys(q))z[G]=y(q[G]);return z}if($==="ref")return Z;let Q={};for(let q of Object.keys(Z))Q[q]=y(Z[q]);return Q}function bZ(W){return ZW(W,new WeakSet)}function ZW(W,Z){if(W===null||typeof W!=="object")return W;if(Z.has(W))return;if(Z.add(W),Array.isArray(W))return W.map((Q)=>ZW(Q,Z)).filter((Q)=>Q!==void 0);let $={};for(let Q in W){let q=W[Q];if(WW(q))continue;let z=ZW(q,Z);if(z!==void 0)$[Q]=z}return $}export{i as usePulseClient,RZ as usePulseChannel,PW as submitForm,T as serialize,KZ as extractServerRouteInfo,s as extractEvent,YZ as encodeForWire,r as deserialize,MZ as decodeFromWire,bZ as cleanForSerialization,n as applyReactTreeUpdates,x as VDOMRenderer,jW as SocketIOTransport,YW as RenderLazy,OZ as PulseView,E as PulseSocketIOClient,DZ as PulseProvider,PZ as PulseForm,L as PulseChannelResetError};
2
+ import{useEffect as u,useState as a,useMemo as t,createContext as CW,useContext as RW}from"react";import BW,{cloneElement as K,createElement as XW,isValidElement as wW,lazy as KW,Suspense as HW}from"react";var QW="$$fragment",qW="$$";function FW(W){return typeof W==="object"&&W!==null}function JW(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as d,Fragment as LW}from"react/jsx-runtime";class x{client;path;components;cssModules;callbacks;callbackCache;renderPropKeys;cssProps;constructor(W,Z,$,Q,q=[],F=[],N=[]){this.client=W;this.path=Z;this.components=$;this.cssModules=Q;this.callbacks=new Set(q),this.callbackCache=new Map,this.renderPropKeys=new Set(F),this.cssProps=new Set(N),this.setCallbacks(q)}setCallbacks(W){this.callbacks=new Set(W)}setRenderProps(W){this.renderPropKeys=new Set(W)}setCssRefs(W){this.cssProps=new Set(W)}applyCallbackDelta(W){if(W.remove)for(let Z of W.remove)this.callbacks.delete(Z);if(W.add)for(let Z of W.add)this.callbacks.add(Z)}applyRenderPropsDelta(W){if(W.remove)for(let Z of W.remove)this.renderPropKeys.delete(Z);if(W.add)for(let Z of W.add)this.renderPropKeys.add(Z)}applyCssRefsDelta(W){if(W.set)for(let Z of W.set)this.cssProps.add(Z);if(W.remove)for(let Z of W.remove)this.cssProps.delete(Z)}getCallback(W,Z){let $=this.propPath(W,Z),Q=this.callbackCache.get($);if(!Q)Q=(...q)=>this.client.invokeCallback(this.path,$,q),this.callbackCache.set($,Q);return Q}renderNode(W,Z=""){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(FW(W)){let{tag:$,props:Q={},children:q=[]}=W,F={};for(let[J,U]of Object.entries(Q))F[J]=this.transformValue(Z,J,U);if(W.key)F.key=W.key;let N=[];for(let J=0;J<q.length;J+=1){let U=q[J],G=Z?`${Z}.${J}`:String(J);N.push(this.renderNode(U,G))}if(JW(W)){let J=W.tag.slice(qW.length),U=this.components[J];if(!U)throw Error(`Could not find component ${J}. This is a Pulse internal error.`);return XW(U,F,...N)}return XW($===QW?BW.Fragment:$,F,...N)}return null}propPath(W,Z){return W?`${W}.${Z}`:Z}transformValue(W,Z,$){let Q=this.propPath(W,Z);if(this.callbacks.has(Q))return this.getCallback(W,Z);if(this.renderPropKeys.has(Q))return this.renderNode($,Q);if(this.cssProps.has(Q))return this.resolveCssToken($);return $}resolveCssToken(W){let Z=W.indexOf(":");if(Z===-1)return W;let $=W.slice(0,Z),Q=W.slice(Z+1);if(!$||!Q)return W;let q=this.cssModules[$];if(!q)throw Error(`Received CSS reference for unknown module '${$}'`);let F=q[Q];if(typeof F!=="string")throw Error(`Received CSS reference for missing class '${Q}' in module '${$}'`);return F}updateCallbacksOnTree(W,Z,$,Q,q,F){if($<Z.length){M(W,Z,$);let V=W,D=Z[$],A=Number(D),z=Q?`${Q}.${D}`:D;if(!Number.isNaN(A)){let O=S(V),C=O[A],R=this.updateCallbacksOnTree(C,Z,$+1,z,q,F);if(R===C)return W;return O[A]=R,K(V,void 0,...O)}else{let O=V.props??{},C=O[D],R=this.updateCallbacksOnTree(C,Z,$+1,z,q,F);if(R===C)return W;return K(V,{...O,[D]:R})}}if(!wW(W))return W;let N=W,J=N.props??{},U=!1,G={...J};for(let V of q)if(!F.has(V)&&V in G)delete G[V],U=!0;for(let V of F){let D=this.getCallback(Q,V);if(G[V]!==D)G[V]=D,U=!0}if(!U)return W;return K(N,G)}setsEqual(W,Z){if(W.size!==Z.size)return!1;for(let $ of W)if(!Z.has($))return!1;return!0}}function S(W){let Z=W.props?.children;if(Z==null)return[];return Array.isArray(Z)?Z.slice():[Z]}function n(W,Z,$){let Q=W;for(let q of Z){if(q.type==="update_callbacks"){$.applyCallbackDelta(q.data);continue}if(q.type==="update_css_refs"){$.applyCssRefsDelta(q.data);continue}if(q.type==="update_render_props"){$.applyRenderPropsDelta(q.data);continue}let F=q.path.split(".").filter((J)=>J.length>0),N=(J,U,G)=>{if(U<F.length){M(J,F,U);let V=J,D=F[U],A=+D,z=G?`${G}.${D}`:D;if(!Number.isNaN(A)){let O=S(V),C=O[A];return O[A]=N(C,U+1,z),K(V,void 0,...O)}else{let O=V.props??{},C=O[D],R={...O,[D]:N(C,U+1,z)};return K(V,R)}}switch(q.type){case"replace":return $.renderNode(q.data,q.path);case"update_props":{M(J,F,U);let V=J,A={...V.props??{}},z=q.data;if(z.remove&&z.remove.length>0){for(let O of z.remove)if(O in A)delete A[O]}if(z.set)for(let[O,C]of Object.entries(z.set))A[O]=$.transformValue(G,O,C);return K(V,A)}case"insert":{M(J,F,U);let V=J,D=S(V),A=G?`${G}.${q.idx}`:String(q.idx);return D.splice(q.idx,0,$.renderNode(q.data,A)),K(V,null,...D)}case"remove":{M(J,F,U);let V=J,D=S(V);return D.splice(q.idx,1),K(V,null,...D)}case"move":{M(J,F,U);let V=J,D=S(V),A=D.splice(q.data.from_index,1)[0];return D.splice(q.data.to_index,0,A),K(V,null,...D)}default:throw Error(`[Pulse renderer] Unknown update type: ${q.type}`)}};Q=N(Q,0,"")}return Q}function YW(W,Z){let $=KW(W);return({children:Q,...q})=>{return d(HW,{fallback:Z??d(LW,{}),children:d($,{...q,children:Q})})}}function M(W,Z,$){return!0}function H(){function W(Z,$){return(Q)=>{let q={};for(let F of Z)q[F]=Q[F];if($)for(let F in $){let N=$[F];q[F]=N(Q)}return q}}return W}var MW=(W)=>W.tagName.toLowerCase(),yW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],bW=["autofocus","tabIndex","nonce"],kW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],SW=H()(yW,{tagName:MW}),TW=H()(bW),_W=H()(kW);function Y(W){return{...SW(W),...TW(W),..._W(W)}}function X(W,Z){let $=H()(W,Z);return(Q)=>({...Y(Q),...$(Q)})}var gW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],xW=X(gW),vW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],hW=X(vW),mW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],DW=X(mW),pW=(W)=>DW(W),EW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],uW=X(EW),iW=["value"],cW=X(iW),dW=["height","src","type","width","align","name"],nW=X(dW),oW=["disabled","name","type","validationMessage","willValidate"],lW=X(oW),sW=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],rW=X(sW),aW=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],tW=X(aW),eW=["alt","crossOrigin","decoding","height","isMap","loading","naturalHeight","naturalWidth","referrerPolicy","sizes","src","srcset","useMap","width","align","border","complete","hspace","longDesc","lowsrc","name","vspace","x","y","fetchPriority"],W1=X(eW),Z1=["accept","alt","autocomplete","checked","defaultChecked","defaultValue","dirName","disabled","height","indeterminate","max","maxLength","min","minLength","multiple","name","pattern","placeholder","readOnly","required","selectionDirection","selectionEnd","selectionStart","size","src","step","type","value","valueAsNumber","width","align","capture","formAction","formEnctype","formMethod","formNoValidate","formTarget","useMap","validationMessage","willValidate","popoverTargetAction"],$1=X(Z1),Q1=["htmlFor"],q1=X(Q1),F1=["value","type"],J1=X(F1),X1=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],z1=X(X1),G1=["name"],U1=X(G1),V1=["high","low","max","min","optimum","value"],D1=X(V1),O1=["cite","dateTime"],zW=X(O1),A1=["reversed","start","type","compact"],N1=X(A1),C1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],R1=X(C1),f1=["disabled","label"],P1=X(f1),I1=["defaultSelected","disabled","index","label","selected","text","value"],j1=X(I1),B1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],w1=X(B1),K1=["max","position","value"],H1=X(K1),Y1=["cite"],GW=X(Y1),L1=(W)=>Y(W),M1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],y1=H()(M1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),b1=(W)=>({...Y(W),...y1(W)}),k1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],S1=X(k1),T1=["name"],_1=X(T1),g1=["height","media","sizes","src","srcset","type","width"],x1=X(g1),v1=["align"],h1=X(v1),m1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],UW=X(m1),p1=["span","align","ch","chOff","vAlign","width"],VW=X(p1),E1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],u1=X(E1),i1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],c1=X(i1),d1=["align","ch","chOff","vAlign"],o=X(d1),n1=(W)=>Y(W),o1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],l1=X(o1),s1=["dateTime"],r1=X(s1),a1=["default","kind","label","readyState","src","srclang"],t1=X(a1),e1=["height","poster","videoHeight","videoWidth","width","playsInline"],WZ=H()(e1),ZZ=(W)=>({...DW(W),...WZ(W)}),$Z=["clear"],QZ=X($Z),qZ=["href","target"],FZ=X(qZ),JZ=["aLink","background","bgColor","link","text","vLink"],XZ=X(JZ),zZ=["compact"],GZ=X(zZ),UZ=["open"],VZ=X(UZ),DZ=["open","returnValue"],OZ=X(DZ),AZ=["align"],NZ=X(AZ),CZ=(W)=>Y(W),RZ=["align"],y=X(RZ),fZ=["align","color","noShade","size","width"],PZ=X(fZ),IZ=["version"],jZ=X(IZ),BZ=(W)=>Y(W),wZ=["content","httpEquiv","name","scheme"],KZ=X(wZ),HZ=["align"],YZ=X(HZ),LZ=(W)=>Y(W),MZ=["width"],yZ=X(MZ),bZ=(W)=>Y(W),kZ=["media","type","disabled"],SZ=X(kZ),TZ=["text"],_Z=X(TZ),gZ=["compact","type"],xZ=X(gZ),vZ={A:xW,AREA:hW,AUDIO:pW,BASE:FZ,BLOCKQUOTE:GW,Q:GW,BODY:XZ,BR:QZ,BUTTON:uW,CANVAS:Y,CAPTION:h1,CITE:L1,COL:VW,COLGROUP:VW,DATA:cW,DETAILS:VZ,DIALOG:OZ,DIV:NZ,DL:GZ,EMBED:nW,FIELDSET:lW,FORM:rW,H1:y,H2:y,H3:y,H4:y,H5:y,H6:y,HEAD:CZ,HR:PZ,HTML:jZ,IFRAME:tW,IMG:W1,INPUT:$1,LABEL:q1,LI:J1,LINK:z1,MAP:U1,MENU:BZ,META:KZ,METER:D1,INS:zW,DEL:zW,OBJECT:R1,OL:N1,OPTGROUP:P1,OPTION:j1,OUTPUT:w1,P:YZ,PICTURE:LZ,PRE:yZ,PROGRESS:H1,SCRIPT:b1,SELECT:S1,SLOT:_1,SOURCE:x1,SPAN:bZ,STYLE:SZ,TABLE:u1,TBODY:o,THEAD:o,TFOOT:o,TD:UW,TH:UW,TEMPLATE:n1,TEXTAREA:l1,TIME:r1,TITLE:_Z,TR:c1,TRACK:t1,UL:xZ,VIDEO:ZZ};function v(W){let Z=W.tagName.toUpperCase(),$=vZ[Z];if($)return $(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var hZ=(W)=>v(W.target),T=(W)=>W.relatedTarget?v(W.relatedTarget):null;function P(W,Z){return H()(W,{target:hZ,...Z||{}})}var w=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],h=[...w,"detail"],m=[...h,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],mZ=[...m,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],pZ=P(w),EZ=P(h),uZ=P(m,{relatedTarget:T}),iZ=P(w,{clipboardData:(W)=>OW(W.clipboardData)}),cZ=P([...w,"data"]),dZ=P(m,{relatedTarget:T,dataTransfer:(W)=>OW(W.dataTransfer)}),nZ=P(mZ,{relatedTarget:T}),oZ=P(w,{relatedTarget:T}),lZ=P(w),sZ=P(w),rZ=P(w),aZ=P([...h,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),tZ=P([...h,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>l(W.changedTouches),targetTouches:(W)=>l(W.targetTouches),touches:(W)=>l(W.touches)}),eZ=P([...m,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:T}),W0=P([...w,"animationName","elapsedTime","pseudoElement"]),Z0=P([...w,"oldState","newState"]),$0=P([...w,"elapsedTime","propertyName","pseudoElement"]);function l(W){return Array.from(W).map((Z)=>({target:v(Z.target),identifier:Z.identifier,screenX:Z.screenX,screenY:Z.screenY,clientX:Z.clientX,clientY:Z.clientY,pageX:Z.pageX,pageY:Z.pageY}))}function OW(W){if(!W)return null;let Z=[];if(W.items)for(let $=0;$<W.items.length;$++){let Q=W.items[$];Z.push({kind:Q.kind,type:Q.type})}return{drop_effect:W.dropEffect,effect_allowed:W.effectAllowed,items:Z,types:Array.from(W.types||[])}}var I={};function j(W,Z,$){for(let Q of Z)W[Q]=$}j(I,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],nZ);j(I,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],uZ);j(I,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],dZ);j(I,["keydown","keypress","keyup"],aZ);j(I,["focus","blur"],oZ);j(I,["change","input"],rZ);j(I,["invalid"],sZ);j(I,["reset","submit"],lZ);j(I,["copy","cut","paste"],iZ);j(I,["compositionend","compositionstart","compositionupdate"],cZ);j(I,["touchcancel","touchend","touchmove","touchstart"],tZ);j(I,["scroll"],EZ);j(I,["wheel"],eZ);j(I,["animationstart","animationend","animationiteration"],W0);j(I,["transitionend"],$0);j(I,["toggle"],Z0);function s(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let Z=W;if(typeof Z.type!=="string")return W;let $=I[Z.type.toLowerCase()];if($)return $(Z);return pZ(Z)}return W}function _(W){let Z=new Map,$=[],Q=[],q=[],F=[],N=0;function J(G){if(G==null||typeof G==="number"||typeof G==="string"||typeof G==="boolean")return G;let V=N++,D=Z.get(G);if(D!==void 0)return $.push(V),D;if(Z.set(G,V),G instanceof Date)return Q.push(V),G.getTime();if(Array.isArray(G)){let A=G.length,z=Array(A);for(let O=0;O<A;O++)z[O]=J(G[O]);return z}if(G instanceof Map){F.push(V);let A={};for(let[z,O]of G.entries())A[String(z)]=J(O);return A}if(G instanceof Set){q.push(V);let A=G.size,z=Array(A),O=0;for(let C of G)z[O]=J(C),O+=1;return z}if(typeof G==="object"){let A={},z=Object.keys(G);for(let O=0;O<z.length;O++){let C=z[O];A[C]=J(G[C])}return A}throw Error(`Unsupported value in serialization: ${G}`)}let U=J(W);return[[$,Q,q,F],U]}function r(W,Z){let[[$,Q,q,F],N]=W,J=new Set($),U=new Set(Q),G=new Set(q),V=new Set(F),D=[];function A(z){let O=D.length;if(J.has(O))return D.push(null),D[z];if(U.has(O)){let C=new Date(z);return D.push(C),C}if(z==null||typeof z==="number"||typeof z==="string"||typeof z==="boolean"){if(Z?.coerceNullsToUndefined)return z??void 0;return z}if(Array.isArray(z)){if(G.has(O)){let f=new Set;D.push(f);for(let B=0;B<z.length;B++)f.add(A(z[B]));return f}let C=z.length,R=Array(C);D.push(R);for(let f=0;f<C;f++)R[f]=A(z[f]);return R}if(typeof z==="object"){if(V.has(O)){let f=new Map;D.push(f);let B=Object.keys(z);for(let c=0;c<B.length;c++){let $W=B[c];f.set($W,A(z[$W]))}return f}let C={};D.push(C);let R=Object.keys(z);for(let f=0;f<R.length;f++){let B=R[f];C[B]=A(z[B])}return C}throw Error(`Unsupported value in deserialization: ${z}`)}return A(N)}import{io as X0}from"socket.io-client";class L extends Error{constructor(W){super(W);this.name="PulseChannelResetError"}}function Q0(){if(typeof crypto<"u"&&typeof crypto.randomUUID==="function")return crypto.randomUUID().replace(/-/g,"");return Math.random().toString(16).slice(2)+Math.random().toString(16).slice(2)}function q0(W){if(W instanceof Error)return W.message;if(typeof W==="string")return W;try{return JSON.stringify(W)}catch{return String(W)}}function F0(W){return typeof W.responseTo==="string"}function J0(W){return typeof W.event==="string"}class AW{client;id;handlers=new Map;pending=new Map;backlog=[];closed=!1;constructor(W,Z){this.client=W;this.id=Z}emit(W,Z){this.ensureOpen(),this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z})}async request(W,Z){this.ensureOpen();let $=Q0();return new Promise((Q,q)=>{this.pending.set($,{resolve:Q,reject:q}),this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:W,payload:Z,requestId:$}).catch((F)=>{this.pending.delete($),q(F)})})}on(W,Z){this.ensureOpen();let $=this.handlers.get(W);if(!$)$=new Set,this.handlers.set(W,$);return $.add(Z),this.flushBacklog(W),()=>{let Q=this.handlers.get(W);if(!Q)return;if(Q.delete(Z),Q.size===0)this.handlers.delete(W)}}handleServerMessage(W){if(F0(W))return this.resolvePending(W),this.closed;if(this.closed)return!0;if(!J0(W))return this.closed;if(W.event==="__close__")return this.close(new L("Channel closed by server")),!0;if(W.requestId)this.dispatchRequest(W);else this.dispatchEvent(W);return this.closed}handleDisconnect(W){this.close(W)}dispose(W){this.close(W)}ensureOpen(){if(this.closed)throw new L("Channel is closed")}flushBacklog(W){if(this.backlog.length===0)return;let Z=[];for(let $ of this.backlog)if($.event===W)this.dispatchEvent($);else Z.push($);this.backlog=Z}dispatchEvent(W){let Z=this.handlers.get(W.event);if(!Z||Z.size===0){this.backlog.push(W);return}for(let $ of Z)try{let Q=$(W.payload);if(Q&&typeof Q.then==="function")Q.catch((q)=>{console.error("Pulse channel handler error",q)})}catch(Q){console.error("Pulse channel handler error",Q)}}async dispatchRequest(W){let Z=this.handlers.get(W.event),$,Q;if(Z&&Z.size>0)for(let q of Z)try{let F=q(W.payload);if($=await Promise.resolve(F),$!==void 0)break}catch(F){Q=F;break}if(Q){await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,error:q0(Q)});return}await this.client.sendChannelMessage({type:"channel_message",channel:this.id,event:void 0,responseTo:W.requestId,payload:$})}resolvePending(W){let Z=W.responseTo?this.pending.get(W.responseTo):void 0;if(!Z)return;if(this.pending.delete(W.responseTo),W.error!==void 0&&W.error!==null)Z.reject(new L(String(W.error)));else Z.resolve(W.payload)}close(W){if(this.closed)return;this.closed=!0;for(let Z of this.pending.values())Z.reject(W);this.pending.clear(),this.handlers.clear(),this.backlog=[]}}function NW(W,Z){return new AW(W,Z)}class p{url;renderId;frameworkNavigate;activeViews;socket=null;messageQueue;connectionListeners=new Set;serverErrors=new Map;serverErrorListeners=new Set;channels=new Map;constructor(W,Z,$){this.url=W;this.renderId=Z;this.frameworkNavigate=$;this.socket=null,this.activeViews=new Map,this.messageQueue=[]}isConnected(){return this.socket?.connected??!1}async connect(){if(this.socket)return;return new Promise((W,Z)=>{let $=X0(this.url,{transports:["websocket","webtransport"],auth:{renderId:this.renderId}});this.socket=$,$.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let[Q,q]of this.activeViews)$.emit("message",_({type:"mount",path:Q,routeInfo:q.routeInfo}));for(let Q of this.messageQueue){if(Q.type==="mount"&&this.activeViews.has(Q.path))continue;if(Q.type==="navigate")continue;$.emit("message",_(Q))}this.messageQueue=[],this.notifyConnectionListeners(!0),W()}),$.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),Z(Q)}),$.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.handleTransportDisconnect(),this.notifyConnectionListeners(!1)}),$.on("message",(Q)=>this.handleServerMessage(r(Q,{coerceNullsToUndefined:!0})))})}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let Z of this.connectionListeners)Z(W)}onServerError(W){this.serverErrorListeners.add(W);for(let[Z,$]of this.serverErrors)W(Z,$);return()=>{this.serverErrorListeners.delete(W)}}notifyServerError(W,Z){for(let $ of this.serverErrorListeners)$(W,Z)}async sendMessage(W){if(this.isConnected())this.socket.emit("message",_(W));else this.messageQueue.push(W)}async sendChannelMessage(W){await this.sendMessage(W)}mountView(W,Z){if(this.activeViews.has(W))throw Error(`Path ${W} is already mounted`);this.activeViews.set(W,Z),this.sendMessage({type:"mount",path:W,routeInfo:Z.routeInfo})}async navigate(W,Z){await this.sendMessage({type:"navigate",path:W,routeInfo:Z})}unmount(W){this.sendMessage({type:"unmount",path:W}),this.activeViews.delete(W)}disconnect(){this.socket?.disconnect(),this.socket=null,this.messageQueue=[],this.connectionListeners.clear(),this.activeViews.clear(),this.serverErrors.clear(),this.serverErrorListeners.clear();for(let{bridge:W}of this.channels.values())W.dispose(new L("Client disconnected"));this.channels.clear()}handleServerMessage(W){switch(W.type){case"vdom_init":{let Z=this.activeViews.get(W.path);if(!Z)return;if(Z)Z.onInit(W.vdom,W.callbacks,W.render_props,W.css_refs);if(this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"vdom_update":{let Z=this.activeViews.get(W.path);if(!Z)return;if(Z.onUpdate(W.ops),this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"server_error":{if(!this.activeViews.has(W.path))return;this.serverErrors.set(W.path,W.error),this.notifyServerError(W.path,W.error);break}case"api_call":{this.performApiCall(W);break}case"navigate_to":{let Z=!!W.replace,$=W.path||"";if($.startsWith("//"))$=`${window.location.protocol}${$}`;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test($))if($.startsWith("http://")||$.startsWith("https://"))try{let q=new URL($);if(q.origin===window.location.origin){let F=`${q.pathname}${q.search}${q.hash}`;this.frameworkNavigate(F,{replace:Z})}else if(Z)window.location.replace($);else window.location.assign($)}catch{if(Z)window.location.replace($);else window.location.assign($)}else if(Z)window.location.replace($);else window.location.assign($);else this.frameworkNavigate($,{replace:Z});break}case"channel_message":{this.routeChannelMessage(W);break}default:console.error("Unexpected message:",W)}}async performApiCall(W){try{let Z=await fetch(W.url,{method:W.method||"GET",headers:{...W.headers||{},...W.body!=null&&!("content-type"in(W.headers||{}))?{"content-type":"application/json"}:{}},body:W.body!=null?typeof W.body==="string"?W.body:JSON.stringify(W.body):void 0,credentials:W.credentials||"include"}),$={};Z.headers.forEach((N,J)=>$[J]=N);let Q=null;if((Z.headers.get("content-type")||"").includes("application/json"))Q=await Z.json().catch(()=>null);else Q=await Z.text().catch(()=>null);let F={type:"api_result",id:W.id,ok:Z.ok,status:Z.status,headers:$,body:Q};await this.sendMessage(F)}catch(Z){let $={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(Z)}};await this.sendMessage($)}}async invokeCallback(W,Z,$){await this.sendMessage({type:"callback",path:W,callback:Z,args:$.map(s)})}acquireChannel(W){let Z=this.ensureChannelEntry(W);return Z.refCount+=1,Z.bridge}releaseChannel(W){let Z=this.channels.get(W);if(!Z)return;if(Z.refCount=Math.max(0,Z.refCount-1),Z.refCount===0)Z.bridge.dispose(new L("Channel released")),this.channels.delete(W)}ensureChannelEntry(W){let Z=this.channels.get(W);if(!Z)Z={bridge:NW(this,W),refCount:0},this.channels.set(W,Z);return Z}routeChannelMessage(W){let Z=this.ensureChannelEntry(W.channel);if(Z.bridge.handleServerMessage(W)&&Z.refCount===0)this.channels.delete(W.channel)}handleTransportDisconnect(){for(let W of this.channels.values())W.bridge.handleDisconnect(new L("Connection lost"))}}import{useLocation as z0,useParams as G0,useNavigate as U0}from"react-router";import{jsx as b,jsxs as E}from"react/jsx-runtime";var fW=CW(null),PW=CW(null),i=()=>{let W=RW(fW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},V0=(W)=>{let Z=RW(PW);if(!Z)throw Error("usePulsePrerender must be used within a PulseProvider");let $=Z.views[W];if(!$)throw Error(`No prerender found for '${W}'`);return $},e=typeof window<"u";function D0({children:W,config:Z,prerender:$}){let[Q,q]=a(!0),F=U0(),{renderId:N}=$,J=t(()=>new p(Z.serverAddress,N,F),[Z.serverAddress,F,N]);return u(()=>J.onConnectionChange(q),[J]),u(()=>{if(e)return J.connect(),()=>J.disconnect()},[J]),b(fW.Provider,{value:J,children:E(PW.Provider,{value:$,children:[!Q&&b("div",{style:{position:"fixed",bottom:"20px",right:"20px",backgroundColor:"red",color:"white",padding:"10px",borderRadius:"5px",zIndex:1000},children:"Failed to connect to the server."}),W]})})}function O0({externalComponents:W,path:Z,cssModules:$}){let Q=i(),q=V0(Z),F=q.vdom,N=t(()=>new x(Q,Z,W,$,q.callbacks,q.render_props,q.css_refs),[Q,Z,W,$,q]),[J,U]=a(()=>N.renderNode(F)),[G,V]=a(null),D=z0(),A=G0(),z=t(()=>{let{"*":O="",...C}=A,R=new URLSearchParams(D.search);return{hash:D.hash,pathname:D.pathname,query:D.search,queryParams:Object.fromEntries(R.entries()),pathParams:C,catchall:O.length>0?O.split("/"):[]}},[D.hash,D.pathname,D.search,JSON.stringify(A)]);if(u(()=>{if(e){Q.mountView(Z,{routeInfo:z,onInit:(C,R,f,B)=>{N.setCallbacks(R),N.setRenderProps(f),N.setCssRefs(B),U(N.renderNode(C))},onUpdate:(C)=>{U((R)=>R==null?R:n(R,C,N))}});let O=Q.onServerError((C,R)=>{if(C===Z)V(R)});return()=>{O(),Q.unmount(Z)}}},[Q]),u(()=>{if(e)Q.navigate(Z,z)},[Q,Z,z]),G)return b(A0,{error:G});return J}function A0({error:W}){return E("div",{style:{padding:16,border:"1px solid #e00",background:"#fff5f5",color:"#900",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',whiteSpace:"pre-wrap"},children:[E("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&b("div",{children:W.message}),W.stack&&E("details",{open:!0,style:{marginTop:8},children:[b("summary",{children:"Stack trace"}),b("pre",{style:{margin:0},children:W.stack})]})]})}import{useEffect as N0,useMemo as C0}from"react";function R0(W){let Z=i(),$=C0(()=>{if(!W)throw Error("usePulseChannel requires a non-empty channelId");return Z.acquireChannel(W)},[Z,W]);return N0(()=>{return()=>{Z.releaseChannel(W)}},[Z,W]),$}import{forwardRef as f0,useCallback as P0}from"react";import{jsx as j0}from"react/jsx-runtime";var I0=f0(function({onSubmit:Z,action:$,...Q},q){return j0("form",{...Q,action:$,ref:q,onSubmit:P0((F)=>IW({event:F,action:$,onSubmit:Z}),[$,Z])})});async function IW({event:W,action:Z,onSubmit:$,formData:Q,force:q}){if($?.(W),!q&&W.defaultPrevented)return;let F=W.currentTarget;W.preventDefault();let N=W.nativeEvent;if(!Q)Q=new FormData(F,N.submitter);let J=new URL(Z,window.location.href);try{await fetch(J,{method:"POST",credentials:"include",body:Q})}catch(U){throw U}}import{io as B0}from"socket.io-client";class jW{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(W){this.url=W}connect(W){return this.listener=W,new Promise((Z,$)=>{this.socket=B0(this.url,{transports:["websocket"]}),this.socket.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let Q of this.messageQueue)this.socket?.emit("message",Q);this.messageQueue=[],this.notifyConnectionListeners(!0),Z()}),this.socket.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),$(Q)}),this.socket.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),this.socket.on("message",(Q)=>{this.listener?.(Q)})})}disconnect(){this.socket?.disconnect(),this.socket=null,this.listener=null,this.messageQueue=[],this.connectionListeners.clear()}async sendMessage(W){if(this.isConnected())this.socket.emit("message",W);else this.messageQueue.push(W)}isConnected(){return this.socket?.connected||!1}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let Z of this.connectionListeners)Z(W)}}function w0({params:W,request:Z}){let{"*":$="",...Q}=W,q=new URL(Z.url);return{hash:q.hash,pathname:q.pathname,query:q.search,queryParams:Object.fromEntries(q.searchParams.entries()),pathParams:Q,catchall:$.length>1?$.split("/"):[]}}function K0(W){if(W===null||typeof W!=="object")return!1;let Z=Object.getPrototypeOf(W);return Z===Object.prototype||Z===null}function WW(W){return typeof W==="function"||typeof W==="symbol"||typeof W>"u"}async function H0(W){let Z=await W.arrayBuffer();return Array.from(new Uint8Array(Z))}async function Y0(W){return await g(W,{seen:new WeakMap,nextId:1})}function L0(W,Z){if(W.seen.get(Z)!==void 0)return null;let Q=W.nextId++;return W.seen.set(Z,Q),Q}async function g(W,Z){if(W===null||typeof W!=="object")return W;if(W instanceof Date)return{__t:"datetime",timestamp:W.getTime()};if(W instanceof FormData){let J=L0(Z,W);if(J===null)return{__t:"ref",id:Z.seen.get(W)};let U={};for(let[V,D]of W.entries()){let A=await g(D,Z);if(A===void 0)continue;if(Object.prototype.hasOwnProperty.call(U,V)){let z=U[V];if(Array.isArray(z))z.push(A);else U[V]=[z,A]}else U[V]=A}return{__t:"formdata",fields:U,__id:J}}if(W instanceof File){let J=W,U=await H0(W);return{__t:"file",name:J.name,type:J.type,size:J.size,lastModified:J.lastModified,content:U}}let $=W,Q=Z.seen.get($);if(Q!==void 0)return{__t:"ref",id:Q};let q=Z.nextId++;if(Z.seen.set($,q),Array.isArray(W)){let U=(await Promise.all(W.map((V)=>g(V,Z)))).filter((V)=>V!==void 0);return{__t:"array",__id:q,items:U}}let F={};if(K0(W))for(let J of Object.keys(W)){let U=W[J];if(WW(U))continue;let G=await g(U,Z);if(G!==void 0)F[J]=G}else for(let J in W){let U=W[J];if(WW(U))continue;let G=await g(U,Z);if(G!==void 0)F[J]=G}return{__t:"object",__id:q,props:F}}function M0(W){return k(W)}function k(W){if(W===null||typeof W!=="object")return W;let Z=W,$=Z.__t;if($==="datetime"){let q=Z.timestamp;return new Date(q)}if($==="file"){let q=Z.content;if(Array.isArray(q))return{...Z,content:new Uint8Array(q)};return Z}if($==="formdata"){let q=Z.fields,F={};for(let N of Object.keys(q)){let J=q[N];if(Array.isArray(J))F[N]=J.map((U)=>k(U));else F[N]=k(J)}return{__t:"formdata",fields:F}}if($==="array")return Z.items.map((F)=>k(F));if($==="object"){let q=Z.props,F={};for(let N of Object.keys(q))F[N]=k(q[N]);return F}if($==="ref")return Z;let Q={};for(let q of Object.keys(Z))Q[q]=k(Z[q]);return Q}function y0(W){return ZW(W,new WeakSet)}function ZW(W,Z){if(W===null||typeof W!=="object")return W;if(Z.has(W))return;if(Z.add(W),Array.isArray(W))return W.map((Q)=>ZW(Q,Z)).filter((Q)=>Q!==void 0);let $={};for(let Q in W){let q=W[Q];if(WW(q))continue;let F=ZW(q,Z);if(F!==void 0)$[Q]=F}return $}export{i as usePulseClient,R0 as usePulseChannel,IW as submitForm,_ as serialize,w0 as extractServerRouteInfo,s as extractEvent,Y0 as encodeForWire,r as deserialize,M0 as decodeFromWire,y0 as cleanForSerialization,n as applyReactTreeUpdates,x as VDOMRenderer,jW as SocketIOTransport,YW as RenderLazy,O0 as PulseView,p as PulseSocketIOClient,D0 as PulseProvider,I0 as PulseForm,L as PulseChannelResetError};
3
3
 
4
- //# debugId=1C74308B5849B97C64756E2164756E21
5
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS92My50cyIsICIuLi9zcmMvY2xpZW50LnRzeCIsICIuLi9zcmMvY2hhbm5lbC50cyIsICIuLi9zcmMvdXNlUHVsc2VDaGFubmVsLnRzIiwgIi4uL3NyYy9mb3JtLnRzeCIsICIuLi9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL3NyYy9oZWxwZXJzLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvY2xlYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IFJlYWN0LCB7XG4gIHVzZUVmZmVjdCxcbiAgdXNlU3RhdGUsXG4gIHVzZU1lbW8sXG4gIGNyZWF0ZUNvbnRleHQsXG4gIHVzZUNvbnRleHQsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBWRE9NUmVuZGVyZXIsIGFwcGx5VXBkYXRlcyB9IGZyb20gXCIuL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFZET00sIENvbXBvbmVudFJlZ2lzdHJ5LCBSZWdpc3RyeUVudHJ5IH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgdXNlTG9jYXRpb24sIHVzZVBhcmFtcywgdXNlTmF2aWdhdGUgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckVycm9ySW5mb30gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDb25maWcge1xuICBzZXJ2ZXJBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFB1bHNlUHJlcmVuZGVyVmlldyA9IHtcbiAgdmRvbTogVkRPTTtcbiAgY2FsbGJhY2tzOiBzdHJpbmdbXTtcbiAgcmVuZGVyX3Byb3BzOiBzdHJpbmdbXTtcbiAgY3NzX3JlZnM6IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgUHVsc2VQcmVyZW5kZXIgPSB7XG4gIHJlbmRlcklkOiBzdHJpbmc7XG4gIHZpZXdzOiBSZWNvcmQ8c3RyaW5nLCBQdWxzZVByZXJlbmRlclZpZXc+O1xufTtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250ZXh0IGFuZCBIb29rc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gQ29udGV4dCBmb3IgdGhlIGNsaWVudCwgcHJvdmlkZWQgYnkgUHVsc2VQcm92aWRlclxuY29uc3QgUHVsc2VDbGllbnRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxQdWxzZVNvY2tldElPQ2xpZW50IHwgbnVsbD4obnVsbCk7XG5jb25zdCBQdWxzZVByZXJlbmRlckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlUHJlcmVuZGVyIHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZUNsaWVudCA9ICgpID0+IHtcbiAgY29uc3QgY2xpZW50ID0gdXNlQ29udGV4dChQdWxzZUNsaWVudENvbnRleHQpO1xuICBpZiAoIWNsaWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlQ2xpZW50IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlUHVsc2VQcmVyZW5kZXIgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoUHVsc2VQcmVyZW5kZXJDb250ZXh0KTtcbiAgaWYgKCFjdHgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1c2VQdWxzZVByZXJlbmRlciBtdXN0IGJlIHVzZWQgd2l0aGluIGEgUHVsc2VQcm92aWRlclwiKTtcbiAgfVxuICBjb25zdCB2aWV3ID0gY3R4LnZpZXdzW3BhdGhdO1xuICBpZiAoIXZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHByZXJlbmRlciBmb3VuZCBmb3IgJyR7cGF0aH0nYCk7XG4gIH1cbiAgcmV0dXJuIHZpZXc7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUHJvdmlkZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VQcm92aWRlclByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgY29uZmlnOiBQdWxzZUNvbmZpZztcbiAgcHJlcmVuZGVyOiBQdWxzZVByZXJlbmRlcjtcbn1cblxuY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFB1bHNlUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgY29uZmlnLFxuICBwcmVyZW5kZXIsXG59OiBQdWxzZVByb3ZpZGVyUHJvcHMpIHtcbiAgY29uc3QgW2Nvbm5lY3RlZCwgc2V0Q29ubmVjdGVkXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCByck5hdmlnYXRlID0gdXNlTmF2aWdhdGUoKTtcbiAgY29uc3QgeyByZW5kZXJJZCB9ID0gcHJlcmVuZGVyO1xuXG4gIGNvbnN0IGNsaWVudCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFB1bHNlU29ja2V0SU9DbGllbnQoY29uZmlnLnNlcnZlckFkZHJlc3MsIHJlbmRlcklkLCByck5hdmlnYXRlKSxcbiAgICBbY29uZmlnLnNlcnZlckFkZHJlc3MsIHJyTmF2aWdhdGUsIHJlbmRlcklkXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBjbGllbnQub25Db25uZWN0aW9uQ2hhbmdlKHNldENvbm5lY3RlZCksIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5jb25uZWN0KCk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH0sIFtjbGllbnRdKTtcblxuICByZXR1cm4gKFxuICAgIDxQdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NsaWVudH0+XG4gICAgICA8UHVsc2VQcmVyZW5kZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcmVyZW5kZXJ9PlxuICAgICAgICB7IWNvbm5lY3RlZCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgYm90dG9tOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgcmlnaHQ6IFwiMjBweFwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgICAgIHBhZGRpbmc6IFwiMTBweFwiLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICAgICAgICAgIHpJbmRleDogMTAwMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9QdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9QdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWaWV3XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVmlld1Byb3BzIHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeTtcbiAgcGF0aDogc3RyaW5nO1xuICBjc3NNb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFB1bHNlVmlldyh7XG4gIGV4dGVybmFsQ29tcG9uZW50cyxcbiAgcGF0aCxcbiAgY3NzTW9kdWxlcyxcbn06IFB1bHNlVmlld1Byb3BzKSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG4gIGNvbnN0IGluaXRpYWxWaWV3ID0gdXNlUHVsc2VQcmVyZW5kZXIocGF0aCk7XG4gIGNvbnN0IGluaXRpYWxWRE9NID0gaW5pdGlhbFZpZXcudmRvbTtcbiAgY29uc3QgcmVuZGVyZXIgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBuZXcgVkRPTVJlbmRlcmVyKFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGV4dGVybmFsQ29tcG9uZW50cyxcbiAgICAgICAgY3NzTW9kdWxlcyxcbiAgICAgICAgaW5pdGlhbFZpZXcuY2FsbGJhY2tzLFxuICAgICAgICBpbml0aWFsVmlldy5yZW5kZXJfcHJvcHMsXG4gICAgICAgIGluaXRpYWxWaWV3LmNzc19yZWZzXG4gICAgICApLFxuICAgIFtjbGllbnQsIHBhdGgsIGV4dGVybmFsQ29tcG9uZW50cywgY3NzTW9kdWxlcywgaW5pdGlhbFZpZXddXG4gICk7XG4gIGNvbnN0IFt0cmVlLCBzZXRUcmVlXSA9IHVzZVN0YXRlPFJlYWN0LlJlYWN0Tm9kZT4oKCkgPT5cbiAgICByZW5kZXJlci5yZW5kZXJOb2RlKGluaXRpYWxWRE9NKVxuICApO1xuICBjb25zdCBbc2VydmVyRXJyb3IsIHNldFNlcnZlckVycm9yXSA9IHVzZVN0YXRlPFNlcnZlckVycm9ySW5mbyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG5cbiAgY29uc3Qgcm91dGVJbmZvID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc2g6IGxvY2F0aW9uLmhhc2gsXG4gICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBxdWVyeTogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgcXVlcnlQYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyhxdWVyeVBhcmFtcy5lbnRyaWVzKCkpLFxuICAgICAgcGF0aFBhcmFtcyxcbiAgICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAwID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gICAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xuICB9LCBbXG4gICAgbG9jYXRpb24uaGFzaCxcbiAgICBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICBsb2NhdGlvbi5zZWFyY2gsXG4gICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5Ccm93c2VyKSB7XG4gICAgICBjbGllbnQubW91bnRWaWV3KHBhdGgsIHtcbiAgICAgICAgcm91dGVJbmZvLFxuICAgICAgICBvbkluaXQ6ICh2ZG9tLCBjYWxsYmFja3MsIHJlbmRlclByb3BzLCBjc3NSZWZzKSA9PiB7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0Q2FsbGJhY2tzKGNhbGxiYWNrcyk7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyUHJvcHMocmVuZGVyUHJvcHMpO1xuICAgICAgICAgIHJlbmRlcmVyLnNldENzc1JlZnMoY3NzUmVmcyk7XG4gICAgICAgICAgc2V0VHJlZShyZW5kZXJlci5yZW5kZXJOb2RlKHZkb20pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IChvcHMpID0+IHtcbiAgICAgICAgICBzZXRUcmVlKChwcmV2KSA9PlxuICAgICAgICAgICAgcHJldiA9PSBudWxsID8gcHJldiA6IGFwcGx5VXBkYXRlcyhwcmV2LCBvcHMsIHJlbmRlcmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9mZkVyciA9IGNsaWVudC5vblNlcnZlckVycm9yKChwLCBlcnIpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IHBhdGgpIHNldFNlcnZlckVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9mZkVycigpO1xuICAgICAgICBjbGllbnQudW5tb3VudChwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIHJvdXRlSW5mbyBpcyBOT1QgaW5jbHVkZWQgaGVyZSBvbiBwdXJwb3NlXG4gIH0sIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5uYXZpZ2F0ZShwYXRoLCByb3V0ZUluZm8pO1xuICAgIH1cbiAgfSwgW2NsaWVudCwgcGF0aCwgcm91dGVJbmZvXSk7XG5cbiAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgcmV0dXJuIDxTZXJ2ZXJFcnJvciBlcnJvcj17c2VydmVyRXJyb3J9IC8+O1xuICB9XG5cbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIFNlcnZlckVycm9yKHsgZXJyb3IgfTogeyBlcnJvcjogU2VydmVyRXJyb3JJbmZvIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBzdHlsZT17e1xuICAgICAgICBwYWRkaW5nOiAxNixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjZTAwXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2ZmZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjOTAwXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6XG4gICAgICAgICAgJ3VpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwicHJlLXdyYXBcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBzdHlsZT17eyBmb250V2VpZ2h0OiA3MDAsIG1hcmdpbkJvdHRvbTogOCB9fT5cbiAgICAgICAgU2VydmVyIEVycm9yIGR1cmluZyB7ZXJyb3IucGhhc2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtlcnJvci5tZXNzYWdlICYmIDxkaXY+e2Vycm9yLm1lc3NhZ2V9PC9kaXY+fVxuICAgICAge2Vycm9yLnN0YWNrICYmIChcbiAgICAgICAgPGRldGFpbHMgb3BlbiBzdHlsZT17eyBtYXJnaW5Ub3A6IDggfX0+XG4gICAgICAgICAgPHN1bW1hcnk+U3RhY2sgdHJhY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHByZSBzdHlsZT17eyBtYXJnaW46IDAgfX0+e2Vycm9yLnN0YWNrfTwvcHJlPlxuICAgICAgICA8L2RldGFpbHM+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgY2xvbmVFbGVtZW50LFxuICBjcmVhdGVFbGVtZW50LFxuICBpc1ZhbGlkRWxlbWVudCxcbiAgbGF6eSxcbiAgU3VzcGVuc2UsXG4gIHR5cGUgQ29tcG9uZW50VHlwZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudFJlZ2lzdHJ5LCBWRE9NTm9kZSwgVkRPTVVwZGF0ZSwgVkRPTSB9IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7XG4gIEZSQUdNRU5UX1RBRyxcbiAgaXNFbGVtZW50Tm9kZSxcbiAgaXNNb3VudFBvaW50Tm9kZSxcbiAgTU9VTlRfUE9JTlRfUFJFRklYLFxufSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgdHlwZSB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcblxuZXhwb3J0IGNsYXNzIFZET01SZW5kZXJlciB7XG4gIHByaXZhdGUgY2FsbGJhY2tDYWNoZTogTWFwPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPjtcbiAgcHJpdmF0ZSBjYWxsYmFja1Byb3BzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj47XG4gIHByaXZhdGUgcmVuZGVyUHJvcEtleXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIGNzc1Byb3BzOiBTZXQ8c3RyaW5nPjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjbGllbnQ6IFB1bHNlU29ja2V0SU9DbGllbnQsXG4gICAgcHJpdmF0ZSBwYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeSxcbiAgICBwcml2YXRlIGNzc01vZHVsZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICAgIGluaXRpYWxDYWxsYmFja3M6IHN0cmluZ1tdID0gW10sXG4gICAgaW5pdGlhbFJlbmRlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIGluaXRpYWxDc3NSZWZzOiBzdHJpbmdbXSA9IFtdXG4gICkge1xuICAgIHRoaXMuY2FsbGJhY2tDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmNhbGxiYWNrUHJvcHMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5yZW5kZXJQcm9wS2V5cyA9IG5ldyBTZXQoaW5pdGlhbFJlbmRlclByb3BzKTtcbiAgICB0aGlzLmNzc1Byb3BzID0gbmV3IFNldChpbml0aWFsQ3NzUmVmcyk7XG4gICAgdGhpcy5zZXRDYWxsYmFja3MoaW5pdGlhbENhbGxiYWNrcyk7XG4gIH1cblxuICBzZXRDYWxsYmFja3Moa2V5czogc3RyaW5nW10pIHtcbiAgICB0aGlzLmNhbGxiYWNrUHJvcHMuY2xlYXIoKTtcbiAgICB0aGlzLmNhbGxiYWNrQ2FjaGUuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBbcGF0aCwgcHJvcF0gPSB0aGlzLnNwbGl0UHJvcFBhdGgoa2V5KTtcbiAgICAgIGlmICghdGhpcy5jYWxsYmFja1Byb3BzLmhhcyhwYXRoKSkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrUHJvcHMuc2V0KHBhdGgsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGxiYWNrUHJvcHMuZ2V0KHBhdGgpIS5hZGQocHJvcCk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlDYWxsYmFja0RlbHRhKFxuICAgIGRlbHRhOiB7IGFkZD86IHN0cmluZ1tdOyByZW1vdmU/OiBzdHJpbmdbXSB9LFxuICAgIHRyZWU6IFJlYWN0LlJlYWN0Tm9kZVxuICApOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgIGNvbnN0IGJlZm9yZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgICBjb25zdCByZWNvcmRCZWZvcmUgPSAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWJlZm9yZU1hcC5oYXMocGF0aCkpIHtcbiAgICAgICAgYmVmb3JlTWFwLnNldChwYXRoLCBuZXcgU2V0KHRoaXMuY2FsbGJhY2tQcm9wcy5nZXQocGF0aCkgPz8gW10pKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGRlbHRhLnJlbW92ZSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgIGNvbnN0IFtwYXRoLCBwcm9wXSA9IHRoaXMuc3BsaXRQcm9wUGF0aChrZXkpO1xuICAgICAgICByZWNvcmRCZWZvcmUocGF0aCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhbGxiYWNrUHJvcHMuZ2V0KHBhdGgpO1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgICB0aGlzLmNhbGxiYWNrQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxsYmFja0NhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICBjdXJyZW50LmRlbGV0ZShwcm9wKTtcbiAgICAgICAgaWYgKGN1cnJlbnQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2tQcm9wcy5kZWxldGUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVsdGEuYWRkKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5hZGQpIHtcbiAgICAgICAgY29uc3QgW3BhdGgsIHByb3BdID0gdGhpcy5zcGxpdFByb3BQYXRoKGtleSk7XG4gICAgICAgIHJlY29yZEJlZm9yZShwYXRoKTtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGxiYWNrUHJvcHMuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFja1Byb3BzLnNldChwYXRoLCBuZXcgU2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2tQcm9wcy5nZXQocGF0aCkhLmFkZChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbmV4dFRyZWUgPSB0cmVlO1xuICAgIGZvciAoY29uc3QgW3BhdGgsIGJlZm9yZV0gb2YgYmVmb3JlTWFwLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgYWZ0ZXIgPSBuZXcgU2V0KHRoaXMuY2FsbGJhY2tQcm9wcy5nZXQocGF0aCkgPz8gW10pO1xuICAgICAgaWYgKHRoaXMuc2V0c0VxdWFsKGJlZm9yZSwgYWZ0ZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFydHMgPSBwYXRoXG4gICAgICAgID8gcGF0aC5zcGxpdChcIi5cIikuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG4gICAgICAgIDogW107XG4gICAgICBuZXh0VHJlZSA9IHRoaXMudXBkYXRlQ2FsbGJhY2tzT25UcmVlKFxuICAgICAgICBuZXh0VHJlZSxcbiAgICAgICAgcGFydHMsXG4gICAgICAgIDAsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGJlZm9yZSxcbiAgICAgICAgYWZ0ZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRUcmVlO1xuICB9XG5cbiAgc2V0UmVuZGVyUHJvcHMoa2V5czogc3RyaW5nW10pIHtcbiAgICB0aGlzLnJlbmRlclByb3BLZXlzID0gbmV3IFNldChrZXlzKTtcbiAgfVxuXG4gIHNldENzc1JlZnMoZW50cmllczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmNzc1Byb3BzID0gbmV3IFNldChlbnRyaWVzKTtcbiAgfVxuXG4gIGFwcGx5UmVuZGVyUHJvcHNEZWx0YShkZWx0YTogeyBhZGQ/OiBzdHJpbmdbXTsgcmVtb3ZlPzogc3RyaW5nW10gfSkge1xuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICB0aGlzLnJlbmRlclByb3BLZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEuYWRkKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5hZGQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJQcm9wS2V5cy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseUNzc1JlZnNEZWx0YShkZWx0YTogeyBzZXQ/OiBzdHJpbmdbXTsgcmVtb3ZlPzogc3RyaW5nW10gfSkge1xuICAgIGlmIChkZWx0YS5zZXQpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBkZWx0YS5zZXQpIHtcbiAgICAgICAgdGhpcy5jc3NQcm9wcy5hZGQocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YS5yZW1vdmUpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBkZWx0YS5yZW1vdmUpIHtcbiAgICAgICAgdGhpcy5jc3NQcm9wcy5kZWxldGUocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FsbGJhY2socGF0aDogc3RyaW5nLCBwcm9wOiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnByb3BQYXRoKHBhdGgsIHByb3ApO1xuICAgIGxldCBmbiA9IHRoaXMuY2FsbGJhY2tDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoIWZuKSB7XG4gICAgICBmbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdGhpcy5jbGllbnQuaW52b2tlQ2FsbGJhY2sodGhpcy5wYXRoLCBrZXksIGFyZ3MpO1xuICAgICAgdGhpcy5jYWxsYmFja0NhY2hlLnNldChrZXksIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcmVuZGVyTm9kZShub2RlOiBWRE9NTm9kZSwgY3VycmVudFBhdGggPSBcIlwiKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlcyBlYXJseVxuICAgIGlmIChcbiAgICAgIG5vZGUgPT0gbnVsbCB8fCAvLyBjYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgIHR5cGVvZiBub2RlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIlxuICAgICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLy8gRWxlbWVudCBub2Rlc1xuICAgIGlmIChpc0VsZW1lbnROb2RlKG5vZGUpKSB7XG4gICAgICBjb25zdCB7IHRhZywgcHJvcHMgPSB7fSwgY2hpbGRyZW4gPSBbXSB9ID0gbm9kZTtcblxuICAgICAgY29uc3QgbmV3UHJvcHMgPSB7IC4uLnByb3BzIH07XG5cbiAgICAgIC8vIEFwcGx5IGNhbGxiYWNrc1xuICAgICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiB0aGlzLmdldENhbGxiYWNrTmFtZXMoY3VycmVudFBhdGgpKSB7XG4gICAgICAgIG5ld1Byb3BzW3Byb3BOYW1lXSA9IHRoaXMuZ2V0Q2FsbGJhY2soY3VycmVudFBhdGgsIHByb3BOYW1lKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobmV3UHJvcHMpKSB7XG4gICAgICAgIGNvbnN0IHByb3BQYXRoID0gdGhpcy5wcm9wUGF0aChjdXJyZW50UGF0aCwgcHJvcE5hbWUpO1xuICAgICAgICBpZiAodGhpcy5jc3NQcm9wcy5oYXMocHJvcFBhdGgpKSB7XG4gICAgICAgICAgbmV3UHJvcHNbcHJvcE5hbWVdID0gdGhpcy5yZXNvbHZlQ3NzVG9rZW4ocHJvcFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZW5kZXJQcm9wS2V5cy5oYXMocHJvcFBhdGgpKSB7XG4gICAgICAgICAgLy8gVGhpcyBwcm9wIGlzIGEgcmVuZGVyIHByb3AgLSByZW5kZXIgdGhlIFZET00gdG8gUmVhY3RcbiAgICAgICAgICBuZXdQcm9wc1twcm9wTmFtZV0gPSB0aGlzLnJlbmRlck5vZGUocHJvcFZhbHVlLCBwcm9wUGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUua2V5KSB7XG4gICAgICAgIG5ld1Byb3BzLmtleSA9IG5vZGUua2V5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW5kZXJlZENoaWxkcmVuID0gW107XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baW5kZXhdITtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gY3VycmVudFBhdGhcbiAgICAgICAgICA/IGAke2N1cnJlbnRQYXRofS4ke2luZGV4fWBcbiAgICAgICAgICA6IFN0cmluZyhpbmRleCk7XG4gICAgICAgIHJlbmRlcmVkQ2hpbGRyZW4ucHVzaCh0aGlzLnJlbmRlck5vZGUoY2hpbGQsIGNoaWxkUGF0aCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNNb3VudFBvaW50Tm9kZShub2RlKSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRLZXkgPSBub2RlLnRhZy5zbGljZShNT1VOVF9QT0lOVF9QUkVGSVgubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2NvbXBvbmVudEtleV0hO1xuICAgICAgICBpZiAoIUNvbXBvbmVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBjb21wb25lbnQgJHtjb21wb25lbnRLZXl9LiBUaGlzIGlzIGEgUHVsc2UgaW50ZXJuYWwgZXJyb3IuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBuZXdQcm9wcywgLi4ucmVuZGVyZWRDaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICB0YWcgPT09IEZSQUdNRU5UX1RBRyA/IFJlYWN0LkZyYWdtZW50IDogdGFnLFxuICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgLi4ucmVuZGVyZWRDaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBub2RlIHR5cGVzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gVkRPTSBub2RlIHR5cGU6XCIsIG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3BsaXRQcm9wUGF0aChrZXk6IHN0cmluZyk6IFtwYXRoOiBzdHJpbmcsIHByb3A6IHN0cmluZ10ge1xuICAgIGNvbnN0IGxhc3REb3QgPSBrZXkubGFzdEluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChsYXN0RG90ID09PSAtMSkge1xuICAgICAgcmV0dXJuIFtcIlwiLCBrZXldO1xuICAgIH1cbiAgICByZXR1cm4gW2tleS5zbGljZSgwLCBsYXN0RG90KSwga2V5LnNsaWNlKGxhc3REb3QgKyAxKV07XG4gIH1cblxuICBwcml2YXRlIHByb3BQYXRoKHBhdGg6IHN0cmluZywgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGggPyBgJHtwYXRofS4ke3Byb3B9YCA6IHByb3A7XG4gIH1cblxuICBwcml2YXRlIGdldENhbGxiYWNrTmFtZXMocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5jYWxsYmFja1Byb3BzLmdldChwYXRoKTtcbiAgICByZXR1cm4gcHJvcHMgPyBBcnJheS5mcm9tKHByb3BzKSA6IFtdO1xuICB9XG5cbiAgdHJhbnNmb3JtVmFsdWUocGF0aDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tQcm9wcy5nZXQocGF0aCk7XG4gICAgY29uc3QgcHJvcFBhdGggPSB0aGlzLnByb3BQYXRoKHBhdGgsIGtleSk7XG4gICAgaWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3Muc2l6ZSA+IDAgJiYgY2FsbGJhY2tzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDYWxsYmFjayhwYXRoLCBrZXkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZW5kZXJQcm9wS2V5cy5oYXMocHJvcFBhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJOb2RlKHZhbHVlLCBwcm9wUGF0aCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNzc1Byb3BzLmhhcyhwcm9wUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVDc3NUb2tlbih2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNzc1Rva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkeCA9IHRva2VuLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZUlkID0gdG9rZW4uc2xpY2UoMCwgaWR4KTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0b2tlbi5zbGljZShpZHggKyAxKTtcbiAgICBpZiAoIW1vZHVsZUlkIHx8ICFjbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgY29uc3QgbW9kID0gdGhpcy5jc3NNb2R1bGVzW21vZHVsZUlkXTtcbiAgICBpZiAoIW1vZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgQ1NTIHJlZmVyZW5jZSBmb3IgdW5rbm93biBtb2R1bGUgJyR7bW9kdWxlSWR9J2BcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gbW9kW2NsYXNzTmFtZV07XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVjZWl2ZWQgQ1NTIHJlZmVyZW5jZSBmb3IgbWlzc2luZyBjbGFzcyAnJHtjbGFzc05hbWV9JyBpbiBtb2R1bGUgJyR7bW9kdWxlSWR9J2BcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsbGJhY2tzT25UcmVlKFxuICAgIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgICBwYXJ0czogc3RyaW5nW10sXG4gICAgZGVwdGg6IG51bWJlcixcbiAgICBjdXJyZW50UGF0aDogc3RyaW5nLFxuICAgIGJlZm9yZTogU2V0PHN0cmluZz4sXG4gICAgYWZ0ZXI6IFNldDxzdHJpbmc+XG4gICk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgaWYgKGRlcHRoIDwgcGFydHMubGVuZ3RoKSB7XG4gICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgICBjb25zdCBzZWdtZW50ID0gcGFydHNbZGVwdGhdITtcbiAgICAgIGNvbnN0IGNoaWxkSWR4ID0gTnVtYmVyKHNlZ21lbnQpO1xuICAgICAgY29uc3QgbmV4dFBhdGggPSBjdXJyZW50UGF0aCA/IGAke2N1cnJlbnRQYXRofS4ke3NlZ21lbnR9YCA6IHNlZ21lbnQ7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihjaGlsZElkeCkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5BcnIgPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgY29uc3QgdXBkYXRlZENoaWxkID0gdGhpcy51cGRhdGVDYWxsYmFja3NPblRyZWUoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFydHMsXG4gICAgICAgICAgZGVwdGggKyAxLFxuICAgICAgICAgIG5leHRQYXRoLFxuICAgICAgICAgIGJlZm9yZSxcbiAgICAgICAgICBhZnRlclxuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlZENoaWxkID09PSBjaGlsZCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuQXJyW2NoaWxkSWR4XSA9IHVwZGF0ZWRDaGlsZCBhcyBhbnk7XG4gICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgdW5kZWZpbmVkLCAuLi5jaGlsZHJlbkFycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiYXNlUHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBiYXNlUHJvcHNbc2VnbWVudF07XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRDaGlsZCA9IHRoaXMudXBkYXRlQ2FsbGJhY2tzT25UcmVlKFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIHBhcnRzLFxuICAgICAgICAgIGRlcHRoICsgMSxcbiAgICAgICAgICBuZXh0UGF0aCxcbiAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgYWZ0ZXJcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVwZGF0ZWRDaGlsZCA9PT0gY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICAuLi5iYXNlUHJvcHMsXG4gICAgICAgICAgW3NlZ21lbnRdOiB1cGRhdGVkQ2hpbGQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgY29uc3QgY3VycmVudFByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBuZXh0UHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmN1cnJlbnRQcm9wcyB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGJlZm9yZSkge1xuICAgICAgaWYgKCFhZnRlci5oYXMocHJvcCkgJiYgcHJvcCBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgZGVsZXRlIG5leHRQcm9wc1twcm9wXTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGFmdGVyKSB7XG4gICAgICBjb25zdCBmbiA9IHRoaXMuZ2V0Q2FsbGJhY2soY3VycmVudFBhdGgsIHByb3ApO1xuICAgICAgaWYgKG5leHRQcm9wc1twcm9wXSAhPT0gZm4pIHtcbiAgICAgICAgbmV4dFByb3BzW3Byb3BdID0gZm47XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY2hhbmdlZCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbmV4dFByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0c0VxdWFsKGxlZnQ6IFNldDxzdHJpbmc+LCByaWdodDogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAobGVmdC5zaXplICE9PSByaWdodC5zaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbGVmdCkge1xuICAgICAgaWYgKCFyaWdodC5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVwZGF0ZSBGdW5jdGlvbnMgKHNoYWxsb3ctY2xvbmUgYWxvbmcgdXBkYXRlIHBhdGgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBlbnN1cmVDaGlsZHJlbkFycmF5KGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpOiBSZWFjdC5SZWFjdE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gKGVsLnByb3BzIGFzIGFueSk/LmNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVVwZGF0ZXMoXG4gIGluaXRpYWxUcmVlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHVwZGF0ZXM6IFZET01VcGRhdGVbXSxcbiAgcmVuZGVyZXI6IFZET01SZW5kZXJlclxuKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgbGV0IG5ld1RyZWU6IFJlYWN0LlJlYWN0Tm9kZSA9IGluaXRpYWxUcmVlO1xuICBmb3IgKGNvbnN0IHVwZGF0ZSBvZiB1cGRhdGVzKSB7XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jYWxsYmFja3NcIikge1xuICAgICAgbmV3VHJlZSA9IHJlbmRlcmVyLmFwcGx5Q2FsbGJhY2tEZWx0YSh1cGRhdGUuZGF0YSwgbmV3VHJlZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9jc3NfcmVmc1wiKSB7XG4gICAgICByZW5kZXJlci5hcHBseUNzc1JlZnNEZWx0YSh1cGRhdGUuZGF0YSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZS50eXBlID09PSBcInVwZGF0ZV9yZW5kZXJfcHJvcHNcIikge1xuICAgICAgcmVuZGVyZXIuYXBwbHlSZW5kZXJQcm9wc0RlbHRhKHVwZGF0ZS5kYXRhKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gdXBkYXRlLnBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKTtcblxuICAgIGNvbnN0IGRlc2NlbmQgPSAoXG4gICAgICBub2RlOiBSZWFjdC5SZWFjdE5vZGUsXG4gICAgICBkZXB0aDogbnVtYmVyLFxuICAgICAgY3VycmVudFBhdGg6IHN0cmluZ1xuICAgICk6IFJlYWN0LlJlYWN0Tm9kZSA9PiB7XG4gICAgICBpZiAoZGVwdGggPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD47XG4gICAgICAgIGNvbnN0IGNoaWxkS2V5ID0gcGFydHNbZGVwdGhdITtcbiAgICAgICAgY29uc3QgY2hpbGRJZHggPSArY2hpbGRLZXk7XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5O1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihjaGlsZElkeCkpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGNoaWxkIHRyYXZlcnNhbFxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuQXJyID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgICBjaGlsZHJlbkFycltjaGlsZElkeF0gPSBkZXNjZW5kKGNoaWxkLCBkZXB0aCArIDEsIGNoaWxkUGF0aCkgYXMgYW55O1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgdW5kZWZpbmVkLCAuLi5jaGlsZHJlbkFycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVuZGVyIHByb3AgdHJhdmVyc2FsXG4gICAgICAgICAgY29uc3QgYmFzZVByb3BzID0gKGVsZW1lbnQucHJvcHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBiYXNlUHJvcHNbY2hpbGRLZXldO1xuICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4uYmFzZVByb3BzLFxuICAgICAgICAgICAgW2NoaWxkS2V5XTogZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxLCBjaGlsZFBhdGgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodXBkYXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xuICAgICAgICAgIHJldHVybiByZW5kZXJlci5yZW5kZXJOb2RlKHVwZGF0ZS5kYXRhLCB1cGRhdGUucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInVwZGF0ZV9wcm9wc1wiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9wcyA9IChlbGVtZW50LnByb3BzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uY3VycmVudFByb3BzIH07XG4gICAgICAgICAgY29uc3QgZGVsdGEgPSB1cGRhdGUuZGF0YTtcbiAgICAgICAgICBpZiAoZGVsdGEucmVtb3ZlICYmIGRlbHRhLnJlbW92ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5yZW1vdmUpIHtcbiAgICAgICAgICAgICAgaWYgKGtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbmV4dFByb3BzW2tleV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlbHRhLnNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZGVsdGEuc2V0KSkge1xuICAgICAgICAgICAgICBuZXh0UHJvcHNba10gPSByZW5kZXJlci50cmFuc2Zvcm1WYWx1ZShjdXJyZW50UGF0aCwgaywgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vdCBwYXNzaW5nIGNoaWxkcmVuIC0+IG9ubHkgdXBkYXRlIHRoZSBwcm9wc1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbmV4dFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiaW5zZXJ0XCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgICAgICA/IGAke2N1cnJlbnRQYXRofS4ke3VwZGF0ZS5pZHh9YFxuICAgICAgICAgICAgOiBTdHJpbmcodXBkYXRlLmlkeCk7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKFxuICAgICAgICAgICAgdXBkYXRlLmlkeCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICByZW5kZXJlci5yZW5kZXJOb2RlKHVwZGF0ZS5kYXRhLCBjaGlsZFBhdGgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5pZHgsIDEpO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIm1vdmVcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuZGF0YS5mcm9tX2luZGV4LCAxKVswXTtcbiAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UodXBkYXRlLmRhdGEudG9faW5kZXgsIDAsIGl0ZW0pO1xuICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBjaGlsZHJlbiAoVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdGhlIGBudWxsYCwgYnV0IHRoYXQncyB3aGF0IHRoZSBvZmZpY2lhbCBSZWFjdCBkb2NzIHNheSlcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG51bGwhLCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW1B1bHNlIHJlbmRlcmVyXSBVbmtub3duIHVwZGF0ZSB0eXBlOiAke3VwZGF0ZVtcInR5cGVcIl19YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIG5ld1RyZWUgPSBkZXNjZW5kKG5ld1RyZWUsIDAsIFwiXCIpO1xuICB9XG4gIHJldHVybiBuZXdUcmVlO1xufVxuXG4vLyBUaGUgYGNvbXBvbmVudGAgcHJvcCBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgYCgpID0+XG4vLyBpbXBvcnQoJ34vcGF0aC90by9jb21wb25lbnQnKSAod2UnbGwgbmVlZCB0byByZW1hcCBpZiB3ZSdyZSBpbXBvcnRpbmcgYSBuYW1lZCBleHBvcnQgYW5kIG5vdCB0aGUgZGVmYXVsdClcbmV4cG9ydCBmdW5jdGlvbiBSZW5kZXJMYXp5KFxuICBjb21wb25lbnQ6ICgpID0+IFByb21pc2U8eyBkZWZhdWx0OiBDb21wb25lbnRUeXBlPGFueT4gfT4sXG4gIGZhbGxiYWNrPzogUmVhY3QuUmVhY3ROb2RlXG4pOiBSZWFjdC5GQzxSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPj4ge1xuICBjb25zdCBDb21wb25lbnQgPSBsYXp5KGNvbXBvbmVudCk7XG4gIHJldHVybiAoeyBjaGlsZHJlbiwgLi4ucHJvcHMgfTogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48dW5rbm93bj4pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1c3BlbnNlIGZhbGxiYWNrPXtmYWxsYmFjayA/PyA8PjwvPn0+XG4gICAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9Db21wb25lbnQ+XG4gICAgICA8L1N1c3BlbnNlPlxuICAgICk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGFzc2VydElzRWxlbWVudChcbiAgbm9kZTogUmVhY3QuUmVhY3ROb2RlLFxuICBwYXJ0czogc3RyaW5nW10sXG4gIGRlcHRoOiBudW1iZXJcbik6IG5vZGUgaXMgUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBub2RlOlwiLCBub2RlKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG5vZGUgYXQgcGF0aCBcIiArIHBhcnRzLnNsaWNlKDAsIGRlcHRoKS5qb2luKFwiLlwiKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHlwZSB9IGZyb20gXCJyZWFjdFwiO1xuXG4vLyBTcGVjaWFsIHByZWZpeGVzIGZvciByZXNlcnZlZCBub2RlIHR5cGVzXG5leHBvcnQgY29uc3QgRlJBR01FTlRfVEFHID0gXCIkJGZyYWdtZW50XCI7XG5leHBvcnQgY29uc3QgTU9VTlRfUE9JTlRfUFJFRklYID0gXCIkJFwiO1xuXG4vLyBleHBvcnQgdHlwZSBMYXp5Q29tcG9uZW50ID0gKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PjtcbmV4cG9ydCB0eXBlIFJlZ2lzdHJ5RW50cnkgPSBDb21wb25lbnRUeXBlPGFueT47XG5leHBvcnQgdHlwZSBDb21wb25lbnRSZWdpc3RyeSA9IFJlY29yZDxzdHJpbmcsIENvbXBvbmVudFR5cGU8YW55Pj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVkRPTUVsZW1lbnQge1xuICB0YWc6IHN0cmluZztcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBjaGlsZHJlbj86IFZET01Ob2RlW107XG4gIGtleT86IHN0cmluZztcbiAgbGF6eT86IGJvb2xlYW47XG59XG5cbi8vIFByaW1pdGl2ZSBub2RlcyB0aGF0IGNhbiBiZSByZW5kZXJlZFxuZXhwb3J0IHR5cGUgUHJpbWl0aXZlTm9kZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIFZET01Ob2RlIGlzIGVpdGhlciBhIHByaW1pdGl2ZSAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4pIG9yIGFuIGVsZW1lbnQgbm9kZS5cbi8vIEJvb2xlYW5zIGFyZSB2YWxpZCBjaGlsZHJlbiBpbiBSZWFjdCBidXQgZG8gbm90IHJlbmRlciBhbnl0aGluZy5cbi8vIE1vdW50IHBvaW50cyBhcmUganVzdCBVSUVsZW1lbnROb2RlcyB3aXRoIHRhZ3Mgc3RhcnRpbmcgd2l0aCAkJENvbXBvbmVudEtleVxuZXhwb3J0IHR5cGUgVkRPTU5vZGUgPSBQcmltaXRpdmVOb2RlIHwgVkRPTUVsZW1lbnQ7XG5cbmV4cG9ydCB0eXBlIFZET00gPSBWRE9NTm9kZTtcblxuZXhwb3J0IHR5cGUgVXBkYXRlVHlwZSA9XG4gIHwgXCJpbnNlcnRcIlxuICB8IFwicmVtb3ZlXCJcbiAgfCBcInJlcGxhY2VcIlxuICB8IFwidXBkYXRlX3Byb3BzXCJcbiAgfCBcIm1vdmVcIlxuICB8IFwidXBkYXRlX2NhbGxiYWNrc1wiXG4gIHwgXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCJcbiAgfCBcInVwZGF0ZV9jc3NfcmVmc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogVXBkYXRlVHlwZTtcbiAgcGF0aDogc3RyaW5nOyAvLyBEb3Qtc2VwYXJhdGVkIHBhdGggdG8gdGhlIG5vZGVcbiAgZGF0YT86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwiaW5zZXJ0XCI7XG4gIGRhdGE6IFZET01Ob2RlOyAvLyBUaGUgbm9kZSB0byBpbnNlcnRcbiAgaWR4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInJlbW92ZVwiO1xuICBpZHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBsYWNlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInJlcGxhY2VcIjtcbiAgZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBuZXcgbm9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb3BzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9wcm9wc1wiO1xuICBkYXRhOiB7XG4gICAgc2V0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb3ZlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcIm1vdmVcIjtcbiAgZGF0YToge1xuICAgIGZyb21faW5kZXg6IG51bWJlcjtcbiAgICB0b19pbmRleDogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNhbGxiYWNrc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfY2FsbGJhY2tzXCI7XG4gIGRhdGE6IHtcbiAgICBhZGQ/OiBzdHJpbmdbXTsgLy8gZnVsbCBjYWxsYmFjayBrZXlzIGxpa2UgXCIwLjEub25DbGlja1wiXG4gICAgcmVtb3ZlPzogc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUmVuZGVyUHJvcHNVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX3JlbmRlcl9wcm9wc1wiO1xuICBkYXRhOiB7XG4gICAgYWRkPzogc3RyaW5nW107IC8vIHJlbmRlciBwcm9wIGtleXMgbGlrZSBcIjAuMS5sZWZ0U2VjdGlvblwiXG4gICAgcmVtb3ZlPzogc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ3NzUmVmc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfY3NzX3JlZnNcIjtcbiAgZGF0YToge1xuICAgIHNldD86IHN0cmluZ1tdO1xuICAgIHJlbW92ZT86IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBWRE9NVXBkYXRlID1cbiAgfCBJbnNlcnRVcGRhdGVcbiAgfCBSZW1vdmVVcGRhdGVcbiAgfCBSZXBsYWNlVXBkYXRlXG4gIHwgVXBkYXRlUHJvcHNVcGRhdGVcbiAgfCBNb3ZlVXBkYXRlXG4gIHwgVXBkYXRlQ2FsbGJhY2tzVXBkYXRlXG4gIHwgVXBkYXRlUmVuZGVyUHJvcHNVcGRhdGVcbiAgfCBVcGRhdGVDc3NSZWZzVXBkYXRlO1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIHRoZSBVSSB0cmVlIHN0cnVjdHVyZVxuZXhwb3J0IGZ1bmN0aW9uIGlzRWxlbWVudE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIFZET01FbGVtZW50IHtcbiAgLy8gTWF0Y2hlcyBhbGwgbm9uLXRleHQgbm9kZXNcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmIG5vZGUgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vdW50UG9pbnROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBWRE9NRWxlbWVudCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBub2RlICE9PSBudWxsICYmXG4gICAgbm9kZS50YWcuc3RhcnRzV2l0aChNT1VOVF9QT0lOVF9QUkVGSVgpICYmXG4gICAgbm9kZS50YWcgIT09IEZSQUdNRU5UX1RBR1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGcmFnbWVudChub2RlOiBWRE9NTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiYgbm9kZSAhPT0gbnVsbCAmJiBub2RlLnRhZyA9PT0gRlJBR01FTlRfVEFHO1xufVxuIiwKICAgICJcbnR5cGUgU2ltcGxpZnk8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBUW0tdIH0gJiB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4dHJhY3RvcjxUIGV4dGVuZHMgb2JqZWN0PigpIHtcbiAgZnVuY3Rpb24gX2NyZWF0ZUV4dHJhY3RvcjxcbiAgICBjb25zdCBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIFQpW10sXG4gICAgQyBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPEtbbnVtYmVyXSB8IHN0cmluZywgKHNyYzogVCkgPT4gYW55Pj4sXG4gID4oa2V5czogSywgY29tcHV0ZWQ/OiBDKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHNyYzogVFxuICAgICk6IFNpbXBsaWZ5PFxuICAgICAgUGljazxULCBLW251bWJlcl0+ICYge1xuICAgICAgICBbUCBpbiBrZXlvZiBDXS0/OiBDW1BdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueSkgPT4gaW5mZXIgUiA/IFIgOiBuZXZlcjtcbiAgICAgIH1cbiAgICA+ID0+IHtcbiAgICAgIGNvbnN0IG91dDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIG91dFtrZXkgYXMgc3RyaW5nXSA9IChzcmMgYXMgYW55KVtrZXkgYXMgc3RyaW5nXTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wdXRlZCkge1xuICAgICAgICAgIGNvbnN0IGZuID0gY29tcHV0ZWRba2V5XSE7XG4gICAgICAgICAgb3V0W2tleV0gPSBmbihzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVFeHRyYWN0b3I7XG59IiwKICAgICJpbXBvcnQgeyBjcmVhdGVFeHRyYWN0b3IgfSBmcm9tIFwiLi9leHRyYWN0b3JcIjtcblxuLy8gQmFzZSBleHRyYWN0b3JzIChjYW1lbENhc2UpIHNpbWlsYXIgdG8gZXZlbnRzLnRzIHN0eWxlXG5jb25zdCBsb3dlclRhZ05hbWUgPSAoZTogRWxlbWVudCkgPT4gZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbmNvbnN0IEVMRU1FTlRfS0VZUyA9IFtcbiAgXCJpZFwiLFxuICBcImNsYXNzTmFtZVwiLFxuICBcInRhZ05hbWVcIixcbiAgXCJsb2NhbE5hbWVcIixcbiAgXCJjbGllbnRIZWlnaHRcIixcbiAgXCJjbGllbnRMZWZ0XCIsXG4gIFwiY2xpZW50VG9wXCIsXG4gIFwiY2xpZW50V2lkdGhcIixcbiAgXCJzY3JvbGxIZWlnaHRcIixcbiAgXCJzY3JvbGxMZWZ0XCIsXG4gIFwic2Nyb2xsVG9wXCIsXG4gIFwic2Nyb2xsV2lkdGhcIixcbiAgXCJzbG90XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgRWxlbWVudClbXTtcblxuY29uc3QgSFRNTF9PUl9TVkdfS0VZUyA9IFtcbiAgXCJhdXRvZm9jdXNcIixcbiAgXCJ0YWJJbmRleFwiLFxuICBcIm5vbmNlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9yU1ZHRWxlbWVudClbXTtcblxuY29uc3QgSFRNTF9FTEVNRU5UX0JBU0VfS0VZUyA9IFtcbiAgXCJhY2Nlc3NLZXlcIixcbiAgXCJhY2Nlc3NLZXlMYWJlbFwiLFxuICBcImF1dG9jYXBpdGFsaXplXCIsXG4gIFwiZGlyXCIsXG4gIFwiZHJhZ2dhYmxlXCIsXG4gIFwiaGlkZGVuXCIsXG4gIFwiaW5lcnRcIixcbiAgXCJsYW5nXCIsXG4gIFwib2Zmc2V0SGVpZ2h0XCIsXG4gIFwib2Zmc2V0TGVmdFwiLFxuICBcIm9mZnNldFRvcFwiLFxuICBcIm9mZnNldFdpZHRoXCIsXG4gIFwicG9wb3ZlclwiLFxuICBcInNwZWxsY2hlY2tcIixcbiAgXCJ0aXRsZVwiLFxuICBcInRyYW5zbGF0ZVwiLFxuICBcIndyaXRpbmdTdWdnZXN0aW9uc1wiLFxuICBcImNvbnRlbnRFZGl0YWJsZVwiLFxuICBcImVudGVyS2V5SGludFwiLFxuICBcImlzQ29udGVudEVkaXRhYmxlXCIsXG4gIFwiaW5wdXRNb2RlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEVsZW1lbnQpW107XG5cbmNvbnN0IGV4dHJhY3RFbGVtZW50ID0gY3JlYXRlRXh0cmFjdG9yPEVsZW1lbnQ+KCkoRUxFTUVOVF9LRVlTLCB7XG4gIHRhZ05hbWU6IGxvd2VyVGFnTmFtZSxcbn0pO1xuXG5jb25zdCBleHRyYWN0SFRNTE9yU1ZHRWxlbWVudCA9XG4gIGNyZWF0ZUV4dHJhY3RvcjxIVE1MT3JTVkdFbGVtZW50PigpKEhUTUxfT1JfU1ZHX0tFWVMpO1xuXG5jb25zdCBleHRyYWN0SFRNTEVsZW1lbnRCYXNlT25seSA9IGNyZWF0ZUV4dHJhY3RvcjxIVE1MRWxlbWVudD4oKShcbiAgSFRNTF9FTEVNRU5UX0JBU0VfS0VZU1xuKTtcblxuZnVuY3Rpb24gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgLi4uZXh0cmFjdEVsZW1lbnQoZWx0KSxcbiAgICAuLi5leHRyYWN0SFRNTE9yU1ZHRWxlbWVudChlbHQgYXMgSFRNTE9yU1ZHRWxlbWVudCksXG4gICAgLi4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZU9ubHkoZWx0KSxcbiAgfTtcbn1cblxuLy8gSGVscGVyIHRvIGNvbXBvc2UgcGVyLWVsZW1lbnQgZXh0cmFjdG9ycyB3aXRoIHRoZSBzaGFyZWQgYmFzZVxuZnVuY3Rpb24gd2l0aEJhc2U8VCBleHRlbmRzIEhUTUxFbGVtZW50PihcbiAga2V5czogcmVhZG9ubHkgKGtleW9mIFQpW10sXG4gIGNvbXB1dGVkPzogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCAoc3JjOiBUKSA9PiBhbnk+PlxuKSB7XG4gIGNvbnN0IG9ubHkgPSBjcmVhdGVFeHRyYWN0b3I8VD4oKShrZXlzLCBjb21wdXRlZCBhcyBhbnkpO1xuICByZXR1cm4gKGVsdDogVCkgPT4gKHsgLi4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpLCAuLi5vbmx5KGVsdCkgfSk7XG59XG5cbmNvbnN0IEhUTUxfQU5DSE9SX0tFWVMgPSBbXG4gIFwiaGFzaFwiLFxuICBcImhvc3RcIixcbiAgXCJob3N0bmFtZVwiLFxuICBcImhyZWZcIixcbiAgXCJvcmlnaW5cIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInBhdGhuYW1lXCIsXG4gIFwicG9ydFwiLFxuICBcInByb3RvY29sXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwiZG93bmxvYWRcIixcbiAgXCJyZWxcIixcbiAgXCJocmVmbGFuZ1wiLFxuICBcInR5cGVcIixcbiAgXCJ1c2VybmFtZVwiLFxuICBcInBpbmdcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInRleHRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQW5jaG9yRWxlbWVudClbXTtcbmNvbnN0IGFuY2hvckV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxBbmNob3JFbGVtZW50PihIVE1MX0FOQ0hPUl9LRVlTKTtcblxuY29uc3QgSFRNTF9BUkVBX0tFWVMgPSBbXG4gIFwiYWx0XCIsXG4gIFwiY29vcmRzXCIsXG4gIFwiZG93bmxvYWRcIixcbiAgXCJoYXNoXCIsXG4gIFwiaG9zdFwiLFxuICBcImhvc3RuYW1lXCIsXG4gIFwiaHJlZlwiLFxuICBcIm9yaWdpblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwicGF0aG5hbWVcIixcbiAgXCJwb3J0XCIsXG4gIFwicHJvdG9jb2xcIixcbiAgXCJyZWxcIixcbiAgXCJzZWFyY2hcIixcbiAgXCJzaGFwZVwiLFxuICBcInRhcmdldFwiLFxuICBcInVzZXJuYW1lXCIsXG4gIFwicGluZ1wiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEFyZWFFbGVtZW50KVtdO1xuY29uc3QgYXJlYUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxBcmVhRWxlbWVudD4oSFRNTF9BUkVBX0tFWVMpO1xuXG5jb25zdCBIVE1MX01FRElBX0tFWVMgPSBbXG4gIFwiYXV0b3BsYXlcIixcbiAgXCJjb250cm9sc1wiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiY3VycmVudFNyY1wiLFxuICBcImN1cnJlbnRUaW1lXCIsXG4gIFwiZGVmYXVsdE11dGVkXCIsXG4gIFwiZGVmYXVsdFBsYXliYWNrUmF0ZVwiLFxuICBcImR1cmF0aW9uXCIsXG4gIFwiZW5kZWRcIixcbiAgXCJsb29wXCIsXG4gIFwibXV0ZWRcIixcbiAgXCJuZXR3b3JrU3RhdGVcIixcbiAgXCJwYXVzZWRcIixcbiAgXCJwbGF5YmFja1JhdGVcIixcbiAgXCJwcmVsb2FkXCIsXG4gIFwicmVhZHlTdGF0ZVwiLFxuICBcInNlZWtpbmdcIixcbiAgXCJzcmNcIixcbiAgXCJ2b2x1bWVcIixcbiAgXCJwcmVzZXJ2ZXNQaXRjaFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNZWRpYUVsZW1lbnQpW107XG5jb25zdCBtZWRpYUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZWRpYUVsZW1lbnQ+KEhUTUxfTUVESUFfS0VZUyk7XG5cbmNvbnN0IGF1ZGlvRXh0cmFjdG9yID0gKGVsdDogSFRNTEF1ZGlvRWxlbWVudCkgPT4gbWVkaWFFeHRyYWN0b3IoZWx0KTtcblxuY29uc3QgSFRNTF9CVVRUT05fS0VZUyA9IFtcbiAgXCJkaXNhYmxlZFwiLFxuICBcIm5hbWVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJmb3JtQWN0aW9uXCIsXG4gIFwiZm9ybUVuY3R5cGVcIixcbiAgXCJmb3JtTWV0aG9kXCIsXG4gIFwiZm9ybU5vVmFsaWRhdGVcIixcbiAgXCJmb3JtVGFyZ2V0XCIsXG4gIFwicG9wb3ZlclRhcmdldEFjdGlvblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCdXR0b25FbGVtZW50KVtdO1xuY29uc3QgYnV0dG9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJ1dHRvbkVsZW1lbnQ+KEhUTUxfQlVUVE9OX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RBVEFfS0VZUyA9IFtcbiAgXCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEYXRhRWxlbWVudClbXTtcbmNvbnN0IGRhdGFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGF0YUVsZW1lbnQ+KEhUTUxfREFUQV9LRVlTKTtcblxuY29uc3QgSFRNTF9FTUJFRF9LRVlTID0gW1xuICBcImhlaWdodFwiLFxuICBcInNyY1wiLFxuICBcInR5cGVcIixcbiAgXCJ3aWR0aFwiLFxuICBcImFsaWduXCIsXG4gIFwibmFtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxFbWJlZEVsZW1lbnQpW107XG5jb25zdCBlbWJlZEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxFbWJlZEVsZW1lbnQ+KEhUTUxfRU1CRURfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRklFTERTRVRfS0VZUyA9IFtcbiAgXCJkaXNhYmxlZFwiLFxuICBcIm5hbWVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRmllbGRTZXRFbGVtZW50KVtdO1xuY29uc3QgZmllbGRzZXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRmllbGRTZXRFbGVtZW50PihIVE1MX0ZJRUxEU0VUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0ZPUk1fS0VZUyA9IFtcbiAgXCJhY2NlcHRDaGFyc2V0XCIsXG4gIFwiYWN0aW9uXCIsXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwiZW5jb2RpbmdcIixcbiAgXCJlbmN0eXBlXCIsXG4gIFwibGVuZ3RoXCIsXG4gIFwibWV0aG9kXCIsXG4gIFwibmFtZVwiLFxuICBcIm5vVmFsaWRhdGVcIixcbiAgXCJ0YXJnZXRcIixcbiAgXCJyZWxcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRm9ybUVsZW1lbnQpW107XG5jb25zdCBmb3JtRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEZvcm1FbGVtZW50PihIVE1MX0ZPUk1fS0VZUyk7XG5cbmNvbnN0IEhUTUxfSUZSQU1FX0tFWVMgPSBbXG4gIFwiYWxsb3dcIixcbiAgXCJhbGxvd0Z1bGxzY3JlZW5cIixcbiAgXCJoZWlnaHRcIixcbiAgXCJuYW1lXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJzcmNcIixcbiAgXCJzcmNkb2NcIixcbiAgXCJ3aWR0aFwiLFxuICBcImFsaWduXCIsXG4gIFwiZnJhbWVCb3JkZXJcIixcbiAgXCJsb25nRGVzY1wiLFxuICBcIm1hcmdpbkhlaWdodFwiLFxuICBcIm1hcmdpbldpZHRoXCIsXG4gIFwic2Nyb2xsaW5nXCIsXG4gIFwic2FuZGJveFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxJRnJhbWVFbGVtZW50KVtdO1xuY29uc3QgaWZyYW1lRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTElGcmFtZUVsZW1lbnQ+KEhUTUxfSUZSQU1FX0tFWVMpO1xuXG5jb25zdCBIVE1MX0lNQUdFX0tFWVMgPSBbXG4gIFwiYWx0XCIsXG4gIFwiY3Jvc3NPcmlnaW5cIixcbiAgXCJkZWNvZGluZ1wiLFxuICBcImhlaWdodFwiLFxuICBcImlzTWFwXCIsXG4gIFwibG9hZGluZ1wiLFxuICBcIm5hdHVyYWxIZWlnaHRcIixcbiAgXCJuYXR1cmFsV2lkdGhcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInNpemVzXCIsXG4gIFwic3JjXCIsXG4gIFwic3Jjc2V0XCIsXG4gIFwidXNlTWFwXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImJvcmRlclwiLFxuICBcImNvbXBsZXRlXCIsXG4gIFwiaHNwYWNlXCIsXG4gIFwibG9uZ0Rlc2NcIixcbiAgXCJsb3dzcmNcIixcbiAgXCJuYW1lXCIsXG4gIFwidnNwYWNlXCIsXG4gIFwieFwiLFxuICBcInlcIixcbiAgXCJmZXRjaFByaW9yaXR5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEltYWdlRWxlbWVudClbXTtcbmNvbnN0IGltYWdlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEltYWdlRWxlbWVudD4oSFRNTF9JTUFHRV9LRVlTKTtcblxuY29uc3QgSFRNTF9JTlBVVF9LRVlTID0gW1xuICBcImFjY2VwdFwiLFxuICBcImFsdFwiLFxuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImNoZWNrZWRcIixcbiAgXCJkZWZhdWx0Q2hlY2tlZFwiLFxuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcImRpck5hbWVcIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcImhlaWdodFwiLFxuICBcImluZGV0ZXJtaW5hdGVcIixcbiAgXCJtYXhcIixcbiAgXCJtYXhMZW5ndGhcIixcbiAgXCJtaW5cIixcbiAgXCJtaW5MZW5ndGhcIixcbiAgXCJtdWx0aXBsZVwiLFxuICBcIm5hbWVcIixcbiAgXCJwYXR0ZXJuXCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJyZWFkT25seVwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwic2VsZWN0aW9uRGlyZWN0aW9uXCIsXG4gIFwic2VsZWN0aW9uRW5kXCIsXG4gIFwic2VsZWN0aW9uU3RhcnRcIixcbiAgXCJzaXplXCIsXG4gIFwic3JjXCIsXG4gIFwic3RlcFwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWx1ZVwiLFxuICBcInZhbHVlQXNOdW1iZXJcIixcbiAgXCJ3aWR0aFwiLFxuICBcImFsaWduXCIsXG4gIFwiY2FwdHVyZVwiLFxuICBcImZvcm1BY3Rpb25cIixcbiAgXCJmb3JtRW5jdHlwZVwiLFxuICBcImZvcm1NZXRob2RcIixcbiAgXCJmb3JtTm9WYWxpZGF0ZVwiLFxuICBcImZvcm1UYXJnZXRcIixcbiAgXCJ1c2VNYXBcIixcbiAgXCJ2YWxpZGF0aW9uTWVzc2FnZVwiLFxuICBcIndpbGxWYWxpZGF0ZVwiLFxuICBcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSW5wdXRFbGVtZW50KVtdO1xuY29uc3QgaW5wdXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSW5wdXRFbGVtZW50PihIVE1MX0lOUFVUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xBQkVMX0tFWVMgPSBbXG4gIFwiaHRtbEZvclwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxMYWJlbEVsZW1lbnQpW107XG5jb25zdCBsYWJlbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxMYWJlbEVsZW1lbnQ+KEhUTUxfTEFCRUxfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTElfS0VZUyA9IFtcbiAgXCJ2YWx1ZVwiLFxuICBcInR5cGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTElFbGVtZW50KVtdO1xuY29uc3QgbGlFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTElFbGVtZW50PihIVE1MX0xJX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xJTktfS0VZUyA9IFtcbiAgXCJhc1wiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJmZXRjaFByaW9yaXR5XCIsXG4gIFwiaHJlZlwiLFxuICBcImhyZWZsYW5nXCIsXG4gIFwiaW1hZ2VTaXplc1wiLFxuICBcImltYWdlU3Jjc2V0XCIsXG4gIFwiaW50ZWdyaXR5XCIsXG4gIFwibWVkaWFcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInJlbFwiLFxuICBcInR5cGVcIixcbiAgXCJjaGFyc2V0XCIsXG4gIFwicmV2XCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwic2l6ZXNcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTGlua0VsZW1lbnQpW107XG5jb25zdCBsaW5rRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExpbmtFbGVtZW50PihIVE1MX0xJTktfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTUFQX0tFWVMgPSBbXG4gIFwibmFtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNYXBFbGVtZW50KVtdO1xuY29uc3QgbWFwRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1hcEVsZW1lbnQ+KEhUTUxfTUFQX0tFWVMpO1xuXG5jb25zdCBIVE1MX01FVEVSX0tFWVMgPSBbXG4gIFwiaGlnaFwiLFxuICBcImxvd1wiLFxuICBcIm1heFwiLFxuICBcIm1pblwiLFxuICBcIm9wdGltdW1cIixcbiAgXCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNZXRlckVsZW1lbnQpW107XG5jb25zdCBtZXRlckV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZXRlckVsZW1lbnQ+KEhUTUxfTUVURVJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfTU9EX0tFWVMgPSBbXG4gIFwiY2l0ZVwiLFxuICBcImRhdGVUaW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1vZEVsZW1lbnQpW107XG5jb25zdCBtb2RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTW9kRWxlbWVudD4oSFRNTF9NT0RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT0xfS0VZUyA9IFtcbiAgXCJyZXZlcnNlZFwiLFxuICBcInN0YXJ0XCIsXG4gIFwidHlwZVwiLFxuICBcImNvbXBhY3RcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT0xpc3RFbGVtZW50KVtdO1xuY29uc3Qgb2xpc3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT0xpc3RFbGVtZW50PihIVE1MX09MX0tFWVMpO1xuXG5jb25zdCBIVE1MX09CSkVDVF9LRVlTID0gW1xuICBcImRhdGFcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInVzZU1hcFwiLFxuICBcIndpZHRoXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbiAgXCJhbGlnblwiLFxuICBcImFyY2hpdmVcIixcbiAgXCJib3JkZXJcIixcbiAgXCJjb2RlXCIsXG4gIFwiY29kZUJhc2VcIixcbiAgXCJjb2RlVHlwZVwiLFxuICBcImRlY2xhcmVcIixcbiAgXCJoc3BhY2VcIixcbiAgXCJzdGFuZGJ5XCIsXG4gIFwidnNwYWNlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9iamVjdEVsZW1lbnQpW107XG5jb25zdCBvYmplY3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT2JqZWN0RWxlbWVudD4oSFRNTF9PQkpFQ1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT1BUR1JPVVBfS0VZUyA9IFtcbiAgXCJkaXNhYmxlZFwiLFxuICBcImxhYmVsXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9wdEdyb3VwRWxlbWVudClbXTtcbmNvbnN0IG9wdGdyb3VwRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9wdEdyb3VwRWxlbWVudD4oSFRNTF9PUFRHUk9VUF9LRVlTKTtcblxuY29uc3QgSFRNTF9PUFRJT05fS0VZUyA9IFtcbiAgXCJkZWZhdWx0U2VsZWN0ZWRcIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcImluZGV4XCIsXG4gIFwibGFiZWxcIixcbiAgXCJzZWxlY3RlZFwiLFxuICBcInRleHRcIixcbiAgXCJ2YWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPcHRpb25FbGVtZW50KVtdO1xuY29uc3Qgb3B0aW9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9wdGlvbkVsZW1lbnQ+KEhUTUxfT1BUSU9OX0tFWVMpO1xuXG5jb25zdCBIVE1MX09VVFBVVF9LRVlTID0gW1xuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcIm5hbWVcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJodG1sRm9yXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3V0cHV0RWxlbWVudClbXTtcbmNvbnN0IG91dHB1dEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPdXRwdXRFbGVtZW50PihIVE1MX09VVFBVVF9LRVlTKTtcblxuY29uc3QgSFRNTF9QUk9HUkVTU19LRVlTID0gW1xuICBcIm1heFwiLFxuICBcInBvc2l0aW9uXCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUHJvZ3Jlc3NFbGVtZW50KVtdO1xuY29uc3QgcHJvZ3Jlc3NFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUHJvZ3Jlc3NFbGVtZW50PihIVE1MX1BST0dSRVNTX0tFWVMpO1xuXG5jb25zdCBIVE1MX1FVT1RFX0tFWVMgPSBbXG4gIFwiY2l0ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxRdW90ZUVsZW1lbnQpW107XG5jb25zdCBxdW90ZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxRdW90ZUVsZW1lbnQ+KEhUTUxfUVVPVEVfS0VZUyk7XG5cbmNvbnN0IGNpdGVFeHRyYWN0b3IgPSAoZWx0OiBIVE1MRWxlbWVudCkgPT4gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1NDUklQVF9LRVlTID0gW1xuICBcImFzeW5jXCIsXG4gIFwiY3Jvc3NPcmlnaW5cIixcbiAgXCJkZWZlclwiLFxuICBcImZldGNoUHJpb3JpdHlcIixcbiAgXCJpbnRlZ3JpdHlcIixcbiAgXCJub01vZHVsZVwiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwic3JjXCIsXG4gIFwidGV4dFwiLFxuICBcInR5cGVcIixcbiAgXCJjaGFyc2V0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNjcmlwdEVsZW1lbnQpW107XG5jb25zdCBleHRyYWN0SFRNTFNjcmlwdE9ubHkgPSBjcmVhdGVFeHRyYWN0b3I8SFRNTFNjcmlwdEVsZW1lbnQ+KCkoXG4gIEhUTUxfU0NSSVBUX0tFWVMsXG4gIHtcbiAgICBldmVudDogKHMpID0+IChzIGFzIGFueSkuZXZlbnQsXG4gICAgaHRtbEZvcjogKHMpID0+IChzIGFzIGFueSkuaHRtbEZvcixcbiAgfVxuKTtcbmNvbnN0IHNjcmlwdEV4dHJhY3RvciA9IChlbHQ6IEhUTUxTY3JpcHRFbGVtZW50KSA9PiAoe1xuICAuLi5leHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCksXG4gIC4uLmV4dHJhY3RIVE1MU2NyaXB0T25seShlbHQpLFxufSk7XG5cbmNvbnN0IEhUTUxfU0VMRUNUX0tFWVMgPSBbXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJsZW5ndGhcIixcbiAgXCJtdWx0aXBsZVwiLFxuICBcIm5hbWVcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcInNlbGVjdGVkSW5kZXhcIixcbiAgXCJzaXplXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU2VsZWN0RWxlbWVudClbXTtcbmNvbnN0IHNlbGVjdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxTZWxlY3RFbGVtZW50PihIVE1MX1NFTEVDVF9LRVlTKTtcblxuY29uc3QgSFRNTF9TTE9UX0tFWVMgPSBbXG4gIFwibmFtZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTbG90RWxlbWVudClbXTtcbmNvbnN0IHNsb3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU2xvdEVsZW1lbnQ+KEhUTUxfU0xPVF9LRVlTKTtcblxuY29uc3QgSFRNTF9TT1VSQ0VfS0VZUyA9IFtcbiAgXCJoZWlnaHRcIixcbiAgXCJtZWRpYVwiLFxuICBcInNpemVzXCIsXG4gIFwic3JjXCIsXG4gIFwic3Jjc2V0XCIsXG4gIFwidHlwZVwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNvdXJjZUVsZW1lbnQpW107XG5jb25zdCBzb3VyY2VFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU291cmNlRWxlbWVudD4oSFRNTF9TT1VSQ0VfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVEFCTEVfQ0FQVElPTl9LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNhcHRpb25FeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDYXB0aW9uRWxlbWVudD4oXG4gIEhUTUxfVEFCTEVfQ0FQVElPTl9LRVlTXG4pO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NFTExfS0VZUyA9IFtcbiAgXCJhYmJyXCIsXG4gIFwiY2VsbEluZGV4XCIsXG4gIFwiY29sU3BhblwiLFxuICBcImhlYWRlcnNcIixcbiAgXCJyb3dTcGFuXCIsXG4gIFwic2NvcGVcIixcbiAgXCJhbGlnblwiLFxuICBcImF4aXNcIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcImhlaWdodFwiLFxuICBcIm5vV3JhcFwiLFxuICBcInZBbGlnblwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNlbGxFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDZWxsRWxlbWVudD4oSFRNTF9UQUJMRV9DRUxMX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NPTF9LRVlTID0gW1xuICBcInNwYW5cIixcbiAgXCJhbGlnblwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJ2QWxpZ25cIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNvbEVsZW1lbnQpW107XG5jb25zdCB0YWJsZUNvbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZUNvbEVsZW1lbnQ+KEhUTUxfVEFCTEVfQ09MX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwiYm9yZGVyXCIsXG4gIFwiY2VsbFBhZGRpbmdcIixcbiAgXCJjZWxsU3BhY2luZ1wiLFxuICBcImZyYW1lXCIsXG4gIFwicnVsZXNcIixcbiAgXCJzdW1tYXJ5XCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVFbGVtZW50KVtdO1xuY29uc3QgdGFibGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVFbGVtZW50PihIVE1MX1RBQkxFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RSX0tFWVMgPSBbXG4gIFwicm93SW5kZXhcIixcbiAgXCJzZWN0aW9uUm93SW5kZXhcIixcbiAgXCJhbGlnblwiLFxuICBcImJnQ29sb3JcIixcbiAgXCJjaFwiLFxuICBcImNoT2ZmXCIsXG4gIFwidkFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlUm93RWxlbWVudClbXTtcbmNvbnN0IHRhYmxlUm93RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlUm93RWxlbWVudD4oSFRNTF9UUl9LRVlTKTtcblxuY29uc3QgSFRNTF9UU0VDVElPTl9LRVlTID0gW1xuICBcImFsaWduXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcInZBbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KVtdO1xuY29uc3QgdGFibGVTZWN0aW9uRXh0cmFjdG9yID1cbiAgd2l0aEJhc2U8SFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ+KEhUTUxfVFNFQ1RJT05fS0VZUyk7XG5cbmNvbnN0IHRlbXBsYXRlRXh0cmFjdG9yID0gKGVsdDogSFRNTFRlbXBsYXRlRWxlbWVudCkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1RFWFRBUkVBX0tFWVMgPSBbXG4gIFwiYXV0b2NvbXBsZXRlXCIsXG4gIFwiY29sc1wiLFxuICBcImRlZmF1bHRWYWx1ZVwiLFxuICBcImRpck5hbWVcIixcbiAgXCJkaXNhYmxlZFwiLFxuICBcIm1heExlbmd0aFwiLFxuICBcIm1pbkxlbmd0aFwiLFxuICBcIm5hbWVcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuICBcInJlYWRPbmx5XCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJyb3dzXCIsXG4gIFwic2VsZWN0aW9uRGlyZWN0aW9uXCIsXG4gIFwic2VsZWN0aW9uRW5kXCIsXG4gIFwic2VsZWN0aW9uU3RhcnRcIixcbiAgXCJ2YWx1ZVwiLFxuICBcIndyYXBcIixcbiAgXCJ0ZXh0TGVuZ3RoXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGV4dEFyZWFFbGVtZW50KVtdO1xuY29uc3QgdGV4dGFyZWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGV4dEFyZWFFbGVtZW50PihIVE1MX1RFWFRBUkVBX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RJTUVfS0VZUyA9IFtcbiAgXCJkYXRlVGltZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUaW1lRWxlbWVudClbXTtcbmNvbnN0IHRpbWVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGltZUVsZW1lbnQ+KEhUTUxfVElNRV9LRVlTKTtcblxuY29uc3QgSFRNTF9UUkFDS19LRVlTID0gW1xuICBcImRlZmF1bHRcIixcbiAgXCJraW5kXCIsXG4gIFwibGFiZWxcIixcbiAgXCJyZWFkeVN0YXRlXCIsXG4gIFwic3JjXCIsXG4gIFwic3JjbGFuZ1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUcmFja0VsZW1lbnQpW107XG5jb25zdCB0cmFja0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUcmFja0VsZW1lbnQ+KEhUTUxfVFJBQ0tfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVklERU9fS0VZUyA9IFtcbiAgXCJoZWlnaHRcIixcbiAgXCJwb3N0ZXJcIixcbiAgXCJ2aWRlb0hlaWdodFwiLFxuICBcInZpZGVvV2lkdGhcIixcbiAgXCJ3aWR0aFwiLFxuICBcInBsYXlzSW5saW5lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFZpZGVvRWxlbWVudClbXTtcbmNvbnN0IGV4dHJhY3RIVE1MVmlkZW9Pbmx5ID1cbiAgY3JlYXRlRXh0cmFjdG9yPEhUTUxWaWRlb0VsZW1lbnQ+KCkoSFRNTF9WSURFT19LRVlTKTtcbmNvbnN0IHZpZGVvRXh0cmFjdG9yID0gKGVsdDogSFRNTFZpZGVvRWxlbWVudCkgPT4gKHtcbiAgLi4ubWVkaWFFeHRyYWN0b3IoZWx0KSxcbiAgLi4uZXh0cmFjdEhUTUxWaWRlb09ubHkoZWx0KSxcbn0pO1xuXG5jb25zdCBIVE1MX0JSX0tFWVMgPSBbXG4gIFwiY2xlYXJcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQlJFbGVtZW50KVtdO1xuY29uc3QgYnJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQlJFbGVtZW50PihIVE1MX0JSX0tFWVMpO1xuXG5jb25zdCBIVE1MX0JBU0VfS0VZUyA9IFtcbiAgXCJocmVmXCIsXG4gIFwidGFyZ2V0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJhc2VFbGVtZW50KVtdO1xuY29uc3QgYmFzZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCYXNlRWxlbWVudD4oSFRNTF9CQVNFX0tFWVMpO1xuXG5jb25zdCBIVE1MX0JPRFlfS0VZUyA9IFtcbiAgXCJhTGlua1wiLFxuICBcImJhY2tncm91bmRcIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwibGlua1wiLFxuICBcInRleHRcIixcbiAgXCJ2TGlua1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCb2R5RWxlbWVudClbXTtcbmNvbnN0IGJvZHlFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQm9keUVsZW1lbnQ+KEhUTUxfQk9EWV9LRVlTKTtcblxuY29uc3QgSFRNTF9ETElTVF9LRVlTID0gW1xuICBcImNvbXBhY3RcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRExpc3RFbGVtZW50KVtdO1xuY29uc3QgZGxpc3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRExpc3RFbGVtZW50PihIVE1MX0RMSVNUX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RFVEFJTFNfS0VZUyA9IFtcbiAgXCJvcGVuXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERldGFpbHNFbGVtZW50KVtdO1xuY29uc3QgZGV0YWlsc0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEZXRhaWxzRWxlbWVudD4oSFRNTF9ERVRBSUxTX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RJQUxPR19LRVlTID0gW1xuICBcIm9wZW5cIixcbiAgXCJyZXR1cm5WYWx1ZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEaWFsb2dFbGVtZW50KVtdO1xuY29uc3QgZGlhbG9nRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERpYWxvZ0VsZW1lbnQ+KEhUTUxfRElBTE9HX0tFWVMpO1xuXG5jb25zdCBIVE1MX0RJVl9LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERpdkVsZW1lbnQpW107XG5jb25zdCBkaXZFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGl2RWxlbWVudD4oSFRNTF9ESVZfS0VZUyk7XG5cbmNvbnN0IGhlYWRFeHRyYWN0b3IgPSAoZWx0OiBIVE1MSGVhZEVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9IRUFESU5HX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSGVhZGluZ0VsZW1lbnQpW107XG5jb25zdCBoZWFkaW5nRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEhlYWRpbmdFbGVtZW50PihIVE1MX0hFQURJTkdfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSFJfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuICBcImNvbG9yXCIsXG4gIFwibm9TaGFkZVwiLFxuICBcInNpemVcIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxIUkVsZW1lbnQpW107XG5jb25zdCBockV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIUkVsZW1lbnQ+KEhUTUxfSFJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSFRNTF9LRVlTID0gW1xuICBcInZlcnNpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSHRtbEVsZW1lbnQpW107XG5jb25zdCBodG1sRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEh0bWxFbGVtZW50PihIVE1MX0hUTUxfS0VZUyk7XG5cbmNvbnN0IG1lbnVFeHRyYWN0b3IgPSAoZWx0OiBIVE1MTWVudUVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9NRVRBX0tFWVMgPSBbXG4gIFwiY29udGVudFwiLFxuICBcImh0dHBFcXVpdlwiLFxuICBcIm5hbWVcIixcbiAgXCJzY2hlbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWV0YUVsZW1lbnQpW107XG5jb25zdCBtZXRhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1ldGFFbGVtZW50PihIVE1MX01FVEFfS0VZUyk7XG5cbmNvbnN0IEhUTUxfUF9LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFBhcmFncmFwaEVsZW1lbnQpW107XG5jb25zdCBwYXJhZ3JhcGhFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUGFyYWdyYXBoRWxlbWVudD4oSFRNTF9QX0tFWVMpO1xuXG5jb25zdCBwaWN0dXJlRXh0cmFjdG9yID0gKGVsdDogSFRNTFBpY3R1cmVFbGVtZW50KSA9PlxuICBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfUFJFX0tFWVMgPSBbXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUHJlRWxlbWVudClbXTtcbmNvbnN0IHByZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxQcmVFbGVtZW50PihIVE1MX1BSRV9LRVlTKTtcblxuY29uc3Qgc3BhbkV4dHJhY3RvciA9IChlbHQ6IEhUTUxTcGFuRWxlbWVudCkgPT4gZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1NUWUxFX0tFWVMgPSBbXG4gIFwibWVkaWFcIixcbiAgXCJ0eXBlXCIsXG4gIFwiZGlzYWJsZWRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU3R5bGVFbGVtZW50KVtdO1xuY29uc3Qgc3R5bGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU3R5bGVFbGVtZW50PihIVE1MX1NUWUxFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RJVExFX0tFWVMgPSBbXG4gIFwidGV4dFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUaXRsZUVsZW1lbnQpW107XG5jb25zdCB0aXRsZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUaXRsZUVsZW1lbnQ+KEhUTUxfVElUTEVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVUxfS0VZUyA9IFtcbiAgXCJjb21wYWN0XCIsXG4gIFwidHlwZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxVTGlzdEVsZW1lbnQpW107XG5jb25zdCB1bGlzdEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxVTGlzdEVsZW1lbnQ+KEhUTUxfVUxfS0VZUyk7XG5cbi8vIE1hcCBvZiB0YWdOYW1lIC0+IGV4dHJhY3RvciAoY29uY2lzZSwgbGlrZSBldmVudHMudHMpXG5jb25zdCBlbGVtZW50RXh0cmFjdG9yczogUmVjb3JkPHN0cmluZywgKGVsdDogYW55KSA9PiBvYmplY3Q+ID0ge1xuICBBOiBhbmNob3JFeHRyYWN0b3IsXG4gIEFSRUE6IGFyZWFFeHRyYWN0b3IsXG4gIEFVRElPOiBhdWRpb0V4dHJhY3RvcixcbiAgQkFTRTogYmFzZUV4dHJhY3RvcixcbiAgQkxPQ0tRVU9URTogcXVvdGVFeHRyYWN0b3IsXG4gIFE6IHF1b3RlRXh0cmFjdG9yLFxuICBCT0RZOiBib2R5RXh0cmFjdG9yLFxuICBCUjogYnJFeHRyYWN0b3IsXG4gIEJVVFRPTjogYnV0dG9uRXh0cmFjdG9yLFxuICBDQU5WQVM6IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UsXG4gIENBUFRJT046IHRhYmxlQ2FwdGlvbkV4dHJhY3RvcixcbiAgQ0lURTogY2l0ZUV4dHJhY3RvcixcbiAgQ09MOiB0YWJsZUNvbEV4dHJhY3RvcixcbiAgQ09MR1JPVVA6IHRhYmxlQ29sRXh0cmFjdG9yLFxuICBEQVRBOiBkYXRhRXh0cmFjdG9yLFxuICBERVRBSUxTOiBkZXRhaWxzRXh0cmFjdG9yLFxuICBESUFMT0c6IGRpYWxvZ0V4dHJhY3RvcixcbiAgRElWOiBkaXZFeHRyYWN0b3IsXG4gIERMOiBkbGlzdEV4dHJhY3RvcixcbiAgRU1CRUQ6IGVtYmVkRXh0cmFjdG9yLFxuICBGSUVMRFNFVDogZmllbGRzZXRFeHRyYWN0b3IsXG4gIEZPUk06IGZvcm1FeHRyYWN0b3IsXG4gIEgxOiBoZWFkaW5nRXh0cmFjdG9yLFxuICBIMjogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDM6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEg0OiBoZWFkaW5nRXh0cmFjdG9yLFxuICBINTogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDY6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEhFQUQ6IGhlYWRFeHRyYWN0b3IsXG4gIEhSOiBockV4dHJhY3RvcixcbiAgSFRNTDogaHRtbEV4dHJhY3RvcixcbiAgSUZSQU1FOiBpZnJhbWVFeHRyYWN0b3IsXG4gIElNRzogaW1hZ2VFeHRyYWN0b3IsXG4gIElOUFVUOiBpbnB1dEV4dHJhY3RvcixcbiAgTEFCRUw6IGxhYmVsRXh0cmFjdG9yLFxuICBMSTogbGlFeHRyYWN0b3IsXG4gIExJTks6IGxpbmtFeHRyYWN0b3IsXG4gIE1BUDogbWFwRXh0cmFjdG9yLFxuICBNRU5VOiBtZW51RXh0cmFjdG9yLFxuICBNRVRBOiBtZXRhRXh0cmFjdG9yLFxuICBNRVRFUjogbWV0ZXJFeHRyYWN0b3IsXG4gIElOUzogbW9kRXh0cmFjdG9yLFxuICBERUw6IG1vZEV4dHJhY3RvcixcbiAgT0JKRUNUOiBvYmplY3RFeHRyYWN0b3IsXG4gIE9MOiBvbGlzdEV4dHJhY3RvcixcbiAgT1BUR1JPVVA6IG9wdGdyb3VwRXh0cmFjdG9yLFxuICBPUFRJT046IG9wdGlvbkV4dHJhY3RvcixcbiAgT1VUUFVUOiBvdXRwdXRFeHRyYWN0b3IsXG4gIFA6IHBhcmFncmFwaEV4dHJhY3RvcixcbiAgUElDVFVSRTogcGljdHVyZUV4dHJhY3RvcixcbiAgUFJFOiBwcmVFeHRyYWN0b3IsXG4gIFBST0dSRVNTOiBwcm9ncmVzc0V4dHJhY3RvcixcbiAgU0NSSVBUOiBzY3JpcHRFeHRyYWN0b3IsXG4gIFNFTEVDVDogc2VsZWN0RXh0cmFjdG9yLFxuICBTTE9UOiBzbG90RXh0cmFjdG9yLFxuICBTT1VSQ0U6IHNvdXJjZUV4dHJhY3RvcixcbiAgU1BBTjogc3BhbkV4dHJhY3RvcixcbiAgU1RZTEU6IHN0eWxlRXh0cmFjdG9yLFxuICBUQUJMRTogdGFibGVFeHRyYWN0b3IsXG4gIFRCT0RZOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG4gIFRIRUFEOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG4gIFRGT09UOiB0YWJsZVNlY3Rpb25FeHRyYWN0b3IsXG4gIFREOiB0YWJsZUNlbGxFeHRyYWN0b3IsXG4gIFRIOiB0YWJsZUNlbGxFeHRyYWN0b3IsXG4gIFRFTVBMQVRFOiB0ZW1wbGF0ZUV4dHJhY3RvcixcbiAgVEVYVEFSRUE6IHRleHRhcmVhRXh0cmFjdG9yLFxuICBUSU1FOiB0aW1lRXh0cmFjdG9yLFxuICBUSVRMRTogdGl0bGVFeHRyYWN0b3IsXG4gIFRSOiB0YWJsZVJvd0V4dHJhY3RvcixcbiAgVFJBQ0s6IHRyYWNrRXh0cmFjdG9yLFxuICBVTDogdWxpc3RFeHRyYWN0b3IsXG4gIFZJREVPOiB2aWRlb0V4dHJhY3Rvcixcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SFRNTEVsZW1lbnQoZWx0OiBIVE1MRWxlbWVudCk6IG9iamVjdCB7XG4gIGNvbnN0IHRhZ05hbWUgPSBlbHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuXG4gIGNvbnN0IGV4dHJhY3RvciA9IGVsZW1lbnRFeHRyYWN0b3JzW3RhZ05hbWVdO1xuICBpZiAoZXh0cmFjdG9yKSB7XG4gICAgcmV0dXJuIGV4dHJhY3RvcihlbHQpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgVW5leHBlY3RlZCBIVE1MIGVsZW1lbnQgdGFnOiAke2VsdC50YWdOYW1lfSAodXBkYXRlIC53ZWIvY3VzdG9tL3NlcmlhbGl6ZS50cylgXG4gICk7XG59XG4iLAogICAgIi8qID09PSBJTVBPUlRBTlQgPT09ICovXG5cbmltcG9ydCB7IGV4dHJhY3RIVE1MRWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVFeHRyYWN0b3IgfSBmcm9tIFwiLi9leHRyYWN0b3JcIjtcblxuLy8gUmV1c2FibGUgY29tcHV0ZWQgbWFwcGVycyAoaGVscHMgYnVuZGxlcnMvbWluaWZpZXJzIHNoYXJlIHJlZmVyZW5jZXMpXG5jb25zdCBtYXBUYXJnZXQgPSAoZTogeyB0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCB9KSA9PlxuICBleHRyYWN0SFRNTEVsZW1lbnQoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuY29uc3QgbWFwUmVsYXRlZCA9IChlOiB7IHJlbGF0ZWRUYXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCB9KSA9PlxuICBlLnJlbGF0ZWRUYXJnZXQgPyBleHRyYWN0SFRNTEVsZW1lbnQoZS5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50KSA6IG51bGw7XG5cbmZ1bmN0aW9uIG1ha2VFeHRyYWN0b3I8SyBleHRlbmRzIHJlYWRvbmx5IGFueVtdPihcbiAga2V5czogSyxcbiAgY29tcHV0ZWQ/OiBSZWNvcmQ8c3RyaW5nLCAoZXZ0OiBhbnkpID0+IGFueT5cbikge1xuICByZXR1cm4gY3JlYXRlRXh0cmFjdG9yPGFueT4oKShcbiAgICBrZXlzIGFzIGFueSxcbiAgICB7XG4gICAgICB0YXJnZXQ6IG1hcFRhcmdldCxcbiAgICAgIC4uLihjb21wdXRlZCB8fCB7fSksXG4gICAgfSBhcyBhbnlcbiAgKTtcbn1cblxuY29uc3QgU1lOVEhFVElDX0tFWVMgPSBbXG4gIFwidGFyZ2V0XCIsXG4gIFwiYnViYmxlc1wiLFxuICBcImNhbmNlbGFibGVcIixcbiAgXCJkZWZhdWx0UHJldmVudGVkXCIsXG4gIFwiZXZlbnRQaGFzZVwiLFxuICBcImlzVHJ1c3RlZFwiLFxuICBcInRpbWVTdGFtcFwiLFxuICBcInR5cGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBSZWFjdC5TeW50aGV0aWNFdmVudClbXTtcblxuY29uc3QgVUlfS0VZUyA9IFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwiZGV0YWlsXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuVUlFdmVudClbXTtcblxuY29uc3QgTU9VU0VfS0VZUyA9IFtcbiAgLi4uVUlfS0VZUyxcbiAgXCJhbHRLZXlcIixcbiAgXCJidXR0b25cIixcbiAgXCJidXR0b25zXCIsXG4gIFwiY2xpZW50WFwiLFxuICBcImNsaWVudFlcIixcbiAgXCJjdHJsS2V5XCIsXG4gIFwibWV0YUtleVwiLFxuICBcIm1vdmVtZW50WFwiLFxuICBcIm1vdmVtZW50WVwiLFxuICBcInBhZ2VYXCIsXG4gIFwicGFnZVlcIixcbiAgXCJzY3JlZW5YXCIsXG4gIFwic2NyZWVuWVwiLFxuICBcInNoaWZ0S2V5XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuTW91c2VFdmVudClbXTtcblxuY29uc3QgUE9JTlRFUl9LRVlTID0gW1xuICAuLi5NT1VTRV9LRVlTLFxuICBcInBvaW50ZXJJZFwiLFxuICBcInByZXNzdXJlXCIsXG4gIFwidGFuZ2VudGlhbFByZXNzdXJlXCIsXG4gIFwidGlsdFhcIixcbiAgXCJ0aWx0WVwiLFxuICBcInR3aXN0XCIsXG4gIFwid2lkdGhcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJwb2ludGVyVHlwZVwiLFxuICBcImlzUHJpbWFyeVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0LlBvaW50ZXJFdmVudClbXTtcblxuY29uc3Qgc3ludGhldGljRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IHVpRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihVSV9LRVlTKTtcblxuY29uc3QgbW91c2VFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKE1PVVNFX0tFWVMsIHsgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCB9KTtcblxuY29uc3QgY2xpcGJvYXJkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUywge1xuICBjbGlwYm9hcmREYXRhOiAoZSkgPT4gZXh0cmFjdERhdGFUcmFuc2ZlcihlLmNsaXBib2FyZERhdGEpLFxufSk7XG5cbmNvbnN0IGNvbXBvc2l0aW9uRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImRhdGFcIixcbl0gYXMgY29uc3QpO1xuXG5jb25zdCBkcmFnRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihNT1VTRV9LRVlTLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG4gIGRhdGFUcmFuc2ZlcjogKGUpID0+IGV4dHJhY3REYXRhVHJhbnNmZXIoZS5kYXRhVHJhbnNmZXIpLFxufSk7XG5cbmNvbnN0IHBvaW50ZXJFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFBPSU5URVJfS0VZUywge1xuICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxufSk7XG5cbmNvbnN0IGZvY3VzRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUywge1xuICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxufSk7XG5cbmNvbnN0IGZvcm1FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3QgaW52YWxpZEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCBjaGFuZ2VFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3Qga2V5Ym9hcmRFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uVUlfS0VZUyxcbiAgXCJhbHRLZXlcIixcbiAgXCJjdHJsS2V5XCIsXG4gIFwiY29kZVwiLFxuICBcImtleVwiLFxuICBcImxvY2FsZVwiLFxuICBcImxvY2F0aW9uXCIsXG4gIFwibWV0YUtleVwiLFxuICBcInJlcGVhdFwiLFxuICBcInNoaWZ0S2V5XCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgdG91Y2hFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFxuICBbXG4gICAgLi4uVUlfS0VZUyxcbiAgICBcImFsdEtleVwiLFxuICAgIFwiY3RybEtleVwiLFxuICAgIFwibWV0YUtleVwiLFxuICAgIFwic2hpZnRLZXlcIixcbiAgICBcImNoYW5nZWRUb3VjaGVzXCIsXG4gICAgXCJ0YXJnZXRUb3VjaGVzXCIsXG4gICAgXCJ0b3VjaGVzXCIsXG4gIF0gYXMgY29uc3QsXG4gIHtcbiAgICBjaGFuZ2VkVG91Y2hlczogKGUpID0+IG1hcFRvdWNoTGlzdChlLmNoYW5nZWRUb3VjaGVzKSxcbiAgICB0YXJnZXRUb3VjaGVzOiAoZSkgPT4gbWFwVG91Y2hMaXN0KGUudGFyZ2V0VG91Y2hlcyksXG4gICAgdG91Y2hlczogKGUpID0+IG1hcFRvdWNoTGlzdChlLnRvdWNoZXMpLFxuICB9XG4pO1xuXG5jb25zdCB3aGVlbEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoXG4gIFsuLi5NT1VTRV9LRVlTLCBcImRlbHRhTW9kZVwiLCBcImRlbHRhWFwiLCBcImRlbHRhWVwiLCBcImRlbHRhWlwiXSBhcyBjb25zdCxcbiAge1xuICAgIHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQsXG4gIH1cbik7XG5cbmNvbnN0IGFuaW1hdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJhbmltYXRpb25OYW1lXCIsXG4gIFwiZWxhcHNlZFRpbWVcIixcbiAgXCJwc2V1ZG9FbGVtZW50XCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgdG9nZ2xlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcIm9sZFN0YXRlXCIsXG4gIFwibmV3U3RhdGVcIixcbl0gYXMgY29uc3QpO1xuXG5jb25zdCB0cmFuc2l0aW9uRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImVsYXBzZWRUaW1lXCIsXG4gIFwicHJvcGVydHlOYW1lXCIsXG4gIFwicHNldWRvRWxlbWVudFwiLFxuXSBhcyBjb25zdCk7XG5cbmZ1bmN0aW9uIG1hcFRvdWNoTGlzdChsaXN0OiBhbnkpOiBhbnlbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGxpc3QgYXMgQXJyYXlMaWtlPGFueT4pLm1hcCgodG91Y2g6IGFueSkgPT4gKHtcbiAgICB0YXJnZXQ6IGV4dHJhY3RIVE1MRWxlbWVudCh0b3VjaC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLFxuICAgIGlkZW50aWZpZXI6IHRvdWNoLmlkZW50aWZpZXIsXG4gICAgc2NyZWVuWDogdG91Y2guc2NyZWVuWCxcbiAgICBzY3JlZW5ZOiB0b3VjaC5zY3JlZW5ZLFxuICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgY2xpZW50WTogdG91Y2guY2xpZW50WSxcbiAgICBwYWdlWDogdG91Y2gucGFnZVgsXG4gICAgcGFnZVk6IHRvdWNoLnBhZ2VZLFxuICB9KSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IERhdGFUcmFuc2ZlciBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBleHRyYWN0RGF0YVRyYW5zZmVyKGR0OiBEYXRhVHJhbnNmZXIgfCBudWxsKTogb2JqZWN0IHwgbnVsbCB7XG4gIGlmICghZHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBpdGVtcyA9IFtdO1xuICBpZiAoZHQuaXRlbXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR0Lml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gZHQuaXRlbXNbaV0hO1xuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGtpbmQ6IGl0ZW0ua2luZCxcbiAgICAgICAgdHlwZTogaXRlbS50eXBlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZHJvcF9lZmZlY3Q6IGR0LmRyb3BFZmZlY3QsXG4gICAgZWZmZWN0X2FsbG93ZWQ6IGR0LmVmZmVjdEFsbG93ZWQsXG4gICAgaXRlbXM6IGl0ZW1zLFxuICAgIHR5cGVzOiBBcnJheS5mcm9tKGR0LnR5cGVzIHx8IFtdKSxcbiAgfTtcbn1cblxuY29uc3QgZXZlbnRFeHRyYWN0b3JNYXA6IHsgW2tleTogc3RyaW5nXTogKGV2dDogYW55KSA9PiBvYmplY3QgfSA9IHt9O1xuXG5mdW5jdGlvbiBhZGQobWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sIGZuOiBhbnkpIHtcbiAgZm9yIChjb25zdCBuIG9mIG5hbWVzKSBtYXBbbl0gPSBmbjtcbn1cblxuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1xuICAgIFwicG9pbnRlcmRvd25cIixcbiAgICBcInBvaW50ZXJtb3ZlXCIsXG4gICAgXCJwb2ludGVydXBcIixcbiAgICBcInBvaW50ZXJjYW5jZWxcIixcbiAgICBcImdvdHBvaW50ZXJjYXB0dXJlXCIsXG4gICAgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIixcbiAgICBcInBvaW50ZXJlbnRlclwiLFxuICAgIFwicG9pbnRlcmxlYXZlXCIsXG4gICAgXCJwb2ludGVyb3ZlclwiLFxuICAgIFwicG9pbnRlcm91dFwiLFxuICBdLFxuICBwb2ludGVyRXh0cmFjdG9yXG4pO1xuXG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXG4gICAgXCJjbGlja1wiLFxuICAgIFwiY29udGV4dG1lbnVcIixcbiAgICBcImRibGNsaWNrXCIsXG4gICAgXCJtb3VzZWRvd25cIixcbiAgICBcIm1vdXNlZW50ZXJcIixcbiAgICBcIm1vdXNlbGVhdmVcIixcbiAgICBcIm1vdXNlbW92ZVwiLFxuICAgIFwibW91c2VvdXRcIixcbiAgICBcIm1vdXNlb3ZlclwiLFxuICAgIFwibW91c2V1cFwiLFxuICBdLFxuICBtb3VzZUV4dHJhY3RvclxuKTtcblxuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1xuICAgIFwiZHJhZ1wiLFxuICAgIFwiZHJhZ2VuZFwiLFxuICAgIFwiZHJhZ2VudGVyXCIsXG4gICAgXCJkcmFnZXhpdFwiLFxuICAgIFwiZHJhZ2xlYXZlXCIsXG4gICAgXCJkcmFnb3ZlclwiLFxuICAgIFwiZHJhZ3N0YXJ0XCIsXG4gICAgXCJkcm9wXCIsXG4gIF0sXG4gIGRyYWdFeHRyYWN0b3Jcbik7XG5cbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wia2V5ZG93blwiLCBcImtleXByZXNzXCIsIFwia2V5dXBcIl0sIGtleWJvYXJkRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiZm9jdXNcIiwgXCJibHVyXCJdLCBmb2N1c0V4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImNoYW5nZVwiLCBcImlucHV0XCJdLCBjaGFuZ2VFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJpbnZhbGlkXCJdLCBpbnZhbGlkRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wicmVzZXRcIiwgXCJzdWJtaXRcIl0sIGZvcm1FeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJjb3B5XCIsIFwiY3V0XCIsIFwicGFzdGVcIl0sIGNsaXBib2FyZEV4dHJhY3Rvcik7XG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXCJjb21wb3NpdGlvbmVuZFwiLCBcImNvbXBvc2l0aW9uc3RhcnRcIiwgXCJjb21wb3NpdGlvbnVwZGF0ZVwiXSxcbiAgY29tcG9zaXRpb25FeHRyYWN0b3Jcbik7XG5hZGQoXG4gIGV2ZW50RXh0cmFjdG9yTWFwLFxuICBbXCJ0b3VjaGNhbmNlbFwiLCBcInRvdWNoZW5kXCIsIFwidG91Y2htb3ZlXCIsIFwidG91Y2hzdGFydFwiXSxcbiAgdG91Y2hFeHRyYWN0b3Jcbik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInNjcm9sbFwiXSwgdWlFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ3aGVlbFwiXSwgd2hlZWxFeHRyYWN0b3IpO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1wiYW5pbWF0aW9uc3RhcnRcIiwgXCJhbmltYXRpb25lbmRcIiwgXCJhbmltYXRpb25pdGVyYXRpb25cIl0sXG4gIGFuaW1hdGlvbkV4dHJhY3RvclxuKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1widHJhbnNpdGlvbmVuZFwiXSwgdHJhbnNpdGlvbkV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInRvZ2dsZVwiXSwgdG9nZ2xlRXh0cmFjdG9yKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFdmVudCh2YWx1ZTogYW55KTogYW55IHtcbiAgLy8gRHVjay10eXBpbmcgZm9yIFJlYWN0J3MgU3ludGhldGljRXZlbnQuXG4gIC8vIFdlIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVuaXF1ZSB0byBzeW50aGV0aWMgZXZlbnRzLlxuICBpZiAoXG4gICAgdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcIm5hdGl2ZUV2ZW50XCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuaXNEZWZhdWx0UHJldmVudGVkID09PSBcImZ1bmN0aW9uXCJcbiAgKSB7XG4gICAgY29uc3QgZXZ0ID0gdmFsdWUgYXMgUmVhY3QuU3ludGhldGljRXZlbnQ7XG4gICAgLy8gVGhlIGB0eXBlYCBwcm9wZXJ0eSBpcyBjcnVjaWFsIGZvciB0aGUgbG9va3VwLlxuICAgIGlmICh0eXBlb2YgZXZ0LnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRyYWN0b3IgPSBldmVudEV4dHJhY3Rvck1hcFtldnQudHlwZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoZXh0cmFjdG9yKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yKGV2dCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIHVua25vd24gZXZlbnQgdHlwZXM6IG1pbmltYWwgc3ludGhldGljIGV4dHJhY3RvclxuICAgIHJldHVybiBzeW50aGV0aWNFeHRyYWN0b3IoZXZ0KTtcbiAgfVxuXG4gIC8vIElmIGl0J3Mgbm90IGEgZHVjay10eXBlZCBldmVudCwgcmV0dXJuIGl0IGFzIGlzLlxuICByZXR1cm4gdmFsdWU7XG59XG4iLAogICAgImV4cG9ydCB0eXBlIFByaW1pdGl2ZSA9IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkO1xuZXhwb3J0IHR5cGUgSlNPTjxUPiA9IFQgfCBBcnJheTxKU09OPFQ+PiB8IHsgW0s6IHN0cmluZ106IEpTT048VD4gfTtcbmV4cG9ydCB0eXBlIFBsYWluSlNPTiA9IEpTT048UHJpbWl0aXZlPjtcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZSA9IGFueTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZCA9IFtbbnVtYmVyW10sIG51bWJlcltdLCBudW1iZXJbXSwgbnVtYmVyW11dLCBQbGFpbkpTT05dO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFNlcmlhbGl6YWJsZSk6IFNlcmlhbGl6ZWQge1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxhbnksIG51bWJlcj4oKTtcbiAgY29uc3QgcmVmczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgZGF0ZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHNldHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IG1hcHM6IG51bWJlcltdID0gW107XG5cbiAgLy8gU2luZ2xlIGdsb2JhbCBjb3VudGVyIC0gaW5jcmVtZW50cyBvbmNlIHBlciBub2RlIHZpc2l0XG4gIGxldCBnbG9iYWxJbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gcHJvY2Vzcyh2YWx1ZTogU2VyaWFsaXphYmxlKTogUGxhaW5KU09OIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IGlkeCA9IGdsb2JhbEluZGV4Kys7XG4gICAgY29uc3QgcHJldlJlZiA9IHNlZW4uZ2V0KHZhbHVlKTtcbiAgICBpZiAocHJldlJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdG8gcHVzaCB0aGUgY3VycmVudCBpbmRleCwgYnV0IHVzZSB0aGUgcmVmJ3MgaW5kZXggYXMgdGhlIHZhbHVlIVxuICAgICAgcmVmcy5wdXNoKGlkeCk7XG4gICAgICByZXR1cm4gcHJldlJlZjtcbiAgICB9XG5cbiAgICBzZWVuLnNldCh2YWx1ZSwgaWR4KTtcblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGRhdGVzLnB1c2goaWR4KTtcbiAgICAgIHJldHVybiB2YWx1ZS5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0W2ldID0gcHJvY2Vzcyh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgbWFwcy5wdXNoKGlkeCk7XG4gICAgICBjb25zdCByZWM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICByZWNbU3RyaW5nKGtleSldID0gcHJvY2VzcyhlbnRyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgc2V0cy5wdXNoKGlkeCk7XG4gICAgICBjb25zdCBzaXplID0gdmFsdWUuc2l6ZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShzaXplKTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdmFsdWUpIHtcbiAgICAgICAgcmVzdWx0W2ldID0gcHJvY2VzcyhlbnRyeSk7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJlY1trZXldID0gcHJvY2Vzcyh2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWM7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YWx1ZSBpbiBzZXJpYWxpemF0aW9uOiAke3ZhbHVlfWApO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZCA9IHByb2Nlc3MoZGF0YSk7XG4gIHJldHVybiBbW3JlZnMsIGRhdGVzLCBzZXRzLCBtYXBzXSwgcGF5bG9hZF07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzZXJpYWxpemF0aW9uT3B0aW9ucyB7XG4gIGNvZXJjZU51bGxzVG9VbmRlZmluZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemU8RGF0YSBleHRlbmRzIFNlcmlhbGl6YWJsZSA9IFNlcmlhbGl6YWJsZT4oXG4gIHBheWxvYWQ6IFNlcmlhbGl6ZWQsXG4gIG9wdGlvbnM/OiBEZXNlcmlhbGl6YXRpb25PcHRpb25zXG4pOiBEYXRhIHtcbiAgY29uc3QgW1tyZWZzQSwgZGF0ZXNBLCBzZXRzQSwgbWFwc0FdLCBkYXRhXSA9IHBheWxvYWQ7XG5cbiAgY29uc3QgcmVmcyA9IG5ldyBTZXQocmVmc0EpO1xuICBjb25zdCBkYXRlcyA9IG5ldyBTZXQoZGF0ZXNBKTtcbiAgY29uc3Qgc2V0cyA9IG5ldyBTZXQoc2V0c0EpO1xuICBjb25zdCBtYXBzID0gbmV3IFNldChtYXBzQSk7XG5cbiAgY29uc3Qgb2JqZWN0czogQXJyYXk8YW55PiA9IFtdO1xuXG4gIGZ1bmN0aW9uIHJlY29uc3RydWN0KHZhbHVlOiBQbGFpbkpTT04pOiBhbnkge1xuICAgIGNvbnN0IGlkeCA9IG9iamVjdHMubGVuZ3RoO1xuICAgIGlmIChyZWZzLmhhcyhpZHgpKSB7XG4gICAgICAvLyBXZSBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgb24gcmVmcyBkdXJpbmcgc2VyaWFsaXphdGlvbi4gV2UncmUgbmV2ZXJcbiAgICAgIC8vIGdvaW5nIHRvIHVzZSB0aGlzIGVudHJ5LCBzbyB3ZSBjYW4ganVzdCBwdXNoIG51bGwuXG4gICAgICBvYmplY3RzLnB1c2gobnVsbCk7XG4gICAgICByZXR1cm4gb2JqZWN0c1t2YWx1ZSBhcyBudW1iZXJdO1xuICAgIH1cblxuICAgIGlmIChkYXRlcy5oYXMoaWR4KSkge1xuICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBudW1iZXIpO1xuICAgICAgb2JqZWN0cy5wdXNoKGR0KTtcbiAgICAgIHJldHVybiBkdDtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICkge1xuICAgICAgaWYgKG9wdGlvbnM/LmNvZXJjZU51bGxzVG9VbmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID8/IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmIChzZXRzLmhhcyhpZHgpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQuYWRkKHJlY29uc3RydWN0KHZhbHVlW2ldKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICBvYmplY3RzLnB1c2goYXJyKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gcmVjb25zdHJ1Y3QodmFsdWVbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAobWFwcy5oYXMoaWR4KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBvYmplY3RzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgcmVjb25zdHJ1Y3QodmFsdWVba2V5XSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJlc3VsdFtrZXldID0gcmVjb25zdHJ1Y3QodmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUgaW4gZGVzZXJpYWxpemF0aW9uOiAke3ZhbHVlfWApO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uc3RydWN0KGRhdGEpO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJvdXRlSW5mbyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgVkRPTVVwZGF0ZSB9IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB7IGV4dHJhY3RFdmVudCB9IGZyb20gXCIuL3NlcmlhbGl6ZS9ldmVudHNcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUgfSBmcm9tIFwiLi9zZXJpYWxpemUvdjNcIjtcblxuaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG4gIENsaWVudENoYW5uZWxNZXNzYWdlLFxuICBDbGllbnRNZXNzYWdlLFxuICBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckVycm9ySW5mbyxcbiAgU2VydmVyTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGVGdW5jdGlvbiB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcbmltcG9ydCB7IGNyZWF0ZUNoYW5uZWxCcmlkZ2UsIFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuICByb3V0ZUluZm86IFJvdXRlSW5mbztcbiAgb25Jbml0OiAoXG4gICAgdmRvbTogVkRPTSxcbiAgICBjYWxsYmFja3M6IHN0cmluZ1tdLFxuICAgIHJlbmRlclByb3BzOiBzdHJpbmdbXSxcbiAgICBjc3NSZWZzOiBzdHJpbmdbXVxuICApID0+IHZvaWQ7XG4gIG9uVXBkYXRlOiAob3BzOiBWRE9NVXBkYXRlW10pID0+IHZvaWQ7XG59XG5leHBvcnQgdHlwZSBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIgPSAoY29ubmVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgU2VydmVyRXJyb3JMaXN0ZW5lciA9IChcbiAgcGF0aDogc3RyaW5nLFxuICBlcnJvcjogU2VydmVyRXJyb3JJbmZvIHwgbnVsbFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ2xpZW50IHtcbiAgLy8gQ29ubmVjdGlvbiBtYW5hZ2VtZW50XG4gIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQ7XG4gIC8vIE1lc3NhZ2VzXG4gIG5hdmlnYXRlKHBhdGg6IHN0cmluZywgcm91dGVJbmZvOiBSb3V0ZUluZm8pOiBQcm9taXNlPHZvaWQ+O1xuICBsZWF2ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBpbnZva2VDYWxsYmFjayhwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLy8gVkRPTSBzdWJzY3JpcHRpb25cbiAgbW91bnRWaWV3KHBhdGg6IHN0cmluZywgdmlldzogTW91bnRlZFZpZXcpOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUHVsc2VTb2NrZXRJT0NsaWVudCB7XG4gIHByaXZhdGUgYWN0aXZlVmlld3M6IE1hcDxzdHJpbmcsIE1vdW50ZWRWaWV3PjtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VRdWV1ZTogQ2xpZW50TWVzc2FnZVtdO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHNlcnZlckVycm9yczogTWFwPHN0cmluZywgU2VydmVyRXJyb3JJbmZvPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzZXJ2ZXJFcnJvckxpc3RlbmVyczogU2V0PFNlcnZlckVycm9yTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGNoYW5uZWxzOiBNYXA8c3RyaW5nLCB7IGJyaWRnZTogQ2hhbm5lbEJyaWRnZTsgcmVmQ291bnQ6IG51bWJlciB9PiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZW5kZXJJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgZnJhbWV3b3JrTmF2aWdhdGU6IE5hdmlnYXRlRnVuY3Rpb25cbiAgKSB7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmlld3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgfVxuICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jb25uZWN0ZWQgPz8gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSxcbiAgICAgICAgYXV0aDogeyByZW5kZXJJZDogdGhpcy5yZW5kZXJJZCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0ZWQ6XCIsIHRoaXMuc29ja2V0Py5pZCk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBzZW5kIGEgbmF2aWdhdGUgcGF5bG9hZCBmb3IgYWxsIHRoZSByb3V0ZXNcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgcm91dGVdIG9mIHRoaXMuYWN0aXZlVmlld3MpIHtcbiAgICAgICAgICBzb2NrZXQuZW1pdChcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgc2VyaWFsaXplKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICByb3V0ZUluZm86IHJvdXRlLnJvdXRlSW5mbyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIEFscmVhZHkgc2VudCBhYm92ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibW91bnRcIiAmJiB0aGlzLmFjdGl2ZVZpZXdzLmhhcyhwYXlsb2FkLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2UncmUgcmVtb3VudGluZyBhbGwgdGhlIHJvdXRlcywgc28gbm8gbmVlZCB0byBuYXZpZ2F0ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibmF2aWdhdGVcIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBzZXJpYWxpemUocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5oYW5kbGVUcmFuc3BvcnREaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gV3JhcCBpbiBhbiBhcnJvdyBmdW5jdGlvbiB0byBhdm9pZCBsb3NpbmcgdGhlIGB0aGlzYCByZWZlcmVuY2VcbiAgICAgIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+XG4gICAgICAgIHRoaXMuaGFuZGxlU2VydmVyTWVzc2FnZShcbiAgICAgICAgICBkZXNlcmlhbGl6ZShkYXRhLCB7IGNvZXJjZU51bGxzVG9VbmRlZmluZWQ6IHRydWUgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZXJ2ZXJFcnJvcihsaXN0ZW5lcjogU2VydmVyRXJyb3JMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAvLyBFbWl0IGN1cnJlbnQgZXJyb3JzIHRvIG5ldyBsaXN0ZW5lclxuICAgIGZvciAoY29uc3QgW3BhdGgsIGVycl0gb2YgdGhpcy5zZXJ2ZXJFcnJvcnMpIGxpc3RlbmVyKHBhdGgsIGVycik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTZXJ2ZXJFcnJvcihwYXRoOiBzdHJpbmcsIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzKSBsaXN0ZW5lcihwYXRoLCBlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgc2VyaWFsaXplKHBheWxvYWQgYXMgYW55KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2VuZENoYW5uZWxNZXNzYWdlKFxuICAgIG1lc3NhZ2U6IENsaWVudENoYW5uZWxNZXNzYWdlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgbW91bnRWaWV3KHBhdGg6IHN0cmluZywgdmlldzogTW91bnRlZFZpZXcpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVWaWV3cy5oYXMocGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAke3BhdGh9IGlzIGFscmVhZHkgbW91bnRlZGApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVZpZXdzLnNldChwYXRoLCB2aWV3KTtcbiAgICB2b2lkIHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbzogdmlldy5yb3V0ZUluZm8sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbykge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJuYXZpZ2F0ZVwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bm1vdW50KHBhdGg6IHN0cmluZykge1xuICAgIHZvaWQgdGhpcy5zZW5kTWVzc2FnZSh7IHR5cGU6IFwidW5tb3VudFwiLCBwYXRoIH0pO1xuICAgIHRoaXMuYWN0aXZlVmlld3MuZGVsZXRlKHBhdGgpO1xuICB9XG5cbiAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvcnMuY2xlYXIoKTtcbiAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCB7IGJyaWRnZSB9IG9mIHRoaXMuY2hhbm5lbHMudmFsdWVzKCkpIHtcbiAgICAgIGJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2xpZW50IGRpc2Nvbm5lY3RlZFwiKSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbm5lbHMuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJbUHVsc2VDbGllbnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIG1lc3NhZ2UpO1xuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlIFwidmRvbV9pbml0XCI6IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmFjdGl2ZVZpZXdzLmdldChtZXNzYWdlLnBhdGgpO1xuICAgICAgICAvLyBJZ25vcmUgbWVzc2FnZXMgZm9yIHBhdGhzIHRoYXQgYXJlIG5vdCBtb3VudGVkXG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgcm91dGUub25Jbml0KFxuICAgICAgICAgICAgbWVzc2FnZS52ZG9tLFxuICAgICAgICAgICAgbWVzc2FnZS5jYWxsYmFja3MsXG4gICAgICAgICAgICBtZXNzYWdlLnJlbmRlcl9wcm9wcyxcbiAgICAgICAgICAgIG1lc3NhZ2UuY3NzX3JlZnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmlvciBlcnJvciBmb3IgdGhpcyBwYXRoIG9uIHN1Y2Nlc3NmdWwgaW5pdFxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJFcnJvcnMuaGFzKG1lc3NhZ2UucGF0aCkpIHtcbiAgICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidmRvbV91cGRhdGVcIjoge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuYWN0aXZlVmlld3MuZ2V0KG1lc3NhZ2UucGF0aCk7XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjsgLy8gTm90IGFuIGFjdGl2ZSBwYXRoOyBkaXNjYXJkXG4gICAgICAgIHJvdXRlLm9uVXBkYXRlKG1lc3NhZ2Uub3BzKTtcbiAgICAgICAgLy8gQ2xlYXIgYW55IHByaW9yIGVycm9yIGZvciB0aGlzIHBhdGggb24gc3VjY2Vzc2Z1bCB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInNlcnZlcl9lcnJvclwiOiB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVWaWV3cy5oYXMobWVzc2FnZS5wYXRoKSkgcmV0dXJuOyAvLyBkaXNjYXJkIGZvciBpbmFjdGl2ZSBwYXRoc1xuICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5zZXQobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG1lc3NhZ2UuZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcGlfY2FsbFwiOiB7XG4gICAgICAgIHZvaWQgdGhpcy5wZXJmb3JtQXBpQ2FsbChtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwibmF2aWdhdGVfdG9cIjoge1xuICAgICAgICAvLyBgbmF2aWdhdGVfdG9gIGlzIG5hdmlnYXRpb25hbDsgYWxsb3cgcmVnYXJkbGVzcyBvZiBhY3RpdmVWaWV3cyBtZW1iZXJzaGlwXG4gICAgICAgIGNvbnN0IHJlcGxhY2UgPSAhIW1lc3NhZ2UucmVwbGFjZTtcbiAgICAgICAgbGV0IGRlc3QgPSBtZXNzYWdlLnBhdGggfHwgXCJcIjtcbiAgICAgICAgLy8gTm9ybWFsaXplIHByb3RvY29sLXJlbGF0aXZlIFVSTHMgdG8gYWJzb2x1dGVcbiAgICAgICAgaWYgKGRlc3Quc3RhcnRzV2l0aChcIi8vXCIpKSBkZXN0ID0gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfSR7ZGVzdH1gO1xuICAgICAgICBjb25zdCBoYXNTY2hlbWUgPSAvXlthLXpBLVpdW2EtekEtWjAtOSsuLV0qOi8udGVzdChkZXN0KTtcbiAgICAgICAgaWYgKGhhc1NjaGVtZSkge1xuICAgICAgICAgIGlmIChkZXN0LnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpIHx8IGRlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRlc3QpO1xuICAgICAgICAgICAgICBpZiAodXJsLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWA7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtOYXZpZ2F0ZShpbnRlcm5hbCwgeyByZXBsYWNlIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbWFpbHRvOiwgdGVsOiwgZGF0YTosIGV0Yy5cbiAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVsYXRpdmUgb3Igcm9vdC1yZWxhdGl2ZSBwYXRoIOKGkiBTUEEgbmF2aWdhdGVcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya05hdmlnYXRlKGRlc3QsIHsgcmVwbGFjZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJjaGFubmVsX21lc3NhZ2VcIjoge1xuICAgICAgICB0aGlzLnJvdXRlQ2hhbm5lbE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVW5leHBlY3RlZCBtZXNzYWdlOlwiLCBtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1BcGlDYWxsKG1zZzogU2VydmVyQXBpQ2FsbE1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobXNnLnVybCwge1xuICAgICAgICBtZXRob2Q6IG1zZy5tZXRob2QgfHwgXCJHRVRcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIC4uLihtc2cuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICAgLi4uKG1zZy5ib2R5ICE9IG51bGwgJiYgIShcImNvbnRlbnQtdHlwZVwiIGluIChtc2cuaGVhZGVycyB8fCB7fSkpXG4gICAgICAgICAgICA/IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6XG4gICAgICAgICAgbXNnLmJvZHkgIT0gbnVsbFxuICAgICAgICAgICAgPyB0eXBlb2YgbXNnLmJvZHkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBtc2cuYm9keVxuICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KG1zZy5ib2R5KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBtc2cuY3JlZGVudGlhbHMgfHwgXCJpbmNsdWRlXCIsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGhlYWRlcnNPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIHJlcy5oZWFkZXJzLmZvckVhY2goKHYsIGspID0+IChoZWFkZXJzT2JqW2tdID0gdikpO1xuICAgICAgbGV0IGJvZHk6IGFueSA9IG51bGw7XG4gICAgICBjb25zdCBjdCA9IHJlcy5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSB8fCBcIlwiO1xuICAgICAgaWYgKGN0LmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgICBib2R5ID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHkgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbHk6IENsaWVudEFwaVJlc3VsdE1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpX3Jlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICBvazogcmVzLm9rLFxuICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNPYmosXG4gICAgICAgIGJvZHksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShyZXBseSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCByZXBseTogQ2xpZW50QXBpUmVzdWx0TWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlfcmVzdWx0XCIsXG4gICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgYm9keTogeyBlcnJvcjogU3RyaW5nKGVycikgfSxcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHJlcGx5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW52b2tlQ2FsbGJhY2socGF0aDogc3RyaW5nLCBjYWxsYmFjazogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjYWxsYmFja1wiLFxuICAgICAgcGF0aCxcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgYXJnczogYXJncy5tYXAoZXh0cmFjdEV2ZW50KSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhY3F1aXJlQ2hhbm5lbChpZDogc3RyaW5nKTogQ2hhbm5lbEJyaWRnZSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVuc3VyZUNoYW5uZWxFbnRyeShpZCk7XG4gICAgZW50cnkucmVmQ291bnQgKz0gMTtcbiAgICByZXR1cm4gZW50cnkuYnJpZGdlO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VDaGFubmVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJ5LnJlZkNvdW50ID0gTWF0aC5tYXgoMCwgZW50cnkucmVmQ291bnQgLSAxKTtcbiAgICBpZiAoZW50cnkucmVmQ291bnQgPT09IDApIHtcbiAgICAgIGVudHJ5LmJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCByZWxlYXNlZFwiKSk7XG4gICAgICB0aGlzLmNoYW5uZWxzLmRlbGV0ZShpZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVDaGFubmVsRW50cnkoaWQ6IHN0cmluZyk6IHtcbiAgICBicmlkZ2U6IENoYW5uZWxCcmlkZ2U7XG4gICAgcmVmQ291bnQ6IG51bWJlcjtcbiAgfSB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5jaGFubmVscy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGVudHJ5ID0ge1xuICAgICAgICBicmlkZ2U6IGNyZWF0ZUNoYW5uZWxCcmlkZ2UodGhpcywgaWQpLFxuICAgICAgICByZWZDb3VudDogMCxcbiAgICAgIH07XG4gICAgICB0aGlzLmNoYW5uZWxzLnNldChpZCwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBwcml2YXRlIHJvdXRlQ2hhbm5lbE1lc3NhZ2UobWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW5zdXJlQ2hhbm5lbEVudHJ5KG1lc3NhZ2UuY2hhbm5lbCk7XG4gICAgY29uc3QgY2xvc2VkID0gZW50cnkuYnJpZGdlLmhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZSk7XG4gICAgaWYgKGNsb3NlZCAmJiBlbnRyeS5yZWZDb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5jaGFubmVscy5kZWxldGUobWVzc2FnZS5jaGFubmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRyYW5zcG9ydERpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmNoYW5uZWxzLnZhbHVlcygpKSB7XG4gICAgICBlbnRyeS5icmlkZ2UuaGFuZGxlRGlzY29ubmVjdChcbiAgICAgICAgbmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDb25uZWN0aW9uIGxvc3RcIilcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHVibGljIGdldFZET00ocGF0aDogc3RyaW5nKTogVkRPTSB8IG51bGwge1xuICAvLyAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXdzLmdldChwYXRoKT8udmRvbSA/PyBudWxsO1xuICAvLyB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuXG5leHBvcnQgY2xhc3MgUHVsc2VDaGFubmVsUmVzZXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJQdWxzZUNoYW5uZWxSZXNldEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQ2hhbm5lbEV2ZW50SGFuZGxlciA9IChwYXlsb2FkOiBhbnkpID0+IGFueSB8IFByb21pc2U8YW55PjtcblxuaW50ZXJmYWNlIFBlbmRpbmdSZXF1ZXN0IHtcbiAgcmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gIHJlamVjdDogKGVycm9yOiBhbnkpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIHJhbmRvbUlkKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCkucmVwbGFjZSgvLS9nLCBcIlwiKTtcbiAgfVxuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMikgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHJldHVybiBlcnJvcjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlcnZlclJlc3BvbnNlTWVzc2FnZShcbiAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2Vcbik6IG1lc3NhZ2UgaXMgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSB7XG4gIHJldHVybiB0eXBlb2YgKG1lc3NhZ2UgYXMgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSkucmVzcG9uc2VUbyA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXF1ZXN0TWVzc2FnZShcbiAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2Vcbik6IG1lc3NhZ2UgaXMgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlIHtcbiAgcmV0dXJuIHR5cGVvZiAobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UpLmV2ZW50ID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEJyaWRnZSB7XG4gIHByaXZhdGUgaGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PENoYW5uZWxFdmVudEhhbmRsZXI+PigpO1xuICBwcml2YXRlIHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ1JlcXVlc3Q+KCk7XG4gIHByaXZhdGUgYmFja2xvZzogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCwgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmcpIHt9XG5cbiAgZW1pdChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgdm9pZCB0aGlzLmNsaWVudC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICBldmVudCxcbiAgICAgIHBheWxvYWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KGV2ZW50OiBzdHJpbmcsIHBheWxvYWQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJhbmRvbUlkKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIHZvaWQgdGhpcy5jbGllbnRcbiAgICAgICAgLnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBDaGFubmVsRXZlbnRIYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgbGV0IGJ1Y2tldCA9IHRoaXMuaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgYnVja2V0ID0gbmV3IFNldCgpO1xuICAgICAgdGhpcy5oYW5kbGVycy5zZXQoZXZlbnQsIGJ1Y2tldCk7XG4gICAgfVxuICAgIGJ1Y2tldC5hZGQoaGFuZGxlcik7XG4gICAgdGhpcy5mbHVzaEJhY2tsb2coZXZlbnQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBzZXQgPSB0aGlzLmhhbmRsZXJzLmdldChldmVudCk7XG4gICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgIGlmIChzZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICBpZiAoaXNTZXJ2ZXJSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHRoaXMucmVzb2x2ZVBlbmRpbmcobWVzc2FnZSk7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghaXNTZXJ2ZXJSZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLmV2ZW50ID09PSBcIl9fY2xvc2VfX1wiKSB7XG4gICAgICB0aGlzLmNsb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCBjbG9zZWQgYnkgc2VydmVyXCIpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5yZXF1ZXN0SWQpIHtcbiAgICAgIHZvaWQgdGhpcy5kaXNwYXRjaFJlcXVlc3QobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UgJiB7XG4gICAgICAgIHJlcXVlc3RJZDogc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICB9XG5cbiAgaGFuZGxlRGlzY29ubmVjdChyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKHJlYXNvbik7XG4gIH1cblxuICBkaXNwb3NlKHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UocmVhc29uKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCBpcyBjbG9zZWRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaEJhY2tsb2coZXZlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJhY2tsb2cubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVtYWluaW5nOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmJhY2tsb2cpIHtcbiAgICAgIGlmIChpdGVtLmV2ZW50ID09PSBldmVudCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1haW5pbmcucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5iYWNrbG9nID0gcmVtYWluaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEV2ZW50KG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQobWVzc2FnZS5ldmVudCk7XG4gICAgaWYgKCFoYW5kbGVycyB8fCBoYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmJhY2tsb2cucHVzaChtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB2b2lkIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFJlcXVlc3QoXG4gICAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlICYgeyByZXF1ZXN0SWQ6IHN0cmluZyB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQobWVzc2FnZS5ldmVudCk7XG4gICAgbGV0IHJlc3BvbnNlOiBhbnk7XG4gICAgbGV0IGVycm9yOiBhbnk7XG4gICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLnNpemUgPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICAgIHJlc3BvbnNlVG86IG1lc3NhZ2UucmVxdWVzdElkLFxuICAgICAgICBlcnJvcjogZm9ybWF0RXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICByZXNwb25zZVRvOiBtZXNzYWdlLnJlcXVlc3RJZCxcbiAgICAgIHBheWxvYWQ6IHJlc3BvbnNlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGVuZGluZyhtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBtZXNzYWdlLnJlc3BvbnNlVG8gPyB0aGlzLnBlbmRpbmcuZ2V0KG1lc3NhZ2UucmVzcG9uc2VUbykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKG1lc3NhZ2UucmVzcG9uc2VUbyEpO1xuICAgIGlmIChtZXNzYWdlLmVycm9yICE9PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5lcnJvciAhPT0gbnVsbCkge1xuICAgICAgZW50cnkucmVqZWN0KG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFN0cmluZyhtZXNzYWdlLmVycm9yKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRyeS5yZXNvbHZlKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZShyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgIHJlcXVlc3QucmVqZWN0KHJlYXNvbik7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZy5jbGVhcigpO1xuICAgIHRoaXMuaGFuZGxlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmJhY2tsb2cgPSBbXTtcbiAgICAvLyBOby1vcDogb3duaW5nIGNsaWVudCBtYW5hZ2VzIHJlZ2lzdHJ5IGxpZmVjeWNsZS5cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2hhbm5lbEJyaWRnZShcbiAgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuICBpZDogc3RyaW5nXG4pOiBDaGFubmVsQnJpZGdlIHtcbiAgcmV0dXJuIG5ldyBDaGFubmVsQnJpZGdlKGNsaWVudCwgaWQpO1xufVxuIiwKICAgICJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVB1bHNlQ2xpZW50IH0gZnJvbSBcIi4vcHVsc2VcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVB1bHNlQ2hhbm5lbChjaGFubmVsSWQ6IHN0cmluZyk6IENoYW5uZWxCcmlkZ2Uge1xuICBjb25zdCBjbGllbnQgPSB1c2VQdWxzZUNsaWVudCgpO1xuICBjb25zdCBicmlkZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWNoYW5uZWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDaGFubmVsIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGNoYW5uZWxJZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaWVudC5hY3F1aXJlQ2hhbm5lbChjaGFubmVsSWQpO1xuICB9LCBbY2xpZW50LCBjaGFubmVsSWRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGllbnQucmVsZWFzZUNoYW5uZWwoY2hhbm5lbElkKTtcbiAgICB9O1xuICB9LCBbY2xpZW50LCBjaGFubmVsSWRdKTtcblxuICByZXR1cm4gYnJpZGdlO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHR5cGUgRm9ybUV2ZW50IH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCB0eXBlIFB1bHNlRm9ybVByb3BzID0gUmVhY3QuQ29tcG9uZW50UHJvcHNXaXRob3V0UmVmPFwiZm9ybVwiPiAmIHtcbiAgYWN0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFB1bHNlRm9ybSBpbnRlcmNlcHRzIG5hdGl2ZSBmb3JtIHN1Ym1pc3Npb25zIGFuZCBzZW5kcyB0aGVtIHRocm91Z2ggZmV0Y2ggc28gdGhlXG4gKiBzdXJyb3VuZGluZyBQdWxzZSB2aWV3IHN0YXlzIG1vdW50ZWQuIFNlcnZlci1zaWRlIGhhbmRsZXJzIGFyZSBzdGlsbCBpbnZva2VkIHZpYVxuICogdGhlIGZvcm0gYWN0aW9uIGVuZHBvaW50IGFuZCByZWFjdGl2ZSB1cGRhdGVzIHByb3BhZ2F0ZSBvdmVyIHRoZSBzb2NrZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQdWxzZUZvcm0gPSBmb3J3YXJkUmVmPEhUTUxGb3JtRWxlbWVudCwgUHVsc2VGb3JtUHJvcHM+KFxuICBmdW5jdGlvbiBQdWxzZUZvcm0oeyBvblN1Ym1pdCwgYWN0aW9uLCAuLi5yZXN0IH0sIHJlZikge1xuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybVxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgYWN0aW9uPXthY3Rpb259XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBvblN1Ym1pdD17dXNlQ2FsbGJhY2soXG4gICAgICAgICAgKGV2ZW50OiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT5cbiAgICAgICAgICAgIHN1Ym1pdEZvcm0oeyBldmVudCwgYWN0aW9uLCBvblN1Ym1pdCB9KSxcbiAgICAgICAgICBbYWN0aW9uLCBvblN1Ym1pdF1cbiAgICAgICAgKX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuKTtcblxuaW50ZXJmYWNlIFN1Ym1pdEZvcm0ge1xuICBldmVudDogUmVhY3QuRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD47XG4gIGFjdGlvbjogc3RyaW5nO1xuICBvblN1Ym1pdD86IFB1bHNlRm9ybVByb3BzW1wib25TdWJtaXRcIl07XG4gIGZvcm1EYXRhPzogRm9ybURhdGE7XG4gIGZvcmNlPzogYm9vbGVhblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3VibWl0Rm9ybSh7XG4gIGV2ZW50LFxuICBhY3Rpb24sXG4gIG9uU3VibWl0LFxuICBmb3JtRGF0YSxcbiAgZm9yY2Vcbn06IFN1Ym1pdEZvcm0pIHtcbiAgb25TdWJtaXQ/LihldmVudCk7XG4gIGlmICghZm9yY2UgJiYgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmb3JtID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3QgbmF0aXZlRXZlbnQgPSBldmVudC5uYXRpdmVFdmVudCBhcyBTdWJtaXRFdmVudDtcbiAgaWYgKCFmb3JtRGF0YSkge1xuICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0sIG5hdGl2ZUV2ZW50LnN1Ym1pdHRlcik7XG4gIH1cbiAgY29uc3QgdXJsID0gbmV3IFVSTChhY3Rpb24sIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAvLyBSZXF1aXJlZCBmb3Igb3VyIGhvc3Rpbmcgc2NlbmFyaW9zIG9mIHNhbWUgaG9zdCArIGRpZmZlcmVudCBwb3J0cyBvciAyIHN1YmRvbWFpbnNcbiAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW1B1bHNlXSBGb3JtIHN1Ym1pc3Npb24gZmFpbGVkXCIsIGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlck1lc3NhZ2UsIENsaWVudE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHJhbnNwb3J0IEFic3RyYWN0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlTGlzdGVuZXIgPSAobWVzc2FnZTogU2VydmVyTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwb3J0IHtcbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPjtcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU29ja2V0LklPIFRyYW5zcG9ydFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFNvY2tldElPVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IENsaWVudE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdXJsOiBzdHJpbmcpIHt9XG5cbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiXSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGVkOlwiLCB0aGlzLnNvY2tldD8uaWQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nIHF1ZXVlZCBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgICAgICB0aGlzLnNvY2tldD8uZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnModHJ1ZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0aW9uIGZhaWxlZDpcIiwgZXJyKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGE6IFNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIGRhdGEpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyPy4oZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5saXN0ZW5lciA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEluLU1lbW9yeSBUcmFuc3BvcnQgKGZvciB0ZXN0aW5nKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5VHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gU2ltdWxhdGUgc2VydmVyLXNpZGUgbWVzc2FnZSBkaXNwYXRjaGluZ1xuICBwdWJsaWMgZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xuICAgICAgLy8gU2ltdWxhdGUgYXN5bmMgYmVoYXZpb3JcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5saXN0ZW5lcj8uKG1lc3NhZ2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBDb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBEaXNjb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltJbk1lbW9yeVRyYW5zcG9ydF0gTm90IGNvbm5lY3RlZC5cIik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBbSW5NZW1vcnlUcmFuc3BvcnRdIFNlbnQgbWVzc2FnZTpgLCBwYXlsb2FkKTtcbiAgICAvLyBJbiBhIHJlYWwgdGVzdCBzZXR1cCwgdGhpcyBtaWdodCB0cmlnZ2VyIGEgc2ltdWxhdGVkIHNlcnZlciByZXNwb25zZVxuICAgIC8vIHZpYSBgZGlzcGF0Y2hNZXNzYWdlYC5cbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2FkZXJGdW5jdGlvbkFyZ3MgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgcGF0aG5hbWU6IHN0cmluZztcbiAgaGFzaDogc3RyaW5nO1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGF0aFBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgY2F0Y2hhbGw6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlcnZlclJvdXRlSW5mbyh7XG4gIHBhcmFtcyxcbiAgcmVxdWVzdCxcbn06IExvYWRlckZ1bmN0aW9uQXJncykge1xuICBjb25zdCB7IFwiKlwiOiBjYXRjaGFsbCA9IFwiXCIsIC4uLnBhdGhQYXJhbXMgfSA9IHBhcmFtcztcbiAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBwYXJzZWRVcmwuaGFzaCxcbiAgICBwYXRobmFtZTogcGFyc2VkVXJsLnBhdGhuYW1lLFxuICAgIHF1ZXJ5OiBwYXJzZWRVcmwuc2VhcmNoLFxuICAgIHF1ZXJ5UGFyYW1zOiBPYmplY3QuZnJvbUVudHJpZXMocGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpLFxuICAgIHBhdGhQYXJhbXMsXG4gICAgY2F0Y2hhbGw6IGNhdGNoYWxsLmxlbmd0aCA+IDEgPyBjYXRjaGFsbC5zcGxpdChcIi9cIikgOiBbXSxcbiAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xufSIsCiAgICAiLy8gU2VyaWFsaXphdGlvbiBoZWxwZXJzIHRoYXQgc3VwcG9ydDpcbi8vIC0gQ2lyY3VsYXIgcmVmZXJlbmNlcyB2aWEgb2JqZWN0IGlkZW50aXR5IHJlZnNcbi8vIC0gRGF0ZSBpbnN0YW5jZXMg4oaSIHsgX190OiBcImRhdGV0aW1lXCIsIHRpbWVzdGFtcCB9XG4vLyAtIEZvcm1EYXRhIOKGkiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHMgfVxuLy8gLSBGaWxlIOKGkiB7IF9fdDogXCJmaWxlXCIsIG5hbWUsIHR5cGUsIHNpemUsIGxhc3RNb2RpZmllZCwgY29udGVudDogbnVtYmVyW10gfVxuLy8gQWxvbmcgd2l0aCBhIGRlY29kZXIgZm9yIHRoZSBzeW1tZXRyaWMgc2hhcGVzICh3ZSBkbyBub3QgcmVjb25zdHJ1Y3QgRmlsZS9Gb3JtRGF0YSBvYmplY3RzKS5cblxudHlwZSBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCI7IGlkOiBudW1iZXIgfTtcbnR5cGUgRW5jb2RlZEFycmF5ID0geyBfX3Q6IFwiYXJyYXlcIjsgX19pZDogbnVtYmVyOyBpdGVtczogdW5rbm93bltdIH07XG50eXBlIEVuY29kZWRPYmplY3QgPSB7XG4gIF9fdDogXCJvYmplY3RcIjtcbiAgX19pZDogbnVtYmVyO1xuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xudHlwZSBFbmNvZGVkRGF0ZSA9IHsgX190OiBcImRhdGV0aW1lXCI7IHRpbWVzdGFtcDogbnVtYmVyIH07XG50eXBlIEVuY29kZWRGaWxlID0ge1xuICBfX3Q6IFwiZmlsZVwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xuICBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgY29udGVudDogbnVtYmVyW107IC8vIHJhdyBieXRlcyBhcyBhIEpTT04tc2FmZSBudW1iZXIgYXJyYXlcbn07XG50eXBlIEVuY29kZWRGb3JtRGF0YSA9IHtcbiAgX190OiBcImZvcm1kYXRhXCI7XG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT47XG59O1xuXG50eXBlIElkZW50aXR5TWFwID0gV2Vha01hcDxvYmplY3QsIG51bWJlcj47XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cblxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG59XG5cbmZ1bmN0aW9uIGlzU2tpcHBhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCJcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsZVRvQnl0ZUFycmF5KGZpbGU6IEZpbGUpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIGNvbnN0IGFiID0gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShhYikpO1xufVxuXG5pbnRlcmZhY2UgRW5jb2RlQ29udGV4dCB7XG4gIHNlZW46IElkZW50aXR5TWFwO1xuICBuZXh0SWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY29kZUZvcldpcmUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY3R4OiBFbmNvZGVDb250ZXh0ID0geyBzZWVuOiBuZXcgV2Vha01hcCgpLCBuZXh0SWQ6IDEgfTtcbiAgcmV0dXJuIGF3YWl0IGVuY29kZVJlY3Vyc2l2ZShpbnB1dCwgY3R4KTtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXIoY3R4OiBFbmNvZGVDb250ZXh0LCBvYmo6IG9iamVjdCk6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBleGlzdGluZyA9IGN0eC5zZWVuLmdldChvYmopO1xuICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGlkID0gY3R4Lm5leHRJZCsrO1xuICBjdHguc2Vlbi5zZXQob2JqLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5jb2RlUmVjdXJzaXZlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY3R4OiBFbmNvZGVDb250ZXh0XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZXMgZmlyc3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBhcyBEYXRlO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWREYXRlID0geyBfX3Q6IFwiZGF0ZXRpbWVcIiwgdGltZXN0YW1wOiBkYXRlLmdldFRpbWUoKSB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICBjb25zdCBpZCA9IHJlbWVtYmVyKGN0eCwgdmFsdWUpO1xuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgX190OiBcInJlZlwiLCBpZDogY3R4LnNlZW4uZ2V0KHZhbHVlIGFzIG9iamVjdCkhIH0gYXMgRW5jb2RlZFJlZjtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdl0gb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbmNvZGVkVmFsID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYgYXMgdW5rbm93biwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkVmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChlbmNvZGVkVmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZHNba2V5XSA9IFtleGlzdGluZywgZW5jb2RlZFZhbF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gZW5jb2RlZFZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEZvcm1EYXRhICYgeyBfX2lkOiBudW1iZXIgfSA9IHtcbiAgICAgIF9fdDogXCJmb3JtZGF0YVwiLFxuICAgICAgZmllbGRzLFxuICAgICAgX19pZDogaWQsXG4gICAgfSBhcyBhbnk7XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgY29uc3QgZmlsZSA9IHZhbHVlO1xuICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgZmlsZVRvQnl0ZUFycmF5KHZhbHVlKTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRmlsZSA9IHtcbiAgICAgIF9fdDogXCJmaWxlXCIsXG4gICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgY29udGVudDogYnl0ZXMsXG4gICAgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIC8vIElkZW50aXR5IC8gY2lyY3VsYXIgcmVmZXJlbmNlIGhhbmRsaW5nXG4gIGNvbnN0IG9iamVjdCA9IHZhbHVlIGFzIG9iamVjdDtcbiAgY29uc3QgZXhpc3RpbmdJZCA9IGN0eC5zZWVuLmdldChvYmplY3QpO1xuICBpZiAoZXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmVmOiBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCIsIGlkOiBleGlzdGluZ0lkIH07XG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuICBjb25zdCB0aGlzSWQgPSBjdHgubmV4dElkKys7XG4gIGN0eC5zZWVuLnNldChvYmplY3QsIHRoaXNJZCk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgaXRlbXNSYXcgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICh2YWx1ZSBhcyB1bmtub3duW10pLm1hcCgoaXRlbSkgPT4gZW5jb2RlUmVjdXJzaXZlKGl0ZW0sIGN0eCkpXG4gICAgKTtcbiAgICBjb25zdCBpdGVtcyA9IGl0ZW1zUmF3LmZpbHRlcigoaXQpID0+IGl0ICE9PSB1bmRlZmluZWQpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkQXJyYXkgPSB7IF9fdDogXCJhcnJheVwiLCBfX2lkOiB0aGlzSWQsIGl0ZW1zIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICAvLyBQbGFpbiBvYmplY3Qgb3Igb3RoZXIgb2JqZWN0IHR5cGVzXG4gIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHYgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5jb2RlZFYgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkViAhPT0gdW5kZWZpbmVkKSBwcm9wc1trZXldID0gZW5jb2RlZFY7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vbi1wbGFpbiBvYmplY3RzOiBiZXN0IGVmZm9ydCDigJMgZW51bWVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRWID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYsIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFYgIT09IHVuZGVmaW5lZCkgcHJvcHNba2V5XSA9IGVuY29kZWRWO1xuICAgIH1cbiAgfVxuICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkT2JqZWN0ID0geyBfX3Q6IFwib2JqZWN0XCIsIF9faWQ6IHRoaXNJZCwgcHJvcHMgfTtcbiAgcmV0dXJuIGVuY29kZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGcm9tV2lyZShpbnB1dDogdW5rbm93bik6IHVua25vd24ge1xuICByZXR1cm4gZGVjb2RlUmVjdXJzaXZlKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUmVjdXJzaXZlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdGFnID0gb2JqW1wiX190XCJdO1xuXG4gIGlmICh0YWcgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgIGNvbnN0IHRzID0gb2JqW1widGltZXN0YW1wXCJdIGFzIG51bWJlcjtcbiAgICByZXR1cm4gbmV3IERhdGUodHMpO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmaWxlXCIpIHtcbiAgICAvLyBEbyBub3QgcmVjb25zdHJ1Y3QgRmlsZTsga2VlcCBhcyBwbGFpbiBvYmplY3QuIE9wdGlvbmFsbHksIHR1cm4gY29udGVudCBpbnRvIFVpbnQ4QXJyYXkgZm9yIGNvbnZlbmllbmNlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBvYmpbXCJjb250ZW50XCJdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgICAvLyBSZXR1cm4gYSBzaGFsbG93IGNsb25lIHdpdGggVWludDhBcnJheSBmb3IgY29udGVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub2JqLFxuICAgICAgICBjb250ZW50OiBuZXcgVWludDhBcnJheShjb250ZW50IGFzIG51bWJlcltdKSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmb3JtZGF0YVwiKSB7XG4gICAgLy8gS2VlcCBhcy1pcyAocGxhaW4gb2JqZWN0KSwgYnV0IGRlY29kZSBuZXN0ZWQgdmFsdWVzXG4gICAgY29uc3QgZmllbGRzID0gb2JqW1wiZmllbGRzXCJdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+O1xuICAgIGNvbnN0IGRlY29kZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmllbGRzKSkge1xuICAgICAgY29uc3QgdiA9IGZpZWxkc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgZGVjb2RlZEZpZWxkc1trZXldID0gdi5tYXAoKHgpID0+IGRlY29kZVJlY3Vyc2l2ZSh4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVkRmllbGRzW2tleV0gPSBkZWNvZGVSZWN1cnNpdmUodik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHM6IGRlY29kZWRGaWVsZHMgfSBhcyBFbmNvZGVkRm9ybURhdGE7XG4gIH1cblxuICBpZiAodGFnID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBpdGVtcyA9IChvYmpbXCJpdGVtc1wiXSBhcyB1bmtub3duW10pLm1hcCgoeCkgPT4gZGVjb2RlUmVjdXJzaXZlKHgpKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBpZiAodGFnID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcHJvcHMgPSBvYmpbXCJwcm9wc1wiXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvcHMpKSB7XG4gICAgICBvdXRba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZShwcm9wc1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwicmVmXCIpIHtcbiAgICAvLyBXaXRob3V0IGEgcmVjb25zdHJ1Y3Rpb24gY29udGV4dCBvbiB0aGUgY2xpZW50LCBsZWF2ZSBhcy1pcy5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLy8gVW5rbm93biBvYmplY3Qg4oCTIGRlc2NlbmQgc2hhbGxvd2x5XG4gIGNvbnN0IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICBjb3B5W2tleV0gPSBkZWNvZGVSZWN1cnNpdmUob2JqW2tleV0pO1xuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vLyBMZWdhY3kgY2xlYW5lciBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdoZXJlIGEgcXVpY2sgYmVzdC1lZmZvcnQgSlNPTi1zYWZlIHNoYXBlIGlzIG5lZWRlZFxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuRm9yU2VyaWFsaXphdGlvbihvYmo6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGNsZWFuUmVjdXJzaXZlKG9iaiwgbmV3IFdlYWtTZXQoKSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVjdXJzaXZlKG9iajogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKHNlZW4uaGFzKG9iaiBhcyBvYmplY3QpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBzZWVuLmFkZChvYmogYXMgb2JqZWN0KTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiAob2JqIGFzIHVua25vd25bXSlcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGNsZWFuUmVjdXJzaXZlKGl0ZW0sIHNlZW4pKVxuICAgICAgLmZpbHRlcigoeCkgPT4geCAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IHYgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgY29uc3QgY2xlYW5lZCA9IGNsZWFuUmVjdXJzaXZlKHYsIHNlZW4pO1xuICAgIGlmIChjbGVhbmVkICE9PSB1bmRlZmluZWQpIG91dFtrZXldID0gY2xlYW5lZDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLG9CQUNFLGNBQ0EsYUFDQSxtQkFDQSxpQkFDQSxlQ0xGLDJCQUNFLG1CQUNBLHFCQUNBLFdBQ0EsZUFDQSxlQ0ZLLElBQU0sR0FBZSxhQUNmLEdBQXFCLEtBMkczQixTQUFTLEVBQWEsQ0FBQyxFQUFxQyxDQUVqRSxPQUFPLE9BQU8sSUFBUyxVQUFZLElBQVMsS0FHdkMsU0FBUyxFQUFnQixDQUFDLEVBQXFDLENBQ3BFLE9BQ0UsT0FBTyxJQUFTLFVBQ2hCLElBQVMsTUFDVCxFQUFLLElBQUksV0FwSHFCLElBb0hRLEdBQ3RDLEVBQUssTUF0SG1CLG9FRGNyQixNQUFNLENBQWEsQ0FNZCxPQUNBLEtBQ0EsV0FDQSxXQVJGLGNBQ0EsY0FDQSxlQUNBLFNBQ1IsV0FBVyxDQUNELEVBQ0EsRUFDQSxFQUNBLEVBQ1IsRUFBNkIsQ0FBQyxFQUM5QixFQUErQixDQUFDLEVBQ2hDLEVBQTJCLENBQUMsRUFDNUIsQ0FQUSxjQUNBLFlBQ0Esa0JBQ0Esa0JBS1IsS0FBSyxjQUFnQixJQUFJLElBQ3pCLEtBQUssY0FBZ0IsSUFBSSxJQUN6QixLQUFLLGVBQWlCLElBQUksSUFBSSxDQUFrQixFQUNoRCxLQUFLLFNBQVcsSUFBSSxJQUFJ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LENBQUUsRUFHcEIsR0FBSSxJQUFRLE9BQVEsQ0FFbEIsSUFBTSxFQUFVLEVBQUksUUFDcEIsR0FBSSxNQUFNLFFBQVEsQ0FBTyxFQUV2QixNQUFPLElBQ0YsRUFDSCxRQUFTLElBQUksV0FBVyxDQUFtQixDQUM3QyxFQUVGLE9BQU8sRUFHVCxHQUFJLElBQVEsV0FBWSxDQUV0QixJQUFNLEVBQVMsRUFBSSxPQUNiLEVBQXFELENBQUMsRUFDNUQsUUFBVyxLQUFPLE9BQU8sS0FBSyxDQUFNLEVBQUcsQ0FDckMsSUFBTSxFQUFJLEVBQU8sR0FDakIsR0FBSSxNQUFNLFFBQVEsQ0FBQyxFQUNqQixFQUFjLEdBQU8sRUFBRSxJQUFJLENBQUMsSUFBTSxFQUFnQixDQUFDLENBQUMsRUFFcEQsT0FBYyxHQUFPLEVBQWdCLENBQUMsRUFHMUMsTUFBTyxDQUFFLElBQUssV0FBWSxPQUFRLENBQWMsRUFHbEQsR0FBSSxJQUFRLFFBRVYsT0FEZSxFQUFJLE1BQXVCLElBQUksQ0FBQyxJQUFNLEVBQWdCLENBQUMsQ0FBQyxFQUl6RSxHQUFJLElBQVEsU0FBVSxDQUNwQixJQUFNLEVBQVEsRUFBSSxNQUNaLEVBQStCLENBQUMsRUFDdEMsUUFBVyxLQUFPLE9BQU8sS0FBSyxDQUFLLEVBQ2pDLEVBQUksR0FBTyxFQUFnQixFQUFNLEVBQUksRUFFdkMsT0FBTyxFQUdULEdBQUksSUFBUSxNQUVWLE9BQU8sRUFJVCxJQUFNLEVBQWdDLENBQUMsRUFDdkMsUUFBVyxLQUFPLE9BQU8sS0FBSyxDQUFHLEVBQy9CLEVBQUssR0FBTyxFQUFnQixFQUFJLEVBQUksRUFFdEMsT0FBTyxFQUlGLFNBQVMsRUFBcUIsQ0FBQyxFQUF1QixDQUMzRCxPQUFPLEdBQWUsRUFBSyxJQUFJLE9BQVMsRUFHMUMsU0FBUyxFQUFjLENBQUMsRUFBYyxFQUFnQyxDQUNwRSxHQUFJLElBQVEsTUFBUSxPQUFPLElBQVEsU0FBVSxPQUFPLEVBQ3BELEdBQUksRUFBSyxJQUFJLENBQWEsRUFBRyxPQUU3QixHQURBLEVBQUssSUFBSSxDQUFhLEVBQ2xCLE1BQU0sUUFBUSxDQUFHLEVBQ25CLE9BQVEsRUFDTCxJQUFJLENBQUMsSUFBUyxHQUFlLEVBQU0sQ0FBSSxDQUFDLEVBQ3hDLE9BQU8sQ0FBQyxJQUFNLElBQU0sTUFBUyxFQUVsQyxJQUFNLEVBQStCLENBQUMsRUFDdEMsUUFBVyxLQUFPLEVBQWdDLENBQ2hELElBQU0sRUFBSyxFQUFnQyxHQUMzQyxHQUFJLEdBQVksQ0FBQyxFQUFHLFNBQ3BCLElBQU0sRUFBVSxHQUFlLEVBQUcsQ0FBSSxFQUN0QyxHQUFJLElBQVksT0FBVyxFQUFJLEdBQU8sRUFFeEMsT0FBTyIsCiAgImRlYnVnSWQiOiAiMUM3NDMwOEI1ODQ5Qjk3QzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
4
+ //# debugId=F3C3848648EBF8C464756E2164756E21
5
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9zZXJpYWxpemVyLnRzIiwgIi4uL3NyYy9jbGllbnQudHN4IiwgIi4uL3NyYy9jaGFubmVsLnRzIiwgIi4uL3NyYy91c2VQdWxzZUNoYW5uZWwudHMiLCAiLi4vc3JjL2Zvcm0udHN4IiwgIi4uL3NyYy90cmFuc3BvcnQudHMiLCAiLi4vc3JjL2hlbHBlcnMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9jbGVhbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbiAgdXNlTWVtbyxcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZET01SZW5kZXJlciwgYXBwbHlVcGRhdGVzIH0gZnJvbSBcIi4vcmVuZGVyZXJcIjtcbmltcG9ydCB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgQ29tcG9uZW50UmVnaXN0cnksIFJlZ2lzdHJ5RW50cnkgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlUGFyYW1zLCB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyRXJyb3JJbmZvfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUluZm8gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUNvbmZpZyB7XG4gIHNlcnZlckFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgUHVsc2VQcmVyZW5kZXJWaWV3ID0ge1xuICB2ZG9tOiBWRE9NO1xuICBjYWxsYmFja3M6IHN0cmluZ1tdO1xuICByZW5kZXJfcHJvcHM6IHN0cmluZ1tdO1xuICBjc3NfcmVmczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBQdWxzZVByZXJlbmRlciA9IHtcbiAgcmVuZGVySWQ6IHN0cmluZztcbiAgdmlld3M6IFJlY29yZDxzdHJpbmcsIFB1bHNlUHJlcmVuZGVyVmlldz47XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRleHQgYW5kIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb250ZXh0IGZvciB0aGUgY2xpZW50LCBwcm92aWRlZCBieSBQdWxzZVByb3ZpZGVyXG5jb25zdCBQdWxzZUNsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlU29ja2V0SU9DbGllbnQgfCBudWxsPihudWxsKTtcbmNvbnN0IFB1bHNlUHJlcmVuZGVyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHVsc2VQcmVyZW5kZXIgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1bHNlQ2xpZW50ID0gKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSB1c2VDb250ZXh0KFB1bHNlQ2xpZW50Q29udGV4dCk7XG4gIGlmICghY2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDbGllbnQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFB1bHNlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZVByZXJlbmRlciA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChQdWxzZVByZXJlbmRlckNvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlUHJlcmVuZGVyIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIGNvbnN0IHZpZXcgPSBjdHgudmlld3NbcGF0aF07XG4gIGlmICghdmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJlcmVuZGVyIGZvdW5kIGZvciAnJHtwYXRofSdgKTtcbiAgfVxuICByZXR1cm4gdmlldztcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcm92aWRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBjb25maWc6IFB1bHNlQ29uZmlnO1xuICBwcmVyZW5kZXI6IFB1bHNlUHJlcmVuZGVyO1xufVxuXG5jb25zdCBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBjb25maWcsXG4gIHByZXJlbmRlcixcbn06IFB1bHNlUHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IHJyTmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCB7IHJlbmRlcklkIH0gPSBwcmVyZW5kZXI7XG5cbiAgY29uc3QgY2xpZW50ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgUHVsc2VTb2NrZXRJT0NsaWVudChjb25maWcuc2VydmVyQWRkcmVzcywgcmVuZGVySWQsIHJyTmF2aWdhdGUpLFxuICAgIFtjb25maWcuc2VydmVyQWRkcmVzcywgcnJOYXZpZ2F0ZSwgcmVuZGVySWRdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IGNsaWVudC5vbkNvbm5lY3Rpb25DaGFuZ2Uoc2V0Q29ubmVjdGVkKSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgIHJldHVybiAoKSA9PiBjbGllbnQuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfSwgW2NsaWVudF0pO1xuXG4gIHJldHVybiAoXG4gICAgPFB1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y2xpZW50fT5cbiAgICAgIDxQdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ByZXJlbmRlcn0+XG4gICAgICAgIHshY29ubmVjdGVkICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICBib3R0b206IFwiMjBweFwiLFxuICAgICAgICAgICAgICByaWdodDogXCIyMHB4XCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJyZWRcIixcbiAgICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIixcbiAgICAgICAgICAgICAgcGFkZGluZzogXCIxMHB4XCIsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1cHhcIixcbiAgICAgICAgICAgICAgekluZGV4OiAxMDAwLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICBGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgc2VydmVyLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L1B1bHNlUHJlcmVuZGVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1B1bHNlQ2xpZW50Q29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZpZXdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VWaWV3UHJvcHMge1xuICBleHRlcm5hbENvbXBvbmVudHM6IENvbXBvbmVudFJlZ2lzdHJ5O1xuICBwYXRoOiBzdHJpbmc7XG4gIGNzc01vZHVsZXM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VWaWV3KHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzLFxuICBwYXRoLFxuICBjc3NNb2R1bGVzLFxufTogUHVsc2VWaWV3UHJvcHMpIHtcbiAgY29uc3QgY2xpZW50ID0gdXNlUHVsc2VDbGllbnQoKTtcbiAgY29uc3QgaW5pdGlhbFZpZXcgPSB1c2VQdWxzZVByZXJlbmRlcihwYXRoKTtcbiAgY29uc3QgaW5pdGlhbFZET00gPSBpbml0aWFsVmlldy52ZG9tO1xuICBjb25zdCByZW5kZXJlciA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIG5ldyBWRE9NUmVuZGVyZXIoXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZXh0ZXJuYWxDb21wb25lbnRzLFxuICAgICAgICBjc3NNb2R1bGVzLFxuICAgICAgICBpbml0aWFsVmlldy5jYWxsYmFja3MsXG4gICAgICAgIGluaXRpYWxWaWV3LnJlbmRlcl9wcm9wcyxcbiAgICAgICAgaW5pdGlhbFZpZXcuY3NzX3JlZnNcbiAgICAgICksXG4gICAgW2NsaWVudCwgcGF0aCwgZXh0ZXJuYWxDb21wb25lbnRzLCBjc3NNb2R1bGVzLCBpbml0aWFsVmlld11cbiAgKTtcbiAgY29uc3QgW3RyZWUsIHNldFRyZWVdID0gdXNlU3RhdGU8UmVhY3QuUmVhY3ROb2RlPigoKSA9PlxuICAgIHJlbmRlcmVyLnJlbmRlck5vZGUoaW5pdGlhbFZET00pXG4gICk7XG4gIGNvbnN0IFtzZXJ2ZXJFcnJvciwgc2V0U2VydmVyRXJyb3JdID0gdXNlU3RhdGU8U2VydmVyRXJyb3JJbmZvIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgbG9jYXRpb24gPSB1c2VMb2NhdGlvbigpO1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcblxuICBjb25zdCByb3V0ZUluZm8gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IFwiKlwiOiBjYXRjaGFsbCA9IFwiXCIsIC4uLnBhdGhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzaDogbG9jYXRpb24uaGFzaCxcbiAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgIHF1ZXJ5OiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBxdWVyeVBhcmFtczogT2JqZWN0LmZyb21FbnRyaWVzKHF1ZXJ5UGFyYW1zLmVudHJpZXMoKSksXG4gICAgICBwYXRoUGFyYW1zLFxuICAgICAgY2F0Y2hhbGw6IGNhdGNoYWxsLmxlbmd0aCA+IDAgPyBjYXRjaGFsbC5zcGxpdChcIi9cIikgOiBbXSxcbiAgICB9IHNhdGlzZmllcyBSb3V0ZUluZm87XG4gIH0sIFtcbiAgICBsb2NhdGlvbi5oYXNoLFxuICAgIGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgIGxvY2F0aW9uLnNlYXJjaCxcbiAgICBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5tb3VudFZpZXcocGF0aCwge1xuICAgICAgICByb3V0ZUluZm8sXG4gICAgICAgIG9uSW5pdDogKHZkb20sIGNhbGxiYWNrcywgcmVuZGVyUHJvcHMsIGNzc1JlZnMpID0+IHtcbiAgICAgICAgICByZW5kZXJlci5zZXRDYWxsYmFja3MoY2FsbGJhY2tzKTtcbiAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJQcm9wcyhyZW5kZXJQcm9wcyk7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0Q3NzUmVmcyhjc3NSZWZzKTtcbiAgICAgICAgICBzZXRUcmVlKHJlbmRlcmVyLnJlbmRlck5vZGUodmRvbSkpO1xuICAgICAgICB9LFxuICAgICAgICBvblVwZGF0ZTogKG9wcykgPT4ge1xuICAgICAgICAgIHNldFRyZWUoKHByZXYpID0+XG4gICAgICAgICAgICBwcmV2ID09IG51bGwgPyBwcmV2IDogYXBwbHlVcGRhdGVzKHByZXYsIG9wcywgcmVuZGVyZXIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2ZmRXJyID0gY2xpZW50Lm9uU2VydmVyRXJyb3IoKHAsIGVycikgPT4ge1xuICAgICAgICBpZiAocCA9PT0gcGF0aCkgc2V0U2VydmVyRXJyb3IoZXJyKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgb2ZmRXJyKCk7XG4gICAgICAgIGNsaWVudC51bm1vdW50KHBhdGgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLy8gcm91dGVJbmZvIGlzIE5PVCBpbmNsdWRlZCBoZXJlIG9uIHB1cnBvc2VcbiAgfSwgW2NsaWVudF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluQnJvd3Nlcikge1xuICAgICAgY2xpZW50Lm5hdmlnYXRlKHBhdGgsIHJvdXRlSW5mbyk7XG4gICAgfVxuICB9LCBbY2xpZW50LCBwYXRoLCByb3V0ZUluZm9dKTtcblxuICBpZiAoc2VydmVyRXJyb3IpIHtcbiAgICByZXR1cm4gPFNlcnZlckVycm9yIGVycm9yPXtzZXJ2ZXJFcnJvcn0gLz47XG4gIH1cblxuICByZXR1cm4gdHJlZTtcbn1cblxuZnVuY3Rpb24gU2VydmVyRXJyb3IoeyBlcnJvciB9OiB7IGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBhZGRpbmc6IDE2LFxuICAgICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNlMDBcIixcbiAgICAgICAgYmFja2dyb3VuZDogXCIjZmZmNWY1XCIsXG4gICAgICAgIGNvbG9yOiBcIiM5MDBcIixcbiAgICAgICAgZm9udEZhbWlseTpcbiAgICAgICAgICAndWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlJyxcbiAgICAgICAgd2hpdGVTcGFjZTogXCJwcmUtd3JhcFwiLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRXZWlnaHQ6IDcwMCwgbWFyZ2luQm90dG9tOiA4IH19PlxuICAgICAgICBTZXJ2ZXIgRXJyb3IgZHVyaW5nIHtlcnJvci5waGFzZX1cbiAgICAgIDwvZGl2PlxuICAgICAge2Vycm9yLm1lc3NhZ2UgJiYgPGRpdj57ZXJyb3IubWVzc2FnZX08L2Rpdj59XG4gICAgICB7ZXJyb3Iuc3RhY2sgJiYgKFxuICAgICAgICA8ZGV0YWlscyBvcGVuIHN0eWxlPXt7IG1hcmdpblRvcDogOCB9fT5cbiAgICAgICAgICA8c3VtbWFyeT5TdGFjayB0cmFjZTwvc3VtbWFyeT5cbiAgICAgICAgICA8cHJlIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57ZXJyb3Iuc3RhY2t9PC9wcmU+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iLAogICAgImltcG9ydCBSZWFjdCwge1xuICBjbG9uZUVsZW1lbnQsXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGlzVmFsaWRFbGVtZW50LFxuICBsYXp5LFxuICBTdXNwZW5zZSxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50UmVnaXN0cnksIFZET01Ob2RlLCBWRE9NVXBkYXRlLCBWRE9NIH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHtcbiAgRlJBR01FTlRfVEFHLFxuICBpc0VsZW1lbnROb2RlLFxuICBpc01vdW50UG9pbnROb2RlLFxuICBNT1VOVF9QT0lOVF9QUkVGSVgsXG59IGZyb20gXCIuL3Zkb21cIjtcbmltcG9ydCB0eXBlIHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuXG5leHBvcnQgY2xhc3MgVkRPTVJlbmRlcmVyIHtcbiAgcHJpdmF0ZSBjYWxsYmFja3M6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIGNhbGxiYWNrQ2FjaGU6IE1hcDxzdHJpbmcsIEZ1bmN0aW9uPjtcbiAgcHJpdmF0ZSByZW5kZXJQcm9wS2V5czogU2V0PHN0cmluZz47XG4gIHByaXZhdGUgY3NzUHJvcHM6IFNldDxzdHJpbmc+O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCxcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZyxcbiAgICBwcml2YXRlIGNvbXBvbmVudHM6IENvbXBvbmVudFJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgY3NzTW9kdWxlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gICAgaW5pdGlhbENhbGxiYWNrczogc3RyaW5nW10gPSBbXSxcbiAgICBpbml0aWFsUmVuZGVyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgaW5pdGlhbENzc1JlZnM6IHN0cmluZ1tdID0gW11cbiAgKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgU2V0KGluaXRpYWxDYWxsYmFja3MpO1xuICAgIHRoaXMuY2FsbGJhY2tDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJlbmRlclByb3BLZXlzID0gbmV3IFNldChpbml0aWFsUmVuZGVyUHJvcHMpO1xuICAgIHRoaXMuY3NzUHJvcHMgPSBuZXcgU2V0KGluaXRpYWxDc3NSZWZzKTtcbiAgICB0aGlzLnNldENhbGxiYWNrcyhpbml0aWFsQ2FsbGJhY2tzKTtcbiAgfVxuXG4gIHNldENhbGxiYWNrcyhrZXlzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IFNldChrZXlzKTtcbiAgfVxuXG4gIHNldFJlbmRlclByb3BzKGtleXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5yZW5kZXJQcm9wS2V5cyA9IG5ldyBTZXQoa2V5cyk7XG4gIH1cblxuICBzZXRDc3NSZWZzKGVudHJpZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5jc3NQcm9wcyA9IG5ldyBTZXQoZW50cmllcyk7XG4gIH1cblxuICBhcHBseUNhbGxiYWNrRGVsdGEoZGVsdGE6IHsgYWRkPzogc3RyaW5nW107IHJlbW92ZT86IHN0cmluZ1tdIH0pIHtcbiAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgaW50ZXJuYWwgY2FsbGJhY2sgcGF0aCByZWdpc3RyeSBhbmQgY2FjaGUuIFdlIHJlbHkgb25cbiAgICAvLyBhY2NvbXBhbnlpbmcgdXBkYXRlX3Byb3BzIG9wZXJhdGlvbnMgdGhhdCBjb250YWluIHRoZSBcIiRjYlwiIHBsYWNlaG9sZGVyXG4gICAgLy8gdG8gdHJpZ2dlciBwcm9wIHVwZGF0ZXM7IHRyYW5zZm9ybVZhbHVlIHdpbGwgcmVzb2x2ZSB0byBmdW5jdGlvbnMuXG4gICAgaWYgKGRlbHRhLnJlbW92ZSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsdGEuYWRkKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWx0YS5hZGQpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXBwbHlSZW5kZXJQcm9wc0RlbHRhKGRlbHRhOiB7IGFkZD86IHN0cmluZ1tdOyByZW1vdmU/OiBzdHJpbmdbXSB9KSB7XG4gICAgaWYgKGRlbHRhLnJlbW92ZSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUHJvcEtleXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWx0YS5hZGQpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGRlbHRhLmFkZCkge1xuICAgICAgICB0aGlzLnJlbmRlclByb3BLZXlzLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFwcGx5Q3NzUmVmc0RlbHRhKGRlbHRhOiB7IHNldD86IHN0cmluZ1tdOyByZW1vdmU/OiBzdHJpbmdbXSB9KSB7XG4gICAgaWYgKGRlbHRhLnNldCkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGRlbHRhLnNldCkge1xuICAgICAgICB0aGlzLmNzc1Byb3BzLmFkZChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbHRhLnJlbW92ZSkge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGRlbHRhLnJlbW92ZSkge1xuICAgICAgICB0aGlzLmNzc1Byb3BzLmRlbGV0ZShwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDYWxsYmFjayhwYXRoOiBzdHJpbmcsIHByb3A6IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucHJvcFBhdGgocGF0aCwgcHJvcCk7XG4gICAgbGV0IGZuID0gdGhpcy5jYWxsYmFja0NhY2hlLmdldChrZXkpO1xuICAgIGlmICghZm4pIHtcbiAgICAgIGZuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB0aGlzLmNsaWVudC5pbnZva2VDYWxsYmFjayh0aGlzLnBhdGgsIGtleSwgYXJncyk7XG4gICAgICB0aGlzLmNhbGxiYWNrQ2FjaGUuc2V0KGtleSwgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cblxuICByZW5kZXJOb2RlKG5vZGU6IFZET01Ob2RlLCBjdXJyZW50UGF0aCA9IFwiXCIpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgIC8vIEhhbmRsZSBwcmltaXRpdmVzIGVhcmx5XG4gICAgaWYgKFxuICAgICAgbm9kZSA9PSBudWxsIHx8IC8vIGNhdGNoZXMgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgIHR5cGVvZiBub2RlID09PSBcImJvb2xlYW5cIiB8fFxuICAgICAgdHlwZW9mIG5vZGUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiXG4gICAgKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvLyBFbGVtZW50IG5vZGVzXG4gICAgaWYgKGlzRWxlbWVudE5vZGUobm9kZSkpIHtcbiAgICAgIGNvbnN0IHsgdGFnLCBwcm9wcyA9IHt9LCBjaGlsZHJlbiA9IFtdIH0gPSBub2RlO1xuXG4gICAgICBjb25zdCBuZXdQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICAgIG5ld1Byb3BzW3Byb3BOYW1lXSA9IHRoaXMudHJhbnNmb3JtVmFsdWUoXG4gICAgICAgICAgY3VycmVudFBhdGgsXG4gICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgcHJvcFZhbHVlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLmtleSkge1xuICAgICAgICBuZXdQcm9wcy5rZXkgPSBub2RlLmtleTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVuZGVyZWRDaGlsZHJlbiA9IFtdO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XSE7XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgICAgPyBgJHtjdXJyZW50UGF0aH0uJHtpbmRleH1gXG4gICAgICAgICAgOiBTdHJpbmcoaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuLnB1c2godGhpcy5yZW5kZXJOb2RlKGNoaWxkLCBjaGlsZFBhdGgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTW91bnRQb2ludE5vZGUobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50S2V5ID0gbm9kZS50YWcuc2xpY2UoTU9VTlRfUE9JTlRfUFJFRklYLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRLZXldITtcbiAgICAgICAgaWYgKCFDb21wb25lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgY29tcG9uZW50ICR7Y29tcG9uZW50S2V5fS4gVGhpcyBpcyBhIFB1bHNlIGludGVybmFsIGVycm9yLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KENvbXBvbmVudCwgbmV3UHJvcHMsIC4uLnJlbmRlcmVkQ2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChcbiAgICAgICAgdGFnID09PSBGUkFHTUVOVF9UQUcgPyBSZWFjdC5GcmFnbWVudCA6IHRhZyxcbiAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgIC4uLnJlbmRlcmVkQ2hpbGRyZW5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIHVua25vd24gbm9kZSB0eXBlc1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmtub3duIFZET00gbm9kZSB0eXBlOlwiLCBub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHByb3BQYXRoKHBhdGg6IHN0cmluZywgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHBhdGggPyBgJHtwYXRofS4ke3Byb3B9YCA6IHByb3A7XG4gIH1cblxuICB0cmFuc2Zvcm1WYWx1ZShwYXRoOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgcHJvcFBhdGggPSB0aGlzLnByb3BQYXRoKHBhdGgsIGtleSk7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzLmhhcyhwcm9wUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENhbGxiYWNrKHBhdGgsIGtleSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbmRlclByb3BLZXlzLmhhcyhwcm9wUGF0aCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlck5vZGUodmFsdWUsIHByb3BQYXRoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3NzUHJvcHMuaGFzKHByb3BQYXRoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNzc1Rva2VuKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ3NzVG9rZW4odG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaWR4ID0gdG9rZW4uaW5kZXhPZihcIjpcIik7XG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlSWQgPSB0b2tlbi5zbGljZSgwLCBpZHgpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRva2VuLnNsaWNlKGlkeCArIDEpO1xuICAgIGlmICghbW9kdWxlSWQgfHwgIWNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSB0aGlzLmNzc01vZHVsZXNbbW9kdWxlSWRdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZWNlaXZlZCBDU1MgcmVmZXJlbmNlIGZvciB1bmtub3duIG1vZHVsZSAnJHttb2R1bGVJZH0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBtb2RbY2xhc3NOYW1lXTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZWNlaXZlZCBDU1MgcmVmZXJlbmNlIGZvciBtaXNzaW5nIGNsYXNzICcke2NsYXNzTmFtZX0nIGluIG1vZHVsZSAnJHttb2R1bGVJZH0nYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDYWxsYmFja3NPblRyZWUoXG4gICAgbm9kZTogUmVhY3QuUmVhY3ROb2RlLFxuICAgIHBhcnRzOiBzdHJpbmdbXSxcbiAgICBkZXB0aDogbnVtYmVyLFxuICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcsXG4gICAgYmVmb3JlOiBTZXQ8c3RyaW5nPixcbiAgICBhZnRlcjogU2V0PHN0cmluZz5cbiAgKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICBpZiAoZGVwdGggPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50PFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPjtcbiAgICAgIGNvbnN0IHNlZ21lbnQgPSBwYXJ0c1tkZXB0aF0hO1xuICAgICAgY29uc3QgY2hpbGRJZHggPSBOdW1iZXIoc2VnbWVudCk7XG4gICAgICBjb25zdCBuZXh0UGF0aCA9IGN1cnJlbnRQYXRoID8gYCR7Y3VycmVudFBhdGh9LiR7c2VnbWVudH1gIDogc2VnbWVudDtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKGNoaWxkSWR4KSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbkFyciA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5BcnJbY2hpbGRJZHhdO1xuICAgICAgICBjb25zdCB1cGRhdGVkQ2hpbGQgPSB0aGlzLnVwZGF0ZUNhbGxiYWNrc09uVHJlZShcbiAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICBwYXJ0cyxcbiAgICAgICAgICBkZXB0aCArIDEsXG4gICAgICAgICAgbmV4dFBhdGgsXG4gICAgICAgICAgYmVmb3JlLFxuICAgICAgICAgIGFmdGVyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh1cGRhdGVkQ2hpbGQgPT09IGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW5BcnJbY2hpbGRJZHhdID0gdXBkYXRlZENoaWxkIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCB1bmRlZmluZWQsIC4uLmNoaWxkcmVuQXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJhc2VQcm9wcyA9IChlbGVtZW50LnByb3BzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICBjb25zdCBjaGlsZCA9IGJhc2VQcm9wc1tzZWdtZW50XTtcbiAgICAgICAgY29uc3QgdXBkYXRlZENoaWxkID0gdGhpcy51cGRhdGVDYWxsYmFja3NPblRyZWUoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFydHMsXG4gICAgICAgICAgZGVwdGggKyAxLFxuICAgICAgICAgIG5leHRQYXRoLFxuICAgICAgICAgIGJlZm9yZSxcbiAgICAgICAgICBhZnRlclxuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlZENoaWxkID09PSBjaGlsZCkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIC4uLmJhc2VQcm9wcyxcbiAgICAgICAgICBbc2VnbWVudF06IHVwZGF0ZWRDaGlsZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50PFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPjtcbiAgICBjb25zdCBjdXJyZW50UHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IG5leHRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uY3VycmVudFByb3BzIH07XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgYmVmb3JlKSB7XG4gICAgICBpZiAoIWFmdGVyLmhhcyhwcm9wKSAmJiBwcm9wIGluIG5leHRQcm9wcykge1xuICAgICAgICBkZWxldGUgbmV4dFByb3BzW3Byb3BdO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgYWZ0ZXIpIHtcbiAgICAgIGNvbnN0IGZuID0gdGhpcy5nZXRDYWxsYmFjayhjdXJyZW50UGF0aCwgcHJvcCk7XG4gICAgICBpZiAobmV4dFByb3BzW3Byb3BdICE9PSBmbikge1xuICAgICAgICBuZXh0UHJvcHNbcHJvcF0gPSBmbjtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFjaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBuZXh0UHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRzRXF1YWwobGVmdDogU2V0PHN0cmluZz4sIHJpZ2h0OiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgIGlmIChsZWZ0LnNpemUgIT09IHJpZ2h0LnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBsZWZ0KSB7XG4gICAgICBpZiAoIXJpZ2h0Lmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXBkYXRlIEZ1bmN0aW9ucyAoc2hhbGxvdy1jbG9uZSBhbG9uZyB1cGRhdGUgcGF0aClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGVuc3VyZUNoaWxkcmVuQXJyYXkoZWw6IFJlYWN0LlJlYWN0RWxlbWVudCk6IFJlYWN0LlJlYWN0Tm9kZVtdIHtcbiAgY29uc3QgY2hpbGRyZW4gPSAoZWwucHJvcHMgYXMgYW55KT8uY2hpbGRyZW4gYXMgUmVhY3QuUmVhY3ROb2RlIHwgdW5kZWZpbmVkO1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbi5zbGljZSgpIDogW2NoaWxkcmVuXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VXBkYXRlcyhcbiAgaW5pdGlhbFRyZWU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgdXBkYXRlczogVkRPTVVwZGF0ZVtdLFxuICByZW5kZXJlcjogVkRPTVJlbmRlcmVyXG4pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBsZXQgbmV3VHJlZTogUmVhY3QuUmVhY3ROb2RlID0gaW5pdGlhbFRyZWU7XG4gIGZvciAoY29uc3QgdXBkYXRlIG9mIHVwZGF0ZXMpIHtcbiAgICBpZiAodXBkYXRlLnR5cGUgPT09IFwidXBkYXRlX2NhbGxiYWNrc1wiKSB7XG4gICAgICByZW5kZXJlci5hcHBseUNhbGxiYWNrRGVsdGEodXBkYXRlLmRhdGEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh1cGRhdGUudHlwZSA9PT0gXCJ1cGRhdGVfY3NzX3JlZnNcIikge1xuICAgICAgcmVuZGVyZXIuYXBwbHlDc3NSZWZzRGVsdGEodXBkYXRlLmRhdGEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh1cGRhdGUudHlwZSA9PT0gXCJ1cGRhdGVfcmVuZGVyX3Byb3BzXCIpIHtcbiAgICAgIHJlbmRlcmVyLmFwcGx5UmVuZGVyUHJvcHNEZWx0YSh1cGRhdGUuZGF0YSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IHVwZGF0ZS5wYXRoLnNwbGl0KFwiLlwiKS5maWx0ZXIoKHMpID0+IHMubGVuZ3RoID4gMCk7XG5cbiAgICBjb25zdCBkZXNjZW5kID0gKFxuICAgICAgbm9kZTogUmVhY3QuUmVhY3ROb2RlLFxuICAgICAgZGVwdGg6IG51bWJlcixcbiAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmdcbiAgICApOiBSZWFjdC5SZWFjdE5vZGUgPT4ge1xuICAgICAgaWYgKGRlcHRoIDwgcGFydHMubGVuZ3RoKSB7XG4gICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ8UmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw+O1xuICAgICAgICBjb25zdCBjaGlsZEtleSA9IHBhcnRzW2RlcHRoXSE7XG4gICAgICAgIGNvbnN0IGNoaWxkSWR4ID0gK2NoaWxkS2V5O1xuICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBjdXJyZW50UGF0aCA/IGAke2N1cnJlbnRQYXRofS4ke2NoaWxkS2V5fWAgOiBjaGlsZEtleTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oY2hpbGRJZHgpKSB7XG4gICAgICAgICAgLy8gUmVndWxhciBjaGlsZCB0cmF2ZXJzYWxcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbkFyciA9IGVuc3VyZUNoaWxkcmVuQXJyYXkoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbkFycltjaGlsZElkeF07XG4gICAgICAgICAgY2hpbGRyZW5BcnJbY2hpbGRJZHhdID0gZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxLCBjaGlsZFBhdGgpIGFzIGFueTtcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIHVuZGVmaW5lZCwgLi4uY2hpbGRyZW5BcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbmRlciBwcm9wIHRyYXZlcnNhbFxuICAgICAgICAgIGNvbnN0IGJhc2VQcm9wcyA9IChlbGVtZW50LnByb3BzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gYmFzZVByb3BzW2NoaWxkS2V5XTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmJhc2VQcm9wcyxcbiAgICAgICAgICAgIFtjaGlsZEtleV06IGRlc2NlbmQoY2hpbGQsIGRlcHRoICsgMSwgY2hpbGRQYXRoKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgcHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHVwZGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcbiAgICAgICAgICByZXR1cm4gcmVuZGVyZXIucmVuZGVyTm9kZSh1cGRhdGUuZGF0YSwgdXBkYXRlLnBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ1cGRhdGVfcHJvcHNcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UHJvcHMgPSAoZWxlbWVudC5wcm9wcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICBjb25zdCBuZXh0UHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLmN1cnJlbnRQcm9wcyB9O1xuICAgICAgICAgIGNvbnN0IGRlbHRhID0gdXBkYXRlLmRhdGE7XG4gICAgICAgICAgaWYgKGRlbHRhLnJlbW92ZSAmJiBkZWx0YS5yZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZGVsdGEucmVtb3ZlKSB7XG4gICAgICAgICAgICAgIGlmIChrZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5leHRQcm9wc1trZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWx0YS5zZXQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhLnNldCkpIHtcbiAgICAgICAgICAgICAgbmV4dFByb3BzW2tdID0gcmVuZGVyZXIudHJhbnNmb3JtVmFsdWUoY3VycmVudFBhdGgsIGssIHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBOb3QgcGFzc2luZyBjaGlsZHJlbiAtPiBvbmx5IHVwZGF0ZSB0aGUgcHJvcHNcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KGVsZW1lbnQsIG5leHRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImluc2VydFwiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZW5zdXJlQ2hpbGRyZW5BcnJheShlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBjaGlsZFBhdGggPSBjdXJyZW50UGF0aFxuICAgICAgICAgICAgPyBgJHtjdXJyZW50UGF0aH0uJHt1cGRhdGUuaWR4fWBcbiAgICAgICAgICAgIDogU3RyaW5nKHVwZGF0ZS5pZHgpO1xuICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShcbiAgICAgICAgICAgIHVwZGF0ZS5pZHgsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyTm9kZSh1cGRhdGUuZGF0YSwgY2hpbGRQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIGNoaWxkcmVuIChUeXBlU2NyaXB0IGRvZXNuJ3QgbGlrZSB0aGUgYG51bGxgLCBidXQgdGhhdCdzIHdoYXQgdGhlIG9mZmljaWFsIFJlYWN0IGRvY3Mgc2F5KVxuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgbnVsbCEsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuaWR4LCAxKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbnN1cmVDaGlsZHJlbkFycmF5KGVsZW1lbnQpO1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjaGlsZHJlbi5zcGxpY2UodXBkYXRlLmRhdGEuZnJvbV9pbmRleCwgMSlbMF07XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5kYXRhLnRvX2luZGV4LCAwLCBpdGVtKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChlbGVtZW50LCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFtQdWxzZSByZW5kZXJlcl0gVW5rbm93biB1cGRhdGUgdHlwZTogJHt1cGRhdGVbXCJ0eXBlXCJdfWBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBuZXdUcmVlID0gZGVzY2VuZChuZXdUcmVlLCAwLCBcIlwiKTtcbiAgfVxuICByZXR1cm4gbmV3VHJlZTtcbn1cblxuLy8gVGhlIGBjb21wb25lbnRgIHByb3Agc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIGAoKSA9PlxuLy8gaW1wb3J0KCd+L3BhdGgvdG8vY29tcG9uZW50JykgKHdlJ2xsIG5lZWQgdG8gcmVtYXAgaWYgd2UncmUgaW1wb3J0aW5nIGEgbmFtZWQgZXhwb3J0IGFuZCBub3QgdGhlIGRlZmF1bHQpXG5leHBvcnQgZnVuY3Rpb24gUmVuZGVyTGF6eShcbiAgY29tcG9uZW50OiAoKSA9PiBQcm9taXNlPHsgZGVmYXVsdDogQ29tcG9uZW50VHlwZTxhbnk+IH0+LFxuICBmYWxsYmFjaz86IFJlYWN0LlJlYWN0Tm9kZVxuKTogUmVhY3QuRkM8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48dW5rbm93bj4+IHtcbiAgY29uc3QgQ29tcG9uZW50ID0gbGF6eShjb21wb25lbnQpO1xuICByZXR1cm4gKHsgY2hpbGRyZW4sIC4uLnByb3BzIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHVua25vd24+KSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXNwZW5zZSBmYWxsYmFjaz17ZmFsbGJhY2sgPz8gPD48Lz59PlxuICAgICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvQ29tcG9uZW50PlxuICAgICAgPC9TdXNwZW5zZT5cbiAgICApO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhc3NlcnRJc0VsZW1lbnQoXG4gIG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgcGFydHM6IHN0cmluZ1tdLFxuICBkZXB0aDogbnVtYmVyXG4pOiBub2RlIGlzIFJlYWN0LlJlYWN0RWxlbWVudCB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgbm9kZTpcIiwgbm9kZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBub2RlIGF0IHBhdGggXCIgKyBwYXJ0cy5zbGljZSgwLCBkZXB0aCkuam9pbihcIi5cIikpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENvbXBvbmVudFR5cGUgfSBmcm9tIFwicmVhY3RcIjtcblxuLy8gU3BlY2lhbCBwcmVmaXhlcyBmb3IgcmVzZXJ2ZWQgbm9kZSB0eXBlc1xuZXhwb3J0IGNvbnN0IEZSQUdNRU5UX1RBRyA9IFwiJCRmcmFnbWVudFwiO1xuZXhwb3J0IGNvbnN0IE1PVU5UX1BPSU5UX1BSRUZJWCA9IFwiJCRcIjtcblxuLy8gZXhwb3J0IHR5cGUgTGF6eUNvbXBvbmVudCA9ICgpID0+IFByb21pc2U8eyBkZWZhdWx0OiBDb21wb25lbnRUeXBlPGFueT4gfT47XG5leHBvcnQgdHlwZSBSZWdpc3RyeUVudHJ5ID0gQ29tcG9uZW50VHlwZTxhbnk+O1xuZXhwb3J0IHR5cGUgQ29tcG9uZW50UmVnaXN0cnkgPSBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRUeXBlPGFueT4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFZET01FbGVtZW50IHtcbiAgdGFnOiBzdHJpbmc7XG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgY2hpbGRyZW4/OiBWRE9NTm9kZVtdO1xuICBrZXk/OiBzdHJpbmc7XG4gIGxhenk/OiBib29sZWFuO1xufVxuXG4vLyBQcmltaXRpdmUgbm9kZXMgdGhhdCBjYW4gYmUgcmVuZGVyZWRcbmV4cG9ydCB0eXBlIFByaW1pdGl2ZU5vZGUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG4vLyBWRE9NTm9kZSBpcyBlaXRoZXIgYSBwcmltaXRpdmUgKHN0cmluZywgbnVtYmVyLCBib29sZWFuKSBvciBhbiBlbGVtZW50IG5vZGUuXG4vLyBCb29sZWFucyBhcmUgdmFsaWQgY2hpbGRyZW4gaW4gUmVhY3QgYnV0IGRvIG5vdCByZW5kZXIgYW55dGhpbmcuXG4vLyBNb3VudCBwb2ludHMgYXJlIGp1c3QgVUlFbGVtZW50Tm9kZXMgd2l0aCB0YWdzIHN0YXJ0aW5nIHdpdGggJCRDb21wb25lbnRLZXlcbmV4cG9ydCB0eXBlIFZET01Ob2RlID0gUHJpbWl0aXZlTm9kZSB8IFZET01FbGVtZW50O1xuXG5leHBvcnQgdHlwZSBWRE9NID0gVkRPTU5vZGU7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZVR5cGUgPVxuICB8IFwiaW5zZXJ0XCJcbiAgfCBcInJlbW92ZVwiXG4gIHwgXCJyZXBsYWNlXCJcbiAgfCBcInVwZGF0ZV9wcm9wc1wiXG4gIHwgXCJtb3ZlXCJcbiAgfCBcInVwZGF0ZV9jYWxsYmFja3NcIlxuICB8IFwidXBkYXRlX3JlbmRlcl9wcm9wc1wiXG4gIHwgXCJ1cGRhdGVfY3NzX3JlZnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFVwZGF0ZVR5cGU7XG4gIHBhdGg6IHN0cmluZzsgLy8gRG90LXNlcGFyYXRlZCBwYXRoIHRvIHRoZSBub2RlXG4gIGRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0VXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcImluc2VydFwiO1xuICBkYXRhOiBWRE9NTm9kZTsgLy8gVGhlIG5vZGUgdG8gaW5zZXJ0XG4gIGlkeDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZVVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJyZW1vdmVcIjtcbiAgaWR4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZVVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJyZXBsYWNlXCI7XG4gIGRhdGE6IFZET01Ob2RlOyAvLyBUaGUgbmV3IG5vZGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVQcm9wc1VwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJ1cGRhdGVfcHJvcHNcIjtcbiAgZGF0YToge1xuICAgIHNldD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgcmVtb3ZlPzogc3RyaW5nW107XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW92ZVVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJtb3ZlXCI7XG4gIGRhdGE6IHtcbiAgICBmcm9tX2luZGV4OiBudW1iZXI7XG4gICAgdG9faW5kZXg6IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVDYWxsYmFja3NVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX2NhbGxiYWNrc1wiO1xuICBkYXRhOiB7XG4gICAgYWRkPzogc3RyaW5nW107IC8vIGZ1bGwgY2FsbGJhY2sga2V5cyBsaWtlIFwiMC4xLm9uQ2xpY2tcIlxuICAgIHJlbW92ZT86IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVJlbmRlclByb3BzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9yZW5kZXJfcHJvcHNcIjtcbiAgZGF0YToge1xuICAgIGFkZD86IHN0cmluZ1tdOyAvLyByZW5kZXIgcHJvcCBrZXlzIGxpa2UgXCIwLjEubGVmdFNlY3Rpb25cIlxuICAgIHJlbW92ZT86IHN0cmluZ1tdO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNzc1JlZnNVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwidXBkYXRlX2Nzc19yZWZzXCI7XG4gIGRhdGE6IHtcbiAgICBzZXQ/OiBzdHJpbmdbXTtcbiAgICByZW1vdmU/OiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgVkRPTVVwZGF0ZSA9XG4gIHwgSW5zZXJ0VXBkYXRlXG4gIHwgUmVtb3ZlVXBkYXRlXG4gIHwgUmVwbGFjZVVwZGF0ZVxuICB8IFVwZGF0ZVByb3BzVXBkYXRlXG4gIHwgTW92ZVVwZGF0ZVxuICB8IFVwZGF0ZUNhbGxiYWNrc1VwZGF0ZVxuICB8IFVwZGF0ZVJlbmRlclByb3BzVXBkYXRlXG4gIHwgVXBkYXRlQ3NzUmVmc1VwZGF0ZTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgVUkgdHJlZSBzdHJ1Y3R1cmVcbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBWRE9NRWxlbWVudCB7XG4gIC8vIE1hdGNoZXMgYWxsIG5vbi10ZXh0IG5vZGVzXG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNb3VudFBvaW50Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgVkRPTUVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmXG4gICAgbm9kZSAhPT0gbnVsbCAmJlxuICAgIG5vZGUudGFnLnN0YXJ0c1dpdGgoTU9VTlRfUE9JTlRfUFJFRklYKSAmJlxuICAgIG5vZGUudGFnICE9PSBGUkFHTUVOVF9UQUdcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnJhZ21lbnQobm9kZTogVkRPTU5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmIG5vZGUgIT09IG51bGwgJiYgbm9kZS50YWcgPT09IEZSQUdNRU5UX1RBRztcbn1cbiIsCiAgICAiXG50eXBlIFNpbXBsaWZ5PFQ+ID0geyBbSyBpbiBrZXlvZiBUXTogVFtLXSB9ICYge307XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdD4oKSB7XG4gIGZ1bmN0aW9uIF9jcmVhdGVFeHRyYWN0b3I8XG4gICAgY29uc3QgSyBleHRlbmRzIHJlYWRvbmx5IChrZXlvZiBUKVtdLFxuICAgIEMgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDxLW251bWJlcl0gfCBzdHJpbmcsIChzcmM6IFQpID0+IGFueT4+LFxuICA+KGtleXM6IEssIGNvbXB1dGVkPzogQykge1xuICAgIHJldHVybiAoXG4gICAgICBzcmM6IFRcbiAgICApOiBTaW1wbGlmeTxcbiAgICAgIFBpY2s8VCwgS1tudW1iZXJdPiAmIHtcbiAgICAgICAgW1AgaW4ga2V5b2YgQ10tPzogQ1tQXSBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IGluZmVyIFIgPyBSIDogbmV2ZXI7XG4gICAgICB9XG4gICAgPiA9PiB7XG4gICAgICBjb25zdCBvdXQ6IGFueSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBvdXRba2V5IGFzIHN0cmluZ10gPSAoc3JjIGFzIGFueSlba2V5IGFzIHN0cmluZ107XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb25zdCBmbiA9IGNvbXB1dGVkW2tleV0hO1xuICAgICAgICAgIG91dFtrZXldID0gZm4oc3JjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9O1xuICB9XG4gIHJldHVybiBfY3JlYXRlRXh0cmFjdG9yO1xufSIsCiAgICAiaW1wb3J0IHsgY3JlYXRlRXh0cmFjdG9yIH0gZnJvbSBcIi4vZXh0cmFjdG9yXCI7XG5cbi8vIEJhc2UgZXh0cmFjdG9ycyAoY2FtZWxDYXNlKSBzaW1pbGFyIHRvIGV2ZW50cy50cyBzdHlsZVxuY29uc3QgbG93ZXJUYWdOYW1lID0gKGU6IEVsZW1lbnQpID0+IGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5jb25zdCBFTEVNRU5UX0tFWVMgPSBbXG4gIFwiaWRcIixcbiAgXCJjbGFzc05hbWVcIixcbiAgXCJ0YWdOYW1lXCIsXG4gIFwibG9jYWxOYW1lXCIsXG4gIFwiY2xpZW50SGVpZ2h0XCIsXG4gIFwiY2xpZW50TGVmdFwiLFxuICBcImNsaWVudFRvcFwiLFxuICBcImNsaWVudFdpZHRoXCIsXG4gIFwic2Nyb2xsSGVpZ2h0XCIsXG4gIFwic2Nyb2xsTGVmdFwiLFxuICBcInNjcm9sbFRvcFwiLFxuICBcInNjcm9sbFdpZHRoXCIsXG4gIFwic2xvdFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEVsZW1lbnQpW107XG5cbmNvbnN0IEhUTUxfT1JfU1ZHX0tFWVMgPSBbXG4gIFwiYXV0b2ZvY3VzXCIsXG4gIFwidGFiSW5kZXhcIixcbiAgXCJub25jZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPclNWR0VsZW1lbnQpW107XG5cbmNvbnN0IEhUTUxfRUxFTUVOVF9CQVNFX0tFWVMgPSBbXG4gIFwiYWNjZXNzS2V5XCIsXG4gIFwiYWNjZXNzS2V5TGFiZWxcIixcbiAgXCJhdXRvY2FwaXRhbGl6ZVwiLFxuICBcImRpclwiLFxuICBcImRyYWdnYWJsZVwiLFxuICBcImhpZGRlblwiLFxuICBcImluZXJ0XCIsXG4gIFwibGFuZ1wiLFxuICBcIm9mZnNldEhlaWdodFwiLFxuICBcIm9mZnNldExlZnRcIixcbiAgXCJvZmZzZXRUb3BcIixcbiAgXCJvZmZzZXRXaWR0aFwiLFxuICBcInBvcG92ZXJcIixcbiAgXCJzcGVsbGNoZWNrXCIsXG4gIFwidGl0bGVcIixcbiAgXCJ0cmFuc2xhdGVcIixcbiAgXCJ3cml0aW5nU3VnZ2VzdGlvbnNcIixcbiAgXCJjb250ZW50RWRpdGFibGVcIixcbiAgXCJlbnRlcktleUhpbnRcIixcbiAgXCJpc0NvbnRlbnRFZGl0YWJsZVwiLFxuICBcImlucHV0TW9kZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxFbGVtZW50KVtdO1xuXG5jb25zdCBleHRyYWN0RWxlbWVudCA9IGNyZWF0ZUV4dHJhY3RvcjxFbGVtZW50PigpKEVMRU1FTlRfS0VZUywge1xuICB0YWdOYW1lOiBsb3dlclRhZ05hbWUsXG59KTtcblxuY29uc3QgZXh0cmFjdEhUTUxPclNWR0VsZW1lbnQgPVxuICBjcmVhdGVFeHRyYWN0b3I8SFRNTE9yU1ZHRWxlbWVudD4oKShIVE1MX09SX1NWR19LRVlTKTtcblxuY29uc3QgZXh0cmFjdEhUTUxFbGVtZW50QmFzZU9ubHkgPSBjcmVhdGVFeHRyYWN0b3I8SFRNTEVsZW1lbnQ+KCkoXG4gIEhUTUxfRUxFTUVOVF9CQVNFX0tFWVNcbik7XG5cbmZ1bmN0aW9uIGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIC4uLmV4dHJhY3RFbGVtZW50KGVsdCksXG4gICAgLi4uZXh0cmFjdEhUTUxPclNWR0VsZW1lbnQoZWx0IGFzIEhUTUxPclNWR0VsZW1lbnQpLFxuICAgIC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2VPbmx5KGVsdCksXG4gIH07XG59XG5cbi8vIEhlbHBlciB0byBjb21wb3NlIHBlci1lbGVtZW50IGV4dHJhY3RvcnMgd2l0aCB0aGUgc2hhcmVkIGJhc2VcbmZ1bmN0aW9uIHdpdGhCYXNlPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oXG4gIGtleXM6IHJlYWRvbmx5IChrZXlvZiBUKVtdLFxuICBjb21wdXRlZD86IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgKHNyYzogVCkgPT4gYW55Pj5cbikge1xuICBjb25zdCBvbmx5ID0gY3JlYXRlRXh0cmFjdG9yPFQ+KCkoa2V5cywgY29tcHV0ZWQgYXMgYW55KTtcbiAgcmV0dXJuIChlbHQ6IFQpID0+ICh7IC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KSwgLi4ub25seShlbHQpIH0pO1xufVxuXG5jb25zdCBIVE1MX0FOQ0hPUl9LRVlTID0gW1xuICBcImhhc2hcIixcbiAgXCJob3N0XCIsXG4gIFwiaG9zdG5hbWVcIixcbiAgXCJocmVmXCIsXG4gIFwib3JpZ2luXCIsXG4gIFwicGFzc3dvcmRcIixcbiAgXCJwYXRobmFtZVwiLFxuICBcInBvcnRcIixcbiAgXCJwcm90b2NvbFwiLFxuICBcInNlYXJjaFwiLFxuICBcInRhcmdldFwiLFxuICBcImRvd25sb2FkXCIsXG4gIFwicmVsXCIsXG4gIFwiaHJlZmxhbmdcIixcbiAgXCJ0eXBlXCIsXG4gIFwidXNlcm5hbWVcIixcbiAgXCJwaW5nXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJ0ZXh0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEFuY2hvckVsZW1lbnQpW107XG5jb25zdCBhbmNob3JFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQW5jaG9yRWxlbWVudD4oSFRNTF9BTkNIT1JfS0VZUyk7XG5cbmNvbnN0IEhUTUxfQVJFQV9LRVlTID0gW1xuICBcImFsdFwiLFxuICBcImNvb3Jkc1wiLFxuICBcImRvd25sb2FkXCIsXG4gIFwiaGFzaFwiLFxuICBcImhvc3RcIixcbiAgXCJob3N0bmFtZVwiLFxuICBcImhyZWZcIixcbiAgXCJvcmlnaW5cIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInBhdGhuYW1lXCIsXG4gIFwicG9ydFwiLFxuICBcInByb3RvY29sXCIsXG4gIFwicmVsXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwic2hhcGVcIixcbiAgXCJ0YXJnZXRcIixcbiAgXCJ1c2VybmFtZVwiLFxuICBcInBpbmdcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxBcmVhRWxlbWVudClbXTtcbmNvbnN0IGFyZWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQXJlYUVsZW1lbnQ+KEhUTUxfQVJFQV9LRVlTKTtcblxuY29uc3QgSFRNTF9NRURJQV9LRVlTID0gW1xuICBcImF1dG9wbGF5XCIsXG4gIFwiY29udHJvbHNcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImN1cnJlbnRTcmNcIixcbiAgXCJjdXJyZW50VGltZVwiLFxuICBcImRlZmF1bHRNdXRlZFwiLFxuICBcImRlZmF1bHRQbGF5YmFja1JhdGVcIixcbiAgXCJkdXJhdGlvblwiLFxuICBcImVuZGVkXCIsXG4gIFwibG9vcFwiLFxuICBcIm11dGVkXCIsXG4gIFwibmV0d29ya1N0YXRlXCIsXG4gIFwicGF1c2VkXCIsXG4gIFwicGxheWJhY2tSYXRlXCIsXG4gIFwicHJlbG9hZFwiLFxuICBcInJlYWR5U3RhdGVcIixcbiAgXCJzZWVraW5nXCIsXG4gIFwic3JjXCIsXG4gIFwidm9sdW1lXCIsXG4gIFwicHJlc2VydmVzUGl0Y2hcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWVkaWFFbGVtZW50KVtdO1xuY29uc3QgbWVkaWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWVkaWFFbGVtZW50PihIVE1MX01FRElBX0tFWVMpO1xuXG5jb25zdCBhdWRpb0V4dHJhY3RvciA9IChlbHQ6IEhUTUxBdWRpb0VsZW1lbnQpID0+IG1lZGlhRXh0cmFjdG9yKGVsdCk7XG5cbmNvbnN0IEhUTUxfQlVUVE9OX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwiZm9ybUFjdGlvblwiLFxuICBcImZvcm1FbmN0eXBlXCIsXG4gIFwiZm9ybU1ldGhvZFwiLFxuICBcImZvcm1Ob1ZhbGlkYXRlXCIsXG4gIFwiZm9ybVRhcmdldFwiLFxuICBcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQnV0dG9uRWxlbWVudClbXTtcbmNvbnN0IGJ1dHRvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCdXR0b25FbGVtZW50PihIVE1MX0JVVFRPTl9LRVlTKTtcblxuY29uc3QgSFRNTF9EQVRBX0tFWVMgPSBbXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGF0YUVsZW1lbnQpW107XG5jb25zdCBkYXRhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERhdGFFbGVtZW50PihIVE1MX0RBVEFfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRU1CRURfS0VZUyA9IFtcbiAgXCJoZWlnaHRcIixcbiAgXCJzcmNcIixcbiAgXCJ0eXBlXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRW1iZWRFbGVtZW50KVtdO1xuY29uc3QgZW1iZWRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRW1iZWRFbGVtZW50PihIVE1MX0VNQkVEX0tFWVMpO1xuXG5jb25zdCBIVE1MX0ZJRUxEU0VUX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEZpZWxkU2V0RWxlbWVudClbXTtcbmNvbnN0IGZpZWxkc2V0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEZpZWxkU2V0RWxlbWVudD4oSFRNTF9GSUVMRFNFVF9LRVlTKTtcblxuY29uc3QgSFRNTF9GT1JNX0tFWVMgPSBbXG4gIFwiYWNjZXB0Q2hhcnNldFwiLFxuICBcImFjdGlvblwiLFxuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImVuY29kaW5nXCIsXG4gIFwiZW5jdHlwZVwiLFxuICBcImxlbmd0aFwiLFxuICBcIm1ldGhvZFwiLFxuICBcIm5hbWVcIixcbiAgXCJub1ZhbGlkYXRlXCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwicmVsXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEZvcm1FbGVtZW50KVtdO1xuY29uc3QgZm9ybUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxGb3JtRWxlbWVudD4oSFRNTF9GT1JNX0tFWVMpO1xuXG5jb25zdCBIVE1MX0lGUkFNRV9LRVlTID0gW1xuICBcImFsbG93XCIsXG4gIFwiYWxsb3dGdWxsc2NyZWVuXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwibmFtZVwiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwic3JjXCIsXG4gIFwic3JjZG9jXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImZyYW1lQm9yZGVyXCIsXG4gIFwibG9uZ0Rlc2NcIixcbiAgXCJtYXJnaW5IZWlnaHRcIixcbiAgXCJtYXJnaW5XaWR0aFwiLFxuICBcInNjcm9sbGluZ1wiLFxuICBcInNhbmRib3hcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSUZyYW1lRWxlbWVudClbXTtcbmNvbnN0IGlmcmFtZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxJRnJhbWVFbGVtZW50PihIVE1MX0lGUkFNRV9LRVlTKTtcblxuY29uc3QgSFRNTF9JTUFHRV9LRVlTID0gW1xuICBcImFsdFwiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGVjb2RpbmdcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJpc01hcFwiLFxuICBcImxvYWRpbmdcIixcbiAgXCJuYXR1cmFsSGVpZ2h0XCIsXG4gIFwibmF0dXJhbFdpZHRoXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJzaXplc1wiLFxuICBcInNyY1wiLFxuICBcInNyY3NldFwiLFxuICBcInVzZU1hcFwiLFxuICBcIndpZHRoXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJib3JkZXJcIixcbiAgXCJjb21wbGV0ZVwiLFxuICBcImhzcGFjZVwiLFxuICBcImxvbmdEZXNjXCIsXG4gIFwibG93c3JjXCIsXG4gIFwibmFtZVwiLFxuICBcInZzcGFjZVwiLFxuICBcInhcIixcbiAgXCJ5XCIsXG4gIFwiZmV0Y2hQcmlvcml0eVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxJbWFnZUVsZW1lbnQpW107XG5jb25zdCBpbWFnZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxJbWFnZUVsZW1lbnQ+KEhUTUxfSU1BR0VfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSU5QVVRfS0VZUyA9IFtcbiAgXCJhY2NlcHRcIixcbiAgXCJhbHRcIixcbiAgXCJhdXRvY29tcGxldGVcIixcbiAgXCJjaGVja2VkXCIsXG4gIFwiZGVmYXVsdENoZWNrZWRcIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJkaXJOYW1lXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJpbmRldGVybWluYXRlXCIsXG4gIFwibWF4XCIsXG4gIFwibWF4TGVuZ3RoXCIsXG4gIFwibWluXCIsXG4gIFwibWluTGVuZ3RoXCIsXG4gIFwibXVsdGlwbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicGF0dGVyblwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG4gIFwicmVhZE9ubHlcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcInNlbGVjdGlvbkRpcmVjdGlvblwiLFxuICBcInNlbGVjdGlvbkVuZFwiLFxuICBcInNlbGVjdGlvblN0YXJ0XCIsXG4gIFwic2l6ZVwiLFxuICBcInNyY1wiLFxuICBcInN0ZXBcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJ2YWx1ZUFzTnVtYmVyXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImNhcHR1cmVcIixcbiAgXCJmb3JtQWN0aW9uXCIsXG4gIFwiZm9ybUVuY3R5cGVcIixcbiAgXCJmb3JtTWV0aG9kXCIsXG4gIFwiZm9ybU5vVmFsaWRhdGVcIixcbiAgXCJmb3JtVGFyZ2V0XCIsXG4gIFwidXNlTWFwXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbiAgXCJwb3BvdmVyVGFyZ2V0QWN0aW9uXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTElucHV0RWxlbWVudClbXTtcbmNvbnN0IGlucHV0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTElucHV0RWxlbWVudD4oSFRNTF9JTlBVVF9LRVlTKTtcblxuY29uc3QgSFRNTF9MQUJFTF9LRVlTID0gW1xuICBcImh0bWxGb3JcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTGFiZWxFbGVtZW50KVtdO1xuY29uc3QgbGFiZWxFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTGFiZWxFbGVtZW50PihIVE1MX0xBQkVMX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xJX0tFWVMgPSBbXG4gIFwidmFsdWVcIixcbiAgXCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExJRWxlbWVudClbXTtcbmNvbnN0IGxpRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExJRWxlbWVudD4oSFRNTF9MSV9LRVlTKTtcblxuY29uc3QgSFRNTF9MSU5LX0tFWVMgPSBbXG4gIFwiYXNcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwiZmV0Y2hQcmlvcml0eVwiLFxuICBcImhyZWZcIixcbiAgXCJocmVmbGFuZ1wiLFxuICBcImltYWdlU2l6ZXNcIixcbiAgXCJpbWFnZVNyY3NldFwiLFxuICBcImludGVncml0eVwiLFxuICBcIm1lZGlhXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJyZWxcIixcbiAgXCJ0eXBlXCIsXG4gIFwiY2hhcnNldFwiLFxuICBcInJldlwiLFxuICBcInRhcmdldFwiLFxuICBcInNpemVzXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExpbmtFbGVtZW50KVtdO1xuY29uc3QgbGlua0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxMaW5rRWxlbWVudD4oSFRNTF9MSU5LX0tFWVMpO1xuXG5jb25zdCBIVE1MX01BUF9LRVlTID0gW1xuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWFwRWxlbWVudClbXTtcbmNvbnN0IG1hcEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNYXBFbGVtZW50PihIVE1MX01BUF9LRVlTKTtcblxuY29uc3QgSFRNTF9NRVRFUl9LRVlTID0gW1xuICBcImhpZ2hcIixcbiAgXCJsb3dcIixcbiAgXCJtYXhcIixcbiAgXCJtaW5cIixcbiAgXCJvcHRpbXVtXCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWV0ZXJFbGVtZW50KVtdO1xuY29uc3QgbWV0ZXJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWV0ZXJFbGVtZW50PihIVE1MX01FVEVSX0tFWVMpO1xuXG5jb25zdCBIVE1MX01PRF9LRVlTID0gW1xuICBcImNpdGVcIixcbiAgXCJkYXRlVGltZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNb2RFbGVtZW50KVtdO1xuY29uc3QgbW9kRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1vZEVsZW1lbnQ+KEhUTUxfTU9EX0tFWVMpO1xuXG5jb25zdCBIVE1MX09MX0tFWVMgPSBbXG4gIFwicmV2ZXJzZWRcIixcbiAgXCJzdGFydFwiLFxuICBcInR5cGVcIixcbiAgXCJjb21wYWN0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9MaXN0RWxlbWVudClbXTtcbmNvbnN0IG9saXN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9MaXN0RWxlbWVudD4oSFRNTF9PTF9LRVlTKTtcblxuY29uc3QgSFRNTF9PQkpFQ1RfS0VZUyA9IFtcbiAgXCJkYXRhXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwibmFtZVwiLFxuICBcInR5cGVcIixcbiAgXCJ1c2VNYXBcIixcbiAgXCJ3aWR0aFwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJhcmNoaXZlXCIsXG4gIFwiYm9yZGVyXCIsXG4gIFwiY29kZVwiLFxuICBcImNvZGVCYXNlXCIsXG4gIFwiY29kZVR5cGVcIixcbiAgXCJkZWNsYXJlXCIsXG4gIFwiaHNwYWNlXCIsXG4gIFwic3RhbmRieVwiLFxuICBcInZzcGFjZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPYmplY3RFbGVtZW50KVtdO1xuY29uc3Qgb2JqZWN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9iamVjdEVsZW1lbnQ+KEhUTUxfT0JKRUNUX0tFWVMpO1xuXG5jb25zdCBIVE1MX09QVEdST1VQX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJsYWJlbFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPcHRHcm91cEVsZW1lbnQpW107XG5jb25zdCBvcHRncm91cEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPcHRHcm91cEVsZW1lbnQ+KEhUTUxfT1BUR1JPVVBfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT1BUSU9OX0tFWVMgPSBbXG4gIFwiZGVmYXVsdFNlbGVjdGVkXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJpbmRleFwiLFxuICBcImxhYmVsXCIsXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3B0aW9uRWxlbWVudClbXTtcbmNvbnN0IG9wdGlvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPcHRpb25FbGVtZW50PihIVE1MX09QVElPTl9LRVlTKTtcblxuY29uc3QgSFRNTF9PVVRQVVRfS0VZUyA9IFtcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwiaHRtbEZvclwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE91dHB1dEVsZW1lbnQpW107XG5jb25zdCBvdXRwdXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT3V0cHV0RWxlbWVudD4oSFRNTF9PVVRQVVRfS0VZUyk7XG5cbmNvbnN0IEhUTUxfUFJPR1JFU1NfS0VZUyA9IFtcbiAgXCJtYXhcIixcbiAgXCJwb3NpdGlvblwiLFxuICBcInZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFByb2dyZXNzRWxlbWVudClbXTtcbmNvbnN0IHByb2dyZXNzRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFByb2dyZXNzRWxlbWVudD4oSFRNTF9QUk9HUkVTU19LRVlTKTtcblxuY29uc3QgSFRNTF9RVU9URV9LRVlTID0gW1xuICBcImNpdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUXVvdGVFbGVtZW50KVtdO1xuY29uc3QgcXVvdGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUXVvdGVFbGVtZW50PihIVE1MX1FVT1RFX0tFWVMpO1xuXG5jb25zdCBjaXRlRXh0cmFjdG9yID0gKGVsdDogSFRNTEVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9TQ1JJUFRfS0VZUyA9IFtcbiAgXCJhc3luY1wiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGVmZXJcIixcbiAgXCJmZXRjaFByaW9yaXR5XCIsXG4gIFwiaW50ZWdyaXR5XCIsXG4gIFwibm9Nb2R1bGVcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInNyY1wiLFxuICBcInRleHRcIixcbiAgXCJ0eXBlXCIsXG4gIFwiY2hhcnNldFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTY3JpcHRFbGVtZW50KVtdO1xuY29uc3QgZXh0cmFjdEhUTUxTY3JpcHRPbmx5ID0gY3JlYXRlRXh0cmFjdG9yPEhUTUxTY3JpcHRFbGVtZW50PigpKFxuICBIVE1MX1NDUklQVF9LRVlTLFxuICB7XG4gICAgZXZlbnQ6IChzKSA9PiAocyBhcyBhbnkpLmV2ZW50LFxuICAgIGh0bWxGb3I6IChzKSA9PiAocyBhcyBhbnkpLmh0bWxGb3IsXG4gIH1cbik7XG5jb25zdCBzY3JpcHRFeHRyYWN0b3IgPSAoZWx0OiBIVE1MU2NyaXB0RWxlbWVudCkgPT4gKHtcbiAgLi4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpLFxuICAuLi5leHRyYWN0SFRNTFNjcmlwdE9ubHkoZWx0KSxcbn0pO1xuXG5jb25zdCBIVE1MX1NFTEVDVF9LRVlTID0gW1xuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwibGVuZ3RoXCIsXG4gIFwibXVsdGlwbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJzZWxlY3RlZEluZGV4XCIsXG4gIFwic2l6ZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWx1ZVwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNlbGVjdEVsZW1lbnQpW107XG5jb25zdCBzZWxlY3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU2VsZWN0RWxlbWVudD4oSFRNTF9TRUxFQ1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfU0xPVF9LRVlTID0gW1xuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU2xvdEVsZW1lbnQpW107XG5jb25zdCBzbG90RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFNsb3RFbGVtZW50PihIVE1MX1NMT1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfU09VUkNFX0tFWVMgPSBbXG4gIFwiaGVpZ2h0XCIsXG4gIFwibWVkaWFcIixcbiAgXCJzaXplc1wiLFxuICBcInNyY1wiLFxuICBcInNyY3NldFwiLFxuICBcInR5cGVcIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTb3VyY2VFbGVtZW50KVtdO1xuY29uc3Qgc291cmNlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFNvdXJjZUVsZW1lbnQ+KEhUTUxfU09VUkNFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NBUFRJT05fS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KVtdO1xuY29uc3QgdGFibGVDYXB0aW9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ+KFxuICBIVE1MX1RBQkxFX0NBUFRJT05fS0VZU1xuKTtcblxuY29uc3QgSFRNTF9UQUJMRV9DRUxMX0tFWVMgPSBbXG4gIFwiYWJiclwiLFxuICBcImNlbGxJbmRleFwiLFxuICBcImNvbFNwYW5cIixcbiAgXCJoZWFkZXJzXCIsXG4gIFwicm93U3BhblwiLFxuICBcInNjb3BlXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJheGlzXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJub1dyYXBcIixcbiAgXCJ2QWxpZ25cIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNlbGxFbGVtZW50KVtdO1xuY29uc3QgdGFibGVDZWxsRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KEhUTUxfVEFCTEVfQ0VMTF9LRVlTKTtcblxuY29uc3QgSFRNTF9UQUJMRV9DT0xfS0VZUyA9IFtcbiAgXCJzcGFuXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJjaFwiLFxuICBcImNoT2ZmXCIsXG4gIFwidkFsaWduXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVDb2xFbGVtZW50KVtdO1xuY29uc3QgdGFibGVDb2xFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDb2xFbGVtZW50PihIVE1MX1RBQkxFX0NPTF9LRVlTKTtcblxuY29uc3QgSFRNTF9UQUJMRV9LRVlTID0gW1xuICBcImFsaWduXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImJvcmRlclwiLFxuICBcImNlbGxQYWRkaW5nXCIsXG4gIFwiY2VsbFNwYWNpbmdcIixcbiAgXCJmcmFtZVwiLFxuICBcInJ1bGVzXCIsXG4gIFwic3VtbWFyeVwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlRWxlbWVudD4oSFRNTF9UQUJMRV9LRVlTKTtcblxuY29uc3QgSFRNTF9UUl9LRVlTID0gW1xuICBcInJvd0luZGV4XCIsXG4gIFwic2VjdGlvblJvd0luZGV4XCIsXG4gIFwiYWxpZ25cIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcInZBbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpW107XG5jb25zdCB0YWJsZVJvd0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZVJvd0VsZW1lbnQ+KEhUTUxfVFJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVFNFQ1RJT05fS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJ2QWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlU2VjdGlvbkV4dHJhY3RvciA9XG4gIHdpdGhCYXNlPEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50PihIVE1MX1RTRUNUSU9OX0tFWVMpO1xuXG5jb25zdCB0ZW1wbGF0ZUV4dHJhY3RvciA9IChlbHQ6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpID0+XG4gIGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9URVhUQVJFQV9LRVlTID0gW1xuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImNvbHNcIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJkaXJOYW1lXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJtYXhMZW5ndGhcIixcbiAgXCJtaW5MZW5ndGhcIixcbiAgXCJuYW1lXCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJyZWFkT25seVwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwicm93c1wiLFxuICBcInNlbGVjdGlvbkRpcmVjdGlvblwiLFxuICBcInNlbGVjdGlvbkVuZFwiLFxuICBcInNlbGVjdGlvblN0YXJ0XCIsXG4gIFwidmFsdWVcIixcbiAgXCJ3cmFwXCIsXG4gIFwidGV4dExlbmd0aFwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRleHRBcmVhRWxlbWVudClbXTtcbmNvbnN0IHRleHRhcmVhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRleHRBcmVhRWxlbWVudD4oSFRNTF9URVhUQVJFQV9LRVlTKTtcblxuY29uc3QgSFRNTF9USU1FX0tFWVMgPSBbXG4gIFwiZGF0ZVRpbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGltZUVsZW1lbnQpW107XG5jb25zdCB0aW1lRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRpbWVFbGVtZW50PihIVE1MX1RJTUVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVFJBQ0tfS0VZUyA9IFtcbiAgXCJkZWZhdWx0XCIsXG4gIFwia2luZFwiLFxuICBcImxhYmVsXCIsXG4gIFwicmVhZHlTdGF0ZVwiLFxuICBcInNyY1wiLFxuICBcInNyY2xhbmdcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVHJhY2tFbGVtZW50KVtdO1xuY29uc3QgdHJhY2tFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVHJhY2tFbGVtZW50PihIVE1MX1RSQUNLX0tFWVMpO1xuXG5jb25zdCBIVE1MX1ZJREVPX0tFWVMgPSBbXG4gIFwiaGVpZ2h0XCIsXG4gIFwicG9zdGVyXCIsXG4gIFwidmlkZW9IZWlnaHRcIixcbiAgXCJ2aWRlb1dpZHRoXCIsXG4gIFwid2lkdGhcIixcbiAgXCJwbGF5c0lubGluZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxWaWRlb0VsZW1lbnQpW107XG5jb25zdCBleHRyYWN0SFRNTFZpZGVvT25seSA9XG4gIGNyZWF0ZUV4dHJhY3RvcjxIVE1MVmlkZW9FbGVtZW50PigpKEhUTUxfVklERU9fS0VZUyk7XG5jb25zdCB2aWRlb0V4dHJhY3RvciA9IChlbHQ6IEhUTUxWaWRlb0VsZW1lbnQpID0+ICh7XG4gIC4uLm1lZGlhRXh0cmFjdG9yKGVsdCksXG4gIC4uLmV4dHJhY3RIVE1MVmlkZW9Pbmx5KGVsdCksXG59KTtcblxuY29uc3QgSFRNTF9CUl9LRVlTID0gW1xuICBcImNsZWFyXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJSRWxlbWVudClbXTtcbmNvbnN0IGJyRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJSRWxlbWVudD4oSFRNTF9CUl9LRVlTKTtcblxuY29uc3QgSFRNTF9CQVNFX0tFWVMgPSBbXG4gIFwiaHJlZlwiLFxuICBcInRhcmdldFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCYXNlRWxlbWVudClbXTtcbmNvbnN0IGJhc2VFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQmFzZUVsZW1lbnQ+KEhUTUxfQkFTRV9LRVlTKTtcblxuY29uc3QgSFRNTF9CT0RZX0tFWVMgPSBbXG4gIFwiYUxpbmtcIixcbiAgXCJiYWNrZ3JvdW5kXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImxpbmtcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidkxpbmtcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQm9keUVsZW1lbnQpW107XG5jb25zdCBib2R5RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJvZHlFbGVtZW50PihIVE1MX0JPRFlfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRExJU1RfS0VZUyA9IFtcbiAgXCJjb21wYWN0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERMaXN0RWxlbWVudClbXTtcbmNvbnN0IGRsaXN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERMaXN0RWxlbWVudD4oSFRNTF9ETElTVF9LRVlTKTtcblxuY29uc3QgSFRNTF9ERVRBSUxTX0tFWVMgPSBbXG4gIFwib3BlblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEZXRhaWxzRWxlbWVudClbXTtcbmNvbnN0IGRldGFpbHNFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGV0YWlsc0VsZW1lbnQ+KEhUTUxfREVUQUlMU19LRVlTKTtcblxuY29uc3QgSFRNTF9ESUFMT0dfS0VZUyA9IFtcbiAgXCJvcGVuXCIsXG4gIFwicmV0dXJuVmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGlhbG9nRWxlbWVudClbXTtcbmNvbnN0IGRpYWxvZ0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEaWFsb2dFbGVtZW50PihIVE1MX0RJQUxPR19LRVlTKTtcblxuY29uc3QgSFRNTF9ESVZfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEaXZFbGVtZW50KVtdO1xuY29uc3QgZGl2RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERpdkVsZW1lbnQ+KEhUTUxfRElWX0tFWVMpO1xuXG5jb25zdCBoZWFkRXh0cmFjdG9yID0gKGVsdDogSFRNTEhlYWRFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfSEVBRElOR19LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEhlYWRpbmdFbGVtZW50KVtdO1xuY29uc3QgaGVhZGluZ0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIZWFkaW5nRWxlbWVudD4oSFRNTF9IRUFESU5HX0tFWVMpO1xuXG5jb25zdCBIVE1MX0hSX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbiAgXCJjb2xvclwiLFxuICBcIm5vU2hhZGVcIixcbiAgXCJzaXplXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSFJFbGVtZW50KVtdO1xuY29uc3QgaHJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSFJFbGVtZW50PihIVE1MX0hSX0tFWVMpO1xuXG5jb25zdCBIVE1MX0hUTUxfS0VZUyA9IFtcbiAgXCJ2ZXJzaW9uXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEh0bWxFbGVtZW50KVtdO1xuY29uc3QgaHRtbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIdG1sRWxlbWVudD4oSFRNTF9IVE1MX0tFWVMpO1xuXG5jb25zdCBtZW51RXh0cmFjdG9yID0gKGVsdDogSFRNTE1lbnVFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfTUVUQV9LRVlTID0gW1xuICBcImNvbnRlbnRcIixcbiAgXCJodHRwRXF1aXZcIixcbiAgXCJuYW1lXCIsXG4gIFwic2NoZW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1ldGFFbGVtZW50KVtdO1xuY29uc3QgbWV0YUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZXRhRWxlbWVudD4oSFRNTF9NRVRBX0tFWVMpO1xuXG5jb25zdCBIVE1MX1BfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxQYXJhZ3JhcGhFbGVtZW50KVtdO1xuY29uc3QgcGFyYWdyYXBoRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFBhcmFncmFwaEVsZW1lbnQ+KEhUTUxfUF9LRVlTKTtcblxuY29uc3QgcGljdHVyZUV4dHJhY3RvciA9IChlbHQ6IEhUTUxQaWN0dXJlRWxlbWVudCkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1BSRV9LRVlTID0gW1xuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFByZUVsZW1lbnQpW107XG5jb25zdCBwcmVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUHJlRWxlbWVudD4oSFRNTF9QUkVfS0VZUyk7XG5cbmNvbnN0IHNwYW5FeHRyYWN0b3IgPSAoZWx0OiBIVE1MU3BhbkVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9TVFlMRV9LRVlTID0gW1xuICBcIm1lZGlhXCIsXG4gIFwidHlwZVwiLFxuICBcImRpc2FibGVkXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFN0eWxlRWxlbWVudClbXTtcbmNvbnN0IHN0eWxlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFN0eWxlRWxlbWVudD4oSFRNTF9TVFlMRV9LRVlTKTtcblxuY29uc3QgSFRNTF9USVRMRV9LRVlTID0gW1xuICBcInRleHRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGl0bGVFbGVtZW50KVtdO1xuY29uc3QgdGl0bGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGl0bGVFbGVtZW50PihIVE1MX1RJVExFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1VMX0tFWVMgPSBbXG4gIFwiY29tcGFjdFwiLFxuICBcInR5cGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVUxpc3RFbGVtZW50KVtdO1xuY29uc3QgdWxpc3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVUxpc3RFbGVtZW50PihIVE1MX1VMX0tFWVMpO1xuXG4vLyBNYXAgb2YgdGFnTmFtZSAtPiBleHRyYWN0b3IgKGNvbmNpc2UsIGxpa2UgZXZlbnRzLnRzKVxuY29uc3QgZWxlbWVudEV4dHJhY3RvcnM6IFJlY29yZDxzdHJpbmcsIChlbHQ6IGFueSkgPT4gb2JqZWN0PiA9IHtcbiAgQTogYW5jaG9yRXh0cmFjdG9yLFxuICBBUkVBOiBhcmVhRXh0cmFjdG9yLFxuICBBVURJTzogYXVkaW9FeHRyYWN0b3IsXG4gIEJBU0U6IGJhc2VFeHRyYWN0b3IsXG4gIEJMT0NLUVVPVEU6IHF1b3RlRXh0cmFjdG9yLFxuICBROiBxdW90ZUV4dHJhY3RvcixcbiAgQk9EWTogYm9keUV4dHJhY3RvcixcbiAgQlI6IGJyRXh0cmFjdG9yLFxuICBCVVRUT046IGJ1dHRvbkV4dHJhY3RvcixcbiAgQ0FOVkFTOiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlLFxuICBDQVBUSU9OOiB0YWJsZUNhcHRpb25FeHRyYWN0b3IsXG4gIENJVEU6IGNpdGVFeHRyYWN0b3IsXG4gIENPTDogdGFibGVDb2xFeHRyYWN0b3IsXG4gIENPTEdST1VQOiB0YWJsZUNvbEV4dHJhY3RvcixcbiAgREFUQTogZGF0YUV4dHJhY3RvcixcbiAgREVUQUlMUzogZGV0YWlsc0V4dHJhY3RvcixcbiAgRElBTE9HOiBkaWFsb2dFeHRyYWN0b3IsXG4gIERJVjogZGl2RXh0cmFjdG9yLFxuICBETDogZGxpc3RFeHRyYWN0b3IsXG4gIEVNQkVEOiBlbWJlZEV4dHJhY3RvcixcbiAgRklFTERTRVQ6IGZpZWxkc2V0RXh0cmFjdG9yLFxuICBGT1JNOiBmb3JtRXh0cmFjdG9yLFxuICBIMTogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDI6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEgzOiBoZWFkaW5nRXh0cmFjdG9yLFxuICBINDogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDU6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEg2OiBoZWFkaW5nRXh0cmFjdG9yLFxuICBIRUFEOiBoZWFkRXh0cmFjdG9yLFxuICBIUjogaHJFeHRyYWN0b3IsXG4gIEhUTUw6IGh0bWxFeHRyYWN0b3IsXG4gIElGUkFNRTogaWZyYW1lRXh0cmFjdG9yLFxuICBJTUc6IGltYWdlRXh0cmFjdG9yLFxuICBJTlBVVDogaW5wdXRFeHRyYWN0b3IsXG4gIExBQkVMOiBsYWJlbEV4dHJhY3RvcixcbiAgTEk6IGxpRXh0cmFjdG9yLFxuICBMSU5LOiBsaW5rRXh0cmFjdG9yLFxuICBNQVA6IG1hcEV4dHJhY3RvcixcbiAgTUVOVTogbWVudUV4dHJhY3RvcixcbiAgTUVUQTogbWV0YUV4dHJhY3RvcixcbiAgTUVURVI6IG1ldGVyRXh0cmFjdG9yLFxuICBJTlM6IG1vZEV4dHJhY3RvcixcbiAgREVMOiBtb2RFeHRyYWN0b3IsXG4gIE9CSkVDVDogb2JqZWN0RXh0cmFjdG9yLFxuICBPTDogb2xpc3RFeHRyYWN0b3IsXG4gIE9QVEdST1VQOiBvcHRncm91cEV4dHJhY3RvcixcbiAgT1BUSU9OOiBvcHRpb25FeHRyYWN0b3IsXG4gIE9VVFBVVDogb3V0cHV0RXh0cmFjdG9yLFxuICBQOiBwYXJhZ3JhcGhFeHRyYWN0b3IsXG4gIFBJQ1RVUkU6IHBpY3R1cmVFeHRyYWN0b3IsXG4gIFBSRTogcHJlRXh0cmFjdG9yLFxuICBQUk9HUkVTUzogcHJvZ3Jlc3NFeHRyYWN0b3IsXG4gIFNDUklQVDogc2NyaXB0RXh0cmFjdG9yLFxuICBTRUxFQ1Q6IHNlbGVjdEV4dHJhY3RvcixcbiAgU0xPVDogc2xvdEV4dHJhY3RvcixcbiAgU09VUkNFOiBzb3VyY2VFeHRyYWN0b3IsXG4gIFNQQU46IHNwYW5FeHRyYWN0b3IsXG4gIFNUWUxFOiBzdHlsZUV4dHJhY3RvcixcbiAgVEFCTEU6IHRhYmxlRXh0cmFjdG9yLFxuICBUQk9EWTogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBUSEVBRDogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBURk9PVDogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBURDogdGFibGVDZWxsRXh0cmFjdG9yLFxuICBUSDogdGFibGVDZWxsRXh0cmFjdG9yLFxuICBURU1QTEFURTogdGVtcGxhdGVFeHRyYWN0b3IsXG4gIFRFWFRBUkVBOiB0ZXh0YXJlYUV4dHJhY3RvcixcbiAgVElNRTogdGltZUV4dHJhY3RvcixcbiAgVElUTEU6IHRpdGxlRXh0cmFjdG9yLFxuICBUUjogdGFibGVSb3dFeHRyYWN0b3IsXG4gIFRSQUNLOiB0cmFja0V4dHJhY3RvcixcbiAgVUw6IHVsaXN0RXh0cmFjdG9yLFxuICBWSURFTzogdmlkZW9FeHRyYWN0b3IsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEhUTUxFbGVtZW50KGVsdDogSFRNTEVsZW1lbnQpOiBvYmplY3Qge1xuICBjb25zdCB0YWdOYW1lID0gZWx0LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCBleHRyYWN0b3IgPSBlbGVtZW50RXh0cmFjdG9yc1t0YWdOYW1lXTtcbiAgaWYgKGV4dHJhY3Rvcikge1xuICAgIHJldHVybiBleHRyYWN0b3IoZWx0KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVuZXhwZWN0ZWQgSFRNTCBlbGVtZW50IHRhZzogJHtlbHQudGFnTmFtZX0gKHVwZGF0ZSAud2ViL2N1c3RvbS9zZXJpYWxpemUudHMpYFxuICApO1xufVxuIiwKICAgICIvKiA9PT0gSU1QT1JUQU5UID09PSAqL1xuXG5pbXBvcnQgeyBleHRyYWN0SFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlRXh0cmFjdG9yIH0gZnJvbSBcIi4vZXh0cmFjdG9yXCI7XG5cbi8vIFJldXNhYmxlIGNvbXB1dGVkIG1hcHBlcnMgKGhlbHBzIGJ1bmRsZXJzL21pbmlmaWVycyBzaGFyZSByZWZlcmVuY2VzKVxuY29uc3QgbWFwVGFyZ2V0ID0gKGU6IHsgdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgfSkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50KGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbmNvbnN0IG1hcFJlbGF0ZWQgPSAoZTogeyByZWxhdGVkVGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgfSkgPT5cbiAgZS5yZWxhdGVkVGFyZ2V0ID8gZXh0cmFjdEhUTUxFbGVtZW50KGUucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCkgOiBudWxsO1xuXG5mdW5jdGlvbiBtYWtlRXh0cmFjdG9yPEsgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4oXG4gIGtleXM6IEssXG4gIGNvbXB1dGVkPzogUmVjb3JkPHN0cmluZywgKGV2dDogYW55KSA9PiBhbnk+XG4pIHtcbiAgcmV0dXJuIGNyZWF0ZUV4dHJhY3Rvcjxhbnk+KCkoXG4gICAga2V5cyBhcyBhbnksXG4gICAge1xuICAgICAgdGFyZ2V0OiBtYXBUYXJnZXQsXG4gICAgICAuLi4oY29tcHV0ZWQgfHwge30pLFxuICAgIH0gYXMgYW55XG4gICk7XG59XG5cbmNvbnN0IFNZTlRIRVRJQ19LRVlTID0gW1xuICBcInRhcmdldFwiLFxuICBcImJ1YmJsZXNcIixcbiAgXCJjYW5jZWxhYmxlXCIsXG4gIFwiZGVmYXVsdFByZXZlbnRlZFwiLFxuICBcImV2ZW50UGhhc2VcIixcbiAgXCJpc1RydXN0ZWRcIixcbiAgXCJ0aW1lU3RhbXBcIixcbiAgXCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuU3ludGhldGljRXZlbnQpW107XG5cbmNvbnN0IFVJX0tFWVMgPSBbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImRldGFpbFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0LlVJRXZlbnQpW107XG5cbmNvbnN0IE1PVVNFX0tFWVMgPSBbXG4gIC4uLlVJX0tFWVMsXG4gIFwiYWx0S2V5XCIsXG4gIFwiYnV0dG9uXCIsXG4gIFwiYnV0dG9uc1wiLFxuICBcImNsaWVudFhcIixcbiAgXCJjbGllbnRZXCIsXG4gIFwiY3RybEtleVwiLFxuICBcIm1ldGFLZXlcIixcbiAgXCJtb3ZlbWVudFhcIixcbiAgXCJtb3ZlbWVudFlcIixcbiAgXCJwYWdlWFwiLFxuICBcInBhZ2VZXCIsXG4gIFwic2NyZWVuWFwiLFxuICBcInNjcmVlbllcIixcbiAgXCJzaGlmdEtleVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0Lk1vdXNlRXZlbnQpW107XG5cbmNvbnN0IFBPSU5URVJfS0VZUyA9IFtcbiAgLi4uTU9VU0VfS0VZUyxcbiAgXCJwb2ludGVySWRcIixcbiAgXCJwcmVzc3VyZVwiLFxuICBcInRhbmdlbnRpYWxQcmVzc3VyZVwiLFxuICBcInRpbHRYXCIsXG4gIFwidGlsdFlcIixcbiAgXCJ0d2lzdFwiLFxuICBcIndpZHRoXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwicG9pbnRlclR5cGVcIixcbiAgXCJpc1ByaW1hcnlcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBSZWFjdC5Qb2ludGVyRXZlbnQpW107XG5cbmNvbnN0IHN5bnRoZXRpY0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCB1aUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoVUlfS0VZUyk7XG5cbmNvbnN0IG1vdXNlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihNT1VTRV9LRVlTLCB7IHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQgfSk7XG5cbmNvbnN0IGNsaXBib2FyZEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMsIHtcbiAgY2xpcGJvYXJkRGF0YTogKGUpID0+IGV4dHJhY3REYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKSxcbn0pO1xuXG5jb25zdCBjb21wb3NpdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJkYXRhXCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgZHJhZ0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoTU9VU0VfS0VZUywge1xuICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxuICBkYXRhVHJhbnNmZXI6IChlKSA9PiBleHRyYWN0RGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKSxcbn0pO1xuXG5jb25zdCBwb2ludGVyRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihQT0lOVEVSX0tFWVMsIHtcbiAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbn0pO1xuXG5jb25zdCBmb2N1c0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMsIHtcbiAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbn0pO1xuXG5jb25zdCBmb3JtRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGludmFsaWRFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3QgY2hhbmdlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGtleWJvYXJkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlVJX0tFWVMsXG4gIFwiYWx0S2V5XCIsXG4gIFwiY3RybEtleVwiLFxuICBcImNvZGVcIixcbiAgXCJrZXlcIixcbiAgXCJsb2NhbGVcIixcbiAgXCJsb2NhdGlvblwiLFxuICBcIm1ldGFLZXlcIixcbiAgXCJyZXBlYXRcIixcbiAgXCJzaGlmdEtleVwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRvdWNoRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihcbiAgW1xuICAgIC4uLlVJX0tFWVMsXG4gICAgXCJhbHRLZXlcIixcbiAgICBcImN0cmxLZXlcIixcbiAgICBcIm1ldGFLZXlcIixcbiAgICBcInNoaWZ0S2V5XCIsXG4gICAgXCJjaGFuZ2VkVG91Y2hlc1wiLFxuICAgIFwidGFyZ2V0VG91Y2hlc1wiLFxuICAgIFwidG91Y2hlc1wiLFxuICBdIGFzIGNvbnN0LFxuICB7XG4gICAgY2hhbmdlZFRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS5jaGFuZ2VkVG91Y2hlcyksXG4gICAgdGFyZ2V0VG91Y2hlczogKGUpID0+IG1hcFRvdWNoTGlzdChlLnRhcmdldFRvdWNoZXMpLFxuICAgIHRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS50b3VjaGVzKSxcbiAgfVxuKTtcblxuY29uc3Qgd2hlZWxFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFxuICBbLi4uTU9VU0VfS0VZUywgXCJkZWx0YU1vZGVcIiwgXCJkZWx0YVhcIiwgXCJkZWx0YVlcIiwgXCJkZWx0YVpcIl0gYXMgY29uc3QsXG4gIHtcbiAgICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxuICB9XG4pO1xuXG5jb25zdCBhbmltYXRpb25FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwiYW5pbWF0aW9uTmFtZVwiLFxuICBcImVsYXBzZWRUaW1lXCIsXG4gIFwicHNldWRvRWxlbWVudFwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRvZ2dsZUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJvbGRTdGF0ZVwiLFxuICBcIm5ld1N0YXRlXCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgdHJhbnNpdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJlbGFwc2VkVGltZVwiLFxuICBcInByb3BlcnR5TmFtZVwiLFxuICBcInBzZXVkb0VsZW1lbnRcIixcbl0gYXMgY29uc3QpO1xuXG5mdW5jdGlvbiBtYXBUb3VjaExpc3QobGlzdDogYW55KTogYW55W10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShsaXN0IGFzIEFycmF5TGlrZTxhbnk+KS5tYXAoKHRvdWNoOiBhbnkpID0+ICh7XG4gICAgdGFyZ2V0OiBleHRyYWN0SFRNTEVsZW1lbnQodG91Y2gudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSxcbiAgICBpZGVudGlmaWVyOiB0b3VjaC5pZGVudGlmaWVyLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWSxcbiAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgcGFnZVg6IHRvdWNoLnBhZ2VYLFxuICAgIHBhZ2VZOiB0b3VjaC5wYWdlWSxcbiAgfSkpO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBEYXRhVHJhbnNmZXIgcHJvcGVydGllc1xuZnVuY3Rpb24gZXh0cmFjdERhdGFUcmFuc2ZlcihkdDogRGF0YVRyYW5zZmVyIHwgbnVsbCk6IG9iamVjdCB8IG51bGwge1xuICBpZiAoIWR0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaXRlbXMgPSBbXTtcbiAgaWYgKGR0Lml0ZW1zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkdC5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGR0Lml0ZW1zW2ldITtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBraW5kOiBpdGVtLmtpbmQsXG4gICAgICAgIHR5cGU6IGl0ZW0udHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGRyb3BfZWZmZWN0OiBkdC5kcm9wRWZmZWN0LFxuICAgIGVmZmVjdF9hbGxvd2VkOiBkdC5lZmZlY3RBbGxvd2VkLFxuICAgIGl0ZW1zOiBpdGVtcyxcbiAgICB0eXBlczogQXJyYXkuZnJvbShkdC50eXBlcyB8fCBbXSksXG4gIH07XG59XG5cbmNvbnN0IGV2ZW50RXh0cmFjdG9yTWFwOiB7IFtrZXk6IHN0cmluZ106IChldnQ6IGFueSkgPT4gb2JqZWN0IH0gPSB7fTtcblxuZnVuY3Rpb24gYWRkKG1hcDogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBmbjogYW55KSB7XG4gIGZvciAoY29uc3QgbiBvZiBuYW1lcykgbWFwW25dID0gZm47XG59XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcInBvaW50ZXJkb3duXCIsXG4gICAgXCJwb2ludGVybW92ZVwiLFxuICAgIFwicG9pbnRlcnVwXCIsXG4gICAgXCJwb2ludGVyY2FuY2VsXCIsXG4gICAgXCJnb3Rwb2ludGVyY2FwdHVyZVwiLFxuICAgIFwibG9zdHBvaW50ZXJjYXB0dXJlXCIsXG4gICAgXCJwb2ludGVyZW50ZXJcIixcbiAgICBcInBvaW50ZXJsZWF2ZVwiLFxuICAgIFwicG9pbnRlcm92ZXJcIixcbiAgICBcInBvaW50ZXJvdXRcIixcbiAgXSxcbiAgcG9pbnRlckV4dHJhY3RvclxuKTtcblxuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1xuICAgIFwiY2xpY2tcIixcbiAgICBcImNvbnRleHRtZW51XCIsXG4gICAgXCJkYmxjbGlja1wiLFxuICAgIFwibW91c2Vkb3duXCIsXG4gICAgXCJtb3VzZWVudGVyXCIsXG4gICAgXCJtb3VzZWxlYXZlXCIsXG4gICAgXCJtb3VzZW1vdmVcIixcbiAgICBcIm1vdXNlb3V0XCIsXG4gICAgXCJtb3VzZW92ZXJcIixcbiAgICBcIm1vdXNldXBcIixcbiAgXSxcbiAgbW91c2VFeHRyYWN0b3Jcbik7XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcImRyYWdcIixcbiAgICBcImRyYWdlbmRcIixcbiAgICBcImRyYWdlbnRlclwiLFxuICAgIFwiZHJhZ2V4aXRcIixcbiAgICBcImRyYWdsZWF2ZVwiLFxuICAgIFwiZHJhZ292ZXJcIixcbiAgICBcImRyYWdzdGFydFwiLFxuICAgIFwiZHJvcFwiLFxuICBdLFxuICBkcmFnRXh0cmFjdG9yXG4pO1xuXG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImtleWRvd25cIiwgXCJrZXlwcmVzc1wiLCBcImtleXVwXCJdLCBrZXlib2FyZEV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImZvY3VzXCIsIFwiYmx1clwiXSwgZm9jdXNFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJjaGFuZ2VcIiwgXCJpbnB1dFwiXSwgY2hhbmdlRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiaW52YWxpZFwiXSwgaW52YWxpZEV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInJlc2V0XCIsIFwic3VibWl0XCJdLCBmb3JtRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiY29weVwiLCBcImN1dFwiLCBcInBhc3RlXCJdLCBjbGlwYm9hcmRFeHRyYWN0b3IpO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1wiY29tcG9zaXRpb25lbmRcIiwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIFwiY29tcG9zaXRpb251cGRhdGVcIl0sXG4gIGNvbXBvc2l0aW9uRXh0cmFjdG9yXG4pO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1widG91Y2hjYW5jZWxcIiwgXCJ0b3VjaGVuZFwiLCBcInRvdWNobW92ZVwiLCBcInRvdWNoc3RhcnRcIl0sXG4gIHRvdWNoRXh0cmFjdG9yXG4pO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJzY3JvbGxcIl0sIHVpRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wid2hlZWxcIl0sIHdoZWVsRXh0cmFjdG9yKTtcbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcImFuaW1hdGlvbnN0YXJ0XCIsIFwiYW5pbWF0aW9uZW5kXCIsIFwiYW5pbWF0aW9uaXRlcmF0aW9uXCJdLFxuICBhbmltYXRpb25FeHRyYWN0b3Jcbik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInRyYW5zaXRpb25lbmRcIl0sIHRyYW5zaXRpb25FeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ0b2dnbGVcIl0sIHRvZ2dsZUV4dHJhY3Rvcik7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXZlbnQodmFsdWU6IGFueSk6IGFueSB7XG4gIC8vIER1Y2stdHlwaW5nIGZvciBSZWFjdCdzIFN5bnRoZXRpY0V2ZW50LlxuICAvLyBXZSBjaGVjayBmb3IgcHJvcGVydGllcyB0aGF0IGFyZSB1bmlxdWUgdG8gc3ludGhldGljIGV2ZW50cy5cbiAgaWYgKFxuICAgIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJuYXRpdmVFdmVudFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLmlzRGVmYXVsdFByZXZlbnRlZCA9PT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIGNvbnN0IGV2dCA9IHZhbHVlIGFzIFJlYWN0LlN5bnRoZXRpY0V2ZW50O1xuICAgIC8vIFRoZSBgdHlwZWAgcHJvcGVydHkgaXMgY3J1Y2lhbCBmb3IgdGhlIGxvb2t1cC5cbiAgICBpZiAodHlwZW9mIGV2dC50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFjdG9yID0gZXZlbnRFeHRyYWN0b3JNYXBbZXZ0LnR5cGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKGV4dHJhY3Rvcikge1xuICAgICAgcmV0dXJuIGV4dHJhY3RvcihldnQpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bmtub3duIGV2ZW50IHR5cGVzOiBtaW5pbWFsIHN5bnRoZXRpYyBleHRyYWN0b3JcbiAgICByZXR1cm4gc3ludGhldGljRXh0cmFjdG9yKGV2dCk7XG4gIH1cblxuICAvLyBJZiBpdCdzIG5vdCBhIGR1Y2stdHlwZWQgZXZlbnQsIHJldHVybiBpdCBhcyBpcy5cbiAgcmV0dXJuIHZhbHVlO1xufVxuIiwKICAgICJleHBvcnQgdHlwZSBQcmltaXRpdmUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpTT048VD4gPSBUIHwgQXJyYXk8SlNPTjxUPj4gfCB7IFtLOiBzdHJpbmddOiBKU09OPFQ+IH07XG5leHBvcnQgdHlwZSBQbGFpbkpTT04gPSBKU09OPFByaW1pdGl2ZT47XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGUgPSBhbnk7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWQgPSBbW251bWJlcltdLCBudW1iZXJbXSwgbnVtYmVyW10sIG51bWJlcltdXSwgUGxhaW5KU09OXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBTZXJpYWxpemFibGUpOiBTZXJpYWxpemVkIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8YW55LCBudW1iZXI+KCk7XG4gIGNvbnN0IHJlZnM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGRhdGVzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBzZXRzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBtYXBzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8vIFNpbmdsZSBnbG9iYWwgY291bnRlciAtIGluY3JlbWVudHMgb25jZSBwZXIgbm9kZSB2aXNpdFxuICBsZXQgZ2xvYmFsSW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIHByb2Nlc3ModmFsdWU6IFNlcmlhbGl6YWJsZSk6IFBsYWluSlNPTiB7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpZHggPSBnbG9iYWxJbmRleCsrO1xuICAgIGNvbnN0IHByZXZSZWYgPSBzZWVuLmdldCh2YWx1ZSk7XG4gICAgaWYgKHByZXZSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTWFrZSBzdXJlIHRvIHB1c2ggdGhlIGN1cnJlbnQgaW5kZXgsIGJ1dCB1c2UgdGhlIHJlZidzIGluZGV4IGFzIHRoZSB2YWx1ZSFcbiAgICAgIHJlZnMucHVzaChpZHgpO1xuICAgICAgcmV0dXJuIHByZXZSZWY7XG4gICAgfVxuXG4gICAgc2Vlbi5zZXQodmFsdWUsIGlkeCk7XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBkYXRlcy5wdXNoKGlkeCk7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHByb2Nlc3ModmFsdWVbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIG1hcHMucHVzaChpZHgpO1xuICAgICAgY29uc3QgcmVjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgcmVjW1N0cmluZyhrZXkpXSA9IHByb2Nlc3MoZW50cnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlYztcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIHNldHMucHVzaChpZHgpO1xuICAgICAgY29uc3Qgc2l6ZSA9IHZhbHVlLnNpemU7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoc2l6ZSk7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IHByb2Nlc3MoZW50cnkpO1xuICAgICAgICBpICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHJlYzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZWNba2V5XSA9IHByb2Nlc3ModmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWUgaW4gc2VyaWFsaXphdGlvbjogJHt2YWx1ZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSBwcm9jZXNzKGRhdGEpO1xuICByZXR1cm4gW1tyZWZzLCBkYXRlcywgc2V0cywgbWFwc10sIHBheWxvYWRdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2VyaWFsaXphdGlvbk9wdGlvbnMge1xuICBjb2VyY2VOdWxsc1RvVW5kZWZpbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplPERhdGEgZXh0ZW5kcyBTZXJpYWxpemFibGUgPSBTZXJpYWxpemFibGU+KFxuICBwYXlsb2FkOiBTZXJpYWxpemVkLFxuICBvcHRpb25zPzogRGVzZXJpYWxpemF0aW9uT3B0aW9uc1xuKTogRGF0YSB7XG4gIGNvbnN0IFtbcmVmc0EsIGRhdGVzQSwgc2V0c0EsIG1hcHNBXSwgZGF0YV0gPSBwYXlsb2FkO1xuXG4gIGNvbnN0IHJlZnMgPSBuZXcgU2V0KHJlZnNBKTtcbiAgY29uc3QgZGF0ZXMgPSBuZXcgU2V0KGRhdGVzQSk7XG4gIGNvbnN0IHNldHMgPSBuZXcgU2V0KHNldHNBKTtcbiAgY29uc3QgbWFwcyA9IG5ldyBTZXQobWFwc0EpO1xuXG4gIGNvbnN0IG9iamVjdHM6IEFycmF5PGFueT4gPSBbXTtcblxuICBmdW5jdGlvbiByZWNvbnN0cnVjdCh2YWx1ZTogUGxhaW5KU09OKTogYW55IHtcbiAgICBjb25zdCBpZHggPSBvYmplY3RzLmxlbmd0aDtcbiAgICBpZiAocmVmcy5oYXMoaWR4KSkge1xuICAgICAgLy8gV2UgaW5jcmVtZW50IHRoZSBjb3VudGVyIG9uIHJlZnMgZHVyaW5nIHNlcmlhbGl6YXRpb24uIFdlJ3JlIG5ldmVyXG4gICAgICAvLyBnb2luZyB0byB1c2UgdGhpcyBlbnRyeSwgc28gd2UgY2FuIGp1c3QgcHVzaCBudWxsLlxuICAgICAgb2JqZWN0cy5wdXNoKG51bGwpO1xuICAgICAgcmV0dXJuIG9iamVjdHNbdmFsdWUgYXMgbnVtYmVyXTtcbiAgICB9XG5cbiAgICBpZiAoZGF0ZXMuaGFzKGlkeCkpIHtcbiAgICAgIGNvbnN0IGR0ID0gbmV3IERhdGUodmFsdWUgYXMgbnVtYmVyKTtcbiAgICAgIG9iamVjdHMucHVzaChkdCk7XG4gICAgICByZXR1cm4gZHQ7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICApIHtcbiAgICAgIGlmIChvcHRpb25zPy5jb2VyY2VOdWxsc1RvVW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA/PyB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAoc2V0cy5oYXMoaWR4KSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gICAgICAgIG9iamVjdHMucHVzaChyZXN1bHQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChyZWNvbnN0cnVjdCh2YWx1ZVtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgICAgb2JqZWN0cy5wdXNoKGFycik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IHJlY29uc3RydWN0KHZhbHVlW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgaWYgKG1hcHMuaGFzKGlkeCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgcmVzdWx0LnNldChrZXksIHJlY29uc3RydWN0KHZhbHVlW2tleV0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIG9iamVjdHMucHVzaChyZXN1bHQpO1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXN1bHRba2V5XSA9IHJlY29uc3RydWN0KHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlIGluIGRlc2VyaWFsaXphdGlvbjogJHt2YWx1ZX1gKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbnN0cnVjdChkYXRhKTtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSb3V0ZUluZm8gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgdHlwZSB7IFZET00sIFZET01VcGRhdGUgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgeyBleHRyYWN0RXZlbnQgfSBmcm9tIFwiLi9zZXJpYWxpemUvZXZlbnRzXCI7XG5pbXBvcnQgeyBzZXJpYWxpemUsIGRlc2VyaWFsaXplIH0gZnJvbSBcIi4vc2VyaWFsaXplL3NlcmlhbGl6ZXJcIjtcblxuaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG4gIENsaWVudENoYW5uZWxNZXNzYWdlLFxuICBDbGllbnRNZXNzYWdlLFxuICBTZXJ2ZXJBcGlDYWxsTWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckVycm9ySW5mbyxcbiAgU2VydmVyTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGVGdW5jdGlvbiB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcbmltcG9ydCB7IGNyZWF0ZUNoYW5uZWxCcmlkZ2UsIFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IgfSBmcm9tIFwiLi9jaGFubmVsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuICByb3V0ZUluZm86IFJvdXRlSW5mbztcbiAgb25Jbml0OiAoXG4gICAgdmRvbTogVkRPTSxcbiAgICBjYWxsYmFja3M6IHN0cmluZ1tdLFxuICAgIHJlbmRlclByb3BzOiBzdHJpbmdbXSxcbiAgICBjc3NSZWZzOiBzdHJpbmdbXVxuICApID0+IHZvaWQ7XG4gIG9uVXBkYXRlOiAob3BzOiBWRE9NVXBkYXRlW10pID0+IHZvaWQ7XG59XG5leHBvcnQgdHlwZSBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIgPSAoY29ubmVjdGVkOiBib29sZWFuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgU2VydmVyRXJyb3JMaXN0ZW5lciA9IChcbiAgcGF0aDogc3RyaW5nLFxuICBlcnJvcjogU2VydmVyRXJyb3JJbmZvIHwgbnVsbFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ2xpZW50IHtcbiAgLy8gQ29ubmVjdGlvbiBtYW5hZ2VtZW50XG4gIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPjtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xuICBvbkNvbm5lY3Rpb25DaGFuZ2UobGlzdGVuZXI6IENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcik6ICgpID0+IHZvaWQ7XG4gIC8vIE1lc3NhZ2VzXG4gIG5hdmlnYXRlKHBhdGg6IHN0cmluZywgcm91dGVJbmZvOiBSb3V0ZUluZm8pOiBQcm9taXNlPHZvaWQ+O1xuICBsZWF2ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBpbnZva2VDYWxsYmFjayhwYXRoOiBzdHJpbmcsIGNhbGxiYWNrOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLy8gVkRPTSBzdWJzY3JpcHRpb25cbiAgbW91bnRWaWV3KHBhdGg6IHN0cmluZywgdmlldzogTW91bnRlZFZpZXcpOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUHVsc2VTb2NrZXRJT0NsaWVudCB7XG4gIHByaXZhdGUgYWN0aXZlVmlld3M6IE1hcDxzdHJpbmcsIE1vdW50ZWRWaWV3PjtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VRdWV1ZTogQ2xpZW50TWVzc2FnZVtdO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHNlcnZlckVycm9yczogTWFwPHN0cmluZywgU2VydmVyRXJyb3JJbmZvPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzZXJ2ZXJFcnJvckxpc3RlbmVyczogU2V0PFNlcnZlckVycm9yTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIGNoYW5uZWxzOiBNYXA8c3RyaW5nLCB7IGJyaWRnZTogQ2hhbm5lbEJyaWRnZTsgcmVmQ291bnQ6IG51bWJlciB9PiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZW5kZXJJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgZnJhbWV3b3JrTmF2aWdhdGU6IE5hdmlnYXRlRnVuY3Rpb25cbiAgKSB7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmlld3MgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgfVxuICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc29ja2V0Py5jb25uZWN0ZWQgPz8gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiLCBcIndlYnRyYW5zcG9ydFwiXSxcbiAgICAgICAgYXV0aDogeyByZW5kZXJJZDogdGhpcy5yZW5kZXJJZCB9LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0ZWQ6XCIsIHRoaXMuc29ja2V0Py5pZCk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBzZW5kIGEgbmF2aWdhdGUgcGF5bG9hZCBmb3IgYWxsIHRoZSByb3V0ZXNcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgcm91dGVdIG9mIHRoaXMuYWN0aXZlVmlld3MpIHtcbiAgICAgICAgICBzb2NrZXQuZW1pdChcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgc2VyaWFsaXplKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICByb3V0ZUluZm86IHJvdXRlLnJvdXRlSW5mbyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIEFscmVhZHkgc2VudCBhYm92ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibW91bnRcIiAmJiB0aGlzLmFjdGl2ZVZpZXdzLmhhcyhwYXlsb2FkLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2UncmUgcmVtb3VudGluZyBhbGwgdGhlIHJvdXRlcywgc28gbm8gbmVlZCB0byBuYXZpZ2F0ZVxuICAgICAgICAgIGlmIChwYXlsb2FkLnR5cGUgPT09IFwibmF2aWdhdGVcIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNvY2tldC5lbWl0KFwibWVzc2FnZVwiLCBzZXJpYWxpemUocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5oYW5kbGVUcmFuc3BvcnREaXNjb25uZWN0KCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhmYWxzZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gV3JhcCBpbiBhbiBhcnJvdyBmdW5jdGlvbiB0byBhdm9pZCBsb3NpbmcgdGhlIGB0aGlzYCByZWZlcmVuY2VcbiAgICAgIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+XG4gICAgICAgIHRoaXMuaGFuZGxlU2VydmVyTWVzc2FnZShcbiAgICAgICAgICBkZXNlcmlhbGl6ZShkYXRhLCB7IGNvZXJjZU51bGxzVG9VbmRlZmluZWQ6IHRydWUgfSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZXJ2ZXJFcnJvcihsaXN0ZW5lcjogU2VydmVyRXJyb3JMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAvLyBFbWl0IGN1cnJlbnQgZXJyb3JzIHRvIG5ldyBsaXN0ZW5lclxuICAgIGZvciAoY29uc3QgW3BhdGgsIGVycl0gb2YgdGhpcy5zZXJ2ZXJFcnJvcnMpIGxpc3RlbmVyKHBhdGgsIGVycik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTZXJ2ZXJFcnJvcihwYXRoOiBzdHJpbmcsIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzKSBsaXN0ZW5lcihwYXRoLCBlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgc2VyaWFsaXplKHBheWxvYWQgYXMgYW55KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2VuZENoYW5uZWxNZXNzYWdlKFxuICAgIG1lc3NhZ2U6IENsaWVudENoYW5uZWxNZXNzYWdlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgbW91bnRWaWV3KHBhdGg6IHN0cmluZywgdmlldzogTW91bnRlZFZpZXcpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVWaWV3cy5oYXMocGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAke3BhdGh9IGlzIGFscmVhZHkgbW91bnRlZGApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVZpZXdzLnNldChwYXRoLCB2aWV3KTtcbiAgICB2b2lkIHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbzogdmlldy5yb3V0ZUluZm8sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbykge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJuYXZpZ2F0ZVwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bm1vdW50KHBhdGg6IHN0cmluZykge1xuICAgIHZvaWQgdGhpcy5zZW5kTWVzc2FnZSh7IHR5cGU6IFwidW5tb3VudFwiLCBwYXRoIH0pO1xuICAgIHRoaXMuYWN0aXZlVmlld3MuZGVsZXRlKHBhdGgpO1xuICB9XG5cbiAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvcnMuY2xlYXIoKTtcbiAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCB7IGJyaWRnZSB9IG9mIHRoaXMuY2hhbm5lbHMudmFsdWVzKCkpIHtcbiAgICAgIGJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2xpZW50IGRpc2Nvbm5lY3RlZFwiKSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbm5lbHMuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU2VydmVyTWVzc2FnZShtZXNzYWdlOiBTZXJ2ZXJNZXNzYWdlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJbUHVsc2VDbGllbnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIG1lc3NhZ2UpO1xuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlIFwidmRvbV9pbml0XCI6IHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmFjdGl2ZVZpZXdzLmdldChtZXNzYWdlLnBhdGgpO1xuICAgICAgICAvLyBJZ25vcmUgbWVzc2FnZXMgZm9yIHBhdGhzIHRoYXQgYXJlIG5vdCBtb3VudGVkXG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgcm91dGUub25Jbml0KFxuICAgICAgICAgICAgbWVzc2FnZS52ZG9tLFxuICAgICAgICAgICAgbWVzc2FnZS5jYWxsYmFja3MsXG4gICAgICAgICAgICBtZXNzYWdlLnJlbmRlcl9wcm9wcyxcbiAgICAgICAgICAgIG1lc3NhZ2UuY3NzX3JlZnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmlvciBlcnJvciBmb3IgdGhpcyBwYXRoIG9uIHN1Y2Nlc3NmdWwgaW5pdFxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJFcnJvcnMuaGFzKG1lc3NhZ2UucGF0aCkpIHtcbiAgICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidmRvbV91cGRhdGVcIjoge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuYWN0aXZlVmlld3MuZ2V0KG1lc3NhZ2UucGF0aCk7XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjsgLy8gTm90IGFuIGFjdGl2ZSBwYXRoOyBkaXNjYXJkXG4gICAgICAgIHJvdXRlLm9uVXBkYXRlKG1lc3NhZ2Uub3BzKTtcbiAgICAgICAgLy8gQ2xlYXIgYW55IHByaW9yIGVycm9yIGZvciB0aGlzIHBhdGggb24gc3VjY2Vzc2Z1bCB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInNlcnZlcl9lcnJvclwiOiB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVWaWV3cy5oYXMobWVzc2FnZS5wYXRoKSkgcmV0dXJuOyAvLyBkaXNjYXJkIGZvciBpbmFjdGl2ZSBwYXRoc1xuICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5zZXQobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG1lc3NhZ2UuZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcGlfY2FsbFwiOiB7XG4gICAgICAgIHZvaWQgdGhpcy5wZXJmb3JtQXBpQ2FsbChtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwibmF2aWdhdGVfdG9cIjoge1xuICAgICAgICAvLyBgbmF2aWdhdGVfdG9gIGlzIG5hdmlnYXRpb25hbDsgYWxsb3cgcmVnYXJkbGVzcyBvZiBhY3RpdmVWaWV3cyBtZW1iZXJzaGlwXG4gICAgICAgIGNvbnN0IHJlcGxhY2UgPSAhIW1lc3NhZ2UucmVwbGFjZTtcbiAgICAgICAgbGV0IGRlc3QgPSBtZXNzYWdlLnBhdGggfHwgXCJcIjtcbiAgICAgICAgLy8gTm9ybWFsaXplIHByb3RvY29sLXJlbGF0aXZlIFVSTHMgdG8gYWJzb2x1dGVcbiAgICAgICAgaWYgKGRlc3Quc3RhcnRzV2l0aChcIi8vXCIpKSBkZXN0ID0gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfSR7ZGVzdH1gO1xuICAgICAgICBjb25zdCBoYXNTY2hlbWUgPSAvXlthLXpBLVpdW2EtekEtWjAtOSsuLV0qOi8udGVzdChkZXN0KTtcbiAgICAgICAgaWYgKGhhc1NjaGVtZSkge1xuICAgICAgICAgIGlmIChkZXN0LnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpIHx8IGRlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRlc3QpO1xuICAgICAgICAgICAgICBpZiAodXJsLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWA7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtOYXZpZ2F0ZShpbnRlcm5hbCwgeyByZXBsYWNlIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbWFpbHRvOiwgdGVsOiwgZGF0YTosIGV0Yy5cbiAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVsYXRpdmUgb3Igcm9vdC1yZWxhdGl2ZSBwYXRoIOKGkiBTUEEgbmF2aWdhdGVcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya05hdmlnYXRlKGRlc3QsIHsgcmVwbGFjZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJjaGFubmVsX21lc3NhZ2VcIjoge1xuICAgICAgICB0aGlzLnJvdXRlQ2hhbm5lbE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVW5leHBlY3RlZCBtZXNzYWdlOlwiLCBtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1BcGlDYWxsKG1zZzogU2VydmVyQXBpQ2FsbE1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobXNnLnVybCwge1xuICAgICAgICBtZXRob2Q6IG1zZy5tZXRob2QgfHwgXCJHRVRcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIC4uLihtc2cuaGVhZGVycyB8fCB7fSksXG4gICAgICAgICAgLi4uKG1zZy5ib2R5ICE9IG51bGwgJiYgIShcImNvbnRlbnQtdHlwZVwiIGluIChtc2cuaGVhZGVycyB8fCB7fSkpXG4gICAgICAgICAgICA/IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6XG4gICAgICAgICAgbXNnLmJvZHkgIT0gbnVsbFxuICAgICAgICAgICAgPyB0eXBlb2YgbXNnLmJvZHkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBtc2cuYm9keVxuICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KG1zZy5ib2R5KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBtc2cuY3JlZGVudGlhbHMgfHwgXCJpbmNsdWRlXCIsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGhlYWRlcnNPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIHJlcy5oZWFkZXJzLmZvckVhY2goKHYsIGspID0+IChoZWFkZXJzT2JqW2tdID0gdikpO1xuICAgICAgbGV0IGJvZHk6IGFueSA9IG51bGw7XG4gICAgICBjb25zdCBjdCA9IHJlcy5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSB8fCBcIlwiO1xuICAgICAgaWYgKGN0LmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgICBib2R5ID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvZHkgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVwbHk6IENsaWVudEFwaVJlc3VsdE1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpX3Jlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICBvazogcmVzLm9rLFxuICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNPYmosXG4gICAgICAgIGJvZHksXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShyZXBseSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCByZXBseTogQ2xpZW50QXBpUmVzdWx0TWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlfcmVzdWx0XCIsXG4gICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgYm9keTogeyBlcnJvcjogU3RyaW5nKGVycikgfSxcbiAgICAgIH07XG4gICAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHJlcGx5KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW52b2tlQ2FsbGJhY2socGF0aDogc3RyaW5nLCBjYWxsYmFjazogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjYWxsYmFja1wiLFxuICAgICAgcGF0aCxcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgYXJnczogYXJncy5tYXAoZXh0cmFjdEV2ZW50KSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhY3F1aXJlQ2hhbm5lbChpZDogc3RyaW5nKTogQ2hhbm5lbEJyaWRnZSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVuc3VyZUNoYW5uZWxFbnRyeShpZCk7XG4gICAgZW50cnkucmVmQ291bnQgKz0gMTtcbiAgICByZXR1cm4gZW50cnkuYnJpZGdlO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2VDaGFubmVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2hhbm5lbHMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJ5LnJlZkNvdW50ID0gTWF0aC5tYXgoMCwgZW50cnkucmVmQ291bnQgLSAxKTtcbiAgICBpZiAoZW50cnkucmVmQ291bnQgPT09IDApIHtcbiAgICAgIGVudHJ5LmJyaWRnZS5kaXNwb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCByZWxlYXNlZFwiKSk7XG4gICAgICB0aGlzLmNoYW5uZWxzLmRlbGV0ZShpZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVDaGFubmVsRW50cnkoaWQ6IHN0cmluZyk6IHtcbiAgICBicmlkZ2U6IENoYW5uZWxCcmlkZ2U7XG4gICAgcmVmQ291bnQ6IG51bWJlcjtcbiAgfSB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5jaGFubmVscy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGVudHJ5ID0ge1xuICAgICAgICBicmlkZ2U6IGNyZWF0ZUNoYW5uZWxCcmlkZ2UodGhpcywgaWQpLFxuICAgICAgICByZWZDb3VudDogMCxcbiAgICAgIH07XG4gICAgICB0aGlzLmNoYW5uZWxzLnNldChpZCwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBwcml2YXRlIHJvdXRlQ2hhbm5lbE1lc3NhZ2UobWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2UpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW5zdXJlQ2hhbm5lbEVudHJ5KG1lc3NhZ2UuY2hhbm5lbCk7XG4gICAgY29uc3QgY2xvc2VkID0gZW50cnkuYnJpZGdlLmhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZSk7XG4gICAgaWYgKGNsb3NlZCAmJiBlbnRyeS5yZWZDb3VudCA9PT0gMCkge1xuICAgICAgdGhpcy5jaGFubmVscy5kZWxldGUobWVzc2FnZS5jaGFubmVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRyYW5zcG9ydERpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmNoYW5uZWxzLnZhbHVlcygpKSB7XG4gICAgICBlbnRyeS5icmlkZ2UuaGFuZGxlRGlzY29ubmVjdChcbiAgICAgICAgbmV3IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IoXCJDb25uZWN0aW9uIGxvc3RcIilcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHVibGljIGdldFZET00ocGF0aDogc3RyaW5nKTogVkRPTSB8IG51bGwge1xuICAvLyAgIHJldHVybiB0aGlzLmFjdGl2ZVZpZXdzLmdldChwYXRoKT8udmRvbSA/PyBudWxsO1xuICAvLyB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgU2VydmVyQ2hhbm5lbE1lc3NhZ2UsXG4gIFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSxcbiAgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSxcbn0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgUHVsc2VTb2NrZXRJT0NsaWVudCB9IGZyb20gXCIuL2NsaWVudFwiO1xuXG5leHBvcnQgY2xhc3MgUHVsc2VDaGFubmVsUmVzZXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJQdWxzZUNoYW5uZWxSZXNldEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQ2hhbm5lbEV2ZW50SGFuZGxlciA9IChwYXlsb2FkOiBhbnkpID0+IGFueSB8IFByb21pc2U8YW55PjtcblxuaW50ZXJmYWNlIFBlbmRpbmdSZXF1ZXN0IHtcbiAgcmVzb2x2ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gIHJlamVjdDogKGVycm9yOiBhbnkpID0+IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIHJhbmRvbUlkKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tVVVJRCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCkucmVwbGFjZSgvLS9nLCBcIlwiKTtcbiAgfVxuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMikgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHJldHVybiBlcnJvcjtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlcnZlclJlc3BvbnNlTWVzc2FnZShcbiAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2Vcbik6IG1lc3NhZ2UgaXMgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSB7XG4gIHJldHVybiB0eXBlb2YgKG1lc3NhZ2UgYXMgU2VydmVyQ2hhbm5lbFJlc3BvbnNlTWVzc2FnZSkucmVzcG9uc2VUbyA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXF1ZXN0TWVzc2FnZShcbiAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2Vcbik6IG1lc3NhZ2UgaXMgU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlIHtcbiAgcmV0dXJuIHR5cGVvZiAobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UpLmV2ZW50ID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbEJyaWRnZSB7XG4gIHByaXZhdGUgaGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PENoYW5uZWxFdmVudEhhbmRsZXI+PigpO1xuICBwcml2YXRlIHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ1JlcXVlc3Q+KCk7XG4gIHByaXZhdGUgYmFja2xvZzogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHVsc2VTb2NrZXRJT0NsaWVudCwgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmcpIHt9XG5cbiAgZW1pdChldmVudDogc3RyaW5nLCBwYXlsb2FkPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgdm9pZCB0aGlzLmNsaWVudC5zZW5kQ2hhbm5lbE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICBldmVudCxcbiAgICAgIHBheWxvYWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KGV2ZW50OiBzdHJpbmcsIHBheWxvYWQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJhbmRvbUlkKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIHZvaWQgdGhpcy5jbGllbnRcbiAgICAgICAgLnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICAgICAgdHlwZTogXCJjaGFubmVsX21lc3NhZ2VcIixcbiAgICAgICAgICBjaGFubmVsOiB0aGlzLmlkLFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUocmVxdWVzdElkKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBvbihldmVudDogc3RyaW5nLCBoYW5kbGVyOiBDaGFubmVsRXZlbnRIYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgbGV0IGJ1Y2tldCA9IHRoaXMuaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgYnVja2V0ID0gbmV3IFNldCgpO1xuICAgICAgdGhpcy5oYW5kbGVycy5zZXQoZXZlbnQsIGJ1Y2tldCk7XG4gICAgfVxuICAgIGJ1Y2tldC5hZGQoaGFuZGxlcik7XG4gICAgdGhpcy5mbHVzaEJhY2tsb2coZXZlbnQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBzZXQgPSB0aGlzLmhhbmRsZXJzLmdldChldmVudCk7XG4gICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgIGlmIChzZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZTogU2VydmVyQ2hhbm5lbE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICBpZiAoaXNTZXJ2ZXJSZXNwb25zZU1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHRoaXMucmVzb2x2ZVBlbmRpbmcobWVzc2FnZSk7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghaXNTZXJ2ZXJSZXF1ZXN0TWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLmV2ZW50ID09PSBcIl9fY2xvc2VfX1wiKSB7XG4gICAgICB0aGlzLmNsb3NlKG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCBjbG9zZWQgYnkgc2VydmVyXCIpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5yZXF1ZXN0SWQpIHtcbiAgICAgIHZvaWQgdGhpcy5kaXNwYXRjaFJlcXVlc3QobWVzc2FnZSBhcyBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2UgJiB7XG4gICAgICAgIHJlcXVlc3RJZDogc3RyaW5nO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VkO1xuICB9XG5cbiAgaGFuZGxlRGlzY29ubmVjdChyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKHJlYXNvbik7XG4gIH1cblxuICBkaXNwb3NlKHJlYXNvbjogUHVsc2VDaGFubmVsUmVzZXRFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UocmVhc29uKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFwiQ2hhbm5lbCBpcyBjbG9zZWRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaEJhY2tsb2coZXZlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJhY2tsb2cubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgcmVtYWluaW5nOiBTZXJ2ZXJDaGFubmVsUmVxdWVzdE1lc3NhZ2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmJhY2tsb2cpIHtcbiAgICAgIGlmIChpdGVtLmV2ZW50ID09PSBldmVudCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1haW5pbmcucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5iYWNrbG9nID0gcmVtYWluaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEV2ZW50KG1lc3NhZ2U6IFNlcnZlckNoYW5uZWxSZXF1ZXN0TWVzc2FnZSk6IHZvaWQge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQobWVzc2FnZS5ldmVudCk7XG4gICAgaWYgKCFoYW5kbGVycyB8fCBoYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmJhY2tsb2cucHVzaChtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS50aGVuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB2b2lkIChyZXN1bHQgYXMgUHJvbWlzZTxhbnk+KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiUHVsc2UgY2hhbm5lbCBoYW5kbGVyIGVycm9yXCIsIGVycik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFJlcXVlc3QoXG4gICAgbWVzc2FnZTogU2VydmVyQ2hhbm5lbFJlcXVlc3RNZXNzYWdlICYgeyByZXF1ZXN0SWQ6IHN0cmluZyB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQobWVzc2FnZS5ldmVudCk7XG4gICAgbGV0IHJlc3BvbnNlOiBhbnk7XG4gICAgbGV0IGVycm9yOiBhbnk7XG4gICAgaWYgKGhhbmRsZXJzICYmIGhhbmRsZXJzLnNpemUgPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwiY2hhbm5lbF9tZXNzYWdlXCIsXG4gICAgICAgIGNoYW5uZWw6IHRoaXMuaWQsXG4gICAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICAgIHJlc3BvbnNlVG86IG1lc3NhZ2UucmVxdWVzdElkLFxuICAgICAgICBlcnJvcjogZm9ybWF0RXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmRDaGFubmVsTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNoYW5uZWxfbWVzc2FnZVwiLFxuICAgICAgY2hhbm5lbDogdGhpcy5pZCxcbiAgICAgIGV2ZW50OiB1bmRlZmluZWQsXG4gICAgICByZXNwb25zZVRvOiBtZXNzYWdlLnJlcXVlc3RJZCxcbiAgICAgIHBheWxvYWQ6IHJlc3BvbnNlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGVuZGluZyhtZXNzYWdlOiBTZXJ2ZXJDaGFubmVsUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBtZXNzYWdlLnJlc3BvbnNlVG8gPyB0aGlzLnBlbmRpbmcuZ2V0KG1lc3NhZ2UucmVzcG9uc2VUbykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKG1lc3NhZ2UucmVzcG9uc2VUbyEpO1xuICAgIGlmIChtZXNzYWdlLmVycm9yICE9PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5lcnJvciAhPT0gbnVsbCkge1xuICAgICAgZW50cnkucmVqZWN0KG5ldyBQdWxzZUNoYW5uZWxSZXNldEVycm9yKFN0cmluZyhtZXNzYWdlLmVycm9yKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRyeS5yZXNvbHZlKG1lc3NhZ2UucGF5bG9hZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZShyZWFzb246IFB1bHNlQ2hhbm5lbFJlc2V0RXJyb3IpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHtcbiAgICAgIHJlcXVlc3QucmVqZWN0KHJlYXNvbik7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZy5jbGVhcigpO1xuICAgIHRoaXMuaGFuZGxlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmJhY2tsb2cgPSBbXTtcbiAgICAvLyBOby1vcDogb3duaW5nIGNsaWVudCBtYW5hZ2VzIHJlZ2lzdHJ5IGxpZmVjeWNsZS5cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2hhbm5lbEJyaWRnZShcbiAgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuICBpZDogc3RyaW5nXG4pOiBDaGFubmVsQnJpZGdlIHtcbiAgcmV0dXJuIG5ldyBDaGFubmVsQnJpZGdlKGNsaWVudCwgaWQpO1xufVxuIiwKICAgICJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVB1bHNlQ2xpZW50IH0gZnJvbSBcIi4vcHVsc2VcIjtcbmltcG9ydCB0eXBlIHsgQ2hhbm5lbEJyaWRnZSB9IGZyb20gXCIuL2NoYW5uZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVB1bHNlQ2hhbm5lbChjaGFubmVsSWQ6IHN0cmluZyk6IENoYW5uZWxCcmlkZ2Uge1xuICBjb25zdCBjbGllbnQgPSB1c2VQdWxzZUNsaWVudCgpO1xuICBjb25zdCBicmlkZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWNoYW5uZWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDaGFubmVsIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGNoYW5uZWxJZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaWVudC5hY3F1aXJlQ2hhbm5lbChjaGFubmVsSWQpO1xuICB9LCBbY2xpZW50LCBjaGFubmVsSWRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGllbnQucmVsZWFzZUNoYW5uZWwoY2hhbm5lbElkKTtcbiAgICB9O1xuICB9LCBbY2xpZW50LCBjaGFubmVsSWRdKTtcblxuICByZXR1cm4gYnJpZGdlO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHR5cGUgRm9ybUV2ZW50IH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCB0eXBlIFB1bHNlRm9ybVByb3BzID0gUmVhY3QuQ29tcG9uZW50UHJvcHNXaXRob3V0UmVmPFwiZm9ybVwiPiAmIHtcbiAgYWN0aW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFB1bHNlRm9ybSBpbnRlcmNlcHRzIG5hdGl2ZSBmb3JtIHN1Ym1pc3Npb25zIGFuZCBzZW5kcyB0aGVtIHRocm91Z2ggZmV0Y2ggc28gdGhlXG4gKiBzdXJyb3VuZGluZyBQdWxzZSB2aWV3IHN0YXlzIG1vdW50ZWQuIFNlcnZlci1zaWRlIGhhbmRsZXJzIGFyZSBzdGlsbCBpbnZva2VkIHZpYVxuICogdGhlIGZvcm0gYWN0aW9uIGVuZHBvaW50IGFuZCByZWFjdGl2ZSB1cGRhdGVzIHByb3BhZ2F0ZSBvdmVyIHRoZSBzb2NrZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQdWxzZUZvcm0gPSBmb3J3YXJkUmVmPEhUTUxGb3JtRWxlbWVudCwgUHVsc2VGb3JtUHJvcHM+KFxuICBmdW5jdGlvbiBQdWxzZUZvcm0oeyBvblN1Ym1pdCwgYWN0aW9uLCAuLi5yZXN0IH0sIHJlZikge1xuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybVxuICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgYWN0aW9uPXthY3Rpb259XG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBvblN1Ym1pdD17dXNlQ2FsbGJhY2soXG4gICAgICAgICAgKGV2ZW50OiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT5cbiAgICAgICAgICAgIHN1Ym1pdEZvcm0oeyBldmVudCwgYWN0aW9uLCBvblN1Ym1pdCB9KSxcbiAgICAgICAgICBbYWN0aW9uLCBvblN1Ym1pdF1cbiAgICAgICAgKX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuKTtcblxuaW50ZXJmYWNlIFN1Ym1pdEZvcm0ge1xuICBldmVudDogUmVhY3QuRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD47XG4gIGFjdGlvbjogc3RyaW5nO1xuICBvblN1Ym1pdD86IFB1bHNlRm9ybVByb3BzW1wib25TdWJtaXRcIl07XG4gIGZvcm1EYXRhPzogRm9ybURhdGE7XG4gIGZvcmNlPzogYm9vbGVhblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3VibWl0Rm9ybSh7XG4gIGV2ZW50LFxuICBhY3Rpb24sXG4gIG9uU3VibWl0LFxuICBmb3JtRGF0YSxcbiAgZm9yY2Vcbn06IFN1Ym1pdEZvcm0pIHtcbiAgb25TdWJtaXQ/LihldmVudCk7XG4gIGlmICghZm9yY2UgJiYgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmb3JtID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3QgbmF0aXZlRXZlbnQgPSBldmVudC5uYXRpdmVFdmVudCBhcyBTdWJtaXRFdmVudDtcbiAgaWYgKCFmb3JtRGF0YSkge1xuICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0sIG5hdGl2ZUV2ZW50LnN1Ym1pdHRlcik7XG4gIH1cbiAgY29uc3QgdXJsID0gbmV3IFVSTChhY3Rpb24sIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAvLyBSZXF1aXJlZCBmb3Igb3VyIGhvc3Rpbmcgc2NlbmFyaW9zIG9mIHNhbWUgaG9zdCArIGRpZmZlcmVudCBwb3J0cyBvciAyIHN1YmRvbWFpbnNcbiAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW1B1bHNlXSBGb3JtIHN1Ym1pc3Npb24gZmFpbGVkXCIsIGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlck1lc3NhZ2UsIENsaWVudE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHJhbnNwb3J0IEFic3RyYWN0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlTGlzdGVuZXIgPSAobWVzc2FnZTogU2VydmVyTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwb3J0IHtcbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPjtcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU29ja2V0LklPIFRyYW5zcG9ydFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFNvY2tldElPVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IENsaWVudE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdXJsOiBzdHJpbmcpIHt9XG5cbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiXSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGVkOlwiLCB0aGlzLnNvY2tldD8uaWQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nIHF1ZXVlZCBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgICAgICB0aGlzLnNvY2tldD8uZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnModHJ1ZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0aW9uIGZhaWxlZDpcIiwgZXJyKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGE6IFNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIGRhdGEpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyPy4oZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5saXN0ZW5lciA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEluLU1lbW9yeSBUcmFuc3BvcnQgKGZvciB0ZXN0aW5nKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5VHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gU2ltdWxhdGUgc2VydmVyLXNpZGUgbWVzc2FnZSBkaXNwYXRjaGluZ1xuICBwdWJsaWMgZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xuICAgICAgLy8gU2ltdWxhdGUgYXN5bmMgYmVoYXZpb3JcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5saXN0ZW5lcj8uKG1lc3NhZ2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBDb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBEaXNjb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltJbk1lbW9yeVRyYW5zcG9ydF0gTm90IGNvbm5lY3RlZC5cIik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBbSW5NZW1vcnlUcmFuc3BvcnRdIFNlbnQgbWVzc2FnZTpgLCBwYXlsb2FkKTtcbiAgICAvLyBJbiBhIHJlYWwgdGVzdCBzZXR1cCwgdGhpcyBtaWdodCB0cmlnZ2VyIGEgc2ltdWxhdGVkIHNlcnZlciByZXNwb25zZVxuICAgIC8vIHZpYSBgZGlzcGF0Y2hNZXNzYWdlYC5cbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2FkZXJGdW5jdGlvbkFyZ3MgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgcGF0aG5hbWU6IHN0cmluZztcbiAgaGFzaDogc3RyaW5nO1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGF0aFBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgY2F0Y2hhbGw6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlcnZlclJvdXRlSW5mbyh7XG4gIHBhcmFtcyxcbiAgcmVxdWVzdCxcbn06IExvYWRlckZ1bmN0aW9uQXJncykge1xuICBjb25zdCB7IFwiKlwiOiBjYXRjaGFsbCA9IFwiXCIsIC4uLnBhdGhQYXJhbXMgfSA9IHBhcmFtcztcbiAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBwYXJzZWRVcmwuaGFzaCxcbiAgICBwYXRobmFtZTogcGFyc2VkVXJsLnBhdGhuYW1lLFxuICAgIHF1ZXJ5OiBwYXJzZWRVcmwuc2VhcmNoLFxuICAgIHF1ZXJ5UGFyYW1zOiBPYmplY3QuZnJvbUVudHJpZXMocGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpLFxuICAgIHBhdGhQYXJhbXMsXG4gICAgY2F0Y2hhbGw6IGNhdGNoYWxsLmxlbmd0aCA+IDEgPyBjYXRjaGFsbC5zcGxpdChcIi9cIikgOiBbXSxcbiAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xufSIsCiAgICAiLy8gU2VyaWFsaXphdGlvbiBoZWxwZXJzIHRoYXQgc3VwcG9ydDpcbi8vIC0gQ2lyY3VsYXIgcmVmZXJlbmNlcyB2aWEgb2JqZWN0IGlkZW50aXR5IHJlZnNcbi8vIC0gRGF0ZSBpbnN0YW5jZXMg4oaSIHsgX190OiBcImRhdGV0aW1lXCIsIHRpbWVzdGFtcCB9XG4vLyAtIEZvcm1EYXRhIOKGkiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHMgfVxuLy8gLSBGaWxlIOKGkiB7IF9fdDogXCJmaWxlXCIsIG5hbWUsIHR5cGUsIHNpemUsIGxhc3RNb2RpZmllZCwgY29udGVudDogbnVtYmVyW10gfVxuLy8gQWxvbmcgd2l0aCBhIGRlY29kZXIgZm9yIHRoZSBzeW1tZXRyaWMgc2hhcGVzICh3ZSBkbyBub3QgcmVjb25zdHJ1Y3QgRmlsZS9Gb3JtRGF0YSBvYmplY3RzKS5cblxudHlwZSBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCI7IGlkOiBudW1iZXIgfTtcbnR5cGUgRW5jb2RlZEFycmF5ID0geyBfX3Q6IFwiYXJyYXlcIjsgX19pZDogbnVtYmVyOyBpdGVtczogdW5rbm93bltdIH07XG50eXBlIEVuY29kZWRPYmplY3QgPSB7XG4gIF9fdDogXCJvYmplY3RcIjtcbiAgX19pZDogbnVtYmVyO1xuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xudHlwZSBFbmNvZGVkRGF0ZSA9IHsgX190OiBcImRhdGV0aW1lXCI7IHRpbWVzdGFtcDogbnVtYmVyIH07XG50eXBlIEVuY29kZWRGaWxlID0ge1xuICBfX3Q6IFwiZmlsZVwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xuICBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgY29udGVudDogbnVtYmVyW107IC8vIHJhdyBieXRlcyBhcyBhIEpTT04tc2FmZSBudW1iZXIgYXJyYXlcbn07XG50eXBlIEVuY29kZWRGb3JtRGF0YSA9IHtcbiAgX190OiBcImZvcm1kYXRhXCI7XG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT47XG59O1xuXG50eXBlIElkZW50aXR5TWFwID0gV2Vha01hcDxvYmplY3QsIG51bWJlcj47XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cblxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG59XG5cbmZ1bmN0aW9uIGlzU2tpcHBhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCJcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsZVRvQnl0ZUFycmF5KGZpbGU6IEZpbGUpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIGNvbnN0IGFiID0gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShhYikpO1xufVxuXG5pbnRlcmZhY2UgRW5jb2RlQ29udGV4dCB7XG4gIHNlZW46IElkZW50aXR5TWFwO1xuICBuZXh0SWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY29kZUZvcldpcmUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY3R4OiBFbmNvZGVDb250ZXh0ID0geyBzZWVuOiBuZXcgV2Vha01hcCgpLCBuZXh0SWQ6IDEgfTtcbiAgcmV0dXJuIGF3YWl0IGVuY29kZVJlY3Vyc2l2ZShpbnB1dCwgY3R4KTtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXIoY3R4OiBFbmNvZGVDb250ZXh0LCBvYmo6IG9iamVjdCk6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBleGlzdGluZyA9IGN0eC5zZWVuLmdldChvYmopO1xuICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGlkID0gY3R4Lm5leHRJZCsrO1xuICBjdHguc2Vlbi5zZXQob2JqLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5jb2RlUmVjdXJzaXZlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY3R4OiBFbmNvZGVDb250ZXh0XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZXMgZmlyc3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBhcyBEYXRlO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWREYXRlID0geyBfX3Q6IFwiZGF0ZXRpbWVcIiwgdGltZXN0YW1wOiBkYXRlLmdldFRpbWUoKSB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICBjb25zdCBpZCA9IHJlbWVtYmVyKGN0eCwgdmFsdWUpO1xuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgX190OiBcInJlZlwiLCBpZDogY3R4LnNlZW4uZ2V0KHZhbHVlIGFzIG9iamVjdCkhIH0gYXMgRW5jb2RlZFJlZjtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdl0gb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbmNvZGVkVmFsID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYgYXMgdW5rbm93biwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkVmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChlbmNvZGVkVmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZHNba2V5XSA9IFtleGlzdGluZywgZW5jb2RlZFZhbF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gZW5jb2RlZFZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEZvcm1EYXRhICYgeyBfX2lkOiBudW1iZXIgfSA9IHtcbiAgICAgIF9fdDogXCJmb3JtZGF0YVwiLFxuICAgICAgZmllbGRzLFxuICAgICAgX19pZDogaWQsXG4gICAgfSBhcyBhbnk7XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgY29uc3QgZmlsZSA9IHZhbHVlO1xuICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgZmlsZVRvQnl0ZUFycmF5KHZhbHVlKTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRmlsZSA9IHtcbiAgICAgIF9fdDogXCJmaWxlXCIsXG4gICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgY29udGVudDogYnl0ZXMsXG4gICAgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIC8vIElkZW50aXR5IC8gY2lyY3VsYXIgcmVmZXJlbmNlIGhhbmRsaW5nXG4gIGNvbnN0IG9iamVjdCA9IHZhbHVlIGFzIG9iamVjdDtcbiAgY29uc3QgZXhpc3RpbmdJZCA9IGN0eC5zZWVuLmdldChvYmplY3QpO1xuICBpZiAoZXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmVmOiBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCIsIGlkOiBleGlzdGluZ0lkIH07XG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuICBjb25zdCB0aGlzSWQgPSBjdHgubmV4dElkKys7XG4gIGN0eC5zZWVuLnNldChvYmplY3QsIHRoaXNJZCk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgaXRlbXNSYXcgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICh2YWx1ZSBhcyB1bmtub3duW10pLm1hcCgoaXRlbSkgPT4gZW5jb2RlUmVjdXJzaXZlKGl0ZW0sIGN0eCkpXG4gICAgKTtcbiAgICBjb25zdCBpdGVtcyA9IGl0ZW1zUmF3LmZpbHRlcigoaXQpID0+IGl0ICE9PSB1bmRlZmluZWQpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkQXJyYXkgPSB7IF9fdDogXCJhcnJheVwiLCBfX2lkOiB0aGlzSWQsIGl0ZW1zIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICAvLyBQbGFpbiBvYmplY3Qgb3Igb3RoZXIgb2JqZWN0IHR5cGVzXG4gIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHYgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5jb2RlZFYgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkViAhPT0gdW5kZWZpbmVkKSBwcm9wc1trZXldID0gZW5jb2RlZFY7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vbi1wbGFpbiBvYmplY3RzOiBiZXN0IGVmZm9ydCDigJMgZW51bWVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRWID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYsIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFYgIT09IHVuZGVmaW5lZCkgcHJvcHNba2V5XSA9IGVuY29kZWRWO1xuICAgIH1cbiAgfVxuICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkT2JqZWN0ID0geyBfX3Q6IFwib2JqZWN0XCIsIF9faWQ6IHRoaXNJZCwgcHJvcHMgfTtcbiAgcmV0dXJuIGVuY29kZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGcm9tV2lyZShpbnB1dDogdW5rbm93bik6IHVua25vd24ge1xuICByZXR1cm4gZGVjb2RlUmVjdXJzaXZlKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUmVjdXJzaXZlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdGFnID0gb2JqW1wiX190XCJdO1xuXG4gIGlmICh0YWcgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgIGNvbnN0IHRzID0gb2JqW1widGltZXN0YW1wXCJdIGFzIG51bWJlcjtcbiAgICByZXR1cm4gbmV3IERhdGUodHMpO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmaWxlXCIpIHtcbiAgICAvLyBEbyBub3QgcmVjb25zdHJ1Y3QgRmlsZTsga2VlcCBhcyBwbGFpbiBvYmplY3QuIE9wdGlvbmFsbHksIHR1cm4gY29udGVudCBpbnRvIFVpbnQ4QXJyYXkgZm9yIGNvbnZlbmllbmNlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBvYmpbXCJjb250ZW50XCJdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgICAvLyBSZXR1cm4gYSBzaGFsbG93IGNsb25lIHdpdGggVWludDhBcnJheSBmb3IgY29udGVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub2JqLFxuICAgICAgICBjb250ZW50OiBuZXcgVWludDhBcnJheShjb250ZW50IGFzIG51bWJlcltdKSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmb3JtZGF0YVwiKSB7XG4gICAgLy8gS2VlcCBhcy1pcyAocGxhaW4gb2JqZWN0KSwgYnV0IGRlY29kZSBuZXN0ZWQgdmFsdWVzXG4gICAgY29uc3QgZmllbGRzID0gb2JqW1wiZmllbGRzXCJdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+O1xuICAgIGNvbnN0IGRlY29kZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmllbGRzKSkge1xuICAgICAgY29uc3QgdiA9IGZpZWxkc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgZGVjb2RlZEZpZWxkc1trZXldID0gdi5tYXAoKHgpID0+IGRlY29kZVJlY3Vyc2l2ZSh4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVkRmllbGRzW2tleV0gPSBkZWNvZGVSZWN1cnNpdmUodik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHM6IGRlY29kZWRGaWVsZHMgfSBhcyBFbmNvZGVkRm9ybURhdGE7XG4gIH1cblxuICBpZiAodGFnID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBpdGVtcyA9IChvYmpbXCJpdGVtc1wiXSBhcyB1bmtub3duW10pLm1hcCgoeCkgPT4gZGVjb2RlUmVjdXJzaXZlKHgpKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBpZiAodGFnID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcHJvcHMgPSBvYmpbXCJwcm9wc1wiXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvcHMpKSB7XG4gICAgICBvdXRba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZShwcm9wc1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwicmVmXCIpIHtcbiAgICAvLyBXaXRob3V0IGEgcmVjb25zdHJ1Y3Rpb24gY29udGV4dCBvbiB0aGUgY2xpZW50LCBsZWF2ZSBhcy1pcy5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLy8gVW5rbm93biBvYmplY3Qg4oCTIGRlc2NlbmQgc2hhbGxvd2x5XG4gIGNvbnN0IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICBjb3B5W2tleV0gPSBkZWNvZGVSZWN1cnNpdmUob2JqW2tleV0pO1xuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vLyBMZWdhY3kgY2xlYW5lciBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdoZXJlIGEgcXVpY2sgYmVzdC1lZmZvcnQgSlNPTi1zYWZlIHNoYXBlIGlzIG5lZWRlZFxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuRm9yU2VyaWFsaXphdGlvbihvYmo6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGNsZWFuUmVjdXJzaXZlKG9iaiwgbmV3IFdlYWtTZXQoKSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVjdXJzaXZlKG9iajogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKHNlZW4uaGFzKG9iaiBhcyBvYmplY3QpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBzZWVuLmFkZChvYmogYXMgb2JqZWN0KTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiAob2JqIGFzIHVua25vd25bXSlcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGNsZWFuUmVjdXJzaXZlKGl0ZW0sIHNlZW4pKVxuICAgICAgLmZpbHRlcigoeCkgPT4geCAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IHYgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgY29uc3QgY2xlYW5lZCA9IGNsZWFuUmVjdXJzaXZlKHYsIHNlZW4pO1xuICAgIGlmIChjbGVhbmVkICE9PSB1bmRlZmluZWQpIG91dFtrZXldID0gY2xlYW5lZDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLG9CQUNFLGNBQ0EsYUFDQSxtQkFDQSxpQkFDQSxlQ0xGLDJCQUNFLG1CQUNBLHFCQUNBLFdBQ0EsZUFDQSxlQ0ZLLElBQU0sR0FBZSxhQUNmLEdBQXFCLEtBMkczQixTQUFTLEVBQWEsQ0FBQyxFQUFxQyxDQUVqRSxPQUFPLE9BQU8sSUFBUyxVQUFZLElBQVMsS0FHdkMs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