@nsshunt/stsoauth2plugin 0.1.9 → 0.1.12

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.
@@ -0,0 +1,6 @@
1
+ var xo=Object.defineProperty,zo=Object.defineProperties;var wo=Object.getOwnPropertyDescriptors;var kn=Object.getOwnPropertySymbols;var Po=Object.prototype.hasOwnProperty,Bo=Object.prototype.propertyIsEnumerable;var Et=(M,E,ae)=>E in M?xo(M,E,{enumerable:!0,configurable:!0,writable:!0,value:ae}):M[E]=ae,A=(M,E)=>{for(var ae in E||(E={}))Po.call(E,ae)&&Et(M,ae,E[ae]);if(kn)for(var ae of kn(E))Bo.call(E,ae)&&Et(M,ae,E[ae]);return M},Ze=(M,E)=>zo(M,wo(E));var tc=(M,E,ae)=>(Et(M,typeof E!="symbol"?E+"":E,ae),ae),Fn=(M,E,ae)=>{if(!E.has(M))throw TypeError("Cannot "+ae)};var O=(M,E,ae)=>(Fn(M,E,"read from private field"),ae?ae.call(M):E.get(M)),pe=(M,E,ae)=>{if(E.has(M))throw TypeError("Cannot add the same private member more than once");E instanceof WeakSet?E.add(M):E.set(M,ae)},ce=(M,E,ae,ze)=>(Fn(M,E,"write to private field"),ze?ze.call(M,ae):E.set(M,ae),ae),Un=(M,E,ae,ze)=>({set _(ol){ce(M,E,ol,ae)},get _(){return O(M,E,ze)}});(function(M,E){typeof exports=="object"&&typeof module!="undefined"?E(exports):typeof define=="function"&&define.amd?define(["exports"],E):(M=typeof globalThis!="undefined"?globalThis:M||self,E(M.stsoauth2plugin={}))})(this,function(M){var gl,pl,hc,Hl,Gl,$c,qc,kl,et,pc,Fl,lt,Ml,Gc,Vl,Ol,Wl,Xl,Vc,sl,Wc,Xc,yc,Yc;"use strict";var E=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},ae={exports:{}},ze=1e3,ol=ze*60,zl=ol*60,Yl=zl*24,vn=Yl*7,Tn=Yl*365.25,xn=function(e,l){l=l||{};var c=typeof e;if(c==="string"&&e.length>0)return zn(e);if(c==="number"&&isFinite(e))return l.long?Pn(e):wn(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function zn(e){if(e=String(e),!(e.length>100)){var l=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!!l){var c=parseFloat(l[1]),t=(l[2]||"ms").toLowerCase();switch(t){case"years":case"year":case"yrs":case"yr":case"y":return c*Tn;case"weeks":case"week":case"w":return c*vn;case"days":case"day":case"d":return c*Yl;case"hours":case"hour":case"hrs":case"hr":case"h":return c*zl;case"minutes":case"minute":case"mins":case"min":case"m":return c*ol;case"seconds":case"second":case"secs":case"sec":case"s":return c*ze;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}}}function wn(e){var l=Math.abs(e);return l>=Yl?Math.round(e/Yl)+"d":l>=zl?Math.round(e/zl)+"h":l>=ol?Math.round(e/ol)+"m":l>=ze?Math.round(e/ze)+"s":e+"ms"}function Pn(e){var l=Math.abs(e);return l>=Yl?gc(e,l,Yl,"day"):l>=zl?gc(e,l,zl,"hour"):l>=ol?gc(e,l,ol,"minute"):l>=ze?gc(e,l,ze,"second"):e+" ms"}function gc(e,l,c,t){var i=l>=c*1.5;return Math.round(e/c)+" "+t+(i?"s":"")}function Bn(e){c.debug=c,c.default=c,c.coerce=p,c.disable=n,c.enable=i,c.enabled=a,c.humanize=xn,c.destroy=r,Object.keys(e).forEach(o=>{c[o]=e[o]}),c.names=[],c.skips=[],c.formatters={};function l(o){let h=0;for(let S=0;S<o.length;S++)h=(h<<5)-h+o.charCodeAt(S),h|=0;return c.colors[Math.abs(h)%c.colors.length]}c.selectColor=l;function c(o){let h,S=null,H,C;function k(...Y){if(!k.enabled)return;const G=k,f=Number(new Date),L=f-(h||f);G.diff=L,G.prev=h,G.curr=f,h=f,Y[0]=c.coerce(Y[0]),typeof Y[0]!="string"&&Y.unshift("%O");let N=0;Y[0]=Y[0].replace(/%([a-zA-Z%])/g,(W,R)=>{if(W==="%%")return"%";N++;const g=c.formatters[R];if(typeof g=="function"){const B=Y[N];W=g.call(G,B),Y.splice(N,1),N--}return W}),c.formatArgs.call(G,Y),(G.log||c.log).apply(G,Y)}return k.namespace=o,k.useColors=c.useColors(),k.color=c.selectColor(o),k.extend=t,k.destroy=c.destroy,Object.defineProperty(k,"enabled",{enumerable:!0,configurable:!1,get:()=>S!==null?S:(H!==c.namespaces&&(H=c.namespaces,C=c.enabled(o)),C),set:Y=>{S=Y}}),typeof c.init=="function"&&c.init(k),k}function t(o,h){const S=c(this.namespace+(typeof h=="undefined"?":":h)+o);return S.log=this.log,S}function i(o){c.save(o),c.namespaces=o,c.names=[],c.skips=[];let h;const S=(typeof o=="string"?o:"").split(/[\s,]+/),H=S.length;for(h=0;h<H;h++)!S[h]||(o=S[h].replace(/\*/g,".*?"),o[0]==="-"?c.skips.push(new RegExp("^"+o.slice(1)+"$")):c.names.push(new RegExp("^"+o+"$")))}function n(){const o=[...c.names.map(b),...c.skips.map(b).map(h=>"-"+h)].join(",");return c.enable(""),o}function a(o){if(o[o.length-1]==="*")return!0;let h,S;for(h=0,S=c.skips.length;h<S;h++)if(c.skips[h].test(o))return!1;for(h=0,S=c.names.length;h<S;h++)if(c.names[h].test(o))return!0;return!1}function b(o){return o.toString().substring(2,o.toString().length-2).replace(/\.\*\?$/,"*")}function p(o){return o instanceof Error?o.stack||o.message:o}function r(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return c.enable(c.load()),c}var En=Bn;(function(e,l){l.formatArgs=t,l.save=i,l.load=n,l.useColors=c,l.storage=a(),l.destroy=(()=>{let p=!1;return()=>{p||(p=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),l.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function c(){return typeof window!="undefined"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator!="undefined"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document!="undefined"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window!="undefined"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator!="undefined"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator!="undefined"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function t(p){if(p[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+p[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const r="color: "+this.color;p.splice(1,0,r,"color: inherit");let o=0,h=0;p[0].replace(/%[a-zA-Z%]/g,S=>{S!=="%%"&&(o++,S==="%c"&&(h=o))}),p.splice(h,0,r)}l.log=console.debug||console.log||(()=>{});function i(p){try{p?l.storage.setItem("debug",p):l.storage.removeItem("debug")}catch{}}function n(){let p;try{p=l.storage.getItem("debug")}catch{}return!p&&typeof process!="undefined"&&"env"in process&&(p={}.DEBUG),p}function a(){try{return localStorage}catch{}}e.exports=En(l);const{formatters:b}=e.exports;b.j=function(p){try{return JSON.stringify(p)}catch(r){return"[UnexpectedJSONParseError]: "+r.message}}})(ae,ae.exports);var jt=ae.exports,Hc={},kc={};Object.defineProperty(kc,"__esModule",{value:!0}),kc.GetErrorPayload=void 0;function jn(e,l=null){return{error:e.code,error_description:e.description,timestamp:Date.now(),details:l}}kc.GetErrorPayload=jn;var Fc={},Il={},dt={exports:{}},Qt={},Be={},wl={},ic={},oe={},nc={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.regexpCode=e.getEsmExportName=e.getProperty=e.safeStringify=e.stringify=e.strConcat=e.addCodeArg=e.str=e._=e.nil=e._Code=e.Name=e.IDENTIFIER=e._CodeOrName=void 0;class l{}e._CodeOrName=l,e.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;class c extends l{constructor(f){if(super(),!e.IDENTIFIER.test(f))throw new Error("CodeGen: name must be a valid identifier");this.str=f}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}}e.Name=c;class t extends l{constructor(f){super(),this._items=typeof f=="string"?[f]:f}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;const f=this._items[0];return f===""||f==='""'}get str(){var f;return(f=this._str)!==null&&f!==void 0?f:this._str=this._items.reduce((L,N)=>`${L}${N}`,"")}get names(){var f;return(f=this._names)!==null&&f!==void 0?f:this._names=this._items.reduce((L,N)=>(N instanceof c&&(L[N.str]=(L[N.str]||0)+1),L),{})}}e._Code=t,e.nil=new t("");function i(G,...f){const L=[G[0]];let N=0;for(;N<f.length;)b(L,f[N]),L.push(G[++N]);return new t(L)}e._=i;const n=new t("+");function a(G,...f){const L=[H(G[0])];let N=0;for(;N<f.length;)L.push(n),b(L,f[N]),L.push(n,H(G[++N]));return p(L),new t(L)}e.str=a;function b(G,f){f instanceof t?G.push(...f._items):f instanceof c?G.push(f):G.push(h(f))}e.addCodeArg=b;function p(G){let f=1;for(;f<G.length-1;){if(G[f]===n){const L=r(G[f-1],G[f+1]);if(L!==void 0){G.splice(f-1,3,L);continue}G[f++]="+"}f++}}function r(G,f){if(f==='""')return G;if(G==='""')return f;if(typeof G=="string")return f instanceof c||G[G.length-1]!=='"'?void 0:typeof f!="string"?`${G.slice(0,-1)}${f}"`:f[0]==='"'?G.slice(0,-1)+f.slice(1):void 0;if(typeof f=="string"&&f[0]==='"'&&!(G instanceof c))return`"${G}${f.slice(1)}`}function o(G,f){return f.emptyStr()?G:G.emptyStr()?f:a`${G}${f}`}e.strConcat=o;function h(G){return typeof G=="number"||typeof G=="boolean"||G===null?G:H(Array.isArray(G)?G.join(","):G)}function S(G){return new t(H(G))}e.stringify=S;function H(G){return JSON.stringify(G).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}e.safeStringify=H;function C(G){return typeof G=="string"&&e.IDENTIFIER.test(G)?new t(`.${G}`):i`[${G}]`}e.getProperty=C;function k(G){if(typeof G=="string"&&e.IDENTIFIER.test(G))return new t(`${G}`);throw new Error(`CodeGen: invalid export name: ${G}, use explicit $id name mapping`)}e.getEsmExportName=k;function Y(G){return new t(G.toString())}e.regexpCode=Y})(nc);var st={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.ValueScope=e.ValueScopeName=e.Scope=e.varKinds=e.UsedValueState=void 0;const l=nc;class c extends Error{constructor(r){super(`CodeGen: "code" for ${r} not defined`),this.value=r.value}}var t;(function(p){p[p.Started=0]="Started",p[p.Completed=1]="Completed"})(t=e.UsedValueState||(e.UsedValueState={})),e.varKinds={const:new l.Name("const"),let:new l.Name("let"),var:new l.Name("var")};class i{constructor({prefixes:r,parent:o}={}){this._names={},this._prefixes=r,this._parent=o}toName(r){return r instanceof l.Name?r:this.name(r)}name(r){return new l.Name(this._newName(r))}_newName(r){const o=this._names[r]||this._nameGroup(r);return`${r}${o.index++}`}_nameGroup(r){var o,h;if(((h=(o=this._parent)===null||o===void 0?void 0:o._prefixes)===null||h===void 0?void 0:h.has(r))||this._prefixes&&!this._prefixes.has(r))throw new Error(`CodeGen: prefix "${r}" is not allowed in this scope`);return this._names[r]={prefix:r,index:0}}}e.Scope=i;class n extends l.Name{constructor(r,o){super(o),this.prefix=r}setValue(r,{property:o,itemIndex:h}){this.value=r,this.scopePath=(0,l._)`.${new l.Name(o)}[${h}]`}}e.ValueScopeName=n;const a=(0,l._)`\n`;class b extends i{constructor(r){super(r),this._values={},this._scope=r.scope,this.opts=Ze(A({},r),{_n:r.lines?a:l.nil})}get(){return this._scope}name(r){return new n(r,this._newName(r))}value(r,o){var h;if(o.ref===void 0)throw new Error("CodeGen: ref must be passed in value");const S=this.toName(r),{prefix:H}=S,C=(h=o.key)!==null&&h!==void 0?h:o.ref;let k=this._values[H];if(k){const f=k.get(C);if(f)return f}else k=this._values[H]=new Map;k.set(C,S);const Y=this._scope[H]||(this._scope[H]=[]),G=Y.length;return Y[G]=o.ref,S.setValue(o,{property:H,itemIndex:G}),S}getValue(r,o){const h=this._values[r];if(!!h)return h.get(o)}scopeRefs(r,o=this._values){return this._reduceValues(o,h=>{if(h.scopePath===void 0)throw new Error(`CodeGen: name "${h}" has no value`);return(0,l._)`${r}${h.scopePath}`})}scopeCode(r=this._values,o,h){return this._reduceValues(r,S=>{if(S.value===void 0)throw new Error(`CodeGen: name "${S}" has no value`);return S.value.code},o,h)}_reduceValues(r,o,h={},S){let H=l.nil;for(const C in r){const k=r[C];if(!k)continue;const Y=h[C]=h[C]||new Map;k.forEach(G=>{if(Y.has(G))return;Y.set(G,t.Started);let f=o(G);if(f){const L=this.opts.es5?e.varKinds.var:e.varKinds.const;H=(0,l._)`${H}${L} ${G} = ${f};${this.opts._n}`}else if(f=S==null?void 0:S(G))H=(0,l._)`${H}${f}${this.opts._n}`;else throw new c(G);Y.set(G,t.Completed)})}return H}}e.ValueScope=b})(st),function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.or=e.and=e.not=e.CodeGen=e.operators=e.varKinds=e.ValueScopeName=e.ValueScope=e.Scope=e.Name=e.regexpCode=e.stringify=e.getProperty=e.nil=e.strConcat=e.str=e._=void 0;const l=nc,c=st;var t=nc;Object.defineProperty(e,"_",{enumerable:!0,get:function(){return t._}}),Object.defineProperty(e,"str",{enumerable:!0,get:function(){return t.str}}),Object.defineProperty(e,"strConcat",{enumerable:!0,get:function(){return t.strConcat}}),Object.defineProperty(e,"nil",{enumerable:!0,get:function(){return t.nil}}),Object.defineProperty(e,"getProperty",{enumerable:!0,get:function(){return t.getProperty}}),Object.defineProperty(e,"stringify",{enumerable:!0,get:function(){return t.stringify}}),Object.defineProperty(e,"regexpCode",{enumerable:!0,get:function(){return t.regexpCode}}),Object.defineProperty(e,"Name",{enumerable:!0,get:function(){return t.Name}});var i=st;Object.defineProperty(e,"Scope",{enumerable:!0,get:function(){return i.Scope}}),Object.defineProperty(e,"ValueScope",{enumerable:!0,get:function(){return i.ValueScope}}),Object.defineProperty(e,"ValueScopeName",{enumerable:!0,get:function(){return i.ValueScopeName}}),Object.defineProperty(e,"varKinds",{enumerable:!0,get:function(){return i.varKinds}}),e.operators={GT:new l._Code(">"),GTE:new l._Code(">="),LT:new l._Code("<"),LTE:new l._Code("<="),EQ:new l._Code("==="),NEQ:new l._Code("!=="),NOT:new l._Code("!"),OR:new l._Code("||"),AND:new l._Code("&&"),ADD:new l._Code("+")};class n{optimizeNodes(){return this}optimizeNames(d,m){return this}}class a extends n{constructor(d,m,J){super(),this.varKind=d,this.name=m,this.rhs=J}render({es5:d,_n:m}){const J=d?c.varKinds.var:this.varKind,U=this.rhs===void 0?"":` = ${this.rhs}`;return`${J} ${this.name}${U};`+m}optimizeNames(d,m){if(!!d[this.name.str])return this.rhs&&(this.rhs=q(this.rhs,d,m)),this}get names(){return this.rhs instanceof l._CodeOrName?this.rhs.names:{}}}class b extends n{constructor(d,m,J){super(),this.lhs=d,this.rhs=m,this.sideEffects=J}render({_n:d}){return`${this.lhs} = ${this.rhs};`+d}optimizeNames(d,m){if(!(this.lhs instanceof l.Name&&!d[this.lhs.str]&&!this.sideEffects))return this.rhs=q(this.rhs,d,m),this}get names(){const d=this.lhs instanceof l.Name?{}:A({},this.lhs.names);return se(d,this.rhs)}}class p extends b{constructor(d,m,J,U){super(d,J,U),this.op=m}render({_n:d}){return`${this.lhs} ${this.op}= ${this.rhs};`+d}}class r extends n{constructor(d){super(),this.label=d,this.names={}}render({_n:d}){return`${this.label}:`+d}}class o extends n{constructor(d){super(),this.label=d,this.names={}}render({_n:d}){return`break${this.label?` ${this.label}`:""};`+d}}class h extends n{constructor(d){super(),this.error=d}render({_n:d}){return`throw ${this.error};`+d}get names(){return this.error.names}}class S extends n{constructor(d){super(),this.code=d}render({_n:d}){return`${this.code};`+d}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(d,m){return this.code=q(this.code,d,m),this}get names(){return this.code instanceof l._CodeOrName?this.code.names:{}}}class H extends n{constructor(d=[]){super(),this.nodes=d}render(d){return this.nodes.reduce((m,J)=>m+J.render(d),"")}optimizeNodes(){const{nodes:d}=this;let m=d.length;for(;m--;){const J=d[m].optimizeNodes();Array.isArray(J)?d.splice(m,1,...J):J?d[m]=J:d.splice(m,1)}return d.length>0?this:void 0}optimizeNames(d,m){const{nodes:J}=this;let U=J.length;for(;U--;){const v=J[U];v.optimizeNames(d,m)||(Ge(d,v.names),J.splice(U,1))}return J.length>0?this:void 0}get names(){return this.nodes.reduce((d,m)=>$(d,m.names),{})}}class C extends H{render(d){return"{"+d._n+super.render(d)+"}"+d._n}}class k extends H{}class Y extends C{}Y.kind="else";class G extends C{constructor(d,m){super(m),this.condition=d}render(d){let m=`if(${this.condition})`+super.render(d);return this.else&&(m+="else "+this.else.render(d)),m}optimizeNodes(){super.optimizeNodes();const d=this.condition;if(d===!0)return this.nodes;let m=this.else;if(m){const J=m.optimizeNodes();m=this.else=Array.isArray(J)?new Y(J):J}if(m)return d===!1?m instanceof G?m:m.nodes:this.nodes.length?this:new G(Xe(d),m instanceof G?[m]:m.nodes);if(!(d===!1||!this.nodes.length))return this}optimizeNames(d,m){var J;if(this.else=(J=this.else)===null||J===void 0?void 0:J.optimizeNames(d,m),!!(super.optimizeNames(d,m)||this.else))return this.condition=q(this.condition,d,m),this}get names(){const d=super.names;return se(d,this.condition),this.else&&$(d,this.else.names),d}}G.kind="if";class f extends C{}f.kind="for";class L extends f{constructor(d){super(),this.iteration=d}render(d){return`for(${this.iteration})`+super.render(d)}optimizeNames(d,m){if(!!super.optimizeNames(d,m))return this.iteration=q(this.iteration,d,m),this}get names(){return $(super.names,this.iteration.names)}}class N extends f{constructor(d,m,J,U){super(),this.varKind=d,this.name=m,this.from=J,this.to=U}render(d){const m=d.es5?c.varKinds.var:this.varKind,{name:J,from:U,to:v}=this;return`for(${m} ${J}=${U}; ${J}<${v}; ${J}++)`+super.render(d)}get names(){const d=se(super.names,this.from);return se(d,this.to)}}class P extends f{constructor(d,m,J,U){super(),this.loop=d,this.varKind=m,this.name=J,this.iterable=U}render(d){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(d)}optimizeNames(d,m){if(!!super.optimizeNames(d,m))return this.iterable=q(this.iterable,d,m),this}get names(){return $(super.names,this.iterable.names)}}class W extends C{constructor(d,m,J){super(),this.name=d,this.args=m,this.async=J}render(d){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(d)}}W.kind="func";class R extends H{render(d){return"return "+super.render(d)}}R.kind="return";class g extends C{render(d){let m="try"+super.render(d);return this.catch&&(m+=this.catch.render(d)),this.finally&&(m+=this.finally.render(d)),m}optimizeNodes(){var d,m;return super.optimizeNodes(),(d=this.catch)===null||d===void 0||d.optimizeNodes(),(m=this.finally)===null||m===void 0||m.optimizeNodes(),this}optimizeNames(d,m){var J,U;return super.optimizeNames(d,m),(J=this.catch)===null||J===void 0||J.optimizeNames(d,m),(U=this.finally)===null||U===void 0||U.optimizeNames(d,m),this}get names(){const d=super.names;return this.catch&&$(d,this.catch.names),this.finally&&$(d,this.finally.names),d}}class B extends C{constructor(d){super(),this.error=d}render(d){return`catch(${this.error})`+super.render(d)}}B.kind="catch";class D extends C{render(d){return"finally"+super.render(d)}}D.kind="finally";class re{constructor(d,m={}){this._values={},this._blockStarts=[],this._constants={},this.opts=Ze(A({},m),{_n:m.lines?`
2
+ `:""}),this._extScope=d,this._scope=new c.Scope({parent:d}),this._nodes=[new k]}toString(){return this._root.render(this.opts)}name(d){return this._scope.name(d)}scopeName(d){return this._extScope.name(d)}scopeValue(d,m){const J=this._extScope.value(d,m);return(this._values[J.prefix]||(this._values[J.prefix]=new Set)).add(J),J}getScopeValue(d,m){return this._extScope.getValue(d,m)}scopeRefs(d){return this._extScope.scopeRefs(d,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(d,m,J,U){const v=this._scope.toName(m);return J!==void 0&&U&&(this._constants[v.str]=J),this._leafNode(new a(d,v,J)),v}const(d,m,J){return this._def(c.varKinds.const,d,m,J)}let(d,m,J){return this._def(c.varKinds.let,d,m,J)}var(d,m,J){return this._def(c.varKinds.var,d,m,J)}assign(d,m,J){return this._leafNode(new b(d,m,J))}add(d,m){return this._leafNode(new p(d,e.operators.ADD,m))}code(d){return typeof d=="function"?d():d!==l.nil&&this._leafNode(new S(d)),this}object(...d){const m=["{"];for(const[J,U]of d)m.length>1&&m.push(","),m.push(J),(J!==U||this.opts.es5)&&(m.push(":"),(0,l.addCodeArg)(m,U));return m.push("}"),new l._Code(m)}if(d,m,J){if(this._blockNode(new G(d)),m&&J)this.code(m).else().code(J).endIf();else if(m)this.code(m).endIf();else if(J)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(d){return this._elseNode(new G(d))}else(){return this._elseNode(new Y)}endIf(){return this._endBlockNode(G,Y)}_for(d,m){return this._blockNode(d),m&&this.code(m).endFor(),this}for(d,m){return this._for(new L(d),m)}forRange(d,m,J,U,v=this.opts.es5?c.varKinds.var:c.varKinds.let){const ee=this._scope.toName(d);return this._for(new N(v,ee,m,J),()=>U(ee))}forOf(d,m,J,U=c.varKinds.const){const v=this._scope.toName(d);if(this.opts.es5){const ee=m instanceof l.Name?m:this.var("_arr",m);return this.forRange("_i",0,(0,l._)`${ee}.length`,ie=>{this.var(v,(0,l._)`${ee}[${ie}]`),J(v)})}return this._for(new P("of",U,v,m),()=>J(v))}forIn(d,m,J,U=this.opts.es5?c.varKinds.var:c.varKinds.const){if(this.opts.ownProperties)return this.forOf(d,(0,l._)`Object.keys(${m})`,J);const v=this._scope.toName(d);return this._for(new P("in",U,v,m),()=>J(v))}endFor(){return this._endBlockNode(f)}label(d){return this._leafNode(new r(d))}break(d){return this._leafNode(new o(d))}return(d){const m=new R;if(this._blockNode(m),this.code(d),m.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(R)}try(d,m,J){if(!m&&!J)throw new Error('CodeGen: "try" without "catch" and "finally"');const U=new g;if(this._blockNode(U),this.code(d),m){const v=this.name("e");this._currNode=U.catch=new B(v),m(v)}return J&&(this._currNode=U.finally=new D,this.code(J)),this._endBlockNode(B,D)}throw(d){return this._leafNode(new h(d))}block(d,m){return this._blockStarts.push(this._nodes.length),d&&this.code(d).endBlock(m),this}endBlock(d){const m=this._blockStarts.pop();if(m===void 0)throw new Error("CodeGen: not in self-balancing block");const J=this._nodes.length-m;if(J<0||d!==void 0&&J!==d)throw new Error(`CodeGen: wrong number of nodes: ${J} vs ${d} expected`);return this._nodes.length=m,this}func(d,m=l.nil,J,U){return this._blockNode(new W(d,m,J)),U&&this.code(U).endFunc(),this}endFunc(){return this._endBlockNode(W)}optimize(d=1){for(;d-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(d){return this._currNode.nodes.push(d),this}_blockNode(d){this._currNode.nodes.push(d),this._nodes.push(d)}_endBlockNode(d,m){const J=this._currNode;if(J instanceof d||m&&J instanceof m)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${m?`${d.kind}/${m.kind}`:d.kind}"`)}_elseNode(d){const m=this._currNode;if(!(m instanceof G))throw new Error('CodeGen: "else" without "if"');return this._currNode=m.else=d,this}get _root(){return this._nodes[0]}get _currNode(){const d=this._nodes;return d[d.length-1]}set _currNode(d){const m=this._nodes;m[m.length-1]=d}}e.CodeGen=re;function $(X,d){for(const m in d)X[m]=(X[m]||0)+(d[m]||0);return X}function se(X,d){return d instanceof l._CodeOrName?$(X,d.names):X}function q(X,d,m){if(X instanceof l.Name)return J(X);if(!U(X))return X;return new l._Code(X._items.reduce((v,ee)=>(ee instanceof l.Name&&(ee=J(ee)),ee instanceof l._Code?v.push(...ee._items):v.push(ee),v),[]));function J(v){const ee=m[v.str];return ee===void 0||d[v.str]!==1?v:(delete d[v.str],ee)}function U(v){return v instanceof l._Code&&v._items.some(ee=>ee instanceof l.Name&&d[ee.str]===1&&m[ee.str]!==void 0)}}function Ge(X,d){for(const m in d)X[m]=(X[m]||0)-(d[m]||0)}function Xe(X){return typeof X=="boolean"||typeof X=="number"||X===null?!X:(0,l._)`!${K(X)}`}e.not=Xe;const fe=V(e.operators.AND);function ve(...X){return X.reduce(fe)}e.and=ve;const Dl=V(e.operators.OR);function F(...X){return X.reduce(Dl)}e.or=F;function V(X){return(d,m)=>d===l.nil?m:m===l.nil?d:(0,l._)`${K(d)} ${X} ${K(m)}`}function K(X){return X instanceof l.Name?X:(0,l._)`(${X})`}}(oe);var Re={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.checkStrictMode=e.getErrorPath=e.Type=e.useFunc=e.setEvaluated=e.evaluatedPropsToName=e.mergeEvaluated=e.eachItem=e.unescapeJsonPointer=e.escapeJsonPointer=e.escapeFragment=e.unescapeFragment=e.schemaRefOrVal=e.schemaHasRulesButRef=e.schemaHasRules=e.checkUnknownRules=e.alwaysValidSchema=e.toHash=void 0;const l=oe,c=nc;function t(W){const R={};for(const g of W)R[g]=!0;return R}e.toHash=t;function i(W,R){return typeof R=="boolean"?R:Object.keys(R).length===0?!0:(n(W,R),!a(R,W.self.RULES.all))}e.alwaysValidSchema=i;function n(W,R=W.schema){const{opts:g,self:B}=W;if(!g.strictSchema||typeof R=="boolean")return;const D=B.RULES.keywords;for(const re in R)D[re]||P(W,`unknown keyword: "${re}"`)}e.checkUnknownRules=n;function a(W,R){if(typeof W=="boolean")return!W;for(const g in W)if(R[g])return!0;return!1}e.schemaHasRules=a;function b(W,R){if(typeof W=="boolean")return!W;for(const g in W)if(g!=="$ref"&&R.all[g])return!0;return!1}e.schemaHasRulesButRef=b;function p({topSchemaRef:W,schemaPath:R},g,B,D){if(!D){if(typeof g=="number"||typeof g=="boolean")return g;if(typeof g=="string")return(0,l._)`${g}`}return(0,l._)`${W}${R}${(0,l.getProperty)(B)}`}e.schemaRefOrVal=p;function r(W){return S(decodeURIComponent(W))}e.unescapeFragment=r;function o(W){return encodeURIComponent(h(W))}e.escapeFragment=o;function h(W){return typeof W=="number"?`${W}`:W.replace(/~/g,"~0").replace(/\//g,"~1")}e.escapeJsonPointer=h;function S(W){return W.replace(/~1/g,"/").replace(/~0/g,"~")}e.unescapeJsonPointer=S;function H(W,R){if(Array.isArray(W))for(const g of W)R(g);else R(W)}e.eachItem=H;function C({mergeNames:W,mergeToName:R,mergeValues:g,resultToName:B}){return(D,re,$,se)=>{const q=$===void 0?re:$ instanceof l.Name?(re instanceof l.Name?W(D,re,$):R(D,re,$),$):re instanceof l.Name?(R(D,$,re),re):g(re,$);return se===l.Name&&!(q instanceof l.Name)?B(D,q):q}}e.mergeEvaluated={props:C({mergeNames:(W,R,g)=>W.if((0,l._)`${g} !== true && ${R} !== undefined`,()=>{W.if((0,l._)`${R} === true`,()=>W.assign(g,!0),()=>W.assign(g,(0,l._)`${g} || {}`).code((0,l._)`Object.assign(${g}, ${R})`))}),mergeToName:(W,R,g)=>W.if((0,l._)`${g} !== true`,()=>{R===!0?W.assign(g,!0):(W.assign(g,(0,l._)`${g} || {}`),Y(W,g,R))}),mergeValues:(W,R)=>W===!0?!0:A(A({},W),R),resultToName:k}),items:C({mergeNames:(W,R,g)=>W.if((0,l._)`${g} !== true && ${R} !== undefined`,()=>W.assign(g,(0,l._)`${R} === true ? true : ${g} > ${R} ? ${g} : ${R}`)),mergeToName:(W,R,g)=>W.if((0,l._)`${g} !== true`,()=>W.assign(g,R===!0?!0:(0,l._)`${g} > ${R} ? ${g} : ${R}`)),mergeValues:(W,R)=>W===!0?!0:Math.max(W,R),resultToName:(W,R)=>W.var("items",R)})};function k(W,R){if(R===!0)return W.var("props",!0);const g=W.var("props",(0,l._)`{}`);return R!==void 0&&Y(W,g,R),g}e.evaluatedPropsToName=k;function Y(W,R,g){Object.keys(g).forEach(B=>W.assign((0,l._)`${R}${(0,l.getProperty)(B)}`,!0))}e.setEvaluated=Y;const G={};function f(W,R){return W.scopeValue("func",{ref:R,code:G[R.code]||(G[R.code]=new c._Code(R.code))})}e.useFunc=f;var L;(function(W){W[W.Num=0]="Num",W[W.Str=1]="Str"})(L=e.Type||(e.Type={}));function N(W,R,g){if(W instanceof l.Name){const B=R===L.Num;return g?B?(0,l._)`"[" + ${W} + "]"`:(0,l._)`"['" + ${W} + "']"`:B?(0,l._)`"/" + ${W}`:(0,l._)`"/" + ${W}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return g?(0,l.getProperty)(W).toString():"/"+h(W)}e.getErrorPath=N;function P(W,R,g=W.opts.strictSchema){if(!!g){if(R=`strict mode: ${R}`,g===!0)throw new Error(R);W.self.logger.warn(R)}}e.checkStrictMode=P})(Re);var ke={};Object.defineProperty(ke,"__esModule",{value:!0});const Je=oe,Qn={data:new Je.Name("data"),valCxt:new Je.Name("valCxt"),instancePath:new Je.Name("instancePath"),parentData:new Je.Name("parentData"),parentDataProperty:new Je.Name("parentDataProperty"),rootData:new Je.Name("rootData"),dynamicAnchors:new Je.Name("dynamicAnchors"),vErrors:new Je.Name("vErrors"),errors:new Je.Name("errors"),this:new Je.Name("this"),self:new Je.Name("self"),scope:new Je.Name("scope"),json:new Je.Name("json"),jsonPos:new Je.Name("jsonPos"),jsonLen:new Je.Name("jsonLen"),jsonPart:new Je.Name("jsonPart")};ke.default=Qn,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.extendErrors=e.resetErrorsCount=e.reportExtraError=e.reportError=e.keyword$DataError=e.keywordError=void 0;const l=oe,c=Re,t=ke;e.keywordError={message:({keyword:Y})=>(0,l.str)`must pass "${Y}" keyword validation`},e.keyword$DataError={message:({keyword:Y,schemaType:G})=>G?(0,l.str)`"${Y}" keyword must be ${G} ($data)`:(0,l.str)`"${Y}" keyword is invalid ($data)`};function i(Y,G=e.keywordError,f,L){const{it:N}=Y,{gen:P,compositeRule:W,allErrors:R}=N,g=h(Y,G,f);(L!=null?L:W||R)?p(P,g):r(N,(0,l._)`[${g}]`)}e.reportError=i;function n(Y,G=e.keywordError,f){const{it:L}=Y,{gen:N,compositeRule:P,allErrors:W}=L,R=h(Y,G,f);p(N,R),P||W||r(L,t.default.vErrors)}e.reportExtraError=n;function a(Y,G){Y.assign(t.default.errors,G),Y.if((0,l._)`${t.default.vErrors} !== null`,()=>Y.if(G,()=>Y.assign((0,l._)`${t.default.vErrors}.length`,G),()=>Y.assign(t.default.vErrors,null)))}e.resetErrorsCount=a;function b({gen:Y,keyword:G,schemaValue:f,data:L,errsCount:N,it:P}){if(N===void 0)throw new Error("ajv implementation error");const W=Y.name("err");Y.forRange("i",N,t.default.errors,R=>{Y.const(W,(0,l._)`${t.default.vErrors}[${R}]`),Y.if((0,l._)`${W}.instancePath === undefined`,()=>Y.assign((0,l._)`${W}.instancePath`,(0,l.strConcat)(t.default.instancePath,P.errorPath))),Y.assign((0,l._)`${W}.schemaPath`,(0,l.str)`${P.errSchemaPath}/${G}`),P.opts.verbose&&(Y.assign((0,l._)`${W}.schema`,f),Y.assign((0,l._)`${W}.data`,L))})}e.extendErrors=b;function p(Y,G){const f=Y.const("err",G);Y.if((0,l._)`${t.default.vErrors} === null`,()=>Y.assign(t.default.vErrors,(0,l._)`[${f}]`),(0,l._)`${t.default.vErrors}.push(${f})`),Y.code((0,l._)`${t.default.errors}++`)}function r(Y,G){const{gen:f,validateName:L,schemaEnv:N}=Y;N.$async?f.throw((0,l._)`new ${Y.ValidationError}(${G})`):(f.assign((0,l._)`${L}.errors`,G),f.return(!1))}const o={keyword:new l.Name("keyword"),schemaPath:new l.Name("schemaPath"),params:new l.Name("params"),propertyName:new l.Name("propertyName"),message:new l.Name("message"),schema:new l.Name("schema"),parentSchema:new l.Name("parentSchema")};function h(Y,G,f){const{createErrors:L}=Y.it;return L===!1?(0,l._)`{}`:S(Y,G,f)}function S(Y,G,f={}){const{gen:L,it:N}=Y,P=[H(N,f),C(Y,f)];return k(Y,G,P),L.object(...P)}function H({errorPath:Y},{instancePath:G}){const f=G?(0,l.str)`${Y}${(0,c.getErrorPath)(G,c.Type.Str)}`:Y;return[t.default.instancePath,(0,l.strConcat)(t.default.instancePath,f)]}function C({keyword:Y,it:{errSchemaPath:G}},{schemaPath:f,parentSchema:L}){let N=L?G:(0,l.str)`${G}/${Y}`;return f&&(N=(0,l.str)`${N}${(0,c.getErrorPath)(f,c.Type.Str)}`),[o.schemaPath,N]}function k(Y,{params:G,message:f},L){const{keyword:N,data:P,schemaValue:W,it:R}=Y,{opts:g,propertyName:B,topSchemaRef:D,schemaPath:re}=R;L.push([o.keyword,N],[o.params,typeof G=="function"?G(Y):G||(0,l._)`{}`]),g.messages&&L.push([o.message,typeof f=="function"?f(Y):f]),g.verbose&&L.push([o.schema,W],[o.parentSchema,(0,l._)`${D}${re}`],[t.default.data,P]),B&&L.push([o.propertyName,B])}}(ic),Object.defineProperty(wl,"__esModule",{value:!0}),wl.boolOrEmptySchema=wl.topBoolOrEmptySchema=void 0;const Mn=ic,On=oe,Dn=ke,An={message:"boolean schema is false"};function _n(e){const{gen:l,schema:c,validateName:t}=e;c===!1?Mt(e,!1):typeof c=="object"&&c.$async===!0?l.return(Dn.default.data):(l.assign((0,On._)`${t}.errors`,null),l.return(!0))}wl.topBoolOrEmptySchema=_n;function $n(e,l){const{gen:c,schema:t}=e;t===!1?(c.var(l,!1),Mt(e)):c.var(l,!0)}wl.boolOrEmptySchema=$n;function Mt(e,l){const{gen:c,data:t}=e,i={gen:c,keyword:"false schema",data:t,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:e};(0,Mn.reportError)(i,An,void 0,l)}var Uc={},Sl={};Object.defineProperty(Sl,"__esModule",{value:!0}),Sl.getRules=Sl.isJSONType=void 0;const qn=["string","number","integer","boolean","null","object","array"],ed=new Set(qn);function ld(e){return typeof e=="string"&&ed.has(e)}Sl.isJSONType=ld;function cd(){const e={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:Ze(A({},e),{integer:!0,boolean:!0,null:!0}),rules:[{rules:[]},e.number,e.string,e.array,e.object],post:{rules:[]},all:{},keywords:{}}}Sl.getRules=cd;var el={};Object.defineProperty(el,"__esModule",{value:!0}),el.shouldUseRule=el.shouldUseGroup=el.schemaHasRulesForType=void 0;function td({schema:e,self:l},c){const t=l.RULES.types[c];return t&&t!==!0&&Ot(e,t)}el.schemaHasRulesForType=td;function Ot(e,l){return l.rules.some(c=>Dt(e,c))}el.shouldUseGroup=Ot;function Dt(e,l){var c;return e[l.keyword]!==void 0||((c=l.definition.implements)===null||c===void 0?void 0:c.some(t=>e[t]!==void 0))}el.shouldUseRule=Dt,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.reportTypeError=e.checkDataTypes=e.checkDataType=e.coerceAndCheckDataType=e.getJSONTypes=e.getSchemaTypes=e.DataType=void 0;const l=Sl,c=el,t=ic,i=oe,n=Re;var a;(function(L){L[L.Correct=0]="Correct",L[L.Wrong=1]="Wrong"})(a=e.DataType||(e.DataType={}));function b(L){const N=p(L.type);if(N.includes("null")){if(L.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!N.length&&L.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');L.nullable===!0&&N.push("null")}return N}e.getSchemaTypes=b;function p(L){const N=Array.isArray(L)?L:L?[L]:[];if(N.every(l.isJSONType))return N;throw new Error("type must be JSONType or JSONType[]: "+N.join(","))}e.getJSONTypes=p;function r(L,N){const{gen:P,data:W,opts:R}=L,g=h(N,R.coerceTypes),B=N.length>0&&!(g.length===0&&N.length===1&&(0,c.schemaHasRulesForType)(L,N[0]));if(B){const D=k(N,W,R.strictNumbers,a.Wrong);P.if(D,()=>{g.length?S(L,N,g):G(L)})}return B}e.coerceAndCheckDataType=r;const o=new Set(["string","number","integer","boolean","null"]);function h(L,N){return N?L.filter(P=>o.has(P)||N==="array"&&P==="array"):[]}function S(L,N,P){const{gen:W,data:R,opts:g}=L,B=W.let("dataType",(0,i._)`typeof ${R}`),D=W.let("coerced",(0,i._)`undefined`);g.coerceTypes==="array"&&W.if((0,i._)`${B} == 'object' && Array.isArray(${R}) && ${R}.length == 1`,()=>W.assign(R,(0,i._)`${R}[0]`).assign(B,(0,i._)`typeof ${R}`).if(k(N,R,g.strictNumbers),()=>W.assign(D,R))),W.if((0,i._)`${D} !== undefined`);for(const $ of P)(o.has($)||$==="array"&&g.coerceTypes==="array")&&re($);W.else(),G(L),W.endIf(),W.if((0,i._)`${D} !== undefined`,()=>{W.assign(R,D),H(L,D)});function re($){switch($){case"string":W.elseIf((0,i._)`${B} == "number" || ${B} == "boolean"`).assign(D,(0,i._)`"" + ${R}`).elseIf((0,i._)`${R} === null`).assign(D,(0,i._)`""`);return;case"number":W.elseIf((0,i._)`${B} == "boolean" || ${R} === null
3
+ || (${B} == "string" && ${R} && ${R} == +${R})`).assign(D,(0,i._)`+${R}`);return;case"integer":W.elseIf((0,i._)`${B} === "boolean" || ${R} === null
4
+ || (${B} === "string" && ${R} && ${R} == +${R} && !(${R} % 1))`).assign(D,(0,i._)`+${R}`);return;case"boolean":W.elseIf((0,i._)`${R} === "false" || ${R} === 0 || ${R} === null`).assign(D,!1).elseIf((0,i._)`${R} === "true" || ${R} === 1`).assign(D,!0);return;case"null":W.elseIf((0,i._)`${R} === "" || ${R} === 0 || ${R} === false`),W.assign(D,null);return;case"array":W.elseIf((0,i._)`${B} === "string" || ${B} === "number"
5
+ || ${B} === "boolean" || ${R} === null`).assign(D,(0,i._)`[${R}]`)}}}function H({gen:L,parentData:N,parentDataProperty:P},W){L.if((0,i._)`${N} !== undefined`,()=>L.assign((0,i._)`${N}[${P}]`,W))}function C(L,N,P,W=a.Correct){const R=W===a.Correct?i.operators.EQ:i.operators.NEQ;let g;switch(L){case"null":return(0,i._)`${N} ${R} null`;case"array":g=(0,i._)`Array.isArray(${N})`;break;case"object":g=(0,i._)`${N} && typeof ${N} == "object" && !Array.isArray(${N})`;break;case"integer":g=B((0,i._)`!(${N} % 1) && !isNaN(${N})`);break;case"number":g=B();break;default:return(0,i._)`typeof ${N} ${R} ${L}`}return W===a.Correct?g:(0,i.not)(g);function B(D=i.nil){return(0,i.and)((0,i._)`typeof ${N} == "number"`,D,P?(0,i._)`isFinite(${N})`:i.nil)}}e.checkDataType=C;function k(L,N,P,W){if(L.length===1)return C(L[0],N,P,W);let R;const g=(0,n.toHash)(L);if(g.array&&g.object){const B=(0,i._)`typeof ${N} != "object"`;R=g.null?B:(0,i._)`!${N} || ${B}`,delete g.null,delete g.array,delete g.object}else R=i.nil;g.number&&delete g.integer;for(const B in g)R=(0,i.and)(R,C(B,N,P,W));return R}e.checkDataTypes=k;const Y={message:({schema:L})=>`must be ${L}`,params:({schema:L,schemaValue:N})=>typeof L=="string"?(0,i._)`{type: ${L}}`:(0,i._)`{type: ${N}}`};function G(L){const N=f(L);(0,t.reportError)(N,Y)}e.reportTypeError=G;function f(L){const{gen:N,data:P,schema:W}=L,R=(0,n.schemaRefOrVal)(L,W,"type");return{gen:N,keyword:"type",data:P,schema:W.type,schemaCode:R,schemaValue:R,parentSchema:W,params:{},it:L}}}(Uc);var vc={};Object.defineProperty(vc,"__esModule",{value:!0}),vc.assignDefaults=void 0;const Pl=oe,id=Re;function nd(e,l){const{properties:c,items:t}=e.schema;if(l==="object"&&c)for(const i in c)At(e,i,c[i].default);else l==="array"&&Array.isArray(t)&&t.forEach((i,n)=>At(e,n,i.default))}vc.assignDefaults=nd;function At(e,l,c){const{gen:t,compositeRule:i,data:n,opts:a}=e;if(c===void 0)return;const b=(0,Pl._)`${n}${(0,Pl.getProperty)(l)}`;if(i){(0,id.checkStrictMode)(e,`default is ignored for: ${b}`);return}let p=(0,Pl._)`${b} === undefined`;a.useDefaults==="empty"&&(p=(0,Pl._)`${p} || ${b} === null || ${b} === ""`),t.if(p,(0,Pl._)`${b} = ${(0,Pl.stringify)(c)}`)}var Ee={},ne={};Object.defineProperty(ne,"__esModule",{value:!0}),ne.validateUnion=ne.validateArray=ne.usePattern=ne.callValidateCode=ne.schemaProperties=ne.allSchemaProperties=ne.noPropertyInData=ne.propertyInData=ne.isOwnProperty=ne.hasPropFunc=ne.reportMissingProp=ne.checkMissingProp=ne.checkReportMissingProp=void 0;const ue=oe,at=Re,Zl=ke,dd=Re;function sd(e,l){const{gen:c,data:t,it:i}=e;c.if(Zt(c,t,l,i.opts.ownProperties),()=>{e.setParams({missingProperty:(0,ue._)`${l}`},!0),e.error()})}ne.checkReportMissingProp=sd;function ad({gen:e,data:l,it:{opts:c}},t,i){return(0,ue.or)(...t.map(n=>(0,ue.and)(Zt(e,l,n,c.ownProperties),(0,ue._)`${i} = ${n}`)))}ne.checkMissingProp=ad;function od(e,l){e.setParams({missingProperty:l},!0),e.error()}ne.reportMissingProp=od;function _t(e){return e.scopeValue("func",{ref:Object.prototype.hasOwnProperty,code:(0,ue._)`Object.prototype.hasOwnProperty`})}ne.hasPropFunc=_t;function ot(e,l,c){return(0,ue._)`${_t(e)}.call(${l}, ${c})`}ne.isOwnProperty=ot;function Zd(e,l,c,t){const i=(0,ue._)`${l}${(0,ue.getProperty)(c)} !== undefined`;return t?(0,ue._)`${i} && ${ot(e,l,c)}`:i}ne.propertyInData=Zd;function Zt(e,l,c,t){const i=(0,ue._)`${l}${(0,ue.getProperty)(c)} === undefined`;return t?(0,ue.or)(i,(0,ue.not)(ot(e,l,c))):i}ne.noPropertyInData=Zt;function $t(e){return e?Object.keys(e).filter(l=>l!=="__proto__"):[]}ne.allSchemaProperties=$t;function md(e,l){return $t(l).filter(c=>!(0,at.alwaysValidSchema)(e,l[c]))}ne.schemaProperties=md;function ud({schemaCode:e,data:l,it:{gen:c,topSchemaRef:t,schemaPath:i,errorPath:n},it:a},b,p,r){const o=r?(0,ue._)`${e}, ${l}, ${t}${i}`:l,h=[[Zl.default.instancePath,(0,ue.strConcat)(Zl.default.instancePath,n)],[Zl.default.parentData,a.parentData],[Zl.default.parentDataProperty,a.parentDataProperty],[Zl.default.rootData,Zl.default.rootData]];a.opts.dynamicRef&&h.push([Zl.default.dynamicAnchors,Zl.default.dynamicAnchors]);const S=(0,ue._)`${o}, ${c.object(...h)}`;return p!==ue.nil?(0,ue._)`${b}.call(${p}, ${S})`:(0,ue._)`${b}(${S})`}ne.callValidateCode=ud;const bd=(0,ue._)`new RegExp`;function rd({gen:e,it:{opts:l}},c){const t=l.unicodeRegExp?"u":"",{regExp:i}=l.code,n=i(c,t);return e.scopeValue("pattern",{key:n.toString(),ref:n,code:(0,ue._)`${i.code==="new RegExp"?bd:(0,dd.useFunc)(e,i)}(${c}, ${t})`})}ne.usePattern=rd;function hd(e){const{gen:l,data:c,keyword:t,it:i}=e,n=l.name("valid");if(i.allErrors){const b=l.let("valid",!0);return a(()=>l.assign(b,!1)),b}return l.var(n,!0),a(()=>l.break()),n;function a(b){const p=l.const("len",(0,ue._)`${c}.length`);l.forRange("i",0,p,r=>{e.subschema({keyword:t,dataProp:r,dataPropType:at.Type.Num},n),l.if((0,ue.not)(n),b)})}}ne.validateArray=hd;function pd(e){const{gen:l,schema:c,keyword:t,it:i}=e;if(!Array.isArray(c))throw new Error("ajv implementation error");if(c.some(p=>(0,at.alwaysValidSchema)(i,p))&&!i.opts.unevaluated)return;const a=l.let("valid",!1),b=l.name("_valid");l.block(()=>c.forEach((p,r)=>{const o=e.subschema({keyword:t,schemaProp:r,compositeRule:!0},b);l.assign(a,(0,ue._)`${a} || ${b}`),e.mergeValidEvaluated(o,b)||l.if((0,ue.not)(a))})),e.result(a,()=>e.reset(),()=>e.error(!0))}ne.validateUnion=pd,Object.defineProperty(Ee,"__esModule",{value:!0}),Ee.validateKeywordUsage=Ee.validSchemaType=Ee.funcKeywordCode=Ee.macroKeywordCode=void 0;const Ne=oe,Rl=ke,Gd=ne,Vd=ic;function Wd(e,l){const{gen:c,keyword:t,schema:i,parentSchema:n,it:a}=e,b=l.macro.call(a.self,i,n,a),p=ei(c,t,b);a.opts.validateSchema!==!1&&a.self.validateSchema(b,!0);const r=c.name("valid");e.subschema({schema:b,schemaPath:Ne.nil,errSchemaPath:`${a.errSchemaPath}/${t}`,topSchemaRef:p,compositeRule:!0},r),e.pass(r,()=>e.error(!0))}Ee.macroKeywordCode=Wd;function Xd(e,l){var c;const{gen:t,keyword:i,schema:n,parentSchema:a,$data:b,it:p}=e;Yd(p,l);const r=!b&&l.compile?l.compile.call(p.self,n,a,p):l.validate,o=ei(t,i,r),h=t.let("valid");e.block$data(h,S),e.ok((c=l.valid)!==null&&c!==void 0?c:h);function S(){if(l.errors===!1)k(),l.modifying&&qt(e),Y(()=>e.error());else{const G=l.async?H():C();l.modifying&&qt(e),Y(()=>yd(e,G))}}function H(){const G=t.let("ruleErrs",null);return t.try(()=>k((0,Ne._)`await `),f=>t.assign(h,!1).if((0,Ne._)`${f} instanceof ${p.ValidationError}`,()=>t.assign(G,(0,Ne._)`${f}.errors`),()=>t.throw(f))),G}function C(){const G=(0,Ne._)`${o}.errors`;return t.assign(G,null),k(Ne.nil),G}function k(G=l.async?(0,Ne._)`await `:Ne.nil){const f=p.opts.passContext?Rl.default.this:Rl.default.self,L=!("compile"in l&&!b||l.schema===!1);t.assign(h,(0,Ne._)`${G}${(0,Gd.callValidateCode)(e,o,f,L)}`,l.modifying)}function Y(G){var f;t.if((0,Ne.not)((f=l.valid)!==null&&f!==void 0?f:h),G)}}Ee.funcKeywordCode=Xd;function qt(e){const{gen:l,data:c,it:t}=e;l.if(t.parentData,()=>l.assign(c,(0,Ne._)`${t.parentData}[${t.parentDataProperty}]`))}function yd(e,l){const{gen:c}=e;c.if((0,Ne._)`Array.isArray(${l})`,()=>{c.assign(Rl.default.vErrors,(0,Ne._)`${Rl.default.vErrors} === null ? ${l} : ${Rl.default.vErrors}.concat(${l})`).assign(Rl.default.errors,(0,Ne._)`${Rl.default.vErrors}.length`),(0,Vd.extendErrors)(e)},()=>e.error())}function Yd({schemaEnv:e},l){if(l.async&&!e.$async)throw new Error("async keyword in sync schema")}function ei(e,l,c){if(c===void 0)throw new Error(`keyword "${l}" failed to compile`);return e.scopeValue("keyword",typeof c=="function"?{ref:c}:{ref:c,code:(0,Ne.stringify)(c)})}function Id(e,l,c=!1){return!l.length||l.some(t=>t==="array"?Array.isArray(e):t==="object"?e&&typeof e=="object"&&!Array.isArray(e):typeof e==t||c&&typeof e=="undefined")}Ee.validSchemaType=Id;function Sd({schema:e,opts:l,self:c,errSchemaPath:t},i,n){if(Array.isArray(i.keyword)?!i.keyword.includes(n):i.keyword!==n)throw new Error("ajv implementation error");const a=i.dependencies;if(a!=null&&a.some(b=>!Object.prototype.hasOwnProperty.call(e,b)))throw new Error(`parent schema must have dependencies of ${n}: ${a.join(",")}`);if(i.validateSchema&&!i.validateSchema(e[n])){const p=`keyword "${n}" value is invalid at path "${t}": `+c.errorsText(i.validateSchema.errors);if(l.validateSchema==="log")c.logger.error(p);else throw new Error(p)}}Ee.validateKeywordUsage=Sd;var ml={};Object.defineProperty(ml,"__esModule",{value:!0}),ml.extendSubschemaMode=ml.extendSubschemaData=ml.getSubschema=void 0;const je=oe,li=Re;function Rd(e,{keyword:l,schemaProp:c,schema:t,schemaPath:i,errSchemaPath:n,topSchemaRef:a}){if(l!==void 0&&t!==void 0)throw new Error('both "keyword" and "schema" passed, only one allowed');if(l!==void 0){const b=e.schema[l];return c===void 0?{schema:b,schemaPath:(0,je._)`${e.schemaPath}${(0,je.getProperty)(l)}`,errSchemaPath:`${e.errSchemaPath}/${l}`}:{schema:b[c],schemaPath:(0,je._)`${e.schemaPath}${(0,je.getProperty)(l)}${(0,je.getProperty)(c)}`,errSchemaPath:`${e.errSchemaPath}/${l}/${(0,li.escapeFragment)(c)}`}}if(t!==void 0){if(i===void 0||n===void 0||a===void 0)throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');return{schema:t,schemaPath:i,topSchemaRef:a,errSchemaPath:n}}throw new Error('either "keyword" or "schema" must be passed')}ml.getSubschema=Rd;function fd(e,l,{dataProp:c,dataPropType:t,data:i,dataTypes:n,propertyName:a}){if(i!==void 0&&c!==void 0)throw new Error('both "data" and "dataProp" passed, only one allowed');const{gen:b}=l;if(c!==void 0){const{errorPath:r,dataPathArr:o,opts:h}=l,S=b.let("data",(0,je._)`${l.data}${(0,je.getProperty)(c)}`,!0);p(S),e.errorPath=(0,je.str)`${r}${(0,li.getErrorPath)(c,t,h.jsPropertySyntax)}`,e.parentDataProperty=(0,je._)`${c}`,e.dataPathArr=[...o,e.parentDataProperty]}if(i!==void 0){const r=i instanceof je.Name?i:b.let("data",i,!0);p(r),a!==void 0&&(e.propertyName=a)}n&&(e.dataTypes=n);function p(r){e.data=r,e.dataLevel=l.dataLevel+1,e.dataTypes=[],l.definedProperties=new Set,e.parentData=l.data,e.dataNames=[...l.dataNames,r]}}ml.extendSubschemaData=fd;function Ld(e,{jtdDiscriminator:l,jtdMetadata:c,compositeRule:t,createErrors:i,allErrors:n}){t!==void 0&&(e.compositeRule=t),i!==void 0&&(e.createErrors=i),n!==void 0&&(e.allErrors=n),e.jtdDiscriminator=l,e.jtdMetadata=c}ml.extendSubschemaMode=Ld;var Le={},Jd=function e(l,c){if(l===c)return!0;if(l&&c&&typeof l=="object"&&typeof c=="object"){if(l.constructor!==c.constructor)return!1;var t,i,n;if(Array.isArray(l)){if(t=l.length,t!=c.length)return!1;for(i=t;i--!==0;)if(!e(l[i],c[i]))return!1;return!0}if(l.constructor===RegExp)return l.source===c.source&&l.flags===c.flags;if(l.valueOf!==Object.prototype.valueOf)return l.valueOf()===c.valueOf();if(l.toString!==Object.prototype.toString)return l.toString()===c.toString();if(n=Object.keys(l),t=n.length,t!==Object.keys(c).length)return!1;for(i=t;i--!==0;)if(!Object.prototype.hasOwnProperty.call(c,n[i]))return!1;for(i=t;i--!==0;){var a=n[i];if(!e(l[a],c[a]))return!1}return!0}return l!==l&&c!==c},ci={exports:{}},ul=ci.exports=function(e,l,c){typeof l=="function"&&(c=l,l={}),c=l.cb||c;var t=typeof c=="function"?c:c.pre||function(){},i=c.post||function(){};Tc(l,t,i,e,"",e)};ul.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0,if:!0,then:!0,else:!0},ul.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0},ul.propsKeywords={$defs:!0,definitions:!0,properties:!0,patternProperties:!0,dependencies:!0},ul.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0};function Tc(e,l,c,t,i,n,a,b,p,r){if(t&&typeof t=="object"&&!Array.isArray(t)){l(t,i,n,a,b,p,r);for(var o in t){var h=t[o];if(Array.isArray(h)){if(o in ul.arrayKeywords)for(var S=0;S<h.length;S++)Tc(e,l,c,h[S],i+"/"+o+"/"+S,n,i,o,t,S)}else if(o in ul.propsKeywords){if(h&&typeof h=="object")for(var H in h)Tc(e,l,c,h[H],i+"/"+o+"/"+Kd(H),n,i,o,t,H)}else(o in ul.keywords||e.allKeys&&!(o in ul.skipKeywords))&&Tc(e,l,c,h,i+"/"+o,n,i,o,t)}c(t,i,n,a,b,p,r)}}function Kd(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}Object.defineProperty(Le,"__esModule",{value:!0}),Le.getSchemaRefs=Le.resolveUrl=Le.normalizeId=Le._getFullPath=Le.getFullPath=Le.inlineRef=void 0;const Nd=Re,Cd=Jd,gd=ci.exports,Hd=new Set(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum","const"]);function kd(e,l=!0){return typeof e=="boolean"?!0:l===!0?!mt(e):l?ti(e)<=l:!1}Le.inlineRef=kd;const Fd=new Set(["$ref","$recursiveRef","$recursiveAnchor","$dynamicRef","$dynamicAnchor"]);function mt(e){for(const l in e){if(Fd.has(l))return!0;const c=e[l];if(Array.isArray(c)&&c.some(mt)||typeof c=="object"&&mt(c))return!0}return!1}function ti(e){let l=0;for(const c in e){if(c==="$ref")return 1/0;if(l++,!Hd.has(c)&&(typeof e[c]=="object"&&(0,Nd.eachItem)(e[c],t=>l+=ti(t)),l===1/0))return 1/0}return l}function ii(e,l="",c){c!==!1&&(l=Bl(l));const t=e.parse(l);return ni(e,t)}Le.getFullPath=ii;function ni(e,l){return e.serialize(l).split("#")[0]+"#"}Le._getFullPath=ni;const Ud=/#\/?$/;function Bl(e){return e?e.replace(Ud,""):""}Le.normalizeId=Bl;function vd(e,l,c){return c=Bl(c),e.resolve(l,c)}Le.resolveUrl=vd;const Td=/^[a-z_][-a-z0-9._]*$/i;function xd(e,l){if(typeof e=="boolean")return{};const{schemaId:c,uriResolver:t}=this.opts,i=Bl(e[c]||l),n={"":i},a=ii(t,i,!1),b={},p=new Set;return gd(e,{allKeys:!0},(h,S,H,C)=>{if(C===void 0)return;const k=a+S;let Y=n[C];typeof h[c]=="string"&&(Y=G.call(this,h[c])),f.call(this,h.$anchor),f.call(this,h.$dynamicAnchor),n[S]=Y;function G(L){const N=this.opts.uriResolver.resolve;if(L=Bl(Y?N(Y,L):L),p.has(L))throw o(L);p.add(L);let P=this.refs[L];return typeof P=="string"&&(P=this.refs[P]),typeof P=="object"?r(h,P.schema,L):L!==Bl(k)&&(L[0]==="#"?(r(h,b[L],L),b[L]=h):this.refs[L]=k),L}function f(L){if(typeof L=="string"){if(!Td.test(L))throw new Error(`invalid anchor "${L}"`);G.call(this,`#${L}`)}}}),b;function r(h,S,H){if(S!==void 0&&!Cd(h,S))throw o(H)}function o(h){return new Error(`reference "${h}" resolves to more than one schema`)}}Le.getSchemaRefs=xd,Object.defineProperty(Be,"__esModule",{value:!0}),Be.getData=Be.KeywordCxt=Be.validateFunctionCode=void 0;const di=wl,si=Uc,ut=el,xc=Uc,zd=vc,dc=Ee,bt=ml,T=oe,j=ke,wd=Le,ll=Re,sc=ic;function Pd(e){if(mi(e)&&(ui(e),Zi(e))){jd(e);return}ai(e,()=>(0,di.topBoolOrEmptySchema)(e))}Be.validateFunctionCode=Pd;function ai({gen:e,validateName:l,schema:c,schemaEnv:t,opts:i},n){i.code.es5?e.func(l,(0,T._)`${j.default.data}, ${j.default.valCxt}`,t.$async,()=>{e.code((0,T._)`"use strict"; ${oi(c,i)}`),Ed(e,i),e.code(n)}):e.func(l,(0,T._)`${j.default.data}, ${Bd(i)}`,t.$async,()=>e.code(oi(c,i)).code(n))}function Bd(e){return(0,T._)`{${j.default.instancePath}="", ${j.default.parentData}, ${j.default.parentDataProperty}, ${j.default.rootData}=${j.default.data}${e.dynamicRef?(0,T._)`, ${j.default.dynamicAnchors}={}`:T.nil}}={}`}function Ed(e,l){e.if(j.default.valCxt,()=>{e.var(j.default.instancePath,(0,T._)`${j.default.valCxt}.${j.default.instancePath}`),e.var(j.default.parentData,(0,T._)`${j.default.valCxt}.${j.default.parentData}`),e.var(j.default.parentDataProperty,(0,T._)`${j.default.valCxt}.${j.default.parentDataProperty}`),e.var(j.default.rootData,(0,T._)`${j.default.valCxt}.${j.default.rootData}`),l.dynamicRef&&e.var(j.default.dynamicAnchors,(0,T._)`${j.default.valCxt}.${j.default.dynamicAnchors}`)},()=>{e.var(j.default.instancePath,(0,T._)`""`),e.var(j.default.parentData,(0,T._)`undefined`),e.var(j.default.parentDataProperty,(0,T._)`undefined`),e.var(j.default.rootData,j.default.data),l.dynamicRef&&e.var(j.default.dynamicAnchors,(0,T._)`{}`)})}function jd(e){const{schema:l,opts:c,gen:t}=e;ai(e,()=>{c.$comment&&l.$comment&&ri(e),Ad(e),t.let(j.default.vErrors,null),t.let(j.default.errors,0),c.unevaluated&&Qd(e),bi(e),qd(e)})}function Qd(e){const{gen:l,validateName:c}=e;e.evaluated=l.const("evaluated",(0,T._)`${c}.evaluated`),l.if((0,T._)`${e.evaluated}.dynamicProps`,()=>l.assign((0,T._)`${e.evaluated}.props`,(0,T._)`undefined`)),l.if((0,T._)`${e.evaluated}.dynamicItems`,()=>l.assign((0,T._)`${e.evaluated}.items`,(0,T._)`undefined`))}function oi(e,l){const c=typeof e=="object"&&e[l.schemaId];return c&&(l.code.source||l.code.process)?(0,T._)`/*# sourceURL=${c} */`:T.nil}function Md(e,l){if(mi(e)&&(ui(e),Zi(e))){Od(e,l);return}(0,di.boolOrEmptySchema)(e,l)}function Zi({schema:e,self:l}){if(typeof e=="boolean")return!e;for(const c in e)if(l.RULES.all[c])return!0;return!1}function mi(e){return typeof e.schema!="boolean"}function Od(e,l){const{schema:c,gen:t,opts:i}=e;i.$comment&&c.$comment&&ri(e),_d(e),$d(e);const n=t.const("_errs",j.default.errors);bi(e,n),t.var(l,(0,T._)`${n} === ${j.default.errors}`)}function ui(e){(0,ll.checkUnknownRules)(e),Dd(e)}function bi(e,l){if(e.opts.jtd)return hi(e,[],!1,l);const c=(0,si.getSchemaTypes)(e.schema),t=(0,si.coerceAndCheckDataType)(e,c);hi(e,c,!t,l)}function Dd(e){const{schema:l,errSchemaPath:c,opts:t,self:i}=e;l.$ref&&t.ignoreKeywordsWithRef&&(0,ll.schemaHasRulesButRef)(l,i.RULES)&&i.logger.warn(`$ref: keywords ignored in schema at path "${c}"`)}function Ad(e){const{schema:l,opts:c}=e;l.default!==void 0&&c.useDefaults&&c.strictSchema&&(0,ll.checkStrictMode)(e,"default is ignored in the schema root")}function _d(e){const l=e.schema[e.opts.schemaId];l&&(e.baseId=(0,wd.resolveUrl)(e.opts.uriResolver,e.baseId,l))}function $d(e){if(e.schema.$async&&!e.schemaEnv.$async)throw new Error("async schema in sync schema")}function ri({gen:e,schemaEnv:l,schema:c,errSchemaPath:t,opts:i}){const n=c.$comment;if(i.$comment===!0)e.code((0,T._)`${j.default.self}.logger.log(${n})`);else if(typeof i.$comment=="function"){const a=(0,T.str)`${t}/$comment`,b=e.scopeValue("root",{ref:l.root});e.code((0,T._)`${j.default.self}.opts.$comment(${n}, ${a}, ${b}.schema)`)}}function qd(e){const{gen:l,schemaEnv:c,validateName:t,ValidationError:i,opts:n}=e;c.$async?l.if((0,T._)`${j.default.errors} === 0`,()=>l.return(j.default.data),()=>l.throw((0,T._)`new ${i}(${j.default.vErrors})`)):(l.assign((0,T._)`${t}.errors`,j.default.vErrors),n.unevaluated&&es(e),l.return((0,T._)`${j.default.errors} === 0`))}function es({gen:e,evaluated:l,props:c,items:t}){c instanceof T.Name&&e.assign((0,T._)`${l}.props`,c),t instanceof T.Name&&e.assign((0,T._)`${l}.items`,t)}function hi(e,l,c,t){const{gen:i,schema:n,data:a,allErrors:b,opts:p,self:r}=e,{RULES:o}=r;if(n.$ref&&(p.ignoreKeywordsWithRef||!(0,ll.schemaHasRulesButRef)(n,o))){i.block(()=>Wi(e,"$ref",o.all.$ref.definition));return}p.jtd||ls(e,l),i.block(()=>{for(const S of o.rules)h(S);h(o.post)});function h(S){!(0,ut.shouldUseGroup)(n,S)||(S.type?(i.if((0,xc.checkDataType)(S.type,a,p.strictNumbers)),pi(e,S),l.length===1&&l[0]===S.type&&c&&(i.else(),(0,xc.reportTypeError)(e)),i.endIf()):pi(e,S),b||i.if((0,T._)`${j.default.errors} === ${t||0}`))}}function pi(e,l){const{gen:c,schema:t,opts:{useDefaults:i}}=e;i&&(0,zd.assignDefaults)(e,l.type),c.block(()=>{for(const n of l.rules)(0,ut.shouldUseRule)(t,n)&&Wi(e,n.keyword,n.definition,l.type)})}function ls(e,l){e.schemaEnv.meta||!e.opts.strictTypes||(cs(e,l),e.opts.allowUnionTypes||ts(e,l),is(e,e.dataTypes))}function cs(e,l){if(!!l.length){if(!e.dataTypes.length){e.dataTypes=l;return}l.forEach(c=>{Gi(e.dataTypes,c)||rt(e,`type "${c}" not allowed by context "${e.dataTypes.join(",")}"`)}),e.dataTypes=e.dataTypes.filter(c=>Gi(l,c))}}function ts(e,l){l.length>1&&!(l.length===2&&l.includes("null"))&&rt(e,"use allowUnionTypes to allow union type keyword")}function is(e,l){const c=e.self.RULES.all;for(const t in c){const i=c[t];if(typeof i=="object"&&(0,ut.shouldUseRule)(e.schema,i)){const{type:n}=i.definition;n.length&&!n.some(a=>ns(l,a))&&rt(e,`missing type "${n.join(",")}" for keyword "${t}"`)}}}function ns(e,l){return e.includes(l)||l==="number"&&e.includes("integer")}function Gi(e,l){return e.includes(l)||l==="integer"&&e.includes("number")}function rt(e,l){l+=` at "${e.schemaEnv.baseId+e.errSchemaPath}" (strictTypes)`,(0,ll.checkStrictMode)(e,l,e.opts.strictTypes)}class Vi{constructor(l,c,t){if((0,dc.validateKeywordUsage)(l,c,t),this.gen=l.gen,this.allErrors=l.allErrors,this.keyword=t,this.data=l.data,this.schema=l.schema[t],this.$data=c.$data&&l.opts.$data&&this.schema&&this.schema.$data,this.schemaValue=(0,ll.schemaRefOrVal)(l,this.schema,t,this.$data),this.schemaType=c.schemaType,this.parentSchema=l.schema,this.params={},this.it=l,this.def=c,this.$data)this.schemaCode=l.gen.const("vSchema",Xi(this.$data,l));else if(this.schemaCode=this.schemaValue,!(0,dc.validSchemaType)(this.schema,c.schemaType,c.allowUndefined))throw new Error(`${t} value must be ${JSON.stringify(c.schemaType)}`);("code"in c?c.trackErrors:c.errors!==!1)&&(this.errsCount=l.gen.const("_errs",j.default.errors))}result(l,c,t){this.failResult((0,T.not)(l),c,t)}failResult(l,c,t){this.gen.if(l),t?t():this.error(),c?(this.gen.else(),c(),this.allErrors&&this.gen.endIf()):this.allErrors?this.gen.endIf():this.gen.else()}pass(l,c){this.failResult((0,T.not)(l),void 0,c)}fail(l){if(l===void 0){this.error(),this.allErrors||this.gen.if(!1);return}this.gen.if(l),this.error(),this.allErrors?this.gen.endIf():this.gen.else()}fail$data(l){if(!this.$data)return this.fail(l);const{schemaCode:c}=this;this.fail((0,T._)`${c} !== undefined && (${(0,T.or)(this.invalid$data(),l)})`)}error(l,c,t){if(c){this.setParams(c),this._error(l,t),this.setParams({});return}this._error(l,t)}_error(l,c){(l?sc.reportExtraError:sc.reportError)(this,this.def.error,c)}$dataError(){(0,sc.reportError)(this,this.def.$dataError||sc.keyword$DataError)}reset(){if(this.errsCount===void 0)throw new Error('add "trackErrors" to keyword definition');(0,sc.resetErrorsCount)(this.gen,this.errsCount)}ok(l){this.allErrors||this.gen.if(l)}setParams(l,c){c?Object.assign(this.params,l):this.params=l}block$data(l,c,t=T.nil){this.gen.block(()=>{this.check$data(l,t),c()})}check$data(l=T.nil,c=T.nil){if(!this.$data)return;const{gen:t,schemaCode:i,schemaType:n,def:a}=this;t.if((0,T.or)((0,T._)`${i} === undefined`,c)),l!==T.nil&&t.assign(l,!0),(n.length||a.validateSchema)&&(t.elseIf(this.invalid$data()),this.$dataError(),l!==T.nil&&t.assign(l,!1)),t.else()}invalid$data(){const{gen:l,schemaCode:c,schemaType:t,def:i,it:n}=this;return(0,T.or)(a(),b());function a(){if(t.length){if(!(c instanceof T.Name))throw new Error("ajv implementation error");const p=Array.isArray(t)?t:[t];return(0,T._)`${(0,xc.checkDataTypes)(p,c,n.opts.strictNumbers,xc.DataType.Wrong)}`}return T.nil}function b(){if(i.validateSchema){const p=l.scopeValue("validate$data",{ref:i.validateSchema});return(0,T._)`!${p}(${c})`}return T.nil}}subschema(l,c){const t=(0,bt.getSubschema)(this.it,l);(0,bt.extendSubschemaData)(t,this.it,l),(0,bt.extendSubschemaMode)(t,l);const i=Ze(A(A({},this.it),t),{items:void 0,props:void 0});return Md(i,c),i}mergeEvaluated(l,c){const{it:t,gen:i}=this;!t.opts.unevaluated||(t.props!==!0&&l.props!==void 0&&(t.props=ll.mergeEvaluated.props(i,l.props,t.props,c)),t.items!==!0&&l.items!==void 0&&(t.items=ll.mergeEvaluated.items(i,l.items,t.items,c)))}mergeValidEvaluated(l,c){const{it:t,gen:i}=this;if(t.opts.unevaluated&&(t.props!==!0||t.items!==!0))return i.if(c,()=>this.mergeEvaluated(l,T.Name)),!0}}Be.KeywordCxt=Vi;function Wi(e,l,c,t){const i=new Vi(e,c,l);"code"in c?c.code(i,t):i.$data&&c.validate?(0,dc.funcKeywordCode)(i,c):"macro"in c?(0,dc.macroKeywordCode)(i,c):(c.compile||c.validate)&&(0,dc.funcKeywordCode)(i,c)}const ds=/^\/(?:[^~]|~0|~1)*$/,ss=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function Xi(e,{dataLevel:l,dataNames:c,dataPathArr:t}){let i,n;if(e==="")return j.default.rootData;if(e[0]==="/"){if(!ds.test(e))throw new Error(`Invalid JSON-pointer: ${e}`);i=e,n=j.default.rootData}else{const r=ss.exec(e);if(!r)throw new Error(`Invalid JSON-pointer: ${e}`);const o=+r[1];if(i=r[2],i==="#"){if(o>=l)throw new Error(p("property/index",o));return t[l-o]}if(o>l)throw new Error(p("data",o));if(n=c[l-o],!i)return n}let a=n;const b=i.split("/");for(const r of b)r&&(n=(0,T._)`${n}${(0,T.getProperty)((0,ll.unescapeJsonPointer)(r))}`,a=(0,T._)`${a} && ${n}`);return a;function p(r,o){return`Cannot access ${r} ${o} levels up, current level is ${l}`}}Be.getData=Xi;var zc={};Object.defineProperty(zc,"__esModule",{value:!0});class as extends Error{constructor(l){super("validation failed"),this.errors=l,this.ajv=this.validation=!0}}zc.default=as;var fl={};Object.defineProperty(fl,"__esModule",{value:!0});const ht=Le;class os extends Error{constructor(l,c,t,i){super(i||`can't resolve reference ${t} from id ${c}`),this.missingRef=(0,ht.resolveUrl)(l,c,t),this.missingSchema=(0,ht.normalizeId)((0,ht.getFullPath)(l,this.missingRef))}}fl.default=os;var Ke={};Object.defineProperty(Ke,"__esModule",{value:!0}),Ke.resolveSchema=Ke.getCompilingSchema=Ke.resolveRef=Ke.compileSchema=Ke.SchemaEnv=void 0;const we=oe,Zs=zc,Ll=ke,Pe=Le,yi=Re,ms=Be;class wc{constructor(l){var c;this.refs={},this.dynamicAnchors={};let t;typeof l.schema=="object"&&(t=l.schema),this.schema=l.schema,this.schemaId=l.schemaId,this.root=l.root||this,this.baseId=(c=l.baseId)!==null&&c!==void 0?c:(0,Pe.normalizeId)(t==null?void 0:t[l.schemaId||"$id"]),this.schemaPath=l.schemaPath,this.localRefs=l.localRefs,this.meta=l.meta,this.$async=t==null?void 0:t.$async,this.refs={}}}Ke.SchemaEnv=wc;function pt(e){const l=Yi.call(this,e);if(l)return l;const c=(0,Pe.getFullPath)(this.opts.uriResolver,e.root.baseId),{es5:t,lines:i}=this.opts.code,{ownProperties:n}=this.opts,a=new we.CodeGen(this.scope,{es5:t,lines:i,ownProperties:n});let b;e.$async&&(b=a.scopeValue("Error",{ref:Zs.default,code:(0,we._)`require("ajv/dist/runtime/validation_error").default`}));const p=a.scopeName("validate");e.validateName=p;const r={gen:a,allErrors:this.opts.allErrors,data:Ll.default.data,parentData:Ll.default.parentData,parentDataProperty:Ll.default.parentDataProperty,dataNames:[Ll.default.data],dataPathArr:[we.nil],dataLevel:0,dataTypes:[],definedProperties:new Set,topSchemaRef:a.scopeValue("schema",this.opts.code.source===!0?{ref:e.schema,code:(0,we.stringify)(e.schema)}:{ref:e.schema}),validateName:p,ValidationError:b,schema:e.schema,schemaEnv:e,rootId:c,baseId:e.baseId||c,schemaPath:we.nil,errSchemaPath:e.schemaPath||(this.opts.jtd?"":"#"),errorPath:(0,we._)`""`,opts:this.opts,self:this};let o;try{this._compilations.add(e),(0,ms.validateFunctionCode)(r),a.optimize(this.opts.code.optimize);const h=a.toString();o=`${a.scopeRefs(Ll.default.scope)}return ${h}`,this.opts.code.process&&(o=this.opts.code.process(o,e));const H=new Function(`${Ll.default.self}`,`${Ll.default.scope}`,o)(this,this.scope.get());if(this.scope.value(p,{ref:H}),H.errors=null,H.schema=e.schema,H.schemaEnv=e,e.$async&&(H.$async=!0),this.opts.code.source===!0&&(H.source={validateName:p,validateCode:h,scopeValues:a._values}),this.opts.unevaluated){const{props:C,items:k}=r;H.evaluated={props:C instanceof we.Name?void 0:C,items:k instanceof we.Name?void 0:k,dynamicProps:C instanceof we.Name,dynamicItems:k instanceof we.Name},H.source&&(H.source.evaluated=(0,we.stringify)(H.evaluated))}return e.validate=H,e}catch(h){throw delete e.validate,delete e.validateName,o&&this.logger.error("Error compiling schema, function code:",o),h}finally{this._compilations.delete(e)}}Ke.compileSchema=pt;function us(e,l,c){var t;c=(0,Pe.resolveUrl)(this.opts.uriResolver,l,c);const i=e.refs[c];if(i)return i;let n=hs.call(this,e,c);if(n===void 0){const a=(t=e.localRefs)===null||t===void 0?void 0:t[c],{schemaId:b}=this.opts;a&&(n=new wc({schema:a,schemaId:b,root:e,baseId:l}))}if(n!==void 0)return e.refs[c]=bs.call(this,n)}Ke.resolveRef=us;function bs(e){return(0,Pe.inlineRef)(e.schema,this.opts.inlineRefs)?e.schema:e.validate?e:pt.call(this,e)}function Yi(e){for(const l of this._compilations)if(rs(l,e))return l}Ke.getCompilingSchema=Yi;function rs(e,l){return e.schema===l.schema&&e.root===l.root&&e.baseId===l.baseId}function hs(e,l){let c;for(;typeof(c=this.refs[l])=="string";)l=c;return c||this.schemas[l]||Pc.call(this,e,l)}function Pc(e,l){const c=this.opts.uriResolver.parse(l),t=(0,Pe._getFullPath)(this.opts.uriResolver,c);let i=(0,Pe.getFullPath)(this.opts.uriResolver,e.baseId,void 0);if(Object.keys(e.schema).length>0&&t===i)return Gt.call(this,c,e);const n=(0,Pe.normalizeId)(t),a=this.refs[n]||this.schemas[n];if(typeof a=="string"){const b=Pc.call(this,e,a);return typeof(b==null?void 0:b.schema)!="object"?void 0:Gt.call(this,c,b)}if(typeof(a==null?void 0:a.schema)=="object"){if(a.validate||pt.call(this,a),n===(0,Pe.normalizeId)(l)){const{schema:b}=a,{schemaId:p}=this.opts,r=b[p];return r&&(i=(0,Pe.resolveUrl)(this.opts.uriResolver,i,r)),new wc({schema:b,schemaId:p,root:e,baseId:i})}return Gt.call(this,c,a)}}Ke.resolveSchema=Pc;const ps=new Set(["properties","patternProperties","enum","dependencies","definitions"]);function Gt(e,{baseId:l,schema:c,root:t}){var i;if(((i=e.fragment)===null||i===void 0?void 0:i[0])!=="/")return;for(const b of e.fragment.slice(1).split("/")){if(typeof c=="boolean")return;const p=c[(0,yi.unescapeFragment)(b)];if(p===void 0)return;c=p;const r=typeof c=="object"&&c[this.opts.schemaId];!ps.has(b)&&r&&(l=(0,Pe.resolveUrl)(this.opts.uriResolver,l,r))}let n;if(typeof c!="boolean"&&c.$ref&&!(0,yi.schemaHasRulesButRef)(c,this.RULES)){const b=(0,Pe.resolveUrl)(this.opts.uriResolver,l,c.$ref);n=Pc.call(this,t,b)}const{schemaId:a}=this.opts;if(n=n||new wc({schema:c,schemaId:a,root:t,baseId:l}),n.schema!==n.root.schema)return n}var Gs={$id:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",description:"Meta-schema for $data reference (JSON AnySchema extension proposal)",type:"object",required:["$data"],properties:{$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},additionalProperties:!1},Vt={},Wt={exports:{}};/** @license URI.js v4.4.1 (c) 2011 Gary Court. License: http://github.com/garycourt/uri-js */(function(e,l){(function(c,t){t(l)})(E,function(c){function t(){for(var Z=arguments.length,s=Array(Z),u=0;u<Z;u++)s[u]=arguments[u];if(s.length>1){s[0]=s[0].slice(0,-1);for(var I=s.length-1,y=1;y<I;++y)s[y]=s[y].slice(1,-1);return s[I]=s[I].slice(1),s.join("")}else return s[0]}function i(Z){return"(?:"+Z+")"}function n(Z){return Z===void 0?"undefined":Z===null?"null":Object.prototype.toString.call(Z).split(" ").pop().split("]").shift().toLowerCase()}function a(Z){return Z.toUpperCase()}function b(Z){return Z!=null?Z instanceof Array?Z:typeof Z.length!="number"||Z.split||Z.setInterval||Z.call?[Z]:Array.prototype.slice.call(Z):[]}function p(Z,s){var u=Z;if(s)for(var I in s)u[I]=s[I];return u}function r(Z){var s="[A-Za-z]",u="[0-9]",I=t(u,"[A-Fa-f]"),y=i(i("%[EFef]"+I+"%"+I+I+"%"+I+I)+"|"+i("%[89A-Fa-f]"+I+"%"+I+I)+"|"+i("%"+I+I)),z="[\\:\\/\\?\\#\\[\\]\\@]",w="[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]",de=t(z,w),he=Z?"[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]":"[]",Ye=Z?"[\\uE000-\\uF8FF]":"[]",le=t(s,u,"[\\-\\.\\_\\~]",he);i(s+t(s,u,"[\\+\\-\\.]")+"*"),i(i(y+"|"+t(le,w,"[\\:]"))+"*");var me=i(i("25[0-5]")+"|"+i("2[0-4]"+u)+"|"+i("1"+u+u)+"|"+i("0?[1-9]"+u)+"|0?0?"+u),Ie=i(me+"\\."+me+"\\."+me+"\\."+me),Q=i(I+"{1,4}"),Ve=i(i(Q+"\\:"+Q)+"|"+Ie),Se=i(i(Q+"\\:")+"{6}"+Ve),We=i("\\:\\:"+i(Q+"\\:")+"{5}"+Ve),yl=i(i(Q)+"?\\:\\:"+i(Q+"\\:")+"{4}"+Ve),_e=i(i(i(Q+"\\:")+"{0,1}"+Q)+"?\\:\\:"+i(Q+"\\:")+"{3}"+Ve),$e=i(i(i(Q+"\\:")+"{0,2}"+Q)+"?\\:\\:"+i(Q+"\\:")+"{2}"+Ve),cc=i(i(i(Q+"\\:")+"{0,3}"+Q)+"?\\:\\:"+Q+"\\:"+Ve),Tl=i(i(i(Q+"\\:")+"{0,4}"+Q)+"?\\:\\:"+Ve),xe=i(i(i(Q+"\\:")+"{0,5}"+Q)+"?\\:\\:"+Q),qe=i(i(i(Q+"\\:")+"{0,6}"+Q)+"?\\:\\:"),xl=i([Se,We,yl,_e,$e,cc,Tl,xe,qe].join("|")),al=i(i(le+"|"+y)+"+");i("[vV]"+I+"+\\."+t(le,w,"[\\:]")+"+"),i(i(y+"|"+t(le,w))+"*");var Nc=i(y+"|"+t(le,w,"[\\:\\@]"));return i(i(y+"|"+t(le,w,"[\\@]"))+"+"),i(i(Nc+"|"+t("[\\/\\?]",Ye))+"*"),{NOT_SCHEME:new RegExp(t("[^]",s,u,"[\\+\\-\\.]"),"g"),NOT_USERINFO:new RegExp(t("[^\\%\\:]",le,w),"g"),NOT_HOST:new RegExp(t("[^\\%\\[\\]\\:]",le,w),"g"),NOT_PATH:new RegExp(t("[^\\%\\/\\:\\@]",le,w),"g"),NOT_PATH_NOSCHEME:new RegExp(t("[^\\%\\/\\@]",le,w),"g"),NOT_QUERY:new RegExp(t("[^\\%]",le,w,"[\\:\\@\\/\\?]",Ye),"g"),NOT_FRAGMENT:new RegExp(t("[^\\%]",le,w,"[\\:\\@\\/\\?]"),"g"),ESCAPE:new RegExp(t("[^]",le,w),"g"),UNRESERVED:new RegExp(le,"g"),OTHER_CHARS:new RegExp(t("[^\\%]",le,de),"g"),PCT_ENCODED:new RegExp(y,"g"),IPV4ADDRESS:new RegExp("^("+Ie+")$"),IPV6ADDRESS:new RegExp("^\\[?("+xl+")"+i(i("\\%25|\\%(?!"+I+"{2})")+"("+al+")")+"?\\]?$")}}var o=r(!1),h=r(!0),S=function(){function Z(s,u){var I=[],y=!0,z=!1,w=void 0;try{for(var de=s[Symbol.iterator](),he;!(y=(he=de.next()).done)&&(I.push(he.value),!(u&&I.length===u));y=!0);}catch(Ye){z=!0,w=Ye}finally{try{!y&&de.return&&de.return()}finally{if(z)throw w}}return I}return function(s,u){if(Array.isArray(s))return s;if(Symbol.iterator in Object(s))return Z(s,u);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),H=function(Z){if(Array.isArray(Z)){for(var s=0,u=Array(Z.length);s<Z.length;s++)u[s]=Z[s];return u}else return Array.from(Z)},C=2147483647,k=36,Y=1,G=26,f=38,L=700,N=72,P=128,W="-",R=/^xn--/,g=/[^\0-\x7E]/,B=/[\x2E\u3002\uFF0E\uFF61]/g,D={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},re=k-Y,$=Math.floor,se=String.fromCharCode;function q(Z){throw new RangeError(D[Z])}function Ge(Z,s){for(var u=[],I=Z.length;I--;)u[I]=s(Z[I]);return u}function Xe(Z,s){var u=Z.split("@"),I="";u.length>1&&(I=u[0]+"@",Z=u[1]),Z=Z.replace(B,".");var y=Z.split("."),z=Ge(y,s).join(".");return I+z}function fe(Z){for(var s=[],u=0,I=Z.length;u<I;){var y=Z.charCodeAt(u++);if(y>=55296&&y<=56319&&u<I){var z=Z.charCodeAt(u++);(z&64512)==56320?s.push(((y&1023)<<10)+(z&1023)+65536):(s.push(y),u--)}else s.push(y)}return s}var ve=function(s){return String.fromCodePoint.apply(String,H(s))},Dl=function(s){return s-48<10?s-22:s-65<26?s-65:s-97<26?s-97:k},F=function(s,u){return s+22+75*(s<26)-((u!=0)<<5)},V=function(s,u,I){var y=0;for(s=I?$(s/L):s>>1,s+=$(s/u);s>re*G>>1;y+=k)s=$(s/re);return $(y+(re+1)*s/(s+f))},K=function(s){var u=[],I=s.length,y=0,z=P,w=N,de=s.lastIndexOf(W);de<0&&(de=0);for(var he=0;he<de;++he)s.charCodeAt(he)>=128&&q("not-basic"),u.push(s.charCodeAt(he));for(var Ye=de>0?de+1:0;Ye<I;){for(var le=y,me=1,Ie=k;;Ie+=k){Ye>=I&&q("invalid-input");var Q=Dl(s.charCodeAt(Ye++));(Q>=k||Q>$((C-y)/me))&&q("overflow"),y+=Q*me;var Ve=Ie<=w?Y:Ie>=w+G?G:Ie-w;if(Q<Ve)break;var Se=k-Ve;me>$(C/Se)&&q("overflow"),me*=Se}var We=u.length+1;w=V(y-le,We,le==0),$(y/We)>C-z&&q("overflow"),z+=$(y/We),y%=We,u.splice(y++,0,z)}return String.fromCodePoint.apply(String,u)},X=function(s){var u=[];s=fe(s);var I=s.length,y=P,z=0,w=N,de=!0,he=!1,Ye=void 0;try{for(var le=s[Symbol.iterator](),me;!(de=(me=le.next()).done);de=!0){var Ie=me.value;Ie<128&&u.push(se(Ie))}}catch(Cc){he=!0,Ye=Cc}finally{try{!de&&le.return&&le.return()}finally{if(he)throw Ye}}var Q=u.length,Ve=Q;for(Q&&u.push(W);Ve<I;){var Se=C,We=!0,yl=!1,_e=void 0;try{for(var $e=s[Symbol.iterator](),cc;!(We=(cc=$e.next()).done);We=!0){var Tl=cc.value;Tl>=y&&Tl<Se&&(Se=Tl)}}catch(Cc){yl=!0,_e=Cc}finally{try{!We&&$e.return&&$e.return()}finally{if(yl)throw _e}}var xe=Ve+1;Se-y>$((C-z)/xe)&&q("overflow"),z+=(Se-y)*xe,y=Se;var qe=!0,xl=!1,al=void 0;try{for(var Nc=s[Symbol.iterator](),Nn;!(qe=(Nn=Nc.next()).done);qe=!0){var Cn=Nn.value;if(Cn<y&&++z>C&&q("overflow"),Cn==y){for(var tt=z,it=k;;it+=k){var nt=it<=w?Y:it>=w+G?G:it-w;if(tt<nt)break;var gn=tt-nt,Hn=k-nt;u.push(se(F(nt+gn%Hn,0))),tt=$(gn/Hn)}u.push(se(F(tt,0))),w=V(z,xe,Ve==Q),z=0,++Ve}}}catch(Cc){xl=!0,al=Cc}finally{try{!qe&&Nc.return&&Nc.return()}finally{if(xl)throw al}}++z,++y}return u.join("")},d=function(s){return Xe(s,function(u){return R.test(u)?K(u.slice(4).toLowerCase()):u})},m=function(s){return Xe(s,function(u){return g.test(u)?"xn--"+X(u):u})},J={version:"2.1.0",ucs2:{decode:fe,encode:ve},decode:K,encode:X,toASCII:m,toUnicode:d},U={};function v(Z){var s=Z.charCodeAt(0),u=void 0;return s<16?u="%0"+s.toString(16).toUpperCase():s<128?u="%"+s.toString(16).toUpperCase():s<2048?u="%"+(s>>6|192).toString(16).toUpperCase()+"%"+(s&63|128).toString(16).toUpperCase():u="%"+(s>>12|224).toString(16).toUpperCase()+"%"+(s>>6&63|128).toString(16).toUpperCase()+"%"+(s&63|128).toString(16).toUpperCase(),u}function ee(Z){for(var s="",u=0,I=Z.length;u<I;){var y=parseInt(Z.substr(u+1,2),16);if(y<128)s+=String.fromCharCode(y),u+=3;else if(y>=194&&y<224){if(I-u>=6){var z=parseInt(Z.substr(u+4,2),16);s+=String.fromCharCode((y&31)<<6|z&63)}else s+=Z.substr(u,6);u+=6}else if(y>=224){if(I-u>=9){var w=parseInt(Z.substr(u+4,2),16),de=parseInt(Z.substr(u+7,2),16);s+=String.fromCharCode((y&15)<<12|(w&63)<<6|de&63)}else s+=Z.substr(u,9);u+=9}else s+=Z.substr(u,3),u+=3}return s}function ie(Z,s){function u(I){var y=ee(I);return y.match(s.UNRESERVED)?y:I}return Z.scheme&&(Z.scheme=String(Z.scheme).replace(s.PCT_ENCODED,u).toLowerCase().replace(s.NOT_SCHEME,"")),Z.userinfo!==void 0&&(Z.userinfo=String(Z.userinfo).replace(s.PCT_ENCODED,u).replace(s.NOT_USERINFO,v).replace(s.PCT_ENCODED,a)),Z.host!==void 0&&(Z.host=String(Z.host).replace(s.PCT_ENCODED,u).toLowerCase().replace(s.NOT_HOST,v).replace(s.PCT_ENCODED,a)),Z.path!==void 0&&(Z.path=String(Z.path).replace(s.PCT_ENCODED,u).replace(Z.scheme?s.NOT_PATH:s.NOT_PATH_NOSCHEME,v).replace(s.PCT_ENCODED,a)),Z.query!==void 0&&(Z.query=String(Z.query).replace(s.PCT_ENCODED,u).replace(s.NOT_QUERY,v).replace(s.PCT_ENCODED,a)),Z.fragment!==void 0&&(Z.fragment=String(Z.fragment).replace(s.PCT_ENCODED,u).replace(s.NOT_FRAGMENT,v).replace(s.PCT_ENCODED,a)),Z}function ye(Z){return Z.replace(/^0*(.*)/,"$1")||"0"}function Oe(Z,s){var u=Z.match(s.IPV4ADDRESS)||[],I=S(u,2),y=I[1];return y?y.split(".").map(ye).join("."):Z}function Al(Z,s){var u=Z.match(s.IPV6ADDRESS)||[],I=S(u,3),y=I[1],z=I[2];if(y){for(var w=y.toLowerCase().split("::").reverse(),de=S(w,2),he=de[0],Ye=de[1],le=Ye?Ye.split(":").map(ye):[],me=he.split(":").map(ye),Ie=s.IPV4ADDRESS.test(me[me.length-1]),Q=Ie?7:8,Ve=me.length-Q,Se=Array(Q),We=0;We<Q;++We)Se[We]=le[We]||me[Ve+We]||"";Ie&&(Se[Q-1]=Oe(Se[Q-1],s));var yl=Se.reduce(function(xe,qe,xl){if(!qe||qe==="0"){var al=xe[xe.length-1];al&&al.index+al.length===xl?al.length++:xe.push({index:xl,length:1})}return xe},[]),_e=yl.sort(function(xe,qe){return qe.length-xe.length})[0],$e=void 0;if(_e&&_e.length>1){var cc=Se.slice(0,_e.index),Tl=Se.slice(_e.index+_e.length);$e=cc.join(":")+"::"+Tl.join(":")}else $e=Se.join(":");return z&&($e+="%"+z),$e}else return Z}var Ic=/^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i,Sc="".match(/(){0}/)[1]===void 0;function He(Z){var s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},u={},I=s.iri!==!1?h:o;s.reference==="suffix"&&(Z=(s.scheme?s.scheme+":":"")+"//"+Z);var y=Z.match(Ic);if(y){Sc?(u.scheme=y[1],u.userinfo=y[3],u.host=y[4],u.port=parseInt(y[5],10),u.path=y[6]||"",u.query=y[7],u.fragment=y[8],isNaN(u.port)&&(u.port=y[5])):(u.scheme=y[1]||void 0,u.userinfo=Z.indexOf("@")!==-1?y[3]:void 0,u.host=Z.indexOf("//")!==-1?y[4]:void 0,u.port=parseInt(y[5],10),u.path=y[6]||"",u.query=Z.indexOf("?")!==-1?y[7]:void 0,u.fragment=Z.indexOf("#")!==-1?y[8]:void 0,isNaN(u.port)&&(u.port=Z.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/)?y[4]:void 0)),u.host&&(u.host=Al(Oe(u.host,I),I)),u.scheme===void 0&&u.userinfo===void 0&&u.host===void 0&&u.port===void 0&&!u.path&&u.query===void 0?u.reference="same-document":u.scheme===void 0?u.reference="relative":u.fragment===void 0?u.reference="absolute":u.reference="uri",s.reference&&s.reference!=="suffix"&&s.reference!==u.reference&&(u.error=u.error||"URI is not a "+s.reference+" reference.");var z=U[(s.scheme||u.scheme||"").toLowerCase()];if(!s.unicodeSupport&&(!z||!z.unicodeSupport)){if(u.host&&(s.domainHost||z&&z.domainHost))try{u.host=J.toASCII(u.host.replace(I.PCT_ENCODED,ee).toLowerCase())}catch(w){u.error=u.error||"Host's domain name can not be converted to ASCII via punycode: "+w}ie(u,o)}else ie(u,I);z&&z.parse&&z.parse(u,s)}else u.error=u.error||"URI can not be parsed.";return u}function Rc(Z,s){var u=s.iri!==!1?h:o,I=[];return Z.userinfo!==void 0&&(I.push(Z.userinfo),I.push("@")),Z.host!==void 0&&I.push(Al(Oe(String(Z.host),u),u).replace(u.IPV6ADDRESS,function(y,z,w){return"["+z+(w?"%25"+w:"")+"]"})),(typeof Z.port=="number"||typeof Z.port=="string")&&(I.push(":"),I.push(String(Z.port))),I.length?I.join(""):void 0}var _l=/^\.\.?\//,$l=/^\/\.(\/|$)/,ql=/^\/\.\.(\/|$)/,fc=/^\/?(?:.|\n)*?(?=\/|$)/;function De(Z){for(var s=[];Z.length;)if(Z.match(_l))Z=Z.replace(_l,"");else if(Z.match($l))Z=Z.replace($l,"/");else if(Z.match(ql))Z=Z.replace(ql,"/"),s.pop();else if(Z==="."||Z==="..")Z="";else{var u=Z.match(fc);if(u){var I=u[0];Z=Z.slice(I.length),s.push(I)}else throw new Error("Unexpected dot segment condition")}return s.join("")}function ge(Z){var s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},u=s.iri?h:o,I=[],y=U[(s.scheme||Z.scheme||"").toLowerCase()];if(y&&y.serialize&&y.serialize(Z,s),Z.host&&!u.IPV6ADDRESS.test(Z.host)){if(s.domainHost||y&&y.domainHost)try{Z.host=s.iri?J.toUnicode(Z.host):J.toASCII(Z.host.replace(u.PCT_ENCODED,ee).toLowerCase())}catch(de){Z.error=Z.error||"Host's domain name can not be converted to "+(s.iri?"Unicode":"ASCII")+" via punycode: "+de}}ie(Z,u),s.reference!=="suffix"&&Z.scheme&&(I.push(Z.scheme),I.push(":"));var z=Rc(Z,s);if(z!==void 0&&(s.reference!=="suffix"&&I.push("//"),I.push(z),Z.path&&Z.path.charAt(0)!=="/"&&I.push("/")),Z.path!==void 0){var w=Z.path;!s.absolutePath&&(!y||!y.absolutePath)&&(w=De(w)),z===void 0&&(w=w.replace(/^\/\//,"/%2F")),I.push(w)}return Z.query!==void 0&&(I.push("?"),I.push(Z.query)),Z.fragment!==void 0&&(I.push("#"),I.push(Z.fragment)),I.join("")}function ec(Z,s){var u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},I=arguments[3],y={};return I||(Z=He(ge(Z,u),u),s=He(ge(s,u),u)),u=u||{},!u.tolerant&&s.scheme?(y.scheme=s.scheme,y.userinfo=s.userinfo,y.host=s.host,y.port=s.port,y.path=De(s.path||""),y.query=s.query):(s.userinfo!==void 0||s.host!==void 0||s.port!==void 0?(y.userinfo=s.userinfo,y.host=s.host,y.port=s.port,y.path=De(s.path||""),y.query=s.query):(s.path?(s.path.charAt(0)==="/"?y.path=De(s.path):((Z.userinfo!==void 0||Z.host!==void 0||Z.port!==void 0)&&!Z.path?y.path="/"+s.path:Z.path?y.path=Z.path.slice(0,Z.path.lastIndexOf("/")+1)+s.path:y.path=s.path,y.path=De(y.path)),y.query=s.query):(y.path=Z.path,s.query!==void 0?y.query=s.query:y.query=Z.query),y.userinfo=Z.userinfo,y.host=Z.host,y.port=Z.port),y.scheme=Z.scheme),y.fragment=s.fragment,y}function Lc(Z,s,u){var I=p({scheme:"null"},u);return ge(ec(He(Z,I),He(s,I),I,!0),I)}function Ul(Z,s){return typeof Z=="string"?Z=ge(He(Z,s),s):n(Z)==="object"&&(Z=He(ge(Z,s),s)),Z}function Jc(Z,s,u){return typeof Z=="string"?Z=ge(He(Z,u),u):n(Z)==="object"&&(Z=ge(Z,u)),typeof s=="string"?s=ge(He(s,u),u):n(s)==="object"&&(s=ge(s,u)),Z===s}function ct(Z,s){return Z&&Z.toString().replace(!s||!s.iri?o.ESCAPE:h.ESCAPE,v)}function Te(Z,s){return Z&&Z.toString().replace(!s||!s.iri?o.PCT_ENCODED:h.PCT_ENCODED,ee)}var vl={scheme:"http",domainHost:!0,parse:function(s,u){return s.host||(s.error=s.error||"HTTP URIs must have a host."),s},serialize:function(s,u){var I=String(s.scheme).toLowerCase()==="https";return(s.port===(I?443:80)||s.port==="")&&(s.port=void 0),s.path||(s.path="/"),s}},Yn={scheme:"https",domainHost:vl.domainHost,parse:vl.parse,serialize:vl.serialize};function In(Z){return typeof Z.secure=="boolean"?Z.secure:String(Z.scheme).toLowerCase()==="wss"}var Kc={scheme:"ws",domainHost:!0,parse:function(s,u){var I=s;return I.secure=In(I),I.resourceName=(I.path||"/")+(I.query?"?"+I.query:""),I.path=void 0,I.query=void 0,I},serialize:function(s,u){if((s.port===(In(s)?443:80)||s.port==="")&&(s.port=void 0),typeof s.secure=="boolean"&&(s.scheme=s.secure?"wss":"ws",s.secure=void 0),s.resourceName){var I=s.resourceName.split("?"),y=S(I,2),z=y[0],w=y[1];s.path=z&&z!=="/"?z:void 0,s.query=w,s.resourceName=void 0}return s.fragment=void 0,s}},Sn={scheme:"wss",domainHost:Kc.domainHost,parse:Kc.parse,serialize:Kc.serialize},Jo={},Rn="[A-Za-z0-9\\-\\.\\_\\~\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]",Ae="[0-9A-Fa-f]",Ko=i(i("%[EFef]"+Ae+"%"+Ae+Ae+"%"+Ae+Ae)+"|"+i("%[89A-Fa-f]"+Ae+"%"+Ae+Ae)+"|"+i("%"+Ae+Ae)),No="[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]",Co="[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]",go=t(Co,'[\\"\\\\]'),Ho="[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]",ko=new RegExp(Rn,"g"),lc=new RegExp(Ko,"g"),Fo=new RegExp(t("[^]",No,"[\\.]",'[\\"]',go),"g"),fn=new RegExp(t("[^]",Rn,Ho),"g"),Uo=fn;function Bt(Z){var s=ee(Z);return s.match(ko)?s:Z}var Ln={scheme:"mailto",parse:function(s,u){var I=s,y=I.to=I.path?I.path.split(","):[];if(I.path=void 0,I.query){for(var z=!1,w={},de=I.query.split("&"),he=0,Ye=de.length;he<Ye;++he){var le=de[he].split("=");switch(le[0]){case"to":for(var me=le[1].split(","),Ie=0,Q=me.length;Ie<Q;++Ie)y.push(me[Ie]);break;case"subject":I.subject=Te(le[1],u);break;case"body":I.body=Te(le[1],u);break;default:z=!0,w[Te(le[0],u)]=Te(le[1],u);break}}z&&(I.headers=w)}I.query=void 0;for(var Ve=0,Se=y.length;Ve<Se;++Ve){var We=y[Ve].split("@");if(We[0]=Te(We[0]),u.unicodeSupport)We[1]=Te(We[1],u).toLowerCase();else try{We[1]=J.toASCII(Te(We[1],u).toLowerCase())}catch(yl){I.error=I.error||"Email address's domain name can not be converted to ASCII via punycode: "+yl}y[Ve]=We.join("@")}return I},serialize:function(s,u){var I=s,y=b(s.to);if(y){for(var z=0,w=y.length;z<w;++z){var de=String(y[z]),he=de.lastIndexOf("@"),Ye=de.slice(0,he).replace(lc,Bt).replace(lc,a).replace(Fo,v),le=de.slice(he+1);try{le=u.iri?J.toUnicode(le):J.toASCII(Te(le,u).toLowerCase())}catch(Ve){I.error=I.error||"Email address's domain name can not be converted to "+(u.iri?"Unicode":"ASCII")+" via punycode: "+Ve}y[z]=Ye+"@"+le}I.path=y.join(",")}var me=s.headers=s.headers||{};s.subject&&(me.subject=s.subject),s.body&&(me.body=s.body);var Ie=[];for(var Q in me)me[Q]!==Jo[Q]&&Ie.push(Q.replace(lc,Bt).replace(lc,a).replace(fn,v)+"="+me[Q].replace(lc,Bt).replace(lc,a).replace(Uo,v));return Ie.length&&(I.query=Ie.join("&")),I}},vo=/^([^\:]+)\:(.*)/,Jn={scheme:"urn",parse:function(s,u){var I=s.path&&s.path.match(vo),y=s;if(I){var z=u.scheme||y.scheme||"urn",w=I[1].toLowerCase(),de=I[2],he=z+":"+(u.nid||w),Ye=U[he];y.nid=w,y.nss=de,y.path=void 0,Ye&&(y=Ye.parse(y,u))}else y.error=y.error||"URN can not be parsed.";return y},serialize:function(s,u){var I=u.scheme||s.scheme||"urn",y=s.nid,z=I+":"+(u.nid||y),w=U[z];w&&(s=w.serialize(s,u));var de=s,he=s.nss;return de.path=(y||u.nid)+":"+he,de}},To=/^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/,Kn={scheme:"urn:uuid",parse:function(s,u){var I=s;return I.uuid=I.nss,I.nss=void 0,!u.tolerant&&(!I.uuid||!I.uuid.match(To))&&(I.error=I.error||"UUID is not valid."),I},serialize:function(s,u){var I=s;return I.nss=(s.uuid||"").toLowerCase(),I}};U[vl.scheme]=vl,U[Yn.scheme]=Yn,U[Kc.scheme]=Kc,U[Sn.scheme]=Sn,U[Ln.scheme]=Ln,U[Jn.scheme]=Jn,U[Kn.scheme]=Kn,c.SCHEMES=U,c.pctEncChar=v,c.pctDecChars=ee,c.parse=He,c.removeDotSegments=De,c.serialize=ge,c.resolveComponents=ec,c.resolve=Lc,c.normalize=Ul,c.equal=Jc,c.escapeComponent=ct,c.unescapeComponent=Te,Object.defineProperty(c,"__esModule",{value:!0})})})(Wt,Wt.exports),Object.defineProperty(Vt,"__esModule",{value:!0});const Ii=Wt.exports;Ii.code='require("ajv/dist/runtime/uri").default',Vt.default=Ii,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.CodeGen=e.Name=e.nil=e.stringify=e.str=e._=e.KeywordCxt=void 0;var l=Be;Object.defineProperty(e,"KeywordCxt",{enumerable:!0,get:function(){return l.KeywordCxt}});var c=oe;Object.defineProperty(e,"_",{enumerable:!0,get:function(){return c._}}),Object.defineProperty(e,"str",{enumerable:!0,get:function(){return c.str}}),Object.defineProperty(e,"stringify",{enumerable:!0,get:function(){return c.stringify}}),Object.defineProperty(e,"nil",{enumerable:!0,get:function(){return c.nil}}),Object.defineProperty(e,"Name",{enumerable:!0,get:function(){return c.Name}}),Object.defineProperty(e,"CodeGen",{enumerable:!0,get:function(){return c.CodeGen}});const t=zc,i=fl,n=Sl,a=Ke,b=oe,p=Le,r=Uc,o=Re,h=Gs,S=Vt,H=(F,V)=>new RegExp(F,V);H.code="new RegExp";const C=["removeAdditional","useDefaults","coerceTypes"],k=new Set(["validate","serialize","parse","wrapper","root","schema","keyword","pattern","formats","validate$data","func","obj","Error"]),Y={errorDataPath:"",format:"`validateFormats: false` can be used instead.",nullable:'"nullable" keyword is supported by default.',jsonPointers:"Deprecated jsPropertySyntax can be used instead.",extendRefs:"Deprecated ignoreKeywordsWithRef can be used instead.",missingRefs:"Pass empty schema with $id that should be ignored to ajv.addSchema.",processCode:"Use option `code: {process: (code, schemaEnv: object) => string}`",sourceCode:"Use option `code: {source: true}`",strictDefaults:"It is default now, see option `strict`.",strictKeywords:"It is default now, see option `strict`.",uniqueItems:'"uniqueItems" keyword is always validated.',unknownFormats:"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",cache:"Map is used as cache, schema object as key.",serialize:"Map is used as cache, schema object as key.",ajvErrors:"It is default now."},G={ignoreKeywordsWithRef:"",jsPropertySyntax:"",unicode:'"minLength"/"maxLength" account for unicode characters by default.'},f=200;function L(F){var V,K,X,d,m,J,U,v,ee,ie,ye,Oe,Al,Ic,Sc,He,Rc,_l,$l,ql,fc,De,ge,ec,Lc;const Ul=F.strict,Jc=(V=F.code)===null||V===void 0?void 0:V.optimize,ct=Jc===!0||Jc===void 0?1:Jc||0,Te=(X=(K=F.code)===null||K===void 0?void 0:K.regExp)!==null&&X!==void 0?X:H,vl=(d=F.uriResolver)!==null&&d!==void 0?d:S.default;return{strictSchema:(J=(m=F.strictSchema)!==null&&m!==void 0?m:Ul)!==null&&J!==void 0?J:!0,strictNumbers:(v=(U=F.strictNumbers)!==null&&U!==void 0?U:Ul)!==null&&v!==void 0?v:!0,strictTypes:(ie=(ee=F.strictTypes)!==null&&ee!==void 0?ee:Ul)!==null&&ie!==void 0?ie:"log",strictTuples:(Oe=(ye=F.strictTuples)!==null&&ye!==void 0?ye:Ul)!==null&&Oe!==void 0?Oe:"log",strictRequired:(Ic=(Al=F.strictRequired)!==null&&Al!==void 0?Al:Ul)!==null&&Ic!==void 0?Ic:!1,code:F.code?Ze(A({},F.code),{optimize:ct,regExp:Te}):{optimize:ct,regExp:Te},loopRequired:(Sc=F.loopRequired)!==null&&Sc!==void 0?Sc:f,loopEnum:(He=F.loopEnum)!==null&&He!==void 0?He:f,meta:(Rc=F.meta)!==null&&Rc!==void 0?Rc:!0,messages:(_l=F.messages)!==null&&_l!==void 0?_l:!0,inlineRefs:($l=F.inlineRefs)!==null&&$l!==void 0?$l:!0,schemaId:(ql=F.schemaId)!==null&&ql!==void 0?ql:"$id",addUsedSchema:(fc=F.addUsedSchema)!==null&&fc!==void 0?fc:!0,validateSchema:(De=F.validateSchema)!==null&&De!==void 0?De:!0,validateFormats:(ge=F.validateFormats)!==null&&ge!==void 0?ge:!0,unicodeRegExp:(ec=F.unicodeRegExp)!==null&&ec!==void 0?ec:!0,int32range:(Lc=F.int32range)!==null&&Lc!==void 0?Lc:!0,uriResolver:vl}}class N{constructor(V={}){this.schemas={},this.refs={},this.formats={},this._compilations=new Set,this._loading={},this._cache=new Map,V=this.opts=A(A({},V),L(V));const{es5:K,lines:X}=this.opts.code;this.scope=new b.ValueScope({scope:{},prefixes:k,es5:K,lines:X}),this.logger=$(V.logger);const d=V.validateFormats;V.validateFormats=!1,this.RULES=(0,n.getRules)(),P.call(this,Y,V,"NOT SUPPORTED"),P.call(this,G,V,"DEPRECATED","warn"),this._metaOpts=D.call(this),V.formats&&g.call(this),this._addVocabularies(),this._addDefaultMetaSchema(),V.keywords&&B.call(this,V.keywords),typeof V.meta=="object"&&this.addMetaSchema(V.meta),R.call(this),V.validateFormats=d}_addVocabularies(){this.addKeyword("$async")}_addDefaultMetaSchema(){const{$data:V,meta:K,schemaId:X}=this.opts;let d=h;X==="id"&&(d=A({},h),d.id=d.$id,delete d.$id),K&&V&&this.addMetaSchema(d,d[X],!1)}defaultMeta(){const{meta:V,schemaId:K}=this.opts;return this.opts.defaultMeta=typeof V=="object"?V[K]||V:void 0}validate(V,K){let X;if(typeof V=="string"){if(X=this.getSchema(V),!X)throw new Error(`no schema with key or ref "${V}"`)}else X=this.compile(V);const d=X(K);return"$async"in X||(this.errors=X.errors),d}compile(V,K){const X=this._addSchema(V,K);return X.validate||this._compileSchemaEnv(X)}compileAsync(V,K){if(typeof this.opts.loadSchema!="function")throw new Error("options.loadSchema should be a function");const{loadSchema:X}=this.opts;return d.call(this,V,K);async function d(ie,ye){await m.call(this,ie.$schema);const Oe=this._addSchema(ie,ye);return Oe.validate||J.call(this,Oe)}async function m(ie){ie&&!this.getSchema(ie)&&await d.call(this,{$ref:ie},!0)}async function J(ie){try{return this._compileSchemaEnv(ie)}catch(ye){if(!(ye instanceof i.default))throw ye;return U.call(this,ye),await v.call(this,ye.missingSchema),J.call(this,ie)}}function U({missingSchema:ie,missingRef:ye}){if(this.refs[ie])throw new Error(`AnySchema ${ie} is loaded but ${ye} cannot be resolved`)}async function v(ie){const ye=await ee.call(this,ie);this.refs[ie]||await m.call(this,ye.$schema),this.refs[ie]||this.addSchema(ye,ie,K)}async function ee(ie){const ye=this._loading[ie];if(ye)return ye;try{return await(this._loading[ie]=X(ie))}finally{delete this._loading[ie]}}}addSchema(V,K,X,d=this.opts.validateSchema){if(Array.isArray(V)){for(const J of V)this.addSchema(J,void 0,X,d);return this}let m;if(typeof V=="object"){const{schemaId:J}=this.opts;if(m=V[J],m!==void 0&&typeof m!="string")throw new Error(`schema ${J} must be string`)}return K=(0,p.normalizeId)(K||m),this._checkUnique(K),this.schemas[K]=this._addSchema(V,X,K,d,!0),this}addMetaSchema(V,K,X=this.opts.validateSchema){return this.addSchema(V,K,!0,X),this}validateSchema(V,K){if(typeof V=="boolean")return!0;let X;if(X=V.$schema,X!==void 0&&typeof X!="string")throw new Error("$schema must be a string");if(X=X||this.opts.defaultMeta||this.defaultMeta(),!X)return this.logger.warn("meta-schema not available"),this.errors=null,!0;const d=this.validate(X,V);if(!d&&K){const m="schema is invalid: "+this.errorsText();if(this.opts.validateSchema==="log")this.logger.error(m);else throw new Error(m)}return d}getSchema(V){let K;for(;typeof(K=W.call(this,V))=="string";)V=K;if(K===void 0){const{schemaId:X}=this.opts,d=new a.SchemaEnv({schema:{},schemaId:X});if(K=a.resolveSchema.call(this,d,V),!K)return;this.refs[V]=K}return K.validate||this._compileSchemaEnv(K)}removeSchema(V){if(V instanceof RegExp)return this._removeAllSchemas(this.schemas,V),this._removeAllSchemas(this.refs,V),this;switch(typeof V){case"undefined":return this._removeAllSchemas(this.schemas),this._removeAllSchemas(this.refs),this._cache.clear(),this;case"string":{const K=W.call(this,V);return typeof K=="object"&&this._cache.delete(K.schema),delete this.schemas[V],delete this.refs[V],this}case"object":{const K=V;this._cache.delete(K);let X=V[this.opts.schemaId];return X&&(X=(0,p.normalizeId)(X),delete this.schemas[X],delete this.refs[X]),this}default:throw new Error("ajv.removeSchema: invalid parameter")}}addVocabulary(V){for(const K of V)this.addKeyword(K);return this}addKeyword(V,K){let X;if(typeof V=="string")X=V,typeof K=="object"&&(this.logger.warn("these parameters are deprecated, see docs for addKeyword"),K.keyword=X);else if(typeof V=="object"&&K===void 0){if(K=V,X=K.keyword,Array.isArray(X)&&!X.length)throw new Error("addKeywords: keyword must be string or non-empty array")}else throw new Error("invalid addKeywords parameters");if(q.call(this,X,K),!K)return(0,o.eachItem)(X,m=>Ge.call(this,m)),this;fe.call(this,K);const d=Ze(A({},K),{type:(0,r.getJSONTypes)(K.type),schemaType:(0,r.getJSONTypes)(K.schemaType)});return(0,o.eachItem)(X,d.type.length===0?m=>Ge.call(this,m,d):m=>d.type.forEach(J=>Ge.call(this,m,d,J))),this}getKeyword(V){const K=this.RULES.all[V];return typeof K=="object"?K.definition:!!K}removeKeyword(V){const{RULES:K}=this;delete K.keywords[V],delete K.all[V];for(const X of K.rules){const d=X.rules.findIndex(m=>m.keyword===V);d>=0&&X.rules.splice(d,1)}return this}addFormat(V,K){return typeof K=="string"&&(K=new RegExp(K)),this.formats[V]=K,this}errorsText(V=this.errors,{separator:K=", ",dataVar:X="data"}={}){return!V||V.length===0?"No errors":V.map(d=>`${X}${d.instancePath} ${d.message}`).reduce((d,m)=>d+K+m)}$dataMetaSchema(V,K){const X=this.RULES.all;V=JSON.parse(JSON.stringify(V));for(const d of K){const m=d.split("/").slice(1);let J=V;for(const U of m)J=J[U];for(const U in X){const v=X[U];if(typeof v!="object")continue;const{$data:ee}=v.definition,ie=J[U];ee&&ie&&(J[U]=Dl(ie))}}return V}_removeAllSchemas(V,K){for(const X in V){const d=V[X];(!K||K.test(X))&&(typeof d=="string"?delete V[X]:d&&!d.meta&&(this._cache.delete(d.schema),delete V[X]))}}_addSchema(V,K,X,d=this.opts.validateSchema,m=this.opts.addUsedSchema){let J;const{schemaId:U}=this.opts;if(typeof V=="object")J=V[U];else{if(this.opts.jtd)throw new Error("schema must be object");if(typeof V!="boolean")throw new Error("schema must be object or boolean")}let v=this._cache.get(V);if(v!==void 0)return v;X=(0,p.normalizeId)(J||X);const ee=p.getSchemaRefs.call(this,V,X);return v=new a.SchemaEnv({schema:V,schemaId:U,meta:K,baseId:X,localRefs:ee}),this._cache.set(v.schema,v),m&&!X.startsWith("#")&&(X&&this._checkUnique(X),this.refs[X]=v),d&&this.validateSchema(V,!0),v}_checkUnique(V){if(this.schemas[V]||this.refs[V])throw new Error(`schema with key or id "${V}" already exists`)}_compileSchemaEnv(V){if(V.meta?this._compileMetaSchema(V):a.compileSchema.call(this,V),!V.validate)throw new Error("ajv implementation error");return V.validate}_compileMetaSchema(V){const K=this.opts;this.opts=this._metaOpts;try{a.compileSchema.call(this,V)}finally{this.opts=K}}}e.default=N,N.ValidationError=t.default,N.MissingRefError=i.default;function P(F,V,K,X="error"){for(const d in F){const m=d;m in V&&this.logger[X](`${K}: option ${d}. ${F[m]}`)}}function W(F){return F=(0,p.normalizeId)(F),this.schemas[F]||this.refs[F]}function R(){const F=this.opts.schemas;if(!!F)if(Array.isArray(F))this.addSchema(F);else for(const V in F)this.addSchema(F[V],V)}function g(){for(const F in this.opts.formats){const V=this.opts.formats[F];V&&this.addFormat(F,V)}}function B(F){if(Array.isArray(F)){this.addVocabulary(F);return}this.logger.warn("keywords option as map is deprecated, pass array");for(const V in F){const K=F[V];K.keyword||(K.keyword=V),this.addKeyword(K)}}function D(){const F=A({},this.opts);for(const V of C)delete F[V];return F}const re={log(){},warn(){},error(){}};function $(F){if(F===!1)return re;if(F===void 0)return console;if(F.log&&F.warn&&F.error)return F;throw new Error("logger must implement log, warn and error methods")}const se=/^[a-z_$][a-z0-9_$:-]*$/i;function q(F,V){const{RULES:K}=this;if((0,o.eachItem)(F,X=>{if(K.keywords[X])throw new Error(`Keyword ${X} is already defined`);if(!se.test(X))throw new Error(`Keyword ${X} has invalid name`)}),!!V&&V.$data&&!("code"in V||"validate"in V))throw new Error('$data keyword must have "code" or "validate" function')}function Ge(F,V,K){var X;const d=V==null?void 0:V.post;if(K&&d)throw new Error('keyword with "post" flag cannot have "type"');const{RULES:m}=this;let J=d?m.post:m.rules.find(({type:v})=>v===K);if(J||(J={type:K,rules:[]},m.rules.push(J)),m.keywords[F]=!0,!V)return;const U={keyword:F,definition:Ze(A({},V),{type:(0,r.getJSONTypes)(V.type),schemaType:(0,r.getJSONTypes)(V.schemaType)})};V.before?Xe.call(this,J,U,V.before):J.rules.push(U),m.all[F]=U,(X=V.implements)===null||X===void 0||X.forEach(v=>this.addKeyword(v))}function Xe(F,V,K){const X=F.rules.findIndex(d=>d.keyword===K);X>=0?F.rules.splice(X,0,V):(F.rules.push(V),this.logger.warn(`rule ${K} is not defined`))}function fe(F){let{metaSchema:V}=F;V!==void 0&&(F.$data&&this.opts.$data&&(V=Dl(V)),F.validateSchema=this.compile(V,!0))}const ve={$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"};function Dl(F){return{anyOf:[F,ve]}}}(Qt);var Xt={},Jl={},Kl={};Object.defineProperty(Kl,"__esModule",{value:!0}),Kl.callRef=Kl.getValidate=void 0;const Vs=fl,Si=ne,Ce=oe,El=ke,Ri=Ke,Bc=Re,Ws={keyword:"$ref",schemaType:"string",code(e){const{gen:l,schema:c,it:t}=e,{baseId:i,schemaEnv:n,validateName:a,opts:b,self:p}=t,{root:r}=n;if((c==="#"||c==="#/")&&i===r.baseId)return h();const o=Ri.resolveRef.call(p,r,i,c);if(o===void 0)throw new Vs.default(t.opts.uriResolver,i,c);if(o instanceof Ri.SchemaEnv)return S(o);return H(o);function h(){if(n===r)return Ec(e,a,n,n.$async);const C=l.scopeValue("root",{ref:r});return Ec(e,(0,Ce._)`${C}.validate`,r,r.$async)}function S(C){const k=fi(e,C);Ec(e,k,C,C.$async)}function H(C){const k=l.scopeValue("schema",b.code.source===!0?{ref:C,code:(0,Ce.stringify)(C)}:{ref:C}),Y=l.name("valid"),G=e.subschema({schema:C,dataTypes:[],schemaPath:Ce.nil,topSchemaRef:k,errSchemaPath:c},Y);e.mergeEvaluated(G),e.ok(Y)}}};function fi(e,l){const{gen:c}=e;return l.validate?c.scopeValue("validate",{ref:l.validate}):(0,Ce._)`${c.scopeValue("wrapper",{ref:l})}.validate`}Kl.getValidate=fi;function Ec(e,l,c,t){const{gen:i,it:n}=e,{allErrors:a,schemaEnv:b,opts:p}=n,r=p.passContext?El.default.this:Ce.nil;t?o():h();function o(){if(!b.$async)throw new Error("async schema referenced by sync schema");const C=i.let("valid");i.try(()=>{i.code((0,Ce._)`await ${(0,Si.callValidateCode)(e,l,r)}`),H(l),a||i.assign(C,!0)},k=>{i.if((0,Ce._)`!(${k} instanceof ${n.ValidationError})`,()=>i.throw(k)),S(k),a||i.assign(C,!1)}),e.ok(C)}function h(){e.result((0,Si.callValidateCode)(e,l,r),()=>H(l),()=>S(l))}function S(C){const k=(0,Ce._)`${C}.errors`;i.assign(El.default.vErrors,(0,Ce._)`${El.default.vErrors} === null ? ${k} : ${El.default.vErrors}.concat(${k})`),i.assign(El.default.errors,(0,Ce._)`${El.default.vErrors}.length`)}function H(C){var k;if(!n.opts.unevaluated)return;const Y=(k=c==null?void 0:c.validate)===null||k===void 0?void 0:k.evaluated;if(n.props!==!0)if(Y&&!Y.dynamicProps)Y.props!==void 0&&(n.props=Bc.mergeEvaluated.props(i,Y.props,n.props));else{const G=i.var("props",(0,Ce._)`${C}.evaluated.props`);n.props=Bc.mergeEvaluated.props(i,G,n.props,Ce.Name)}if(n.items!==!0)if(Y&&!Y.dynamicItems)Y.items!==void 0&&(n.items=Bc.mergeEvaluated.items(i,Y.items,n.items));else{const G=i.var("items",(0,Ce._)`${C}.evaluated.items`);n.items=Bc.mergeEvaluated.items(i,G,n.items,Ce.Name)}}}Kl.callRef=Ec,Kl.default=Ws;var Fe={};Object.defineProperty(Fe,"__esModule",{value:!0}),Fe.checkMetadata=void 0;const Xs=Re,ys={keyword:"metadata",schemaType:"object",code(e){Li(e);const{gen:l,schema:c,it:t}=e;if((0,Xs.alwaysValidSchema)(t,c))return;const i=l.name("valid");e.subschema({keyword:"metadata",jtdMetadata:!0},i),e.ok(i)}};function Li({it:e,keyword:l},c){if(e.jtdMetadata!==c)throw new Error(`JTD: "${l}" cannot be used in this schema location`)}Fe.checkMetadata=Li,Fe.default=ys,Object.defineProperty(Jl,"__esModule",{value:!0}),Jl.hasRef=void 0;const Ji=Ke,ac=oe,Ys=fl,Ki=ke,Ni=Kl,Is=Fe,Ss={keyword:"ref",schemaType:"string",code(e){(0,Is.checkMetadata)(e);const{gen:l,data:c,schema:t,parentSchema:i,it:n}=e,{schemaEnv:{root:a}}=n,b=l.name("valid");i.nullable?(l.var(b,(0,ac._)`${c} === null`),l.if((0,ac.not)(b),p)):(l.var(b,!1),p()),e.ok(b);function p(){var h;const S=(h=a.schema.definitions)===null||h===void 0?void 0:h[t];if(!S)throw new Ys.default(n.opts.uriResolver,"",t,`No definition ${t}`);yt(S)||!n.opts.inlineRefs?r(S):o(S)}function r(h){const S=Ji.compileSchema.call(n.self,new Ji.SchemaEnv({schema:h,root:a,schemaPath:`/definitions/${t}`})),H=(0,Ni.getValidate)(e,S),C=l.const("_errs",Ki.default.errors);(0,Ni.callRef)(e,H,S,S.$async),l.assign(b,(0,ac._)`${C} === ${Ki.default.errors}`)}function o(h){const S=l.scopeValue("schema",n.opts.code.source===!0?{ref:h,code:(0,ac.stringify)(h)}:{ref:h});e.subschema({schema:h,dataTypes:[],schemaPath:ac.nil,topSchemaRef:S,errSchemaPath:`/definitions/${t}`},b)}}};function yt(e){for(const l in e){let c;if(l==="ref"||typeof(c=e[l])=="object"&&yt(c))return!0}return!1}Jl.hasRef=yt,Jl.default=Ss;var Yt={},jc={};Object.defineProperty(jc,"__esModule",{value:!0});const Rs=/t|\s/i,fs=/^(\d\d\d\d)-(\d\d)-(\d\d)$/,Ls=/^(\d\d):(\d\d):(\d\d)(?:\.\d+)?(?:z|([+-]\d\d)(?::?(\d\d))?)$/i,Js=[0,31,28,31,30,31,30,31,31,30,31,30,31];function Ci(e,l){const c=e.split(Rs);return c.length===2&&gi(c[0])&&Ks(c[1])||l&&c.length===1&&gi(c[0])}jc.default=Ci;function gi(e){const l=fs.exec(e);if(!l)return!1;const c=+l[1],t=+l[2],i=+l[3];return t>=1&&t<=12&&i>=1&&(i<=Js[t]||t===2&&i===29&&(c%100===0?c%400===0:c%4===0))}function Ks(e){const l=Ls.exec(e);if(!l)return!1;const c=+l[1],t=+l[2],i=+l[3],n=+(l[4]||0),a=+(l[5]||0);return c<=23&&t<=59&&i<=59||c-n===23&&t-a===59&&i===60}Ci.code='require("ajv/dist/runtime/timestamp").default';var Ue={};Object.defineProperty(Ue,"__esModule",{value:!0}),Ue.typeErrorParams=Ue.typeErrorMessage=Ue.typeError=void 0;const Ns=oe;function Cs(e){return{message:l=>Hi(l,e),params:l=>ki(l,e)}}Ue.typeError=Cs;function Hi({parentSchema:e},l){return e!=null&&e.nullable?`must be ${l} or null`:`must be ${l}`}Ue.typeErrorMessage=Hi;function ki({parentSchema:e},l){return(0,Ns._)`{type: ${l}, nullable: ${!!(e!=null&&e.nullable)}}`}Ue.typeErrorParams=ki,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.intRange=void 0;const l=oe,c=jc,t=Re,i=Fe,n=Ue;e.intRange={int8:[-128,127,3],uint8:[0,255,3],int16:[-32768,32767,5],uint16:[0,65535,5],int32:[-2147483648,2147483647,10],uint32:[0,4294967295,10]};const a={message:r=>(0,n.typeErrorMessage)(r,r.schema),params:r=>(0,n.typeErrorParams)(r,r.schema)};function b(r){const{gen:o,data:h,it:S}=r,{timestamp:H,allowDate:C}=S.opts;if(H==="date")return(0,l._)`${h} instanceof Date `;const k=(0,t.useFunc)(o,c.default),Y=C?(0,l._)`, true`:l.nil,G=(0,l._)`typeof ${h} == "string" && ${k}(${h}${Y})`;return H==="string"?G:(0,l.or)((0,l._)`${h} instanceof Date`,G)}const p={keyword:"type",schemaType:"string",error:a,code(r){(0,i.checkMetadata)(r);const{data:o,schema:h,parentSchema:S,it:H}=r;let C;switch(h){case"boolean":case"string":C=(0,l._)`typeof ${o} == ${h}`;break;case"timestamp":{C=b(r);break}case"float32":case"float64":C=(0,l._)`typeof ${o} == "number"`;break;default:{const k=h;if(C=(0,l._)`typeof ${o} == "number" && isFinite(${o}) && !(${o} % 1)`,!H.opts.int32range&&(k==="int32"||k==="uint32"))k==="uint32"&&(C=(0,l._)`${C} && ${o} >= 0`);else{const[Y,G]=e.intRange[k];C=(0,l._)`${C} && ${o} >= ${Y} && ${o} <= ${G}`}}}r.pass(S.nullable?(0,l.or)((0,l._)`${o} === null`,C):C)}};e.default=p}(Yt);var It={},Qe={};Object.defineProperty(Qe,"__esModule",{value:!0}),Qe.checkNullableObject=Qe.checkNullable=void 0;const Qc=oe;function Fi({gen:e,data:l,parentSchema:c},t=Qc.nil){const i=e.name("valid");return c.nullable?(e.let(i,(0,Qc._)`${l} === null`),t=(0,Qc.not)(i)):e.let(i,!1),[i,t]}Qe.checkNullable=Fi;function gs(e,l){const[c,t]=Fi(e,l);return[c,(0,Qc._)`${t} && typeof ${e.data} == "object" && !Array.isArray(${e.data})`]}Qe.checkNullableObject=gs,Object.defineProperty(It,"__esModule",{value:!0});const bl=oe,Hs=Fe,ks=Qe,Fs={keyword:"enum",schemaType:"array",error:{message:"must be equal to one of the allowed values",params:({schemaCode:e})=>(0,bl._)`{allowedValues: ${e}}`},code(e){(0,Hs.checkMetadata)(e);const{gen:l,data:c,schema:t,schemaValue:i,parentSchema:n,it:a}=e;if(t.length===0)throw new Error("enum must have non-empty array");if(t.length!==new Set(t).size)throw new Error("enum items must be unique");let b;const p=(0,bl._)`typeof ${c} == "string"`;if(t.length>=a.opts.loopEnum){let o;[b,o]=(0,ks.checkNullable)(e,p),l.if(o,r)}else{if(!Array.isArray(t))throw new Error("ajv implementation error");b=(0,bl.and)(p,(0,bl.or)(...t.map(o=>(0,bl._)`${c} === ${o}`))),n.nullable&&(b=(0,bl.or)((0,bl._)`${c} === null`,b))}e.pass(b);function r(){l.forOf("v",i,o=>l.if((0,bl._)`${b} = ${c} === ${o}`,()=>l.break()))}}};It.default=Fs;var St={};Object.defineProperty(St,"__esModule",{value:!0});const Us=Re,vs=ne,Ui=oe,Ts=Fe,xs=Qe,zs={keyword:"elements",schemaType:"object",error:(0,Ue.typeError)("array"),code(e){(0,Ts.checkMetadata)(e);const{gen:l,data:c,schema:t,it:i}=e;if((0,Us.alwaysValidSchema)(i,t))return;const[n]=(0,xs.checkNullable)(e);l.if((0,Ui.not)(n),()=>l.if((0,Ui._)`Array.isArray(${c})`,()=>l.assign(n,(0,vs.validateArray)(e)),()=>e.error())),e.ok(n)}};St.default=zs;var Rt={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.validateProperties=e.error=void 0;const l=ne,c=Re,t=oe,i=Fe,n=Qe,a=Ue;var b;(function(o){o.Additional="additional",o.Missing="missing"})(b||(b={})),e.error={message:o=>{const{params:h}=o;return h.propError?h.propError===b.Additional?"must NOT have additional properties":`must have property '${h.missingProperty}'`:(0,a.typeErrorMessage)(o,"object")},params:o=>{const{params:h}=o;return h.propError?h.propError===b.Additional?(0,t._)`{error: ${h.propError}, additionalProperty: ${h.additionalProperty}}`:(0,t._)`{error: ${h.propError}, missingProperty: ${h.missingProperty}}`:(0,a.typeErrorParams)(o,"object")}};const p={keyword:"properties",schemaType:"object",error:e.error,code:r};function r(o){(0,i.checkMetadata)(o);const{gen:h,data:S,parentSchema:H,it:C}=o,{additionalProperties:k,nullable:Y}=H;if(C.jtdDiscriminator&&Y)throw new Error("JTD: nullable inside discriminator mapping");if(R())throw new Error("JTD: properties and optionalProperties have common members");const[G,f]=g("properties"),[L,N]=g("optionalProperties");if(f.length===0&&N.length===0&&k)return;const[P,W]=C.jtdDiscriminator===void 0?(0,n.checkNullableObject)(o,S):[h.let("valid",!1),!0];h.if(W,()=>h.assign(P,!0).block(()=>{B(f,"properties",!0),B(N,"optionalProperties"),k||re()})),o.pass(P);function R(){const se=H.properties,q=H.optionalProperties;if(!(se&&q))return!1;for(const Ge in se)if(Object.prototype.hasOwnProperty.call(q,Ge))return!0;return!1}function g(se){const q=H[se],Ge=q?(0,l.allSchemaProperties)(q):[];if(C.jtdDiscriminator&&Ge.some(fe=>fe===C.jtdDiscriminator))throw new Error(`JTD: discriminator tag used in ${se}`);const Xe=Ge.filter(fe=>!(0,c.alwaysValidSchema)(C,q[fe]));return[Ge,Xe]}function B(se,q,Ge){const Xe=h.var("valid");for(const ve of se)h.if((0,l.propertyInData)(h,S,ve,C.opts.ownProperties),()=>D(ve,q,Xe),()=>fe(ve)),o.ok(Xe);function fe(ve){Ge?(h.assign(Xe,!1),o.error(!1,{propError:b.Missing,missingProperty:ve},{schemaPath:ve})):h.assign(Xe,!0)}}function D(se,q,Ge){o.subschema({keyword:q,schemaProp:se,dataProp:se},Ge)}function re(){h.forIn("key",S,se=>{const q=C.jtdDiscriminator===void 0?G:[C.jtdDiscriminator].concat(G),Ge=$(se,q,"properties"),Xe=$(se,L,"optionalProperties"),fe=Ge===!0?Xe:Xe===!0?Ge:(0,t.and)(Ge,Xe);h.if(fe,()=>{C.opts.removeAdditional?h.code((0,t._)`delete ${S}[${se}]`):(o.error(!1,{propError:b.Additional,additionalProperty:se},{instancePath:se,parentSchema:!0}),C.opts.allErrors||h.break())})})}function $(se,q,Ge){let Xe;if(q.length>8){const fe=(0,c.schemaRefOrVal)(C,H[Ge],Ge);Xe=(0,t.not)((0,l.isOwnProperty)(h,fe,se))}else q.length?Xe=(0,t.and)(...q.map(fe=>(0,t._)`${se} !== ${fe}`)):Xe=!0;return Xe}}e.validateProperties=r,e.default=p})(Rt);var ft={};Object.defineProperty(ft,"__esModule",{value:!0});const vi=Rt,ws={keyword:"optionalProperties",schemaType:"object",error:vi.error,code(e){e.parentSchema.properties||(0,vi.validateProperties)(e)}};ft.default=ws;var Lt={},Ti={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.DiscrError=void 0,function(l){l.Tag="tag",l.Mapping="mapping"}(e.DiscrError||(e.DiscrError={}))})(Ti),Object.defineProperty(Lt,"__esModule",{value:!0});const Nl=oe,Ps=Fe,Bs=Qe,xi=Ue,Mc=Ti,Es={keyword:"discriminator",schemaType:"string",implements:["mapping"],error:{message:e=>{const{schema:l,params:c}=e;return c.discrError?c.discrError===Mc.DiscrError.Tag?`tag "${l}" must be string`:`value of tag "${l}" must be in mapping`:(0,xi.typeErrorMessage)(e,"object")},params:e=>{const{schema:l,params:c}=e;return c.discrError?(0,Nl._)`{error: ${c.discrError}, tag: ${l}, tagValue: ${c.tag}}`:(0,xi.typeErrorParams)(e,"object")}},code(e){(0,Ps.checkMetadata)(e);const{gen:l,data:c,schema:t,parentSchema:i}=e,[n,a]=(0,Bs.checkNullableObject)(e,c);l.if(a),b(),l.elseIf((0,Nl.not)(n)),e.error(),l.endIf(),e.ok(n);function b(){const o=l.const("tag",(0,Nl._)`${c}${(0,Nl.getProperty)(t)}`);l.if((0,Nl._)`${o} === undefined`),e.error(!1,{discrError:Mc.DiscrError.Tag,tag:o}),l.elseIf((0,Nl._)`typeof ${o} == "string"`),p(o),l.else(),e.error(!1,{discrError:Mc.DiscrError.Tag,tag:o},{instancePath:t}),l.endIf()}function p(o){l.if(!1);for(const h in i.mapping)l.elseIf((0,Nl._)`${o} === ${h}`),l.assign(n,r(h));l.else(),e.error(!1,{discrError:Mc.DiscrError.Mapping,tag:o},{instancePath:t,schemaPath:"mapping",parentSchema:!0}),l.endIf()}function r(o){const h=l.name("valid");return e.subschema({keyword:"mapping",schemaProp:o,jtdDiscriminator:t},h),h}}};Lt.default=Es;var Jt={};Object.defineProperty(Jt,"__esModule",{value:!0});const zi=Re,wi=oe,js=Fe,Qs=Qe,Ms={keyword:"values",schemaType:"object",error:(0,Ue.typeError)("object"),code(e){(0,js.checkMetadata)(e);const{gen:l,data:c,schema:t,it:i}=e;if((0,zi.alwaysValidSchema)(i,t))return;const[n,a]=(0,Qs.checkNullableObject)(e,c);l.if(a),l.assign(n,b()),l.elseIf((0,wi.not)(n)),e.error(),l.endIf(),e.ok(n);function b(){const p=l.name("valid");if(i.allErrors){const o=l.let("valid",!0);return r(()=>l.assign(o,!1)),o}return l.var(p,!0),r(()=>l.break()),p;function r(o){l.forIn("key",c,h=>{e.subschema({keyword:"values",dataProp:h,dataPropType:zi.Type.Str},p),l.if((0,wi.not)(p),o)})}}}};Jt.default=Ms;var Kt={};Object.defineProperty(Kt,"__esModule",{value:!0});const Os={keyword:"union",schemaType:"array",trackErrors:!0,code:ne.validateUnion,error:{message:"must match a schema in union"}};Kt.default=Os,Object.defineProperty(Xt,"__esModule",{value:!0});const Ds=Jl,As=Yt,_s=It,$s=St,qs=Rt,ea=ft,la=Lt,ca=Jt,ta=Kt,ia=Fe,na=["definitions",Ds.default,As.default,_s.default,$s.default,qs.default,ea.default,la.default,ca.default,ta.default,ia.default,{keyword:"additionalProperties",schemaType:"boolean"},{keyword:"nullable",schemaType:"boolean"}];Xt.default=na;var Nt={};Object.defineProperty(Nt,"__esModule",{value:!0});const cl=e=>{const l={nullable:{type:"boolean"},metadata:{optionalProperties:{union:{elements:{ref:"schema"}}},additionalProperties:!0}};return e&&(l.definitions={values:{ref:"schema"}}),l},da=e=>({optionalProperties:cl(e)}),sa=e=>({properties:{ref:{type:"string"}},optionalProperties:cl(e)}),aa=e=>({properties:{type:{enum:["boolean","timestamp","string","float32","float64","int8","uint8","int16","uint16","int32","uint32"]}},optionalProperties:cl(e)}),oa=e=>({properties:{enum:{elements:{type:"string"}}},optionalProperties:cl(e)}),Za=e=>({properties:{elements:{ref:"schema"}},optionalProperties:cl(e)}),Pi=e=>({properties:{properties:{values:{ref:"schema"}}},optionalProperties:A({optionalProperties:{values:{ref:"schema"}},additionalProperties:{type:"boolean"}},cl(e))}),Bi=e=>({properties:{optionalProperties:{values:{ref:"schema"}}},optionalProperties:A({additionalProperties:{type:"boolean"}},cl(e))}),ma=e=>({properties:{discriminator:{type:"string"},mapping:{values:{metadata:{union:[Pi(!1),Bi(!1)]}}}},optionalProperties:cl(e)}),ua=e=>({properties:{values:{ref:"schema"}},optionalProperties:cl(e)}),Ei=e=>({metadata:{union:[da,sa,aa,oa,Za,Pi,Bi,ma,ua].map(l=>l(e))}}),ba=A({definitions:{schema:Ei(!1)}},Ei(!0));Nt.default=ba;var Ct={},oc={};Object.defineProperty(oc,"__esModule",{value:!0}),oc.jtdForms=void 0,oc.jtdForms=["elements","values","discriminator","properties","optionalProperties","enum","type","ref"];var gt={};Object.defineProperty(gt,"__esModule",{value:!0});const Ht=/[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,ra={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};function ji(e){return Ht.lastIndex=0,'"'+(Ht.test(e)?e.replace(Ht,l=>{const c=ra[l];return typeof c=="string"?c:"\\u"+("0000"+l.charCodeAt(0).toString(16)).slice(-4)}):e)+'"'}gt.default=ji,ji.code='require("ajv/dist/runtime/quote").default',Object.defineProperty(Ct,"__esModule",{value:!0});const ha=oc,Qi=Ke,te=oe,pa=fl,be=ke,Ga=ne,Va=Jl,Wa=Re,Xa=gt,ya={elements:Ia,values:Sa,discriminator:Ra,properties:Di,optionalProperties:Di,enum:mc,type:fa,ref:Ja};function Mi(e,l){const c=Qi.getCompilingSchema.call(this,e);if(c)return c;const{es5:t,lines:i}=this.opts.code,{ownProperties:n}=this.opts,a=new te.CodeGen(this.scope,{es5:t,lines:i,ownProperties:n}),b=a.scopeName("serialize"),p={self:this,gen:a,schema:e.schema,schemaEnv:e,definitions:l,data:be.default.data};let r;try{this._compilations.add(e),e.serializeName=b,a.func(b,be.default.data,!1,()=>{a.let(be.default.json,(0,te.str)``),Zc(p),a.return(be.default.json)}),a.optimize(this.opts.code.optimize);const o=a.toString();r=`${a.scopeRefs(be.default.scope)}return ${o}`;const S=new Function(`${be.default.scope}`,r)(this.scope.get());this.scope.value(b,{ref:S}),e.serialize=S}catch(o){throw r&&this.logger.error("Error compiling serializer, function code:",r),delete e.serialize,delete e.serializeName,o}finally{this._compilations.delete(e)}return e}Ct.default=Mi;function Zc(e){let l;for(const c of ha.jtdForms)if(c in e.schema){l=c;break}Ya(e,l?ya[l]:Na)}function Ya(e,l){const{gen:c,schema:t,data:i}=e;if(!t.nullable)return l(e);c.if((0,te._)`${i} === undefined || ${i} === null`,()=>c.add(be.default.json,(0,te._)`"null"`),()=>l(e))}function Ia(e){const{gen:l,schema:c,data:t}=e;l.add(be.default.json,(0,te.str)`[`);const i=l.let("first",!0);l.forOf("el",t,n=>{_i(e,i),Zc(Ze(A({},e),{schema:c.elements,data:n}))}),l.add(be.default.json,(0,te.str)`]`)}function Sa(e){const{gen:l,schema:c,data:t}=e;l.add(be.default.json,(0,te.str)`{`);const i=l.let("first",!0);l.forIn("key",t,n=>Oi(e,n,c.values,i)),l.add(be.default.json,(0,te.str)`}`)}function Oi(e,l,c,t){const{gen:i,data:n}=e;_i(e,t),mc(Ze(A({},e),{data:l})),i.add(be.default.json,(0,te.str)`:`);const a=i.const("value",(0,te._)`${n}${(0,te.getProperty)(l)}`);Zc(Ze(A({},e),{schema:c,data:a}))}function Ra(e){const{gen:l,schema:c,data:t}=e,{discriminator:i}=c;l.add(be.default.json,(0,te.str)`{${JSON.stringify(i)}:`);const n=l.const("tag",(0,te._)`${t}${(0,te.getProperty)(i)}`);mc(Ze(A({},e),{data:n})),l.if(!1);for(const a in c.mapping){l.elseIf((0,te._)`${n} === ${a}`);const b=c.mapping[a];Ai(Ze(A({},e),{schema:b}),i)}l.endIf(),l.add(be.default.json,(0,te.str)`}`)}function Di(e){const{gen:l}=e;l.add(be.default.json,(0,te.str)`{`),Ai(e),l.add(be.default.json,(0,te.str)`}`)}function Ai(e,l){const{gen:c,schema:t,data:i}=e,{properties:n,optionalProperties:a}=t,b=h(n),p=h(a),r=S(b.concat(p));let o=!l;for(const Y of b)C(Y,n[Y],H(Y));for(const Y of p){const G=H(Y);c.if((0,te.and)((0,te._)`${G} !== undefined`,(0,Ga.isOwnProperty)(c,i,Y)),()=>C(Y,a[Y],G))}t.additionalProperties&&c.forIn("key",i,Y=>c.if(k(Y,r),()=>Oi(e,Y,{},c.let("first",o))));function h(Y){return Y?Object.keys(Y):[]}function S(Y){if(l&&Y.push(l),new Set(Y).size!==Y.length)throw new Error("JTD: properties/optionalProperties/disciminator overlap");return Y}function H(Y){return c.const("value",(0,te._)`${i}${(0,te.getProperty)(Y)}`)}function C(Y,G,f){o?o=!1:c.add(be.default.json,(0,te.str)`,`),c.add(be.default.json,(0,te.str)`${JSON.stringify(Y)}:`),Zc(Ze(A({},e),{schema:G,data:f}))}function k(Y,G){return G.length?(0,te.and)(...G.map(f=>(0,te._)`${Y} !== ${f}`)):!0}}function fa(e){const{gen:l,schema:c,data:t}=e;switch(c.type){case"boolean":l.add(be.default.json,(0,te._)`${t} ? "true" : "false"`);break;case"string":mc(e);break;case"timestamp":l.if((0,te._)`${t} instanceof Date`,()=>l.add(be.default.json,(0,te._)`'"' + ${t}.toISOString() + '"'`),()=>mc(e));break;default:La(e)}}function mc({gen:e,data:l}){e.add(be.default.json,(0,te._)`${(0,Wa.useFunc)(e,Xa.default)}(${l})`)}function La({gen:e,data:l}){e.add(be.default.json,(0,te._)`"" + ${l}`)}function Ja(e){const{gen:l,self:c,data:t,definitions:i,schema:n,schemaEnv:a}=e,{ref:b}=n,p=i[b];if(!p)throw new pa.default(c.opts.uriResolver,"",b,`No definition ${b}`);if(!(0,Va.hasRef)(p))return Zc(Ze(A({},e),{schema:p}));const{root:r}=a,o=Mi.call(c,new Qi.SchemaEnv({schema:p,root:r}),i);l.add(be.default.json,(0,te._)`${Ka(l,o)}(${t})`)}function Ka(e,l){return l.serialize?e.scopeValue("serialize",{ref:l.serialize}):(0,te._)`${e.scopeValue("wrapper",{ref:l})}.serialize`}function Na({gen:e,data:l}){e.add(be.default.json,(0,te._)`JSON.stringify(${l})`)}function _i({gen:e},l){e.if(l,()=>e.assign(l,!1),()=>e.add(be.default.json,(0,te.str)`,`))}var kt={},rl={};Object.defineProperty(rl,"__esModule",{value:!0}),rl.parseJsonString=rl.parseJsonNumber=rl.parseJson=void 0;const Ca=/position\s(\d+)$/;function tl(e,l){let c;tl.message=void 0;let t;l&&(e=e.slice(l));try{return tl.position=l+e.length,JSON.parse(e)}catch(i){if(t=Ca.exec(i.message),!t){tl.message="unexpected end";return}c=+t[1];const n=e[c];e=e.slice(0,c),tl.position=l+c;try{return JSON.parse(e)}catch{tl.message=`unexpected token ${n}`;return}}}rl.parseJson=tl,tl.message=void 0,tl.position=0,tl.code='require("ajv/dist/runtime/parseJson").parseJson';function il(e,l,c){let t="",i;if(il.message=void 0,e[l]==="-"&&(t+="-",l++),e[l]==="0")t+="0",l++;else if(!n(c)){a();return}if(c)return il.position=l,+t;if(e[l]==="."&&(t+=".",l++,!n())){a();return}if(i=e[l],(i==="e"||i==="E")&&(t+="e",l++,i=e[l],(i==="+"||i==="-")&&(t+=i,l++),!n())){a();return}return il.position=l,+t;function n(b){let p=!1;for(;i=e[l],i>="0"&&i<="9"&&(b===void 0||b-- >0);)p=!0,t+=i,l++;return p}function a(){il.position=l,il.message=l<e.length?`unexpected token ${e[l]}`:"unexpected end"}}rl.parseJsonNumber=il,il.message=void 0,il.position=0,il.code='require("ajv/dist/runtime/parseJson").parseJsonNumber';const $i={b:"\b",f:"\f",n:`
6
+ `,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},ga="a".charCodeAt(0),Ha="0".charCodeAt(0);function hl(e,l){let c="",t;for(hl.message=void 0;t=e[l++],t!=='"';)if(t==="\\")if(t=e[l],t in $i)c+=$i[t],l++;else if(t==="u"){l++;let n=4,a=0;for(;n--;){if(a<<=4,t=e[l],t===void 0){i("unexpected end");return}if(t=t.toLowerCase(),t>="a"&&t<="f")a+=t.charCodeAt(0)-ga+10;else if(t>="0"&&t<="9")a+=t.charCodeAt(0)-Ha;else{i(`unexpected token ${t}`);return}l++}c+=String.fromCharCode(a)}else{i(`unexpected token ${t}`);return}else if(t===void 0){i("unexpected end");return}else if(t.charCodeAt(0)>=32)c+=t;else{i(`unexpected token ${t}`);return}return hl.position=l,c;function i(n){hl.position=l,hl.message=n}}rl.parseJsonString=hl,hl.message=void 0,hl.position=0,hl.code='require("ajv/dist/runtime/parseJson").parseJsonString',Object.defineProperty(kt,"__esModule",{value:!0});const ka=oc,qi=Ke,x=oe,Fa=fl,_=ke,Ua=ne,va=Jl,Ta=Yt,Ft=rl,en=Re,xa=jc,za={elements:Ea,values:ja,discriminator:Ma,properties:tn,optionalProperties:tn,enum:Da,type:Oa,ref:Aa};function ln(e,l){const c=qi.getCompilingSchema.call(this,e);if(c)return c;const{es5:t,lines:i}=this.opts.code,{ownProperties:n}=this.opts,a=new x.CodeGen(this.scope,{es5:t,lines:i,ownProperties:n}),b=a.scopeName("parse"),p={self:this,gen:a,schema:e.schema,schemaEnv:e,definitions:l,data:_.default.data,parseName:b,char:a.name("c")};let r;try{this._compilations.add(e),e.parseName=b,wa(p),a.optimize(this.opts.code.optimize);const o=a.toString();r=`${a.scopeRefs(_.default.scope)}return ${o}`;const S=new Function(`${_.default.scope}`,r)(this.scope.get());this.scope.value(b,{ref:S}),e.parse=S}catch(o){throw r&&this.logger.error("Error compiling parser, function code:",r),delete e.parse,delete e.parseName,o}finally{this._compilations.delete(e)}return e}kt.default=ln;const Ut=(0,x._)`undefined`;function wa(e){const{gen:l,parseName:c,char:t}=e;l.func(c,(0,x._)`${_.default.json}, ${_.default.jsonPos}, ${_.default.jsonPart}`,!1,()=>{l.let(_.default.data),l.let(t),l.assign((0,x._)`${c}.message`,Ut),l.assign((0,x._)`${c}.position`,Ut),l.assign(_.default.jsonPos,(0,x._)`${_.default.jsonPos} || 0`),l.const(_.default.jsonLen,(0,x._)`${_.default.json}.length`),Oc(e),wt(e),l.if(_.default.jsonPart,()=>{l.assign((0,x._)`${c}.position`,_.default.jsonPos),l.return(_.default.data)}),l.if((0,x._)`${_.default.jsonPos} === ${_.default.jsonLen}`,()=>l.return(_.default.data)),jl(e)})}function Oc(e){let l;for(const c of ka.jtdForms)if(c in e.schema){l=c;break}l?Ba(e,za[l]):xt(e)}const Pa=an(!0,an(!1,jl));function Ba(e,l){const{gen:c,schema:t,data:i}=e;if(!t.nullable)return l(e);uc(e,"null",l,()=>c.assign(i,null))}function Ea(e){const{gen:l,schema:c,data:t}=e;Me(e,"[");const i=l.let("i",0);l.assign(t,(0,x._)`[]`),vt(e,"]",()=>{const n=l.let("el");Oc(Ze(A({},e),{schema:c.elements,data:n})),l.assign((0,x._)`${t}[${i}++]`,n)})}function ja(e){const{gen:l,schema:c,data:t}=e;Me(e,"{"),l.assign(t,(0,x._)`{}`),vt(e,"}",()=>Qa(e,c.values))}function vt(e,l,c){cn(e,l,c),Me(e,l)}function cn(e,l,c){const{gen:t}=e;t.for((0,x._)`;${_.default.jsonPos}<${_.default.jsonLen} && ${Dc(1)}!==${l};`,()=>{c(),uc(e,",",()=>t.break(),i)});function i(){uc(e,l,()=>{},jl)}}function Qa(e,l){const{gen:c}=e,t=c.let("key");Cl(Ze(A({},e),{data:t})),Me(e,":"),sn(e,t,l)}function Ma(e){const{gen:l,data:c,schema:t}=e,{discriminator:i,mapping:n}=t;Me(e,"{"),l.assign(c,(0,x._)`{}`);const a=l.const("pos",_.default.jsonPos),b=l.let("value"),p=l.let("tag");cn(e,"}",()=>{const r=l.let("key");Cl(Ze(A({},e),{data:r})),Me(e,":"),l.if((0,x._)`${r} === ${i}`,()=>{Cl(Ze(A({},e),{data:p})),l.assign((0,x._)`${c}[${r}]`,p),l.break()},()=>xt(Ze(A({},e),{data:b})))}),l.assign(_.default.jsonPos,a),l.if((0,x._)`${p} === undefined`),nl(e,(0,x.str)`discriminator tag not found`);for(const r in n)l.elseIf((0,x._)`${p} === ${r}`),nn(Ze(A({},e),{schema:n[r]}),i);l.else(),nl(e,(0,x.str)`discriminator value not in schema`),l.endIf()}function tn(e){const{gen:l,data:c}=e;Me(e,"{"),l.assign(c,(0,x._)`{}`),nn(e)}function nn(e,l){const{gen:c,schema:t,data:i}=e,{properties:n,optionalProperties:a,additionalProperties:b}=t;if(vt(e,"}",()=>{const p=c.let("key");if(Cl(Ze(A({},e),{data:p})),Me(e,":"),c.if(!1),dn(e,p,n),dn(e,p,a),l){c.elseIf((0,x._)`${p} === ${l}`);const r=c.let("tag");Cl(Ze(A({},e),{data:r}))}c.else(),b?xt(Ze(A({},e),{data:(0,x._)`${i}[${p}]`})):nl(e,(0,x.str)`property ${p} not allowed`),c.endIf()}),n){const p=(0,Ua.hasPropFunc)(c),r=(0,x.and)(...Object.keys(n).map(o=>(0,x._)`${p}.call(${i}, ${o})`));c.if((0,x.not)(r),()=>nl(e,(0,x.str)`missing required properties`))}}function dn(e,l,c={}){const{gen:t}=e;for(const i in c)t.elseIf((0,x._)`${l} === ${i}`),sn(e,l,c[i])}function sn(e,l,c){Oc(Ze(A({},e),{schema:c,data:(0,x._)`${e.data}[${l}]`}))}function Oa(e){const{gen:l,schema:c,data:t,self:i}=e;switch(c.type){case"boolean":Pa(e);break;case"string":Cl(e);break;case"timestamp":{Cl(e);const n=(0,en.useFunc)(l,xa.default),{allowDate:a,parseDate:b}=i.opts,p=a?(0,x._)`!${n}(${t}, true)`:(0,x._)`!${n}(${t})`,r=b?(0,x.or)(p,(0,x._)`(${t} = new Date(${t}), false)`,(0,x._)`isNaN(${t}.valueOf())`):p;l.if(r,()=>nl(e,(0,x.str)`invalid timestamp`));break}case"float32":case"float64":Tt(e);break;default:{const n=c.type;if(!i.opts.int32range&&(n==="int32"||n==="uint32"))Tt(e,16),n==="uint32"&&l.if((0,x._)`${t} < 0`,()=>nl(e,(0,x.str)`integer out of range`));else{const[a,b,p]=Ta.intRange[n];Tt(e,p),l.if((0,x._)`${t} < ${a} || ${t} > ${b}`,()=>nl(e,(0,x.str)`integer out of range`))}}}}function Cl(e){Me(e,'"'),zt(e,Ft.parseJsonString)}function Da(e){const{gen:l,data:c,schema:t}=e,i=t.enum;Me(e,'"'),l.if(!1);for(const n of i){const a=JSON.stringify(n).slice(1);l.elseIf((0,x._)`${Dc(a.length)} === ${a}`),l.assign(c,(0,x.str)`${n}`),l.add(_.default.jsonPos,a.length)}l.else(),jl(e),l.endIf()}function Tt(e,l){const{gen:c}=e;wt(e),c.if((0,x._)`"-0123456789".indexOf(${Dc(1)}) < 0`,()=>jl(e),()=>zt(e,Ft.parseJsonNumber,l))}function an(e,l){return c=>{const{gen:t,data:i}=c;uc(c,`${e}`,()=>l(c),()=>t.assign(i,e))}}function Aa(e){const{gen:l,self:c,definitions:t,schema:i,schemaEnv:n}=e,{ref:a}=i,b=t[a];if(!b)throw new Fa.default(c.opts.uriResolver,"",a,`No definition ${a}`);if(!(0,va.hasRef)(b))return Oc(Ze(A({},e),{schema:b}));const{root:p}=n,r=ln.call(c,new qi.SchemaEnv({schema:b,root:p}),t);on(e,_a(l,r),!0)}function _a(e,l){return l.parse?e.scopeValue("parse",{ref:l.parse}):(0,x._)`${e.scopeValue("wrapper",{ref:l})}.parse`}function xt(e){zt(e,Ft.parseJson)}function zt(e,l,c){on(e,(0,en.useFunc)(e.gen,l),c)}function on(e,l,c){const{gen:t,data:i}=e;t.assign(i,(0,x._)`${l}(${_.default.json}, ${_.default.jsonPos}${c?(0,x._)`, ${c}`:x.nil})`),t.assign(_.default.jsonPos,(0,x._)`${l}.position`),t.if((0,x._)`${i} === undefined`,()=>nl(e,(0,x._)`${l}.message`))}function Me(e,l){uc(e,l,jl)}function uc(e,l,c,t){const{gen:i}=e,n=l.length;wt(e),i.if((0,x._)`${Dc(n)} === ${l}`,()=>{i.add(_.default.jsonPos,n),t==null||t(e)},()=>c(e))}function wt({gen:e,char:l}){e.code((0,x._)`while((${l}=${_.default.json}[${_.default.jsonPos}],${l}===" "||${l}==="\\n"||${l}==="\\r"||${l}==="\\t"))${_.default.jsonPos}++;`)}function Dc(e){return e===1?(0,x._)`${_.default.json}[${_.default.jsonPos}]`:(0,x._)`${_.default.json}.slice(${_.default.jsonPos}, ${_.default.jsonPos}+${e})`}function jl(e){nl(e,(0,x._)`"unexpected token " + ${_.default.json}[${_.default.jsonPos}]`)}function nl({gen:e,parseName:l},c){e.assign((0,x._)`${l}.message`,c),e.assign((0,x._)`${l}.position`,_.default.jsonPos),e.return(Ut)}(function(e,l){Object.defineProperty(l,"__esModule",{value:!0}),l.CodeGen=l.Name=l.nil=l.stringify=l.str=l._=l.KeywordCxt=void 0;const c=Qt,t=Xt,i=Nt,n=Ct,a=kt,b="JTD-meta-schema";class p extends c.default{constructor(S={}){super(Ze(A({},S),{jtd:!0}))}_addVocabularies(){super._addVocabularies(),this.addVocabulary(t.default)}_addDefaultMetaSchema(){super._addDefaultMetaSchema(),this.opts.meta&&this.addMetaSchema(i.default,b,!1)}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(b)?b:void 0)}compileSerializer(S){const H=this._addSchema(S);return H.serialize||this._compileSerializer(H)}compileParser(S){const H=this._addSchema(S);return H.parse||this._compileParser(H)}_compileSerializer(S){if(n.default.call(this,S,S.schema.definitions||{}),!S.serialize)throw new Error("ajv implementation error");return S.serialize}_compileParser(S){if(a.default.call(this,S,S.schema.definitions||{}),!S.parse)throw new Error("ajv implementation error");return S.parse}}e.exports=l=p,Object.defineProperty(l,"__esModule",{value:!0}),l.default=p;var r=Be;Object.defineProperty(l,"KeywordCxt",{enumerable:!0,get:function(){return r.KeywordCxt}});var o=oe;Object.defineProperty(l,"_",{enumerable:!0,get:function(){return o._}}),Object.defineProperty(l,"str",{enumerable:!0,get:function(){return o.str}}),Object.defineProperty(l,"stringify",{enumerable:!0,get:function(){return o.stringify}}),Object.defineProperty(l,"nil",{enumerable:!0,get:function(){return o.nil}}),Object.defineProperty(l,"Name",{enumerable:!0,get:function(){return o.Name}}),Object.defineProperty(l,"CodeGen",{enumerable:!0,get:function(){return o.CodeGen}})})(dt,dt.exports);var $a=E&&E.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Il,"__esModule",{value:!0}),Il.Validate=Il.AddSchema=void 0;const qa=$a(dt.exports),Zn=new qa.default,eo=(e,l)=>e(l)?null:e.errors;function lo(e,l){Zn.addSchema(l,e)}Il.AddSchema=lo;function co(e,l){const c=Zn.getSchema(e);if(c)return eo(c,l)}Il.Validate=co,Object.defineProperty(Fc,"__esModule",{value:!0}),Fc.STSOptionsBase=void 0;const to=Il;class io{constructor(l=null){tc(this,"_options");this._options=l,l!==null&&(typeof l.validator=="undefined"||(0,to.Validate)(l.validator,l))}get options(){return this._options}}Fc.STSOptionsBase=io;var Ql={};Object.defineProperty(Ql,"__esModule",{value:!0}),Ql.JestSleep=Ql.Sleep=void 0;async function mn(e=1e3){return new Promise(l=>setTimeout(l,e))}Ql.Sleep=mn;async function no(){return mn(100)}Ql.JestSleep=no;var un={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.compareParameterTypes=e.OAuth2ParameterErrorType=e.OIDCAddressClaim=e.OIDCStandardClaim=e.OAuth2ParameterType=void 0,function(t){t.AUDIENCE="AUDIENCE",t.CLIENT_ID="client_id",t.CLIENT_SECRET="client_secret",t.RESPONSE_TYPE="response_type",t.SCOPE="scope",t.STATE="state",t.REDIRECT_URI="redirect_uri",t.ERROR="error",t.ERROR_DESCRIPTION="error_description",t.ERROR_CODES="error_codes",t.ERROR_URI="error_uri",t.GRANT_TYPE="grant_type",t.CODE="code",t.ACCESS_TOKEN="access_token",t.TOKEN_TYPE="token_type",t.EXPIRES_IN="expires_in",t.USERNAME="username",t.PASSWORD="password",t.REFRESH_TOKEN="refresh_token",t.RESPONSE_MODE="response_mode",t.TIMESTAMP="timestamp",t.TRACE_ID="trace_id",t.CORRELATION_ID="correlation_id"}(e.OAuth2ParameterType||(e.OAuth2ParameterType={})),function(t){t.SUB="sub",t.NAME="name",t.GIVEN_NAME="given_name",t.FAMILY_NAME="family_name",t.MIDDLE_NAME="middle_name",t.NICKNAME="nickname",t.PREFERRED_USERNAME="preferred_username",t.PROFILE="profile",t.PICTURE="picture",t.WEBSITE="website",t.EMAIL="email",t.EMAIL_VERIFIED="email_verified",t.GENDER="gender",t.BIRTHDATE="birthdate",t.ZONEINFO="zoneinfo",t.LOCALE="locale",t.PHONE_NUMBER="phone_number",t.PHONE_NUMBER_VERIFIED="phone_number_verified",t.ADDRESS="address",t.CLIENT_SECRET="client_secret",t.NONCE="nonce"}(e.OIDCStandardClaim||(e.OIDCStandardClaim={})),function(t){t.FORMATTED="formatted",t.STREET_ADDRESS="street_address",t.LOCALITY="locality",t.REGION="region",t.COUNTRY="country"}(e.OIDCAddressClaim||(e.OIDCAddressClaim={}));class l{}tc(l,"NOT_EQUAL",{code:"STS_OAUTH2_ERR_0001",description:"Parameter values not equal."}),tc(l,"NOT_PRESENT",{code:"STS_OAUTH2_ERR_0002",description:"Parameter not provided."}),tc(l,"INVALID_FORMAT",{code:"STS_OAUTH2_ERR_0003",description:"Parameter value format invalid."}),tc(l,"EXPIRED",{code:"STS_OAUTH2_ERR_0004",description:"Parameter value expired."}),e.OAuth2ParameterErrorType=l;function c(t,i,n){const a=[];for(let b=0;b<n.length;b++){const p=n[b];if(t[b].localeCompare(i[b])!==0){const r={error:l.NOT_EQUAL.code,error_description:l.NOT_EQUAL.description,timestamp:Date.now(),details:`${l.NOT_EQUAL.description}: Parameter: [${p}]`};a.push(r)}}return a}e.compareParameterTypes=c})(un),function(e){var l=E&&E.__createBinding||(Object.create?function(i,n,a,b){b===void 0&&(b=a);var p=Object.getOwnPropertyDescriptor(n,a);(!p||("get"in p?!n.__esModule:p.writable||p.configurable))&&(p={enumerable:!0,get:function(){return n[a]}}),Object.defineProperty(i,b,p)}:function(i,n,a,b){b===void 0&&(b=a),i[b]=n[a]}),c=E&&E.__exportStar||function(i,n){for(var a in i)a!=="default"&&!Object.prototype.hasOwnProperty.call(n,a)&&l(n,i,a)};Object.defineProperty(e,"__esModule",{value:!0}),e.$stsgdf=e.$stsgd=void 0,c(kc,e),c(Fc,e),c(Ql,e),c(Il,e),c(un,e),e.$stsgd={};function t(){return e.$stsgd}e.$stsgdf=t}(Hc);class so{constructor(){this.DigestMessage=async function(l){const t=new TextEncoder().encode(l),i=await crypto.subtle.digest("SHA-256",t),n=Array.from(new Uint8Array(i));return btoa(String.fromCharCode(...n))},this.CreateRandomString=(l=43)=>{const c=Array.from(crypto.getRandomValues(new Uint8Array(l)));return btoa(String.fromCharCode(...c))},this.CreateRandomStringEx=()=>{const l="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_~.";let c="";return Array.from(crypto.getRandomValues(new Uint8Array(43))).forEach(i=>c+=l[i%l.length]),c}}}class ao{constructor(){this.DecodeQueryParams=l=>{const c={};return Object.keys(l).filter(t=>typeof l[t]!="undefined").map(t=>{c[decodeURIComponent(t)]=decodeURIComponent(l[t])}),c},this.CreateQueryParams=l=>Object.keys(l).filter(c=>typeof l[c]!="undefined").map(c=>Array.isArray(l[c])?encodeURIComponent(c)+"="+encodeURIComponent(l[c].join(" ")):encodeURIComponent(c)+"="+encodeURIComponent(l[c])).join("&"),this._GetQueryParams=l=>{let c={};const t=l.split("?");if(t.length==2){const i=t[1].split("&"),n={};let a="";i.forEach(function(b){a=b.split("="),a.length==2&&(n[a[0]]=a[1])}),c=this.DecodeQueryParams(n)}return c},this.GetQueryParams=()=>this._GetQueryParams(window.location.href)}}var bn=(e=>(e.CODE="code",e.ID_TOKEN="id_token",e.TOKEN="token",e))(bn||{}),rn=(e=>(e.QUERY="query",e.FRAGMENT="fragment",e.FORM_POST="form_post",e))(rn||{}),hn=(e=>(e.CLIENT_CREDENTIALS="client_credentials",e.AUTHORIZATION_CODE="authorization_code",e.REFRESH_TOKEN="refresh_token",e))(hn||{}),dl=(e=>(e.RESTORE_SESSION="RestoreSession",e.AUTHORIZE="Authorize",e.HANDLE_REDIRECT="HandleRedirect",e.LOGOUT="Logout",e.AUTHENTICATE_EVENT="AuthenticateEvent",e.ERROR="Error",e))(dl||{}),bc=E&&E.__assign||function(){return bc=Object.assign||function(e){for(var l,c=1,t=arguments.length;c<t;c++){l=arguments[c];for(var i in l)Object.prototype.hasOwnProperty.call(l,i)&&(e[i]=l[i])}return e},bc.apply(this,arguments)};function rc(e,l){if(!l)return"";var c="; "+e;return l===!0?c:c+"="+l}function oo(e){if(typeof e.expires=="number"){var l=new Date;l.setMilliseconds(l.getMilliseconds()+e.expires*864e5),e.expires=l}return rc("Expires",e.expires?e.expires.toUTCString():"")+rc("Domain",e.domain)+rc("Path",e.path)+rc("Secure",e.secure)+rc("SameSite",e.sameSite)}function Zo(e,l,c){return encodeURIComponent(e).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/\(/g,"%28").replace(/\)/g,"%29")+"="+encodeURIComponent(l).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent)+oo(c)}function mo(e){for(var l={},c=e?e.split("; "):[],t=/(%[\dA-F]{2})+/gi,i=0;i<c.length;i++){var n=c[i].split("="),a=n.slice(1).join("=");a.charAt(0)==='"'&&(a=a.slice(1,-1));try{var b=n[0].replace(t,decodeURIComponent);l[b]=a.replace(t,decodeURIComponent)}catch{}}return l}function uo(){return mo(document.cookie)}function bo(e){return uo()[e]}var ro=bo;function pn(e,l,c){document.cookie=Zo(e,l,bc({path:"/"},c))}var ho=pn;function po(e,l){pn(e,"",bc(bc({},l),{expires:-1}))}var Go=po;const Ac=jt(`proc:${process.pid}:storage.ts`);var Gn=(e=>(e.LOCAL_STORAGE="LocalStorage",e.SESSION_STORAGE="SessionStorage",e.COOKIE_STORAGE="CookieStorage",e.MEMORY_STORAGE="MemoryStorage",e))(Gn||{});class Vo{constructor(){this.get=l=>{const c=ro(l);return c?JSON.parse(c):null},this.set=(l,c,t={})=>{let i={};window.location.protocol==="https:"&&(i={secure:!0,sameSite:"none"}),t&&t.daysUntilExpire?i.expires=t.daysUntilExpire:i.expires=1,Ac(`CookieStorage.set: key: ${l}, value: [${c}]`),ho(l,JSON.stringify(c),i)},this.remove=l=>{Go(l)}}}class Wo{constructor(){this.get=l=>{const c=sessionStorage.getItem(l);return typeof c=="undefined"||c===null?null:JSON.parse(c)},this.set=(l,c)=>{Ac(`SessionStorage.set: key: ${l}, value: [${c}]`),sessionStorage.setItem(l,JSON.stringify(c))},this.remove=l=>{sessionStorage.removeItem(l)}}}class Xo{constructor(){this.get=l=>{const c=localStorage.getItem(l);return typeof c=="undefined"||c===null?null:JSON.parse(c)},this.set=(l,c)=>{Ac(`LocalStorage.set: key: ${l}, value: [${c}]`),localStorage.setItem(l,JSON.stringify(c))},this.remove=l=>{localStorage.removeItem(l)}}}class yo{constructor(){pe(this,gl,void 0);ce(this,gl,{}),this.get=l=>{const c=O(this,gl)[l];return typeof c=="undefined"||c===null?null:c},this.set=(l,c)=>{Ac(`MemoryStorage.set: key: ${l}, value: [${c}]`),O(this,gl)[l]=c},this.remove=l=>{delete O(this,gl)[l]}}}gl=new WeakMap;class Yo{constructor(l){pe(this,pl,null);switch(l.clientStorageType){case"SessionStorage":ce(this,pl,new Wo);break;case"LocalStorage":ce(this,pl,new Xo);break;case"CookieStorage":ce(this,pl,new Vo);break;case"MemoryStorage":ce(this,pl,new yo);break;default:throw new Error(`Unknown [${l.clientStorageType}] storage type.`)}}GetStorage(){return O(this,pl)}}pl=new WeakMap;function Pt(e){this.message=e}Pt.prototype=new Error,Pt.prototype.name="InvalidCharacterError";var Vn=typeof window!="undefined"&&window.atob&&window.atob.bind(window)||function(e){var l=String(e).replace(/=+$/,"");if(l.length%4==1)throw new Pt("'atob' failed: The string to be decoded is not correctly encoded.");for(var c,t,i=0,n=0,a="";t=l.charAt(n++);~t&&(c=i%4?64*c+t:t,i++%4)?a+=String.fromCharCode(255&c>>(-2*i&6)):0)t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(t);return a};function Io(e){var l=e.replace(/-/g,"+").replace(/_/g,"/");switch(l.length%4){case 0:break;case 2:l+="==";break;case 3:l+="=";break;default:throw"Illegal base64url string!"}try{return function(c){return decodeURIComponent(Vn(c).replace(/(.)/g,function(t,i){var n=i.charCodeAt(0).toString(16).toUpperCase();return n.length<2&&(n="0"+n),"%"+n}))}(l)}catch{return Vn(l)}}function _c(e){this.message=e}function So(e,l){if(typeof e!="string")throw new _c("Invalid token specified");var c=(l=l||{}).header===!0?0:1;try{return JSON.parse(Io(e.split(".")[c]))}catch(t){throw new _c("Invalid token specified: "+t.message)}}_c.prototype=new Error,_c.prototype.name="InvalidTokenError";const Wn="dmFyIGlkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxjZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgdWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFZvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIGxkPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZmQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgT3M9KGVlLGFlLGllKT0+YWUgaW4gZWU/aWQoZWUsYWUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmllfSk6ZWVbYWVdPWllLFE9KGVlLGFlKT0+e2Zvcih2YXIgaWUgaW4gYWV8fChhZT17fSkpbGQuY2FsbChhZSxpZSkmJk9zKGVlLGllLGFlW2llXSk7aWYoVm8pZm9yKHZhciBpZSBvZiBWbyhhZSkpZmQuY2FsbChhZSxpZSkmJk9zKGVlLGllLGFlW2llXSk7cmV0dXJuIGVlfSxsZT0oZWUsYWUpPT5jZChlZSx1ZChhZSkpO3ZhciBfcj0oZWUsYWUsaWUpPT4oT3MoZWUsdHlwZW9mIGFlIT0ic3ltYm9sIj9hZSsiIjphZSxpZSksaWUpLHpvPShlZSxhZSxpZSk9PntpZighYWUuaGFzKGVlKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCAiK2llKX07dmFyIFY9KGVlLGFlLGllKT0+KHpvKGVlLGFlLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGllP2llLmNhbGwoZWUpOmFlLmdldChlZSkpLFNlPShlZSxhZSxpZSk9PntpZihhZS5oYXMoZWUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO2FlIGluc3RhbmNlb2YgV2Vha1NldD9hZS5hZGQoZWUpOmFlLnNldChlZSxpZSl9LGNlPShlZSxhZSxpZSxjdCk9Pih6byhlZSxhZSwid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLGN0P2N0LmNhbGwoZWUsaWUpOmFlLnNldChlZSxpZSksaWUpOyhmdW5jdGlvbigpe3ZhciBIdCxidCxGZSxPdCxBcix5bixIZSx2dCxOdCxLZSxLdCwkbix0dCxDcixJcixEcixjcixqcixrcixVcjsidXNlIHN0cmljdCI7dmFyIGVlPXR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIj9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT0idW5kZWZpbmVkIj9nbG9iYWw6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6e30sYWU9e2V4cG9ydHM6e319LGllPTFlMyxjdD1pZSo2MCxRdD1jdCo2MCxUdD1RdCoyNCxIbz1UdCo3LEtvPVR0KjM2NS4yNSxCbz1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHI9dHlwZW9mIGU7aWYocj09PSJzdHJpbmciJiZlLmxlbmd0aD4wKXJldHVybiBKbyhlKTtpZihyPT09Im51bWJlciImJmlzRmluaXRlKGUpKXJldHVybiB0Lmxvbmc/R28oZSk6cW8oZSk7dGhyb3cgbmV3IEVycm9yKCJ2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPSIrSlNPTi5zdHJpbmdpZnkoZSkpfTtmdW5jdGlvbiBKbyhlKXtpZihlPVN0cmluZyhlKSwhKGUubGVuZ3RoPjEwMCkpe3ZhciB0PS9eKC0/KD86XGQrKT9cLj9cZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhlKTtpZighIXQpe3ZhciByPXBhcnNlRmxvYXQodFsxXSksbj0odFsyXXx8Im1zIikudG9Mb3dlckNhc2UoKTtzd2l0Y2gobil7Y2FzZSJ5ZWFycyI6Y2FzZSJ5ZWFyIjpjYXNlInlycyI6Y2FzZSJ5ciI6Y2FzZSJ5IjpyZXR1cm4gcipLbztjYXNlIndlZWtzIjpjYXNlIndlZWsiOmNhc2UidyI6cmV0dXJuIHIqSG87Y2FzZSJkYXlzIjpjYXNlImRheSI6Y2FzZSJkIjpyZXR1cm4gcipUdDtjYXNlImhvdXJzIjpjYXNlImhvdXIiOmNhc2UiaHJzIjpjYXNlImhyIjpjYXNlImgiOnJldHVybiByKlF0O2Nhc2UibWludXRlcyI6Y2FzZSJtaW51dGUiOmNhc2UibWlucyI6Y2FzZSJtaW4iOmNhc2UibSI6cmV0dXJuIHIqY3Q7Y2FzZSJzZWNvbmRzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNzIjpjYXNlInNlYyI6Y2FzZSJzIjpyZXR1cm4gcippZTtjYXNlIm1pbGxpc2Vjb25kcyI6Y2FzZSJtaWxsaXNlY29uZCI6Y2FzZSJtc2VjcyI6Y2FzZSJtc2VjIjpjYXNlIm1zIjpyZXR1cm4gcjtkZWZhdWx0OnJldHVybn19fX1mdW5jdGlvbiBxbyhlKXt2YXIgdD1NYXRoLmFicyhlKTtyZXR1cm4gdD49VHQ/TWF0aC5yb3VuZChlL1R0KSsiZCI6dD49UXQ/TWF0aC5yb3VuZChlL1F0KSsiaCI6dD49Y3Q/TWF0aC5yb3VuZChlL2N0KSsibSI6dD49aWU/TWF0aC5yb3VuZChlL2llKSsicyI6ZSsibXMifWZ1bmN0aW9uIEdvKGUpe3ZhciB0PU1hdGguYWJzKGUpO3JldHVybiB0Pj1UdD9xcihlLHQsVHQsImRheSIpOnQ+PVF0P3FyKGUsdCxRdCwiaG91ciIpOnQ+PWN0P3FyKGUsdCxjdCwibWludXRlIik6dD49aWU/cXIoZSx0LGllLCJzZWNvbmQiKTplKyIgbXMifWZ1bmN0aW9uIHFyKGUsdCxyLG4pe3ZhciBzPXQ+PXIqMS41O3JldHVybiBNYXRoLnJvdW5kKGUvcikrIiAiK24rKHM/InMiOiIiKX1mdW5jdGlvbiBRbyhlKXtyLmRlYnVnPXIsci5kZWZhdWx0PXIsci5jb2VyY2U9ZixyLmRpc2FibGU9YSxyLmVuYWJsZT1zLHIuZW5hYmxlZD1vLHIuaHVtYW5pemU9Qm8sci5kZXN0cm95PXAsT2JqZWN0LmtleXMoZSkuZm9yRWFjaChpPT57cltpXT1lW2ldfSksci5uYW1lcz1bXSxyLnNraXBzPVtdLHIuZm9ybWF0dGVycz17fTtmdW5jdGlvbiB0KGkpe2xldCBoPTA7Zm9yKGxldCBFPTA7RTxpLmxlbmd0aDtFKyspaD0oaDw8NSktaCtpLmNoYXJDb2RlQXQoRSksaHw9MDtyZXR1cm4gci5jb2xvcnNbTWF0aC5hYnMoaCklci5jb2xvcnMubGVuZ3RoXX1yLnNlbGVjdENvbG9yPXQ7ZnVuY3Rpb24gcihpKXtsZXQgaCxFPW51bGwsVCxJO2Z1bmN0aW9uIGooLi4ueSl7aWYoIWouZW5hYmxlZClyZXR1cm47Y29uc3QgXz1qLGI9TnVtYmVyKG5ldyBEYXRlKSxPPWItKGh8fGIpO18uZGlmZj1PLF8ucHJldj1oLF8uY3Vycj1iLGg9Yix5WzBdPXIuY29lcmNlKHlbMF0pLHR5cGVvZiB5WzBdIT0ic3RyaW5nIiYmeS51bnNoaWZ0KCIlTyIpO2xldCBBPTA7eVswXT15WzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCgkLE4pPT57aWYoJD09PSIlJSIpcmV0dXJuIiUiO0ErKztjb25zdCBEPXIuZm9ybWF0dGVyc1tOXTtpZih0eXBlb2YgRD09ImZ1bmN0aW9uIil7Y29uc3QgQj15W0FdOyQ9RC5jYWxsKF8sQikseS5zcGxpY2UoQSwxKSxBLS19cmV0dXJuICR9KSxyLmZvcm1hdEFyZ3MuY2FsbChfLHkpLChfLmxvZ3x8ci5sb2cpLmFwcGx5KF8seSl9cmV0dXJuIGoubmFtZXNwYWNlPWksai51c2VDb2xvcnM9ci51c2VDb2xvcnMoKSxqLmNvbG9yPXIuc2VsZWN0Q29sb3IoaSksai5leHRlbmQ9bixqLmRlc3Ryb3k9ci5kZXN0cm95LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShqLCJlbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OigpPT5FIT09bnVsbD9FOihUIT09ci5uYW1lc3BhY2VzJiYoVD1yLm5hbWVzcGFjZXMsST1yLmVuYWJsZWQoaSkpLEkpLHNldDp5PT57RT15fX0pLHR5cGVvZiByLmluaXQ9PSJmdW5jdGlvbiImJnIuaW5pdChqKSxqfWZ1bmN0aW9uIG4oaSxoKXtjb25zdCBFPXIodGhpcy5uYW1lc3BhY2UrKHR5cGVvZiBoPT0idW5kZWZpbmVkIj8iOiI6aCkraSk7cmV0dXJuIEUubG9nPXRoaXMubG9nLEV9ZnVuY3Rpb24gcyhpKXtyLnNhdmUoaSksci5uYW1lc3BhY2VzPWksci5uYW1lcz1bXSxyLnNraXBzPVtdO2xldCBoO2NvbnN0IEU9KHR5cGVvZiBpPT0ic3RyaW5nIj9pOiIiKS5zcGxpdCgvW1xzLF0rLyksVD1FLmxlbmd0aDtmb3IoaD0wO2g8VDtoKyspIUVbaF18fChpPUVbaF0ucmVwbGFjZSgvXCovZywiLio/IiksaVswXT09PSItIj9yLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgiXiIraS5zbGljZSgxKSsiJCIpKTpyLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgiXiIraSsiJCIpKSl9ZnVuY3Rpb24gYSgpe2NvbnN0IGk9Wy4uLnIubmFtZXMubWFwKGwpLC4uLnIuc2tpcHMubWFwKGwpLm1hcChoPT4iLSIraCldLmpvaW4oIiwiKTtyZXR1cm4gci5lbmFibGUoIiIpLGl9ZnVuY3Rpb24gbyhpKXtpZihpW2kubGVuZ3RoLTFdPT09IioiKXJldHVybiEwO2xldCBoLEU7Zm9yKGg9MCxFPXIuc2tpcHMubGVuZ3RoO2g8RTtoKyspaWYoci5za2lwc1toXS50ZXN0KGkpKXJldHVybiExO2ZvcihoPTAsRT1yLm5hbWVzLmxlbmd0aDtoPEU7aCsrKWlmKHIubmFtZXNbaF0udGVzdChpKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBsKGkpe3JldHVybiBpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIsaS50b1N0cmluZygpLmxlbmd0aC0yKS5yZXBsYWNlKC9cLlwqXD8kLywiKiIpfWZ1bmN0aW9uIGYoaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBFcnJvcj9pLnN0YWNrfHxpLm1lc3NhZ2U6aX1mdW5jdGlvbiBwKCl7Y29uc29sZS53YXJuKCJJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuIil9cmV0dXJuIHIuZW5hYmxlKHIubG9hZCgpKSxyfXZhciBZbz1RbzsoZnVuY3Rpb24oZSx0KXt0LmZvcm1hdEFyZ3M9bix0LnNhdmU9cyx0LmxvYWQ9YSx0LnVzZUNvbG9ycz1yLHQuc3RvcmFnZT1vKCksdC5kZXN0cm95PSgoKT0+e2xldCBmPSExO3JldHVybigpPT57Znx8KGY9ITAsY29uc29sZS53YXJuKCJJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuIikpfX0pKCksdC5jb2xvcnM9WyIjMDAwMENDIiwiIzAwMDBGRiIsIiMwMDMzQ0MiLCIjMDAzM0ZGIiwiIzAwNjZDQyIsIiMwMDY2RkYiLCIjMDA5OUNDIiwiIzAwOTlGRiIsIiMwMENDMDAiLCIjMDBDQzMzIiwiIzAwQ0M2NiIsIiMwMENDOTkiLCIjMDBDQ0NDIiwiIzAwQ0NGRiIsIiMzMzAwQ0MiLCIjMzMwMEZGIiwiIzMzMzNDQyIsIiMzMzMzRkYiLCIjMzM2NkNDIiwiIzMzNjZGRiIsIiMzMzk5Q0MiLCIjMzM5OUZGIiwiIzMzQ0MwMCIsIiMzM0NDMzMiLCIjMzNDQzY2IiwiIzMzQ0M5OSIsIiMzM0NDQ0MiLCIjMzNDQ0ZGIiwiIzY2MDBDQyIsIiM2NjAwRkYiLCIjNjYzM0NDIiwiIzY2MzNGRiIsIiM2NkNDMDAiLCIjNjZDQzMzIiwiIzk5MDBDQyIsIiM5OTAwRkYiLCIjOTkzM0NDIiwiIzk5MzNGRiIsIiM5OUNDMDAiLCIjOTlDQzMzIiwiI0NDMDAwMCIsIiNDQzAwMzMiLCIjQ0MwMDY2IiwiI0NDMDA5OSIsIiNDQzAwQ0MiLCIjQ0MwMEZGIiwiI0NDMzMwMCIsIiNDQzMzMzMiLCIjQ0MzMzY2IiwiI0NDMzM5OSIsIiNDQzMzQ0MiLCIjQ0MzM0ZGIiwiI0NDNjYwMCIsIiNDQzY2MzMiLCIjQ0M5OTAwIiwiI0NDOTkzMyIsIiNDQ0NDMDAiLCIjQ0NDQzMzIiwiI0ZGMDAwMCIsIiNGRjAwMzMiLCIjRkYwMDY2IiwiI0ZGMDA5OSIsIiNGRjAwQ0MiLCIjRkYwMEZGIiwiI0ZGMzMwMCIsIiNGRjMzMzMiLCIjRkYzMzY2IiwiI0ZGMzM5OSIsIiNGRjMzQ0MiLCIjRkYzM0ZGIiwiI0ZGNjYwMCIsIiNGRjY2MzMiLCIjRkY5OTAwIiwiI0ZGOTkzMyIsIiNGRkNDMDAiLCIjRkZDQzMzIl07ZnVuY3Rpb24gcigpe3JldHVybiB0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LnByb2Nlc3MmJih3aW5kb3cucHJvY2Vzcy50eXBlPT09InJlbmRlcmVyInx8d2luZG93LnByb2Nlc3MuX19ud2pzKT8hMDp0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVwvKFxkKykvKT8hMTp0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2V8fHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLmZpcmVidWd8fHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiYmd2luZG93LmNvbnNvbGUudGFibGUpfHx0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XC8oXGQrKS8pJiZwYXJzZUludChSZWdFeHAuJDEsMTApPj0zMXx8dHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcLyhcZCspLyl9ZnVuY3Rpb24gbihmKXtpZihmWzBdPSh0aGlzLnVzZUNvbG9ycz8iJWMiOiIiKSt0aGlzLm5hbWVzcGFjZSsodGhpcy51c2VDb2xvcnM/IiAlYyI6IiAiKStmWzBdKyh0aGlzLnVzZUNvbG9ycz8iJWMgIjoiICIpKyIrIitlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSwhdGhpcy51c2VDb2xvcnMpcmV0dXJuO2NvbnN0IHA9ImNvbG9yOiAiK3RoaXMuY29sb3I7Zi5zcGxpY2UoMSwwLHAsImNvbG9yOiBpbmhlcml0Iik7bGV0IGk9MCxoPTA7ZlswXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csRT0+e0UhPT0iJSUiJiYoaSsrLEU9PT0iJWMiJiYoaD1pKSl9KSxmLnNwbGljZShoLDAscCl9dC5sb2c9Y29uc29sZS5kZWJ1Z3x8Y29uc29sZS5sb2d8fCgoKT0+e30pO2Z1bmN0aW9uIHMoZil7dHJ5e2Y/dC5zdG9yYWdlLnNldEl0ZW0oImRlYnVnIixmKTp0LnN0b3JhZ2UucmVtb3ZlSXRlbSgiZGVidWciKX1jYXRjaHt9fWZ1bmN0aW9uIGEoKXtsZXQgZjt0cnl7Zj10LnN0b3JhZ2UuZ2V0SXRlbSgiZGVidWciKX1jYXRjaHt9cmV0dXJuIWYmJnR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmImVudiJpbiBwcm9jZXNzJiYoZj17fS5ERUJVRyksZn1mdW5jdGlvbiBvKCl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2V9Y2F0Y2h7fX1lLmV4cG9ydHM9WW8odCk7Y29uc3R7Zm9ybWF0dGVyczpsfT1lLmV4cG9ydHM7bC5qPWZ1bmN0aW9uKGYpe3RyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZil9Y2F0Y2gocCl7cmV0dXJuIltVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAiK3AubWVzc2FnZX19fSkoYWUsYWUuZXhwb3J0cyk7dmFyIE5zPWFlLmV4cG9ydHMsT249e2V4cG9ydHM6e319LFBzPWZ1bmN0aW9uKHQscil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxhPTA7YTxzLmxlbmd0aDthKyspc1thXT1hcmd1bWVudHNbYV07cmV0dXJuIHQuYXBwbHkocixzKX19LFdvPVBzLE5uPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsUG49ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPU5uLmNhbGwodCk7cmV0dXJuIGVbcl18fChlW3JdPXIuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSl9fShPYmplY3QuY3JlYXRlKG51bGwpKTtmdW5jdGlvbiBBdChlKXtyZXR1cm4gZT1lLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24ocil7cmV0dXJuIFBuKHIpPT09ZX19ZnVuY3Rpb24gVG4oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gR3IoZSl7cmV0dXJuIHR5cGVvZiBlPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBYbyhlKXtyZXR1cm4gZSE9PW51bGwmJiFHcihlKSYmZS5jb25zdHJ1Y3RvciE9PW51bGwmJiFHcihlLmNvbnN0cnVjdG9yKSYmdHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXI9PSJmdW5jdGlvbiImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9dmFyIFRzPUF0KCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIFpvKGUpe3ZhciB0O3JldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIhPSJ1bmRlZmluZWQiJiZBcnJheUJ1ZmZlci5pc1ZpZXc/dD1BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6dD1lJiZlLmJ1ZmZlciYmVHMoZS5idWZmZXIpLHR9ZnVuY3Rpb24geG8oZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIn1mdW5jdGlvbiBlaShlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIifWZ1bmN0aW9uIEFzKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PSJvYmplY3QifWZ1bmN0aW9uIFFyKGUpe2lmKFBuKGUpIT09Im9iamVjdCIpcmV0dXJuITE7dmFyIHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiB0PT09bnVsbHx8dD09PU9iamVjdC5wcm90b3R5cGV9dmFyIHRpPUF0KCJEYXRlIikscmk9QXQoIkZpbGUiKSxuaT1BdCgiQmxvYiIpLHNpPUF0KCJGaWxlTGlzdCIpO2Z1bmN0aW9uIEFuKGUpe3JldHVybiBObi5jYWxsKGUpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBhaShlKXtyZXR1cm4gQXMoZSkmJkFuKGUucGlwZSl9ZnVuY3Rpb24gb2koZSl7dmFyIHQ9IltvYmplY3QgRm9ybURhdGFdIjtyZXR1cm4gZSYmKHR5cGVvZiBGb3JtRGF0YT09ImZ1bmN0aW9uIiYmZSBpbnN0YW5jZW9mIEZvcm1EYXRhfHxObi5jYWxsKGUpPT09dHx8QW4oZS50b1N0cmluZykmJmUudG9TdHJpbmcoKT09PXQpfXZhciBpaT1BdCgiVVJMU2VhcmNoUGFyYW1zIik7ZnVuY3Rpb24gY2koZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiB1aSgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiBDbihlLHQpe2lmKCEoZT09PW51bGx8fHR5cGVvZiBlPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIGUhPSJvYmplY3QiJiYoZT1bZV0pLFRuKGUpKWZvcih2YXIgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0LmNhbGwobnVsbCxlW3JdLHIsZSk7ZWxzZSBmb3IodmFyIHMgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxzKSYmdC5jYWxsKG51bGwsZVtzXSxzLGUpfWZ1bmN0aW9uIEluKCl7dmFyIGU9e307ZnVuY3Rpb24gdChzLGEpe1FyKGVbYV0pJiZRcihzKT9lW2FdPUluKGVbYV0scyk6UXIocyk/ZVthXT1Jbih7fSxzKTpUbihzKT9lW2FdPXMuc2xpY2UoKTplW2FdPXN9Zm9yKHZhciByPTAsbj1hcmd1bWVudHMubGVuZ3RoO3I8bjtyKyspQ24oYXJndW1lbnRzW3JdLHQpO3JldHVybiBlfWZ1bmN0aW9uIGxpKGUsdCxyKXtyZXR1cm4gQ24odCxmdW5jdGlvbihzLGEpe3ImJnR5cGVvZiBzPT0iZnVuY3Rpb24iP2VbYV09V28ocyxyKTplW2FdPXN9KSxlfWZ1bmN0aW9uIGZpKGUpe3JldHVybiBlLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKGU9ZS5zbGljZSgxKSksZX1mdW5jdGlvbiBkaShlLHQscixuKXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLG4pLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsciYmT2JqZWN0LmFzc2lnbihlLnByb3RvdHlwZSxyKX1mdW5jdGlvbiBoaShlLHQscil7dmFyIG4scyxhLG89e307dD10fHx7fTtkb3tmb3Iobj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSxzPW4ubGVuZ3RoO3MtLSA+MDspYT1uW3NdLG9bYV18fCh0W2FdPWVbYV0sb1thXT0hMCk7ZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9d2hpbGUoZSYmKCFyfHxyKGUsdCkpJiZlIT09T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIHR9ZnVuY3Rpb24gcGkoZSx0LHIpe2U9U3RyaW5nKGUpLChyPT09dm9pZCAwfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpLHItPXQubGVuZ3RoO3ZhciBuPWUuaW5kZXhPZih0LHIpO3JldHVybiBuIT09LTEmJm49PT1yfWZ1bmN0aW9uIG1pKGUpe2lmKCFlKXJldHVybiBudWxsO3ZhciB0PWUubGVuZ3RoO2lmKEdyKHQpKXJldHVybiBudWxsO2Zvcih2YXIgcj1uZXcgQXJyYXkodCk7dC0tID4wOylyW3RdPWVbdF07cmV0dXJuIHJ9dmFyIHZpPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSYmdCBpbnN0YW5jZW9mIGV9fSh0eXBlb2YgVWludDhBcnJheSE9InVuZGVmaW5lZCImJk9iamVjdC5nZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSksUGU9e2lzQXJyYXk6VG4saXNBcnJheUJ1ZmZlcjpUcyxpc0J1ZmZlcjpYbyxpc0Zvcm1EYXRhOm9pLGlzQXJyYXlCdWZmZXJWaWV3OlpvLGlzU3RyaW5nOnhvLGlzTnVtYmVyOmVpLGlzT2JqZWN0OkFzLGlzUGxhaW5PYmplY3Q6UXIsaXNVbmRlZmluZWQ6R3IsaXNEYXRlOnRpLGlzRmlsZTpyaSxpc0Jsb2I6bmksaXNGdW5jdGlvbjpBbixpc1N0cmVhbTphaSxpc1VSTFNlYXJjaFBhcmFtczppaSxpc1N0YW5kYXJkQnJvd3NlckVudjp1aSxmb3JFYWNoOkNuLG1lcmdlOkluLGV4dGVuZDpsaSx0cmltOmNpLHN0cmlwQk9NOmZpLGluaGVyaXRzOmRpLHRvRmxhdE9iamVjdDpoaSxraW5kT2Y6UG4sa2luZE9mVGVzdDpBdCxlbmRzV2l0aDpwaSx0b0FycmF5Om1pLGlzVHlwZWRBcnJheTp2aSxpc0ZpbGVMaXN0OnNpfSxZdD1QZTtmdW5jdGlvbiBDcyhlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgSXM9ZnVuY3Rpb24odCxyLG4pe2lmKCFyKXJldHVybiB0O3ZhciBzO2lmKG4pcz1uKHIpO2Vsc2UgaWYoWXQuaXNVUkxTZWFyY2hQYXJhbXMocikpcz1yLnRvU3RyaW5nKCk7ZWxzZXt2YXIgYT1bXTtZdC5mb3JFYWNoKHIsZnVuY3Rpb24oZixwKXtmPT09bnVsbHx8dHlwZW9mIGY9PSJ1bmRlZmluZWQifHwoWXQuaXNBcnJheShmKT9wPXArIltdIjpmPVtmXSxZdC5mb3JFYWNoKGYsZnVuY3Rpb24oaCl7WXQuaXNEYXRlKGgpP2g9aC50b0lTT1N0cmluZygpOll0LmlzT2JqZWN0KGgpJiYoaD1KU09OLnN0cmluZ2lmeShoKSksYS5wdXNoKENzKHApKyI9IitDcyhoKSl9KSl9KSxzPWEuam9pbigiJiIpfWlmKHMpe3ZhciBvPXQuaW5kZXhPZigiIyIpO28hPT0tMSYmKHQ9dC5zbGljZSgwLG8pKSx0Kz0odC5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStzfXJldHVybiB0fSxfaT1QZTtmdW5jdGlvbiBZcigpe3RoaXMuaGFuZGxlcnM9W119WXIucHJvdG90eXBlLnVzZT1mdW5jdGlvbih0LHIsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOnQscmVqZWN0ZWQ6cixzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sWXIucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKHQpe3RoaXMuaGFuZGxlcnNbdF0mJih0aGlzLmhhbmRsZXJzW3RdPW51bGwpfSxZci5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXtfaS5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJnQobil9KX07dmFyIGdpPVlyLEVpPVBlLHlpPWZ1bmN0aW9uKHQscil7RWkuZm9yRWFjaCh0LGZ1bmN0aW9uKHMsYSl7YSE9PXImJmEudG9VcHBlckNhc2UoKT09PXIudG9VcHBlckNhc2UoKSYmKHRbcl09cyxkZWxldGUgdFthXSl9KX0sRHM9UGU7ZnVuY3Rpb24gV3QoZSx0LHIsbixzKXtFcnJvci5jYWxsKHRoaXMpLHRoaXMubWVzc2FnZT1lLHRoaXMubmFtZT0iQXhpb3NFcnJvciIsdCYmKHRoaXMuY29kZT10KSxyJiYodGhpcy5jb25maWc9ciksbiYmKHRoaXMucmVxdWVzdD1uKSxzJiYodGhpcy5yZXNwb25zZT1zKX1Ecy5pbmhlcml0cyhXdCxFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX19KTt2YXIganM9V3QucHJvdG90eXBlLGtzPXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCJdLmZvckVhY2goZnVuY3Rpb24oZSl7a3NbZV09e3ZhbHVlOmV9fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoV3Qsa3MpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShqcywiaXNBeGlvc0Vycm9yIix7dmFsdWU6ITB9KSxXdC5mcm9tPWZ1bmN0aW9uKGUsdCxyLG4scyxhKXt2YXIgbz1PYmplY3QuY3JlYXRlKGpzKTtyZXR1cm4gRHMudG9GbGF0T2JqZWN0KGUsbyxmdW5jdGlvbihmKXtyZXR1cm4gZiE9PUVycm9yLnByb3RvdHlwZX0pLFd0LmNhbGwobyxlLm1lc3NhZ2UsdCxyLG4scyksby5uYW1lPWUubmFtZSxhJiZPYmplY3QuYXNzaWduKG8sYSksb307dmFyIFh0PVd0LFVzPXtzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxHZT1QZTtmdW5jdGlvbiAkaShlLHQpe3Q9dHx8bmV3IEZvcm1EYXRhO3ZhciByPVtdO2Z1bmN0aW9uIG4oYSl7cmV0dXJuIGE9PT1udWxsPyIiOkdlLmlzRGF0ZShhKT9hLnRvSVNPU3RyaW5nKCk6R2UuaXNBcnJheUJ1ZmZlcihhKXx8R2UuaXNUeXBlZEFycmF5KGEpP3R5cGVvZiBCbG9iPT0iZnVuY3Rpb24iP25ldyBCbG9iKFthXSk6QnVmZmVyLmZyb20oYSk6YX1mdW5jdGlvbiBzKGEsbyl7aWYoR2UuaXNQbGFpbk9iamVjdChhKXx8R2UuaXNBcnJheShhKSl7aWYoci5pbmRleE9mKGEpIT09LTEpdGhyb3cgRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAiK28pO3IucHVzaChhKSxHZS5mb3JFYWNoKGEsZnVuY3Rpb24oZixwKXtpZighR2UuaXNVbmRlZmluZWQoZikpe3ZhciBpPW8/bysiLiIrcDpwLGg7aWYoZiYmIW8mJnR5cGVvZiBmPT0ib2JqZWN0Iil7aWYoR2UuZW5kc1dpdGgocCwie30iKSlmPUpTT04uc3RyaW5naWZ5KGYpO2Vsc2UgaWYoR2UuZW5kc1dpdGgocCwiW10iKSYmKGg9R2UudG9BcnJheShmKSkpe2guZm9yRWFjaChmdW5jdGlvbihFKXshR2UuaXNVbmRlZmluZWQoRSkmJnQuYXBwZW5kKGksbihFKSl9KTtyZXR1cm59fXMoZixpKX19KSxyLnBvcCgpfWVsc2UgdC5hcHBlbmQobyxuKGEpKX1yZXR1cm4gcyhlKSx0fXZhciBGcz0kaSxEbj1YdCx3aT1mdW5jdGlvbih0LHIsbil7dmFyIHM9bi5jb25maWcudmFsaWRhdGVTdGF0dXM7IW4uc3RhdHVzfHwhc3x8cyhuLnN0YXR1cyk/dChuKTpyKG5ldyBEbigiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLFtEbi5FUlJfQkFEX1JFUVVFU1QsRG4uRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihuLnN0YXR1cy8xMDApLTRdLG4uY29uZmlnLG4ucmVxdWVzdCxuKSl9LFdyPVBlLFNpPVdyLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24ocixuLHMsYSxvLGwpe3ZhciBmPVtdO2YucHVzaChyKyI9IitlbmNvZGVVUklDb21wb25lbnQobikpLFdyLmlzTnVtYmVyKHMpJiZmLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShzKS50b0dNVFN0cmluZygpKSxXci5pc1N0cmluZyhhKSYmZi5wdXNoKCJwYXRoPSIrYSksV3IuaXNTdHJpbmcobykmJmYucHVzaCgiZG9tYWluPSIrbyksbD09PSEwJiZmLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1mLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24ocil7dmFyIG49ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK3IrIik9KFteO10qKSIpKTtyZXR1cm4gbj9kZWNvZGVVUklDb21wb25lbnQoblszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKHIpe3RoaXMud3JpdGUociwiIixEYXRlLm5vdygpLTg2NGU1KX19fSgpOmZ1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319fSgpLFJpPWZ1bmN0aW9uKHQpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QodCl9LGJpPWZ1bmN0aW9uKHQscil7cmV0dXJuIHI/dC5yZXBsYWNlKC9cLyskLywiIikrIi8iK3IucmVwbGFjZSgvXlwvKy8sIiIpOnR9LE9pPVJpLE5pPWJpLE1zPWZ1bmN0aW9uKHQscil7cmV0dXJuIHQmJiFPaShyKT9OaSh0LHIpOnJ9LGpuPVBlLFBpPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sVGk9ZnVuY3Rpb24odCl7dmFyIHI9e30sbixzLGE7cmV0dXJuIHQmJmpuLmZvckVhY2godC5zcGxpdChgCmApLGZ1bmN0aW9uKGwpe2lmKGE9bC5pbmRleE9mKCI6Iiksbj1qbi50cmltKGwuc3Vic3RyKDAsYSkpLnRvTG93ZXJDYXNlKCkscz1qbi50cmltKGwuc3Vic3RyKGErMSkpLG4pe2lmKHJbbl0mJlBpLmluZGV4T2Yobik+PTApcmV0dXJuO249PT0ic2V0LWNvb2tpZSI/cltuXT0ocltuXT9yW25dOltdKS5jb25jYXQoW3NdKTpyW25dPXJbbl0/cltuXSsiLCAiK3M6c319KSxyfSxMcz1QZSxBaT1Mcy5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMoYSl7dmFyIG89YTtyZXR1cm4gdCYmKHIuc2V0QXR0cmlidXRlKCJocmVmIixvKSxvPXIuaHJlZiksci5zZXRBdHRyaWJ1dGUoImhyZWYiLG8pLHtocmVmOnIuaHJlZixwcm90b2NvbDpyLnByb3RvY29sP3IucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnIuaG9zdCxzZWFyY2g6ci5zZWFyY2g/ci5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDpyLmhhc2g/ci5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6ci5ob3N0bmFtZSxwb3J0OnIucG9ydCxwYXRobmFtZTpyLnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj9yLnBhdGhuYW1lOiIvIityLnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihvKXt2YXIgbD1Mcy5pc1N0cmluZyhvKT9zKG8pOm87cmV0dXJuIGwucHJvdG9jb2w9PT1uLnByb3RvY29sJiZsLmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpLGtuPVh0LENpPVBlO2Z1bmN0aW9uIFZzKGUpe2tuLmNhbGwodGhpcyxlPT1udWxsPyJjYW5jZWxlZCI6ZSxrbi5FUlJfQ0FOQ0VMRUQpLHRoaXMubmFtZT0iQ2FuY2VsZWRFcnJvciJ9Q2kuaW5oZXJpdHMoVnMsa24se19fQ0FOQ0VMX186ITB9KTt2YXIgWHI9VnMsSWk9ZnVuY3Rpb24odCl7dmFyIHI9L14oWy0rXHddezEsMjV9KSg6P1wvXC98OikvLmV4ZWModCk7cmV0dXJuIHImJnJbMV18fCIifSxncj1QZSxEaT13aSxqaT1TaSxraT1JcyxVaT1NcyxGaT1UaSxNaT1BaSxMaT1Vcyx1dD1YdCxWaT1Ycix6aT1JaSx6cz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgYT10LmRhdGEsbz10LmhlYWRlcnMsbD10LnJlc3BvbnNlVHlwZSxmO2Z1bmN0aW9uIHAoKXt0LmNhbmNlbFRva2VuJiZ0LmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGYpLHQuc2lnbmFsJiZ0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsZil9Z3IuaXNGb3JtRGF0YShhKSYmZ3IuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSYmZGVsZXRlIG9bIkNvbnRlbnQtVHlwZSJdO3ZhciBpPW5ldyBYTUxIdHRwUmVxdWVzdDtpZih0LmF1dGgpe3ZhciBoPXQuYXV0aC51c2VybmFtZXx8IiIsRT10LmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQuYXV0aC5wYXNzd29yZCkpOiIiO28uQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGgrIjoiK0UpfXZhciBUPVVpKHQuYmFzZVVSTCx0LnVybCk7aS5vcGVuKHQubWV0aG9kLnRvVXBwZXJDYXNlKCksa2koVCx0LnBhcmFtcyx0LnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxpLnRpbWVvdXQ9dC50aW1lb3V0O2Z1bmN0aW9uIEkoKXtpZighIWkpe3ZhciBfPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gaT9GaShpLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLGI9IWx8fGw9PT0idGV4dCJ8fGw9PT0ianNvbiI/aS5yZXNwb25zZVRleHQ6aS5yZXNwb25zZSxPPXtkYXRhOmIsc3RhdHVzOmkuc3RhdHVzLHN0YXR1c1RleHQ6aS5zdGF0dXNUZXh0LGhlYWRlcnM6Xyxjb25maWc6dCxyZXF1ZXN0Oml9O0RpKGZ1bmN0aW9uKEgpe24oSCkscCgpfSxmdW5jdGlvbihIKXtzKEgpLHAoKX0sTyksaT1udWxsfX1pZigib25sb2FkZW5kImluIGk/aS5vbmxvYWRlbmQ9STppLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFpfHxpLnJlYWR5U3RhdGUhPT00fHxpLnN0YXR1cz09PTAmJiEoaS5yZXNwb25zZVVSTCYmaS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoSSl9LGkub25hYm9ydD1mdW5jdGlvbigpeyFpfHwocyhuZXcgdXQoIlJlcXVlc3QgYWJvcnRlZCIsdXQuRUNPTk5BQk9SVEVELHQsaSkpLGk9bnVsbCl9LGkub25lcnJvcj1mdW5jdGlvbigpe3MobmV3IHV0KCJOZXR3b3JrIEVycm9yIix1dC5FUlJfTkVUV09SSyx0LGksaSkpLGk9bnVsbH0saS5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgYj10LnRpbWVvdXQ/InRpbWVvdXQgb2YgIit0LnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsTz10LnRyYW5zaXRpb25hbHx8TGk7dC50aW1lb3V0RXJyb3JNZXNzYWdlJiYoYj10LnRpbWVvdXRFcnJvck1lc3NhZ2UpLHMobmV3IHV0KGIsTy5jbGFyaWZ5VGltZW91dEVycm9yP3V0LkVUSU1FRE9VVDp1dC5FQ09OTkFCT1JURUQsdCxpKSksaT1udWxsfSxnci5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgaj0odC53aXRoQ3JlZGVudGlhbHN8fE1pKFQpKSYmdC54c3JmQ29va2llTmFtZT9qaS5yZWFkKHQueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDtqJiYob1t0LnhzcmZIZWFkZXJOYW1lXT1qKX0ic2V0UmVxdWVzdEhlYWRlciJpbiBpJiZnci5mb3JFYWNoKG8sZnVuY3Rpb24oYixPKXt0eXBlb2YgYT09InVuZGVmaW5lZCImJk8udG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiP2RlbGV0ZSBvW09dOmkuc2V0UmVxdWVzdEhlYWRlcihPLGIpfSksZ3IuaXNVbmRlZmluZWQodC53aXRoQ3JlZGVudGlhbHMpfHwoaS53aXRoQ3JlZGVudGlhbHM9ISF0LndpdGhDcmVkZW50aWFscyksbCYmbCE9PSJqc29uIiYmKGkucmVzcG9uc2VUeXBlPXQucmVzcG9uc2VUeXBlKSx0eXBlb2YgdC5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmkuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHQub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgdC5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZpLnVwbG9hZCYmaS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHQub25VcGxvYWRQcm9ncmVzcyksKHQuY2FuY2VsVG9rZW58fHQuc2lnbmFsKSYmKGY9ZnVuY3Rpb24oXyl7IWl8fChzKCFffHxfJiZfLnR5cGU/bmV3IFZpOl8pLGkuYWJvcnQoKSxpPW51bGwpfSx0LmNhbmNlbFRva2VuJiZ0LmNhbmNlbFRva2VuLnN1YnNjcmliZShmKSx0LnNpZ25hbCYmKHQuc2lnbmFsLmFib3J0ZWQ/ZigpOnQuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixmKSkpLGF8fChhPW51bGwpO3ZhciB5PXppKFQpO2lmKHkmJlsiaHR0cCIsImh0dHBzIiwiZmlsZSJdLmluZGV4T2YoeSk9PT0tMSl7cyhuZXcgdXQoIlVuc3VwcG9ydGVkIHByb3RvY29sICIreSsiOiIsdXQuRVJSX0JBRF9SRVFVRVNULHQpKTtyZXR1cm59aS5zZW5kKGEpfSl9LEhpPW51bGwsT2U9UGUsSHM9eWksS3M9WHQsS2k9VXMsQmk9RnMsSmk9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBCcyhlLHQpeyFPZS5pc1VuZGVmaW5lZChlKSYmT2UuaXNVbmRlZmluZWQoZVsiQ29udGVudC1UeXBlIl0pJiYoZVsiQ29udGVudC1UeXBlIl09dCl9ZnVuY3Rpb24gcWkoKXt2YXIgZTtyZXR1cm4odHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT0idW5kZWZpbmVkInx8dHlwZW9mIHByb2Nlc3MhPSJ1bmRlZmluZWQiJiZPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2Vzcyk9PT0iW29iamVjdCBwcm9jZXNzXSIpJiYoZT16cyksZX1mdW5jdGlvbiBHaShlLHQscil7aWYoT2UuaXNTdHJpbmcoZSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShlKSxPZS50cmltKGUpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4ocnx8SlNPTi5zdHJpbmdpZnkpKGUpfXZhciBacj17dHJhbnNpdGlvbmFsOktpLGFkYXB0ZXI6cWkoKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbih0LHIpe2lmKEhzKHIsIkFjY2VwdCIpLEhzKHIsIkNvbnRlbnQtVHlwZSIpLE9lLmlzRm9ybURhdGEodCl8fE9lLmlzQXJyYXlCdWZmZXIodCl8fE9lLmlzQnVmZmVyKHQpfHxPZS5pc1N0cmVhbSh0KXx8T2UuaXNGaWxlKHQpfHxPZS5pc0Jsb2IodCkpcmV0dXJuIHQ7aWYoT2UuaXNBcnJheUJ1ZmZlclZpZXcodCkpcmV0dXJuIHQuYnVmZmVyO2lmKE9lLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXJldHVybiBCcyhyLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLHQudG9TdHJpbmcoKTt2YXIgbj1PZS5pc09iamVjdCh0KSxzPXImJnJbIkNvbnRlbnQtVHlwZSJdLGE7aWYoKGE9T2UuaXNGaWxlTGlzdCh0KSl8fG4mJnM9PT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpe3ZhciBvPXRoaXMuZW52JiZ0aGlzLmVudi5Gb3JtRGF0YTtyZXR1cm4gQmkoYT97ImZpbGVzW10iOnR9OnQsbyYmbmV3IG8pfWVsc2UgaWYobnx8cz09PSJhcHBsaWNhdGlvbi9qc29uIilyZXR1cm4gQnMociwiYXBwbGljYXRpb24vanNvbiIpLEdpKHQpO3JldHVybiB0fV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKHQpe3ZhciByPXRoaXMudHJhbnNpdGlvbmFsfHxaci50cmFuc2l0aW9uYWwsbj1yJiZyLnNpbGVudEpTT05QYXJzaW5nLHM9ciYmci5mb3JjZWRKU09OUGFyc2luZyxhPSFuJiZ0aGlzLnJlc3BvbnNlVHlwZT09PSJqc29uIjtpZihhfHxzJiZPZS5pc1N0cmluZyh0KSYmdC5sZW5ndGgpdHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKG8pe2lmKGEpdGhyb3cgby5uYW1lPT09IlN5bnRheEVycm9yIj9Lcy5mcm9tKG8sS3MuRVJSX0JBRF9SRVNQT05TRSx0aGlzLG51bGwsdGhpcy5yZXNwb25zZSk6b31yZXR1cm4gdH1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLGVudjp7Rm9ybURhdGE6SGl9LHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj0yMDAmJnQ8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtPZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLGZ1bmN0aW9uKHQpe1pyLmhlYWRlcnNbdF09e319KSxPZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24odCl7WnIuaGVhZGVyc1t0XT1PZS5tZXJnZShKaSl9KTt2YXIgVW49WnIsUWk9UGUsWWk9VW4sV2k9ZnVuY3Rpb24odCxyLG4pe3ZhciBzPXRoaXN8fFlpO3JldHVybiBRaS5mb3JFYWNoKG4sZnVuY3Rpb24obyl7dD1vLmNhbGwocyx0LHIpfSksdH0sSnM9ZnVuY3Rpb24odCl7cmV0dXJuISEodCYmdC5fX0NBTkNFTF9fKX0scXM9UGUsRm49V2ksWGk9SnMsWmk9VW4seGk9WHI7ZnVuY3Rpb24gTW4oZSl7aWYoZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksZS5zaWduYWwmJmUuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IHhpfXZhciBlYz1mdW5jdGlvbih0KXtNbih0KSx0LmhlYWRlcnM9dC5oZWFkZXJzfHx7fSx0LmRhdGE9Rm4uY2FsbCh0LHQuZGF0YSx0LmhlYWRlcnMsdC50cmFuc2Zvcm1SZXF1ZXN0KSx0LmhlYWRlcnM9cXMubWVyZ2UodC5oZWFkZXJzLmNvbW1vbnx8e30sdC5oZWFkZXJzW3QubWV0aG9kXXx8e30sdC5oZWFkZXJzKSxxcy5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSB0LmhlYWRlcnNbc119KTt2YXIgcj10LmFkYXB0ZXJ8fFppLmFkYXB0ZXI7cmV0dXJuIHIodCkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4gTW4odCkscy5kYXRhPUZuLmNhbGwodCxzLmRhdGEscy5oZWFkZXJzLHQudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBYaShzKXx8KE1uKHQpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9Rm4uY2FsbCh0LHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsdC50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxVZT1QZSxHcz1mdW5jdGlvbih0LHIpe3I9cnx8e307dmFyIG49e307ZnVuY3Rpb24gcyhpLGgpe3JldHVybiBVZS5pc1BsYWluT2JqZWN0KGkpJiZVZS5pc1BsYWluT2JqZWN0KGgpP1VlLm1lcmdlKGksaCk6VWUuaXNQbGFpbk9iamVjdChoKT9VZS5tZXJnZSh7fSxoKTpVZS5pc0FycmF5KGgpP2guc2xpY2UoKTpofWZ1bmN0aW9uIGEoaSl7aWYoVWUuaXNVbmRlZmluZWQocltpXSkpe2lmKCFVZS5pc1VuZGVmaW5lZCh0W2ldKSlyZXR1cm4gcyh2b2lkIDAsdFtpXSl9ZWxzZSByZXR1cm4gcyh0W2ldLHJbaV0pfWZ1bmN0aW9uIG8oaSl7aWYoIVVlLmlzVW5kZWZpbmVkKHJbaV0pKXJldHVybiBzKHZvaWQgMCxyW2ldKX1mdW5jdGlvbiBsKGkpe2lmKFVlLmlzVW5kZWZpbmVkKHJbaV0pKXtpZighVWUuaXNVbmRlZmluZWQodFtpXSkpcmV0dXJuIHModm9pZCAwLHRbaV0pfWVsc2UgcmV0dXJuIHModm9pZCAwLHJbaV0pfWZ1bmN0aW9uIGYoaSl7aWYoaSBpbiByKXJldHVybiBzKHRbaV0scltpXSk7aWYoaSBpbiB0KXJldHVybiBzKHZvaWQgMCx0W2ldKX12YXIgcD17dXJsOm8sbWV0aG9kOm8sZGF0YTpvLGJhc2VVUkw6bCx0cmFuc2Zvcm1SZXF1ZXN0OmwsdHJhbnNmb3JtUmVzcG9uc2U6bCxwYXJhbXNTZXJpYWxpemVyOmwsdGltZW91dDpsLHRpbWVvdXRNZXNzYWdlOmwsd2l0aENyZWRlbnRpYWxzOmwsYWRhcHRlcjpsLHJlc3BvbnNlVHlwZTpsLHhzcmZDb29raWVOYW1lOmwseHNyZkhlYWRlck5hbWU6bCxvblVwbG9hZFByb2dyZXNzOmwsb25Eb3dubG9hZFByb2dyZXNzOmwsZGVjb21wcmVzczpsLG1heENvbnRlbnRMZW5ndGg6bCxtYXhCb2R5TGVuZ3RoOmwsYmVmb3JlUmVkaXJlY3Q6bCx0cmFuc3BvcnQ6bCxodHRwQWdlbnQ6bCxodHRwc0FnZW50OmwsY2FuY2VsVG9rZW46bCxzb2NrZXRQYXRoOmwscmVzcG9uc2VFbmNvZGluZzpsLHZhbGlkYXRlU3RhdHVzOmZ9O3JldHVybiBVZS5mb3JFYWNoKE9iamVjdC5rZXlzKHQpLmNvbmNhdChPYmplY3Qua2V5cyhyKSksZnVuY3Rpb24oaCl7dmFyIEU9cFtoXXx8YSxUPUUoaCk7VWUuaXNVbmRlZmluZWQoVCkmJkUhPT1mfHwobltoXT1UKX0pLG59LFFzPXt2ZXJzaW9uOiIwLjI3LjIifSx0Yz1Rcy52ZXJzaW9uLGd0PVh0LExuPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihlLHQpe0xuW2VdPWZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09PWV8fCJhIisodDwxPyJuICI6IiAiKStlfX0pO3ZhciBZcz17fTtMbi50cmFuc2l0aW9uYWw9ZnVuY3Rpb24odCxyLG4pe2Z1bmN0aW9uIHMoYSxvKXtyZXR1cm4iW0F4aW9zIHYiK3RjKyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrYSsiJyIrbysobj8iLiAiK246IiIpfXJldHVybiBmdW5jdGlvbihhLG8sbCl7aWYodD09PSExKXRocm93IG5ldyBndChzKG8sIiBoYXMgYmVlbiByZW1vdmVkIisocj8iIGluICIrcjoiIikpLGd0LkVSUl9ERVBSRUNBVEVEKTtyZXR1cm4gciYmIVlzW29dJiYoWXNbb109ITAsY29uc29sZS53YXJuKHMobywiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrcisiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSx0P3QoYSxvLGwpOiEwfX07ZnVuY3Rpb24gcmMoZSx0LHIpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Iil0aHJvdyBuZXcgZ3QoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiLGd0LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtmb3IodmFyIG49T2JqZWN0LmtleXMoZSkscz1uLmxlbmd0aDtzLS0gPjA7KXt2YXIgYT1uW3NdLG89dFthXTtpZihvKXt2YXIgbD1lW2FdLGY9bD09PXZvaWQgMHx8byhsLGEsZSk7aWYoZiE9PSEwKXRocm93IG5ldyBndCgib3B0aW9uICIrYSsiIG11c3QgYmUgIitmLGd0LkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtjb250aW51ZX1pZihyIT09ITApdGhyb3cgbmV3IGd0KCJVbmtub3duIG9wdGlvbiAiK2EsZ3QuRVJSX0JBRF9PUFRJT04pfX12YXIgbmM9e2Fzc2VydE9wdGlvbnM6cmMsdmFsaWRhdG9yczpMbn0sV3M9UGUsc2M9SXMsWHM9Z2ksWnM9ZWMseHI9R3MsYWM9TXMseHM9bmMsWnQ9eHMudmFsaWRhdG9ycztmdW5jdGlvbiB4dChlKXt0aGlzLmRlZmF1bHRzPWUsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IFhzLHJlc3BvbnNlOm5ldyBYc319eHQucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24odCxyKXt0eXBlb2YgdD09InN0cmluZyI/KHI9cnx8e30sci51cmw9dCk6cj10fHx7fSxyPXhyKHRoaXMuZGVmYXVsdHMsciksci5tZXRob2Q/ci5tZXRob2Q9ci5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD9yLm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnIubWV0aG9kPSJnZXQiO3ZhciBuPXIudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJnhzLmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6WnQudHJhbnNpdGlvbmFsKFp0LmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOlp0LnRyYW5zaXRpb25hbChadC5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOlp0LnRyYW5zaXRpb25hbChadC5ib29sZWFuKX0sITEpO3ZhciBzPVtdLGE9ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKFQpe3R5cGVvZiBULnJ1bldoZW49PSJmdW5jdGlvbiImJlQucnVuV2hlbihyKT09PSExfHwoYT1hJiZULnN5bmNocm9ub3VzLHMudW5zaGlmdChULmZ1bGZpbGxlZCxULnJlamVjdGVkKSl9KTt2YXIgbz1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKFQpe28ucHVzaChULmZ1bGZpbGxlZCxULnJlamVjdGVkKX0pO3ZhciBsO2lmKCFhKXt2YXIgZj1bWnMsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoZixzKSxmPWYuY29uY2F0KG8pLGw9UHJvbWlzZS5yZXNvbHZlKHIpO2YubGVuZ3RoOylsPWwudGhlbihmLnNoaWZ0KCksZi5zaGlmdCgpKTtyZXR1cm4gbH1mb3IodmFyIHA9cjtzLmxlbmd0aDspe3ZhciBpPXMuc2hpZnQoKSxoPXMuc2hpZnQoKTt0cnl7cD1pKHApfWNhdGNoKEUpe2goRSk7YnJlYWt9fXRyeXtsPVpzKHApfWNhdGNoKEUpe3JldHVybiBQcm9taXNlLnJlamVjdChFKX1mb3IoO28ubGVuZ3RoOylsPWwudGhlbihvLnNoaWZ0KCksby5zaGlmdCgpKTtyZXR1cm4gbH0seHQucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbih0KXt0PXhyKHRoaXMuZGVmYXVsdHMsdCk7dmFyIHI9YWModC5iYXNlVVJMLHQudXJsKTtyZXR1cm4gc2Mocix0LnBhcmFtcyx0LnBhcmFtc1NlcmlhbGl6ZXIpfSxXcy5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbih0KXt4dC5wcm90b3R5cGVbdF09ZnVuY3Rpb24ocixuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHhyKG58fHt9LHttZXRob2Q6dCx1cmw6cixkYXRhOihufHx7fSkuZGF0YX0pKX19KSxXcy5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24odCl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gZnVuY3Rpb24oYSxvLGwpe3JldHVybiB0aGlzLnJlcXVlc3QoeHIobHx8e30se21ldGhvZDp0LGhlYWRlcnM6bj97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6YSxkYXRhOm99KSl9fXh0LnByb3RvdHlwZVt0XT1yKCkseHQucHJvdG90eXBlW3QrIkZvcm0iXT1yKCEwKX0pO3ZhciBvYz14dCxpYz1YcjtmdW5jdGlvbiBlcihlKXtpZih0eXBlb2YgZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMpe3Q9c30pO3ZhciByPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24obil7aWYoISFyLl9saXN0ZW5lcnMpe3ZhciBzLGE9ci5fbGlzdGVuZXJzLmxlbmd0aDtmb3Iocz0wO3M8YTtzKyspci5fbGlzdGVuZXJzW3NdKG4pO3IuX2xpc3RlbmVycz1udWxsfX0pLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKG4pe3ZhciBzLGE9bmV3IFByb21pc2UoZnVuY3Rpb24obyl7ci5zdWJzY3JpYmUobykscz1vfSkudGhlbihuKTtyZXR1cm4gYS5jYW5jZWw9ZnVuY3Rpb24oKXtyLnVuc3Vic2NyaWJlKHMpfSxhfSxlKGZ1bmN0aW9uKHMpe3IucmVhc29ufHwoci5yZWFzb249bmV3IGljKHMpLHQoci5yZWFzb24pKX0pfWVyLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LGVyLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24odCl7aWYodGhpcy5yZWFzb24pe3QodGhpcy5yZWFzb24pO3JldHVybn10aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2godCk6dGhpcy5fbGlzdGVuZXJzPVt0XX0sZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe2lmKCEhdGhpcy5fbGlzdGVuZXJzKXt2YXIgcj10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZih0KTtyIT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UociwxKX19LGVyLnNvdXJjZT1mdW5jdGlvbigpe3ZhciB0LHI9bmV3IGVyKGZ1bmN0aW9uKHMpe3Q9c30pO3JldHVybnt0b2tlbjpyLGNhbmNlbDp0fX07dmFyIGNjPWVyLHVjPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5hcHBseShudWxsLG4pfX0sbGM9UGUsZmM9ZnVuY3Rpb24odCl7cmV0dXJuIGxjLmlzT2JqZWN0KHQpJiZ0LmlzQXhpb3NFcnJvcj09PSEwfSxlYT1QZSxkYz1Qcyxlbj1vYyxoYz1HcyxwYz1VbjtmdW5jdGlvbiB0YShlKXt2YXIgdD1uZXcgZW4oZSkscj1kYyhlbi5wcm90b3R5cGUucmVxdWVzdCx0KTtyZXR1cm4gZWEuZXh0ZW5kKHIsZW4ucHJvdG90eXBlLHQpLGVhLmV4dGVuZChyLHQpLHIuY3JlYXRlPWZ1bmN0aW9uKHMpe3JldHVybiB0YShoYyhlLHMpKX0scn12YXIgRGU9dGEocGMpO0RlLkF4aW9zPWVuLERlLkNhbmNlbGVkRXJyb3I9WHIsRGUuQ2FuY2VsVG9rZW49Y2MsRGUuaXNDYW5jZWw9SnMsRGUuVkVSU0lPTj1Rcy52ZXJzaW9uLERlLnRvRm9ybURhdGE9RnMsRGUuQXhpb3NFcnJvcj1YdCxEZS5DYW5jZWw9RGUuQ2FuY2VsZWRFcnJvcixEZS5hbGw9ZnVuY3Rpb24odCl7cmV0dXJuIFByb21pc2UuYWxsKHQpfSxEZS5zcHJlYWQ9dWMsRGUuaXNBeGlvc0Vycm9yPWZjLE9uLmV4cG9ydHM9RGUsT24uZXhwb3J0cy5kZWZhdWx0PURlO3ZhciBWbj1Pbi5leHBvcnRzLEN0PXt9LHRuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0biwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdG4uR2V0RXJyb3JQYXlsb2FkPXZvaWQgMDtmdW5jdGlvbiBtYyhlLHQ9bnVsbCl7cmV0dXJue2Vycm9yOmUuY29kZSxlcnJvcl9kZXNjcmlwdGlvbjplLmRlc2NyaXB0aW9uLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRldGFpbHM6dH19dG4uR2V0RXJyb3JQYXlsb2FkPW1jO3ZhciBybj17fSxJdD17fSx6bj17ZXhwb3J0czp7fX0scmE9e30sV2U9e30sdHI9e30sRXI9e30sdWU9e30seXI9e307KGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLnJlZ2V4cENvZGU9ZS5nZXRFc21FeHBvcnROYW1lPWUuZ2V0UHJvcGVydHk9ZS5zYWZlU3RyaW5naWZ5PWUuc3RyaW5naWZ5PWUuc3RyQ29uY2F0PWUuYWRkQ29kZUFyZz1lLnN0cj1lLl89ZS5uaWw9ZS5fQ29kZT1lLk5hbWU9ZS5JREVOVElGSUVSPWUuX0NvZGVPck5hbWU9dm9pZCAwO2NsYXNzIHR7fWUuX0NvZGVPck5hbWU9dCxlLklERU5USUZJRVI9L15bYS16JF9dW2EteiRfMC05XSokL2k7Y2xhc3MgciBleHRlbmRzIHR7Y29uc3RydWN0b3IoYil7aWYoc3VwZXIoKSwhZS5JREVOVElGSUVSLnRlc3QoYikpdGhyb3cgbmV3IEVycm9yKCJDb2RlR2VuOiBuYW1lIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyIik7dGhpcy5zdHI9Yn10b1N0cmluZygpe3JldHVybiB0aGlzLnN0cn1lbXB0eVN0cigpe3JldHVybiExfWdldCBuYW1lcygpe3JldHVybntbdGhpcy5zdHJdOjF9fX1lLk5hbWU9cjtjbGFzcyBuIGV4dGVuZHMgdHtjb25zdHJ1Y3RvcihiKXtzdXBlcigpLHRoaXMuX2l0ZW1zPXR5cGVvZiBiPT0ic3RyaW5nIj9bYl06Yn10b1N0cmluZygpe3JldHVybiB0aGlzLnN0cn1lbXB0eVN0cigpe2lmKHRoaXMuX2l0ZW1zLmxlbmd0aD4xKXJldHVybiExO2NvbnN0IGI9dGhpcy5faXRlbXNbMF07cmV0dXJuIGI9PT0iInx8Yj09PSciIid9Z2V0IHN0cigpe3ZhciBiO3JldHVybihiPXRoaXMuX3N0cikhPT1udWxsJiZiIT09dm9pZCAwP2I6dGhpcy5fc3RyPXRoaXMuX2l0ZW1zLnJlZHVjZSgoTyxBKT0+YCR7T30ke0F9YCwiIil9Z2V0IG5hbWVzKCl7dmFyIGI7cmV0dXJuKGI9dGhpcy5fbmFtZXMpIT09bnVsbCYmYiE9PXZvaWQgMD9iOnRoaXMuX25hbWVzPXRoaXMuX2l0ZW1zLnJlZHVjZSgoTyxBKT0+KEEgaW5zdGFuY2VvZiByJiYoT1tBLnN0cl09KE9bQS5zdHJdfHwwKSsxKSxPKSx7fSl9fWUuX0NvZGU9bixlLm5pbD1uZXcgbigiIik7ZnVuY3Rpb24gcyhfLC4uLmIpe2NvbnN0IE89W19bMF1dO2xldCBBPTA7Zm9yKDtBPGIubGVuZ3RoOylsKE8sYltBXSksTy5wdXNoKF9bKytBXSk7cmV0dXJuIG5ldyBuKE8pfWUuXz1zO2NvbnN0IGE9bmV3IG4oIisiKTtmdW5jdGlvbiBvKF8sLi4uYil7Y29uc3QgTz1bVChfWzBdKV07bGV0IEE9MDtmb3IoO0E8Yi5sZW5ndGg7KU8ucHVzaChhKSxsKE8sYltBXSksTy5wdXNoKGEsVChfWysrQV0pKTtyZXR1cm4gZihPKSxuZXcgbihPKX1lLnN0cj1vO2Z1bmN0aW9uIGwoXyxiKXtiIGluc3RhbmNlb2Ygbj9fLnB1c2goLi4uYi5faXRlbXMpOmIgaW5zdGFuY2VvZiByP18ucHVzaChiKTpfLnB1c2goaChiKSl9ZS5hZGRDb2RlQXJnPWw7ZnVuY3Rpb24gZihfKXtsZXQgYj0xO2Zvcig7YjxfLmxlbmd0aC0xOyl7aWYoX1tiXT09PWEpe2NvbnN0IE89cChfW2ItMV0sX1tiKzFdKTtpZihPIT09dm9pZCAwKXtfLnNwbGljZShiLTEsMyxPKTtjb250aW51ZX1fW2IrK109IisifWIrK319ZnVuY3Rpb24gcChfLGIpe2lmKGI9PT0nIiInKXJldHVybiBfO2lmKF89PT0nIiInKXJldHVybiBiO2lmKHR5cGVvZiBfPT0ic3RyaW5nIilyZXR1cm4gYiBpbnN0YW5jZW9mIHJ8fF9bXy5sZW5ndGgtMV0hPT0nIic/dm9pZCAwOnR5cGVvZiBiIT0ic3RyaW5nIj9gJHtfLnNsaWNlKDAsLTEpfSR7Yn0iYDpiWzBdPT09JyInP18uc2xpY2UoMCwtMSkrYi5zbGljZSgxKTp2b2lkIDA7aWYodHlwZW9mIGI9PSJzdHJpbmciJiZiWzBdPT09JyInJiYhKF8gaW5zdGFuY2VvZiByKSlyZXR1cm5gIiR7X30ke2Iuc2xpY2UoMSl9YH1mdW5jdGlvbiBpKF8sYil7cmV0dXJuIGIuZW1wdHlTdHIoKT9fOl8uZW1wdHlTdHIoKT9iOm9gJHtffSR7Yn1gfWUuc3RyQ29uY2F0PWk7ZnVuY3Rpb24gaChfKXtyZXR1cm4gdHlwZW9mIF89PSJudW1iZXIifHx0eXBlb2YgXz09ImJvb2xlYW4ifHxfPT09bnVsbD9fOlQoQXJyYXkuaXNBcnJheShfKT9fLmpvaW4oIiwiKTpfKX1mdW5jdGlvbiBFKF8pe3JldHVybiBuZXcgbihUKF8pKX1lLnN0cmluZ2lmeT1FO2Z1bmN0aW9uIFQoXyl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KF8pLnJlcGxhY2UoL1x1MjAyOC9nLCJcXHUyMDI4IikucmVwbGFjZSgvXHUyMDI5L2csIlxcdTIwMjkiKX1lLnNhZmVTdHJpbmdpZnk9VDtmdW5jdGlvbiBJKF8pe3JldHVybiB0eXBlb2YgXz09InN0cmluZyImJmUuSURFTlRJRklFUi50ZXN0KF8pP25ldyBuKGAuJHtffWApOnNgWyR7X31dYH1lLmdldFByb3BlcnR5PUk7ZnVuY3Rpb24gaihfKXtpZih0eXBlb2YgXz09InN0cmluZyImJmUuSURFTlRJRklFUi50ZXN0KF8pKXJldHVybiBuZXcgbihgJHtffWApO3Rocm93IG5ldyBFcnJvcihgQ29kZUdlbjogaW52YWxpZCBleHBvcnQgbmFtZTogJHtffSwgdXNlIGV4cGxpY2l0ICRpZCBuYW1lIG1hcHBpbmdgKX1lLmdldEVzbUV4cG9ydE5hbWU9ajtmdW5jdGlvbiB5KF8pe3JldHVybiBuZXcgbihfLnRvU3RyaW5nKCkpfWUucmVnZXhwQ29kZT15fSkoeXIpO3ZhciBIbj17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuVmFsdWVTY29wZT1lLlZhbHVlU2NvcGVOYW1lPWUuU2NvcGU9ZS52YXJLaW5kcz1lLlVzZWRWYWx1ZVN0YXRlPXZvaWQgMDtjb25zdCB0PXlyO2NsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihwKXtzdXBlcihgQ29kZUdlbjogImNvZGUiIGZvciAke3B9IG5vdCBkZWZpbmVkYCksdGhpcy52YWx1ZT1wLnZhbHVlfX12YXIgbjsoZnVuY3Rpb24oZil7ZltmLlN0YXJ0ZWQ9MF09IlN0YXJ0ZWQiLGZbZi5Db21wbGV0ZWQ9MV09IkNvbXBsZXRlZCJ9KShuPWUuVXNlZFZhbHVlU3RhdGV8fChlLlVzZWRWYWx1ZVN0YXRlPXt9KSksZS52YXJLaW5kcz17Y29uc3Q6bmV3IHQuTmFtZSgiY29uc3QiKSxsZXQ6bmV3IHQuTmFtZSgibGV0IiksdmFyOm5ldyB0Lk5hbWUoInZhciIpfTtjbGFzcyBze2NvbnN0cnVjdG9yKHtwcmVmaXhlczpwLHBhcmVudDppfT17fSl7dGhpcy5fbmFtZXM9e30sdGhpcy5fcHJlZml4ZXM9cCx0aGlzLl9wYXJlbnQ9aX10b05hbWUocCl7cmV0dXJuIHAgaW5zdGFuY2VvZiB0Lk5hbWU/cDp0aGlzLm5hbWUocCl9bmFtZShwKXtyZXR1cm4gbmV3IHQuTmFtZSh0aGlzLl9uZXdOYW1lKHApKX1fbmV3TmFtZShwKXtjb25zdCBpPXRoaXMuX25hbWVzW3BdfHx0aGlzLl9uYW1lR3JvdXAocCk7cmV0dXJuYCR7cH0ke2kuaW5kZXgrK31gfV9uYW1lR3JvdXAocCl7dmFyIGksaDtpZigoKGg9KGk9dGhpcy5fcGFyZW50KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkuX3ByZWZpeGVzKT09PW51bGx8fGg9PT12b2lkIDA/dm9pZCAwOmguaGFzKHApKXx8dGhpcy5fcHJlZml4ZXMmJiF0aGlzLl9wcmVmaXhlcy5oYXMocCkpdGhyb3cgbmV3IEVycm9yKGBDb2RlR2VuOiBwcmVmaXggIiR7cH0iIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgc2NvcGVgKTtyZXR1cm4gdGhpcy5fbmFtZXNbcF09e3ByZWZpeDpwLGluZGV4OjB9fX1lLlNjb3BlPXM7Y2xhc3MgYSBleHRlbmRzIHQuTmFtZXtjb25zdHJ1Y3RvcihwLGkpe3N1cGVyKGkpLHRoaXMucHJlZml4PXB9c2V0VmFsdWUocCx7cHJvcGVydHk6aSxpdGVtSW5kZXg6aH0pe3RoaXMudmFsdWU9cCx0aGlzLnNjb3BlUGF0aD0oMCx0Ll8pYC4ke25ldyB0Lk5hbWUoaSl9WyR7aH1dYH19ZS5WYWx1ZVNjb3BlTmFtZT1hO2NvbnN0IG89KDAsdC5fKWBcbmA7Y2xhc3MgbCBleHRlbmRzIHN7Y29uc3RydWN0b3IocCl7c3VwZXIocCksdGhpcy5fdmFsdWVzPXt9LHRoaXMuX3Njb3BlPXAuc2NvcGUsdGhpcy5vcHRzPWxlKFEoe30scCkse19uOnAubGluZXM/bzp0Lm5pbH0pfWdldCgpe3JldHVybiB0aGlzLl9zY29wZX1uYW1lKHApe3JldHVybiBuZXcgYShwLHRoaXMuX25ld05hbWUocCkpfXZhbHVlKHAsaSl7dmFyIGg7aWYoaS5yZWY9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJDb2RlR2VuOiByZWYgbXVzdCBiZSBwYXNzZWQgaW4gdmFsdWUiKTtjb25zdCBFPXRoaXMudG9OYW1lKHApLHtwcmVmaXg6VH09RSxJPShoPWkua2V5KSE9PW51bGwmJmghPT12b2lkIDA/aDppLnJlZjtsZXQgaj10aGlzLl92YWx1ZXNbVF07aWYoail7Y29uc3QgYj1qLmdldChJKTtpZihiKXJldHVybiBifWVsc2Ugaj10aGlzLl92YWx1ZXNbVF09bmV3IE1hcDtqLnNldChJLEUpO2NvbnN0IHk9dGhpcy5fc2NvcGVbVF18fCh0aGlzLl9zY29wZVtUXT1bXSksXz15Lmxlbmd0aDtyZXR1cm4geVtfXT1pLnJlZixFLnNldFZhbHVlKGkse3Byb3BlcnR5OlQsaXRlbUluZGV4Ol99KSxFfWdldFZhbHVlKHAsaSl7Y29uc3QgaD10aGlzLl92YWx1ZXNbcF07aWYoISFoKXJldHVybiBoLmdldChpKX1zY29wZVJlZnMocCxpPXRoaXMuX3ZhbHVlcyl7cmV0dXJuIHRoaXMuX3JlZHVjZVZhbHVlcyhpLGg9PntpZihoLnNjb3BlUGF0aD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IG5hbWUgIiR7aH0iIGhhcyBubyB2YWx1ZWApO3JldHVybigwLHQuXylgJHtwfSR7aC5zY29wZVBhdGh9YH0pfXNjb3BlQ29kZShwPXRoaXMuX3ZhbHVlcyxpLGgpe3JldHVybiB0aGlzLl9yZWR1Y2VWYWx1ZXMocCxFPT57aWYoRS52YWx1ZT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IG5hbWUgIiR7RX0iIGhhcyBubyB2YWx1ZWApO3JldHVybiBFLnZhbHVlLmNvZGV9LGksaCl9X3JlZHVjZVZhbHVlcyhwLGksaD17fSxFKXtsZXQgVD10Lm5pbDtmb3IoY29uc3QgSSBpbiBwKXtjb25zdCBqPXBbSV07aWYoIWopY29udGludWU7Y29uc3QgeT1oW0ldPWhbSV18fG5ldyBNYXA7ai5mb3JFYWNoKF89PntpZih5LmhhcyhfKSlyZXR1cm47eS5zZXQoXyxuLlN0YXJ0ZWQpO2xldCBiPWkoXyk7aWYoYil7Y29uc3QgTz10aGlzLm9wdHMuZXM1P2UudmFyS2luZHMudmFyOmUudmFyS2luZHMuY29uc3Q7VD0oMCx0Ll8pYCR7VH0ke099ICR7X30gPSAke2J9OyR7dGhpcy5vcHRzLl9ufWB9ZWxzZSBpZihiPUU9PW51bGw/dm9pZCAwOkUoXykpVD0oMCx0Ll8pYCR7VH0ke2J9JHt0aGlzLm9wdHMuX259YDtlbHNlIHRocm93IG5ldyByKF8pO3kuc2V0KF8sbi5Db21wbGV0ZWQpfSl9cmV0dXJuIFR9fWUuVmFsdWVTY29wZT1sfSkoSG4pLGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLm9yPWUuYW5kPWUubm90PWUuQ29kZUdlbj1lLm9wZXJhdG9ycz1lLnZhcktpbmRzPWUuVmFsdWVTY29wZU5hbWU9ZS5WYWx1ZVNjb3BlPWUuU2NvcGU9ZS5OYW1lPWUucmVnZXhwQ29kZT1lLnN0cmluZ2lmeT1lLmdldFByb3BlcnR5PWUubmlsPWUuc3RyQ29uY2F0PWUuc3RyPWUuXz12b2lkIDA7Y29uc3QgdD15cixyPUhuO3ZhciBuPXlyO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ffX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdHIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuLnN0cn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic3RyQ29uY2F0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5zdHJDb25jYXR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5pbCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4ubmlsfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJnZXRQcm9wZXJ0eSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0UHJvcGVydHl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInN0cmluZ2lmeSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uc3RyaW5naWZ5fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJyZWdleHBDb2RlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5yZWdleHBDb2RlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJOYW1lIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5OYW1lfX0pO3ZhciBzPUhuO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJTY29wZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuU2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIlZhbHVlU2NvcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzLlZhbHVlU2NvcGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIlZhbHVlU2NvcGVOYW1lIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5WYWx1ZVNjb3BlTmFtZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwidmFyS2luZHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBzLnZhcktpbmRzfX0pLGUub3BlcmF0b3JzPXtHVDpuZXcgdC5fQ29kZSgiPiIpLEdURTpuZXcgdC5fQ29kZSgiPj0iKSxMVDpuZXcgdC5fQ29kZSgiPCIpLExURTpuZXcgdC5fQ29kZSgiPD0iKSxFUTpuZXcgdC5fQ29kZSgiPT09IiksTkVROm5ldyB0Ll9Db2RlKCIhPT0iKSxOT1Q6bmV3IHQuX0NvZGUoIiEiKSxPUjpuZXcgdC5fQ29kZSgifHwiKSxBTkQ6bmV3IHQuX0NvZGUoIiYmIiksQUREOm5ldyB0Ll9Db2RlKCIrIil9O2NsYXNzIGF7b3B0aW1pemVOb2Rlcygpe3JldHVybiB0aGlzfW9wdGltaXplTmFtZXMoYyxtKXtyZXR1cm4gdGhpc319Y2xhc3MgbyBleHRlbmRzIGF7Y29uc3RydWN0b3IoYyxtLFApe3N1cGVyKCksdGhpcy52YXJLaW5kPWMsdGhpcy5uYW1lPW0sdGhpcy5yaHM9UH1yZW5kZXIoe2VzNTpjLF9uOm19KXtjb25zdCBQPWM/ci52YXJLaW5kcy52YXI6dGhpcy52YXJLaW5kLFU9dGhpcy5yaHM9PT12b2lkIDA/IiI6YCA9ICR7dGhpcy5yaHN9YDtyZXR1cm5gJHtQfSAke3RoaXMubmFtZX0ke1V9O2ArbX1vcHRpbWl6ZU5hbWVzKGMsbSl7aWYoISFjW3RoaXMubmFtZS5zdHJdKXJldHVybiB0aGlzLnJocyYmKHRoaXMucmhzPVgodGhpcy5yaHMsYyxtKSksdGhpc31nZXQgbmFtZXMoKXtyZXR1cm4gdGhpcy5yaHMgaW5zdGFuY2VvZiB0Ll9Db2RlT3JOYW1lP3RoaXMucmhzLm5hbWVzOnt9fX1jbGFzcyBsIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihjLG0sUCl7c3VwZXIoKSx0aGlzLmxocz1jLHRoaXMucmhzPW0sdGhpcy5zaWRlRWZmZWN0cz1QfXJlbmRlcih7X246Y30pe3JldHVybmAke3RoaXMubGhzfSA9ICR7dGhpcy5yaHN9O2ArY31vcHRpbWl6ZU5hbWVzKGMsbSl7aWYoISh0aGlzLmxocyBpbnN0YW5jZW9mIHQuTmFtZSYmIWNbdGhpcy5saHMuc3RyXSYmIXRoaXMuc2lkZUVmZmVjdHMpKXJldHVybiB0aGlzLnJocz1YKHRoaXMucmhzLGMsbSksdGhpc31nZXQgbmFtZXMoKXtjb25zdCBjPXRoaXMubGhzIGluc3RhbmNlb2YgdC5OYW1lP3t9OlEoe30sdGhpcy5saHMubmFtZXMpO3JldHVybiBvZShjLHRoaXMucmhzKX19Y2xhc3MgZiBleHRlbmRzIGx7Y29uc3RydWN0b3IoYyxtLFAsVSl7c3VwZXIoYyxQLFUpLHRoaXMub3A9bX1yZW5kZXIoe19uOmN9KXtyZXR1cm5gJHt0aGlzLmxoc30gJHt0aGlzLm9wfT0gJHt0aGlzLnJoc307YCtjfX1jbGFzcyBwIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihjKXtzdXBlcigpLHRoaXMubGFiZWw9Yyx0aGlzLm5hbWVzPXt9fXJlbmRlcih7X246Y30pe3JldHVybmAke3RoaXMubGFiZWx9OmArY319Y2xhc3MgaSBleHRlbmRzIGF7Y29uc3RydWN0b3IoYyl7c3VwZXIoKSx0aGlzLmxhYmVsPWMsdGhpcy5uYW1lcz17fX1yZW5kZXIoe19uOmN9KXtyZXR1cm5gYnJlYWske3RoaXMubGFiZWw/YCAke3RoaXMubGFiZWx9YDoiIn07YCtjfX1jbGFzcyBoIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihjKXtzdXBlcigpLHRoaXMuZXJyb3I9Y31yZW5kZXIoe19uOmN9KXtyZXR1cm5gdGhyb3cgJHt0aGlzLmVycm9yfTtgK2N9Z2V0IG5hbWVzKCl7cmV0dXJuIHRoaXMuZXJyb3IubmFtZXN9fWNsYXNzIEUgZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKGMpe3N1cGVyKCksdGhpcy5jb2RlPWN9cmVuZGVyKHtfbjpjfSl7cmV0dXJuYCR7dGhpcy5jb2RlfTtgK2N9b3B0aW1pemVOb2Rlcygpe3JldHVybmAke3RoaXMuY29kZX1gP3RoaXM6dm9pZCAwfW9wdGltaXplTmFtZXMoYyxtKXtyZXR1cm4gdGhpcy5jb2RlPVgodGhpcy5jb2RlLGMsbSksdGhpc31nZXQgbmFtZXMoKXtyZXR1cm4gdGhpcy5jb2RlIGluc3RhbmNlb2YgdC5fQ29kZU9yTmFtZT90aGlzLmNvZGUubmFtZXM6e319fWNsYXNzIFQgZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKGM9W10pe3N1cGVyKCksdGhpcy5ub2Rlcz1jfXJlbmRlcihjKXtyZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKG0sUCk9Pm0rUC5yZW5kZXIoYyksIiIpfW9wdGltaXplTm9kZXMoKXtjb25zdHtub2RlczpjfT10aGlzO2xldCBtPWMubGVuZ3RoO2Zvcig7bS0tOyl7Y29uc3QgUD1jW21dLm9wdGltaXplTm9kZXMoKTtBcnJheS5pc0FycmF5KFApP2Muc3BsaWNlKG0sMSwuLi5QKTpQP2NbbV09UDpjLnNwbGljZShtLDEpfXJldHVybiBjLmxlbmd0aD4wP3RoaXM6dm9pZCAwfW9wdGltaXplTmFtZXMoYyxtKXtjb25zdHtub2RlczpQfT10aGlzO2xldCBVPVAubGVuZ3RoO2Zvcig7VS0tOyl7Y29uc3QgRj1QW1VdO0Yub3B0aW1pemVOYW1lcyhjLG0pfHwodmUoYyxGLm5hbWVzKSxQLnNwbGljZShVLDEpKX1yZXR1cm4gUC5sZW5ndGg+MD90aGlzOnZvaWQgMH1nZXQgbmFtZXMoKXtyZXR1cm4gdGhpcy5ub2Rlcy5yZWR1Y2UoKGMsbSk9PlcoYyxtLm5hbWVzKSx7fSl9fWNsYXNzIEkgZXh0ZW5kcyBUe3JlbmRlcihjKXtyZXR1cm4ieyIrYy5fbitzdXBlci5yZW5kZXIoYykrIn0iK2MuX259fWNsYXNzIGogZXh0ZW5kcyBUe31jbGFzcyB5IGV4dGVuZHMgSXt9eS5raW5kPSJlbHNlIjtjbGFzcyBfIGV4dGVuZHMgSXtjb25zdHJ1Y3RvcihjLG0pe3N1cGVyKG0pLHRoaXMuY29uZGl0aW9uPWN9cmVuZGVyKGMpe2xldCBtPWBpZigke3RoaXMuY29uZGl0aW9ufSlgK3N1cGVyLnJlbmRlcihjKTtyZXR1cm4gdGhpcy5lbHNlJiYobSs9ImVsc2UgIit0aGlzLmVsc2UucmVuZGVyKGMpKSxtfW9wdGltaXplTm9kZXMoKXtzdXBlci5vcHRpbWl6ZU5vZGVzKCk7Y29uc3QgYz10aGlzLmNvbmRpdGlvbjtpZihjPT09ITApcmV0dXJuIHRoaXMubm9kZXM7bGV0IG09dGhpcy5lbHNlO2lmKG0pe2NvbnN0IFA9bS5vcHRpbWl6ZU5vZGVzKCk7bT10aGlzLmVsc2U9QXJyYXkuaXNBcnJheShQKT9uZXcgeShQKTpQfWlmKG0pcmV0dXJuIGM9PT0hMT9tIGluc3RhbmNlb2YgXz9tOm0ubm9kZXM6dGhpcy5ub2Rlcy5sZW5ndGg/dGhpczpuZXcgXyhFZShjKSxtIGluc3RhbmNlb2YgXz9bbV06bS5ub2Rlcyk7aWYoIShjPT09ITF8fCF0aGlzLm5vZGVzLmxlbmd0aCkpcmV0dXJuIHRoaXN9b3B0aW1pemVOYW1lcyhjLG0pe3ZhciBQO2lmKHRoaXMuZWxzZT0oUD10aGlzLmVsc2UpPT09bnVsbHx8UD09PXZvaWQgMD92b2lkIDA6UC5vcHRpbWl6ZU5hbWVzKGMsbSksISEoc3VwZXIub3B0aW1pemVOYW1lcyhjLG0pfHx0aGlzLmVsc2UpKXJldHVybiB0aGlzLmNvbmRpdGlvbj1YKHRoaXMuY29uZGl0aW9uLGMsbSksdGhpc31nZXQgbmFtZXMoKXtjb25zdCBjPXN1cGVyLm5hbWVzO3JldHVybiBvZShjLHRoaXMuY29uZGl0aW9uKSx0aGlzLmVsc2UmJlcoYyx0aGlzLmVsc2UubmFtZXMpLGN9fV8ua2luZD0iaWYiO2NsYXNzIGIgZXh0ZW5kcyBJe31iLmtpbmQ9ImZvciI7Y2xhc3MgTyBleHRlbmRzIGJ7Y29uc3RydWN0b3IoYyl7c3VwZXIoKSx0aGlzLml0ZXJhdGlvbj1jfXJlbmRlcihjKXtyZXR1cm5gZm9yKCR7dGhpcy5pdGVyYXRpb259KWArc3VwZXIucmVuZGVyKGMpfW9wdGltaXplTmFtZXMoYyxtKXtpZighIXN1cGVyLm9wdGltaXplTmFtZXMoYyxtKSlyZXR1cm4gdGhpcy5pdGVyYXRpb249WCh0aGlzLml0ZXJhdGlvbixjLG0pLHRoaXN9Z2V0IG5hbWVzKCl7cmV0dXJuIFcoc3VwZXIubmFtZXMsdGhpcy5pdGVyYXRpb24ubmFtZXMpfX1jbGFzcyBBIGV4dGVuZHMgYntjb25zdHJ1Y3RvcihjLG0sUCxVKXtzdXBlcigpLHRoaXMudmFyS2luZD1jLHRoaXMubmFtZT1tLHRoaXMuZnJvbT1QLHRoaXMudG89VX1yZW5kZXIoYyl7Y29uc3QgbT1jLmVzNT9yLnZhcktpbmRzLnZhcjp0aGlzLnZhcktpbmQse25hbWU6UCxmcm9tOlUsdG86Rn09dGhpcztyZXR1cm5gZm9yKCR7bX0gJHtQfT0ke1V9OyAke1B9PCR7Rn07ICR7UH0rKylgK3N1cGVyLnJlbmRlcihjKX1nZXQgbmFtZXMoKXtjb25zdCBjPW9lKHN1cGVyLm5hbWVzLHRoaXMuZnJvbSk7cmV0dXJuIG9lKGMsdGhpcy50byl9fWNsYXNzIEggZXh0ZW5kcyBie2NvbnN0cnVjdG9yKGMsbSxQLFUpe3N1cGVyKCksdGhpcy5sb29wPWMsdGhpcy52YXJLaW5kPW0sdGhpcy5uYW1lPVAsdGhpcy5pdGVyYWJsZT1VfXJlbmRlcihjKXtyZXR1cm5gZm9yKCR7dGhpcy52YXJLaW5kfSAke3RoaXMubmFtZX0gJHt0aGlzLmxvb3B9ICR7dGhpcy5pdGVyYWJsZX0pYCtzdXBlci5yZW5kZXIoYyl9b3B0aW1pemVOYW1lcyhjLG0pe2lmKCEhc3VwZXIub3B0aW1pemVOYW1lcyhjLG0pKXJldHVybiB0aGlzLml0ZXJhYmxlPVgodGhpcy5pdGVyYWJsZSxjLG0pLHRoaXN9Z2V0IG5hbWVzKCl7cmV0dXJuIFcoc3VwZXIubmFtZXMsdGhpcy5pdGVyYWJsZS5uYW1lcyl9fWNsYXNzICQgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKGMsbSxQKXtzdXBlcigpLHRoaXMubmFtZT1jLHRoaXMuYXJncz1tLHRoaXMuYXN5bmM9UH1yZW5kZXIoYyl7cmV0dXJuYCR7dGhpcy5hc3luYz8iYXN5bmMgIjoiIn1mdW5jdGlvbiAke3RoaXMubmFtZX0oJHt0aGlzLmFyZ3N9KWArc3VwZXIucmVuZGVyKGMpfX0kLmtpbmQ9ImZ1bmMiO2NsYXNzIE4gZXh0ZW5kcyBUe3JlbmRlcihjKXtyZXR1cm4icmV0dXJuICIrc3VwZXIucmVuZGVyKGMpfX1OLmtpbmQ9InJldHVybiI7Y2xhc3MgRCBleHRlbmRzIEl7cmVuZGVyKGMpe2xldCBtPSJ0cnkiK3N1cGVyLnJlbmRlcihjKTtyZXR1cm4gdGhpcy5jYXRjaCYmKG0rPXRoaXMuY2F0Y2gucmVuZGVyKGMpKSx0aGlzLmZpbmFsbHkmJihtKz10aGlzLmZpbmFsbHkucmVuZGVyKGMpKSxtfW9wdGltaXplTm9kZXMoKXt2YXIgYyxtO3JldHVybiBzdXBlci5vcHRpbWl6ZU5vZGVzKCksKGM9dGhpcy5jYXRjaCk9PT1udWxsfHxjPT09dm9pZCAwfHxjLm9wdGltaXplTm9kZXMoKSwobT10aGlzLmZpbmFsbHkpPT09bnVsbHx8bT09PXZvaWQgMHx8bS5vcHRpbWl6ZU5vZGVzKCksdGhpc31vcHRpbWl6ZU5hbWVzKGMsbSl7dmFyIFAsVTtyZXR1cm4gc3VwZXIub3B0aW1pemVOYW1lcyhjLG0pLChQPXRoaXMuY2F0Y2gpPT09bnVsbHx8UD09PXZvaWQgMHx8UC5vcHRpbWl6ZU5hbWVzKGMsbSksKFU9dGhpcy5maW5hbGx5KT09PW51bGx8fFU9PT12b2lkIDB8fFUub3B0aW1pemVOYW1lcyhjLG0pLHRoaXN9Z2V0IG5hbWVzKCl7Y29uc3QgYz1zdXBlci5uYW1lcztyZXR1cm4gdGhpcy5jYXRjaCYmVyhjLHRoaXMuY2F0Y2gubmFtZXMpLHRoaXMuZmluYWxseSYmVyhjLHRoaXMuZmluYWxseS5uYW1lcyksY319Y2xhc3MgQiBleHRlbmRzIEl7Y29uc3RydWN0b3IoYyl7c3VwZXIoKSx0aGlzLmVycm9yPWN9cmVuZGVyKGMpe3JldHVybmBjYXRjaCgke3RoaXMuZXJyb3J9KWArc3VwZXIucmVuZGVyKGMpfX1CLmtpbmQ9ImNhdGNoIjtjbGFzcyBHIGV4dGVuZHMgSXtyZW5kZXIoYyl7cmV0dXJuImZpbmFsbHkiK3N1cGVyLnJlbmRlcihjKX19Ry5raW5kPSJmaW5hbGx5IjtjbGFzcyBwZXtjb25zdHJ1Y3RvcihjLG09e30pe3RoaXMuX3ZhbHVlcz17fSx0aGlzLl9ibG9ja1N0YXJ0cz1bXSx0aGlzLl9jb25zdGFudHM9e30sdGhpcy5vcHRzPWxlKFEoe30sbSkse19uOm0ubGluZXM/YApgOiIifSksdGhpcy5fZXh0U2NvcGU9Yyx0aGlzLl9zY29wZT1uZXcgci5TY29wZSh7cGFyZW50OmN9KSx0aGlzLl9ub2Rlcz1bbmV3IGpdfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3Jvb3QucmVuZGVyKHRoaXMub3B0cyl9bmFtZShjKXtyZXR1cm4gdGhpcy5fc2NvcGUubmFtZShjKX1zY29wZU5hbWUoYyl7cmV0dXJuIHRoaXMuX2V4dFNjb3BlLm5hbWUoYyl9c2NvcGVWYWx1ZShjLG0pe2NvbnN0IFA9dGhpcy5fZXh0U2NvcGUudmFsdWUoYyxtKTtyZXR1cm4odGhpcy5fdmFsdWVzW1AucHJlZml4XXx8KHRoaXMuX3ZhbHVlc1tQLnByZWZpeF09bmV3IFNldCkpLmFkZChQKSxQfWdldFNjb3BlVmFsdWUoYyxtKXtyZXR1cm4gdGhpcy5fZXh0U2NvcGUuZ2V0VmFsdWUoYyxtKX1zY29wZVJlZnMoYyl7cmV0dXJuIHRoaXMuX2V4dFNjb3BlLnNjb3BlUmVmcyhjLHRoaXMuX3ZhbHVlcyl9c2NvcGVDb2RlKCl7cmV0dXJuIHRoaXMuX2V4dFNjb3BlLnNjb3BlQ29kZSh0aGlzLl92YWx1ZXMpfV9kZWYoYyxtLFAsVSl7Y29uc3QgRj10aGlzLl9zY29wZS50b05hbWUobSk7cmV0dXJuIFAhPT12b2lkIDAmJlUmJih0aGlzLl9jb25zdGFudHNbRi5zdHJdPVApLHRoaXMuX2xlYWZOb2RlKG5ldyBvKGMsRixQKSksRn1jb25zdChjLG0sUCl7cmV0dXJuIHRoaXMuX2RlZihyLnZhcktpbmRzLmNvbnN0LGMsbSxQKX1sZXQoYyxtLFApe3JldHVybiB0aGlzLl9kZWYoci52YXJLaW5kcy5sZXQsYyxtLFApfXZhcihjLG0sUCl7cmV0dXJuIHRoaXMuX2RlZihyLnZhcktpbmRzLnZhcixjLG0sUCl9YXNzaWduKGMsbSxQKXtyZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IGwoYyxtLFApKX1hZGQoYyxtKXtyZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IGYoYyxlLm9wZXJhdG9ycy5BREQsbSkpfWNvZGUoYyl7cmV0dXJuIHR5cGVvZiBjPT0iZnVuY3Rpb24iP2MoKTpjIT09dC5uaWwmJnRoaXMuX2xlYWZOb2RlKG5ldyBFKGMpKSx0aGlzfW9iamVjdCguLi5jKXtjb25zdCBtPVsieyJdO2Zvcihjb25zdFtQLFVdb2YgYyltLmxlbmd0aD4xJiZtLnB1c2goIiwiKSxtLnB1c2goUCksKFAhPT1VfHx0aGlzLm9wdHMuZXM1KSYmKG0ucHVzaCgiOiIpLCgwLHQuYWRkQ29kZUFyZykobSxVKSk7cmV0dXJuIG0ucHVzaCgifSIpLG5ldyB0Ll9Db2RlKG0pfWlmKGMsbSxQKXtpZih0aGlzLl9ibG9ja05vZGUobmV3IF8oYykpLG0mJlApdGhpcy5jb2RlKG0pLmVsc2UoKS5jb2RlKFApLmVuZElmKCk7ZWxzZSBpZihtKXRoaXMuY29kZShtKS5lbmRJZigpO2Vsc2UgaWYoUCl0aHJvdyBuZXcgRXJyb3IoJ0NvZGVHZW46ICJlbHNlIiBib2R5IHdpdGhvdXQgInRoZW4iIGJvZHknKTtyZXR1cm4gdGhpc31lbHNlSWYoYyl7cmV0dXJuIHRoaXMuX2Vsc2VOb2RlKG5ldyBfKGMpKX1lbHNlKCl7cmV0dXJuIHRoaXMuX2Vsc2VOb2RlKG5ldyB5KX1lbmRJZigpe3JldHVybiB0aGlzLl9lbmRCbG9ja05vZGUoXyx5KX1fZm9yKGMsbSl7cmV0dXJuIHRoaXMuX2Jsb2NrTm9kZShjKSxtJiZ0aGlzLmNvZGUobSkuZW5kRm9yKCksdGhpc31mb3IoYyxtKXtyZXR1cm4gdGhpcy5fZm9yKG5ldyBPKGMpLG0pfWZvclJhbmdlKGMsbSxQLFUsRj10aGlzLm9wdHMuZXM1P3IudmFyS2luZHMudmFyOnIudmFyS2luZHMubGV0KXtjb25zdCBaPXRoaXMuX3Njb3BlLnRvTmFtZShjKTtyZXR1cm4gdGhpcy5fZm9yKG5ldyBBKEYsWixtLFApLCgpPT5VKFopKX1mb3JPZihjLG0sUCxVPXIudmFyS2luZHMuY29uc3Qpe2NvbnN0IEY9dGhpcy5fc2NvcGUudG9OYW1lKGMpO2lmKHRoaXMub3B0cy5lczUpe2NvbnN0IFo9bSBpbnN0YW5jZW9mIHQuTmFtZT9tOnRoaXMudmFyKCJfYXJyIixtKTtyZXR1cm4gdGhpcy5mb3JSYW5nZSgiX2kiLDAsKDAsdC5fKWAke1p9Lmxlbmd0aGAscmU9Pnt0aGlzLnZhcihGLCgwLHQuXylgJHtafVske3JlfV1gKSxQKEYpfSl9cmV0dXJuIHRoaXMuX2ZvcihuZXcgSCgib2YiLFUsRixtKSwoKT0+UChGKSl9Zm9ySW4oYyxtLFAsVT10aGlzLm9wdHMuZXM1P3IudmFyS2luZHMudmFyOnIudmFyS2luZHMuY29uc3Qpe2lmKHRoaXMub3B0cy5vd25Qcm9wZXJ0aWVzKXJldHVybiB0aGlzLmZvck9mKGMsKDAsdC5fKWBPYmplY3Qua2V5cygke219KWAsUCk7Y29uc3QgRj10aGlzLl9zY29wZS50b05hbWUoYyk7cmV0dXJuIHRoaXMuX2ZvcihuZXcgSCgiaW4iLFUsRixtKSwoKT0+UChGKSl9ZW5kRm9yKCl7cmV0dXJuIHRoaXMuX2VuZEJsb2NrTm9kZShiKX1sYWJlbChjKXtyZXR1cm4gdGhpcy5fbGVhZk5vZGUobmV3IHAoYykpfWJyZWFrKGMpe3JldHVybiB0aGlzLl9sZWFmTm9kZShuZXcgaShjKSl9cmV0dXJuKGMpe2NvbnN0IG09bmV3IE47aWYodGhpcy5fYmxvY2tOb2RlKG0pLHRoaXMuY29kZShjKSxtLm5vZGVzLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAicmV0dXJuIiBzaG91bGQgaGF2ZSBvbmUgbm9kZScpO3JldHVybiB0aGlzLl9lbmRCbG9ja05vZGUoTil9dHJ5KGMsbSxQKXtpZighbSYmIVApdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAidHJ5IiB3aXRob3V0ICJjYXRjaCIgYW5kICJmaW5hbGx5IicpO2NvbnN0IFU9bmV3IEQ7aWYodGhpcy5fYmxvY2tOb2RlKFUpLHRoaXMuY29kZShjKSxtKXtjb25zdCBGPXRoaXMubmFtZSgiZSIpO3RoaXMuX2N1cnJOb2RlPVUuY2F0Y2g9bmV3IEIoRiksbShGKX1yZXR1cm4gUCYmKHRoaXMuX2N1cnJOb2RlPVUuZmluYWxseT1uZXcgRyx0aGlzLmNvZGUoUCkpLHRoaXMuX2VuZEJsb2NrTm9kZShCLEcpfXRocm93KGMpe3JldHVybiB0aGlzLl9sZWFmTm9kZShuZXcgaChjKSl9YmxvY2soYyxtKXtyZXR1cm4gdGhpcy5fYmxvY2tTdGFydHMucHVzaCh0aGlzLl9ub2Rlcy5sZW5ndGgpLGMmJnRoaXMuY29kZShjKS5lbmRCbG9jayhtKSx0aGlzfWVuZEJsb2NrKGMpe2NvbnN0IG09dGhpcy5fYmxvY2tTdGFydHMucG9wKCk7aWYobT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNvZGVHZW46IG5vdCBpbiBzZWxmLWJhbGFuY2luZyBibG9jayIpO2NvbnN0IFA9dGhpcy5fbm9kZXMubGVuZ3RoLW07aWYoUDwwfHxjIT09dm9pZCAwJiZQIT09Yyl0aHJvdyBuZXcgRXJyb3IoYENvZGVHZW46IHdyb25nIG51bWJlciBvZiBub2RlczogJHtQfSB2cyAke2N9IGV4cGVjdGVkYCk7cmV0dXJuIHRoaXMuX25vZGVzLmxlbmd0aD1tLHRoaXN9ZnVuYyhjLG09dC5uaWwsUCxVKXtyZXR1cm4gdGhpcy5fYmxvY2tOb2RlKG5ldyAkKGMsbSxQKSksVSYmdGhpcy5jb2RlKFUpLmVuZEZ1bmMoKSx0aGlzfWVuZEZ1bmMoKXtyZXR1cm4gdGhpcy5fZW5kQmxvY2tOb2RlKCQpfW9wdGltaXplKGM9MSl7Zm9yKDtjLS0gPjA7KXRoaXMuX3Jvb3Qub3B0aW1pemVOb2RlcygpLHRoaXMuX3Jvb3Qub3B0aW1pemVOYW1lcyh0aGlzLl9yb290Lm5hbWVzLHRoaXMuX2NvbnN0YW50cyl9X2xlYWZOb2RlKGMpe3JldHVybiB0aGlzLl9jdXJyTm9kZS5ub2Rlcy5wdXNoKGMpLHRoaXN9X2Jsb2NrTm9kZShjKXt0aGlzLl9jdXJyTm9kZS5ub2Rlcy5wdXNoKGMpLHRoaXMuX25vZGVzLnB1c2goYyl9X2VuZEJsb2NrTm9kZShjLG0pe2NvbnN0IFA9dGhpcy5fY3Vyck5vZGU7aWYoUCBpbnN0YW5jZW9mIGN8fG0mJlAgaW5zdGFuY2VvZiBtKXJldHVybiB0aGlzLl9ub2Rlcy5wb3AoKSx0aGlzO3Rocm93IG5ldyBFcnJvcihgQ29kZUdlbjogbm90IGluIGJsb2NrICIke20/YCR7Yy5raW5kfS8ke20ua2luZH1gOmMua2luZH0iYCl9X2Vsc2VOb2RlKGMpe2NvbnN0IG09dGhpcy5fY3Vyck5vZGU7aWYoIShtIGluc3RhbmNlb2YgXykpdGhyb3cgbmV3IEVycm9yKCdDb2RlR2VuOiAiZWxzZSIgd2l0aG91dCAiaWYiJyk7cmV0dXJuIHRoaXMuX2N1cnJOb2RlPW0uZWxzZT1jLHRoaXN9Z2V0IF9yb290KCl7cmV0dXJuIHRoaXMuX25vZGVzWzBdfWdldCBfY3Vyck5vZGUoKXtjb25zdCBjPXRoaXMuX25vZGVzO3JldHVybiBjW2MubGVuZ3RoLTFdfXNldCBfY3Vyck5vZGUoYyl7Y29uc3QgbT10aGlzLl9ub2RlczttW20ubGVuZ3RoLTFdPWN9fWUuQ29kZUdlbj1wZTtmdW5jdGlvbiBXKHcsYyl7Zm9yKGNvbnN0IG0gaW4gYyl3W21dPSh3W21dfHwwKSsoY1ttXXx8MCk7cmV0dXJuIHd9ZnVuY3Rpb24gb2UodyxjKXtyZXR1cm4gYyBpbnN0YW5jZW9mIHQuX0NvZGVPck5hbWU/Vyh3LGMubmFtZXMpOnd9ZnVuY3Rpb24gWCh3LGMsbSl7aWYodyBpbnN0YW5jZW9mIHQuTmFtZSlyZXR1cm4gUCh3KTtpZighVSh3KSlyZXR1cm4gdztyZXR1cm4gbmV3IHQuX0NvZGUody5faXRlbXMucmVkdWNlKChGLFopPT4oWiBpbnN0YW5jZW9mIHQuTmFtZSYmKFo9UChaKSksWiBpbnN0YW5jZW9mIHQuX0NvZGU/Ri5wdXNoKC4uLlouX2l0ZW1zKTpGLnB1c2goWiksRiksW10pKTtmdW5jdGlvbiBQKEYpe2NvbnN0IFo9bVtGLnN0cl07cmV0dXJuIFo9PT12b2lkIDB8fGNbRi5zdHJdIT09MT9GOihkZWxldGUgY1tGLnN0cl0sWil9ZnVuY3Rpb24gVShGKXtyZXR1cm4gRiBpbnN0YW5jZW9mIHQuX0NvZGUmJkYuX2l0ZW1zLnNvbWUoWj0+WiBpbnN0YW5jZW9mIHQuTmFtZSYmY1taLnN0cl09PT0xJiZtW1ouc3RyXSE9PXZvaWQgMCl9fWZ1bmN0aW9uIHZlKHcsYyl7Zm9yKGNvbnN0IG0gaW4gYyl3W21dPSh3W21dfHwwKS0oY1ttXXx8MCl9ZnVuY3Rpb24gRWUodyl7cmV0dXJuIHR5cGVvZiB3PT0iYm9vbGVhbiJ8fHR5cGVvZiB3PT0ibnVtYmVyInx8dz09PW51bGw/IXc6KDAsdC5fKWAhJHtDKHcpfWB9ZS5ub3Q9RWU7Y29uc3QgTmU9ZyhlLm9wZXJhdG9ycy5BTkQpO2Z1bmN0aW9uIEJlKC4uLncpe3JldHVybiB3LnJlZHVjZShOZSl9ZS5hbmQ9QmU7Y29uc3QgdXI9ZyhlLm9wZXJhdG9ycy5PUik7ZnVuY3Rpb24gayguLi53KXtyZXR1cm4gdy5yZWR1Y2UodXIpfWUub3I9aztmdW5jdGlvbiBnKHcpe3JldHVybihjLG0pPT5jPT09dC5uaWw/bTptPT09dC5uaWw/YzooMCx0Ll8pYCR7QyhjKX0gJHt3fSAke0MobSl9YH1mdW5jdGlvbiBDKHcpe3JldHVybiB3IGluc3RhbmNlb2YgdC5OYW1lP3c6KDAsdC5fKWAoJHt3fSlgfX0odWUpO3ZhciBiZT17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuY2hlY2tTdHJpY3RNb2RlPWUuZ2V0RXJyb3JQYXRoPWUuVHlwZT1lLnVzZUZ1bmM9ZS5zZXRFdmFsdWF0ZWQ9ZS5ldmFsdWF0ZWRQcm9wc1RvTmFtZT1lLm1lcmdlRXZhbHVhdGVkPWUuZWFjaEl0ZW09ZS51bmVzY2FwZUpzb25Qb2ludGVyPWUuZXNjYXBlSnNvblBvaW50ZXI9ZS5lc2NhcGVGcmFnbWVudD1lLnVuZXNjYXBlRnJhZ21lbnQ9ZS5zY2hlbWFSZWZPclZhbD1lLnNjaGVtYUhhc1J1bGVzQnV0UmVmPWUuc2NoZW1hSGFzUnVsZXM9ZS5jaGVja1Vua25vd25SdWxlcz1lLmFsd2F5c1ZhbGlkU2NoZW1hPWUudG9IYXNoPXZvaWQgMDtjb25zdCB0PXVlLHI9eXI7ZnVuY3Rpb24gbigkKXtjb25zdCBOPXt9O2Zvcihjb25zdCBEIG9mICQpTltEXT0hMDtyZXR1cm4gTn1lLnRvSGFzaD1uO2Z1bmN0aW9uIHMoJCxOKXtyZXR1cm4gdHlwZW9mIE49PSJib29sZWFuIj9OOk9iamVjdC5rZXlzKE4pLmxlbmd0aD09PTA/ITA6KGEoJCxOKSwhbyhOLCQuc2VsZi5SVUxFUy5hbGwpKX1lLmFsd2F5c1ZhbGlkU2NoZW1hPXM7ZnVuY3Rpb24gYSgkLE49JC5zY2hlbWEpe2NvbnN0e29wdHM6RCxzZWxmOkJ9PSQ7aWYoIUQuc3RyaWN0U2NoZW1hfHx0eXBlb2YgTj09ImJvb2xlYW4iKXJldHVybjtjb25zdCBHPUIuUlVMRVMua2V5d29yZHM7Zm9yKGNvbnN0IHBlIGluIE4pR1twZV18fEgoJCxgdW5rbm93biBrZXl3b3JkOiAiJHtwZX0iYCl9ZS5jaGVja1Vua25vd25SdWxlcz1hO2Z1bmN0aW9uIG8oJCxOKXtpZih0eXBlb2YgJD09ImJvb2xlYW4iKXJldHVybiEkO2Zvcihjb25zdCBEIGluICQpaWYoTltEXSlyZXR1cm4hMDtyZXR1cm4hMX1lLnNjaGVtYUhhc1J1bGVzPW87ZnVuY3Rpb24gbCgkLE4pe2lmKHR5cGVvZiAkPT0iYm9vbGVhbiIpcmV0dXJuISQ7Zm9yKGNvbnN0IEQgaW4gJClpZihEIT09IiRyZWYiJiZOLmFsbFtEXSlyZXR1cm4hMDtyZXR1cm4hMX1lLnNjaGVtYUhhc1J1bGVzQnV0UmVmPWw7ZnVuY3Rpb24gZih7dG9wU2NoZW1hUmVmOiQsc2NoZW1hUGF0aDpOfSxELEIsRyl7aWYoIUcpe2lmKHR5cGVvZiBEPT0ibnVtYmVyInx8dHlwZW9mIEQ9PSJib29sZWFuIilyZXR1cm4gRDtpZih0eXBlb2YgRD09InN0cmluZyIpcmV0dXJuKDAsdC5fKWAke0R9YH1yZXR1cm4oMCx0Ll8pYCR7JH0ke059JHsoMCx0LmdldFByb3BlcnR5KShCKX1gfWUuc2NoZW1hUmVmT3JWYWw9ZjtmdW5jdGlvbiBwKCQpe3JldHVybiBFKGRlY29kZVVSSUNvbXBvbmVudCgkKSl9ZS51bmVzY2FwZUZyYWdtZW50PXA7ZnVuY3Rpb24gaSgkKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGgoJCkpfWUuZXNjYXBlRnJhZ21lbnQ9aTtmdW5jdGlvbiBoKCQpe3JldHVybiB0eXBlb2YgJD09Im51bWJlciI/YCR7JH1gOiQucmVwbGFjZSgvfi9nLCJ+MCIpLnJlcGxhY2UoL1wvL2csIn4xIil9ZS5lc2NhcGVKc29uUG9pbnRlcj1oO2Z1bmN0aW9uIEUoJCl7cmV0dXJuICQucmVwbGFjZSgvfjEvZywiLyIpLnJlcGxhY2UoL34wL2csIn4iKX1lLnVuZXNjYXBlSnNvblBvaW50ZXI9RTtmdW5jdGlvbiBUKCQsTil7aWYoQXJyYXkuaXNBcnJheSgkKSlmb3IoY29uc3QgRCBvZiAkKU4oRCk7ZWxzZSBOKCQpfWUuZWFjaEl0ZW09VDtmdW5jdGlvbiBJKHttZXJnZU5hbWVzOiQsbWVyZ2VUb05hbWU6TixtZXJnZVZhbHVlczpELHJlc3VsdFRvTmFtZTpCfSl7cmV0dXJuKEcscGUsVyxvZSk9Pntjb25zdCBYPVc9PT12b2lkIDA/cGU6VyBpbnN0YW5jZW9mIHQuTmFtZT8ocGUgaW5zdGFuY2VvZiB0Lk5hbWU/JChHLHBlLFcpOk4oRyxwZSxXKSxXKTpwZSBpbnN0YW5jZW9mIHQuTmFtZT8oTihHLFcscGUpLHBlKTpEKHBlLFcpO3JldHVybiBvZT09PXQuTmFtZSYmIShYIGluc3RhbmNlb2YgdC5OYW1lKT9CKEcsWCk6WH19ZS5tZXJnZUV2YWx1YXRlZD17cHJvcHM6SSh7bWVyZ2VOYW1lczooJCxOLEQpPT4kLmlmKCgwLHQuXylgJHtEfSAhPT0gdHJ1ZSAmJiAke059ICE9PSB1bmRlZmluZWRgLCgpPT57JC5pZigoMCx0Ll8pYCR7Tn0gPT09IHRydWVgLCgpPT4kLmFzc2lnbihELCEwKSwoKT0+JC5hc3NpZ24oRCwoMCx0Ll8pYCR7RH0gfHwge31gKS5jb2RlKCgwLHQuXylgT2JqZWN0LmFzc2lnbigke0R9LCAke059KWApKX0pLG1lcmdlVG9OYW1lOigkLE4sRCk9PiQuaWYoKDAsdC5fKWAke0R9ICE9PSB0cnVlYCwoKT0+e049PT0hMD8kLmFzc2lnbihELCEwKTooJC5hc3NpZ24oRCwoMCx0Ll8pYCR7RH0gfHwge31gKSx5KCQsRCxOKSl9KSxtZXJnZVZhbHVlczooJCxOKT0+JD09PSEwPyEwOlEoUSh7fSwkKSxOKSxyZXN1bHRUb05hbWU6an0pLGl0ZW1zOkkoe21lcmdlTmFtZXM6KCQsTixEKT0+JC5pZigoMCx0Ll8pYCR7RH0gIT09IHRydWUgJiYgJHtOfSAhPT0gdW5kZWZpbmVkYCwoKT0+JC5hc3NpZ24oRCwoMCx0Ll8pYCR7Tn0gPT09IHRydWUgPyB0cnVlIDogJHtEfSA+ICR7Tn0gPyAke0R9IDogJHtOfWApKSxtZXJnZVRvTmFtZTooJCxOLEQpPT4kLmlmKCgwLHQuXylgJHtEfSAhPT0gdHJ1ZWAsKCk9PiQuYXNzaWduKEQsTj09PSEwPyEwOigwLHQuXylgJHtEfSA+ICR7Tn0gPyAke0R9IDogJHtOfWApKSxtZXJnZVZhbHVlczooJCxOKT0+JD09PSEwPyEwOk1hdGgubWF4KCQsTikscmVzdWx0VG9OYW1lOigkLE4pPT4kLnZhcigiaXRlbXMiLE4pfSl9O2Z1bmN0aW9uIGooJCxOKXtpZihOPT09ITApcmV0dXJuICQudmFyKCJwcm9wcyIsITApO2NvbnN0IEQ9JC52YXIoInByb3BzIiwoMCx0Ll8pYHt9YCk7cmV0dXJuIE4hPT12b2lkIDAmJnkoJCxELE4pLER9ZS5ldmFsdWF0ZWRQcm9wc1RvTmFtZT1qO2Z1bmN0aW9uIHkoJCxOLEQpe09iamVjdC5rZXlzKEQpLmZvckVhY2goQj0+JC5hc3NpZ24oKDAsdC5fKWAke059JHsoMCx0LmdldFByb3BlcnR5KShCKX1gLCEwKSl9ZS5zZXRFdmFsdWF0ZWQ9eTtjb25zdCBfPXt9O2Z1bmN0aW9uIGIoJCxOKXtyZXR1cm4gJC5zY29wZVZhbHVlKCJmdW5jIix7cmVmOk4sY29kZTpfW04uY29kZV18fChfW04uY29kZV09bmV3IHIuX0NvZGUoTi5jb2RlKSl9KX1lLnVzZUZ1bmM9Yjt2YXIgTzsoZnVuY3Rpb24oJCl7JFskLk51bT0wXT0iTnVtIiwkWyQuU3RyPTFdPSJTdHIifSkoTz1lLlR5cGV8fChlLlR5cGU9e30pKTtmdW5jdGlvbiBBKCQsTixEKXtpZigkIGluc3RhbmNlb2YgdC5OYW1lKXtjb25zdCBCPU49PT1PLk51bTtyZXR1cm4gRD9CPygwLHQuXylgIlsiICsgJHskfSArICJdImA6KDAsdC5fKWAiWyciICsgJHskfSArICInXSJgOkI/KDAsdC5fKWAiLyIgKyAkeyR9YDooMCx0Ll8pYCIvIiArICR7JH0ucmVwbGFjZSgvfi9nLCAifjAiKS5yZXBsYWNlKC9cXC8vZywgIn4xIilgfXJldHVybiBEPygwLHQuZ2V0UHJvcGVydHkpKCQpLnRvU3RyaW5nKCk6Ii8iK2goJCl9ZS5nZXRFcnJvclBhdGg9QTtmdW5jdGlvbiBIKCQsTixEPSQub3B0cy5zdHJpY3RTY2hlbWEpe2lmKCEhRCl7aWYoTj1gc3RyaWN0IG1vZGU6ICR7Tn1gLEQ9PT0hMCl0aHJvdyBuZXcgRXJyb3IoTik7JC5zZWxmLmxvZ2dlci53YXJuKE4pfX1lLmNoZWNrU3RyaWN0TW9kZT1IfSkoYmUpO3ZhciBMZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IEFlPXVlLHZjPXtkYXRhOm5ldyBBZS5OYW1lKCJkYXRhIiksdmFsQ3h0Om5ldyBBZS5OYW1lKCJ2YWxDeHQiKSxpbnN0YW5jZVBhdGg6bmV3IEFlLk5hbWUoImluc3RhbmNlUGF0aCIpLHBhcmVudERhdGE6bmV3IEFlLk5hbWUoInBhcmVudERhdGEiKSxwYXJlbnREYXRhUHJvcGVydHk6bmV3IEFlLk5hbWUoInBhcmVudERhdGFQcm9wZXJ0eSIpLHJvb3REYXRhOm5ldyBBZS5OYW1lKCJyb290RGF0YSIpLGR5bmFtaWNBbmNob3JzOm5ldyBBZS5OYW1lKCJkeW5hbWljQW5jaG9ycyIpLHZFcnJvcnM6bmV3IEFlLk5hbWUoInZFcnJvcnMiKSxlcnJvcnM6bmV3IEFlLk5hbWUoImVycm9ycyIpLHRoaXM6bmV3IEFlLk5hbWUoInRoaXMiKSxzZWxmOm5ldyBBZS5OYW1lKCJzZWxmIiksc2NvcGU6bmV3IEFlLk5hbWUoInNjb3BlIiksanNvbjpuZXcgQWUuTmFtZSgianNvbiIpLGpzb25Qb3M6bmV3IEFlLk5hbWUoImpzb25Qb3MiKSxqc29uTGVuOm5ldyBBZS5OYW1lKCJqc29uTGVuIiksanNvblBhcnQ6bmV3IEFlLk5hbWUoImpzb25QYXJ0Iil9O0xlLmRlZmF1bHQ9dmMsZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZXh0ZW5kRXJyb3JzPWUucmVzZXRFcnJvcnNDb3VudD1lLnJlcG9ydEV4dHJhRXJyb3I9ZS5yZXBvcnRFcnJvcj1lLmtleXdvcmQkRGF0YUVycm9yPWUua2V5d29yZEVycm9yPXZvaWQgMDtjb25zdCB0PXVlLHI9YmUsbj1MZTtlLmtleXdvcmRFcnJvcj17bWVzc2FnZTooe2tleXdvcmQ6eX0pPT4oMCx0LnN0cilgbXVzdCBwYXNzICIke3l9IiBrZXl3b3JkIHZhbGlkYXRpb25gfSxlLmtleXdvcmQkRGF0YUVycm9yPXttZXNzYWdlOih7a2V5d29yZDp5LHNjaGVtYVR5cGU6X30pPT5fPygwLHQuc3RyKWAiJHt5fSIga2V5d29yZCBtdXN0IGJlICR7X30gKCRkYXRhKWA6KDAsdC5zdHIpYCIke3l9IiBrZXl3b3JkIGlzIGludmFsaWQgKCRkYXRhKWB9O2Z1bmN0aW9uIHMoeSxfPWUua2V5d29yZEVycm9yLGIsTyl7Y29uc3R7aXQ6QX09eSx7Z2VuOkgsY29tcG9zaXRlUnVsZTokLGFsbEVycm9yczpOfT1BLEQ9aCh5LF8sYik7KE8hPW51bGw/TzokfHxOKT9mKEgsRCk6cChBLCgwLHQuXylgWyR7RH1dYCl9ZS5yZXBvcnRFcnJvcj1zO2Z1bmN0aW9uIGEoeSxfPWUua2V5d29yZEVycm9yLGIpe2NvbnN0e2l0Ok99PXkse2dlbjpBLGNvbXBvc2l0ZVJ1bGU6SCxhbGxFcnJvcnM6JH09TyxOPWgoeSxfLGIpO2YoQSxOKSxIfHwkfHxwKE8sbi5kZWZhdWx0LnZFcnJvcnMpfWUucmVwb3J0RXh0cmFFcnJvcj1hO2Z1bmN0aW9uIG8oeSxfKXt5LmFzc2lnbihuLmRlZmF1bHQuZXJyb3JzLF8pLHkuaWYoKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfSAhPT0gbnVsbGAsKCk9PnkuaWYoXywoKT0+eS5hc3NpZ24oKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfS5sZW5ndGhgLF8pLCgpPT55LmFzc2lnbihuLmRlZmF1bHQudkVycm9ycyxudWxsKSkpfWUucmVzZXRFcnJvcnNDb3VudD1vO2Z1bmN0aW9uIGwoe2dlbjp5LGtleXdvcmQ6XyxzY2hlbWFWYWx1ZTpiLGRhdGE6TyxlcnJzQ291bnQ6QSxpdDpIfSl7aWYoQT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoImFqdiBpbXBsZW1lbnRhdGlvbiBlcnJvciIpO2NvbnN0ICQ9eS5uYW1lKCJlcnIiKTt5LmZvclJhbmdlKCJpIixBLG4uZGVmYXVsdC5lcnJvcnMsTj0+e3kuY29uc3QoJCwoMCx0Ll8pYCR7bi5kZWZhdWx0LnZFcnJvcnN9WyR7Tn1dYCkseS5pZigoMCx0Ll8pYCR7JH0uaW5zdGFuY2VQYXRoID09PSB1bmRlZmluZWRgLCgpPT55LmFzc2lnbigoMCx0Ll8pYCR7JH0uaW5zdGFuY2VQYXRoYCwoMCx0LnN0ckNvbmNhdCkobi5kZWZhdWx0Lmluc3RhbmNlUGF0aCxILmVycm9yUGF0aCkpKSx5LmFzc2lnbigoMCx0Ll8pYCR7JH0uc2NoZW1hUGF0aGAsKDAsdC5zdHIpYCR7SC5lcnJTY2hlbWFQYXRofS8ke199YCksSC5vcHRzLnZlcmJvc2UmJih5LmFzc2lnbigoMCx0Ll8pYCR7JH0uc2NoZW1hYCxiKSx5LmFzc2lnbigoMCx0Ll8pYCR7JH0uZGF0YWAsTykpfSl9ZS5leHRlbmRFcnJvcnM9bDtmdW5jdGlvbiBmKHksXyl7Y29uc3QgYj15LmNvbnN0KCJlcnIiLF8pO3kuaWYoKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfSA9PT0gbnVsbGAsKCk9PnkuYXNzaWduKG4uZGVmYXVsdC52RXJyb3JzLCgwLHQuXylgWyR7Yn1dYCksKDAsdC5fKWAke24uZGVmYXVsdC52RXJyb3JzfS5wdXNoKCR7Yn0pYCkseS5jb2RlKCgwLHQuXylgJHtuLmRlZmF1bHQuZXJyb3JzfSsrYCl9ZnVuY3Rpb24gcCh5LF8pe2NvbnN0e2dlbjpiLHZhbGlkYXRlTmFtZTpPLHNjaGVtYUVudjpBfT15O0EuJGFzeW5jP2IudGhyb3coKDAsdC5fKWBuZXcgJHt5LlZhbGlkYXRpb25FcnJvcn0oJHtffSlgKTooYi5hc3NpZ24oKDAsdC5fKWAke099LmVycm9yc2AsXyksYi5yZXR1cm4oITEpKX1jb25zdCBpPXtrZXl3b3JkOm5ldyB0Lk5hbWUoImtleXdvcmQiKSxzY2hlbWFQYXRoOm5ldyB0Lk5hbWUoInNjaGVtYVBhdGgiKSxwYXJhbXM6bmV3IHQuTmFtZSgicGFyYW1zIikscHJvcGVydHlOYW1lOm5ldyB0Lk5hbWUoInByb3BlcnR5TmFtZSIpLG1lc3NhZ2U6bmV3IHQuTmFtZSgibWVzc2FnZSIpLHNjaGVtYTpuZXcgdC5OYW1lKCJzY2hlbWEiKSxwYXJlbnRTY2hlbWE6bmV3IHQuTmFtZSgicGFyZW50U2NoZW1hIil9O2Z1bmN0aW9uIGgoeSxfLGIpe2NvbnN0e2NyZWF0ZUVycm9yczpPfT15Lml0O3JldHVybiBPPT09ITE/KDAsdC5fKWB7fWA6RSh5LF8sYil9ZnVuY3Rpb24gRSh5LF8sYj17fSl7Y29uc3R7Z2VuOk8saXQ6QX09eSxIPVtUKEEsYiksSSh5LGIpXTtyZXR1cm4gaih5LF8sSCksTy5vYmplY3QoLi4uSCl9ZnVuY3Rpb24gVCh7ZXJyb3JQYXRoOnl9LHtpbnN0YW5jZVBhdGg6X30pe2NvbnN0IGI9Xz8oMCx0LnN0cilgJHt5fSR7KDAsci5nZXRFcnJvclBhdGgpKF8sci5UeXBlLlN0cil9YDp5O3JldHVybltuLmRlZmF1bHQuaW5zdGFuY2VQYXRoLCgwLHQuc3RyQ29uY2F0KShuLmRlZmF1bHQuaW5zdGFuY2VQYXRoLGIpXX1mdW5jdGlvbiBJKHtrZXl3b3JkOnksaXQ6e2VyclNjaGVtYVBhdGg6X319LHtzY2hlbWFQYXRoOmIscGFyZW50U2NoZW1hOk99KXtsZXQgQT1PP186KDAsdC5zdHIpYCR7X30vJHt5fWA7cmV0dXJuIGImJihBPSgwLHQuc3RyKWAke0F9JHsoMCxyLmdldEVycm9yUGF0aCkoYixyLlR5cGUuU3RyKX1gKSxbaS5zY2hlbWFQYXRoLEFdfWZ1bmN0aW9uIGooeSx7cGFyYW1zOl8sbWVzc2FnZTpifSxPKXtjb25zdHtrZXl3b3JkOkEsZGF0YTpILHNjaGVtYVZhbHVlOiQsaXQ6Tn09eSx7b3B0czpELHByb3BlcnR5TmFtZTpCLHRvcFNjaGVtYVJlZjpHLHNjaGVtYVBhdGg6cGV9PU47Ty5wdXNoKFtpLmtleXdvcmQsQV0sW2kucGFyYW1zLHR5cGVvZiBfPT0iZnVuY3Rpb24iP18oeSk6X3x8KDAsdC5fKWB7fWBdKSxELm1lc3NhZ2VzJiZPLnB1c2goW2kubWVzc2FnZSx0eXBlb2YgYj09ImZ1bmN0aW9uIj9iKHkpOmJdKSxELnZlcmJvc2UmJk8ucHVzaChbaS5zY2hlbWEsJF0sW2kucGFyZW50U2NoZW1hLCgwLHQuXylgJHtHfSR7cGV9YF0sW24uZGVmYXVsdC5kYXRhLEhdKSxCJiZPLnB1c2goW2kucHJvcGVydHlOYW1lLEJdKX19KEVyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRyLmJvb2xPckVtcHR5U2NoZW1hPXRyLnRvcEJvb2xPckVtcHR5U2NoZW1hPXZvaWQgMDtjb25zdCBfYz1FcixnYz11ZSxFYz1MZSx5Yz17bWVzc2FnZToiYm9vbGVhbiBzY2hlbWEgaXMgZmFsc2UifTtmdW5jdGlvbiAkYyhlKXtjb25zdHtnZW46dCxzY2hlbWE6cix2YWxpZGF0ZU5hbWU6bn09ZTtyPT09ITE/bmEoZSwhMSk6dHlwZW9mIHI9PSJvYmplY3QiJiZyLiRhc3luYz09PSEwP3QucmV0dXJuKEVjLmRlZmF1bHQuZGF0YSk6KHQuYXNzaWduKCgwLGdjLl8pYCR7bn0uZXJyb3JzYCxudWxsKSx0LnJldHVybighMCkpfXRyLnRvcEJvb2xPckVtcHR5U2NoZW1hPSRjO2Z1bmN0aW9uIHdjKGUsdCl7Y29uc3R7Z2VuOnIsc2NoZW1hOm59PWU7bj09PSExPyhyLnZhcih0LCExKSxuYShlKSk6ci52YXIodCwhMCl9dHIuYm9vbE9yRW1wdHlTY2hlbWE9d2M7ZnVuY3Rpb24gbmEoZSx0KXtjb25zdHtnZW46cixkYXRhOm59PWUscz17Z2VuOnIsa2V5d29yZDoiZmFsc2Ugc2NoZW1hIixkYXRhOm4sc2NoZW1hOiExLHNjaGVtYUNvZGU6ITEsc2NoZW1hVmFsdWU6ITEscGFyYW1zOnt9LGl0OmV9OygwLF9jLnJlcG9ydEVycm9yKShzLHljLHZvaWQgMCx0KX12YXIgbm49e30sRHQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KER0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxEdC5nZXRSdWxlcz1EdC5pc0pTT05UeXBlPXZvaWQgMDtjb25zdCBTYz1bInN0cmluZyIsIm51bWJlciIsImludGVnZXIiLCJib29sZWFuIiwibnVsbCIsIm9iamVjdCIsImFycmF5Il0sUmM9bmV3IFNldChTYyk7ZnVuY3Rpb24gYmMoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmUmMuaGFzKGUpfUR0LmlzSlNPTlR5cGU9YmM7ZnVuY3Rpb24gT2MoKXtjb25zdCBlPXtudW1iZXI6e3R5cGU6Im51bWJlciIscnVsZXM6W119LHN0cmluZzp7dHlwZToic3RyaW5nIixydWxlczpbXX0sYXJyYXk6e3R5cGU6ImFycmF5IixydWxlczpbXX0sb2JqZWN0Ont0eXBlOiJvYmplY3QiLHJ1bGVzOltdfX07cmV0dXJue3R5cGVzOmxlKFEoe30sZSkse2ludGVnZXI6ITAsYm9vbGVhbjohMCxudWxsOiEwfSkscnVsZXM6W3tydWxlczpbXX0sZS5udW1iZXIsZS5zdHJpbmcsZS5hcnJheSxlLm9iamVjdF0scG9zdDp7cnVsZXM6W119LGFsbDp7fSxrZXl3b3Jkczp7fX19RHQuZ2V0UnVsZXM9T2M7dmFyIGx0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShsdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbHQuc2hvdWxkVXNlUnVsZT1sdC5zaG91bGRVc2VHcm91cD1sdC5zY2hlbWFIYXNSdWxlc0ZvclR5cGU9dm9pZCAwO2Z1bmN0aW9uIE5jKHtzY2hlbWE6ZSxzZWxmOnR9LHIpe2NvbnN0IG49dC5SVUxFUy50eXBlc1tyXTtyZXR1cm4gbiYmbiE9PSEwJiZzYShlLG4pfWx0LnNjaGVtYUhhc1J1bGVzRm9yVHlwZT1OYztmdW5jdGlvbiBzYShlLHQpe3JldHVybiB0LnJ1bGVzLnNvbWUocj0+YWEoZSxyKSl9bHQuc2hvdWxkVXNlR3JvdXA9c2E7ZnVuY3Rpb24gYWEoZSx0KXt2YXIgcjtyZXR1cm4gZVt0LmtleXdvcmRdIT09dm9pZCAwfHwoKHI9dC5kZWZpbml0aW9uLmltcGxlbWVudHMpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zb21lKG49PmVbbl0hPT12b2lkIDApKX1sdC5zaG91bGRVc2VSdWxlPWFhLGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLnJlcG9ydFR5cGVFcnJvcj1lLmNoZWNrRGF0YVR5cGVzPWUuY2hlY2tEYXRhVHlwZT1lLmNvZXJjZUFuZENoZWNrRGF0YVR5cGU9ZS5nZXRKU09OVHlwZXM9ZS5nZXRTY2hlbWFUeXBlcz1lLkRhdGFUeXBlPXZvaWQgMDtjb25zdCB0PUR0LHI9bHQsbj1FcixzPXVlLGE9YmU7dmFyIG87KGZ1bmN0aW9uKE8pe09bTy5Db3JyZWN0PTBdPSJDb3JyZWN0IixPW08uV3Jvbmc9MV09Ildyb25nIn0pKG89ZS5EYXRhVHlwZXx8KGUuRGF0YVR5cGU9e30pKTtmdW5jdGlvbiBsKE8pe2NvbnN0IEE9ZihPLnR5cGUpO2lmKEEuaW5jbHVkZXMoIm51bGwiKSl7aWYoTy5udWxsYWJsZT09PSExKXRocm93IG5ldyBFcnJvcigidHlwZTogbnVsbCBjb250cmFkaWN0cyBudWxsYWJsZTogZmFsc2UiKX1lbHNle2lmKCFBLmxlbmd0aCYmTy5udWxsYWJsZSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoJyJudWxsYWJsZSIgY2Fubm90IGJlIHVzZWQgd2l0aG91dCAidHlwZSInKTtPLm51bGxhYmxlPT09ITAmJkEucHVzaCgibnVsbCIpfXJldHVybiBBfWUuZ2V0U2NoZW1hVHlwZXM9bDtmdW5jdGlvbiBmKE8pe2NvbnN0IEE9QXJyYXkuaXNBcnJheShPKT9POk8/W09dOltdO2lmKEEuZXZlcnkodC5pc0pTT05UeXBlKSlyZXR1cm4gQTt0aHJvdyBuZXcgRXJyb3IoInR5cGUgbXVzdCBiZSBKU09OVHlwZSBvciBKU09OVHlwZVtdOiAiK0Euam9pbigiLCIpKX1lLmdldEpTT05UeXBlcz1mO2Z1bmN0aW9uIHAoTyxBKXtjb25zdHtnZW46SCxkYXRhOiQsb3B0czpOfT1PLEQ9aChBLE4uY29lcmNlVHlwZXMpLEI9QS5sZW5ndGg+MCYmIShELmxlbmd0aD09PTAmJkEubGVuZ3RoPT09MSYmKDAsci5zY2hlbWFIYXNSdWxlc0ZvclR5cGUpKE8sQVswXSkpO2lmKEIpe2NvbnN0IEc9aihBLCQsTi5zdHJpY3ROdW1iZXJzLG8uV3JvbmcpO0guaWYoRywoKT0+e0QubGVuZ3RoP0UoTyxBLEQpOl8oTyl9KX1yZXR1cm4gQn1lLmNvZXJjZUFuZENoZWNrRGF0YVR5cGU9cDtjb25zdCBpPW5ldyBTZXQoWyJzdHJpbmciLCJudW1iZXIiLCJpbnRlZ2VyIiwiYm9vbGVhbiIsIm51bGwiXSk7ZnVuY3Rpb24gaChPLEEpe3JldHVybiBBP08uZmlsdGVyKEg9PmkuaGFzKEgpfHxBPT09ImFycmF5IiYmSD09PSJhcnJheSIpOltdfWZ1bmN0aW9uIEUoTyxBLEgpe2NvbnN0e2dlbjokLGRhdGE6TixvcHRzOkR9PU8sQj0kLmxldCgiZGF0YVR5cGUiLCgwLHMuXylgdHlwZW9mICR7Tn1gKSxHPSQubGV0KCJjb2VyY2VkIiwoMCxzLl8pYHVuZGVmaW5lZGApO0QuY29lcmNlVHlwZXM9PT0iYXJyYXkiJiYkLmlmKCgwLHMuXylgJHtCfSA9PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KCR7Tn0pICYmICR7Tn0ubGVuZ3RoID09IDFgLCgpPT4kLmFzc2lnbihOLCgwLHMuXylgJHtOfVswXWApLmFzc2lnbihCLCgwLHMuXylgdHlwZW9mICR7Tn1gKS5pZihqKEEsTixELnN0cmljdE51bWJlcnMpLCgpPT4kLmFzc2lnbihHLE4pKSksJC5pZigoMCxzLl8pYCR7R30gIT09IHVuZGVmaW5lZGApO2Zvcihjb25zdCBXIG9mIEgpKGkuaGFzKFcpfHxXPT09ImFycmF5IiYmRC5jb2VyY2VUeXBlcz09PSJhcnJheSIpJiZwZShXKTskLmVsc2UoKSxfKE8pLCQuZW5kSWYoKSwkLmlmKCgwLHMuXylgJHtHfSAhPT0gdW5kZWZpbmVkYCwoKT0+eyQuYXNzaWduKE4sRyksVChPLEcpfSk7ZnVuY3Rpb24gcGUoVyl7c3dpdGNoKFcpe2Nhc2Uic3RyaW5nIjokLmVsc2VJZigoMCxzLl8pYCR7Qn0gPT0gIm51bWJlciIgfHwgJHtCfSA9PSAiYm9vbGVhbiJgKS5hc3NpZ24oRywoMCxzLl8pYCIiICsgJHtOfWApLmVsc2VJZigoMCxzLl8pYCR7Tn0gPT09IG51bGxgKS5hc3NpZ24oRywoMCxzLl8pYCIiYCk7cmV0dXJuO2Nhc2UibnVtYmVyIjokLmVsc2VJZigoMCxzLl8pYCR7Qn0gPT0gImJvb2xlYW4iIHx8ICR7Tn0gPT09IG51bGwKICAgICAgICAgICAgICB8fCAoJHtCfSA9PSAic3RyaW5nIiAmJiAke059ICYmICR7Tn0gPT0gKyR7Tn0pYCkuYXNzaWduKEcsKDAscy5fKWArJHtOfWApO3JldHVybjtjYXNlImludGVnZXIiOiQuZWxzZUlmKCgwLHMuXylgJHtCfSA9PT0gImJvb2xlYW4iIHx8ICR7Tn0gPT09IG51bGwKICAgICAgICAgICAgICB8fCAoJHtCfSA9PT0gInN0cmluZyIgJiYgJHtOfSAmJiAke059ID09ICske059ICYmICEoJHtOfSAlIDEpKWApLmFzc2lnbihHLCgwLHMuXylgKyR7Tn1gKTtyZXR1cm47Y2FzZSJib29sZWFuIjokLmVsc2VJZigoMCxzLl8pYCR7Tn0gPT09ICJmYWxzZSIgfHwgJHtOfSA9PT0gMCB8fCAke059ID09PSBudWxsYCkuYXNzaWduKEcsITEpLmVsc2VJZigoMCxzLl8pYCR7Tn0gPT09ICJ0cnVlIiB8fCAke059ID09PSAxYCkuYXNzaWduKEcsITApO3JldHVybjtjYXNlIm51bGwiOiQuZWxzZUlmKCgwLHMuXylgJHtOfSA9PT0gIiIgfHwgJHtOfSA9PT0gMCB8fCAke059ID09PSBmYWxzZWApLCQuYXNzaWduKEcsbnVsbCk7cmV0dXJuO2Nhc2UiYXJyYXkiOiQuZWxzZUlmKCgwLHMuXylgJHtCfSA9PT0gInN0cmluZyIgfHwgJHtCfSA9PT0gIm51bWJlciIKICAgICAgICAgICAgICB8fCAke0J9ID09PSAiYm9vbGVhbiIgfHwgJHtOfSA9PT0gbnVsbGApLmFzc2lnbihHLCgwLHMuXylgWyR7Tn1dYCl9fX1mdW5jdGlvbiBUKHtnZW46TyxwYXJlbnREYXRhOkEscGFyZW50RGF0YVByb3BlcnR5Okh9LCQpe08uaWYoKDAscy5fKWAke0F9ICE9PSB1bmRlZmluZWRgLCgpPT5PLmFzc2lnbigoMCxzLl8pYCR7QX1bJHtIfV1gLCQpKX1mdW5jdGlvbiBJKE8sQSxILCQ9by5Db3JyZWN0KXtjb25zdCBOPSQ9PT1vLkNvcnJlY3Q/cy5vcGVyYXRvcnMuRVE6cy5vcGVyYXRvcnMuTkVRO2xldCBEO3N3aXRjaChPKXtjYXNlIm51bGwiOnJldHVybigwLHMuXylgJHtBfSAke059IG51bGxgO2Nhc2UiYXJyYXkiOkQ9KDAscy5fKWBBcnJheS5pc0FycmF5KCR7QX0pYDticmVhaztjYXNlIm9iamVjdCI6RD0oMCxzLl8pYCR7QX0gJiYgdHlwZW9mICR7QX0gPT0gIm9iamVjdCIgJiYgIUFycmF5LmlzQXJyYXkoJHtBfSlgO2JyZWFrO2Nhc2UiaW50ZWdlciI6RD1CKCgwLHMuXylgISgke0F9ICUgMSkgJiYgIWlzTmFOKCR7QX0pYCk7YnJlYWs7Y2FzZSJudW1iZXIiOkQ9QigpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuKDAscy5fKWB0eXBlb2YgJHtBfSAke059ICR7T31gfXJldHVybiAkPT09by5Db3JyZWN0P0Q6KDAscy5ub3QpKEQpO2Z1bmN0aW9uIEIoRz1zLm5pbCl7cmV0dXJuKDAscy5hbmQpKCgwLHMuXylgdHlwZW9mICR7QX0gPT0gIm51bWJlciJgLEcsSD8oMCxzLl8pYGlzRmluaXRlKCR7QX0pYDpzLm5pbCl9fWUuY2hlY2tEYXRhVHlwZT1JO2Z1bmN0aW9uIGooTyxBLEgsJCl7aWYoTy5sZW5ndGg9PT0xKXJldHVybiBJKE9bMF0sQSxILCQpO2xldCBOO2NvbnN0IEQ9KDAsYS50b0hhc2gpKE8pO2lmKEQuYXJyYXkmJkQub2JqZWN0KXtjb25zdCBCPSgwLHMuXylgdHlwZW9mICR7QX0gIT0gIm9iamVjdCJgO049RC5udWxsP0I6KDAscy5fKWAhJHtBfSB8fCAke0J9YCxkZWxldGUgRC5udWxsLGRlbGV0ZSBELmFycmF5LGRlbGV0ZSBELm9iamVjdH1lbHNlIE49cy5uaWw7RC5udW1iZXImJmRlbGV0ZSBELmludGVnZXI7Zm9yKGNvbnN0IEIgaW4gRClOPSgwLHMuYW5kKShOLEkoQixBLEgsJCkpO3JldHVybiBOfWUuY2hlY2tEYXRhVHlwZXM9ajtjb25zdCB5PXttZXNzYWdlOih7c2NoZW1hOk99KT0+YG11c3QgYmUgJHtPfWAscGFyYW1zOih7c2NoZW1hOk8sc2NoZW1hVmFsdWU6QX0pPT50eXBlb2YgTz09InN0cmluZyI/KDAscy5fKWB7dHlwZTogJHtPfX1gOigwLHMuXylge3R5cGU6ICR7QX19YH07ZnVuY3Rpb24gXyhPKXtjb25zdCBBPWIoTyk7KDAsbi5yZXBvcnRFcnJvcikoQSx5KX1lLnJlcG9ydFR5cGVFcnJvcj1fO2Z1bmN0aW9uIGIoTyl7Y29uc3R7Z2VuOkEsZGF0YTpILHNjaGVtYTokfT1PLE49KDAsYS5zY2hlbWFSZWZPclZhbCkoTywkLCJ0eXBlIik7cmV0dXJue2dlbjpBLGtleXdvcmQ6InR5cGUiLGRhdGE6SCxzY2hlbWE6JC50eXBlLHNjaGVtYUNvZGU6TixzY2hlbWFWYWx1ZTpOLHBhcmVudFNjaGVtYTokLHBhcmFtczp7fSxpdDpPfX19KG5uKTt2YXIgc249e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxzbi5hc3NpZ25EZWZhdWx0cz12b2lkIDA7Y29uc3QgcnI9dWUsUGM9YmU7ZnVuY3Rpb24gVGMoZSx0KXtjb25zdHtwcm9wZXJ0aWVzOnIsaXRlbXM6bn09ZS5zY2hlbWE7aWYodD09PSJvYmplY3QiJiZyKWZvcihjb25zdCBzIGluIHIpb2EoZSxzLHJbc10uZGVmYXVsdCk7ZWxzZSB0PT09ImFycmF5IiYmQXJyYXkuaXNBcnJheShuKSYmbi5mb3JFYWNoKChzLGEpPT5vYShlLGEscy5kZWZhdWx0KSl9c24uYXNzaWduRGVmYXVsdHM9VGM7ZnVuY3Rpb24gb2EoZSx0LHIpe2NvbnN0e2dlbjpuLGNvbXBvc2l0ZVJ1bGU6cyxkYXRhOmEsb3B0czpvfT1lO2lmKHI9PT12b2lkIDApcmV0dXJuO2NvbnN0IGw9KDAscnIuXylgJHthfSR7KDAscnIuZ2V0UHJvcGVydHkpKHQpfWA7aWYocyl7KDAsUGMuY2hlY2tTdHJpY3RNb2RlKShlLGBkZWZhdWx0IGlzIGlnbm9yZWQgZm9yOiAke2x9YCk7cmV0dXJufWxldCBmPSgwLHJyLl8pYCR7bH0gPT09IHVuZGVmaW5lZGA7by51c2VEZWZhdWx0cz09PSJlbXB0eSImJihmPSgwLHJyLl8pYCR7Zn0gfHwgJHtsfSA9PT0gbnVsbCB8fCAke2x9ID09PSAiImApLG4uaWYoZiwoMCxyci5fKWAke2x9ID0gJHsoMCxyci5zdHJpbmdpZnkpKHIpfWApfXZhciBYZT17fSxuZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkobmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG5lLnZhbGlkYXRlVW5pb249bmUudmFsaWRhdGVBcnJheT1uZS51c2VQYXR0ZXJuPW5lLmNhbGxWYWxpZGF0ZUNvZGU9bmUuc2NoZW1hUHJvcGVydGllcz1uZS5hbGxTY2hlbWFQcm9wZXJ0aWVzPW5lLm5vUHJvcGVydHlJbkRhdGE9bmUucHJvcGVydHlJbkRhdGE9bmUuaXNPd25Qcm9wZXJ0eT1uZS5oYXNQcm9wRnVuYz1uZS5yZXBvcnRNaXNzaW5nUHJvcD1uZS5jaGVja01pc3NpbmdQcm9wPW5lLmNoZWNrUmVwb3J0TWlzc2luZ1Byb3A9dm9pZCAwO2NvbnN0IGRlPXVlLEtuPWJlLEV0PUxlLEFjPWJlO2Z1bmN0aW9uIENjKGUsdCl7Y29uc3R7Z2VuOnIsZGF0YTpuLGl0OnN9PWU7ci5pZihKbihyLG4sdCxzLm9wdHMub3duUHJvcGVydGllcyksKCk9PntlLnNldFBhcmFtcyh7bWlzc2luZ1Byb3BlcnR5OigwLGRlLl8pYCR7dH1gfSwhMCksZS5lcnJvcigpfSl9bmUuY2hlY2tSZXBvcnRNaXNzaW5nUHJvcD1DYztmdW5jdGlvbiBJYyh7Z2VuOmUsZGF0YTp0LGl0OntvcHRzOnJ9fSxuLHMpe3JldHVybigwLGRlLm9yKSguLi5uLm1hcChhPT4oMCxkZS5hbmQpKEpuKGUsdCxhLHIub3duUHJvcGVydGllcyksKDAsZGUuXylgJHtzfSA9ICR7YX1gKSkpfW5lLmNoZWNrTWlzc2luZ1Byb3A9SWM7ZnVuY3Rpb24gRGMoZSx0KXtlLnNldFBhcmFtcyh7bWlzc2luZ1Byb3BlcnR5OnR9LCEwKSxlLmVycm9yKCl9bmUucmVwb3J0TWlzc2luZ1Byb3A9RGM7ZnVuY3Rpb24gaWEoZSl7cmV0dXJuIGUuc2NvcGVWYWx1ZSgiZnVuYyIse3JlZjpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGNvZGU6KDAsZGUuXylgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eWB9KX1uZS5oYXNQcm9wRnVuYz1pYTtmdW5jdGlvbiBCbihlLHQscil7cmV0dXJuKDAsZGUuXylgJHtpYShlKX0uY2FsbCgke3R9LCAke3J9KWB9bmUuaXNPd25Qcm9wZXJ0eT1CbjtmdW5jdGlvbiBqYyhlLHQscixuKXtjb25zdCBzPSgwLGRlLl8pYCR7dH0keygwLGRlLmdldFByb3BlcnR5KShyKX0gIT09IHVuZGVmaW5lZGA7cmV0dXJuIG4/KDAsZGUuXylgJHtzfSAmJiAke0JuKGUsdCxyKX1gOnN9bmUucHJvcGVydHlJbkRhdGE9amM7ZnVuY3Rpb24gSm4oZSx0LHIsbil7Y29uc3Qgcz0oMCxkZS5fKWAke3R9JHsoMCxkZS5nZXRQcm9wZXJ0eSkocil9ID09PSB1bmRlZmluZWRgO3JldHVybiBuPygwLGRlLm9yKShzLCgwLGRlLm5vdCkoQm4oZSx0LHIpKSk6c31uZS5ub1Byb3BlcnR5SW5EYXRhPUpuO2Z1bmN0aW9uIGNhKGUpe3JldHVybiBlP09iamVjdC5rZXlzKGUpLmZpbHRlcih0PT50IT09Il9fcHJvdG9fXyIpOltdfW5lLmFsbFNjaGVtYVByb3BlcnRpZXM9Y2E7ZnVuY3Rpb24ga2MoZSx0KXtyZXR1cm4gY2EodCkuZmlsdGVyKHI9PiEoMCxLbi5hbHdheXNWYWxpZFNjaGVtYSkoZSx0W3JdKSl9bmUuc2NoZW1hUHJvcGVydGllcz1rYztmdW5jdGlvbiBVYyh7c2NoZW1hQ29kZTplLGRhdGE6dCxpdDp7Z2VuOnIsdG9wU2NoZW1hUmVmOm4sc2NoZW1hUGF0aDpzLGVycm9yUGF0aDphfSxpdDpvfSxsLGYscCl7Y29uc3QgaT1wPygwLGRlLl8pYCR7ZX0sICR7dH0sICR7bn0ke3N9YDp0LGg9W1tFdC5kZWZhdWx0Lmluc3RhbmNlUGF0aCwoMCxkZS5zdHJDb25jYXQpKEV0LmRlZmF1bHQuaW5zdGFuY2VQYXRoLGEpXSxbRXQuZGVmYXVsdC5wYXJlbnREYXRhLG8ucGFyZW50RGF0YV0sW0V0LmRlZmF1bHQucGFyZW50RGF0YVByb3BlcnR5LG8ucGFyZW50RGF0YVByb3BlcnR5XSxbRXQuZGVmYXVsdC5yb290RGF0YSxFdC5kZWZhdWx0LnJvb3REYXRhXV07by5vcHRzLmR5bmFtaWNSZWYmJmgucHVzaChbRXQuZGVmYXVsdC5keW5hbWljQW5jaG9ycyxFdC5kZWZhdWx0LmR5bmFtaWNBbmNob3JzXSk7Y29uc3QgRT0oMCxkZS5fKWAke2l9LCAke3Iub2JqZWN0KC4uLmgpfWA7cmV0dXJuIGYhPT1kZS5uaWw/KDAsZGUuXylgJHtsfS5jYWxsKCR7Zn0sICR7RX0pYDooMCxkZS5fKWAke2x9KCR7RX0pYH1uZS5jYWxsVmFsaWRhdGVDb2RlPVVjO2NvbnN0IEZjPSgwLGRlLl8pYG5ldyBSZWdFeHBgO2Z1bmN0aW9uIE1jKHtnZW46ZSxpdDp7b3B0czp0fX0scil7Y29uc3Qgbj10LnVuaWNvZGVSZWdFeHA/InUiOiIiLHtyZWdFeHA6c309dC5jb2RlLGE9cyhyLG4pO3JldHVybiBlLnNjb3BlVmFsdWUoInBhdHRlcm4iLHtrZXk6YS50b1N0cmluZygpLHJlZjphLGNvZGU6KDAsZGUuXylgJHtzLmNvZGU9PT0ibmV3IFJlZ0V4cCI/RmM6KDAsQWMudXNlRnVuYykoZSxzKX0oJHtyfSwgJHtufSlgfSl9bmUudXNlUGF0dGVybj1NYztmdW5jdGlvbiBMYyhlKXtjb25zdHtnZW46dCxkYXRhOnIsa2V5d29yZDpuLGl0OnN9PWUsYT10Lm5hbWUoInZhbGlkIik7aWYocy5hbGxFcnJvcnMpe2NvbnN0IGw9dC5sZXQoInZhbGlkIiwhMCk7cmV0dXJuIG8oKCk9PnQuYXNzaWduKGwsITEpKSxsfXJldHVybiB0LnZhcihhLCEwKSxvKCgpPT50LmJyZWFrKCkpLGE7ZnVuY3Rpb24gbyhsKXtjb25zdCBmPXQuY29uc3QoImxlbiIsKDAsZGUuXylgJHtyfS5sZW5ndGhgKTt0LmZvclJhbmdlKCJpIiwwLGYscD0+e2Uuc3Vic2NoZW1hKHtrZXl3b3JkOm4sZGF0YVByb3A6cCxkYXRhUHJvcFR5cGU6S24uVHlwZS5OdW19LGEpLHQuaWYoKDAsZGUubm90KShhKSxsKX0pfX1uZS52YWxpZGF0ZUFycmF5PUxjO2Z1bmN0aW9uIFZjKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGtleXdvcmQ6bixpdDpzfT1lO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7aWYoci5zb21lKGY9PigwLEtuLmFsd2F5c1ZhbGlkU2NoZW1hKShzLGYpKSYmIXMub3B0cy51bmV2YWx1YXRlZClyZXR1cm47Y29uc3Qgbz10LmxldCgidmFsaWQiLCExKSxsPXQubmFtZSgiX3ZhbGlkIik7dC5ibG9jaygoKT0+ci5mb3JFYWNoKChmLHApPT57Y29uc3QgaT1lLnN1YnNjaGVtYSh7a2V5d29yZDpuLHNjaGVtYVByb3A6cCxjb21wb3NpdGVSdWxlOiEwfSxsKTt0LmFzc2lnbihvLCgwLGRlLl8pYCR7b30gfHwgJHtsfWApLGUubWVyZ2VWYWxpZEV2YWx1YXRlZChpLGwpfHx0LmlmKCgwLGRlLm5vdCkobykpfSkpLGUucmVzdWx0KG8sKCk9PmUucmVzZXQoKSwoKT0+ZS5lcnJvcighMCkpfW5lLnZhbGlkYXRlVW5pb249VmMsT2JqZWN0LmRlZmluZVByb3BlcnR5KFhlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxYZS52YWxpZGF0ZUtleXdvcmRVc2FnZT1YZS52YWxpZFNjaGVtYVR5cGU9WGUuZnVuY0tleXdvcmRDb2RlPVhlLm1hY3JvS2V5d29yZENvZGU9dm9pZCAwO2NvbnN0IEllPXVlLGp0PUxlLHpjPW5lLEhjPUVyO2Z1bmN0aW9uIEtjKGUsdCl7Y29uc3R7Z2VuOnIsa2V5d29yZDpuLHNjaGVtYTpzLHBhcmVudFNjaGVtYTphLGl0Om99PWUsbD10Lm1hY3JvLmNhbGwoby5zZWxmLHMsYSxvKSxmPWxhKHIsbixsKTtvLm9wdHMudmFsaWRhdGVTY2hlbWEhPT0hMSYmby5zZWxmLnZhbGlkYXRlU2NoZW1hKGwsITApO2NvbnN0IHA9ci5uYW1lKCJ2YWxpZCIpO2Uuc3Vic2NoZW1hKHtzY2hlbWE6bCxzY2hlbWFQYXRoOkllLm5pbCxlcnJTY2hlbWFQYXRoOmAke28uZXJyU2NoZW1hUGF0aH0vJHtufWAsdG9wU2NoZW1hUmVmOmYsY29tcG9zaXRlUnVsZTohMH0scCksZS5wYXNzKHAsKCk9PmUuZXJyb3IoITApKX1YZS5tYWNyb0tleXdvcmRDb2RlPUtjO2Z1bmN0aW9uIEJjKGUsdCl7dmFyIHI7Y29uc3R7Z2VuOm4sa2V5d29yZDpzLHNjaGVtYTphLHBhcmVudFNjaGVtYTpvLCRkYXRhOmwsaXQ6Zn09ZTtxYyhmLHQpO2NvbnN0IHA9IWwmJnQuY29tcGlsZT90LmNvbXBpbGUuY2FsbChmLnNlbGYsYSxvLGYpOnQudmFsaWRhdGUsaT1sYShuLHMscCksaD1uLmxldCgidmFsaWQiKTtlLmJsb2NrJGRhdGEoaCxFKSxlLm9rKChyPXQudmFsaWQpIT09bnVsbCYmciE9PXZvaWQgMD9yOmgpO2Z1bmN0aW9uIEUoKXtpZih0LmVycm9ycz09PSExKWooKSx0Lm1vZGlmeWluZyYmdWEoZSkseSgoKT0+ZS5lcnJvcigpKTtlbHNle2NvbnN0IF89dC5hc3luYz9UKCk6SSgpO3QubW9kaWZ5aW5nJiZ1YShlKSx5KCgpPT5KYyhlLF8pKX19ZnVuY3Rpb24gVCgpe2NvbnN0IF89bi5sZXQoInJ1bGVFcnJzIixudWxsKTtyZXR1cm4gbi50cnkoKCk9PmooKDAsSWUuXylgYXdhaXQgYCksYj0+bi5hc3NpZ24oaCwhMSkuaWYoKDAsSWUuXylgJHtifSBpbnN0YW5jZW9mICR7Zi5WYWxpZGF0aW9uRXJyb3J9YCwoKT0+bi5hc3NpZ24oXywoMCxJZS5fKWAke2J9LmVycm9yc2ApLCgpPT5uLnRocm93KGIpKSksX31mdW5jdGlvbiBJKCl7Y29uc3QgXz0oMCxJZS5fKWAke2l9LmVycm9yc2A7cmV0dXJuIG4uYXNzaWduKF8sbnVsbCksaihJZS5uaWwpLF99ZnVuY3Rpb24gaihfPXQuYXN5bmM/KDAsSWUuXylgYXdhaXQgYDpJZS5uaWwpe2NvbnN0IGI9Zi5vcHRzLnBhc3NDb250ZXh0P2p0LmRlZmF1bHQudGhpczpqdC5kZWZhdWx0LnNlbGYsTz0hKCJjb21waWxlImluIHQmJiFsfHx0LnNjaGVtYT09PSExKTtuLmFzc2lnbihoLCgwLEllLl8pYCR7X30keygwLHpjLmNhbGxWYWxpZGF0ZUNvZGUpKGUsaSxiLE8pfWAsdC5tb2RpZnlpbmcpfWZ1bmN0aW9uIHkoXyl7dmFyIGI7bi5pZigoMCxJZS5ub3QpKChiPXQudmFsaWQpIT09bnVsbCYmYiE9PXZvaWQgMD9iOmgpLF8pfX1YZS5mdW5jS2V5d29yZENvZGU9QmM7ZnVuY3Rpb24gdWEoZSl7Y29uc3R7Z2VuOnQsZGF0YTpyLGl0Om59PWU7dC5pZihuLnBhcmVudERhdGEsKCk9PnQuYXNzaWduKHIsKDAsSWUuXylgJHtuLnBhcmVudERhdGF9WyR7bi5wYXJlbnREYXRhUHJvcGVydHl9XWApKX1mdW5jdGlvbiBKYyhlLHQpe2NvbnN0e2dlbjpyfT1lO3IuaWYoKDAsSWUuXylgQXJyYXkuaXNBcnJheSgke3R9KWAsKCk9PntyLmFzc2lnbihqdC5kZWZhdWx0LnZFcnJvcnMsKDAsSWUuXylgJHtqdC5kZWZhdWx0LnZFcnJvcnN9ID09PSBudWxsID8gJHt0fSA6ICR7anQuZGVmYXVsdC52RXJyb3JzfS5jb25jYXQoJHt0fSlgKS5hc3NpZ24oanQuZGVmYXVsdC5lcnJvcnMsKDAsSWUuXylgJHtqdC5kZWZhdWx0LnZFcnJvcnN9Lmxlbmd0aGApLCgwLEhjLmV4dGVuZEVycm9ycykoZSl9LCgpPT5lLmVycm9yKCkpfWZ1bmN0aW9uIHFjKHtzY2hlbWFFbnY6ZX0sdCl7aWYodC5hc3luYyYmIWUuJGFzeW5jKXRocm93IG5ldyBFcnJvcigiYXN5bmMga2V5d29yZCBpbiBzeW5jIHNjaGVtYSIpfWZ1bmN0aW9uIGxhKGUsdCxyKXtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihga2V5d29yZCAiJHt0fSIgZmFpbGVkIHRvIGNvbXBpbGVgKTtyZXR1cm4gZS5zY29wZVZhbHVlKCJrZXl3b3JkIix0eXBlb2Ygcj09ImZ1bmN0aW9uIj97cmVmOnJ9OntyZWY6cixjb2RlOigwLEllLnN0cmluZ2lmeSkocil9KX1mdW5jdGlvbiBHYyhlLHQscj0hMSl7cmV0dXJuIXQubGVuZ3RofHx0LnNvbWUobj0+bj09PSJhcnJheSI/QXJyYXkuaXNBcnJheShlKTpuPT09Im9iamVjdCI/ZSYmdHlwZW9mIGU9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShlKTp0eXBlb2YgZT09bnx8ciYmdHlwZW9mIGU9PSJ1bmRlZmluZWQiKX1YZS52YWxpZFNjaGVtYVR5cGU9R2M7ZnVuY3Rpb24gUWMoe3NjaGVtYTplLG9wdHM6dCxzZWxmOnIsZXJyU2NoZW1hUGF0aDpufSxzLGEpe2lmKEFycmF5LmlzQXJyYXkocy5rZXl3b3JkKT8hcy5rZXl3b3JkLmluY2x1ZGVzKGEpOnMua2V5d29yZCE9PWEpdGhyb3cgbmV3IEVycm9yKCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3IiKTtjb25zdCBvPXMuZGVwZW5kZW5jaWVzO2lmKG8hPW51bGwmJm8uc29tZShsPT4hT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbCkpKXRocm93IG5ldyBFcnJvcihgcGFyZW50IHNjaGVtYSBtdXN0IGhhdmUgZGVwZW5kZW5jaWVzIG9mICR7YX06ICR7by5qb2luKCIsIil9YCk7aWYocy52YWxpZGF0ZVNjaGVtYSYmIXMudmFsaWRhdGVTY2hlbWEoZVthXSkpe2NvbnN0IGY9YGtleXdvcmQgIiR7YX0iIHZhbHVlIGlzIGludmFsaWQgYXQgcGF0aCAiJHtufSI6IGArci5lcnJvcnNUZXh0KHMudmFsaWRhdGVTY2hlbWEuZXJyb3JzKTtpZih0LnZhbGlkYXRlU2NoZW1hPT09ImxvZyIpci5sb2dnZXIuZXJyb3IoZik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoZil9fVhlLnZhbGlkYXRlS2V5d29yZFVzYWdlPVFjO3ZhciB5dD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoeXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHl0LmV4dGVuZFN1YnNjaGVtYU1vZGU9eXQuZXh0ZW5kU3Vic2NoZW1hRGF0YT15dC5nZXRTdWJzY2hlbWE9dm9pZCAwO2NvbnN0IFplPXVlLGZhPWJlO2Z1bmN0aW9uIFljKGUse2tleXdvcmQ6dCxzY2hlbWFQcm9wOnIsc2NoZW1hOm4sc2NoZW1hUGF0aDpzLGVyclNjaGVtYVBhdGg6YSx0b3BTY2hlbWFSZWY6b30pe2lmKHQhPT12b2lkIDAmJm4hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCdib3RoICJrZXl3b3JkIiBhbmQgInNjaGVtYSIgcGFzc2VkLCBvbmx5IG9uZSBhbGxvd2VkJyk7aWYodCE9PXZvaWQgMCl7Y29uc3QgbD1lLnNjaGVtYVt0XTtyZXR1cm4gcj09PXZvaWQgMD97c2NoZW1hOmwsc2NoZW1hUGF0aDooMCxaZS5fKWAke2Uuc2NoZW1hUGF0aH0keygwLFplLmdldFByb3BlcnR5KSh0KX1gLGVyclNjaGVtYVBhdGg6YCR7ZS5lcnJTY2hlbWFQYXRofS8ke3R9YH06e3NjaGVtYTpsW3JdLHNjaGVtYVBhdGg6KDAsWmUuXylgJHtlLnNjaGVtYVBhdGh9JHsoMCxaZS5nZXRQcm9wZXJ0eSkodCl9JHsoMCxaZS5nZXRQcm9wZXJ0eSkocil9YCxlcnJTY2hlbWFQYXRoOmAke2UuZXJyU2NoZW1hUGF0aH0vJHt0fS8keygwLGZhLmVzY2FwZUZyYWdtZW50KShyKX1gfX1pZihuIT09dm9pZCAwKXtpZihzPT09dm9pZCAwfHxhPT09dm9pZCAwfHxvPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcignInNjaGVtYVBhdGgiLCAiZXJyU2NoZW1hUGF0aCIgYW5kICJ0b3BTY2hlbWFSZWYiIGFyZSByZXF1aXJlZCB3aXRoICJzY2hlbWEiJyk7cmV0dXJue3NjaGVtYTpuLHNjaGVtYVBhdGg6cyx0b3BTY2hlbWFSZWY6byxlcnJTY2hlbWFQYXRoOmF9fXRocm93IG5ldyBFcnJvcignZWl0aGVyICJrZXl3b3JkIiBvciAic2NoZW1hIiBtdXN0IGJlIHBhc3NlZCcpfXl0LmdldFN1YnNjaGVtYT1ZYztmdW5jdGlvbiBXYyhlLHQse2RhdGFQcm9wOnIsZGF0YVByb3BUeXBlOm4sZGF0YTpzLGRhdGFUeXBlczphLHByb3BlcnR5TmFtZTpvfSl7aWYocyE9PXZvaWQgMCYmciE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoJ2JvdGggImRhdGEiIGFuZCAiZGF0YVByb3AiIHBhc3NlZCwgb25seSBvbmUgYWxsb3dlZCcpO2NvbnN0e2dlbjpsfT10O2lmKHIhPT12b2lkIDApe2NvbnN0e2Vycm9yUGF0aDpwLGRhdGFQYXRoQXJyOmksb3B0czpofT10LEU9bC5sZXQoImRhdGEiLCgwLFplLl8pYCR7dC5kYXRhfSR7KDAsWmUuZ2V0UHJvcGVydHkpKHIpfWAsITApO2YoRSksZS5lcnJvclBhdGg9KDAsWmUuc3RyKWAke3B9JHsoMCxmYS5nZXRFcnJvclBhdGgpKHIsbixoLmpzUHJvcGVydHlTeW50YXgpfWAsZS5wYXJlbnREYXRhUHJvcGVydHk9KDAsWmUuXylgJHtyfWAsZS5kYXRhUGF0aEFycj1bLi4uaSxlLnBhcmVudERhdGFQcm9wZXJ0eV19aWYocyE9PXZvaWQgMCl7Y29uc3QgcD1zIGluc3RhbmNlb2YgWmUuTmFtZT9zOmwubGV0KCJkYXRhIixzLCEwKTtmKHApLG8hPT12b2lkIDAmJihlLnByb3BlcnR5TmFtZT1vKX1hJiYoZS5kYXRhVHlwZXM9YSk7ZnVuY3Rpb24gZihwKXtlLmRhdGE9cCxlLmRhdGFMZXZlbD10LmRhdGFMZXZlbCsxLGUuZGF0YVR5cGVzPVtdLHQuZGVmaW5lZFByb3BlcnRpZXM9bmV3IFNldCxlLnBhcmVudERhdGE9dC5kYXRhLGUuZGF0YU5hbWVzPVsuLi50LmRhdGFOYW1lcyxwXX19eXQuZXh0ZW5kU3Vic2NoZW1hRGF0YT1XYztmdW5jdGlvbiBYYyhlLHtqdGREaXNjcmltaW5hdG9yOnQsanRkTWV0YWRhdGE6cixjb21wb3NpdGVSdWxlOm4sY3JlYXRlRXJyb3JzOnMsYWxsRXJyb3JzOmF9KXtuIT09dm9pZCAwJiYoZS5jb21wb3NpdGVSdWxlPW4pLHMhPT12b2lkIDAmJihlLmNyZWF0ZUVycm9ycz1zKSxhIT09dm9pZCAwJiYoZS5hbGxFcnJvcnM9YSksZS5qdGREaXNjcmltaW5hdG9yPXQsZS5qdGRNZXRhZGF0YT1yfXl0LmV4dGVuZFN1YnNjaGVtYU1vZGU9WGM7dmFyIFRlPXt9LFpjPWZ1bmN0aW9uIGUodCxyKXtpZih0PT09cilyZXR1cm4hMDtpZih0JiZyJiZ0eXBlb2YgdD09Im9iamVjdCImJnR5cGVvZiByPT0ib2JqZWN0Iil7aWYodC5jb25zdHJ1Y3RvciE9PXIuY29uc3RydWN0b3IpcmV0dXJuITE7dmFyIG4scyxhO2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKG49dC5sZW5ndGgsbiE9ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHM9bjtzLS0hPT0wOylpZighZSh0W3NdLHJbc10pKXJldHVybiExO3JldHVybiEwfWlmKHQuY29uc3RydWN0b3I9PT1SZWdFeHApcmV0dXJuIHQuc291cmNlPT09ci5zb3VyY2UmJnQuZmxhZ3M9PT1yLmZsYWdzO2lmKHQudmFsdWVPZiE9PU9iamVjdC5wcm90b3R5cGUudmFsdWVPZilyZXR1cm4gdC52YWx1ZU9mKCk9PT1yLnZhbHVlT2YoKTtpZih0LnRvU3RyaW5nIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZylyZXR1cm4gdC50b1N0cmluZygpPT09ci50b1N0cmluZygpO2lmKGE9T2JqZWN0LmtleXModCksbj1hLmxlbmd0aCxuIT09T2JqZWN0LmtleXMocikubGVuZ3RoKXJldHVybiExO2ZvcihzPW47cy0tIT09MDspaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGFbc10pKXJldHVybiExO2ZvcihzPW47cy0tIT09MDspe3ZhciBvPWFbc107aWYoIWUodFtvXSxyW29dKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4gdCE9PXQmJnIhPT1yfSxkYT17ZXhwb3J0czp7fX0sJHQ9ZGEuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7dHlwZW9mIHQ9PSJmdW5jdGlvbiImJihyPXQsdD17fSkscj10LmNifHxyO3ZhciBuPXR5cGVvZiByPT0iZnVuY3Rpb24iP3I6ci5wcmV8fGZ1bmN0aW9uKCl7fSxzPXIucG9zdHx8ZnVuY3Rpb24oKXt9O2FuKHQsbixzLGUsIiIsZSl9OyR0LmtleXdvcmRzPXthZGRpdGlvbmFsSXRlbXM6ITAsaXRlbXM6ITAsY29udGFpbnM6ITAsYWRkaXRpb25hbFByb3BlcnRpZXM6ITAscHJvcGVydHlOYW1lczohMCxub3Q6ITAsaWY6ITAsdGhlbjohMCxlbHNlOiEwfSwkdC5hcnJheUtleXdvcmRzPXtpdGVtczohMCxhbGxPZjohMCxhbnlPZjohMCxvbmVPZjohMH0sJHQucHJvcHNLZXl3b3Jkcz17JGRlZnM6ITAsZGVmaW5pdGlvbnM6ITAscHJvcGVydGllczohMCxwYXR0ZXJuUHJvcGVydGllczohMCxkZXBlbmRlbmNpZXM6ITB9LCR0LnNraXBLZXl3b3Jkcz17ZGVmYXVsdDohMCxlbnVtOiEwLGNvbnN0OiEwLHJlcXVpcmVkOiEwLG1heGltdW06ITAsbWluaW11bTohMCxleGNsdXNpdmVNYXhpbXVtOiEwLGV4Y2x1c2l2ZU1pbmltdW06ITAsbXVsdGlwbGVPZjohMCxtYXhMZW5ndGg6ITAsbWluTGVuZ3RoOiEwLHBhdHRlcm46ITAsZm9ybWF0OiEwLG1heEl0ZW1zOiEwLG1pbkl0ZW1zOiEwLHVuaXF1ZUl0ZW1zOiEwLG1heFByb3BlcnRpZXM6ITAsbWluUHJvcGVydGllczohMH07ZnVuY3Rpb24gYW4oZSx0LHIsbixzLGEsbyxsLGYscCl7aWYobiYmdHlwZW9mIG49PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShuKSl7dChuLHMsYSxvLGwsZixwKTtmb3IodmFyIGkgaW4gbil7dmFyIGg9bltpXTtpZihBcnJheS5pc0FycmF5KGgpKXtpZihpIGluICR0LmFycmF5S2V5d29yZHMpZm9yKHZhciBFPTA7RTxoLmxlbmd0aDtFKyspYW4oZSx0LHIsaFtFXSxzKyIvIitpKyIvIitFLGEscyxpLG4sRSl9ZWxzZSBpZihpIGluICR0LnByb3BzS2V5d29yZHMpe2lmKGgmJnR5cGVvZiBoPT0ib2JqZWN0Iilmb3IodmFyIFQgaW4gaClhbihlLHQscixoW1RdLHMrIi8iK2krIi8iK3hjKFQpLGEscyxpLG4sVCl9ZWxzZShpIGluICR0LmtleXdvcmRzfHxlLmFsbEtleXMmJiEoaSBpbiAkdC5za2lwS2V5d29yZHMpKSYmYW4oZSx0LHIsaCxzKyIvIitpLGEscyxpLG4pfXIobixzLGEsbyxsLGYscCl9fWZ1bmN0aW9uIHhjKGUpe3JldHVybiBlLnJlcGxhY2UoL34vZywifjAiKS5yZXBsYWNlKC9cLy9nLCJ+MSIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksVGUuZ2V0U2NoZW1hUmVmcz1UZS5yZXNvbHZlVXJsPVRlLm5vcm1hbGl6ZUlkPVRlLl9nZXRGdWxsUGF0aD1UZS5nZXRGdWxsUGF0aD1UZS5pbmxpbmVSZWY9dm9pZCAwO2NvbnN0IGV1PWJlLHR1PVpjLHJ1PWRhLmV4cG9ydHMsbnU9bmV3IFNldChbInR5cGUiLCJmb3JtYXQiLCJwYXR0ZXJuIiwibWF4TGVuZ3RoIiwibWluTGVuZ3RoIiwibWF4UHJvcGVydGllcyIsIm1pblByb3BlcnRpZXMiLCJtYXhJdGVtcyIsIm1pbkl0ZW1zIiwibWF4aW11bSIsIm1pbmltdW0iLCJ1bmlxdWVJdGVtcyIsIm11bHRpcGxlT2YiLCJyZXF1aXJlZCIsImVudW0iLCJjb25zdCJdKTtmdW5jdGlvbiBzdShlLHQ9ITApe3JldHVybiB0eXBlb2YgZT09ImJvb2xlYW4iPyEwOnQ9PT0hMD8hcW4oZSk6dD9oYShlKTw9dDohMX1UZS5pbmxpbmVSZWY9c3U7Y29uc3QgYXU9bmV3IFNldChbIiRyZWYiLCIkcmVjdXJzaXZlUmVmIiwiJHJlY3Vyc2l2ZUFuY2hvciIsIiRkeW5hbWljUmVmIiwiJGR5bmFtaWNBbmNob3IiXSk7ZnVuY3Rpb24gcW4oZSl7Zm9yKGNvbnN0IHQgaW4gZSl7aWYoYXUuaGFzKHQpKXJldHVybiEwO2NvbnN0IHI9ZVt0XTtpZihBcnJheS5pc0FycmF5KHIpJiZyLnNvbWUocW4pfHx0eXBlb2Ygcj09Im9iamVjdCImJnFuKHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGhhKGUpe2xldCB0PTA7Zm9yKGNvbnN0IHIgaW4gZSl7aWYocj09PSIkcmVmIilyZXR1cm4gMS8wO2lmKHQrKywhbnUuaGFzKHIpJiYodHlwZW9mIGVbcl09PSJvYmplY3QiJiYoMCxldS5lYWNoSXRlbSkoZVtyXSxuPT50Kz1oYShuKSksdD09PTEvMCkpcmV0dXJuIDEvMH1yZXR1cm4gdH1mdW5jdGlvbiBwYShlLHQ9IiIscil7ciE9PSExJiYodD1ucih0KSk7Y29uc3Qgbj1lLnBhcnNlKHQpO3JldHVybiBtYShlLG4pfVRlLmdldEZ1bGxQYXRoPXBhO2Z1bmN0aW9uIG1hKGUsdCl7cmV0dXJuIGUuc2VyaWFsaXplKHQpLnNwbGl0KCIjIilbMF0rIiMifVRlLl9nZXRGdWxsUGF0aD1tYTtjb25zdCBvdT0vI1wvPyQvO2Z1bmN0aW9uIG5yKGUpe3JldHVybiBlP2UucmVwbGFjZShvdSwiIik6IiJ9VGUubm9ybWFsaXplSWQ9bnI7ZnVuY3Rpb24gaXUoZSx0LHIpe3JldHVybiByPW5yKHIpLGUucmVzb2x2ZSh0LHIpfVRlLnJlc29sdmVVcmw9aXU7Y29uc3QgY3U9L15bYS16X11bLWEtejAtOS5fXSokL2k7ZnVuY3Rpb24gdXUoZSx0KXtpZih0eXBlb2YgZT09ImJvb2xlYW4iKXJldHVybnt9O2NvbnN0e3NjaGVtYUlkOnIsdXJpUmVzb2x2ZXI6bn09dGhpcy5vcHRzLHM9bnIoZVtyXXx8dCksYT17IiI6c30sbz1wYShuLHMsITEpLGw9e30sZj1uZXcgU2V0O3JldHVybiBydShlLHthbGxLZXlzOiEwfSwoaCxFLFQsSSk9PntpZihJPT09dm9pZCAwKXJldHVybjtjb25zdCBqPW8rRTtsZXQgeT1hW0ldO3R5cGVvZiBoW3JdPT0ic3RyaW5nIiYmKHk9Xy5jYWxsKHRoaXMsaFtyXSkpLGIuY2FsbCh0aGlzLGguJGFuY2hvciksYi5jYWxsKHRoaXMsaC4kZHluYW1pY0FuY2hvciksYVtFXT15O2Z1bmN0aW9uIF8oTyl7Y29uc3QgQT10aGlzLm9wdHMudXJpUmVzb2x2ZXIucmVzb2x2ZTtpZihPPW5yKHk/QSh5LE8pOk8pLGYuaGFzKE8pKXRocm93IGkoTyk7Zi5hZGQoTyk7bGV0IEg9dGhpcy5yZWZzW09dO3JldHVybiB0eXBlb2YgSD09InN0cmluZyImJihIPXRoaXMucmVmc1tIXSksdHlwZW9mIEg9PSJvYmplY3QiP3AoaCxILnNjaGVtYSxPKTpPIT09bnIoaikmJihPWzBdPT09IiMiPyhwKGgsbFtPXSxPKSxsW09dPWgpOnRoaXMucmVmc1tPXT1qKSxPfWZ1bmN0aW9uIGIoTyl7aWYodHlwZW9mIE89PSJzdHJpbmciKXtpZighY3UudGVzdChPKSl0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYW5jaG9yICIke099ImApO18uY2FsbCh0aGlzLGAjJHtPfWApfX19KSxsO2Z1bmN0aW9uIHAoaCxFLFQpe2lmKEUhPT12b2lkIDAmJiF0dShoLEUpKXRocm93IGkoVCl9ZnVuY3Rpb24gaShoKXtyZXR1cm4gbmV3IEVycm9yKGByZWZlcmVuY2UgIiR7aH0iIHJlc29sdmVzIHRvIG1vcmUgdGhhbiBvbmUgc2NoZW1hYCl9fVRlLmdldFNjaGVtYVJlZnM9dXUsT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxXZS5nZXREYXRhPVdlLktleXdvcmRDeHQ9V2UudmFsaWRhdGVGdW5jdGlvbkNvZGU9dm9pZCAwO2NvbnN0IHZhPXRyLF9hPW5uLEduPWx0LG9uPW5uLGx1PXNuLCRyPVhlLFFuPXl0LE09dWUsSj1MZSxmdT1UZSxmdD1iZSx3cj1FcjtmdW5jdGlvbiBkdShlKXtpZigkYShlKSYmKHdhKGUpLHlhKGUpKSl7bXUoZSk7cmV0dXJufWdhKGUsKCk9PigwLHZhLnRvcEJvb2xPckVtcHR5U2NoZW1hKShlKSl9V2UudmFsaWRhdGVGdW5jdGlvbkNvZGU9ZHU7ZnVuY3Rpb24gZ2Eoe2dlbjplLHZhbGlkYXRlTmFtZTp0LHNjaGVtYTpyLHNjaGVtYUVudjpuLG9wdHM6c30sYSl7cy5jb2RlLmVzNT9lLmZ1bmModCwoMCxNLl8pYCR7Si5kZWZhdWx0LmRhdGF9LCAke0ouZGVmYXVsdC52YWxDeHR9YCxuLiRhc3luYywoKT0+e2UuY29kZSgoMCxNLl8pYCJ1c2Ugc3RyaWN0IjsgJHtFYShyLHMpfWApLHB1KGUscyksZS5jb2RlKGEpfSk6ZS5mdW5jKHQsKDAsTS5fKWAke0ouZGVmYXVsdC5kYXRhfSwgJHtodShzKX1gLG4uJGFzeW5jLCgpPT5lLmNvZGUoRWEocixzKSkuY29kZShhKSl9ZnVuY3Rpb24gaHUoZSl7cmV0dXJuKDAsTS5fKWB7JHtKLmRlZmF1bHQuaW5zdGFuY2VQYXRofT0iIiwgJHtKLmRlZmF1bHQucGFyZW50RGF0YX0sICR7Si5kZWZhdWx0LnBhcmVudERhdGFQcm9wZXJ0eX0sICR7Si5kZWZhdWx0LnJvb3REYXRhfT0ke0ouZGVmYXVsdC5kYXRhfSR7ZS5keW5hbWljUmVmPygwLE0uXylgLCAke0ouZGVmYXVsdC5keW5hbWljQW5jaG9yc309e31gOk0ubmlsfX09e31gfWZ1bmN0aW9uIHB1KGUsdCl7ZS5pZihKLmRlZmF1bHQudmFsQ3h0LCgpPT57ZS52YXIoSi5kZWZhdWx0Lmluc3RhbmNlUGF0aCwoMCxNLl8pYCR7Si5kZWZhdWx0LnZhbEN4dH0uJHtKLmRlZmF1bHQuaW5zdGFuY2VQYXRofWApLGUudmFyKEouZGVmYXVsdC5wYXJlbnREYXRhLCgwLE0uXylgJHtKLmRlZmF1bHQudmFsQ3h0fS4ke0ouZGVmYXVsdC5wYXJlbnREYXRhfWApLGUudmFyKEouZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksKDAsTS5fKWAke0ouZGVmYXVsdC52YWxDeHR9LiR7Si5kZWZhdWx0LnBhcmVudERhdGFQcm9wZXJ0eX1gKSxlLnZhcihKLmRlZmF1bHQucm9vdERhdGEsKDAsTS5fKWAke0ouZGVmYXVsdC52YWxDeHR9LiR7Si5kZWZhdWx0LnJvb3REYXRhfWApLHQuZHluYW1pY1JlZiYmZS52YXIoSi5kZWZhdWx0LmR5bmFtaWNBbmNob3JzLCgwLE0uXylgJHtKLmRlZmF1bHQudmFsQ3h0fS4ke0ouZGVmYXVsdC5keW5hbWljQW5jaG9yc31gKX0sKCk9PntlLnZhcihKLmRlZmF1bHQuaW5zdGFuY2VQYXRoLCgwLE0uXylgIiJgKSxlLnZhcihKLmRlZmF1bHQucGFyZW50RGF0YSwoMCxNLl8pYHVuZGVmaW5lZGApLGUudmFyKEouZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksKDAsTS5fKWB1bmRlZmluZWRgKSxlLnZhcihKLmRlZmF1bHQucm9vdERhdGEsSi5kZWZhdWx0LmRhdGEpLHQuZHluYW1pY1JlZiYmZS52YXIoSi5kZWZhdWx0LmR5bmFtaWNBbmNob3JzLCgwLE0uXylge31gKX0pfWZ1bmN0aW9uIG11KGUpe2NvbnN0e3NjaGVtYTp0LG9wdHM6cixnZW46bn09ZTtnYShlLCgpPT57ci4kY29tbWVudCYmdC4kY29tbWVudCYmUmEoZSkseXUoZSksbi5sZXQoSi5kZWZhdWx0LnZFcnJvcnMsbnVsbCksbi5sZXQoSi5kZWZhdWx0LmVycm9ycywwKSxyLnVuZXZhbHVhdGVkJiZ2dShlKSxTYShlKSxTdShlKX0pfWZ1bmN0aW9uIHZ1KGUpe2NvbnN0e2dlbjp0LHZhbGlkYXRlTmFtZTpyfT1lO2UuZXZhbHVhdGVkPXQuY29uc3QoImV2YWx1YXRlZCIsKDAsTS5fKWAke3J9LmV2YWx1YXRlZGApLHQuaWYoKDAsTS5fKWAke2UuZXZhbHVhdGVkfS5keW5hbWljUHJvcHNgLCgpPT50LmFzc2lnbigoMCxNLl8pYCR7ZS5ldmFsdWF0ZWR9LnByb3BzYCwoMCxNLl8pYHVuZGVmaW5lZGApKSx0LmlmKCgwLE0uXylgJHtlLmV2YWx1YXRlZH0uZHluYW1pY0l0ZW1zYCwoKT0+dC5hc3NpZ24oKDAsTS5fKWAke2UuZXZhbHVhdGVkfS5pdGVtc2AsKDAsTS5fKWB1bmRlZmluZWRgKSl9ZnVuY3Rpb24gRWEoZSx0KXtjb25zdCByPXR5cGVvZiBlPT0ib2JqZWN0IiYmZVt0LnNjaGVtYUlkXTtyZXR1cm4gciYmKHQuY29kZS5zb3VyY2V8fHQuY29kZS5wcm9jZXNzKT8oMCxNLl8pYC8qIyBzb3VyY2VVUkw9JHtyfSAqL2A6TS5uaWx9ZnVuY3Rpb24gX3UoZSx0KXtpZigkYShlKSYmKHdhKGUpLHlhKGUpKSl7Z3UoZSx0KTtyZXR1cm59KDAsdmEuYm9vbE9yRW1wdHlTY2hlbWEpKGUsdCl9ZnVuY3Rpb24geWEoe3NjaGVtYTplLHNlbGY6dH0pe2lmKHR5cGVvZiBlPT0iYm9vbGVhbiIpcmV0dXJuIWU7Zm9yKGNvbnN0IHIgaW4gZSlpZih0LlJVTEVTLmFsbFtyXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiAkYShlKXtyZXR1cm4gdHlwZW9mIGUuc2NoZW1hIT0iYm9vbGVhbiJ9ZnVuY3Rpb24gZ3UoZSx0KXtjb25zdHtzY2hlbWE6cixnZW46bixvcHRzOnN9PWU7cy4kY29tbWVudCYmci4kY29tbWVudCYmUmEoZSksJHUoZSksd3UoZSk7Y29uc3QgYT1uLmNvbnN0KCJfZXJycyIsSi5kZWZhdWx0LmVycm9ycyk7U2EoZSxhKSxuLnZhcih0LCgwLE0uXylgJHthfSA9PT0gJHtKLmRlZmF1bHQuZXJyb3JzfWApfWZ1bmN0aW9uIHdhKGUpeygwLGZ0LmNoZWNrVW5rbm93blJ1bGVzKShlKSxFdShlKX1mdW5jdGlvbiBTYShlLHQpe2lmKGUub3B0cy5qdGQpcmV0dXJuIGJhKGUsW10sITEsdCk7Y29uc3Qgcj0oMCxfYS5nZXRTY2hlbWFUeXBlcykoZS5zY2hlbWEpLG49KDAsX2EuY29lcmNlQW5kQ2hlY2tEYXRhVHlwZSkoZSxyKTtiYShlLHIsIW4sdCl9ZnVuY3Rpb24gRXUoZSl7Y29uc3R7c2NoZW1hOnQsZXJyU2NoZW1hUGF0aDpyLG9wdHM6bixzZWxmOnN9PWU7dC4kcmVmJiZuLmlnbm9yZUtleXdvcmRzV2l0aFJlZiYmKDAsZnQuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKHQscy5SVUxFUykmJnMubG9nZ2VyLndhcm4oYCRyZWY6IGtleXdvcmRzIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggIiR7cn0iYCl9ZnVuY3Rpb24geXUoZSl7Y29uc3R7c2NoZW1hOnQsb3B0czpyfT1lO3QuZGVmYXVsdCE9PXZvaWQgMCYmci51c2VEZWZhdWx0cyYmci5zdHJpY3RTY2hlbWEmJigwLGZ0LmNoZWNrU3RyaWN0TW9kZSkoZSwiZGVmYXVsdCBpcyBpZ25vcmVkIGluIHRoZSBzY2hlbWEgcm9vdCIpfWZ1bmN0aW9uICR1KGUpe2NvbnN0IHQ9ZS5zY2hlbWFbZS5vcHRzLnNjaGVtYUlkXTt0JiYoZS5iYXNlSWQ9KDAsZnUucmVzb2x2ZVVybCkoZS5vcHRzLnVyaVJlc29sdmVyLGUuYmFzZUlkLHQpKX1mdW5jdGlvbiB3dShlKXtpZihlLnNjaGVtYS4kYXN5bmMmJiFlLnNjaGVtYUVudi4kYXN5bmMpdGhyb3cgbmV3IEVycm9yKCJhc3luYyBzY2hlbWEgaW4gc3luYyBzY2hlbWEiKX1mdW5jdGlvbiBSYSh7Z2VuOmUsc2NoZW1hRW52OnQsc2NoZW1hOnIsZXJyU2NoZW1hUGF0aDpuLG9wdHM6c30pe2NvbnN0IGE9ci4kY29tbWVudDtpZihzLiRjb21tZW50PT09ITApZS5jb2RlKCgwLE0uXylgJHtKLmRlZmF1bHQuc2VsZn0ubG9nZ2VyLmxvZygke2F9KWApO2Vsc2UgaWYodHlwZW9mIHMuJGNvbW1lbnQ9PSJmdW5jdGlvbiIpe2NvbnN0IG89KDAsTS5zdHIpYCR7bn0vJGNvbW1lbnRgLGw9ZS5zY29wZVZhbHVlKCJyb290Iix7cmVmOnQucm9vdH0pO2UuY29kZSgoMCxNLl8pYCR7Si5kZWZhdWx0LnNlbGZ9Lm9wdHMuJGNvbW1lbnQoJHthfSwgJHtvfSwgJHtsfS5zY2hlbWEpYCl9fWZ1bmN0aW9uIFN1KGUpe2NvbnN0e2dlbjp0LHNjaGVtYUVudjpyLHZhbGlkYXRlTmFtZTpuLFZhbGlkYXRpb25FcnJvcjpzLG9wdHM6YX09ZTtyLiRhc3luYz90LmlmKCgwLE0uXylgJHtKLmRlZmF1bHQuZXJyb3JzfSA9PT0gMGAsKCk9PnQucmV0dXJuKEouZGVmYXVsdC5kYXRhKSwoKT0+dC50aHJvdygoMCxNLl8pYG5ldyAke3N9KCR7Si5kZWZhdWx0LnZFcnJvcnN9KWApKToodC5hc3NpZ24oKDAsTS5fKWAke259LmVycm9yc2AsSi5kZWZhdWx0LnZFcnJvcnMpLGEudW5ldmFsdWF0ZWQmJlJ1KGUpLHQucmV0dXJuKCgwLE0uXylgJHtKLmRlZmF1bHQuZXJyb3JzfSA9PT0gMGApKX1mdW5jdGlvbiBSdSh7Z2VuOmUsZXZhbHVhdGVkOnQscHJvcHM6cixpdGVtczpufSl7ciBpbnN0YW5jZW9mIE0uTmFtZSYmZS5hc3NpZ24oKDAsTS5fKWAke3R9LnByb3BzYCxyKSxuIGluc3RhbmNlb2YgTS5OYW1lJiZlLmFzc2lnbigoMCxNLl8pYCR7dH0uaXRlbXNgLG4pfWZ1bmN0aW9uIGJhKGUsdCxyLG4pe2NvbnN0e2dlbjpzLHNjaGVtYTphLGRhdGE6byxhbGxFcnJvcnM6bCxvcHRzOmYsc2VsZjpwfT1lLHtSVUxFUzppfT1wO2lmKGEuJHJlZiYmKGYuaWdub3JlS2V5d29yZHNXaXRoUmVmfHwhKDAsZnQuc2NoZW1hSGFzUnVsZXNCdXRSZWYpKGEsaSkpKXtzLmJsb2NrKCgpPT5UYShlLCIkcmVmIixpLmFsbC4kcmVmLmRlZmluaXRpb24pKTtyZXR1cm59Zi5qdGR8fGJ1KGUsdCkscy5ibG9jaygoKT0+e2Zvcihjb25zdCBFIG9mIGkucnVsZXMpaChFKTtoKGkucG9zdCl9KTtmdW5jdGlvbiBoKEUpeyEoMCxHbi5zaG91bGRVc2VHcm91cCkoYSxFKXx8KEUudHlwZT8ocy5pZigoMCxvbi5jaGVja0RhdGFUeXBlKShFLnR5cGUsbyxmLnN0cmljdE51bWJlcnMpKSxPYShlLEUpLHQubGVuZ3RoPT09MSYmdFswXT09PUUudHlwZSYmciYmKHMuZWxzZSgpLCgwLG9uLnJlcG9ydFR5cGVFcnJvcikoZSkpLHMuZW5kSWYoKSk6T2EoZSxFKSxsfHxzLmlmKCgwLE0uXylgJHtKLmRlZmF1bHQuZXJyb3JzfSA9PT0gJHtufHwwfWApKX19ZnVuY3Rpb24gT2EoZSx0KXtjb25zdHtnZW46cixzY2hlbWE6bixvcHRzOnt1c2VEZWZhdWx0czpzfX09ZTtzJiYoMCxsdS5hc3NpZ25EZWZhdWx0cykoZSx0LnR5cGUpLHIuYmxvY2soKCk9Pntmb3IoY29uc3QgYSBvZiB0LnJ1bGVzKSgwLEduLnNob3VsZFVzZVJ1bGUpKG4sYSkmJlRhKGUsYS5rZXl3b3JkLGEuZGVmaW5pdGlvbix0LnR5cGUpfSl9ZnVuY3Rpb24gYnUoZSx0KXtlLnNjaGVtYUVudi5tZXRhfHwhZS5vcHRzLnN0cmljdFR5cGVzfHwoT3UoZSx0KSxlLm9wdHMuYWxsb3dVbmlvblR5cGVzfHxOdShlLHQpLFB1KGUsZS5kYXRhVHlwZXMpKX1mdW5jdGlvbiBPdShlLHQpe2lmKCEhdC5sZW5ndGgpe2lmKCFlLmRhdGFUeXBlcy5sZW5ndGgpe2UuZGF0YVR5cGVzPXQ7cmV0dXJufXQuZm9yRWFjaChyPT57TmEoZS5kYXRhVHlwZXMscil8fFluKGUsYHR5cGUgIiR7cn0iIG5vdCBhbGxvd2VkIGJ5IGNvbnRleHQgIiR7ZS5kYXRhVHlwZXMuam9pbigiLCIpfSJgKX0pLGUuZGF0YVR5cGVzPWUuZGF0YVR5cGVzLmZpbHRlcihyPT5OYSh0LHIpKX19ZnVuY3Rpb24gTnUoZSx0KXt0Lmxlbmd0aD4xJiYhKHQubGVuZ3RoPT09MiYmdC5pbmNsdWRlcygibnVsbCIpKSYmWW4oZSwidXNlIGFsbG93VW5pb25UeXBlcyB0byBhbGxvdyB1bmlvbiB0eXBlIGtleXdvcmQiKX1mdW5jdGlvbiBQdShlLHQpe2NvbnN0IHI9ZS5zZWxmLlJVTEVTLmFsbDtmb3IoY29uc3QgbiBpbiByKXtjb25zdCBzPXJbbl07aWYodHlwZW9mIHM9PSJvYmplY3QiJiYoMCxHbi5zaG91bGRVc2VSdWxlKShlLnNjaGVtYSxzKSl7Y29uc3R7dHlwZTphfT1zLmRlZmluaXRpb247YS5sZW5ndGgmJiFhLnNvbWUobz0+VHUodCxvKSkmJlluKGUsYG1pc3NpbmcgdHlwZSAiJHthLmpvaW4oIiwiKX0iIGZvciBrZXl3b3JkICIke259ImApfX19ZnVuY3Rpb24gVHUoZSx0KXtyZXR1cm4gZS5pbmNsdWRlcyh0KXx8dD09PSJudW1iZXIiJiZlLmluY2x1ZGVzKCJpbnRlZ2VyIil9ZnVuY3Rpb24gTmEoZSx0KXtyZXR1cm4gZS5pbmNsdWRlcyh0KXx8dD09PSJpbnRlZ2VyIiYmZS5pbmNsdWRlcygibnVtYmVyIil9ZnVuY3Rpb24gWW4oZSx0KXt0Kz1gIGF0ICIke2Uuc2NoZW1hRW52LmJhc2VJZCtlLmVyclNjaGVtYVBhdGh9IiAoc3RyaWN0VHlwZXMpYCwoMCxmdC5jaGVja1N0cmljdE1vZGUpKGUsdCxlLm9wdHMuc3RyaWN0VHlwZXMpfWNsYXNzIFBhe2NvbnN0cnVjdG9yKHQscixuKXtpZigoMCwkci52YWxpZGF0ZUtleXdvcmRVc2FnZSkodCxyLG4pLHRoaXMuZ2VuPXQuZ2VuLHRoaXMuYWxsRXJyb3JzPXQuYWxsRXJyb3JzLHRoaXMua2V5d29yZD1uLHRoaXMuZGF0YT10LmRhdGEsdGhpcy5zY2hlbWE9dC5zY2hlbWFbbl0sdGhpcy4kZGF0YT1yLiRkYXRhJiZ0Lm9wdHMuJGRhdGEmJnRoaXMuc2NoZW1hJiZ0aGlzLnNjaGVtYS4kZGF0YSx0aGlzLnNjaGVtYVZhbHVlPSgwLGZ0LnNjaGVtYVJlZk9yVmFsKSh0LHRoaXMuc2NoZW1hLG4sdGhpcy4kZGF0YSksdGhpcy5zY2hlbWFUeXBlPXIuc2NoZW1hVHlwZSx0aGlzLnBhcmVudFNjaGVtYT10LnNjaGVtYSx0aGlzLnBhcmFtcz17fSx0aGlzLml0PXQsdGhpcy5kZWY9cix0aGlzLiRkYXRhKXRoaXMuc2NoZW1hQ29kZT10Lmdlbi5jb25zdCgidlNjaGVtYSIsQWEodGhpcy4kZGF0YSx0KSk7ZWxzZSBpZih0aGlzLnNjaGVtYUNvZGU9dGhpcy5zY2hlbWFWYWx1ZSwhKDAsJHIudmFsaWRTY2hlbWFUeXBlKSh0aGlzLnNjaGVtYSxyLnNjaGVtYVR5cGUsci5hbGxvd1VuZGVmaW5lZCkpdGhyb3cgbmV3IEVycm9yKGAke259IHZhbHVlIG11c3QgYmUgJHtKU09OLnN0cmluZ2lmeShyLnNjaGVtYVR5cGUpfWApOygiY29kZSJpbiByP3IudHJhY2tFcnJvcnM6ci5lcnJvcnMhPT0hMSkmJih0aGlzLmVycnNDb3VudD10Lmdlbi5jb25zdCgiX2VycnMiLEouZGVmYXVsdC5lcnJvcnMpKX1yZXN1bHQodCxyLG4pe3RoaXMuZmFpbFJlc3VsdCgoMCxNLm5vdCkodCkscixuKX1mYWlsUmVzdWx0KHQscixuKXt0aGlzLmdlbi5pZih0KSxuP24oKTp0aGlzLmVycm9yKCkscj8odGhpcy5nZW4uZWxzZSgpLHIoKSx0aGlzLmFsbEVycm9ycyYmdGhpcy5nZW4uZW5kSWYoKSk6dGhpcy5hbGxFcnJvcnM/dGhpcy5nZW4uZW5kSWYoKTp0aGlzLmdlbi5lbHNlKCl9cGFzcyh0LHIpe3RoaXMuZmFpbFJlc3VsdCgoMCxNLm5vdCkodCksdm9pZCAwLHIpfWZhaWwodCl7aWYodD09PXZvaWQgMCl7dGhpcy5lcnJvcigpLHRoaXMuYWxsRXJyb3JzfHx0aGlzLmdlbi5pZighMSk7cmV0dXJufXRoaXMuZ2VuLmlmKHQpLHRoaXMuZXJyb3IoKSx0aGlzLmFsbEVycm9ycz90aGlzLmdlbi5lbmRJZigpOnRoaXMuZ2VuLmVsc2UoKX1mYWlsJGRhdGEodCl7aWYoIXRoaXMuJGRhdGEpcmV0dXJuIHRoaXMuZmFpbCh0KTtjb25zdHtzY2hlbWFDb2RlOnJ9PXRoaXM7dGhpcy5mYWlsKCgwLE0uXylgJHtyfSAhPT0gdW5kZWZpbmVkICYmICgkeygwLE0ub3IpKHRoaXMuaW52YWxpZCRkYXRhKCksdCl9KWApfWVycm9yKHQscixuKXtpZihyKXt0aGlzLnNldFBhcmFtcyhyKSx0aGlzLl9lcnJvcih0LG4pLHRoaXMuc2V0UGFyYW1zKHt9KTtyZXR1cm59dGhpcy5fZXJyb3IodCxuKX1fZXJyb3IodCxyKXsodD93ci5yZXBvcnRFeHRyYUVycm9yOndyLnJlcG9ydEVycm9yKSh0aGlzLHRoaXMuZGVmLmVycm9yLHIpfSRkYXRhRXJyb3IoKXsoMCx3ci5yZXBvcnRFcnJvcikodGhpcyx0aGlzLmRlZi4kZGF0YUVycm9yfHx3ci5rZXl3b3JkJERhdGFFcnJvcil9cmVzZXQoKXtpZih0aGlzLmVycnNDb3VudD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoJ2FkZCAidHJhY2tFcnJvcnMiIHRvIGtleXdvcmQgZGVmaW5pdGlvbicpOygwLHdyLnJlc2V0RXJyb3JzQ291bnQpKHRoaXMuZ2VuLHRoaXMuZXJyc0NvdW50KX1vayh0KXt0aGlzLmFsbEVycm9yc3x8dGhpcy5nZW4uaWYodCl9c2V0UGFyYW1zKHQscil7cj9PYmplY3QuYXNzaWduKHRoaXMucGFyYW1zLHQpOnRoaXMucGFyYW1zPXR9YmxvY2skZGF0YSh0LHIsbj1NLm5pbCl7dGhpcy5nZW4uYmxvY2soKCk9Pnt0aGlzLmNoZWNrJGRhdGEodCxuKSxyKCl9KX1jaGVjayRkYXRhKHQ9TS5uaWwscj1NLm5pbCl7aWYoIXRoaXMuJGRhdGEpcmV0dXJuO2NvbnN0e2dlbjpuLHNjaGVtYUNvZGU6cyxzY2hlbWFUeXBlOmEsZGVmOm99PXRoaXM7bi5pZigoMCxNLm9yKSgoMCxNLl8pYCR7c30gPT09IHVuZGVmaW5lZGAscikpLHQhPT1NLm5pbCYmbi5hc3NpZ24odCwhMCksKGEubGVuZ3RofHxvLnZhbGlkYXRlU2NoZW1hKSYmKG4uZWxzZUlmKHRoaXMuaW52YWxpZCRkYXRhKCkpLHRoaXMuJGRhdGFFcnJvcigpLHQhPT1NLm5pbCYmbi5hc3NpZ24odCwhMSkpLG4uZWxzZSgpfWludmFsaWQkZGF0YSgpe2NvbnN0e2dlbjp0LHNjaGVtYUNvZGU6cixzY2hlbWFUeXBlOm4sZGVmOnMsaXQ6YX09dGhpcztyZXR1cm4oMCxNLm9yKShvKCksbCgpKTtmdW5jdGlvbiBvKCl7aWYobi5sZW5ndGgpe2lmKCEociBpbnN0YW5jZW9mIE0uTmFtZSkpdGhyb3cgbmV3IEVycm9yKCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3IiKTtjb25zdCBmPUFycmF5LmlzQXJyYXkobik/bjpbbl07cmV0dXJuKDAsTS5fKWAkeygwLG9uLmNoZWNrRGF0YVR5cGVzKShmLHIsYS5vcHRzLnN0cmljdE51bWJlcnMsb24uRGF0YVR5cGUuV3JvbmcpfWB9cmV0dXJuIE0ubmlsfWZ1bmN0aW9uIGwoKXtpZihzLnZhbGlkYXRlU2NoZW1hKXtjb25zdCBmPXQuc2NvcGVWYWx1ZSgidmFsaWRhdGUkZGF0YSIse3JlZjpzLnZhbGlkYXRlU2NoZW1hfSk7cmV0dXJuKDAsTS5fKWAhJHtmfSgke3J9KWB9cmV0dXJuIE0ubmlsfX1zdWJzY2hlbWEodCxyKXtjb25zdCBuPSgwLFFuLmdldFN1YnNjaGVtYSkodGhpcy5pdCx0KTsoMCxRbi5leHRlbmRTdWJzY2hlbWFEYXRhKShuLHRoaXMuaXQsdCksKDAsUW4uZXh0ZW5kU3Vic2NoZW1hTW9kZSkobix0KTtjb25zdCBzPWxlKFEoUSh7fSx0aGlzLml0KSxuKSx7aXRlbXM6dm9pZCAwLHByb3BzOnZvaWQgMH0pO3JldHVybiBfdShzLHIpLHN9bWVyZ2VFdmFsdWF0ZWQodCxyKXtjb25zdHtpdDpuLGdlbjpzfT10aGlzOyFuLm9wdHMudW5ldmFsdWF0ZWR8fChuLnByb3BzIT09ITAmJnQucHJvcHMhPT12b2lkIDAmJihuLnByb3BzPWZ0Lm1lcmdlRXZhbHVhdGVkLnByb3BzKHMsdC5wcm9wcyxuLnByb3BzLHIpKSxuLml0ZW1zIT09ITAmJnQuaXRlbXMhPT12b2lkIDAmJihuLml0ZW1zPWZ0Lm1lcmdlRXZhbHVhdGVkLml0ZW1zKHMsdC5pdGVtcyxuLml0ZW1zLHIpKSl9bWVyZ2VWYWxpZEV2YWx1YXRlZCh0LHIpe2NvbnN0e2l0Om4sZ2VuOnN9PXRoaXM7aWYobi5vcHRzLnVuZXZhbHVhdGVkJiYobi5wcm9wcyE9PSEwfHxuLml0ZW1zIT09ITApKXJldHVybiBzLmlmKHIsKCk9PnRoaXMubWVyZ2VFdmFsdWF0ZWQodCxNLk5hbWUpKSwhMH19V2UuS2V5d29yZEN4dD1QYTtmdW5jdGlvbiBUYShlLHQscixuKXtjb25zdCBzPW5ldyBQYShlLHIsdCk7ImNvZGUiaW4gcj9yLmNvZGUocyxuKTpzLiRkYXRhJiZyLnZhbGlkYXRlPygwLCRyLmZ1bmNLZXl3b3JkQ29kZSkocyxyKToibWFjcm8iaW4gcj8oMCwkci5tYWNyb0tleXdvcmRDb2RlKShzLHIpOihyLmNvbXBpbGV8fHIudmFsaWRhdGUpJiYoMCwkci5mdW5jS2V5d29yZENvZGUpKHMscil9Y29uc3QgQXU9L15cLyg/Oltefl18fjB8fjEpKiQvLEN1PS9eKFswLTldKykoI3xcLyg/Oltefl18fjB8fjEpKik/JC87ZnVuY3Rpb24gQWEoZSx7ZGF0YUxldmVsOnQsZGF0YU5hbWVzOnIsZGF0YVBhdGhBcnI6bn0pe2xldCBzLGE7aWYoZT09PSIiKXJldHVybiBKLmRlZmF1bHQucm9vdERhdGE7aWYoZVswXT09PSIvIil7aWYoIUF1LnRlc3QoZSkpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04tcG9pbnRlcjogJHtlfWApO3M9ZSxhPUouZGVmYXVsdC5yb290RGF0YX1lbHNle2NvbnN0IHA9Q3UuZXhlYyhlKTtpZighcCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSlNPTi1wb2ludGVyOiAke2V9YCk7Y29uc3QgaT0rcFsxXTtpZihzPXBbMl0scz09PSIjIil7aWYoaT49dCl0aHJvdyBuZXcgRXJyb3IoZigicHJvcGVydHkvaW5kZXgiLGkpKTtyZXR1cm4gblt0LWldfWlmKGk+dCl0aHJvdyBuZXcgRXJyb3IoZigiZGF0YSIsaSkpO2lmKGE9clt0LWldLCFzKXJldHVybiBhfWxldCBvPWE7Y29uc3QgbD1zLnNwbGl0KCIvIik7Zm9yKGNvbnN0IHAgb2YgbClwJiYoYT0oMCxNLl8pYCR7YX0keygwLE0uZ2V0UHJvcGVydHkpKCgwLGZ0LnVuZXNjYXBlSnNvblBvaW50ZXIpKHApKX1gLG89KDAsTS5fKWAke299ICYmICR7YX1gKTtyZXR1cm4gbztmdW5jdGlvbiBmKHAsaSl7cmV0dXJuYENhbm5vdCBhY2Nlc3MgJHtwfSAke2l9IGxldmVscyB1cCwgY3VycmVudCBsZXZlbCBpcyAke3R9YH19V2UuZ2V0RGF0YT1BYTt2YXIgY249e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGNuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjbGFzcyBJdSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKCJ2YWxpZGF0aW9uIGZhaWxlZCIpLHRoaXMuZXJyb3JzPXQsdGhpcy5hanY9dGhpcy52YWxpZGF0aW9uPSEwfX1jbi5kZWZhdWx0PUl1O3ZhciBrdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoa3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IFduPVRlO2NsYXNzIER1IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxyLG4scyl7c3VwZXIoc3x8YGNhbid0IHJlc29sdmUgcmVmZXJlbmNlICR7bn0gZnJvbSBpZCAke3J9YCksdGhpcy5taXNzaW5nUmVmPSgwLFduLnJlc29sdmVVcmwpKHQscixuKSx0aGlzLm1pc3NpbmdTY2hlbWE9KDAsV24ubm9ybWFsaXplSWQpKCgwLFduLmdldEZ1bGxQYXRoKSh0LHRoaXMubWlzc2luZ1JlZikpfX1rdC5kZWZhdWx0PUR1O3ZhciBDZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2UsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLENlLnJlc29sdmVTY2hlbWE9Q2UuZ2V0Q29tcGlsaW5nU2NoZW1hPUNlLnJlc29sdmVSZWY9Q2UuY29tcGlsZVNjaGVtYT1DZS5TY2hlbWFFbnY9dm9pZCAwO2NvbnN0IFFlPXVlLGp1PWNuLFV0PUxlLFllPVRlLENhPWJlLGt1PVdlO2NsYXNzIHVue2NvbnN0cnVjdG9yKHQpe3ZhciByO3RoaXMucmVmcz17fSx0aGlzLmR5bmFtaWNBbmNob3JzPXt9O2xldCBuO3R5cGVvZiB0LnNjaGVtYT09Im9iamVjdCImJihuPXQuc2NoZW1hKSx0aGlzLnNjaGVtYT10LnNjaGVtYSx0aGlzLnNjaGVtYUlkPXQuc2NoZW1hSWQsdGhpcy5yb290PXQucm9vdHx8dGhpcyx0aGlzLmJhc2VJZD0ocj10LmJhc2VJZCkhPT1udWxsJiZyIT09dm9pZCAwP3I6KDAsWWUubm9ybWFsaXplSWQpKG49PW51bGw/dm9pZCAwOm5bdC5zY2hlbWFJZHx8IiRpZCJdKSx0aGlzLnNjaGVtYVBhdGg9dC5zY2hlbWFQYXRoLHRoaXMubG9jYWxSZWZzPXQubG9jYWxSZWZzLHRoaXMubWV0YT10Lm1ldGEsdGhpcy4kYXN5bmM9bj09bnVsbD92b2lkIDA6bi4kYXN5bmMsdGhpcy5yZWZzPXt9fX1DZS5TY2hlbWFFbnY9dW47ZnVuY3Rpb24gWG4oZSl7Y29uc3QgdD1JYS5jYWxsKHRoaXMsZSk7aWYodClyZXR1cm4gdDtjb25zdCByPSgwLFllLmdldEZ1bGxQYXRoKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsZS5yb290LmJhc2VJZCkse2VzNTpuLGxpbmVzOnN9PXRoaXMub3B0cy5jb2RlLHtvd25Qcm9wZXJ0aWVzOmF9PXRoaXMub3B0cyxvPW5ldyBRZS5Db2RlR2VuKHRoaXMuc2NvcGUse2VzNTpuLGxpbmVzOnMsb3duUHJvcGVydGllczphfSk7bGV0IGw7ZS4kYXN5bmMmJihsPW8uc2NvcGVWYWx1ZSgiRXJyb3IiLHtyZWY6anUuZGVmYXVsdCxjb2RlOigwLFFlLl8pYHJlcXVpcmUoImFqdi9kaXN0L3J1bnRpbWUvdmFsaWRhdGlvbl9lcnJvciIpLmRlZmF1bHRgfSkpO2NvbnN0IGY9by5zY29wZU5hbWUoInZhbGlkYXRlIik7ZS52YWxpZGF0ZU5hbWU9Zjtjb25zdCBwPXtnZW46byxhbGxFcnJvcnM6dGhpcy5vcHRzLmFsbEVycm9ycyxkYXRhOlV0LmRlZmF1bHQuZGF0YSxwYXJlbnREYXRhOlV0LmRlZmF1bHQucGFyZW50RGF0YSxwYXJlbnREYXRhUHJvcGVydHk6VXQuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHksZGF0YU5hbWVzOltVdC5kZWZhdWx0LmRhdGFdLGRhdGFQYXRoQXJyOltRZS5uaWxdLGRhdGFMZXZlbDowLGRhdGFUeXBlczpbXSxkZWZpbmVkUHJvcGVydGllczpuZXcgU2V0LHRvcFNjaGVtYVJlZjpvLnNjb3BlVmFsdWUoInNjaGVtYSIsdGhpcy5vcHRzLmNvZGUuc291cmNlPT09ITA/e3JlZjplLnNjaGVtYSxjb2RlOigwLFFlLnN0cmluZ2lmeSkoZS5zY2hlbWEpfTp7cmVmOmUuc2NoZW1hfSksdmFsaWRhdGVOYW1lOmYsVmFsaWRhdGlvbkVycm9yOmwsc2NoZW1hOmUuc2NoZW1hLHNjaGVtYUVudjplLHJvb3RJZDpyLGJhc2VJZDplLmJhc2VJZHx8cixzY2hlbWFQYXRoOlFlLm5pbCxlcnJTY2hlbWFQYXRoOmUuc2NoZW1hUGF0aHx8KHRoaXMub3B0cy5qdGQ/IiI6IiMiKSxlcnJvclBhdGg6KDAsUWUuXylgIiJgLG9wdHM6dGhpcy5vcHRzLHNlbGY6dGhpc307bGV0IGk7dHJ5e3RoaXMuX2NvbXBpbGF0aW9ucy5hZGQoZSksKDAsa3UudmFsaWRhdGVGdW5jdGlvbkNvZGUpKHApLG8ub3B0aW1pemUodGhpcy5vcHRzLmNvZGUub3B0aW1pemUpO2NvbnN0IGg9by50b1N0cmluZygpO2k9YCR7by5zY29wZVJlZnMoVXQuZGVmYXVsdC5zY29wZSl9cmV0dXJuICR7aH1gLHRoaXMub3B0cy5jb2RlLnByb2Nlc3MmJihpPXRoaXMub3B0cy5jb2RlLnByb2Nlc3MoaSxlKSk7Y29uc3QgVD1uZXcgRnVuY3Rpb24oYCR7VXQuZGVmYXVsdC5zZWxmfWAsYCR7VXQuZGVmYXVsdC5zY29wZX1gLGkpKHRoaXMsdGhpcy5zY29wZS5nZXQoKSk7aWYodGhpcy5zY29wZS52YWx1ZShmLHtyZWY6VH0pLFQuZXJyb3JzPW51bGwsVC5zY2hlbWE9ZS5zY2hlbWEsVC5zY2hlbWFFbnY9ZSxlLiRhc3luYyYmKFQuJGFzeW5jPSEwKSx0aGlzLm9wdHMuY29kZS5zb3VyY2U9PT0hMCYmKFQuc291cmNlPXt2YWxpZGF0ZU5hbWU6Zix2YWxpZGF0ZUNvZGU6aCxzY29wZVZhbHVlczpvLl92YWx1ZXN9KSx0aGlzLm9wdHMudW5ldmFsdWF0ZWQpe2NvbnN0e3Byb3BzOkksaXRlbXM6an09cDtULmV2YWx1YXRlZD17cHJvcHM6SSBpbnN0YW5jZW9mIFFlLk5hbWU/dm9pZCAwOkksaXRlbXM6aiBpbnN0YW5jZW9mIFFlLk5hbWU/dm9pZCAwOmosZHluYW1pY1Byb3BzOkkgaW5zdGFuY2VvZiBRZS5OYW1lLGR5bmFtaWNJdGVtczpqIGluc3RhbmNlb2YgUWUuTmFtZX0sVC5zb3VyY2UmJihULnNvdXJjZS5ldmFsdWF0ZWQ9KDAsUWUuc3RyaW5naWZ5KShULmV2YWx1YXRlZCkpfXJldHVybiBlLnZhbGlkYXRlPVQsZX1jYXRjaChoKXt0aHJvdyBkZWxldGUgZS52YWxpZGF0ZSxkZWxldGUgZS52YWxpZGF0ZU5hbWUsaSYmdGhpcy5sb2dnZXIuZXJyb3IoIkVycm9yIGNvbXBpbGluZyBzY2hlbWEsIGZ1bmN0aW9uIGNvZGU6IixpKSxofWZpbmFsbHl7dGhpcy5fY29tcGlsYXRpb25zLmRlbGV0ZShlKX19Q2UuY29tcGlsZVNjaGVtYT1YbjtmdW5jdGlvbiBVdShlLHQscil7dmFyIG47cj0oMCxZZS5yZXNvbHZlVXJsKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsdCxyKTtjb25zdCBzPWUucmVmc1tyXTtpZihzKXJldHVybiBzO2xldCBhPUx1LmNhbGwodGhpcyxlLHIpO2lmKGE9PT12b2lkIDApe2NvbnN0IG89KG49ZS5sb2NhbFJlZnMpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bltyXSx7c2NoZW1hSWQ6bH09dGhpcy5vcHRzO28mJihhPW5ldyB1bih7c2NoZW1hOm8sc2NoZW1hSWQ6bCxyb290OmUsYmFzZUlkOnR9KSl9aWYoYSE9PXZvaWQgMClyZXR1cm4gZS5yZWZzW3JdPUZ1LmNhbGwodGhpcyxhKX1DZS5yZXNvbHZlUmVmPVV1O2Z1bmN0aW9uIEZ1KGUpe3JldHVybigwLFllLmlubGluZVJlZikoZS5zY2hlbWEsdGhpcy5vcHRzLmlubGluZVJlZnMpP2Uuc2NoZW1hOmUudmFsaWRhdGU/ZTpYbi5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gSWEoZSl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fY29tcGlsYXRpb25zKWlmKE11KHQsZSkpcmV0dXJuIHR9Q2UuZ2V0Q29tcGlsaW5nU2NoZW1hPUlhO2Z1bmN0aW9uIE11KGUsdCl7cmV0dXJuIGUuc2NoZW1hPT09dC5zY2hlbWEmJmUucm9vdD09PXQucm9vdCYmZS5iYXNlSWQ9PT10LmJhc2VJZH1mdW5jdGlvbiBMdShlLHQpe2xldCByO2Zvcig7dHlwZW9mKHI9dGhpcy5yZWZzW3RdKT09InN0cmluZyI7KXQ9cjtyZXR1cm4gcnx8dGhpcy5zY2hlbWFzW3RdfHxsbi5jYWxsKHRoaXMsZSx0KX1mdW5jdGlvbiBsbihlLHQpe2NvbnN0IHI9dGhpcy5vcHRzLnVyaVJlc29sdmVyLnBhcnNlKHQpLG49KDAsWWUuX2dldEZ1bGxQYXRoKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIscik7bGV0IHM9KDAsWWUuZ2V0RnVsbFBhdGgpKHRoaXMub3B0cy51cmlSZXNvbHZlcixlLmJhc2VJZCx2b2lkIDApO2lmKE9iamVjdC5rZXlzKGUuc2NoZW1hKS5sZW5ndGg+MCYmbj09PXMpcmV0dXJuIFpuLmNhbGwodGhpcyxyLGUpO2NvbnN0IGE9KDAsWWUubm9ybWFsaXplSWQpKG4pLG89dGhpcy5yZWZzW2FdfHx0aGlzLnNjaGVtYXNbYV07aWYodHlwZW9mIG89PSJzdHJpbmciKXtjb25zdCBsPWxuLmNhbGwodGhpcyxlLG8pO3JldHVybiB0eXBlb2YobD09bnVsbD92b2lkIDA6bC5zY2hlbWEpIT0ib2JqZWN0Ij92b2lkIDA6Wm4uY2FsbCh0aGlzLHIsbCl9aWYodHlwZW9mKG89PW51bGw/dm9pZCAwOm8uc2NoZW1hKT09Im9iamVjdCIpe2lmKG8udmFsaWRhdGV8fFhuLmNhbGwodGhpcyxvKSxhPT09KDAsWWUubm9ybWFsaXplSWQpKHQpKXtjb25zdHtzY2hlbWE6bH09byx7c2NoZW1hSWQ6Zn09dGhpcy5vcHRzLHA9bFtmXTtyZXR1cm4gcCYmKHM9KDAsWWUucmVzb2x2ZVVybCkodGhpcy5vcHRzLnVyaVJlc29sdmVyLHMscCkpLG5ldyB1bih7c2NoZW1hOmwsc2NoZW1hSWQ6Zixyb290OmUsYmFzZUlkOnN9KX1yZXR1cm4gWm4uY2FsbCh0aGlzLHIsbyl9fUNlLnJlc29sdmVTY2hlbWE9bG47Y29uc3QgVnU9bmV3IFNldChbInByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsImVudW0iLCJkZXBlbmRlbmNpZXMiLCJkZWZpbml0aW9ucyJdKTtmdW5jdGlvbiBabihlLHtiYXNlSWQ6dCxzY2hlbWE6cixyb290Om59KXt2YXIgcztpZigoKHM9ZS5mcmFnbWVudCk9PT1udWxsfHxzPT09dm9pZCAwP3ZvaWQgMDpzWzBdKSE9PSIvIilyZXR1cm47Zm9yKGNvbnN0IGwgb2YgZS5mcmFnbWVudC5zbGljZSgxKS5zcGxpdCgiLyIpKXtpZih0eXBlb2Ygcj09ImJvb2xlYW4iKXJldHVybjtjb25zdCBmPXJbKDAsQ2EudW5lc2NhcGVGcmFnbWVudCkobCldO2lmKGY9PT12b2lkIDApcmV0dXJuO3I9Zjtjb25zdCBwPXR5cGVvZiByPT0ib2JqZWN0IiYmclt0aGlzLm9wdHMuc2NoZW1hSWRdOyFWdS5oYXMobCkmJnAmJih0PSgwLFllLnJlc29sdmVVcmwpKHRoaXMub3B0cy51cmlSZXNvbHZlcix0LHApKX1sZXQgYTtpZih0eXBlb2YgciE9ImJvb2xlYW4iJiZyLiRyZWYmJiEoMCxDYS5zY2hlbWFIYXNSdWxlc0J1dFJlZikocix0aGlzLlJVTEVTKSl7Y29uc3QgbD0oMCxZZS5yZXNvbHZlVXJsKSh0aGlzLm9wdHMudXJpUmVzb2x2ZXIsdCxyLiRyZWYpO2E9bG4uY2FsbCh0aGlzLG4sbCl9Y29uc3R7c2NoZW1hSWQ6b309dGhpcy5vcHRzO2lmKGE9YXx8bmV3IHVuKHtzY2hlbWE6cixzY2hlbWFJZDpvLHJvb3Q6bixiYXNlSWQ6dH0pLGEuc2NoZW1hIT09YS5yb290LnNjaGVtYSlyZXR1cm4gYX12YXIgenU9eyRpZDoiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fqdi12YWxpZGF0b3IvYWp2L21hc3Rlci9saWIvcmVmcy9kYXRhLmpzb24jIixkZXNjcmlwdGlvbjoiTWV0YS1zY2hlbWEgZm9yICRkYXRhIHJlZmVyZW5jZSAoSlNPTiBBbnlTY2hlbWEgZXh0ZW5zaW9uIHByb3Bvc2FsKSIsdHlwZToib2JqZWN0IixyZXF1aXJlZDpbIiRkYXRhIl0scHJvcGVydGllczp7JGRhdGE6e3R5cGU6InN0cmluZyIsYW55T2Y6W3tmb3JtYXQ6InJlbGF0aXZlLWpzb24tcG9pbnRlciJ9LHtmb3JtYXQ6Impzb24tcG9pbnRlciJ9XX19LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiExfSx4bj17fSxlcz17ZXhwb3J0czp7fX07LyoqIEBsaWNlbnNlIFVSSS5qcyB2NC40LjEgKGMpIDIwMTEgR2FyeSBDb3VydC4gTGljZW5zZTogaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L3VyaS1qcyAqLyhmdW5jdGlvbihlLHQpeyhmdW5jdGlvbihyLG4pe24odCl9KShlZSxmdW5jdGlvbihyKXtmdW5jdGlvbiBuKCl7Zm9yKHZhciBkPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShkKSx2PTA7djxkO3YrKyl1W3ZdPWFyZ3VtZW50c1t2XTtpZih1Lmxlbmd0aD4xKXt1WzBdPXVbMF0uc2xpY2UoMCwtMSk7Zm9yKHZhciBSPXUubGVuZ3RoLTEsUz0xO1M8UjsrK1MpdVtTXT11W1NdLnNsaWNlKDEsLTEpO3JldHVybiB1W1JdPXVbUl0uc2xpY2UoMSksdS5qb2luKCIiKX1lbHNlIHJldHVybiB1WzBdfWZ1bmN0aW9uIHMoZCl7cmV0dXJuIig/OiIrZCsiKSJ9ZnVuY3Rpb24gYShkKXtyZXR1cm4gZD09PXZvaWQgMD8idW5kZWZpbmVkIjpkPT09bnVsbD8ibnVsbCI6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGQpLnNwbGl0KCIgIikucG9wKCkuc3BsaXQoIl0iKS5zaGlmdCgpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbyhkKXtyZXR1cm4gZC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIGwoZCl7cmV0dXJuIGQhPW51bGw/ZCBpbnN0YW5jZW9mIEFycmF5P2Q6dHlwZW9mIGQubGVuZ3RoIT0ibnVtYmVyInx8ZC5zcGxpdHx8ZC5zZXRJbnRlcnZhbHx8ZC5jYWxsP1tkXTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkKTpbXX1mdW5jdGlvbiBmKGQsdSl7dmFyIHY9ZDtpZih1KWZvcih2YXIgUiBpbiB1KXZbUl09dVtSXTtyZXR1cm4gdn1mdW5jdGlvbiBwKGQpe3ZhciB1PSJbQS1aYS16XSIsdj0iWzAtOV0iLFI9bih2LCJbQS1GYS1mXSIpLFM9cyhzKCIlW0VGZWZdIitSKyIlIitSK1IrIiUiK1IrUikrInwiK3MoIiVbODlBLUZhLWZdIitSKyIlIitSK1IpKyJ8IitzKCIlIitSK1IpKSx6PSJbXFw6XFwvXFw/XFwjXFxbXFxdXFxAXSIsSz0iW1xcIVxcJFxcJlxcJ1xcKFxcKVxcKlxcK1xcLFxcO1xcPV0iLHNlPW4oeixLKSxtZT1kPyJbXFx4QTAtXFx1MjAwRFxcdTIwMTAtXFx1MjAyOVxcdTIwMkYtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0iOiJbXSIsJGU9ZD8iW1xcdUUwMDAtXFx1RjhGRl0iOiJbXSIseD1uKHUsdiwiW1xcLVxcLlxcX1xcfl0iLG1lKTtzKHUrbih1LHYsIltcXCtcXC1cXC5dIikrIioiKSxzKHMoUysifCIrbih4LEssIltcXDpdIikpKyIqIik7dmFyIGZlPXMocygiMjVbMC01XSIpKyJ8IitzKCIyWzAtNF0iK3YpKyJ8IitzKCIxIit2K3YpKyJ8IitzKCIwP1sxLTldIit2KSsifDA/MD8iK3YpLHdlPXMoZmUrIlxcLiIrZmUrIlxcLiIrZmUrIlxcLiIrZmUpLHE9cyhSKyJ7MSw0fSIpLF9lPXMocyhxKyJcXDoiK3EpKyJ8Iit3ZSksUmU9cyhzKHErIlxcOiIpKyJ7Nn0iK19lKSxnZT1zKCJcXDpcXDoiK3MocSsiXFw6IikrIns1fSIrX2UpLFB0PXMocyhxKSsiP1xcOlxcOiIrcyhxKyJcXDoiKSsiezR9IitfZSksYXQ9cyhzKHMocSsiXFw6IikrInswLDF9IitxKSsiP1xcOlxcOiIrcyhxKyJcXDoiKSsiezN9IitfZSksb3Q9cyhzKHMocSsiXFw6IikrInswLDJ9IitxKSsiP1xcOlxcOiIrcyhxKyJcXDoiKSsiezJ9IitfZSksdnI9cyhzKHMocSsiXFw6IikrInswLDN9IitxKSsiP1xcOlxcOiIrcSsiXFw6IitfZSkscXQ9cyhzKHMocSsiXFw6IikrInswLDR9IitxKSsiP1xcOlxcOiIrX2UpLHFlPXMocyhzKHErIlxcOiIpKyJ7MCw1fSIrcSkrIj9cXDpcXDoiK3EpLGl0PXMocyhzKHErIlxcOiIpKyJ7MCw2fSIrcSkrIj9cXDpcXDoiKSxHdD1zKFtSZSxnZSxQdCxhdCxvdCx2cixxdCxxZSxpdF0uam9pbigifCIpKSxfdD1zKHMoeCsifCIrUykrIisiKTtzKCJbdlZdIitSKyIrXFwuIituKHgsSywiW1xcOl0iKSsiKyIpLHMocyhTKyJ8IituKHgsSykpKyIqIik7dmFyIEJyPXMoUysifCIrbih4LEssIltcXDpcXEBdIikpO3JldHVybiBzKHMoUysifCIrbih4LEssIltcXEBdIikpKyIrIikscyhzKEJyKyJ8IituKCJbXFwvXFw/XSIsJGUpKSsiKiIpLHtOT1RfU0NIRU1FOm5ldyBSZWdFeHAobigiW15dIix1LHYsIltcXCtcXC1cXC5dIiksImciKSxOT1RfVVNFUklORk86bmV3IFJlZ0V4cChuKCJbXlxcJVxcOl0iLHgsSyksImciKSxOT1RfSE9TVDpuZXcgUmVnRXhwKG4oIlteXFwlXFxbXFxdXFw6XSIseCxLKSwiZyIpLE5PVF9QQVRIOm5ldyBSZWdFeHAobigiW15cXCVcXC9cXDpcXEBdIix4LEspLCJnIiksTk9UX1BBVEhfTk9TQ0hFTUU6bmV3IFJlZ0V4cChuKCJbXlxcJVxcL1xcQF0iLHgsSyksImciKSxOT1RfUVVFUlk6bmV3IFJlZ0V4cChuKCJbXlxcJV0iLHgsSywiW1xcOlxcQFxcL1xcP10iLCRlKSwiZyIpLE5PVF9GUkFHTUVOVDpuZXcgUmVnRXhwKG4oIlteXFwlXSIseCxLLCJbXFw6XFxAXFwvXFw/XSIpLCJnIiksRVNDQVBFOm5ldyBSZWdFeHAobigiW15dIix4LEspLCJnIiksVU5SRVNFUlZFRDpuZXcgUmVnRXhwKHgsImciKSxPVEhFUl9DSEFSUzpuZXcgUmVnRXhwKG4oIlteXFwlXSIseCxzZSksImciKSxQQ1RfRU5DT0RFRDpuZXcgUmVnRXhwKFMsImciKSxJUFY0QUREUkVTUzpuZXcgUmVnRXhwKCJeKCIrd2UrIikkIiksSVBWNkFERFJFU1M6bmV3IFJlZ0V4cCgiXlxcWz8oIitHdCsiKSIrcyhzKCJcXCUyNXxcXCUoPyEiK1IrInsyfSkiKSsiKCIrX3QrIikiKSsiP1xcXT8kIil9fXZhciBpPXAoITEpLGg9cCghMCksRT1mdW5jdGlvbigpe2Z1bmN0aW9uIGQodSx2KXt2YXIgUj1bXSxTPSEwLHo9ITEsSz12b2lkIDA7dHJ5e2Zvcih2YXIgc2U9dVtTeW1ib2wuaXRlcmF0b3JdKCksbWU7IShTPShtZT1zZS5uZXh0KCkpLmRvbmUpJiYoUi5wdXNoKG1lLnZhbHVlKSwhKHYmJlIubGVuZ3RoPT09dikpO1M9ITApO31jYXRjaCgkZSl7ej0hMCxLPSRlfWZpbmFsbHl7dHJ5eyFTJiZzZS5yZXR1cm4mJnNlLnJldHVybigpfWZpbmFsbHl7aWYoeil0aHJvdyBLfX1yZXR1cm4gUn1yZXR1cm4gZnVuY3Rpb24odSx2KXtpZihBcnJheS5pc0FycmF5KHUpKXJldHVybiB1O2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodSkpcmV0dXJuIGQodSx2KTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlIil9fSgpLFQ9ZnVuY3Rpb24oZCl7aWYoQXJyYXkuaXNBcnJheShkKSl7Zm9yKHZhciB1PTAsdj1BcnJheShkLmxlbmd0aCk7dTxkLmxlbmd0aDt1Kyspdlt1XT1kW3VdO3JldHVybiB2fWVsc2UgcmV0dXJuIEFycmF5LmZyb20oZCl9LEk9MjE0NzQ4MzY0NyxqPTM2LHk9MSxfPTI2LGI9MzgsTz03MDAsQT03MixIPTEyOCwkPSItIixOPS9eeG4tLS8sRD0vW15cMC1ceDdFXS8sQj0vW1x4MkVcdTMwMDJcdUZGMEVcdUZGNjFdL2csRz17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0scGU9ai15LFc9TWF0aC5mbG9vcixvZT1TdHJpbmcuZnJvbUNoYXJDb2RlO2Z1bmN0aW9uIFgoZCl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoR1tkXSl9ZnVuY3Rpb24gdmUoZCx1KXtmb3IodmFyIHY9W10sUj1kLmxlbmd0aDtSLS07KXZbUl09dShkW1JdKTtyZXR1cm4gdn1mdW5jdGlvbiBFZShkLHUpe3ZhciB2PWQuc3BsaXQoIkAiKSxSPSIiO3YubGVuZ3RoPjEmJihSPXZbMF0rIkAiLGQ9dlsxXSksZD1kLnJlcGxhY2UoQiwiLiIpO3ZhciBTPWQuc3BsaXQoIi4iKSx6PXZlKFMsdSkuam9pbigiLiIpO3JldHVybiBSK3p9ZnVuY3Rpb24gTmUoZCl7Zm9yKHZhciB1PVtdLHY9MCxSPWQubGVuZ3RoO3Y8Ujspe3ZhciBTPWQuY2hhckNvZGVBdCh2KyspO2lmKFM+PTU1Mjk2JiZTPD01NjMxOSYmdjxSKXt2YXIgej1kLmNoYXJDb2RlQXQodisrKTsoeiY2NDUxMik9PTU2MzIwP3UucHVzaCgoKFMmMTAyMyk8PDEwKSsoeiYxMDIzKSs2NTUzNik6KHUucHVzaChTKSx2LS0pfWVsc2UgdS5wdXNoKFMpfXJldHVybiB1fXZhciBCZT1mdW5jdGlvbih1KXtyZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQuYXBwbHkoU3RyaW5nLFQodSkpfSx1cj1mdW5jdGlvbih1KXtyZXR1cm4gdS00ODwxMD91LTIyOnUtNjU8MjY/dS02NTp1LTk3PDI2P3UtOTc6an0saz1mdW5jdGlvbih1LHYpe3JldHVybiB1KzIyKzc1Kih1PDI2KS0oKHYhPTApPDw1KX0sZz1mdW5jdGlvbih1LHYsUil7dmFyIFM9MDtmb3IodT1SP1codS9PKTp1Pj4xLHUrPVcodS92KTt1PnBlKl8+PjE7Uys9ail1PVcodS9wZSk7cmV0dXJuIFcoUysocGUrMSkqdS8odStiKSl9LEM9ZnVuY3Rpb24odSl7dmFyIHY9W10sUj11Lmxlbmd0aCxTPTAsej1ILEs9QSxzZT11Lmxhc3RJbmRleE9mKCQpO3NlPDAmJihzZT0wKTtmb3IodmFyIG1lPTA7bWU8c2U7KyttZSl1LmNoYXJDb2RlQXQobWUpPj0xMjgmJlgoIm5vdC1iYXNpYyIpLHYucHVzaCh1LmNoYXJDb2RlQXQobWUpKTtmb3IodmFyICRlPXNlPjA/c2UrMTowOyRlPFI7KXtmb3IodmFyIHg9UyxmZT0xLHdlPWo7O3dlKz1qKXskZT49UiYmWCgiaW52YWxpZC1pbnB1dCIpO3ZhciBxPXVyKHUuY2hhckNvZGVBdCgkZSsrKSk7KHE+PWp8fHE+VygoSS1TKS9mZSkpJiZYKCJvdmVyZmxvdyIpLFMrPXEqZmU7dmFyIF9lPXdlPD1LP3k6d2U+PUsrXz9fOndlLUs7aWYocTxfZSlicmVhazt2YXIgUmU9ai1fZTtmZT5XKEkvUmUpJiZYKCJvdmVyZmxvdyIpLGZlKj1SZX12YXIgZ2U9di5sZW5ndGgrMTtLPWcoUy14LGdlLHg9PTApLFcoUy9nZSk+SS16JiZYKCJvdmVyZmxvdyIpLHorPVcoUy9nZSksUyU9Z2Usdi5zcGxpY2UoUysrLDAseil9cmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZyx2KX0sdz1mdW5jdGlvbih1KXt2YXIgdj1bXTt1PU5lKHUpO3ZhciBSPXUubGVuZ3RoLFM9SCx6PTAsSz1BLHNlPSEwLG1lPSExLCRlPXZvaWQgMDt0cnl7Zm9yKHZhciB4PXVbU3ltYm9sLml0ZXJhdG9yXSgpLGZlOyEoc2U9KGZlPXgubmV4dCgpKS5kb25lKTtzZT0hMCl7dmFyIHdlPWZlLnZhbHVlO3dlPDEyOCYmdi5wdXNoKG9lKHdlKSl9fWNhdGNoKEpyKXttZT0hMCwkZT1Kcn1maW5hbGx5e3RyeXshc2UmJngucmV0dXJuJiZ4LnJldHVybigpfWZpbmFsbHl7aWYobWUpdGhyb3cgJGV9fXZhciBxPXYubGVuZ3RoLF9lPXE7Zm9yKHEmJnYucHVzaCgkKTtfZTxSOyl7dmFyIFJlPUksZ2U9ITAsUHQ9ITEsYXQ9dm9pZCAwO3RyeXtmb3IodmFyIG90PXVbU3ltYm9sLml0ZXJhdG9yXSgpLHZyOyEoZ2U9KHZyPW90Lm5leHQoKSkuZG9uZSk7Z2U9ITApe3ZhciBxdD12ci52YWx1ZTtxdD49UyYmcXQ8UmUmJihSZT1xdCl9fWNhdGNoKEpyKXtQdD0hMCxhdD1Kcn1maW5hbGx5e3RyeXshZ2UmJm90LnJldHVybiYmb3QucmV0dXJuKCl9ZmluYWxseXtpZihQdCl0aHJvdyBhdH19dmFyIHFlPV9lKzE7UmUtUz5XKChJLXopL3FlKSYmWCgib3ZlcmZsb3ciKSx6Kz0oUmUtUykqcWUsUz1SZTt2YXIgaXQ9ITAsR3Q9ITEsX3Q9dm9pZCAwO3RyeXtmb3IodmFyIEJyPXVbU3ltYm9sLml0ZXJhdG9yXSgpLFVvOyEoaXQ9KFVvPUJyLm5leHQoKSkuZG9uZSk7aXQ9ITApe3ZhciBGbz1Vby52YWx1ZTtpZihGbzxTJiYrK3o+SSYmWCgib3ZlcmZsb3ciKSxGbz09Uyl7Zm9yKHZhciBTbj16LFJuPWo7O1JuKz1qKXt2YXIgYm49Um48PUs/eTpSbj49SytfP186Um4tSztpZihTbjxibilicmVhazt2YXIgTW89U24tYm4sTG89ai1ibjt2LnB1c2gob2UoayhibitNbyVMbywwKSkpLFNuPVcoTW8vTG8pfXYucHVzaChvZShrKFNuLDApKSksSz1nKHoscWUsX2U9PXEpLHo9MCwrK19lfX19Y2F0Y2goSnIpe0d0PSEwLF90PUpyfWZpbmFsbHl7dHJ5eyFpdCYmQnIucmV0dXJuJiZCci5yZXR1cm4oKX1maW5hbGx5e2lmKEd0KXRocm93IF90fX0rK3osKytTfXJldHVybiB2LmpvaW4oIiIpfSxjPWZ1bmN0aW9uKHUpe3JldHVybiBFZSh1LGZ1bmN0aW9uKHYpe3JldHVybiBOLnRlc3Qodik/Qyh2LnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpOnZ9KX0sbT1mdW5jdGlvbih1KXtyZXR1cm4gRWUodSxmdW5jdGlvbih2KXtyZXR1cm4gRC50ZXN0KHYpPyJ4bi0tIit3KHYpOnZ9KX0sUD17dmVyc2lvbjoiMi4xLjAiLHVjczI6e2RlY29kZTpOZSxlbmNvZGU6QmV9LGRlY29kZTpDLGVuY29kZTp3LHRvQVNDSUk6bSx0b1VuaWNvZGU6Y30sVT17fTtmdW5jdGlvbiBGKGQpe3ZhciB1PWQuY2hhckNvZGVBdCgwKSx2PXZvaWQgMDtyZXR1cm4gdTwxNj92PSIlMCIrdS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTp1PDEyOD92PSIlIit1LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOnU8MjA0OD92PSIlIisodT4+NnwxOTIpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyIlIisodSY2M3wxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOnY9IiUiKyh1Pj4xMnwyMjQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyIlIisodT4+NiY2M3wxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyIlIisodSY2M3wxMjgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHZ9ZnVuY3Rpb24gWihkKXtmb3IodmFyIHU9IiIsdj0wLFI9ZC5sZW5ndGg7djxSOyl7dmFyIFM9cGFyc2VJbnQoZC5zdWJzdHIodisxLDIpLDE2KTtpZihTPDEyOCl1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKFMpLHYrPTM7ZWxzZSBpZihTPj0xOTQmJlM8MjI0KXtpZihSLXY+PTYpe3ZhciB6PXBhcnNlSW50KGQuc3Vic3RyKHYrNCwyKSwxNik7dSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoUyYzMSk8PDZ8eiY2Myl9ZWxzZSB1Kz1kLnN1YnN0cih2LDYpO3YrPTZ9ZWxzZSBpZihTPj0yMjQpe2lmKFItdj49OSl7dmFyIEs9cGFyc2VJbnQoZC5zdWJzdHIodis0LDIpLDE2KSxzZT1wYXJzZUludChkLnN1YnN0cih2KzcsMiksMTYpO3UrPVN0cmluZy5mcm9tQ2hhckNvZGUoKFMmMTUpPDwxMnwoSyY2Myk8PDZ8c2UmNjMpfWVsc2UgdSs9ZC5zdWJzdHIodiw5KTt2Kz05fWVsc2UgdSs9ZC5zdWJzdHIodiwzKSx2Kz0zfXJldHVybiB1fWZ1bmN0aW9uIHJlKGQsdSl7ZnVuY3Rpb24gdihSKXt2YXIgUz1aKFIpO3JldHVybiBTLm1hdGNoKHUuVU5SRVNFUlZFRCk/UzpSfXJldHVybiBkLnNjaGVtZSYmKGQuc2NoZW1lPVN0cmluZyhkLnNjaGVtZSkucmVwbGFjZSh1LlBDVF9FTkNPREVELHYpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh1Lk5PVF9TQ0hFTUUsIiIpKSxkLnVzZXJpbmZvIT09dm9pZCAwJiYoZC51c2VyaW5mbz1TdHJpbmcoZC51c2VyaW5mbykucmVwbGFjZSh1LlBDVF9FTkNPREVELHYpLnJlcGxhY2UodS5OT1RfVVNFUklORk8sRikucmVwbGFjZSh1LlBDVF9FTkNPREVELG8pKSxkLmhvc3QhPT12b2lkIDAmJihkLmhvc3Q9U3RyaW5nKGQuaG9zdCkucmVwbGFjZSh1LlBDVF9FTkNPREVELHYpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh1Lk5PVF9IT1NULEYpLnJlcGxhY2UodS5QQ1RfRU5DT0RFRCxvKSksZC5wYXRoIT09dm9pZCAwJiYoZC5wYXRoPVN0cmluZyhkLnBhdGgpLnJlcGxhY2UodS5QQ1RfRU5DT0RFRCx2KS5yZXBsYWNlKGQuc2NoZW1lP3UuTk9UX1BBVEg6dS5OT1RfUEFUSF9OT1NDSEVNRSxGKS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsbykpLGQucXVlcnkhPT12b2lkIDAmJihkLnF1ZXJ5PVN0cmluZyhkLnF1ZXJ5KS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsdikucmVwbGFjZSh1Lk5PVF9RVUVSWSxGKS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsbykpLGQuZnJhZ21lbnQhPT12b2lkIDAmJihkLmZyYWdtZW50PVN0cmluZyhkLmZyYWdtZW50KS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsdikucmVwbGFjZSh1Lk5PVF9GUkFHTUVOVCxGKS5yZXBsYWNlKHUuUENUX0VOQ09ERUQsbykpLGR9ZnVuY3Rpb24geWUoZCl7cmV0dXJuIGQucmVwbGFjZSgvXjAqKC4qKS8sIiQxIil8fCIwIn1mdW5jdGlvbiBydChkLHUpe3ZhciB2PWQubWF0Y2godS5JUFY0QUREUkVTUyl8fFtdLFI9RSh2LDIpLFM9UlsxXTtyZXR1cm4gUz9TLnNwbGl0KCIuIikubWFwKHllKS5qb2luKCIuIik6ZH1mdW5jdGlvbiBscihkLHUpe3ZhciB2PWQubWF0Y2godS5JUFY2QUREUkVTUyl8fFtdLFI9RSh2LDMpLFM9UlsxXSx6PVJbMl07aWYoUyl7Zm9yKHZhciBLPVMudG9Mb3dlckNhc2UoKS5zcGxpdCgiOjoiKS5yZXZlcnNlKCksc2U9RShLLDIpLG1lPXNlWzBdLCRlPXNlWzFdLHg9JGU/JGUuc3BsaXQoIjoiKS5tYXAoeWUpOltdLGZlPW1lLnNwbGl0KCI6IikubWFwKHllKSx3ZT11LklQVjRBRERSRVNTLnRlc3QoZmVbZmUubGVuZ3RoLTFdKSxxPXdlPzc6OCxfZT1mZS5sZW5ndGgtcSxSZT1BcnJheShxKSxnZT0wO2dlPHE7KytnZSlSZVtnZV09eFtnZV18fGZlW19lK2dlXXx8IiI7d2UmJihSZVtxLTFdPXJ0KFJlW3EtMV0sdSkpO3ZhciBQdD1SZS5yZWR1Y2UoZnVuY3Rpb24ocWUsaXQsR3Qpe2lmKCFpdHx8aXQ9PT0iMCIpe3ZhciBfdD1xZVtxZS5sZW5ndGgtMV07X3QmJl90LmluZGV4K190Lmxlbmd0aD09PUd0P190Lmxlbmd0aCsrOnFlLnB1c2goe2luZGV4Okd0LGxlbmd0aDoxfSl9cmV0dXJuIHFlfSxbXSksYXQ9UHQuc29ydChmdW5jdGlvbihxZSxpdCl7cmV0dXJuIGl0Lmxlbmd0aC1xZS5sZW5ndGh9KVswXSxvdD12b2lkIDA7aWYoYXQmJmF0Lmxlbmd0aD4xKXt2YXIgdnI9UmUuc2xpY2UoMCxhdC5pbmRleCkscXQ9UmUuc2xpY2UoYXQuaW5kZXgrYXQubGVuZ3RoKTtvdD12ci5qb2luKCI6IikrIjo6IitxdC5qb2luKCI6Iil9ZWxzZSBvdD1SZS5qb2luKCI6Iik7cmV0dXJuIHomJihvdCs9IiUiK3opLG90fWVsc2UgcmV0dXJuIGR9dmFyIEZyPS9eKD86KFteOlwvPyNdKyk6KT8oPzpcL1wvKCg/OihbXlwvPyNAXSopQCk/KFxbW15cLz8jXF1dK1xdfFteXC8/IzpdKikoPzpcOihcZCopKT8pKT8oW14/I10qKSg/Olw/KFteI10qKSk/KD86IygoPzoufFxufFxyKSopKT8vaSxNcj0iIi5tYXRjaCgvKCl7MH0vKVsxXT09PXZvaWQgMDtmdW5jdGlvbiBNZShkKXt2YXIgdT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30sdj17fSxSPXUuaXJpIT09ITE/aDppO3UucmVmZXJlbmNlPT09InN1ZmZpeCImJihkPSh1LnNjaGVtZT91LnNjaGVtZSsiOiI6IiIpKyIvLyIrZCk7dmFyIFM9ZC5tYXRjaChGcik7aWYoUyl7TXI/KHYuc2NoZW1lPVNbMV0sdi51c2VyaW5mbz1TWzNdLHYuaG9zdD1TWzRdLHYucG9ydD1wYXJzZUludChTWzVdLDEwKSx2LnBhdGg9U1s2XXx8IiIsdi5xdWVyeT1TWzddLHYuZnJhZ21lbnQ9U1s4XSxpc05hTih2LnBvcnQpJiYodi5wb3J0PVNbNV0pKToodi5zY2hlbWU9U1sxXXx8dm9pZCAwLHYudXNlcmluZm89ZC5pbmRleE9mKCJAIikhPT0tMT9TWzNdOnZvaWQgMCx2Lmhvc3Q9ZC5pbmRleE9mKCIvLyIpIT09LTE/U1s0XTp2b2lkIDAsdi5wb3J0PXBhcnNlSW50KFNbNV0sMTApLHYucGF0aD1TWzZdfHwiIix2LnF1ZXJ5PWQuaW5kZXhPZigiPyIpIT09LTE/U1s3XTp2b2lkIDAsdi5mcmFnbWVudD1kLmluZGV4T2YoIiMiKSE9PS0xP1NbOF06dm9pZCAwLGlzTmFOKHYucG9ydCkmJih2LnBvcnQ9ZC5tYXRjaCgvXC9cLyg/Oi58XG4pKlw6KD86XC98XD98XCN8JCkvKT9TWzRdOnZvaWQgMCkpLHYuaG9zdCYmKHYuaG9zdD1scihydCh2Lmhvc3QsUiksUikpLHYuc2NoZW1lPT09dm9pZCAwJiZ2LnVzZXJpbmZvPT09dm9pZCAwJiZ2Lmhvc3Q9PT12b2lkIDAmJnYucG9ydD09PXZvaWQgMCYmIXYucGF0aCYmdi5xdWVyeT09PXZvaWQgMD92LnJlZmVyZW5jZT0ic2FtZS1kb2N1bWVudCI6di5zY2hlbWU9PT12b2lkIDA/di5yZWZlcmVuY2U9InJlbGF0aXZlIjp2LmZyYWdtZW50PT09dm9pZCAwP3YucmVmZXJlbmNlPSJhYnNvbHV0ZSI6di5yZWZlcmVuY2U9InVyaSIsdS5yZWZlcmVuY2UmJnUucmVmZXJlbmNlIT09InN1ZmZpeCImJnUucmVmZXJlbmNlIT09di5yZWZlcmVuY2UmJih2LmVycm9yPXYuZXJyb3J8fCJVUkkgaXMgbm90IGEgIit1LnJlZmVyZW5jZSsiIHJlZmVyZW5jZS4iKTt2YXIgej1VWyh1LnNjaGVtZXx8di5zY2hlbWV8fCIiKS50b0xvd2VyQ2FzZSgpXTtpZighdS51bmljb2RlU3VwcG9ydCYmKCF6fHwhei51bmljb2RlU3VwcG9ydCkpe2lmKHYuaG9zdCYmKHUuZG9tYWluSG9zdHx8eiYmei5kb21haW5Ib3N0KSl0cnl7di5ob3N0PVAudG9BU0NJSSh2Lmhvc3QucmVwbGFjZShSLlBDVF9FTkNPREVELFopLnRvTG93ZXJDYXNlKCkpfWNhdGNoKEspe3YuZXJyb3I9di5lcnJvcnx8Ikhvc3QncyBkb21haW4gbmFtZSBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBBU0NJSSB2aWEgcHVueWNvZGU6ICIrS31yZSh2LGkpfWVsc2UgcmUodixSKTt6JiZ6LnBhcnNlJiZ6LnBhcnNlKHYsdSl9ZWxzZSB2LmVycm9yPXYuZXJyb3J8fCJVUkkgY2FuIG5vdCBiZSBwYXJzZWQuIjtyZXR1cm4gdn1mdW5jdGlvbiBMcihkLHUpe3ZhciB2PXUuaXJpIT09ITE/aDppLFI9W107cmV0dXJuIGQudXNlcmluZm8hPT12b2lkIDAmJihSLnB1c2goZC51c2VyaW5mbyksUi5wdXNoKCJAIikpLGQuaG9zdCE9PXZvaWQgMCYmUi5wdXNoKGxyKHJ0KFN0cmluZyhkLmhvc3QpLHYpLHYpLnJlcGxhY2Uodi5JUFY2QUREUkVTUyxmdW5jdGlvbihTLHosSyl7cmV0dXJuIlsiK3orKEs/IiUyNSIrSzoiIikrIl0ifSkpLCh0eXBlb2YgZC5wb3J0PT0ibnVtYmVyInx8dHlwZW9mIGQucG9ydD09InN0cmluZyIpJiYoUi5wdXNoKCI6IiksUi5wdXNoKFN0cmluZyhkLnBvcnQpKSksUi5sZW5ndGg/Ui5qb2luKCIiKTp2b2lkIDB9dmFyIGZyPS9eXC5cLj9cLy8sZHI9L15cL1wuKFwvfCQpLyxocj0vXlwvXC5cLihcL3wkKS8sVnI9L15cLz8oPzoufFxuKSo/KD89XC98JCkvO2Z1bmN0aW9uIG50KGQpe2Zvcih2YXIgdT1bXTtkLmxlbmd0aDspaWYoZC5tYXRjaChmcikpZD1kLnJlcGxhY2UoZnIsIiIpO2Vsc2UgaWYoZC5tYXRjaChkcikpZD1kLnJlcGxhY2UoZHIsIi8iKTtlbHNlIGlmKGQubWF0Y2goaHIpKWQ9ZC5yZXBsYWNlKGhyLCIvIiksdS5wb3AoKTtlbHNlIGlmKGQ9PT0iLiJ8fGQ9PT0iLi4iKWQ9IiI7ZWxzZXt2YXIgdj1kLm1hdGNoKFZyKTtpZih2KXt2YXIgUj12WzBdO2Q9ZC5zbGljZShSLmxlbmd0aCksdS5wdXNoKFIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGRvdCBzZWdtZW50IGNvbmRpdGlvbiIpfXJldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIGtlKGQpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSx2PXUuaXJpP2g6aSxSPVtdLFM9VVsodS5zY2hlbWV8fGQuc2NoZW1lfHwiIikudG9Mb3dlckNhc2UoKV07aWYoUyYmUy5zZXJpYWxpemUmJlMuc2VyaWFsaXplKGQsdSksZC5ob3N0JiYhdi5JUFY2QUREUkVTUy50ZXN0KGQuaG9zdCkpe2lmKHUuZG9tYWluSG9zdHx8UyYmUy5kb21haW5Ib3N0KXRyeXtkLmhvc3Q9dS5pcmk/UC50b1VuaWNvZGUoZC5ob3N0KTpQLnRvQVNDSUkoZC5ob3N0LnJlcGxhY2Uodi5QQ1RfRU5DT0RFRCxaKS50b0xvd2VyQ2FzZSgpKX1jYXRjaChzZSl7ZC5lcnJvcj1kLmVycm9yfHwiSG9zdCdzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvICIrKHUuaXJpPyJVbmljb2RlIjoiQVNDSUkiKSsiIHZpYSBwdW55Y29kZTogIitzZX19cmUoZCx2KSx1LnJlZmVyZW5jZSE9PSJzdWZmaXgiJiZkLnNjaGVtZSYmKFIucHVzaChkLnNjaGVtZSksUi5wdXNoKCI6IikpO3ZhciB6PUxyKGQsdSk7aWYoeiE9PXZvaWQgMCYmKHUucmVmZXJlbmNlIT09InN1ZmZpeCImJlIucHVzaCgiLy8iKSxSLnB1c2goeiksZC5wYXRoJiZkLnBhdGguY2hhckF0KDApIT09Ii8iJiZSLnB1c2goIi8iKSksZC5wYXRoIT09dm9pZCAwKXt2YXIgSz1kLnBhdGg7IXUuYWJzb2x1dGVQYXRoJiYoIVN8fCFTLmFic29sdXRlUGF0aCkmJihLPW50KEspKSx6PT09dm9pZCAwJiYoSz1LLnJlcGxhY2UoL15cL1wvLywiLyUyRiIpKSxSLnB1c2goSyl9cmV0dXJuIGQucXVlcnkhPT12b2lkIDAmJihSLnB1c2goIj8iKSxSLnB1c2goZC5xdWVyeSkpLGQuZnJhZ21lbnQhPT12b2lkIDAmJihSLnB1c2goIiMiKSxSLnB1c2goZC5mcmFnbWVudCkpLFIuam9pbigiIil9ZnVuY3Rpb24gcHIoZCx1KXt2YXIgdj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06e30sUj1hcmd1bWVudHNbM10sUz17fTtyZXR1cm4gUnx8KGQ9TWUoa2UoZCx2KSx2KSx1PU1lKGtlKHUsdiksdikpLHY9dnx8e30sIXYudG9sZXJhbnQmJnUuc2NoZW1lPyhTLnNjaGVtZT11LnNjaGVtZSxTLnVzZXJpbmZvPXUudXNlcmluZm8sUy5ob3N0PXUuaG9zdCxTLnBvcnQ9dS5wb3J0LFMucGF0aD1udCh1LnBhdGh8fCIiKSxTLnF1ZXJ5PXUucXVlcnkpOih1LnVzZXJpbmZvIT09dm9pZCAwfHx1Lmhvc3QhPT12b2lkIDB8fHUucG9ydCE9PXZvaWQgMD8oUy51c2VyaW5mbz11LnVzZXJpbmZvLFMuaG9zdD11Lmhvc3QsUy5wb3J0PXUucG9ydCxTLnBhdGg9bnQodS5wYXRofHwiIiksUy5xdWVyeT11LnF1ZXJ5KToodS5wYXRoPyh1LnBhdGguY2hhckF0KDApPT09Ii8iP1MucGF0aD1udCh1LnBhdGgpOigoZC51c2VyaW5mbyE9PXZvaWQgMHx8ZC5ob3N0IT09dm9pZCAwfHxkLnBvcnQhPT12b2lkIDApJiYhZC5wYXRoP1MucGF0aD0iLyIrdS5wYXRoOmQucGF0aD9TLnBhdGg9ZC5wYXRoLnNsaWNlKDAsZC5wYXRoLmxhc3RJbmRleE9mKCIvIikrMSkrdS5wYXRoOlMucGF0aD11LnBhdGgsUy5wYXRoPW50KFMucGF0aCkpLFMucXVlcnk9dS5xdWVyeSk6KFMucGF0aD1kLnBhdGgsdS5xdWVyeSE9PXZvaWQgMD9TLnF1ZXJ5PXUucXVlcnk6Uy5xdWVyeT1kLnF1ZXJ5KSxTLnVzZXJpbmZvPWQudXNlcmluZm8sUy5ob3N0PWQuaG9zdCxTLnBvcnQ9ZC5wb3J0KSxTLnNjaGVtZT1kLnNjaGVtZSksUy5mcmFnbWVudD11LmZyYWdtZW50LFN9ZnVuY3Rpb24genIoZCx1LHYpe3ZhciBSPWYoe3NjaGVtZToibnVsbCJ9LHYpO3JldHVybiBrZShwcihNZShkLFIpLE1lKHUsUiksUiwhMCksUil9ZnVuY3Rpb24gQnQoZCx1KXtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2Q9a2UoTWUoZCx1KSx1KTphKGQpPT09Im9iamVjdCImJihkPU1lKGtlKGQsdSksdSkpLGR9ZnVuY3Rpb24gSHIoZCx1LHYpe3JldHVybiB0eXBlb2YgZD09InN0cmluZyI/ZD1rZShNZShkLHYpLHYpOmEoZCk9PT0ib2JqZWN0IiYmKGQ9a2UoZCx2KSksdHlwZW9mIHU9PSJzdHJpbmciP3U9a2UoTWUodSx2KSx2KTphKHUpPT09Im9iamVjdCImJih1PWtlKHUsdikpLGQ9PT11fWZ1bmN0aW9uIHduKGQsdSl7cmV0dXJuIGQmJmQudG9TdHJpbmcoKS5yZXBsYWNlKCF1fHwhdS5pcmk/aS5FU0NBUEU6aC5FU0NBUEUsRil9ZnVuY3Rpb24gSmUoZCx1KXtyZXR1cm4gZCYmZC50b1N0cmluZygpLnJlcGxhY2UoIXV8fCF1LmlyaT9pLlBDVF9FTkNPREVEOmguUENUX0VOQ09ERUQsWil9dmFyIEp0PXtzY2hlbWU6Imh0dHAiLGRvbWFpbkhvc3Q6ITAscGFyc2U6ZnVuY3Rpb24odSx2KXtyZXR1cm4gdS5ob3N0fHwodS5lcnJvcj11LmVycm9yfHwiSFRUUCBVUklzIG11c3QgaGF2ZSBhIGhvc3QuIiksdX0sc2VyaWFsaXplOmZ1bmN0aW9uKHUsdil7dmFyIFI9U3RyaW5nKHUuc2NoZW1lKS50b0xvd2VyQ2FzZSgpPT09Imh0dHBzIjtyZXR1cm4odS5wb3J0PT09KFI/NDQzOjgwKXx8dS5wb3J0PT09IiIpJiYodS5wb3J0PXZvaWQgMCksdS5wYXRofHwodS5wYXRoPSIvIiksdX19LFBvPXtzY2hlbWU6Imh0dHBzIixkb21haW5Ib3N0Okp0LmRvbWFpbkhvc3QscGFyc2U6SnQucGFyc2Usc2VyaWFsaXplOkp0LnNlcmlhbGl6ZX07ZnVuY3Rpb24gVG8oZCl7cmV0dXJuIHR5cGVvZiBkLnNlY3VyZT09ImJvb2xlYW4iP2Quc2VjdXJlOlN0cmluZyhkLnNjaGVtZSkudG9Mb3dlckNhc2UoKT09PSJ3c3MifXZhciBLcj17c2NoZW1lOiJ3cyIsZG9tYWluSG9zdDohMCxwYXJzZTpmdW5jdGlvbih1LHYpe3ZhciBSPXU7cmV0dXJuIFIuc2VjdXJlPVRvKFIpLFIucmVzb3VyY2VOYW1lPShSLnBhdGh8fCIvIikrKFIucXVlcnk/Ij8iK1IucXVlcnk6IiIpLFIucGF0aD12b2lkIDAsUi5xdWVyeT12b2lkIDAsUn0sc2VyaWFsaXplOmZ1bmN0aW9uKHUsdil7aWYoKHUucG9ydD09PShUbyh1KT80NDM6ODApfHx1LnBvcnQ9PT0iIikmJih1LnBvcnQ9dm9pZCAwKSx0eXBlb2YgdS5zZWN1cmU9PSJib29sZWFuIiYmKHUuc2NoZW1lPXUuc2VjdXJlPyJ3c3MiOiJ3cyIsdS5zZWN1cmU9dm9pZCAwKSx1LnJlc291cmNlTmFtZSl7dmFyIFI9dS5yZXNvdXJjZU5hbWUuc3BsaXQoIj8iKSxTPUUoUiwyKSx6PVNbMF0sSz1TWzFdO3UucGF0aD16JiZ6IT09Ii8iP3o6dm9pZCAwLHUucXVlcnk9Syx1LnJlc291cmNlTmFtZT12b2lkIDB9cmV0dXJuIHUuZnJhZ21lbnQ9dm9pZCAwLHV9fSxBbz17c2NoZW1lOiJ3c3MiLGRvbWFpbkhvc3Q6S3IuZG9tYWluSG9zdCxwYXJzZTpLci5wYXJzZSxzZXJpYWxpemU6S3Iuc2VyaWFsaXplfSxXZj17fSxDbz0iW0EtWmEtejAtOVxcLVxcLlxcX1xcflxceEEwLVxcdTIwMERcXHUyMDEwLVxcdTIwMjlcXHUyMDJGLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdIixzdD0iWzAtOUEtRmEtZl0iLFhmPXMocygiJVtFRmVmXSIrc3QrIiUiK3N0K3N0KyIlIitzdCtzdCkrInwiK3MoIiVbODlBLUZhLWZdIitzdCsiJSIrc3Qrc3QpKyJ8IitzKCIlIitzdCtzdCkpLFpmPSJbQS1aYS16MC05XFwhXFwkXFwlXFwnXFwqXFwrXFwtXFxeXFxfXFxgXFx7XFx8XFx9XFx+XSIseGY9IltcXCFcXCRcXCVcXCdcXChcXClcXCpcXCtcXCxcXC1cXC4wLTlcXDxcXD5BLVpcXHg1RS1cXHg3RV0iLGVkPW4oeGYsJ1tcXCJcXFxcXScpLHRkPSJbXFwhXFwkXFwnXFwoXFwpXFwqXFwrXFwsXFw7XFw6XFxAXSIscmQ9bmV3IFJlZ0V4cChDbywiZyIpLG1yPW5ldyBSZWdFeHAoWGYsImciKSxuZD1uZXcgUmVnRXhwKG4oIlteXSIsWmYsIltcXC5dIiwnW1xcIl0nLGVkKSwiZyIpLElvPW5ldyBSZWdFeHAobigiW15dIixDbyx0ZCksImciKSxzZD1JbztmdW5jdGlvbiBicyhkKXt2YXIgdT1aKGQpO3JldHVybiB1Lm1hdGNoKHJkKT91OmR9dmFyIERvPXtzY2hlbWU6Im1haWx0byIscGFyc2U6ZnVuY3Rpb24odSx2KXt2YXIgUj11LFM9Ui50bz1SLnBhdGg/Ui5wYXRoLnNwbGl0KCIsIik6W107aWYoUi5wYXRoPXZvaWQgMCxSLnF1ZXJ5KXtmb3IodmFyIHo9ITEsSz17fSxzZT1SLnF1ZXJ5LnNwbGl0KCImIiksbWU9MCwkZT1zZS5sZW5ndGg7bWU8JGU7KyttZSl7dmFyIHg9c2VbbWVdLnNwbGl0KCI9Iik7c3dpdGNoKHhbMF0pe2Nhc2UidG8iOmZvcih2YXIgZmU9eFsxXS5zcGxpdCgiLCIpLHdlPTAscT1mZS5sZW5ndGg7d2U8cTsrK3dlKVMucHVzaChmZVt3ZV0pO2JyZWFrO2Nhc2Uic3ViamVjdCI6Ui5zdWJqZWN0PUplKHhbMV0sdik7YnJlYWs7Y2FzZSJib2R5IjpSLmJvZHk9SmUoeFsxXSx2KTticmVhaztkZWZhdWx0Ono9ITAsS1tKZSh4WzBdLHYpXT1KZSh4WzFdLHYpO2JyZWFrfX16JiYoUi5oZWFkZXJzPUspfVIucXVlcnk9dm9pZCAwO2Zvcih2YXIgX2U9MCxSZT1TLmxlbmd0aDtfZTxSZTsrK19lKXt2YXIgZ2U9U1tfZV0uc3BsaXQoIkAiKTtpZihnZVswXT1KZShnZVswXSksdi51bmljb2RlU3VwcG9ydClnZVsxXT1KZShnZVsxXSx2KS50b0xvd2VyQ2FzZSgpO2Vsc2UgdHJ5e2dlWzFdPVAudG9BU0NJSShKZShnZVsxXSx2KS50b0xvd2VyQ2FzZSgpKX1jYXRjaChQdCl7Ui5lcnJvcj1SLmVycm9yfHwiRW1haWwgYWRkcmVzcydzIGRvbWFpbiBuYW1lIGNhbiBub3QgYmUgY29udmVydGVkIHRvIEFTQ0lJIHZpYSBwdW55Y29kZTogIitQdH1TW19lXT1nZS5qb2luKCJAIil9cmV0dXJuIFJ9LHNlcmlhbGl6ZTpmdW5jdGlvbih1LHYpe3ZhciBSPXUsUz1sKHUudG8pO2lmKFMpe2Zvcih2YXIgej0wLEs9Uy5sZW5ndGg7ejxLOysreil7dmFyIHNlPVN0cmluZyhTW3pdKSxtZT1zZS5sYXN0SW5kZXhPZigiQCIpLCRlPXNlLnNsaWNlKDAsbWUpLnJlcGxhY2UobXIsYnMpLnJlcGxhY2UobXIsbykucmVwbGFjZShuZCxGKSx4PXNlLnNsaWNlKG1lKzEpO3RyeXt4PXYuaXJpP1AudG9Vbmljb2RlKHgpOlAudG9BU0NJSShKZSh4LHYpLnRvTG93ZXJDYXNlKCkpfWNhdGNoKF9lKXtSLmVycm9yPVIuZXJyb3J8fCJFbWFpbCBhZGRyZXNzJ3MgZG9tYWluIG5hbWUgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gIisodi5pcmk/IlVuaWNvZGUiOiJBU0NJSSIpKyIgdmlhIHB1bnljb2RlOiAiK19lfVNbel09JGUrIkAiK3h9Ui5wYXRoPVMuam9pbigiLCIpfXZhciBmZT11LmhlYWRlcnM9dS5oZWFkZXJzfHx7fTt1LnN1YmplY3QmJihmZS5zdWJqZWN0PXUuc3ViamVjdCksdS5ib2R5JiYoZmUuYm9keT11LmJvZHkpO3ZhciB3ZT1bXTtmb3IodmFyIHEgaW4gZmUpZmVbcV0hPT1XZltxXSYmd2UucHVzaChxLnJlcGxhY2UobXIsYnMpLnJlcGxhY2UobXIsbykucmVwbGFjZShJbyxGKSsiPSIrZmVbcV0ucmVwbGFjZShtcixicykucmVwbGFjZShtcixvKS5yZXBsYWNlKHNkLEYpKTtyZXR1cm4gd2UubGVuZ3RoJiYoUi5xdWVyeT13ZS5qb2luKCImIikpLFJ9fSxhZD0vXihbXlw6XSspXDooLiopLyxqbz17c2NoZW1lOiJ1cm4iLHBhcnNlOmZ1bmN0aW9uKHUsdil7dmFyIFI9dS5wYXRoJiZ1LnBhdGgubWF0Y2goYWQpLFM9dTtpZihSKXt2YXIgej12LnNjaGVtZXx8Uy5zY2hlbWV8fCJ1cm4iLEs9UlsxXS50b0xvd2VyQ2FzZSgpLHNlPVJbMl0sbWU9eisiOiIrKHYubmlkfHxLKSwkZT1VW21lXTtTLm5pZD1LLFMubnNzPXNlLFMucGF0aD12b2lkIDAsJGUmJihTPSRlLnBhcnNlKFMsdikpfWVsc2UgUy5lcnJvcj1TLmVycm9yfHwiVVJOIGNhbiBub3QgYmUgcGFyc2VkLiI7cmV0dXJuIFN9LHNlcmlhbGl6ZTpmdW5jdGlvbih1LHYpe3ZhciBSPXYuc2NoZW1lfHx1LnNjaGVtZXx8InVybiIsUz11Lm5pZCx6PVIrIjoiKyh2Lm5pZHx8UyksSz1VW3pdO0smJih1PUsuc2VyaWFsaXplKHUsdikpO3ZhciBzZT11LG1lPXUubnNzO3JldHVybiBzZS5wYXRoPShTfHx2Lm5pZCkrIjoiK21lLHNlfX0sb2Q9L15bMC05QS1GYS1mXXs4fSg/OlwtWzAtOUEtRmEtZl17NH0pezN9XC1bMC05QS1GYS1mXXsxMn0kLyxrbz17c2NoZW1lOiJ1cm46dXVpZCIscGFyc2U6ZnVuY3Rpb24odSx2KXt2YXIgUj11O3JldHVybiBSLnV1aWQ9Ui5uc3MsUi5uc3M9dm9pZCAwLCF2LnRvbGVyYW50JiYoIVIudXVpZHx8IVIudXVpZC5tYXRjaChvZCkpJiYoUi5lcnJvcj1SLmVycm9yfHwiVVVJRCBpcyBub3QgdmFsaWQuIiksUn0sc2VyaWFsaXplOmZ1bmN0aW9uKHUsdil7dmFyIFI9dTtyZXR1cm4gUi5uc3M9KHUudXVpZHx8IiIpLnRvTG93ZXJDYXNlKCksUn19O1VbSnQuc2NoZW1lXT1KdCxVW1BvLnNjaGVtZV09UG8sVVtLci5zY2hlbWVdPUtyLFVbQW8uc2NoZW1lXT1BbyxVW0RvLnNjaGVtZV09RG8sVVtqby5zY2hlbWVdPWpvLFVba28uc2NoZW1lXT1rbyxyLlNDSEVNRVM9VSxyLnBjdEVuY0NoYXI9RixyLnBjdERlY0NoYXJzPVosci5wYXJzZT1NZSxyLnJlbW92ZURvdFNlZ21lbnRzPW50LHIuc2VyaWFsaXplPWtlLHIucmVzb2x2ZUNvbXBvbmVudHM9cHIsci5yZXNvbHZlPXpyLHIubm9ybWFsaXplPUJ0LHIuZXF1YWw9SHIsci5lc2NhcGVDb21wb25lbnQ9d24sci51bmVzY2FwZUNvbXBvbmVudD1KZSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KX0pKGVzLGVzLmV4cG9ydHMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4biwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgRGE9ZXMuZXhwb3J0cztEYS5jb2RlPSdyZXF1aXJlKCJhanYvZGlzdC9ydW50aW1lL3VyaSIpLmRlZmF1bHQnLHhuLmRlZmF1bHQ9RGEsZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuQ29kZUdlbj1lLk5hbWU9ZS5uaWw9ZS5zdHJpbmdpZnk9ZS5zdHI9ZS5fPWUuS2V5d29yZEN4dD12b2lkIDA7dmFyIHQ9V2U7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIktleXdvcmRDeHQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0LktleXdvcmRDeHR9fSk7dmFyIHI9dWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl8iLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLl99fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInN0ciIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIuc3RyfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdHJpbmdpZnkiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLnN0cmluZ2lmeX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwibmlsIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5uaWx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIk5hbWUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLk5hbWV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIkNvZGVHZW4iLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByLkNvZGVHZW59fSk7Y29uc3Qgbj1jbixzPWt0LGE9RHQsbz1DZSxsPXVlLGY9VGUscD1ubixpPWJlLGg9enUsRT14bixUPShrLGcpPT5uZXcgUmVnRXhwKGssZyk7VC5jb2RlPSJuZXcgUmVnRXhwIjtjb25zdCBJPVsicmVtb3ZlQWRkaXRpb25hbCIsInVzZURlZmF1bHRzIiwiY29lcmNlVHlwZXMiXSxqPW5ldyBTZXQoWyJ2YWxpZGF0ZSIsInNlcmlhbGl6ZSIsInBhcnNlIiwid3JhcHBlciIsInJvb3QiLCJzY2hlbWEiLCJrZXl3b3JkIiwicGF0dGVybiIsImZvcm1hdHMiLCJ2YWxpZGF0ZSRkYXRhIiwiZnVuYyIsIm9iaiIsIkVycm9yIl0pLHk9e2Vycm9yRGF0YVBhdGg6IiIsZm9ybWF0OiJgdmFsaWRhdGVGb3JtYXRzOiBmYWxzZWAgY2FuIGJlIHVzZWQgaW5zdGVhZC4iLG51bGxhYmxlOicibnVsbGFibGUiIGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuJyxqc29uUG9pbnRlcnM6IkRlcHJlY2F0ZWQganNQcm9wZXJ0eVN5bnRheCBjYW4gYmUgdXNlZCBpbnN0ZWFkLiIsZXh0ZW5kUmVmczoiRGVwcmVjYXRlZCBpZ25vcmVLZXl3b3Jkc1dpdGhSZWYgY2FuIGJlIHVzZWQgaW5zdGVhZC4iLG1pc3NpbmdSZWZzOiJQYXNzIGVtcHR5IHNjaGVtYSB3aXRoICRpZCB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIHRvIGFqdi5hZGRTY2hlbWEuIixwcm9jZXNzQ29kZToiVXNlIG9wdGlvbiBgY29kZToge3Byb2Nlc3M6IChjb2RlLCBzY2hlbWFFbnY6IG9iamVjdCkgPT4gc3RyaW5nfWAiLHNvdXJjZUNvZGU6IlVzZSBvcHRpb24gYGNvZGU6IHtzb3VyY2U6IHRydWV9YCIsc3RyaWN0RGVmYXVsdHM6Ikl0IGlzIGRlZmF1bHQgbm93LCBzZWUgb3B0aW9uIGBzdHJpY3RgLiIsc3RyaWN0S2V5d29yZHM6Ikl0IGlzIGRlZmF1bHQgbm93LCBzZWUgb3B0aW9uIGBzdHJpY3RgLiIsdW5pcXVlSXRlbXM6JyJ1bmlxdWVJdGVtcyIga2V5d29yZCBpcyBhbHdheXMgdmFsaWRhdGVkLicsdW5rbm93bkZvcm1hdHM6IkRpc2FibGUgc3RyaWN0IG1vZGUgb3IgcGFzcyBgdHJ1ZWAgdG8gYGFqdi5hZGRGb3JtYXRgIChvciBgZm9ybWF0c2Agb3B0aW9uKS4iLGNhY2hlOiJNYXAgaXMgdXNlZCBhcyBjYWNoZSwgc2NoZW1hIG9iamVjdCBhcyBrZXkuIixzZXJpYWxpemU6Ik1hcCBpcyB1c2VkIGFzIGNhY2hlLCBzY2hlbWEgb2JqZWN0IGFzIGtleS4iLGFqdkVycm9yczoiSXQgaXMgZGVmYXVsdCBub3cuIn0sXz17aWdub3JlS2V5d29yZHNXaXRoUmVmOiIiLGpzUHJvcGVydHlTeW50YXg6IiIsdW5pY29kZTonIm1pbkxlbmd0aCIvIm1heExlbmd0aCIgYWNjb3VudCBmb3IgdW5pY29kZSBjaGFyYWN0ZXJzIGJ5IGRlZmF1bHQuJ30sYj0yMDA7ZnVuY3Rpb24gTyhrKXt2YXIgZyxDLHcsYyxtLFAsVSxGLFoscmUseWUscnQsbHIsRnIsTXIsTWUsTHIsZnIsZHIsaHIsVnIsbnQsa2UscHIsenI7Y29uc3QgQnQ9ay5zdHJpY3QsSHI9KGc9ay5jb2RlKT09PW51bGx8fGc9PT12b2lkIDA/dm9pZCAwOmcub3B0aW1pemUsd249SHI9PT0hMHx8SHI9PT12b2lkIDA/MTpIcnx8MCxKZT0odz0oQz1rLmNvZGUpPT09bnVsbHx8Qz09PXZvaWQgMD92b2lkIDA6Qy5yZWdFeHApIT09bnVsbCYmdyE9PXZvaWQgMD93OlQsSnQ9KGM9ay51cmlSZXNvbHZlcikhPT1udWxsJiZjIT09dm9pZCAwP2M6RS5kZWZhdWx0O3JldHVybntzdHJpY3RTY2hlbWE6KFA9KG09ay5zdHJpY3RTY2hlbWEpIT09bnVsbCYmbSE9PXZvaWQgMD9tOkJ0KSE9PW51bGwmJlAhPT12b2lkIDA/UDohMCxzdHJpY3ROdW1iZXJzOihGPShVPWsuc3RyaWN0TnVtYmVycykhPT1udWxsJiZVIT09dm9pZCAwP1U6QnQpIT09bnVsbCYmRiE9PXZvaWQgMD9GOiEwLHN0cmljdFR5cGVzOihyZT0oWj1rLnN0cmljdFR5cGVzKSE9PW51bGwmJlohPT12b2lkIDA/WjpCdCkhPT1udWxsJiZyZSE9PXZvaWQgMD9yZToibG9nIixzdHJpY3RUdXBsZXM6KHJ0PSh5ZT1rLnN0cmljdFR1cGxlcykhPT1udWxsJiZ5ZSE9PXZvaWQgMD95ZTpCdCkhPT1udWxsJiZydCE9PXZvaWQgMD9ydDoibG9nIixzdHJpY3RSZXF1aXJlZDooRnI9KGxyPWsuc3RyaWN0UmVxdWlyZWQpIT09bnVsbCYmbHIhPT12b2lkIDA/bHI6QnQpIT09bnVsbCYmRnIhPT12b2lkIDA/RnI6ITEsY29kZTprLmNvZGU/bGUoUSh7fSxrLmNvZGUpLHtvcHRpbWl6ZTp3bixyZWdFeHA6SmV9KTp7b3B0aW1pemU6d24scmVnRXhwOkplfSxsb29wUmVxdWlyZWQ6KE1yPWsubG9vcFJlcXVpcmVkKSE9PW51bGwmJk1yIT09dm9pZCAwP01yOmIsbG9vcEVudW06KE1lPWsubG9vcEVudW0pIT09bnVsbCYmTWUhPT12b2lkIDA/TWU6YixtZXRhOihMcj1rLm1ldGEpIT09bnVsbCYmTHIhPT12b2lkIDA/THI6ITAsbWVzc2FnZXM6KGZyPWsubWVzc2FnZXMpIT09bnVsbCYmZnIhPT12b2lkIDA/ZnI6ITAsaW5saW5lUmVmczooZHI9ay5pbmxpbmVSZWZzKSE9PW51bGwmJmRyIT09dm9pZCAwP2RyOiEwLHNjaGVtYUlkOihocj1rLnNjaGVtYUlkKSE9PW51bGwmJmhyIT09dm9pZCAwP2hyOiIkaWQiLGFkZFVzZWRTY2hlbWE6KFZyPWsuYWRkVXNlZFNjaGVtYSkhPT1udWxsJiZWciE9PXZvaWQgMD9WcjohMCx2YWxpZGF0ZVNjaGVtYToobnQ9ay52YWxpZGF0ZVNjaGVtYSkhPT1udWxsJiZudCE9PXZvaWQgMD9udDohMCx2YWxpZGF0ZUZvcm1hdHM6KGtlPWsudmFsaWRhdGVGb3JtYXRzKSE9PW51bGwmJmtlIT09dm9pZCAwP2tlOiEwLHVuaWNvZGVSZWdFeHA6KHByPWsudW5pY29kZVJlZ0V4cCkhPT1udWxsJiZwciE9PXZvaWQgMD9wcjohMCxpbnQzMnJhbmdlOih6cj1rLmludDMycmFuZ2UpIT09bnVsbCYmenIhPT12b2lkIDA/enI6ITAsdXJpUmVzb2x2ZXI6SnR9fWNsYXNzIEF7Y29uc3RydWN0b3IoZz17fSl7dGhpcy5zY2hlbWFzPXt9LHRoaXMucmVmcz17fSx0aGlzLmZvcm1hdHM9e30sdGhpcy5fY29tcGlsYXRpb25zPW5ldyBTZXQsdGhpcy5fbG9hZGluZz17fSx0aGlzLl9jYWNoZT1uZXcgTWFwLGc9dGhpcy5vcHRzPVEoUSh7fSxnKSxPKGcpKTtjb25zdHtlczU6QyxsaW5lczp3fT10aGlzLm9wdHMuY29kZTt0aGlzLnNjb3BlPW5ldyBsLlZhbHVlU2NvcGUoe3Njb3BlOnt9LHByZWZpeGVzOmosZXM1OkMsbGluZXM6d30pLHRoaXMubG9nZ2VyPVcoZy5sb2dnZXIpO2NvbnN0IGM9Zy52YWxpZGF0ZUZvcm1hdHM7Zy52YWxpZGF0ZUZvcm1hdHM9ITEsdGhpcy5SVUxFUz0oMCxhLmdldFJ1bGVzKSgpLEguY2FsbCh0aGlzLHksZywiTk9UIFNVUFBPUlRFRCIpLEguY2FsbCh0aGlzLF8sZywiREVQUkVDQVRFRCIsIndhcm4iKSx0aGlzLl9tZXRhT3B0cz1HLmNhbGwodGhpcyksZy5mb3JtYXRzJiZELmNhbGwodGhpcyksdGhpcy5fYWRkVm9jYWJ1bGFyaWVzKCksdGhpcy5fYWRkRGVmYXVsdE1ldGFTY2hlbWEoKSxnLmtleXdvcmRzJiZCLmNhbGwodGhpcyxnLmtleXdvcmRzKSx0eXBlb2YgZy5tZXRhPT0ib2JqZWN0IiYmdGhpcy5hZGRNZXRhU2NoZW1hKGcubWV0YSksTi5jYWxsKHRoaXMpLGcudmFsaWRhdGVGb3JtYXRzPWN9X2FkZFZvY2FidWxhcmllcygpe3RoaXMuYWRkS2V5d29yZCgiJGFzeW5jIil9X2FkZERlZmF1bHRNZXRhU2NoZW1hKCl7Y29uc3R7JGRhdGE6ZyxtZXRhOkMsc2NoZW1hSWQ6d309dGhpcy5vcHRzO2xldCBjPWg7dz09PSJpZCImJihjPVEoe30saCksYy5pZD1jLiRpZCxkZWxldGUgYy4kaWQpLEMmJmcmJnRoaXMuYWRkTWV0YVNjaGVtYShjLGNbd10sITEpfWRlZmF1bHRNZXRhKCl7Y29uc3R7bWV0YTpnLHNjaGVtYUlkOkN9PXRoaXMub3B0cztyZXR1cm4gdGhpcy5vcHRzLmRlZmF1bHRNZXRhPXR5cGVvZiBnPT0ib2JqZWN0Ij9nW0NdfHxnOnZvaWQgMH12YWxpZGF0ZShnLEMpe2xldCB3O2lmKHR5cGVvZiBnPT0ic3RyaW5nIil7aWYodz10aGlzLmdldFNjaGVtYShnKSwhdyl0aHJvdyBuZXcgRXJyb3IoYG5vIHNjaGVtYSB3aXRoIGtleSBvciByZWYgIiR7Z30iYCl9ZWxzZSB3PXRoaXMuY29tcGlsZShnKTtjb25zdCBjPXcoQyk7cmV0dXJuIiRhc3luYyJpbiB3fHwodGhpcy5lcnJvcnM9dy5lcnJvcnMpLGN9Y29tcGlsZShnLEMpe2NvbnN0IHc9dGhpcy5fYWRkU2NoZW1hKGcsQyk7cmV0dXJuIHcudmFsaWRhdGV8fHRoaXMuX2NvbXBpbGVTY2hlbWFFbnYodyl9Y29tcGlsZUFzeW5jKGcsQyl7aWYodHlwZW9mIHRoaXMub3B0cy5sb2FkU2NoZW1hIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcigib3B0aW9ucy5sb2FkU2NoZW1hIHNob3VsZCBiZSBhIGZ1bmN0aW9uIik7Y29uc3R7bG9hZFNjaGVtYTp3fT10aGlzLm9wdHM7cmV0dXJuIGMuY2FsbCh0aGlzLGcsQyk7YXN5bmMgZnVuY3Rpb24gYyhyZSx5ZSl7YXdhaXQgbS5jYWxsKHRoaXMscmUuJHNjaGVtYSk7Y29uc3QgcnQ9dGhpcy5fYWRkU2NoZW1hKHJlLHllKTtyZXR1cm4gcnQudmFsaWRhdGV8fFAuY2FsbCh0aGlzLHJ0KX1hc3luYyBmdW5jdGlvbiBtKHJlKXtyZSYmIXRoaXMuZ2V0U2NoZW1hKHJlKSYmYXdhaXQgYy5jYWxsKHRoaXMseyRyZWY6cmV9LCEwKX1hc3luYyBmdW5jdGlvbiBQKHJlKXt0cnl7cmV0dXJuIHRoaXMuX2NvbXBpbGVTY2hlbWFFbnYocmUpfWNhdGNoKHllKXtpZighKHllIGluc3RhbmNlb2Ygcy5kZWZhdWx0KSl0aHJvdyB5ZTtyZXR1cm4gVS5jYWxsKHRoaXMseWUpLGF3YWl0IEYuY2FsbCh0aGlzLHllLm1pc3NpbmdTY2hlbWEpLFAuY2FsbCh0aGlzLHJlKX19ZnVuY3Rpb24gVSh7bWlzc2luZ1NjaGVtYTpyZSxtaXNzaW5nUmVmOnllfSl7aWYodGhpcy5yZWZzW3JlXSl0aHJvdyBuZXcgRXJyb3IoYEFueVNjaGVtYSAke3JlfSBpcyBsb2FkZWQgYnV0ICR7eWV9IGNhbm5vdCBiZSByZXNvbHZlZGApfWFzeW5jIGZ1bmN0aW9uIEYocmUpe2NvbnN0IHllPWF3YWl0IFouY2FsbCh0aGlzLHJlKTt0aGlzLnJlZnNbcmVdfHxhd2FpdCBtLmNhbGwodGhpcyx5ZS4kc2NoZW1hKSx0aGlzLnJlZnNbcmVdfHx0aGlzLmFkZFNjaGVtYSh5ZSxyZSxDKX1hc3luYyBmdW5jdGlvbiBaKHJlKXtjb25zdCB5ZT10aGlzLl9sb2FkaW5nW3JlXTtpZih5ZSlyZXR1cm4geWU7dHJ5e3JldHVybiBhd2FpdCh0aGlzLl9sb2FkaW5nW3JlXT13KHJlKSl9ZmluYWxseXtkZWxldGUgdGhpcy5fbG9hZGluZ1tyZV19fX1hZGRTY2hlbWEoZyxDLHcsYz10aGlzLm9wdHMudmFsaWRhdGVTY2hlbWEpe2lmKEFycmF5LmlzQXJyYXkoZykpe2Zvcihjb25zdCBQIG9mIGcpdGhpcy5hZGRTY2hlbWEoUCx2b2lkIDAsdyxjKTtyZXR1cm4gdGhpc31sZXQgbTtpZih0eXBlb2YgZz09Im9iamVjdCIpe2NvbnN0e3NjaGVtYUlkOlB9PXRoaXMub3B0cztpZihtPWdbUF0sbSE9PXZvaWQgMCYmdHlwZW9mIG0hPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcihgc2NoZW1hICR7UH0gbXVzdCBiZSBzdHJpbmdgKX1yZXR1cm4gQz0oMCxmLm5vcm1hbGl6ZUlkKShDfHxtKSx0aGlzLl9jaGVja1VuaXF1ZShDKSx0aGlzLnNjaGVtYXNbQ109dGhpcy5fYWRkU2NoZW1hKGcsdyxDLGMsITApLHRoaXN9YWRkTWV0YVNjaGVtYShnLEMsdz10aGlzLm9wdHMudmFsaWRhdGVTY2hlbWEpe3JldHVybiB0aGlzLmFkZFNjaGVtYShnLEMsITAsdyksdGhpc312YWxpZGF0ZVNjaGVtYShnLEMpe2lmKHR5cGVvZiBnPT0iYm9vbGVhbiIpcmV0dXJuITA7bGV0IHc7aWYodz1nLiRzY2hlbWEsdyE9PXZvaWQgMCYmdHlwZW9mIHchPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiJHNjaGVtYSBtdXN0IGJlIGEgc3RyaW5nIik7aWYodz13fHx0aGlzLm9wdHMuZGVmYXVsdE1ldGF8fHRoaXMuZGVmYXVsdE1ldGEoKSwhdylyZXR1cm4gdGhpcy5sb2dnZXIud2FybigibWV0YS1zY2hlbWEgbm90IGF2YWlsYWJsZSIpLHRoaXMuZXJyb3JzPW51bGwsITA7Y29uc3QgYz10aGlzLnZhbGlkYXRlKHcsZyk7aWYoIWMmJkMpe2NvbnN0IG09InNjaGVtYSBpcyBpbnZhbGlkOiAiK3RoaXMuZXJyb3JzVGV4dCgpO2lmKHRoaXMub3B0cy52YWxpZGF0ZVNjaGVtYT09PSJsb2ciKXRoaXMubG9nZ2VyLmVycm9yKG0pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKG0pfXJldHVybiBjfWdldFNjaGVtYShnKXtsZXQgQztmb3IoO3R5cGVvZihDPSQuY2FsbCh0aGlzLGcpKT09InN0cmluZyI7KWc9QztpZihDPT09dm9pZCAwKXtjb25zdHtzY2hlbWFJZDp3fT10aGlzLm9wdHMsYz1uZXcgby5TY2hlbWFFbnYoe3NjaGVtYTp7fSxzY2hlbWFJZDp3fSk7aWYoQz1vLnJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLGMsZyksIUMpcmV0dXJuO3RoaXMucmVmc1tnXT1DfXJldHVybiBDLnZhbGlkYXRlfHx0aGlzLl9jb21waWxlU2NoZW1hRW52KEMpfXJlbW92ZVNjaGVtYShnKXtpZihnIGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiB0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMuc2NoZW1hcyxnKSx0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMucmVmcyxnKSx0aGlzO3N3aXRjaCh0eXBlb2YgZyl7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiB0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMuc2NoZW1hcyksdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnJlZnMpLHRoaXMuX2NhY2hlLmNsZWFyKCksdGhpcztjYXNlInN0cmluZyI6e2NvbnN0IEM9JC5jYWxsKHRoaXMsZyk7cmV0dXJuIHR5cGVvZiBDPT0ib2JqZWN0IiYmdGhpcy5fY2FjaGUuZGVsZXRlKEMuc2NoZW1hKSxkZWxldGUgdGhpcy5zY2hlbWFzW2ddLGRlbGV0ZSB0aGlzLnJlZnNbZ10sdGhpc31jYXNlIm9iamVjdCI6e2NvbnN0IEM9Zzt0aGlzLl9jYWNoZS5kZWxldGUoQyk7bGV0IHc9Z1t0aGlzLm9wdHMuc2NoZW1hSWRdO3JldHVybiB3JiYodz0oMCxmLm5vcm1hbGl6ZUlkKSh3KSxkZWxldGUgdGhpcy5zY2hlbWFzW3ddLGRlbGV0ZSB0aGlzLnJlZnNbd10pLHRoaXN9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImFqdi5yZW1vdmVTY2hlbWE6IGludmFsaWQgcGFyYW1ldGVyIil9fWFkZFZvY2FidWxhcnkoZyl7Zm9yKGNvbnN0IEMgb2YgZyl0aGlzLmFkZEtleXdvcmQoQyk7cmV0dXJuIHRoaXN9YWRkS2V5d29yZChnLEMpe2xldCB3O2lmKHR5cGVvZiBnPT0ic3RyaW5nIil3PWcsdHlwZW9mIEM9PSJvYmplY3QiJiYodGhpcy5sb2dnZXIud2FybigidGhlc2UgcGFyYW1ldGVycyBhcmUgZGVwcmVjYXRlZCwgc2VlIGRvY3MgZm9yIGFkZEtleXdvcmQiKSxDLmtleXdvcmQ9dyk7ZWxzZSBpZih0eXBlb2YgZz09Im9iamVjdCImJkM9PT12b2lkIDApe2lmKEM9Zyx3PUMua2V5d29yZCxBcnJheS5pc0FycmF5KHcpJiYhdy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhZGRLZXl3b3Jkczoga2V5d29yZCBtdXN0IGJlIHN0cmluZyBvciBub24tZW1wdHkgYXJyYXkiKX1lbHNlIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBhZGRLZXl3b3JkcyBwYXJhbWV0ZXJzIik7aWYoWC5jYWxsKHRoaXMsdyxDKSwhQylyZXR1cm4oMCxpLmVhY2hJdGVtKSh3LG09PnZlLmNhbGwodGhpcyxtKSksdGhpcztOZS5jYWxsKHRoaXMsQyk7Y29uc3QgYz1sZShRKHt9LEMpLHt0eXBlOigwLHAuZ2V0SlNPTlR5cGVzKShDLnR5cGUpLHNjaGVtYVR5cGU6KDAscC5nZXRKU09OVHlwZXMpKEMuc2NoZW1hVHlwZSl9KTtyZXR1cm4oMCxpLmVhY2hJdGVtKSh3LGMudHlwZS5sZW5ndGg9PT0wP209PnZlLmNhbGwodGhpcyxtLGMpOm09PmMudHlwZS5mb3JFYWNoKFA9PnZlLmNhbGwodGhpcyxtLGMsUCkpKSx0aGlzfWdldEtleXdvcmQoZyl7Y29uc3QgQz10aGlzLlJVTEVTLmFsbFtnXTtyZXR1cm4gdHlwZW9mIEM9PSJvYmplY3QiP0MuZGVmaW5pdGlvbjohIUN9cmVtb3ZlS2V5d29yZChnKXtjb25zdHtSVUxFUzpDfT10aGlzO2RlbGV0ZSBDLmtleXdvcmRzW2ddLGRlbGV0ZSBDLmFsbFtnXTtmb3IoY29uc3QgdyBvZiBDLnJ1bGVzKXtjb25zdCBjPXcucnVsZXMuZmluZEluZGV4KG09Pm0ua2V5d29yZD09PWcpO2M+PTAmJncucnVsZXMuc3BsaWNlKGMsMSl9cmV0dXJuIHRoaXN9YWRkRm9ybWF0KGcsQyl7cmV0dXJuIHR5cGVvZiBDPT0ic3RyaW5nIiYmKEM9bmV3IFJlZ0V4cChDKSksdGhpcy5mb3JtYXRzW2ddPUMsdGhpc31lcnJvcnNUZXh0KGc9dGhpcy5lcnJvcnMse3NlcGFyYXRvcjpDPSIsICIsZGF0YVZhcjp3PSJkYXRhIn09e30pe3JldHVybiFnfHxnLmxlbmd0aD09PTA/Ik5vIGVycm9ycyI6Zy5tYXAoYz0+YCR7d30ke2MuaW5zdGFuY2VQYXRofSAke2MubWVzc2FnZX1gKS5yZWR1Y2UoKGMsbSk9PmMrQyttKX0kZGF0YU1ldGFTY2hlbWEoZyxDKXtjb25zdCB3PXRoaXMuUlVMRVMuYWxsO2c9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnKSk7Zm9yKGNvbnN0IGMgb2YgQyl7Y29uc3QgbT1jLnNwbGl0KCIvIikuc2xpY2UoMSk7bGV0IFA9Zztmb3IoY29uc3QgVSBvZiBtKVA9UFtVXTtmb3IoY29uc3QgVSBpbiB3KXtjb25zdCBGPXdbVV07aWYodHlwZW9mIEYhPSJvYmplY3QiKWNvbnRpbnVlO2NvbnN0eyRkYXRhOlp9PUYuZGVmaW5pdGlvbixyZT1QW1VdO1omJnJlJiYoUFtVXT11cihyZSkpfX1yZXR1cm4gZ31fcmVtb3ZlQWxsU2NoZW1hcyhnLEMpe2Zvcihjb25zdCB3IGluIGcpe2NvbnN0IGM9Z1t3XTsoIUN8fEMudGVzdCh3KSkmJih0eXBlb2YgYz09InN0cmluZyI/ZGVsZXRlIGdbd106YyYmIWMubWV0YSYmKHRoaXMuX2NhY2hlLmRlbGV0ZShjLnNjaGVtYSksZGVsZXRlIGdbd10pKX19X2FkZFNjaGVtYShnLEMsdyxjPXRoaXMub3B0cy52YWxpZGF0ZVNjaGVtYSxtPXRoaXMub3B0cy5hZGRVc2VkU2NoZW1hKXtsZXQgUDtjb25zdHtzY2hlbWFJZDpVfT10aGlzLm9wdHM7aWYodHlwZW9mIGc9PSJvYmplY3QiKVA9Z1tVXTtlbHNle2lmKHRoaXMub3B0cy5qdGQpdGhyb3cgbmV3IEVycm9yKCJzY2hlbWEgbXVzdCBiZSBvYmplY3QiKTtpZih0eXBlb2YgZyE9ImJvb2xlYW4iKXRocm93IG5ldyBFcnJvcigic2NoZW1hIG11c3QgYmUgb2JqZWN0IG9yIGJvb2xlYW4iKX1sZXQgRj10aGlzLl9jYWNoZS5nZXQoZyk7aWYoRiE9PXZvaWQgMClyZXR1cm4gRjt3PSgwLGYubm9ybWFsaXplSWQpKFB8fHcpO2NvbnN0IFo9Zi5nZXRTY2hlbWFSZWZzLmNhbGwodGhpcyxnLHcpO3JldHVybiBGPW5ldyBvLlNjaGVtYUVudih7c2NoZW1hOmcsc2NoZW1hSWQ6VSxtZXRhOkMsYmFzZUlkOncsbG9jYWxSZWZzOlp9KSx0aGlzLl9jYWNoZS5zZXQoRi5zY2hlbWEsRiksbSYmIXcuc3RhcnRzV2l0aCgiIyIpJiYodyYmdGhpcy5fY2hlY2tVbmlxdWUodyksdGhpcy5yZWZzW3ddPUYpLGMmJnRoaXMudmFsaWRhdGVTY2hlbWEoZywhMCksRn1fY2hlY2tVbmlxdWUoZyl7aWYodGhpcy5zY2hlbWFzW2ddfHx0aGlzLnJlZnNbZ10pdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgd2l0aCBrZXkgb3IgaWQgIiR7Z30iIGFscmVhZHkgZXhpc3RzYCl9X2NvbXBpbGVTY2hlbWFFbnYoZyl7aWYoZy5tZXRhP3RoaXMuX2NvbXBpbGVNZXRhU2NoZW1hKGcpOm8uY29tcGlsZVNjaGVtYS5jYWxsKHRoaXMsZyksIWcudmFsaWRhdGUpdGhyb3cgbmV3IEVycm9yKCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3IiKTtyZXR1cm4gZy52YWxpZGF0ZX1fY29tcGlsZU1ldGFTY2hlbWEoZyl7Y29uc3QgQz10aGlzLm9wdHM7dGhpcy5vcHRzPXRoaXMuX21ldGFPcHRzO3RyeXtvLmNvbXBpbGVTY2hlbWEuY2FsbCh0aGlzLGcpfWZpbmFsbHl7dGhpcy5vcHRzPUN9fX1lLmRlZmF1bHQ9QSxBLlZhbGlkYXRpb25FcnJvcj1uLmRlZmF1bHQsQS5NaXNzaW5nUmVmRXJyb3I9cy5kZWZhdWx0O2Z1bmN0aW9uIEgoayxnLEMsdz0iZXJyb3IiKXtmb3IoY29uc3QgYyBpbiBrKXtjb25zdCBtPWM7bSBpbiBnJiZ0aGlzLmxvZ2dlclt3XShgJHtDfTogb3B0aW9uICR7Y30uICR7a1ttXX1gKX19ZnVuY3Rpb24gJChrKXtyZXR1cm4gaz0oMCxmLm5vcm1hbGl6ZUlkKShrKSx0aGlzLnNjaGVtYXNba118fHRoaXMucmVmc1trXX1mdW5jdGlvbiBOKCl7Y29uc3Qgaz10aGlzLm9wdHMuc2NoZW1hcztpZighIWspaWYoQXJyYXkuaXNBcnJheShrKSl0aGlzLmFkZFNjaGVtYShrKTtlbHNlIGZvcihjb25zdCBnIGluIGspdGhpcy5hZGRTY2hlbWEoa1tnXSxnKX1mdW5jdGlvbiBEKCl7Zm9yKGNvbnN0IGsgaW4gdGhpcy5vcHRzLmZvcm1hdHMpe2NvbnN0IGc9dGhpcy5vcHRzLmZvcm1hdHNba107ZyYmdGhpcy5hZGRGb3JtYXQoayxnKX19ZnVuY3Rpb24gQihrKXtpZihBcnJheS5pc0FycmF5KGspKXt0aGlzLmFkZFZvY2FidWxhcnkoayk7cmV0dXJufXRoaXMubG9nZ2VyLndhcm4oImtleXdvcmRzIG9wdGlvbiBhcyBtYXAgaXMgZGVwcmVjYXRlZCwgcGFzcyBhcnJheSIpO2Zvcihjb25zdCBnIGluIGspe2NvbnN0IEM9a1tnXTtDLmtleXdvcmR8fChDLmtleXdvcmQ9ZyksdGhpcy5hZGRLZXl3b3JkKEMpfX1mdW5jdGlvbiBHKCl7Y29uc3Qgaz1RKHt9LHRoaXMub3B0cyk7Zm9yKGNvbnN0IGcgb2YgSSlkZWxldGUga1tnXTtyZXR1cm4ga31jb25zdCBwZT17bG9nKCl7fSx3YXJuKCl7fSxlcnJvcigpe319O2Z1bmN0aW9uIFcoayl7aWYoaz09PSExKXJldHVybiBwZTtpZihrPT09dm9pZCAwKXJldHVybiBjb25zb2xlO2lmKGsubG9nJiZrLndhcm4mJmsuZXJyb3IpcmV0dXJuIGs7dGhyb3cgbmV3IEVycm9yKCJsb2dnZXIgbXVzdCBpbXBsZW1lbnQgbG9nLCB3YXJuIGFuZCBlcnJvciBtZXRob2RzIil9Y29uc3Qgb2U9L15bYS16XyRdW2EtejAtOV8kOi1dKiQvaTtmdW5jdGlvbiBYKGssZyl7Y29uc3R7UlVMRVM6Q309dGhpcztpZigoMCxpLmVhY2hJdGVtKShrLHc9PntpZihDLmtleXdvcmRzW3ddKXRocm93IG5ldyBFcnJvcihgS2V5d29yZCAke3d9IGlzIGFscmVhZHkgZGVmaW5lZGApO2lmKCFvZS50ZXN0KHcpKXRocm93IG5ldyBFcnJvcihgS2V5d29yZCAke3d9IGhhcyBpbnZhbGlkIG5hbWVgKX0pLCEhZyYmZy4kZGF0YSYmISgiY29kZSJpbiBnfHwidmFsaWRhdGUiaW4gZykpdGhyb3cgbmV3IEVycm9yKCckZGF0YSBrZXl3b3JkIG11c3QgaGF2ZSAiY29kZSIgb3IgInZhbGlkYXRlIiBmdW5jdGlvbicpfWZ1bmN0aW9uIHZlKGssZyxDKXt2YXIgdztjb25zdCBjPWc9PW51bGw/dm9pZCAwOmcucG9zdDtpZihDJiZjKXRocm93IG5ldyBFcnJvcigna2V5d29yZCB3aXRoICJwb3N0IiBmbGFnIGNhbm5vdCBoYXZlICJ0eXBlIicpO2NvbnN0e1JVTEVTOm19PXRoaXM7bGV0IFA9Yz9tLnBvc3Q6bS5ydWxlcy5maW5kKCh7dHlwZTpGfSk9PkY9PT1DKTtpZihQfHwoUD17dHlwZTpDLHJ1bGVzOltdfSxtLnJ1bGVzLnB1c2goUCkpLG0ua2V5d29yZHNba109ITAsIWcpcmV0dXJuO2NvbnN0IFU9e2tleXdvcmQ6ayxkZWZpbml0aW9uOmxlKFEoe30sZykse3R5cGU6KDAscC5nZXRKU09OVHlwZXMpKGcudHlwZSksc2NoZW1hVHlwZTooMCxwLmdldEpTT05UeXBlcykoZy5zY2hlbWFUeXBlKX0pfTtnLmJlZm9yZT9FZS5jYWxsKHRoaXMsUCxVLGcuYmVmb3JlKTpQLnJ1bGVzLnB1c2goVSksbS5hbGxba109VSwodz1nLmltcGxlbWVudHMpPT09bnVsbHx8dz09PXZvaWQgMHx8dy5mb3JFYWNoKEY9PnRoaXMuYWRkS2V5d29yZChGKSl9ZnVuY3Rpb24gRWUoayxnLEMpe2NvbnN0IHc9ay5ydWxlcy5maW5kSW5kZXgoYz0+Yy5rZXl3b3JkPT09Qyk7dz49MD9rLnJ1bGVzLnNwbGljZSh3LDAsZyk6KGsucnVsZXMucHVzaChnKSx0aGlzLmxvZ2dlci53YXJuKGBydWxlICR7Q30gaXMgbm90IGRlZmluZWRgKSl9ZnVuY3Rpb24gTmUoayl7bGV0e21ldGFTY2hlbWE6Z309aztnIT09dm9pZCAwJiYoay4kZGF0YSYmdGhpcy5vcHRzLiRkYXRhJiYoZz11cihnKSksay52YWxpZGF0ZVNjaGVtYT10aGlzLmNvbXBpbGUoZywhMCkpfWNvbnN0IEJlPXskcmVmOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWp2LXZhbGlkYXRvci9hanYvbWFzdGVyL2xpYi9yZWZzL2RhdGEuanNvbiMifTtmdW5jdGlvbiB1cihrKXtyZXR1cm57YW55T2Y6W2ssQmVdfX19KHJhKTt2YXIgdHM9e30sRnQ9e30sTXQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KE10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxNdC5jYWxsUmVmPU10LmdldFZhbGlkYXRlPXZvaWQgMDtjb25zdCBIdT1rdCxqYT1uZSxqZT11ZSxzcj1MZSxrYT1DZSxmbj1iZSxLdT17a2V5d29yZDoiJHJlZiIsc2NoZW1hVHlwZToic3RyaW5nIixjb2RlKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGl0Om59PWUse2Jhc2VJZDpzLHNjaGVtYUVudjphLHZhbGlkYXRlTmFtZTpvLG9wdHM6bCxzZWxmOmZ9PW4se3Jvb3Q6cH09YTtpZigocj09PSIjInx8cj09PSIjLyIpJiZzPT09cC5iYXNlSWQpcmV0dXJuIGgoKTtjb25zdCBpPWthLnJlc29sdmVSZWYuY2FsbChmLHAscyxyKTtpZihpPT09dm9pZCAwKXRocm93IG5ldyBIdS5kZWZhdWx0KG4ub3B0cy51cmlSZXNvbHZlcixzLHIpO2lmKGkgaW5zdGFuY2VvZiBrYS5TY2hlbWFFbnYpcmV0dXJuIEUoaSk7cmV0dXJuIFQoaSk7ZnVuY3Rpb24gaCgpe2lmKGE9PT1wKXJldHVybiBkbihlLG8sYSxhLiRhc3luYyk7Y29uc3QgST10LnNjb3BlVmFsdWUoInJvb3QiLHtyZWY6cH0pO3JldHVybiBkbihlLCgwLGplLl8pYCR7SX0udmFsaWRhdGVgLHAscC4kYXN5bmMpfWZ1bmN0aW9uIEUoSSl7Y29uc3Qgaj1VYShlLEkpO2RuKGUsaixJLEkuJGFzeW5jKX1mdW5jdGlvbiBUKEkpe2NvbnN0IGo9dC5zY29wZVZhbHVlKCJzY2hlbWEiLGwuY29kZS5zb3VyY2U9PT0hMD97cmVmOkksY29kZTooMCxqZS5zdHJpbmdpZnkpKEkpfTp7cmVmOkl9KSx5PXQubmFtZSgidmFsaWQiKSxfPWUuc3Vic2NoZW1hKHtzY2hlbWE6SSxkYXRhVHlwZXM6W10sc2NoZW1hUGF0aDpqZS5uaWwsdG9wU2NoZW1hUmVmOmosZXJyU2NoZW1hUGF0aDpyfSx5KTtlLm1lcmdlRXZhbHVhdGVkKF8pLGUub2soeSl9fX07ZnVuY3Rpb24gVWEoZSx0KXtjb25zdHtnZW46cn09ZTtyZXR1cm4gdC52YWxpZGF0ZT9yLnNjb3BlVmFsdWUoInZhbGlkYXRlIix7cmVmOnQudmFsaWRhdGV9KTooMCxqZS5fKWAke3Iuc2NvcGVWYWx1ZSgid3JhcHBlciIse3JlZjp0fSl9LnZhbGlkYXRlYH1NdC5nZXRWYWxpZGF0ZT1VYTtmdW5jdGlvbiBkbihlLHQscixuKXtjb25zdHtnZW46cyxpdDphfT1lLHthbGxFcnJvcnM6byxzY2hlbWFFbnY6bCxvcHRzOmZ9PWEscD1mLnBhc3NDb250ZXh0P3NyLmRlZmF1bHQudGhpczpqZS5uaWw7bj9pKCk6aCgpO2Z1bmN0aW9uIGkoKXtpZighbC4kYXN5bmMpdGhyb3cgbmV3IEVycm9yKCJhc3luYyBzY2hlbWEgcmVmZXJlbmNlZCBieSBzeW5jIHNjaGVtYSIpO2NvbnN0IEk9cy5sZXQoInZhbGlkIik7cy50cnkoKCk9PntzLmNvZGUoKDAsamUuXylgYXdhaXQgJHsoMCxqYS5jYWxsVmFsaWRhdGVDb2RlKShlLHQscCl9YCksVCh0KSxvfHxzLmFzc2lnbihJLCEwKX0saj0+e3MuaWYoKDAsamUuXylgISgke2p9IGluc3RhbmNlb2YgJHthLlZhbGlkYXRpb25FcnJvcn0pYCwoKT0+cy50aHJvdyhqKSksRShqKSxvfHxzLmFzc2lnbihJLCExKX0pLGUub2soSSl9ZnVuY3Rpb24gaCgpe2UucmVzdWx0KCgwLGphLmNhbGxWYWxpZGF0ZUNvZGUpKGUsdCxwKSwoKT0+VCh0KSwoKT0+RSh0KSl9ZnVuY3Rpb24gRShJKXtjb25zdCBqPSgwLGplLl8pYCR7SX0uZXJyb3JzYDtzLmFzc2lnbihzci5kZWZhdWx0LnZFcnJvcnMsKDAsamUuXylgJHtzci5kZWZhdWx0LnZFcnJvcnN9ID09PSBudWxsID8gJHtqfSA6ICR7c3IuZGVmYXVsdC52RXJyb3JzfS5jb25jYXQoJHtqfSlgKSxzLmFzc2lnbihzci5kZWZhdWx0LmVycm9ycywoMCxqZS5fKWAke3NyLmRlZmF1bHQudkVycm9yc30ubGVuZ3RoYCl9ZnVuY3Rpb24gVChJKXt2YXIgajtpZighYS5vcHRzLnVuZXZhbHVhdGVkKXJldHVybjtjb25zdCB5PShqPXI9PW51bGw/dm9pZCAwOnIudmFsaWRhdGUpPT09bnVsbHx8aj09PXZvaWQgMD92b2lkIDA6ai5ldmFsdWF0ZWQ7aWYoYS5wcm9wcyE9PSEwKWlmKHkmJiF5LmR5bmFtaWNQcm9wcyl5LnByb3BzIT09dm9pZCAwJiYoYS5wcm9wcz1mbi5tZXJnZUV2YWx1YXRlZC5wcm9wcyhzLHkucHJvcHMsYS5wcm9wcykpO2Vsc2V7Y29uc3QgXz1zLnZhcigicHJvcHMiLCgwLGplLl8pYCR7SX0uZXZhbHVhdGVkLnByb3BzYCk7YS5wcm9wcz1mbi5tZXJnZUV2YWx1YXRlZC5wcm9wcyhzLF8sYS5wcm9wcyxqZS5OYW1lKX1pZihhLml0ZW1zIT09ITApaWYoeSYmIXkuZHluYW1pY0l0ZW1zKXkuaXRlbXMhPT12b2lkIDAmJihhLml0ZW1zPWZuLm1lcmdlRXZhbHVhdGVkLml0ZW1zKHMseS5pdGVtcyxhLml0ZW1zKSk7ZWxzZXtjb25zdCBfPXMudmFyKCJpdGVtcyIsKDAsamUuXylgJHtJfS5ldmFsdWF0ZWQuaXRlbXNgKTthLml0ZW1zPWZuLm1lcmdlRXZhbHVhdGVkLml0ZW1zKHMsXyxhLml0ZW1zLGplLk5hbWUpfX19TXQuY2FsbFJlZj1kbixNdC5kZWZhdWx0PUt1O3ZhciBWZT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVmUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLFZlLmNoZWNrTWV0YWRhdGE9dm9pZCAwO2NvbnN0IEJ1PWJlLEp1PXtrZXl3b3JkOiJtZXRhZGF0YSIsc2NoZW1hVHlwZToib2JqZWN0Iixjb2RlKGUpe0ZhKGUpO2NvbnN0e2dlbjp0LHNjaGVtYTpyLGl0Om59PWU7aWYoKDAsQnUuYWx3YXlzVmFsaWRTY2hlbWEpKG4scikpcmV0dXJuO2NvbnN0IHM9dC5uYW1lKCJ2YWxpZCIpO2Uuc3Vic2NoZW1hKHtrZXl3b3JkOiJtZXRhZGF0YSIsanRkTWV0YWRhdGE6ITB9LHMpLGUub2socyl9fTtmdW5jdGlvbiBGYSh7aXQ6ZSxrZXl3b3JkOnR9LHIpe2lmKGUuanRkTWV0YWRhdGEhPT1yKXRocm93IG5ldyBFcnJvcihgSlREOiAiJHt0fSIgY2Fubm90IGJlIHVzZWQgaW4gdGhpcyBzY2hlbWEgbG9jYXRpb25gKX1WZS5jaGVja01ldGFkYXRhPUZhLFZlLmRlZmF1bHQ9SnUsT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxGdC5oYXNSZWY9dm9pZCAwO2NvbnN0IE1hPUNlLFNyPXVlLHF1PWt0LExhPUxlLFZhPU10LEd1PVZlLFF1PXtrZXl3b3JkOiJyZWYiLHNjaGVtYVR5cGU6InN0cmluZyIsY29kZShlKXsoMCxHdS5jaGVja01ldGFkYXRhKShlKTtjb25zdHtnZW46dCxkYXRhOnIsc2NoZW1hOm4scGFyZW50U2NoZW1hOnMsaXQ6YX09ZSx7c2NoZW1hRW52Ontyb290Om99fT1hLGw9dC5uYW1lKCJ2YWxpZCIpO3MubnVsbGFibGU/KHQudmFyKGwsKDAsU3IuXylgJHtyfSA9PT0gbnVsbGApLHQuaWYoKDAsU3Iubm90KShsKSxmKSk6KHQudmFyKGwsITEpLGYoKSksZS5vayhsKTtmdW5jdGlvbiBmKCl7dmFyIGg7Y29uc3QgRT0oaD1vLnNjaGVtYS5kZWZpbml0aW9ucyk9PT1udWxsfHxoPT09dm9pZCAwP3ZvaWQgMDpoW25dO2lmKCFFKXRocm93IG5ldyBxdS5kZWZhdWx0KGEub3B0cy51cmlSZXNvbHZlciwiIixuLGBObyBkZWZpbml0aW9uICR7bn1gKTtycyhFKXx8IWEub3B0cy5pbmxpbmVSZWZzP3AoRSk6aShFKX1mdW5jdGlvbiBwKGgpe2NvbnN0IEU9TWEuY29tcGlsZVNjaGVtYS5jYWxsKGEuc2VsZixuZXcgTWEuU2NoZW1hRW52KHtzY2hlbWE6aCxyb290Om8sc2NoZW1hUGF0aDpgL2RlZmluaXRpb25zLyR7bn1gfSkpLFQ9KDAsVmEuZ2V0VmFsaWRhdGUpKGUsRSksST10LmNvbnN0KCJfZXJycyIsTGEuZGVmYXVsdC5lcnJvcnMpOygwLFZhLmNhbGxSZWYpKGUsVCxFLEUuJGFzeW5jKSx0LmFzc2lnbihsLCgwLFNyLl8pYCR7SX0gPT09ICR7TGEuZGVmYXVsdC5lcnJvcnN9YCl9ZnVuY3Rpb24gaShoKXtjb25zdCBFPXQuc2NvcGVWYWx1ZSgic2NoZW1hIixhLm9wdHMuY29kZS5zb3VyY2U9PT0hMD97cmVmOmgsY29kZTooMCxTci5zdHJpbmdpZnkpKGgpfTp7cmVmOmh9KTtlLnN1YnNjaGVtYSh7c2NoZW1hOmgsZGF0YVR5cGVzOltdLHNjaGVtYVBhdGg6U3IubmlsLHRvcFNjaGVtYVJlZjpFLGVyclNjaGVtYVBhdGg6YC9kZWZpbml0aW9ucy8ke259YH0sbCl9fX07ZnVuY3Rpb24gcnMoZSl7Zm9yKGNvbnN0IHQgaW4gZSl7bGV0IHI7aWYodD09PSJyZWYifHx0eXBlb2Yocj1lW3RdKT09Im9iamVjdCImJnJzKHIpKXJldHVybiEwfXJldHVybiExfUZ0Lmhhc1JlZj1ycyxGdC5kZWZhdWx0PVF1O3ZhciBucz17fSxobj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IFl1PS90fFxzL2ksV3U9L14oXGRcZFxkXGQpLShcZFxkKS0oXGRcZCkkLyxYdT0vXihcZFxkKTooXGRcZCk6KFxkXGQpKD86XC5cZCspPyg/Onp8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pJC9pLFp1PVswLDMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtmdW5jdGlvbiB6YShlLHQpe2NvbnN0IHI9ZS5zcGxpdChZdSk7cmV0dXJuIHIubGVuZ3RoPT09MiYmSGEoclswXSkmJnh1KHJbMV0pfHx0JiZyLmxlbmd0aD09PTEmJkhhKHJbMF0pfWhuLmRlZmF1bHQ9emE7ZnVuY3Rpb24gSGEoZSl7Y29uc3QgdD1XdS5leGVjKGUpO2lmKCF0KXJldHVybiExO2NvbnN0IHI9K3RbMV0sbj0rdFsyXSxzPSt0WzNdO3JldHVybiBuPj0xJiZuPD0xMiYmcz49MSYmKHM8PVp1W25dfHxuPT09MiYmcz09PTI5JiYociUxMDA9PT0wP3IlNDAwPT09MDpyJTQ9PT0wKSl9ZnVuY3Rpb24geHUoZSl7Y29uc3QgdD1YdS5leGVjKGUpO2lmKCF0KXJldHVybiExO2NvbnN0IHI9K3RbMV0sbj0rdFsyXSxzPSt0WzNdLGE9Kyh0WzRdfHwwKSxvPSsodFs1XXx8MCk7cmV0dXJuIHI8PTIzJiZuPD01OSYmczw9NTl8fHItYT09PTIzJiZuLW89PT01OSYmcz09PTYwfXphLmNvZGU9J3JlcXVpcmUoImFqdi9kaXN0L3J1bnRpbWUvdGltZXN0YW1wIikuZGVmYXVsdCc7dmFyIHplPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh6ZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksemUudHlwZUVycm9yUGFyYW1zPXplLnR5cGVFcnJvck1lc3NhZ2U9emUudHlwZUVycm9yPXZvaWQgMDtjb25zdCBlbD11ZTtmdW5jdGlvbiB0bChlKXtyZXR1cm57bWVzc2FnZTp0PT5LYSh0LGUpLHBhcmFtczp0PT5CYSh0LGUpfX16ZS50eXBlRXJyb3I9dGw7ZnVuY3Rpb24gS2Eoe3BhcmVudFNjaGVtYTplfSx0KXtyZXR1cm4gZSE9bnVsbCYmZS5udWxsYWJsZT9gbXVzdCBiZSAke3R9IG9yIG51bGxgOmBtdXN0IGJlICR7dH1gfXplLnR5cGVFcnJvck1lc3NhZ2U9S2E7ZnVuY3Rpb24gQmEoe3BhcmVudFNjaGVtYTplfSx0KXtyZXR1cm4oMCxlbC5fKWB7dHlwZTogJHt0fSwgbnVsbGFibGU6ICR7ISEoZSE9bnVsbCYmZS5udWxsYWJsZSl9fWB9emUudHlwZUVycm9yUGFyYW1zPUJhLGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmludFJhbmdlPXZvaWQgMDtjb25zdCB0PXVlLHI9aG4sbj1iZSxzPVZlLGE9emU7ZS5pbnRSYW5nZT17aW50ODpbLTEyOCwxMjcsM10sdWludDg6WzAsMjU1LDNdLGludDE2OlstMzI3NjgsMzI3NjcsNV0sdWludDE2OlswLDY1NTM1LDVdLGludDMyOlstMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ3LDEwXSx1aW50MzI6WzAsNDI5NDk2NzI5NSwxMF19O2NvbnN0IG89e21lc3NhZ2U6cD0+KDAsYS50eXBlRXJyb3JNZXNzYWdlKShwLHAuc2NoZW1hKSxwYXJhbXM6cD0+KDAsYS50eXBlRXJyb3JQYXJhbXMpKHAscC5zY2hlbWEpfTtmdW5jdGlvbiBsKHApe2NvbnN0e2dlbjppLGRhdGE6aCxpdDpFfT1wLHt0aW1lc3RhbXA6VCxhbGxvd0RhdGU6SX09RS5vcHRzO2lmKFQ9PT0iZGF0ZSIpcmV0dXJuKDAsdC5fKWAke2h9IGluc3RhbmNlb2YgRGF0ZSBgO2NvbnN0IGo9KDAsbi51c2VGdW5jKShpLHIuZGVmYXVsdCkseT1JPygwLHQuXylgLCB0cnVlYDp0Lm5pbCxfPSgwLHQuXylgdHlwZW9mICR7aH0gPT0gInN0cmluZyIgJiYgJHtqfSgke2h9JHt5fSlgO3JldHVybiBUPT09InN0cmluZyI/XzooMCx0Lm9yKSgoMCx0Ll8pYCR7aH0gaW5zdGFuY2VvZiBEYXRlYCxfKX1jb25zdCBmPXtrZXl3b3JkOiJ0eXBlIixzY2hlbWFUeXBlOiJzdHJpbmciLGVycm9yOm8sY29kZShwKXsoMCxzLmNoZWNrTWV0YWRhdGEpKHApO2NvbnN0e2RhdGE6aSxzY2hlbWE6aCxwYXJlbnRTY2hlbWE6RSxpdDpUfT1wO2xldCBJO3N3aXRjaChoKXtjYXNlImJvb2xlYW4iOmNhc2Uic3RyaW5nIjpJPSgwLHQuXylgdHlwZW9mICR7aX0gPT0gJHtofWA7YnJlYWs7Y2FzZSJ0aW1lc3RhbXAiOntJPWwocCk7YnJlYWt9Y2FzZSJmbG9hdDMyIjpjYXNlImZsb2F0NjQiOkk9KDAsdC5fKWB0eXBlb2YgJHtpfSA9PSAibnVtYmVyImA7YnJlYWs7ZGVmYXVsdDp7Y29uc3Qgaj1oO2lmKEk9KDAsdC5fKWB0eXBlb2YgJHtpfSA9PSAibnVtYmVyIiAmJiBpc0Zpbml0ZSgke2l9KSAmJiAhKCR7aX0gJSAxKWAsIVQub3B0cy5pbnQzMnJhbmdlJiYoaj09PSJpbnQzMiJ8fGo9PT0idWludDMyIikpaj09PSJ1aW50MzIiJiYoST0oMCx0Ll8pYCR7SX0gJiYgJHtpfSA+PSAwYCk7ZWxzZXtjb25zdFt5LF9dPWUuaW50UmFuZ2Vbal07ST0oMCx0Ll8pYCR7SX0gJiYgJHtpfSA+PSAke3l9ICYmICR7aX0gPD0gJHtffWB9fX1wLnBhc3MoRS5udWxsYWJsZT8oMCx0Lm9yKSgoMCx0Ll8pYCR7aX0gPT09IG51bGxgLEkpOkkpfX07ZS5kZWZhdWx0PWZ9KG5zKTt2YXIgc3M9e30seGU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHhlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx4ZS5jaGVja051bGxhYmxlT2JqZWN0PXhlLmNoZWNrTnVsbGFibGU9dm9pZCAwO2NvbnN0IHBuPXVlO2Z1bmN0aW9uIEphKHtnZW46ZSxkYXRhOnQscGFyZW50U2NoZW1hOnJ9LG49cG4ubmlsKXtjb25zdCBzPWUubmFtZSgidmFsaWQiKTtyZXR1cm4gci5udWxsYWJsZT8oZS5sZXQocywoMCxwbi5fKWAke3R9ID09PSBudWxsYCksbj0oMCxwbi5ub3QpKHMpKTplLmxldChzLCExKSxbcyxuXX14ZS5jaGVja051bGxhYmxlPUphO2Z1bmN0aW9uIHJsKGUsdCl7Y29uc3RbcixuXT1KYShlLHQpO3JldHVybltyLCgwLHBuLl8pYCR7bn0gJiYgdHlwZW9mICR7ZS5kYXRhfSA9PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheSgke2UuZGF0YX0pYF19eGUuY2hlY2tOdWxsYWJsZU9iamVjdD1ybCxPYmplY3QuZGVmaW5lUHJvcGVydHkoc3MsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IHd0PXVlLG5sPVZlLHNsPXhlLGFsPXtrZXl3b3JkOiJlbnVtIixzY2hlbWFUeXBlOiJhcnJheSIsZXJyb3I6e21lc3NhZ2U6Im11c3QgYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlcyIscGFyYW1zOih7c2NoZW1hQ29kZTplfSk9PigwLHd0Ll8pYHthbGxvd2VkVmFsdWVzOiAke2V9fWB9LGNvZGUoZSl7KDAsbmwuY2hlY2tNZXRhZGF0YSkoZSk7Y29uc3R7Z2VuOnQsZGF0YTpyLHNjaGVtYTpuLHNjaGVtYVZhbHVlOnMscGFyZW50U2NoZW1hOmEsaXQ6b309ZTtpZihuLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJlbnVtIG11c3QgaGF2ZSBub24tZW1wdHkgYXJyYXkiKTtpZihuLmxlbmd0aCE9PW5ldyBTZXQobikuc2l6ZSl0aHJvdyBuZXcgRXJyb3IoImVudW0gaXRlbXMgbXVzdCBiZSB1bmlxdWUiKTtsZXQgbDtjb25zdCBmPSgwLHd0Ll8pYHR5cGVvZiAke3J9ID09ICJzdHJpbmciYDtpZihuLmxlbmd0aD49by5vcHRzLmxvb3BFbnVtKXtsZXQgaTtbbCxpXT0oMCxzbC5jaGVja051bGxhYmxlKShlLGYpLHQuaWYoaSxwKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KG4pKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7bD0oMCx3dC5hbmQpKGYsKDAsd3Qub3IpKC4uLm4ubWFwKGk9PigwLHd0Ll8pYCR7cn0gPT09ICR7aX1gKSkpLGEubnVsbGFibGUmJihsPSgwLHd0Lm9yKSgoMCx3dC5fKWAke3J9ID09PSBudWxsYCxsKSl9ZS5wYXNzKGwpO2Z1bmN0aW9uIHAoKXt0LmZvck9mKCJ2IixzLGk9PnQuaWYoKDAsd3QuXylgJHtsfSA9ICR7cn0gPT09ICR7aX1gLCgpPT50LmJyZWFrKCkpKX19fTtzcy5kZWZhdWx0PWFsO3ZhciBhcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IG9sPWJlLGlsPW5lLHFhPXVlLGNsPVZlLHVsPXhlLGxsPXtrZXl3b3JkOiJlbGVtZW50cyIsc2NoZW1hVHlwZToib2JqZWN0IixlcnJvcjooMCx6ZS50eXBlRXJyb3IpKCJhcnJheSIpLGNvZGUoZSl7KDAsY2wuY2hlY2tNZXRhZGF0YSkoZSk7Y29uc3R7Z2VuOnQsZGF0YTpyLHNjaGVtYTpuLGl0OnN9PWU7aWYoKDAsb2wuYWx3YXlzVmFsaWRTY2hlbWEpKHMsbikpcmV0dXJuO2NvbnN0W2FdPSgwLHVsLmNoZWNrTnVsbGFibGUpKGUpO3QuaWYoKDAscWEubm90KShhKSwoKT0+dC5pZigoMCxxYS5fKWBBcnJheS5pc0FycmF5KCR7cn0pYCwoKT0+dC5hc3NpZ24oYSwoMCxpbC52YWxpZGF0ZUFycmF5KShlKSksKCk9PmUuZXJyb3IoKSkpLGUub2soYSl9fTthcy5kZWZhdWx0PWxsO3ZhciBvcz17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUudmFsaWRhdGVQcm9wZXJ0aWVzPWUuZXJyb3I9dm9pZCAwO2NvbnN0IHQ9bmUscj1iZSxuPXVlLHM9VmUsYT14ZSxvPXplO3ZhciBsOyhmdW5jdGlvbihpKXtpLkFkZGl0aW9uYWw9ImFkZGl0aW9uYWwiLGkuTWlzc2luZz0ibWlzc2luZyJ9KShsfHwobD17fSkpLGUuZXJyb3I9e21lc3NhZ2U6aT0+e2NvbnN0e3BhcmFtczpofT1pO3JldHVybiBoLnByb3BFcnJvcj9oLnByb3BFcnJvcj09PWwuQWRkaXRpb25hbD8ibXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMiOmBtdXN0IGhhdmUgcHJvcGVydHkgJyR7aC5taXNzaW5nUHJvcGVydHl9J2A6KDAsby50eXBlRXJyb3JNZXNzYWdlKShpLCJvYmplY3QiKX0scGFyYW1zOmk9Pntjb25zdHtwYXJhbXM6aH09aTtyZXR1cm4gaC5wcm9wRXJyb3I/aC5wcm9wRXJyb3I9PT1sLkFkZGl0aW9uYWw/KDAsbi5fKWB7ZXJyb3I6ICR7aC5wcm9wRXJyb3J9LCBhZGRpdGlvbmFsUHJvcGVydHk6ICR7aC5hZGRpdGlvbmFsUHJvcGVydHl9fWA6KDAsbi5fKWB7ZXJyb3I6ICR7aC5wcm9wRXJyb3J9LCBtaXNzaW5nUHJvcGVydHk6ICR7aC5taXNzaW5nUHJvcGVydHl9fWA6KDAsby50eXBlRXJyb3JQYXJhbXMpKGksIm9iamVjdCIpfX07Y29uc3QgZj17a2V5d29yZDoicHJvcGVydGllcyIsc2NoZW1hVHlwZToib2JqZWN0IixlcnJvcjplLmVycm9yLGNvZGU6cH07ZnVuY3Rpb24gcChpKXsoMCxzLmNoZWNrTWV0YWRhdGEpKGkpO2NvbnN0e2dlbjpoLGRhdGE6RSxwYXJlbnRTY2hlbWE6VCxpdDpJfT1pLHthZGRpdGlvbmFsUHJvcGVydGllczpqLG51bGxhYmxlOnl9PVQ7aWYoSS5qdGREaXNjcmltaW5hdG9yJiZ5KXRocm93IG5ldyBFcnJvcigiSlREOiBudWxsYWJsZSBpbnNpZGUgZGlzY3JpbWluYXRvciBtYXBwaW5nIik7aWYoTigpKXRocm93IG5ldyBFcnJvcigiSlREOiBwcm9wZXJ0aWVzIGFuZCBvcHRpb25hbFByb3BlcnRpZXMgaGF2ZSBjb21tb24gbWVtYmVycyIpO2NvbnN0W18sYl09RCgicHJvcGVydGllcyIpLFtPLEFdPUQoIm9wdGlvbmFsUHJvcGVydGllcyIpO2lmKGIubGVuZ3RoPT09MCYmQS5sZW5ndGg9PT0wJiZqKXJldHVybjtjb25zdFtILCRdPUkuanRkRGlzY3JpbWluYXRvcj09PXZvaWQgMD8oMCxhLmNoZWNrTnVsbGFibGVPYmplY3QpKGksRSk6W2gubGV0KCJ2YWxpZCIsITEpLCEwXTtoLmlmKCQsKCk9PmguYXNzaWduKEgsITApLmJsb2NrKCgpPT57QihiLCJwcm9wZXJ0aWVzIiwhMCksQihBLCJvcHRpb25hbFByb3BlcnRpZXMiKSxqfHxwZSgpfSkpLGkucGFzcyhIKTtmdW5jdGlvbiBOKCl7Y29uc3Qgb2U9VC5wcm9wZXJ0aWVzLFg9VC5vcHRpb25hbFByb3BlcnRpZXM7aWYoIShvZSYmWCkpcmV0dXJuITE7Zm9yKGNvbnN0IHZlIGluIG9lKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChYLHZlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBEKG9lKXtjb25zdCBYPVRbb2VdLHZlPVg/KDAsdC5hbGxTY2hlbWFQcm9wZXJ0aWVzKShYKTpbXTtpZihJLmp0ZERpc2NyaW1pbmF0b3ImJnZlLnNvbWUoTmU9Pk5lPT09SS5qdGREaXNjcmltaW5hdG9yKSl0aHJvdyBuZXcgRXJyb3IoYEpURDogZGlzY3JpbWluYXRvciB0YWcgdXNlZCBpbiAke29lfWApO2NvbnN0IEVlPXZlLmZpbHRlcihOZT0+ISgwLHIuYWx3YXlzVmFsaWRTY2hlbWEpKEksWFtOZV0pKTtyZXR1cm5bdmUsRWVdfWZ1bmN0aW9uIEIob2UsWCx2ZSl7Y29uc3QgRWU9aC52YXIoInZhbGlkIik7Zm9yKGNvbnN0IEJlIG9mIG9lKWguaWYoKDAsdC5wcm9wZXJ0eUluRGF0YSkoaCxFLEJlLEkub3B0cy5vd25Qcm9wZXJ0aWVzKSwoKT0+RyhCZSxYLEVlKSwoKT0+TmUoQmUpKSxpLm9rKEVlKTtmdW5jdGlvbiBOZShCZSl7dmU/KGguYXNzaWduKEVlLCExKSxpLmVycm9yKCExLHtwcm9wRXJyb3I6bC5NaXNzaW5nLG1pc3NpbmdQcm9wZXJ0eTpCZX0se3NjaGVtYVBhdGg6QmV9KSk6aC5hc3NpZ24oRWUsITApfX1mdW5jdGlvbiBHKG9lLFgsdmUpe2kuc3Vic2NoZW1hKHtrZXl3b3JkOlgsc2NoZW1hUHJvcDpvZSxkYXRhUHJvcDpvZX0sdmUpfWZ1bmN0aW9uIHBlKCl7aC5mb3JJbigia2V5IixFLG9lPT57Y29uc3QgWD1JLmp0ZERpc2NyaW1pbmF0b3I9PT12b2lkIDA/XzpbSS5qdGREaXNjcmltaW5hdG9yXS5jb25jYXQoXyksdmU9VyhvZSxYLCJwcm9wZXJ0aWVzIiksRWU9VyhvZSxPLCJvcHRpb25hbFByb3BlcnRpZXMiKSxOZT12ZT09PSEwP0VlOkVlPT09ITA/dmU6KDAsbi5hbmQpKHZlLEVlKTtoLmlmKE5lLCgpPT57SS5vcHRzLnJlbW92ZUFkZGl0aW9uYWw/aC5jb2RlKCgwLG4uXylgZGVsZXRlICR7RX1bJHtvZX1dYCk6KGkuZXJyb3IoITEse3Byb3BFcnJvcjpsLkFkZGl0aW9uYWwsYWRkaXRpb25hbFByb3BlcnR5Om9lfSx7aW5zdGFuY2VQYXRoOm9lLHBhcmVudFNjaGVtYTohMH0pLEkub3B0cy5hbGxFcnJvcnN8fGguYnJlYWsoKSl9KX0pfWZ1bmN0aW9uIFcob2UsWCx2ZSl7bGV0IEVlO2lmKFgubGVuZ3RoPjgpe2NvbnN0IE5lPSgwLHIuc2NoZW1hUmVmT3JWYWwpKEksVFt2ZV0sdmUpO0VlPSgwLG4ubm90KSgoMCx0LmlzT3duUHJvcGVydHkpKGgsTmUsb2UpKX1lbHNlIFgubGVuZ3RoP0VlPSgwLG4uYW5kKSguLi5YLm1hcChOZT0+KDAsbi5fKWAke29lfSAhPT0gJHtOZX1gKSk6RWU9ITA7cmV0dXJuIEVlfX1lLnZhbGlkYXRlUHJvcGVydGllcz1wLGUuZGVmYXVsdD1mfSkob3MpO3ZhciBpcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IEdhPW9zLGZsPXtrZXl3b3JkOiJvcHRpb25hbFByb3BlcnRpZXMiLHNjaGVtYVR5cGU6Im9iamVjdCIsZXJyb3I6R2EuZXJyb3IsY29kZShlKXtlLnBhcmVudFNjaGVtYS5wcm9wZXJ0aWVzfHwoMCxHYS52YWxpZGF0ZVByb3BlcnRpZXMpKGUpfX07aXMuZGVmYXVsdD1mbDt2YXIgY3M9e30sUWE9e307KGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLkRpc2NyRXJyb3I9dm9pZCAwLGZ1bmN0aW9uKHQpe3QuVGFnPSJ0YWciLHQuTWFwcGluZz0ibWFwcGluZyJ9KGUuRGlzY3JFcnJvcnx8KGUuRGlzY3JFcnJvcj17fSkpfSkoUWEpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgTHQ9dWUsZGw9VmUsaGw9eGUsWWE9emUsbW49UWEscGw9e2tleXdvcmQ6ImRpc2NyaW1pbmF0b3IiLHNjaGVtYVR5cGU6InN0cmluZyIsaW1wbGVtZW50czpbIm1hcHBpbmciXSxlcnJvcjp7bWVzc2FnZTplPT57Y29uc3R7c2NoZW1hOnQscGFyYW1zOnJ9PWU7cmV0dXJuIHIuZGlzY3JFcnJvcj9yLmRpc2NyRXJyb3I9PT1tbi5EaXNjckVycm9yLlRhZz9gdGFnICIke3R9IiBtdXN0IGJlIHN0cmluZ2A6YHZhbHVlIG9mIHRhZyAiJHt0fSIgbXVzdCBiZSBpbiBtYXBwaW5nYDooMCxZYS50eXBlRXJyb3JNZXNzYWdlKShlLCJvYmplY3QiKX0scGFyYW1zOmU9Pntjb25zdHtzY2hlbWE6dCxwYXJhbXM6cn09ZTtyZXR1cm4gci5kaXNjckVycm9yPygwLEx0Ll8pYHtlcnJvcjogJHtyLmRpc2NyRXJyb3J9LCB0YWc6ICR7dH0sIHRhZ1ZhbHVlOiAke3IudGFnfX1gOigwLFlhLnR5cGVFcnJvclBhcmFtcykoZSwib2JqZWN0Iil9fSxjb2RlKGUpeygwLGRsLmNoZWNrTWV0YWRhdGEpKGUpO2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bixwYXJlbnRTY2hlbWE6c309ZSxbYSxvXT0oMCxobC5jaGVja051bGxhYmxlT2JqZWN0KShlLHIpO3QuaWYobyksbCgpLHQuZWxzZUlmKCgwLEx0Lm5vdCkoYSkpLGUuZXJyb3IoKSx0LmVuZElmKCksZS5vayhhKTtmdW5jdGlvbiBsKCl7Y29uc3QgaT10LmNvbnN0KCJ0YWciLCgwLEx0Ll8pYCR7cn0keygwLEx0LmdldFByb3BlcnR5KShuKX1gKTt0LmlmKCgwLEx0Ll8pYCR7aX0gPT09IHVuZGVmaW5lZGApLGUuZXJyb3IoITEse2Rpc2NyRXJyb3I6bW4uRGlzY3JFcnJvci5UYWcsdGFnOml9KSx0LmVsc2VJZigoMCxMdC5fKWB0eXBlb2YgJHtpfSA9PSAic3RyaW5nImApLGYoaSksdC5lbHNlKCksZS5lcnJvcighMSx7ZGlzY3JFcnJvcjptbi5EaXNjckVycm9yLlRhZyx0YWc6aX0se2luc3RhbmNlUGF0aDpufSksdC5lbmRJZigpfWZ1bmN0aW9uIGYoaSl7dC5pZighMSk7Zm9yKGNvbnN0IGggaW4gcy5tYXBwaW5nKXQuZWxzZUlmKCgwLEx0Ll8pYCR7aX0gPT09ICR7aH1gKSx0LmFzc2lnbihhLHAoaCkpO3QuZWxzZSgpLGUuZXJyb3IoITEse2Rpc2NyRXJyb3I6bW4uRGlzY3JFcnJvci5NYXBwaW5nLHRhZzppfSx7aW5zdGFuY2VQYXRoOm4sc2NoZW1hUGF0aDoibWFwcGluZyIscGFyZW50U2NoZW1hOiEwfSksdC5lbmRJZigpfWZ1bmN0aW9uIHAoaSl7Y29uc3QgaD10Lm5hbWUoInZhbGlkIik7cmV0dXJuIGUuc3Vic2NoZW1hKHtrZXl3b3JkOiJtYXBwaW5nIixzY2hlbWFQcm9wOmksanRkRGlzY3JpbWluYXRvcjpufSxoKSxofX19O2NzLmRlZmF1bHQ9cGw7dmFyIHVzPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1cywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgV2E9YmUsWGE9dWUsbWw9VmUsdmw9eGUsX2w9e2tleXdvcmQ6InZhbHVlcyIsc2NoZW1hVHlwZToib2JqZWN0IixlcnJvcjooMCx6ZS50eXBlRXJyb3IpKCJvYmplY3QiKSxjb2RlKGUpeygwLG1sLmNoZWNrTWV0YWRhdGEpKGUpO2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bixpdDpzfT1lO2lmKCgwLFdhLmFsd2F5c1ZhbGlkU2NoZW1hKShzLG4pKXJldHVybjtjb25zdFthLG9dPSgwLHZsLmNoZWNrTnVsbGFibGVPYmplY3QpKGUscik7dC5pZihvKSx0LmFzc2lnbihhLGwoKSksdC5lbHNlSWYoKDAsWGEubm90KShhKSksZS5lcnJvcigpLHQuZW5kSWYoKSxlLm9rKGEpO2Z1bmN0aW9uIGwoKXtjb25zdCBmPXQubmFtZSgidmFsaWQiKTtpZihzLmFsbEVycm9ycyl7Y29uc3QgaT10LmxldCgidmFsaWQiLCEwKTtyZXR1cm4gcCgoKT0+dC5hc3NpZ24oaSwhMSkpLGl9cmV0dXJuIHQudmFyKGYsITApLHAoKCk9PnQuYnJlYWsoKSksZjtmdW5jdGlvbiBwKGkpe3QuZm9ySW4oImtleSIscixoPT57ZS5zdWJzY2hlbWEoe2tleXdvcmQ6InZhbHVlcyIsZGF0YVByb3A6aCxkYXRhUHJvcFR5cGU6V2EuVHlwZS5TdHJ9LGYpLHQuaWYoKDAsWGEubm90KShmKSxpKX0pfX19fTt1cy5kZWZhdWx0PV9sO3ZhciBscz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkobHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2NvbnN0IGdsPXtrZXl3b3JkOiJ1bmlvbiIsc2NoZW1hVHlwZToiYXJyYXkiLHRyYWNrRXJyb3JzOiEwLGNvZGU6bmUudmFsaWRhdGVVbmlvbixlcnJvcjp7bWVzc2FnZToibXVzdCBtYXRjaCBhIHNjaGVtYSBpbiB1bmlvbiJ9fTtscy5kZWZhdWx0PWdsLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgRWw9RnQseWw9bnMsJGw9c3Msd2w9YXMsU2w9b3MsUmw9aXMsYmw9Y3MsT2w9dXMsTmw9bHMsUGw9VmUsVGw9WyJkZWZpbml0aW9ucyIsRWwuZGVmYXVsdCx5bC5kZWZhdWx0LCRsLmRlZmF1bHQsd2wuZGVmYXVsdCxTbC5kZWZhdWx0LFJsLmRlZmF1bHQsYmwuZGVmYXVsdCxPbC5kZWZhdWx0LE5sLmRlZmF1bHQsUGwuZGVmYXVsdCx7a2V5d29yZDoiYWRkaXRpb25hbFByb3BlcnRpZXMiLHNjaGVtYVR5cGU6ImJvb2xlYW4ifSx7a2V5d29yZDoibnVsbGFibGUiLHNjaGVtYVR5cGU6ImJvb2xlYW4ifV07dHMuZGVmYXVsdD1UbDt2YXIgZnM9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBkdD1lPT57Y29uc3QgdD17bnVsbGFibGU6e3R5cGU6ImJvb2xlYW4ifSxtZXRhZGF0YTp7b3B0aW9uYWxQcm9wZXJ0aWVzOnt1bmlvbjp7ZWxlbWVudHM6e3JlZjoic2NoZW1hIn19fSxhZGRpdGlvbmFsUHJvcGVydGllczohMH19O3JldHVybiBlJiYodC5kZWZpbml0aW9ucz17dmFsdWVzOntyZWY6InNjaGVtYSJ9fSksdH0sQWw9ZT0+KHtvcHRpb25hbFByb3BlcnRpZXM6ZHQoZSl9KSxDbD1lPT4oe3Byb3BlcnRpZXM6e3JlZjp7dHlwZToic3RyaW5nIn19LG9wdGlvbmFsUHJvcGVydGllczpkdChlKX0pLElsPWU9Pih7cHJvcGVydGllczp7dHlwZTp7ZW51bTpbImJvb2xlYW4iLCJ0aW1lc3RhbXAiLCJzdHJpbmciLCJmbG9hdDMyIiwiZmxvYXQ2NCIsImludDgiLCJ1aW50OCIsImludDE2IiwidWludDE2IiwiaW50MzIiLCJ1aW50MzIiXX19LG9wdGlvbmFsUHJvcGVydGllczpkdChlKX0pLERsPWU9Pih7cHJvcGVydGllczp7ZW51bTp7ZWxlbWVudHM6e3R5cGU6InN0cmluZyJ9fX0sb3B0aW9uYWxQcm9wZXJ0aWVzOmR0KGUpfSksamw9ZT0+KHtwcm9wZXJ0aWVzOntlbGVtZW50czp7cmVmOiJzY2hlbWEifX0sb3B0aW9uYWxQcm9wZXJ0aWVzOmR0KGUpfSksWmE9ZT0+KHtwcm9wZXJ0aWVzOntwcm9wZXJ0aWVzOnt2YWx1ZXM6e3JlZjoic2NoZW1hIn19fSxvcHRpb25hbFByb3BlcnRpZXM6USh7b3B0aW9uYWxQcm9wZXJ0aWVzOnt2YWx1ZXM6e3JlZjoic2NoZW1hIn19LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnt0eXBlOiJib29sZWFuIn19LGR0KGUpKX0pLHhhPWU9Pih7cHJvcGVydGllczp7b3B0aW9uYWxQcm9wZXJ0aWVzOnt2YWx1ZXM6e3JlZjoic2NoZW1hIn19fSxvcHRpb25hbFByb3BlcnRpZXM6USh7YWRkaXRpb25hbFByb3BlcnRpZXM6e3R5cGU6ImJvb2xlYW4ifX0sZHQoZSkpfSksa2w9ZT0+KHtwcm9wZXJ0aWVzOntkaXNjcmltaW5hdG9yOnt0eXBlOiJzdHJpbmcifSxtYXBwaW5nOnt2YWx1ZXM6e21ldGFkYXRhOnt1bmlvbjpbWmEoITEpLHhhKCExKV19fX19LG9wdGlvbmFsUHJvcGVydGllczpkdChlKX0pLFVsPWU9Pih7cHJvcGVydGllczp7dmFsdWVzOntyZWY6InNjaGVtYSJ9fSxvcHRpb25hbFByb3BlcnRpZXM6ZHQoZSl9KSxlbz1lPT4oe21ldGFkYXRhOnt1bmlvbjpbQWwsQ2wsSWwsRGwsamwsWmEseGEsa2wsVWxdLm1hcCh0PT50KGUpKX19KSxGbD1RKHtkZWZpbml0aW9uczp7c2NoZW1hOmVvKCExKX19LGVvKCEwKSk7ZnMuZGVmYXVsdD1GbDt2YXIgZHM9e30sUnI9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFJyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxSci5qdGRGb3Jtcz12b2lkIDAsUnIuanRkRm9ybXM9WyJlbGVtZW50cyIsInZhbHVlcyIsImRpc2NyaW1pbmF0b3IiLCJwcm9wZXJ0aWVzIiwib3B0aW9uYWxQcm9wZXJ0aWVzIiwiZW51bSIsInR5cGUiLCJyZWYiXTt2YXIgaHM9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGhzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBwcz0vW1xcIlx1MDAwMC1cdTAwMWZcdTAwN2YtXHUwMDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csTWw9eyJcYiI6IlxcYiIsIgkiOiJcXHQiLCJcbiI6IlxcbiIsIlxmIjoiXFxmIiwiXHIiOiJcXHIiLCciJzonXFwiJywiXFwiOiJcXFxcIn07ZnVuY3Rpb24gdG8oZSl7cmV0dXJuIHBzLmxhc3RJbmRleD0wLCciJysocHMudGVzdChlKT9lLnJlcGxhY2UocHMsdD0+e2NvbnN0IHI9TWxbdF07cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIj9yOiJcXHUiKygiMDAwMCIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSk6ZSkrJyInfWhzLmRlZmF1bHQ9dG8sdG8uY29kZT0ncmVxdWlyZSgiYWp2L2Rpc3QvcnVudGltZS9xdW90ZSIpLmRlZmF1bHQnLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkcywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7Y29uc3QgTGw9UnIscm89Q2UsdGU9dWUsVmw9a3QsaGU9TGUsemw9bmUsSGw9RnQsS2w9YmUsQmw9aHMsSmw9e2VsZW1lbnRzOkdsLHZhbHVlczpRbCxkaXNjcmltaW5hdG9yOllsLHByb3BlcnRpZXM6YW8sb3B0aW9uYWxQcm9wZXJ0aWVzOmFvLGVudW06T3IsdHlwZTpXbCxyZWY6Wmx9O2Z1bmN0aW9uIG5vKGUsdCl7Y29uc3Qgcj1yby5nZXRDb21waWxpbmdTY2hlbWEuY2FsbCh0aGlzLGUpO2lmKHIpcmV0dXJuIHI7Y29uc3R7ZXM1Om4sbGluZXM6c309dGhpcy5vcHRzLmNvZGUse293blByb3BlcnRpZXM6YX09dGhpcy5vcHRzLG89bmV3IHRlLkNvZGVHZW4odGhpcy5zY29wZSx7ZXM1Om4sbGluZXM6cyxvd25Qcm9wZXJ0aWVzOmF9KSxsPW8uc2NvcGVOYW1lKCJzZXJpYWxpemUiKSxmPXtzZWxmOnRoaXMsZ2VuOm8sc2NoZW1hOmUuc2NoZW1hLHNjaGVtYUVudjplLGRlZmluaXRpb25zOnQsZGF0YTpoZS5kZWZhdWx0LmRhdGF9O2xldCBwO3RyeXt0aGlzLl9jb21waWxhdGlvbnMuYWRkKGUpLGUuc2VyaWFsaXplTmFtZT1sLG8uZnVuYyhsLGhlLmRlZmF1bHQuZGF0YSwhMSwoKT0+e28ubGV0KGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYGApLGJyKGYpLG8ucmV0dXJuKGhlLmRlZmF1bHQuanNvbil9KSxvLm9wdGltaXplKHRoaXMub3B0cy5jb2RlLm9wdGltaXplKTtjb25zdCBpPW8udG9TdHJpbmcoKTtwPWAke28uc2NvcGVSZWZzKGhlLmRlZmF1bHQuc2NvcGUpfXJldHVybiAke2l9YDtjb25zdCBFPW5ldyBGdW5jdGlvbihgJHtoZS5kZWZhdWx0LnNjb3BlfWAscCkodGhpcy5zY29wZS5nZXQoKSk7dGhpcy5zY29wZS52YWx1ZShsLHtyZWY6RX0pLGUuc2VyaWFsaXplPUV9Y2F0Y2goaSl7dGhyb3cgcCYmdGhpcy5sb2dnZXIuZXJyb3IoIkVycm9yIGNvbXBpbGluZyBzZXJpYWxpemVyLCBmdW5jdGlvbiBjb2RlOiIscCksZGVsZXRlIGUuc2VyaWFsaXplLGRlbGV0ZSBlLnNlcmlhbGl6ZU5hbWUsaX1maW5hbGx5e3RoaXMuX2NvbXBpbGF0aW9ucy5kZWxldGUoZSl9cmV0dXJuIGV9ZHMuZGVmYXVsdD1ubztmdW5jdGlvbiBicihlKXtsZXQgdDtmb3IoY29uc3QgciBvZiBMbC5qdGRGb3JtcylpZihyIGluIGUuc2NoZW1hKXt0PXI7YnJlYWt9cWwoZSx0P0psW3RdOmVmKX1mdW5jdGlvbiBxbChlLHQpe2NvbnN0e2dlbjpyLHNjaGVtYTpuLGRhdGE6c309ZTtpZighbi5udWxsYWJsZSlyZXR1cm4gdChlKTtyLmlmKCgwLHRlLl8pYCR7c30gPT09IHVuZGVmaW5lZCB8fCAke3N9ID09PSBudWxsYCwoKT0+ci5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLl8pYCJudWxsImApLCgpPT50KGUpKX1mdW5jdGlvbiBHbChlKXtjb25zdHtnZW46dCxzY2hlbWE6cixkYXRhOm59PWU7dC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLnN0cilgW2ApO2NvbnN0IHM9dC5sZXQoImZpcnN0IiwhMCk7dC5mb3JPZigiZWwiLG4sYT0+e2lvKGUscyksYnIobGUoUSh7fSxlKSx7c2NoZW1hOnIuZWxlbWVudHMsZGF0YTphfSkpfSksdC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLnN0cilgXWApfWZ1bmN0aW9uIFFsKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZTt0LmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWB7YCk7Y29uc3Qgcz10LmxldCgiZmlyc3QiLCEwKTt0LmZvckluKCJrZXkiLG4sYT0+c28oZSxhLHIudmFsdWVzLHMpKSx0LmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWB9YCl9ZnVuY3Rpb24gc28oZSx0LHIsbil7Y29uc3R7Z2VuOnMsZGF0YTphfT1lO2lvKGUsbiksT3IobGUoUSh7fSxlKSx7ZGF0YTp0fSkpLHMuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYDpgKTtjb25zdCBvPXMuY29uc3QoInZhbHVlIiwoMCx0ZS5fKWAke2F9JHsoMCx0ZS5nZXRQcm9wZXJ0eSkodCl9YCk7YnIobGUoUSh7fSxlKSx7c2NoZW1hOnIsZGF0YTpvfSkpfWZ1bmN0aW9uIFlsKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZSx7ZGlzY3JpbWluYXRvcjpzfT1yO3QuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYHske0pTT04uc3RyaW5naWZ5KHMpfTpgKTtjb25zdCBhPXQuY29uc3QoInRhZyIsKDAsdGUuXylgJHtufSR7KDAsdGUuZ2V0UHJvcGVydHkpKHMpfWApO09yKGxlKFEoe30sZSkse2RhdGE6YX0pKSx0LmlmKCExKTtmb3IoY29uc3QgbyBpbiByLm1hcHBpbmcpe3QuZWxzZUlmKCgwLHRlLl8pYCR7YX0gPT09ICR7b31gKTtjb25zdCBsPXIubWFwcGluZ1tvXTtvbyhsZShRKHt9LGUpLHtzY2hlbWE6bH0pLHMpfXQuZW5kSWYoKSx0LmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWB9YCl9ZnVuY3Rpb24gYW8oZSl7Y29uc3R7Z2VuOnR9PWU7dC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLnN0cilge2ApLG9vKGUpLHQuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYH1gKX1mdW5jdGlvbiBvbyhlLHQpe2NvbnN0e2dlbjpyLHNjaGVtYTpuLGRhdGE6c309ZSx7cHJvcGVydGllczphLG9wdGlvbmFsUHJvcGVydGllczpvfT1uLGw9aChhKSxmPWgobykscD1FKGwuY29uY2F0KGYpKTtsZXQgaT0hdDtmb3IoY29uc3QgeSBvZiBsKUkoeSxhW3ldLFQoeSkpO2Zvcihjb25zdCB5IG9mIGYpe2NvbnN0IF89VCh5KTtyLmlmKCgwLHRlLmFuZCkoKDAsdGUuXylgJHtffSAhPT0gdW5kZWZpbmVkYCwoMCx6bC5pc093blByb3BlcnR5KShyLHMseSkpLCgpPT5JKHksb1t5XSxfKSl9bi5hZGRpdGlvbmFsUHJvcGVydGllcyYmci5mb3JJbigia2V5IixzLHk9PnIuaWYoaih5LHApLCgpPT5zbyhlLHkse30sci5sZXQoImZpcnN0IixpKSkpKTtmdW5jdGlvbiBoKHkpe3JldHVybiB5P09iamVjdC5rZXlzKHkpOltdfWZ1bmN0aW9uIEUoeSl7aWYodCYmeS5wdXNoKHQpLG5ldyBTZXQoeSkuc2l6ZSE9PXkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSlREOiBwcm9wZXJ0aWVzL29wdGlvbmFsUHJvcGVydGllcy9kaXNjaW1pbmF0b3Igb3ZlcmxhcCIpO3JldHVybiB5fWZ1bmN0aW9uIFQoeSl7cmV0dXJuIHIuY29uc3QoInZhbHVlIiwoMCx0ZS5fKWAke3N9JHsoMCx0ZS5nZXRQcm9wZXJ0eSkoeSl9YCl9ZnVuY3Rpb24gSSh5LF8sYil7aT9pPSExOnIuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5zdHIpYCxgKSxyLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWAke0pTT04uc3RyaW5naWZ5KHkpfTpgKSxicihsZShRKHt9LGUpLHtzY2hlbWE6XyxkYXRhOmJ9KSl9ZnVuY3Rpb24gaih5LF8pe3JldHVybiBfLmxlbmd0aD8oMCx0ZS5hbmQpKC4uLl8ubWFwKGI9PigwLHRlLl8pYCR7eX0gIT09ICR7Yn1gKSk6ITB9fWZ1bmN0aW9uIFdsKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZTtzd2l0Y2goci50eXBlKXtjYXNlImJvb2xlYW4iOnQuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5fKWAke259ID8gInRydWUiIDogImZhbHNlImApO2JyZWFrO2Nhc2Uic3RyaW5nIjpPcihlKTticmVhaztjYXNlInRpbWVzdGFtcCI6dC5pZigoMCx0ZS5fKWAke259IGluc3RhbmNlb2YgRGF0ZWAsKCk9PnQuYWRkKGhlLmRlZmF1bHQuanNvbiwoMCx0ZS5fKWAnIicgKyAke259LnRvSVNPU3RyaW5nKCkgKyAnIidgKSwoKT0+T3IoZSkpO2JyZWFrO2RlZmF1bHQ6WGwoZSl9fWZ1bmN0aW9uIE9yKHtnZW46ZSxkYXRhOnR9KXtlLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuXylgJHsoMCxLbC51c2VGdW5jKShlLEJsLmRlZmF1bHQpfSgke3R9KWApfWZ1bmN0aW9uIFhsKHtnZW46ZSxkYXRhOnR9KXtlLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuXylgIiIgKyAke3R9YCl9ZnVuY3Rpb24gWmwoZSl7Y29uc3R7Z2VuOnQsc2VsZjpyLGRhdGE6bixkZWZpbml0aW9uczpzLHNjaGVtYTphLHNjaGVtYUVudjpvfT1lLHtyZWY6bH09YSxmPXNbbF07aWYoIWYpdGhyb3cgbmV3IFZsLmRlZmF1bHQoci5vcHRzLnVyaVJlc29sdmVyLCIiLGwsYE5vIGRlZmluaXRpb24gJHtsfWApO2lmKCEoMCxIbC5oYXNSZWYpKGYpKXJldHVybiBicihsZShRKHt9LGUpLHtzY2hlbWE6Zn0pKTtjb25zdHtyb290OnB9PW8saT1uby5jYWxsKHIsbmV3IHJvLlNjaGVtYUVudih7c2NoZW1hOmYscm9vdDpwfSkscyk7dC5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLl8pYCR7eGwodCxpKX0oJHtufSlgKX1mdW5jdGlvbiB4bChlLHQpe3JldHVybiB0LnNlcmlhbGl6ZT9lLnNjb3BlVmFsdWUoInNlcmlhbGl6ZSIse3JlZjp0LnNlcmlhbGl6ZX0pOigwLHRlLl8pYCR7ZS5zY29wZVZhbHVlKCJ3cmFwcGVyIix7cmVmOnR9KX0uc2VyaWFsaXplYH1mdW5jdGlvbiBlZih7Z2VuOmUsZGF0YTp0fSl7ZS5hZGQoaGUuZGVmYXVsdC5qc29uLCgwLHRlLl8pYEpTT04uc3RyaW5naWZ5KCR7dH0pYCl9ZnVuY3Rpb24gaW8oe2dlbjplfSx0KXtlLmlmKHQsKCk9PmUuYXNzaWduKHQsITEpLCgpPT5lLmFkZChoZS5kZWZhdWx0Lmpzb24sKDAsdGUuc3RyKWAsYCkpfXZhciBtcz17fSxTdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLFN0LnBhcnNlSnNvblN0cmluZz1TdC5wYXJzZUpzb25OdW1iZXI9U3QucGFyc2VKc29uPXZvaWQgMDtjb25zdCB0Zj0vcG9zaXRpb25ccyhcZCspJC87ZnVuY3Rpb24gaHQoZSx0KXtsZXQgcjtodC5tZXNzYWdlPXZvaWQgMDtsZXQgbjt0JiYoZT1lLnNsaWNlKHQpKTt0cnl7cmV0dXJuIGh0LnBvc2l0aW9uPXQrZS5sZW5ndGgsSlNPTi5wYXJzZShlKX1jYXRjaChzKXtpZihuPXRmLmV4ZWMocy5tZXNzYWdlKSwhbil7aHQubWVzc2FnZT0idW5leHBlY3RlZCBlbmQiO3JldHVybn1yPStuWzFdO2NvbnN0IGE9ZVtyXTtlPWUuc2xpY2UoMCxyKSxodC5wb3NpdGlvbj10K3I7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoe2h0Lm1lc3NhZ2U9YHVuZXhwZWN0ZWQgdG9rZW4gJHthfWA7cmV0dXJufX19U3QucGFyc2VKc29uPWh0LGh0Lm1lc3NhZ2U9dm9pZCAwLGh0LnBvc2l0aW9uPTAsaHQuY29kZT0ncmVxdWlyZSgiYWp2L2Rpc3QvcnVudGltZS9wYXJzZUpzb24iKS5wYXJzZUpzb24nO2Z1bmN0aW9uIHB0KGUsdCxyKXtsZXQgbj0iIixzO2lmKHB0Lm1lc3NhZ2U9dm9pZCAwLGVbdF09PT0iLSImJihuKz0iLSIsdCsrKSxlW3RdPT09IjAiKW4rPSIwIix0Kys7ZWxzZSBpZighYShyKSl7bygpO3JldHVybn1pZihyKXJldHVybiBwdC5wb3NpdGlvbj10LCtuO2lmKGVbdF09PT0iLiImJihuKz0iLiIsdCsrLCFhKCkpKXtvKCk7cmV0dXJufWlmKHM9ZVt0XSwocz09PSJlInx8cz09PSJFIikmJihuKz0iZSIsdCsrLHM9ZVt0XSwocz09PSIrInx8cz09PSItIikmJihuKz1zLHQrKyksIWEoKSkpe28oKTtyZXR1cm59cmV0dXJuIHB0LnBvc2l0aW9uPXQsK247ZnVuY3Rpb24gYShsKXtsZXQgZj0hMTtmb3IoO3M9ZVt0XSxzPj0iMCImJnM8PSI5IiYmKGw9PT12b2lkIDB8fGwtLSA+MCk7KWY9ITAsbis9cyx0Kys7cmV0dXJuIGZ9ZnVuY3Rpb24gbygpe3B0LnBvc2l0aW9uPXQscHQubWVzc2FnZT10PGUubGVuZ3RoP2B1bmV4cGVjdGVkIHRva2VuICR7ZVt0XX1gOiJ1bmV4cGVjdGVkIGVuZCJ9fVN0LnBhcnNlSnNvbk51bWJlcj1wdCxwdC5tZXNzYWdlPXZvaWQgMCxwdC5wb3NpdGlvbj0wLHB0LmNvZGU9J3JlcXVpcmUoImFqdi9kaXN0L3J1bnRpbWUvcGFyc2VKc29uIikucGFyc2VKc29uTnVtYmVyJztjb25zdCBjbz17YjoiXGIiLGY6IlxmIixuOmAKYCxyOiJcciIsdDoiCSIsJyInOiciJywiLyI6Ii8iLCJcXCI6IlxcIn0scmY9ImEiLmNoYXJDb2RlQXQoMCksbmY9IjAiLmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gUnQoZSx0KXtsZXQgcj0iIixuO2ZvcihSdC5tZXNzYWdlPXZvaWQgMDtuPWVbdCsrXSxuIT09JyInOylpZihuPT09IlxcIilpZihuPWVbdF0sbiBpbiBjbylyKz1jb1tuXSx0Kys7ZWxzZSBpZihuPT09InUiKXt0Kys7bGV0IGE9NCxvPTA7Zm9yKDthLS07KXtpZihvPDw9NCxuPWVbdF0sbj09PXZvaWQgMCl7cygidW5leHBlY3RlZCBlbmQiKTtyZXR1cm59aWYobj1uLnRvTG93ZXJDYXNlKCksbj49ImEiJiZuPD0iZiIpbys9bi5jaGFyQ29kZUF0KDApLXJmKzEwO2Vsc2UgaWYobj49IjAiJiZuPD0iOSIpbys9bi5jaGFyQ29kZUF0KDApLW5mO2Vsc2V7cyhgdW5leHBlY3RlZCB0b2tlbiAke259YCk7cmV0dXJufXQrK31yKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG8pfWVsc2V7cyhgdW5leHBlY3RlZCB0b2tlbiAke259YCk7cmV0dXJufWVsc2UgaWYobj09PXZvaWQgMCl7cygidW5leHBlY3RlZCBlbmQiKTtyZXR1cm59ZWxzZSBpZihuLmNoYXJDb2RlQXQoMCk+PTMyKXIrPW47ZWxzZXtzKGB1bmV4cGVjdGVkIHRva2VuICR7bn1gKTtyZXR1cm59cmV0dXJuIFJ0LnBvc2l0aW9uPXQscjtmdW5jdGlvbiBzKGEpe1J0LnBvc2l0aW9uPXQsUnQubWVzc2FnZT1hfX1TdC5wYXJzZUpzb25TdHJpbmc9UnQsUnQubWVzc2FnZT12b2lkIDAsUnQucG9zaXRpb249MCxSdC5jb2RlPSdyZXF1aXJlKCJhanYvZGlzdC9ydW50aW1lL3BhcnNlSnNvbiIpLnBhcnNlSnNvblN0cmluZycsT2JqZWN0LmRlZmluZVByb3BlcnR5KG1zLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtjb25zdCBzZj1Scix1bz1DZSxMPXVlLGFmPWt0LFk9TGUsb2Y9bmUsY2Y9RnQsdWY9bnMsdnM9U3QsbG89YmUsbGY9aG4sZmY9e2VsZW1lbnRzOm1mLHZhbHVlczp2ZixkaXNjcmltaW5hdG9yOmdmLHByb3BlcnRpZXM6cG8sb3B0aW9uYWxQcm9wZXJ0aWVzOnBvLGVudW06eWYsdHlwZTpFZixyZWY6JGZ9O2Z1bmN0aW9uIGZvKGUsdCl7Y29uc3Qgcj11by5nZXRDb21waWxpbmdTY2hlbWEuY2FsbCh0aGlzLGUpO2lmKHIpcmV0dXJuIHI7Y29uc3R7ZXM1Om4sbGluZXM6c309dGhpcy5vcHRzLmNvZGUse293blByb3BlcnRpZXM6YX09dGhpcy5vcHRzLG89bmV3IEwuQ29kZUdlbih0aGlzLnNjb3BlLHtlczU6bixsaW5lczpzLG93blByb3BlcnRpZXM6YX0pLGw9by5zY29wZU5hbWUoInBhcnNlIiksZj17c2VsZjp0aGlzLGdlbjpvLHNjaGVtYTplLnNjaGVtYSxzY2hlbWFFbnY6ZSxkZWZpbml0aW9uczp0LGRhdGE6WS5kZWZhdWx0LmRhdGEscGFyc2VOYW1lOmwsY2hhcjpvLm5hbWUoImMiKX07bGV0IHA7dHJ5e3RoaXMuX2NvbXBpbGF0aW9ucy5hZGQoZSksZS5wYXJzZU5hbWU9bCxkZihmKSxvLm9wdGltaXplKHRoaXMub3B0cy5jb2RlLm9wdGltaXplKTtjb25zdCBpPW8udG9TdHJpbmcoKTtwPWAke28uc2NvcGVSZWZzKFkuZGVmYXVsdC5zY29wZSl9cmV0dXJuICR7aX1gO2NvbnN0IEU9bmV3IEZ1bmN0aW9uKGAke1kuZGVmYXVsdC5zY29wZX1gLHApKHRoaXMuc2NvcGUuZ2V0KCkpO3RoaXMuc2NvcGUudmFsdWUobCx7cmVmOkV9KSxlLnBhcnNlPUV9Y2F0Y2goaSl7dGhyb3cgcCYmdGhpcy5sb2dnZXIuZXJyb3IoIkVycm9yIGNvbXBpbGluZyBwYXJzZXIsIGZ1bmN0aW9uIGNvZGU6IixwKSxkZWxldGUgZS5wYXJzZSxkZWxldGUgZS5wYXJzZU5hbWUsaX1maW5hbGx5e3RoaXMuX2NvbXBpbGF0aW9ucy5kZWxldGUoZSl9cmV0dXJuIGV9bXMuZGVmYXVsdD1mbztjb25zdCBfcz0oMCxMLl8pYHVuZGVmaW5lZGA7ZnVuY3Rpb24gZGYoZSl7Y29uc3R7Z2VuOnQscGFyc2VOYW1lOnIsY2hhcjpufT1lO3QuZnVuYyhyLCgwLEwuXylgJHtZLmRlZmF1bHQuanNvbn0sICR7WS5kZWZhdWx0Lmpzb25Qb3N9LCAke1kuZGVmYXVsdC5qc29uUGFydH1gLCExLCgpPT57dC5sZXQoWS5kZWZhdWx0LmRhdGEpLHQubGV0KG4pLHQuYXNzaWduKCgwLEwuXylgJHtyfS5tZXNzYWdlYCxfcyksdC5hc3NpZ24oKDAsTC5fKWAke3J9LnBvc2l0aW9uYCxfcyksdC5hc3NpZ24oWS5kZWZhdWx0Lmpzb25Qb3MsKDAsTC5fKWAke1kuZGVmYXVsdC5qc29uUG9zfSB8fCAwYCksdC5jb25zdChZLmRlZmF1bHQuanNvbkxlbiwoMCxMLl8pYCR7WS5kZWZhdWx0Lmpzb259Lmxlbmd0aGApLHZuKGUpLHdzKGUpLHQuaWYoWS5kZWZhdWx0Lmpzb25QYXJ0LCgpPT57dC5hc3NpZ24oKDAsTC5fKWAke3J9LnBvc2l0aW9uYCxZLmRlZmF1bHQuanNvblBvcyksdC5yZXR1cm4oWS5kZWZhdWx0LmRhdGEpfSksdC5pZigoMCxMLl8pYCR7WS5kZWZhdWx0Lmpzb25Qb3N9ID09PSAke1kuZGVmYXVsdC5qc29uTGVufWAsKCk9PnQucmV0dXJuKFkuZGVmYXVsdC5kYXRhKSksYXIoZSl9KX1mdW5jdGlvbiB2bihlKXtsZXQgdDtmb3IoY29uc3QgciBvZiBzZi5qdGRGb3JtcylpZihyIGluIGUuc2NoZW1hKXt0PXI7YnJlYWt9dD9wZihlLGZmW3RdKTp5cyhlKX1jb25zdCBoZj1nbyghMCxnbyghMSxhcikpO2Z1bmN0aW9uIHBmKGUsdCl7Y29uc3R7Z2VuOnIsc2NoZW1hOm4sZGF0YTpzfT1lO2lmKCFuLm51bGxhYmxlKXJldHVybiB0KGUpO05yKGUsIm51bGwiLHQsKCk9PnIuYXNzaWduKHMsbnVsbCkpfWZ1bmN0aW9uIG1mKGUpe2NvbnN0e2dlbjp0LHNjaGVtYTpyLGRhdGE6bn09ZTtldChlLCJbIik7Y29uc3Qgcz10LmxldCgiaSIsMCk7dC5hc3NpZ24obiwoMCxMLl8pYFtdYCksZ3MoZSwiXSIsKCk9Pntjb25zdCBhPXQubGV0KCJlbCIpO3ZuKGxlKFEoe30sZSkse3NjaGVtYTpyLmVsZW1lbnRzLGRhdGE6YX0pKSx0LmFzc2lnbigoMCxMLl8pYCR7bn1bJHtzfSsrXWAsYSl9KX1mdW5jdGlvbiB2ZihlKXtjb25zdHtnZW46dCxzY2hlbWE6cixkYXRhOm59PWU7ZXQoZSwieyIpLHQuYXNzaWduKG4sKDAsTC5fKWB7fWApLGdzKGUsIn0iLCgpPT5fZihlLHIudmFsdWVzKSl9ZnVuY3Rpb24gZ3MoZSx0LHIpe2hvKGUsdCxyKSxldChlLHQpfWZ1bmN0aW9uIGhvKGUsdCxyKXtjb25zdHtnZW46bn09ZTtuLmZvcigoMCxMLl8pYDske1kuZGVmYXVsdC5qc29uUG9zfTwke1kuZGVmYXVsdC5qc29uTGVufSAmJiAke19uKDEpfSE9PSR7dH07YCwoKT0+e3IoKSxOcihlLCIsIiwoKT0+bi5icmVhaygpLHMpfSk7ZnVuY3Rpb24gcygpe05yKGUsdCwoKT0+e30sYXIpfX1mdW5jdGlvbiBfZihlLHQpe2NvbnN0e2dlbjpyfT1lLG49ci5sZXQoImtleSIpO1Z0KGxlKFEoe30sZSkse2RhdGE6bn0pKSxldChlLCI6IiksX28oZSxuLHQpfWZ1bmN0aW9uIGdmKGUpe2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bn09ZSx7ZGlzY3JpbWluYXRvcjpzLG1hcHBpbmc6YX09bjtldChlLCJ7IiksdC5hc3NpZ24ociwoMCxMLl8pYHt9YCk7Y29uc3Qgbz10LmNvbnN0KCJwb3MiLFkuZGVmYXVsdC5qc29uUG9zKSxsPXQubGV0KCJ2YWx1ZSIpLGY9dC5sZXQoInRhZyIpO2hvKGUsIn0iLCgpPT57Y29uc3QgcD10LmxldCgia2V5Iik7VnQobGUoUSh7fSxlKSx7ZGF0YTpwfSkpLGV0KGUsIjoiKSx0LmlmKCgwLEwuXylgJHtwfSA9PT0gJHtzfWAsKCk9PntWdChsZShRKHt9LGUpLHtkYXRhOmZ9KSksdC5hc3NpZ24oKDAsTC5fKWAke3J9WyR7cH1dYCxmKSx0LmJyZWFrKCl9LCgpPT55cyhsZShRKHt9LGUpLHtkYXRhOmx9KSkpfSksdC5hc3NpZ24oWS5kZWZhdWx0Lmpzb25Qb3MsbyksdC5pZigoMCxMLl8pYCR7Zn0gPT09IHVuZGVmaW5lZGApLG10KGUsKDAsTC5zdHIpYGRpc2NyaW1pbmF0b3IgdGFnIG5vdCBmb3VuZGApO2Zvcihjb25zdCBwIGluIGEpdC5lbHNlSWYoKDAsTC5fKWAke2Z9ID09PSAke3B9YCksbW8obGUoUSh7fSxlKSx7c2NoZW1hOmFbcF19KSxzKTt0LmVsc2UoKSxtdChlLCgwLEwuc3RyKWBkaXNjcmltaW5hdG9yIHZhbHVlIG5vdCBpbiBzY2hlbWFgKSx0LmVuZElmKCl9ZnVuY3Rpb24gcG8oZSl7Y29uc3R7Z2VuOnQsZGF0YTpyfT1lO2V0KGUsInsiKSx0LmFzc2lnbihyLCgwLEwuXylge31gKSxtbyhlKX1mdW5jdGlvbiBtbyhlLHQpe2NvbnN0e2dlbjpyLHNjaGVtYTpuLGRhdGE6c309ZSx7cHJvcGVydGllczphLG9wdGlvbmFsUHJvcGVydGllczpvLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOmx9PW47aWYoZ3MoZSwifSIsKCk9Pntjb25zdCBmPXIubGV0KCJrZXkiKTtpZihWdChsZShRKHt9LGUpLHtkYXRhOmZ9KSksZXQoZSwiOiIpLHIuaWYoITEpLHZvKGUsZixhKSx2byhlLGYsbyksdCl7ci5lbHNlSWYoKDAsTC5fKWAke2Z9ID09PSAke3R9YCk7Y29uc3QgcD1yLmxldCgidGFnIik7VnQobGUoUSh7fSxlKSx7ZGF0YTpwfSkpfXIuZWxzZSgpLGw/eXMobGUoUSh7fSxlKSx7ZGF0YTooMCxMLl8pYCR7c31bJHtmfV1gfSkpOm10KGUsKDAsTC5zdHIpYHByb3BlcnR5ICR7Zn0gbm90IGFsbG93ZWRgKSxyLmVuZElmKCl9KSxhKXtjb25zdCBmPSgwLG9mLmhhc1Byb3BGdW5jKShyKSxwPSgwLEwuYW5kKSguLi5PYmplY3Qua2V5cyhhKS5tYXAoaT0+KDAsTC5fKWAke2Z9LmNhbGwoJHtzfSwgJHtpfSlgKSk7ci5pZigoMCxMLm5vdCkocCksKCk9Pm10KGUsKDAsTC5zdHIpYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydGllc2ApKX19ZnVuY3Rpb24gdm8oZSx0LHI9e30pe2NvbnN0e2dlbjpufT1lO2Zvcihjb25zdCBzIGluIHIpbi5lbHNlSWYoKDAsTC5fKWAke3R9ID09PSAke3N9YCksX28oZSx0LHJbc10pfWZ1bmN0aW9uIF9vKGUsdCxyKXt2bihsZShRKHt9LGUpLHtzY2hlbWE6cixkYXRhOigwLEwuXylgJHtlLmRhdGF9WyR7dH1dYH0pKX1mdW5jdGlvbiBFZihlKXtjb25zdHtnZW46dCxzY2hlbWE6cixkYXRhOm4sc2VsZjpzfT1lO3N3aXRjaChyLnR5cGUpe2Nhc2UiYm9vbGVhbiI6aGYoZSk7YnJlYWs7Y2FzZSJzdHJpbmciOlZ0KGUpO2JyZWFrO2Nhc2UidGltZXN0YW1wIjp7VnQoZSk7Y29uc3QgYT0oMCxsby51c2VGdW5jKSh0LGxmLmRlZmF1bHQpLHthbGxvd0RhdGU6byxwYXJzZURhdGU6bH09cy5vcHRzLGY9bz8oMCxMLl8pYCEke2F9KCR7bn0sIHRydWUpYDooMCxMLl8pYCEke2F9KCR7bn0pYCxwPWw/KDAsTC5vcikoZiwoMCxMLl8pYCgke259ID0gbmV3IERhdGUoJHtufSksIGZhbHNlKWAsKDAsTC5fKWBpc05hTigke259LnZhbHVlT2YoKSlgKTpmO3QuaWYocCwoKT0+bXQoZSwoMCxMLnN0cilgaW52YWxpZCB0aW1lc3RhbXBgKSk7YnJlYWt9Y2FzZSJmbG9hdDMyIjpjYXNlImZsb2F0NjQiOkVzKGUpO2JyZWFrO2RlZmF1bHQ6e2NvbnN0IGE9ci50eXBlO2lmKCFzLm9wdHMuaW50MzJyYW5nZSYmKGE9PT0iaW50MzIifHxhPT09InVpbnQzMiIpKUVzKGUsMTYpLGE9PT0idWludDMyIiYmdC5pZigoMCxMLl8pYCR7bn0gPCAwYCwoKT0+bXQoZSwoMCxMLnN0cilgaW50ZWdlciBvdXQgb2YgcmFuZ2VgKSk7ZWxzZXtjb25zdFtvLGwsZl09dWYuaW50UmFuZ2VbYV07RXMoZSxmKSx0LmlmKCgwLEwuXylgJHtufSA8ICR7b30gfHwgJHtufSA+ICR7bH1gLCgpPT5tdChlLCgwLEwuc3RyKWBpbnRlZ2VyIG91dCBvZiByYW5nZWApKX19fX1mdW5jdGlvbiBWdChlKXtldChlLCciJyksJHMoZSx2cy5wYXJzZUpzb25TdHJpbmcpfWZ1bmN0aW9uIHlmKGUpe2NvbnN0e2dlbjp0LGRhdGE6cixzY2hlbWE6bn09ZSxzPW4uZW51bTtldChlLCciJyksdC5pZighMSk7Zm9yKGNvbnN0IGEgb2Ygcyl7Y29uc3Qgbz1KU09OLnN0cmluZ2lmeShhKS5zbGljZSgxKTt0LmVsc2VJZigoMCxMLl8pYCR7X24oby5sZW5ndGgpfSA9PT0gJHtvfWApLHQuYXNzaWduKHIsKDAsTC5zdHIpYCR7YX1gKSx0LmFkZChZLmRlZmF1bHQuanNvblBvcyxvLmxlbmd0aCl9dC5lbHNlKCksYXIoZSksdC5lbmRJZigpfWZ1bmN0aW9uIEVzKGUsdCl7Y29uc3R7Z2VuOnJ9PWU7d3MoZSksci5pZigoMCxMLl8pYCItMDEyMzQ1Njc4OSIuaW5kZXhPZigke19uKDEpfSkgPCAwYCwoKT0+YXIoZSksKCk9PiRzKGUsdnMucGFyc2VKc29uTnVtYmVyLHQpKX1mdW5jdGlvbiBnbyhlLHQpe3JldHVybiByPT57Y29uc3R7Z2VuOm4sZGF0YTpzfT1yO05yKHIsYCR7ZX1gLCgpPT50KHIpLCgpPT5uLmFzc2lnbihzLGUpKX19ZnVuY3Rpb24gJGYoZSl7Y29uc3R7Z2VuOnQsc2VsZjpyLGRlZmluaXRpb25zOm4sc2NoZW1hOnMsc2NoZW1hRW52OmF9PWUse3JlZjpvfT1zLGw9bltvXTtpZighbCl0aHJvdyBuZXcgYWYuZGVmYXVsdChyLm9wdHMudXJpUmVzb2x2ZXIsIiIsbyxgTm8gZGVmaW5pdGlvbiAke299YCk7aWYoISgwLGNmLmhhc1JlZikobCkpcmV0dXJuIHZuKGxlKFEoe30sZSkse3NjaGVtYTpsfSkpO2NvbnN0e3Jvb3Q6Zn09YSxwPWZvLmNhbGwocixuZXcgdW8uU2NoZW1hRW52KHtzY2hlbWE6bCxyb290OmZ9KSxuKTtFbyhlLHdmKHQscCksITApfWZ1bmN0aW9uIHdmKGUsdCl7cmV0dXJuIHQucGFyc2U/ZS5zY29wZVZhbHVlKCJwYXJzZSIse3JlZjp0LnBhcnNlfSk6KDAsTC5fKWAke2Uuc2NvcGVWYWx1ZSgid3JhcHBlciIse3JlZjp0fSl9LnBhcnNlYH1mdW5jdGlvbiB5cyhlKXskcyhlLHZzLnBhcnNlSnNvbil9ZnVuY3Rpb24gJHMoZSx0LHIpe0VvKGUsKDAsbG8udXNlRnVuYykoZS5nZW4sdCkscil9ZnVuY3Rpb24gRW8oZSx0LHIpe2NvbnN0e2dlbjpuLGRhdGE6c309ZTtuLmFzc2lnbihzLCgwLEwuXylgJHt0fSgke1kuZGVmYXVsdC5qc29ufSwgJHtZLmRlZmF1bHQuanNvblBvc30ke3I/KDAsTC5fKWAsICR7cn1gOkwubmlsfSlgKSxuLmFzc2lnbihZLmRlZmF1bHQuanNvblBvcywoMCxMLl8pYCR7dH0ucG9zaXRpb25gKSxuLmlmKCgwLEwuXylgJHtzfSA9PT0gdW5kZWZpbmVkYCwoKT0+bXQoZSwoMCxMLl8pYCR7dH0ubWVzc2FnZWApKX1mdW5jdGlvbiBldChlLHQpe05yKGUsdCxhcil9ZnVuY3Rpb24gTnIoZSx0LHIsbil7Y29uc3R7Z2VuOnN9PWUsYT10Lmxlbmd0aDt3cyhlKSxzLmlmKCgwLEwuXylgJHtfbihhKX0gPT09ICR7dH1gLCgpPT57cy5hZGQoWS5kZWZhdWx0Lmpzb25Qb3MsYSksbj09bnVsbHx8bihlKX0sKCk9PnIoZSkpfWZ1bmN0aW9uIHdzKHtnZW46ZSxjaGFyOnR9KXtlLmNvZGUoKDAsTC5fKWB3aGlsZSgoJHt0fT0ke1kuZGVmYXVsdC5qc29ufVske1kuZGVmYXVsdC5qc29uUG9zfV0sJHt0fT09PSIgInx8JHt0fT09PSJcXG4ifHwke3R9PT09IlxcciJ8fCR7dH09PT0iXFx0IikpJHtZLmRlZmF1bHQuanNvblBvc30rKztgKX1mdW5jdGlvbiBfbihlKXtyZXR1cm4gZT09PTE/KDAsTC5fKWAke1kuZGVmYXVsdC5qc29ufVske1kuZGVmYXVsdC5qc29uUG9zfV1gOigwLEwuXylgJHtZLmRlZmF1bHQuanNvbn0uc2xpY2UoJHtZLmRlZmF1bHQuanNvblBvc30sICR7WS5kZWZhdWx0Lmpzb25Qb3N9KyR7ZX0pYH1mdW5jdGlvbiBhcihlKXttdChlLCgwLEwuXylgInVuZXhwZWN0ZWQgdG9rZW4gIiArICR7WS5kZWZhdWx0Lmpzb259WyR7WS5kZWZhdWx0Lmpzb25Qb3N9XWApfWZ1bmN0aW9uIG10KHtnZW46ZSxwYXJzZU5hbWU6dH0scil7ZS5hc3NpZ24oKDAsTC5fKWAke3R9Lm1lc3NhZ2VgLHIpLGUuYXNzaWduKCgwLEwuXylgJHt0fS5wb3NpdGlvbmAsWS5kZWZhdWx0Lmpzb25Qb3MpLGUucmV0dXJuKF9zKX0oZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5Db2RlR2VuPXQuTmFtZT10Lm5pbD10LnN0cmluZ2lmeT10LnN0cj10Ll89dC5LZXl3b3JkQ3h0PXZvaWQgMDtjb25zdCByPXJhLG49dHMscz1mcyxhPWRzLG89bXMsbD0iSlRELW1ldGEtc2NoZW1hIjtjbGFzcyBmIGV4dGVuZHMgci5kZWZhdWx0e2NvbnN0cnVjdG9yKEU9e30pe3N1cGVyKGxlKFEoe30sRSkse2p0ZDohMH0pKX1fYWRkVm9jYWJ1bGFyaWVzKCl7c3VwZXIuX2FkZFZvY2FidWxhcmllcygpLHRoaXMuYWRkVm9jYWJ1bGFyeShuLmRlZmF1bHQpfV9hZGREZWZhdWx0TWV0YVNjaGVtYSgpe3N1cGVyLl9hZGREZWZhdWx0TWV0YVNjaGVtYSgpLHRoaXMub3B0cy5tZXRhJiZ0aGlzLmFkZE1ldGFTY2hlbWEocy5kZWZhdWx0LGwsITEpfWRlZmF1bHRNZXRhKCl7cmV0dXJuIHRoaXMub3B0cy5kZWZhdWx0TWV0YT1zdXBlci5kZWZhdWx0TWV0YSgpfHwodGhpcy5nZXRTY2hlbWEobCk/bDp2b2lkIDApfWNvbXBpbGVTZXJpYWxpemVyKEUpe2NvbnN0IFQ9dGhpcy5fYWRkU2NoZW1hKEUpO3JldHVybiBULnNlcmlhbGl6ZXx8dGhpcy5fY29tcGlsZVNlcmlhbGl6ZXIoVCl9Y29tcGlsZVBhcnNlcihFKXtjb25zdCBUPXRoaXMuX2FkZFNjaGVtYShFKTtyZXR1cm4gVC5wYXJzZXx8dGhpcy5fY29tcGlsZVBhcnNlcihUKX1fY29tcGlsZVNlcmlhbGl6ZXIoRSl7aWYoYS5kZWZhdWx0LmNhbGwodGhpcyxFLEUuc2NoZW1hLmRlZmluaXRpb25zfHx7fSksIUUuc2VyaWFsaXplKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7cmV0dXJuIEUuc2VyaWFsaXplfV9jb21waWxlUGFyc2VyKEUpe2lmKG8uZGVmYXVsdC5jYWxsKHRoaXMsRSxFLnNjaGVtYS5kZWZpbml0aW9uc3x8e30pLCFFLnBhcnNlKXRocm93IG5ldyBFcnJvcigiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yIik7cmV0dXJuIEUucGFyc2V9fWUuZXhwb3J0cz10PWYsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1mO3ZhciBwPVdlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJLZXl3b3JkQ3h0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcC5LZXl3b3JkQ3h0fX0pO3ZhciBpPXVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5ffX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJzdHIiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLnN0cn19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwic3RyaW5naWZ5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5zdHJpbmdpZnl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm5pbCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkubmlsfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJOYW1lIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5OYW1lfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJDb2RlR2VuIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5Db2RlR2VufX0pfSkoem4sem4uZXhwb3J0cyk7dmFyIFNmPWVlJiZlZS5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEl0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxJdC5WYWxpZGF0ZT1JdC5BZGRTY2hlbWE9dm9pZCAwO2NvbnN0IFJmPVNmKHpuLmV4cG9ydHMpLHlvPW5ldyBSZi5kZWZhdWx0LGJmPShlLHQpPT5lKHQpP251bGw6ZS5lcnJvcnM7ZnVuY3Rpb24gT2YoZSx0KXt5by5hZGRTY2hlbWEodCxlKX1JdC5BZGRTY2hlbWE9T2Y7ZnVuY3Rpb24gTmYoZSx0KXtjb25zdCByPXlvLmdldFNjaGVtYShlKTtpZihyKXJldHVybiBiZihyLHQpfUl0LlZhbGlkYXRlPU5mLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShybiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkscm4uU1RTT3B0aW9uc0Jhc2U9dm9pZCAwO2NvbnN0IFBmPUl0O2NsYXNzIFRme2NvbnN0cnVjdG9yKHQ9bnVsbCl7X3IodGhpcywiX29wdGlvbnMiKTt0aGlzLl9vcHRpb25zPXQsdCE9PW51bGwmJih0eXBlb2YgdC52YWxpZGF0b3I9PSJ1bmRlZmluZWQifHwoMCxQZi5WYWxpZGF0ZSkodC52YWxpZGF0b3IsdCkpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX29wdGlvbnN9fXJuLlNUU09wdGlvbnNCYXNlPVRmO3ZhciBvcj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkob3IsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG9yLkplc3RTbGVlcD1vci5TbGVlcD12b2lkIDA7YXN5bmMgZnVuY3Rpb24gJG8oZT0xZTMpe3JldHVybiBuZXcgUHJvbWlzZSh0PT5zZXRUaW1lb3V0KHQsZSkpfW9yLlNsZWVwPSRvO2FzeW5jIGZ1bmN0aW9uIEFmKCl7cmV0dXJuICRvKDEwMCl9b3IuSmVzdFNsZWVwPUFmO3ZhciB3bz17fTsoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuY29tcGFyZVBhcmFtZXRlclR5cGVzPWUuT0F1dGgyUGFyYW1ldGVyRXJyb3JUeXBlPWUuT0lEQ0FkZHJlc3NDbGFpbT1lLk9JRENTdGFuZGFyZENsYWltPWUuT0F1dGgyUGFyYW1ldGVyVHlwZT12b2lkIDAsZnVuY3Rpb24obil7bi5BVURJRU5DRT0iQVVESUVOQ0UiLG4uQ0xJRU5UX0lEPSJjbGllbnRfaWQiLG4uQ0xJRU5UX1NFQ1JFVD0iY2xpZW50X3NlY3JldCIsbi5SRVNQT05TRV9UWVBFPSJyZXNwb25zZV90eXBlIixuLlNDT1BFPSJzY29wZSIsbi5TVEFURT0ic3RhdGUiLG4uUkVESVJFQ1RfVVJJPSJyZWRpcmVjdF91cmkiLG4uRVJST1I9ImVycm9yIixuLkVSUk9SX0RFU0NSSVBUSU9OPSJlcnJvcl9kZXNjcmlwdGlvbiIsbi5FUlJPUl9DT0RFUz0iZXJyb3JfY29kZXMiLG4uRVJST1JfVVJJPSJlcnJvcl91cmkiLG4uR1JBTlRfVFlQRT0iZ3JhbnRfdHlwZSIsbi5DT0RFPSJjb2RlIixuLkFDQ0VTU19UT0tFTj0iYWNjZXNzX3Rva2VuIixuLlRPS0VOX1RZUEU9InRva2VuX3R5cGUiLG4uRVhQSVJFU19JTj0iZXhwaXJlc19pbiIsbi5VU0VSTkFNRT0idXNlcm5hbWUiLG4uUEFTU1dPUkQ9InBhc3N3b3JkIixuLlJFRlJFU0hfVE9LRU49InJlZnJlc2hfdG9rZW4iLG4uUkVTUE9OU0VfTU9ERT0icmVzcG9uc2VfbW9kZSIsbi5USU1FU1RBTVA9InRpbWVzdGFtcCIsbi5UUkFDRV9JRD0idHJhY2VfaWQiLG4uQ09SUkVMQVRJT05fSUQ9ImNvcnJlbGF0aW9uX2lkIn0oZS5PQXV0aDJQYXJhbWV0ZXJUeXBlfHwoZS5PQXV0aDJQYXJhbWV0ZXJUeXBlPXt9KSksZnVuY3Rpb24obil7bi5TVUI9InN1YiIsbi5OQU1FPSJuYW1lIixuLkdJVkVOX05BTUU9ImdpdmVuX25hbWUiLG4uRkFNSUxZX05BTUU9ImZhbWlseV9uYW1lIixuLk1JRERMRV9OQU1FPSJtaWRkbGVfbmFtZSIsbi5OSUNLTkFNRT0ibmlja25hbWUiLG4uUFJFRkVSUkVEX1VTRVJOQU1FPSJwcmVmZXJyZWRfdXNlcm5hbWUiLG4uUFJPRklMRT0icHJvZmlsZSIsbi5QSUNUVVJFPSJwaWN0dXJlIixuLldFQlNJVEU9IndlYnNpdGUiLG4uRU1BSUw9ImVtYWlsIixuLkVNQUlMX1ZFUklGSUVEPSJlbWFpbF92ZXJpZmllZCIsbi5HRU5ERVI9ImdlbmRlciIsbi5CSVJUSERBVEU9ImJpcnRoZGF0ZSIsbi5aT05FSU5GTz0iem9uZWluZm8iLG4uTE9DQUxFPSJsb2NhbGUiLG4uUEhPTkVfTlVNQkVSPSJwaG9uZV9udW1iZXIiLG4uUEhPTkVfTlVNQkVSX1ZFUklGSUVEPSJwaG9uZV9udW1iZXJfdmVyaWZpZWQiLG4uQUREUkVTUz0iYWRkcmVzcyIsbi5DTElFTlRfU0VDUkVUPSJjbGllbnRfc2VjcmV0IixuLk5PTkNFPSJub25jZSJ9KGUuT0lEQ1N0YW5kYXJkQ2xhaW18fChlLk9JRENTdGFuZGFyZENsYWltPXt9KSksZnVuY3Rpb24obil7bi5GT1JNQVRURUQ9ImZvcm1hdHRlZCIsbi5TVFJFRVRfQUREUkVTUz0ic3RyZWV0X2FkZHJlc3MiLG4uTE9DQUxJVFk9ImxvY2FsaXR5IixuLlJFR0lPTj0icmVnaW9uIixuLkNPVU5UUlk9ImNvdW50cnkifShlLk9JRENBZGRyZXNzQ2xhaW18fChlLk9JRENBZGRyZXNzQ2xhaW09e30pKTtjbGFzcyB0e31fcih0LCJOT1RfRVFVQUwiLHtjb2RlOiJTVFNfT0FVVEgyX0VSUl8wMDAxIixkZXNjcmlwdGlvbjoiUGFyYW1ldGVyIHZhbHVlcyBub3QgZXF1YWwuIn0pLF9yKHQsIk5PVF9QUkVTRU5UIix7Y29kZToiU1RTX09BVVRIMl9FUlJfMDAwMiIsZGVzY3JpcHRpb246IlBhcmFtZXRlciBub3QgcHJvdmlkZWQuIn0pLF9yKHQsIklOVkFMSURfRk9STUFUIix7Y29kZToiU1RTX09BVVRIMl9FUlJfMDAwMyIsZGVzY3JpcHRpb246IlBhcmFtZXRlciB2YWx1ZSBmb3JtYXQgaW52YWxpZC4ifSksX3IodCwiRVhQSVJFRCIse2NvZGU6IlNUU19PQVVUSDJfRVJSXzAwMDQiLGRlc2NyaXB0aW9uOiJQYXJhbWV0ZXIgdmFsdWUgZXhwaXJlZC4ifSksZS5PQXV0aDJQYXJhbWV0ZXJFcnJvclR5cGU9dDtmdW5jdGlvbiByKG4scyxhKXtjb25zdCBvPVtdO2ZvcihsZXQgbD0wO2w8YS5sZW5ndGg7bCsrKXtjb25zdCBmPWFbbF07aWYobltsXS5sb2NhbGVDb21wYXJlKHNbbF0pIT09MCl7Y29uc3QgcD17ZXJyb3I6dC5OT1RfRVFVQUwuY29kZSxlcnJvcl9kZXNjcmlwdGlvbjp0Lk5PVF9FUVVBTC5kZXNjcmlwdGlvbix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkZXRhaWxzOmAke3QuTk9UX0VRVUFMLmRlc2NyaXB0aW9ufTogUGFyYW1ldGVyOiBbJHtmfV1gfTtvLnB1c2gocCl9fXJldHVybiBvfWUuY29tcGFyZVBhcmFtZXRlclR5cGVzPXJ9KSh3byksZnVuY3Rpb24oZSl7dmFyIHQ9ZWUmJmVlLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24ocyxhLG8sbCl7bD09PXZvaWQgMCYmKGw9byk7dmFyIGY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLG8pOyghZnx8KCJnZXQiaW4gZj8hYS5fX2VzTW9kdWxlOmYud3JpdGFibGV8fGYuY29uZmlndXJhYmxlKSkmJihmPXtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBhW29dfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLGwsZil9OmZ1bmN0aW9uKHMsYSxvLGwpe2w9PT12b2lkIDAmJihsPW8pLHNbbF09YVtvXX0pLHI9ZWUmJmVlLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24ocyxhKXtmb3IodmFyIG8gaW4gcylvIT09ImRlZmF1bHQiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsbykmJnQoYSxzLG8pfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS4kc3RzZ2RmPWUuJHN0c2dkPXZvaWQgMCxyKHRuLGUpLHIocm4sZSkscihvcixlKSxyKEl0LGUpLHIod28sZSksZS4kc3RzZ2Q9e307ZnVuY3Rpb24gbigpe3JldHVybiBlLiRzdHNnZH1lLiRzdHNnZGY9bn0oQ3QpO2NsYXNzIENme2NvbnN0cnVjdG9yKCl7dGhpcy5EaWdlc3RNZXNzYWdlPWFzeW5jIGZ1bmN0aW9uKHQpe2NvbnN0IG49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpLHM9YXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLG4pLGE9QXJyYXkuZnJvbShuZXcgVWludDhBcnJheShzKSk7cmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hKSl9LHRoaXMuQ3JlYXRlUmFuZG9tU3RyaW5nPSh0PTQzKT0+e2NvbnN0IHI9QXJyYXkuZnJvbShjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHQpKSk7cmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5yKSl9LHRoaXMuQ3JlYXRlUmFuZG9tU3RyaW5nRXg9KCk9Pntjb25zdCB0PSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei1ffi4iO2xldCByPSIiO3JldHVybiBBcnJheS5mcm9tKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoNDMpKSkuZm9yRWFjaChzPT5yKz10W3MldC5sZW5ndGhdKSxyfX19Y2xhc3MgSWZ7Y29uc3RydWN0b3IoKXt0aGlzLkRlY29kZVF1ZXJ5UGFyYW1zPXQ9Pntjb25zdCByPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5maWx0ZXIobj0+dHlwZW9mIHRbbl0hPSJ1bmRlZmluZWQiKS5tYXAobj0+e3JbZGVjb2RlVVJJQ29tcG9uZW50KG4pXT1kZWNvZGVVUklDb21wb25lbnQodFtuXSl9KSxyfSx0aGlzLkNyZWF0ZVF1ZXJ5UGFyYW1zPXQ9Pk9iamVjdC5rZXlzKHQpLmZpbHRlcihyPT50eXBlb2YgdFtyXSE9InVuZGVmaW5lZCIpLm1hcChyPT5BcnJheS5pc0FycmF5KHRbcl0pP2VuY29kZVVSSUNvbXBvbmVudChyKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHRbcl0uam9pbigiICIpKTplbmNvZGVVUklDb21wb25lbnQocikrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0W3JdKSkuam9pbigiJiIpLHRoaXMuX0dldFF1ZXJ5UGFyYW1zPXQ9PntsZXQgcj17fTtjb25zdCBuPXQuc3BsaXQoIj8iKTtpZihuLmxlbmd0aD09Mil7Y29uc3Qgcz1uWzFdLnNwbGl0KCImIiksYT17fTtsZXQgbz0iIjtzLmZvckVhY2goZnVuY3Rpb24obCl7bz1sLnNwbGl0KCI9Iiksby5sZW5ndGg9PTImJihhW29bMF1dPW9bMV0pfSkscj10aGlzLkRlY29kZVF1ZXJ5UGFyYW1zKGEpfXJldHVybiByfSx0aGlzLkdldFF1ZXJ5UGFyYW1zPSgpPT50aGlzLl9HZXRRdWVyeVBhcmFtcyh3aW5kb3cubG9jYXRpb24uaHJlZil9fWZ1bmN0aW9uIFNzKGUpe3RoaXMubWVzc2FnZT1lfVNzLnByb3RvdHlwZT1uZXcgRXJyb3IsU3MucHJvdG90eXBlLm5hbWU9IkludmFsaWRDaGFyYWN0ZXJFcnJvciI7dmFyIFNvPXR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuYXRvYiYmd2luZG93LmF0b2IuYmluZCh3aW5kb3cpfHxmdW5jdGlvbihlKXt2YXIgdD1TdHJpbmcoZSkucmVwbGFjZSgvPSskLywiIik7aWYodC5sZW5ndGglND09MSl0aHJvdyBuZXcgU3MoIidhdG9iJyBmYWlsZWQ6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIik7Zm9yKHZhciByLG4scz0wLGE9MCxvPSIiO249dC5jaGFyQXQoYSsrKTt+biYmKHI9cyU0PzY0KnIrbjpuLHMrKyU0KT9vKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZyPj4oLTIqcyY2KSk6MCluPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuaW5kZXhPZihuKTtyZXR1cm4gb307ZnVuY3Rpb24gRGYoZSl7dmFyIHQ9ZS5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKTtzd2l0Y2godC5sZW5ndGglNCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMjp0Kz0iPT0iO2JyZWFrO2Nhc2UgMzp0Kz0iPSI7YnJlYWs7ZGVmYXVsdDp0aHJvdyJJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchIn10cnl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoU28ocikucmVwbGFjZSgvKC4pL2csZnVuY3Rpb24obixzKXt2YXIgYT1zLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7cmV0dXJuIGEubGVuZ3RoPDImJihhPSIwIithKSwiJSIrYX0pKX0odCl9Y2F0Y2h7cmV0dXJuIFNvKHQpfX1mdW5jdGlvbiBnbihlKXt0aGlzLm1lc3NhZ2U9ZX1mdW5jdGlvbiBqZihlLHQpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgZ24oIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkIik7dmFyIHI9KHQ9dHx8e30pLmhlYWRlcj09PSEwPzA6MTt0cnl7cmV0dXJuIEpTT04ucGFyc2UoRGYoZS5zcGxpdCgiLiIpW3JdKSl9Y2F0Y2gobil7dGhyb3cgbmV3IGduKCJJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogIituLm1lc3NhZ2UpfX1nbi5wcm90b3R5cGU9bmV3IEVycm9yLGduLnByb3RvdHlwZS5uYW1lPSJJbnZhbGlkVG9rZW5FcnJvciI7dmFyIFByPWVlJiZlZS5fX2Fzc2lnbnx8ZnVuY3Rpb24oKXtyZXR1cm4gUHI9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9MSxuPWFyZ3VtZW50cy5sZW5ndGg7cjxuO3IrKyl7dD1hcmd1bWVudHNbcl07Zm9yKHZhciBzIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscykmJihlW3NdPXRbc10pfXJldHVybiBlfSxQci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIFRyKGUsdCl7aWYoIXQpcmV0dXJuIiI7dmFyIHI9IjsgIitlO3JldHVybiB0PT09ITA/cjpyKyI9Iit0fWZ1bmN0aW9uIGtmKGUpe2lmKHR5cGVvZiBlLmV4cGlyZXM9PSJudW1iZXIiKXt2YXIgdD1uZXcgRGF0ZTt0LnNldE1pbGxpc2Vjb25kcyh0LmdldE1pbGxpc2Vjb25kcygpK2UuZXhwaXJlcyo4NjRlNSksZS5leHBpcmVzPXR9cmV0dXJuIFRyKCJFeHBpcmVzIixlLmV4cGlyZXM/ZS5leHBpcmVzLnRvVVRDU3RyaW5nKCk6IiIpK1RyKCJEb21haW4iLGUuZG9tYWluKStUcigiUGF0aCIsZS5wYXRoKStUcigiU2VjdXJlIixlLnNlY3VyZSkrVHIoIlNhbWVTaXRlIixlLnNhbWVTaXRlKX1mdW5jdGlvbiBVZihlLHQscil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lKDIzfDI0fDI2fDJCfDVFfDYwfDdDKS9nLGRlY29kZVVSSUNvbXBvbmVudCkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5IikrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKC8lKDIzfDI0fDI2fDJCfDNBfDNDfDNFfDNEfDJGfDNGfDQwfDVCfDVEfDVFfDYwfDdCfDdEfDdDKS9nLGRlY29kZVVSSUNvbXBvbmVudCkra2Yocil9ZnVuY3Rpb24gRmYoZSl7Zm9yKHZhciB0PXt9LHI9ZT9lLnNwbGl0KCI7ICIpOltdLG49LyglW1xkQS1GXXsyfSkrL2dpLHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIGE9cltzXS5zcGxpdCgiPSIpLG89YS5zbGljZSgxKS5qb2luKCI9Iik7by5jaGFyQXQoMCk9PT0nIicmJihvPW8uc2xpY2UoMSwtMSkpO3RyeXt2YXIgbD1hWzBdLnJlcGxhY2UobixkZWNvZGVVUklDb21wb25lbnQpO3RbbF09by5yZXBsYWNlKG4sZGVjb2RlVVJJQ29tcG9uZW50KX1jYXRjaHt9fXJldHVybiB0fWZ1bmN0aW9uIE1mKCl7cmV0dXJuIEZmKGRvY3VtZW50LmNvb2tpZSl9ZnVuY3Rpb24gTGYoZSl7cmV0dXJuIE1mKClbZV19dmFyIFZmPUxmO2Z1bmN0aW9uIFJvKGUsdCxyKXtkb2N1bWVudC5jb29raWU9VWYoZSx0LFByKHtwYXRoOiIvIn0scikpfXZhciB6Zj1SbztmdW5jdGlvbiBIZihlLHQpe1JvKGUsIiIsUHIoUHIoe30sdCkse2V4cGlyZXM6LTF9KSl9dmFyIEtmPUhmO2NvbnN0IEVuPU5zKGBwcm9jOiR7cHJvY2Vzcy5waWR9OnN0b3JhZ2UudHNgKTt2YXIgYm89KGU9PihlLkxPQ0FMX1NUT1JBR0U9IkxvY2FsU3RvcmFnZSIsZS5TRVNTSU9OX1NUT1JBR0U9IlNlc3Npb25TdG9yYWdlIixlLkNPT0tJRV9TVE9SQUdFPSJDb29raWVTdG9yYWdlIixlLk1FTU9SWV9TVE9SQUdFPSJNZW1vcnlTdG9yYWdlIixlKSkoYm98fHt9KTtjbGFzcyBCZntjb25zdHJ1Y3Rvcigpe3RoaXMuZ2V0PXQ9Pntjb25zdCByPVZmKHQpO3JldHVybiByP0pTT04ucGFyc2Uocik6bnVsbH0sdGhpcy5zZXQ9KHQscixuPXt9KT0+e2xldCBzPXt9O3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbD09PSJodHRwczoiJiYocz17c2VjdXJlOiEwLHNhbWVTaXRlOiJub25lIn0pLG4mJm4uZGF5c1VudGlsRXhwaXJlP3MuZXhwaXJlcz1uLmRheXNVbnRpbEV4cGlyZTpzLmV4cGlyZXM9MSxFbihgQ29va2llU3RvcmFnZS5zZXQ6IGtleTogJHt0fSwgdmFsdWU6IFske3J9XWApLHpmKHQsSlNPTi5zdHJpbmdpZnkocikscyl9LHRoaXMucmVtb3ZlPXQ9PntLZih0KX19fWNsYXNzIEpme2NvbnN0cnVjdG9yKCl7dGhpcy5nZXQ9dD0+e2NvbnN0IHI9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0KTtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifHxyPT09bnVsbD9udWxsOkpTT04ucGFyc2Uocil9LHRoaXMuc2V0PSh0LHIpPT57RW4oYFNlc3Npb25TdG9yYWdlLnNldDoga2V5OiAke3R9LCB2YWx1ZTogWyR7cn1dYCksc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0LEpTT04uc3RyaW5naWZ5KHIpKX0sdGhpcy5yZW1vdmU9dD0+e3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odCl9fX1jbGFzcyBxZntjb25zdHJ1Y3Rvcigpe3RoaXMuZ2V0PXQ9Pntjb25zdCByPWxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpO3JldHVybiB0eXBlb2Ygcj09InVuZGVmaW5lZCJ8fHI9PT1udWxsP251bGw6SlNPTi5wYXJzZShyKX0sdGhpcy5zZXQ9KHQscik9PntFbihgTG9jYWxTdG9yYWdlLnNldDoga2V5OiAke3R9LCB2YWx1ZTogWyR7cn1dYCksbG9jYWxTdG9yYWdlLnNldEl0ZW0odCxKU09OLnN0cmluZ2lmeShyKSl9LHRoaXMucmVtb3ZlPXQ9Pntsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0KX19fWNsYXNzIEdme2NvbnN0cnVjdG9yKCl7U2UodGhpcyxIdCx2b2lkIDApO2NlKHRoaXMsSHQse30pLHRoaXMuZ2V0PXQ9Pntjb25zdCByPVYodGhpcyxIdClbdF07cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkInx8cj09PW51bGw/bnVsbDpyfSx0aGlzLnNldD0odCxyKT0+e0VuKGBNZW1vcnlTdG9yYWdlLnNldDoga2V5OiAke3R9LCB2YWx1ZTogWyR7cn1dYCksVih0aGlzLEh0KVt0XT1yfSx0aGlzLnJlbW92ZT10PT57ZGVsZXRlIFYodGhpcyxIdClbdF19fX1IdD1uZXcgV2Vha01hcDtjbGFzcyBRZntjb25zdHJ1Y3Rvcih0KXtTZSh0aGlzLGJ0LG51bGwpO3N3aXRjaCh0LmNsaWVudFN0b3JhZ2VUeXBlKXtjYXNlIlNlc3Npb25TdG9yYWdlIjpjZSh0aGlzLGJ0LG5ldyBKZik7YnJlYWs7Y2FzZSJMb2NhbFN0b3JhZ2UiOmNlKHRoaXMsYnQsbmV3IHFmKTticmVhaztjYXNlIkNvb2tpZVN0b3JhZ2UiOmNlKHRoaXMsYnQsbmV3IEJmKTticmVhaztjYXNlIk1lbW9yeVN0b3JhZ2UiOmNlKHRoaXMsYnQsbmV3IEdmKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBbJHt0LmNsaWVudFN0b3JhZ2VUeXBlfV0gc3RvcmFnZSB0eXBlLmApfX1HZXRTdG9yYWdlKCl7cmV0dXJuIFYodGhpcyxidCl9fWJ0PW5ldyBXZWFrTWFwO3ZhciBpcjsoZnVuY3Rpb24oZSl7ZVtlLkFDQ0VQVEVEPTIwMl09IkFDQ0VQVEVEIixlW2UuQkFEX0dBVEVXQVk9NTAyXT0iQkFEX0dBVEVXQVkiLGVbZS5CQURfUkVRVUVTVD00MDBdPSJCQURfUkVRVUVTVCIsZVtlLkNPTkZMSUNUPTQwOV09IkNPTkZMSUNUIixlW2UuQ09OVElOVUU9MTAwXT0iQ09OVElOVUUiLGVbZS5DUkVBVEVEPTIwMV09IkNSRUFURUQiLGVbZS5FWFBFQ1RBVElPTl9GQUlMRUQ9NDE3XT0iRVhQRUNUQVRJT05fRkFJTEVEIixlW2UuRkFJTEVEX0RFUEVOREVOQ1k9NDI0XT0iRkFJTEVEX0RFUEVOREVOQ1kiLGVbZS5GT1JCSURERU49NDAzXT0iRk9SQklEREVOIixlW2UuR0FURVdBWV9USU1FT1VUPTUwNF09IkdBVEVXQVlfVElNRU9VVCIsZVtlLkdPTkU9NDEwXT0iR09ORSIsZVtlLkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEPTUwNV09IkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEIixlW2UuSU1fQV9URUFQT1Q9NDE4XT0iSU1fQV9URUFQT1QiLGVbZS5JTlNVRkZJQ0lFTlRfU1BBQ0VfT05fUkVTT1VSQ0U9NDE5XT0iSU5TVUZGSUNJRU5UX1NQQUNFX09OX1JFU09VUkNFIixlW2UuSU5TVUZGSUNJRU5UX1NUT1JBR0U9NTA3XT0iSU5TVUZGSUNJRU5UX1NUT1JBR0UiLGVbZS5JTlRFUk5BTF9TRVJWRVJfRVJST1I9NTAwXT0iSU5URVJOQUxfU0VSVkVSX0VSUk9SIixlW2UuTEVOR1RIX1JFUVVJUkVEPTQxMV09IkxFTkdUSF9SRVFVSVJFRCIsZVtlLkxPQ0tFRD00MjNdPSJMT0NLRUQiLGVbZS5NRVRIT0RfRkFJTFVSRT00MjBdPSJNRVRIT0RfRkFJTFVSRSIsZVtlLk1FVEhPRF9OT1RfQUxMT1dFRD00MDVdPSJNRVRIT0RfTk9UX0FMTE9XRUQiLGVbZS5NT1ZFRF9QRVJNQU5FTlRMWT0zMDFdPSJNT1ZFRF9QRVJNQU5FTlRMWSIsZVtlLk1PVkVEX1RFTVBPUkFSSUxZPTMwMl09Ik1PVkVEX1RFTVBPUkFSSUxZIixlW2UuTVVMVElfU1RBVFVTPTIwN109Ik1VTFRJX1NUQVRVUyIsZVtlLk1VTFRJUExFX0NIT0lDRVM9MzAwXT0iTVVMVElQTEVfQ0hPSUNFUyIsZVtlLk5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQ9NTExXT0iTkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRCIsZVtlLk5PX0NPTlRFTlQ9MjA0XT0iTk9fQ09OVEVOVCIsZVtlLk5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OPTIwM109Ik5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OIixlW2UuTk9UX0FDQ0VQVEFCTEU9NDA2XT0iTk9UX0FDQ0VQVEFCTEUiLGVbZS5OT1RfRk9VTkQ9NDA0XT0iTk9UX0ZPVU5EIixlW2UuTk9UX0lNUExFTUVOVEVEPTUwMV09Ik5PVF9JTVBMRU1FTlRFRCIsZVtlLk5PVF9NT0RJRklFRD0zMDRdPSJOT1RfTU9ESUZJRUQiLGVbZS5PSz0yMDBdPSJPSyIsZVtlLlBBUlRJQUxfQ09OVEVOVD0yMDZdPSJQQVJUSUFMX0NPTlRFTlQiLGVbZS5QQVlNRU5UX1JFUVVJUkVEPTQwMl09IlBBWU1FTlRfUkVRVUlSRUQiLGVbZS5QRVJNQU5FTlRfUkVESVJFQ1Q9MzA4XT0iUEVSTUFORU5UX1JFRElSRUNUIixlW2UuUFJFQ09ORElUSU9OX0ZBSUxFRD00MTJdPSJQUkVDT05ESVRJT05fRkFJTEVEIixlW2UuUFJFQ09ORElUSU9OX1JFUVVJUkVEPTQyOF09IlBSRUNPTkRJVElPTl9SRVFVSVJFRCIsZVtlLlBST0NFU1NJTkc9MTAyXT0iUFJPQ0VTU0lORyIsZVtlLlBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEPTQwN109IlBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEIixlW2UuUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRT00MzFdPSJSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFIixlW2UuUkVRVUVTVF9USU1FT1VUPTQwOF09IlJFUVVFU1RfVElNRU9VVCIsZVtlLlJFUVVFU1RfVE9PX0xPTkc9NDEzXT0iUkVRVUVTVF9UT09fTE9ORyIsZVtlLlJFUVVFU1RfVVJJX1RPT19MT05HPTQxNF09IlJFUVVFU1RfVVJJX1RPT19MT05HIixlW2UuUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRT00MTZdPSJSRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFIixlW2UuUkVTRVRfQ09OVEVOVD0yMDVdPSJSRVNFVF9DT05URU5UIixlW2UuU0VFX09USEVSPTMwM109IlNFRV9PVEhFUiIsZVtlLlNFUlZJQ0VfVU5BVkFJTEFCTEU9NTAzXT0iU0VSVklDRV9VTkFWQUlMQUJMRSIsZVtlLlNXSVRDSElOR19QUk9UT0NPTFM9MTAxXT0iU1dJVENISU5HX1BST1RPQ09MUyIsZVtlLlRFTVBPUkFSWV9SRURJUkVDVD0zMDddPSJURU1QT1JBUllfUkVESVJFQ1QiLGVbZS5UT09fTUFOWV9SRVFVRVNUUz00MjldPSJUT09fTUFOWV9SRVFVRVNUUyIsZVtlLlVOQVVUSE9SSVpFRD00MDFdPSJVTkFVVEhPUklaRUQiLGVbZS5VTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUz00NTFdPSJVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUyIsZVtlLlVOUFJPQ0VTU0FCTEVfRU5USVRZPTQyMl09IlVOUFJPQ0VTU0FCTEVfRU5USVRZIixlW2UuVU5TVVBQT1JURURfTUVESUFfVFlQRT00MTVdPSJVTlNVUFBPUlRFRF9NRURJQV9UWVBFIixlW2UuVVNFX1BST1hZPTMwNV09IlVTRV9QUk9YWSIsZVtlLk1JU0RJUkVDVEVEX1JFUVVFU1Q9NDIxXT0iTUlTRElSRUNURURfUkVRVUVTVCJ9KShpcnx8KGlyPXt9KSk7dmFyIE9vPShlPT4oZS5DT0RFPSJjb2RlIixlLklEX1RPS0VOPSJpZF90b2tlbiIsZS5UT0tFTj0idG9rZW4iLGUpKShPb3x8e30pLE5vPShlPT4oZS5RVUVSWT0icXVlcnkiLGUuRlJBR01FTlQ9ImZyYWdtZW50IixlLkZPUk1fUE9TVD0iZm9ybV9wb3N0IixlKSkoTm98fHt9KSxScz0oZT0+KGUuQ0xJRU5UX0NSRURFTlRJQUxTPSJjbGllbnRfY3JlZGVudGlhbHMiLGUuQVVUSE9SSVpBVElPTl9DT0RFPSJhdXRob3JpemF0aW9uX2NvZGUiLGUuUkVGUkVTSF9UT0tFTj0icmVmcmVzaF90b2tlbiIsZSkpKFJzfHx7fSksenQ9KGU9PihlLlJFU1RPUkVfU0VTU0lPTj0iUmVzdG9yZVNlc3Npb24iLGUuQVVUSE9SSVpFPSJBdXRob3JpemUiLGUuSEFORExFX1JFRElSRUNUPSJIYW5kbGVSZWRpcmVjdCIsZS5MT0dPVVQ9IkxvZ291dCIsZS5BVVRIRU5USUNBVEVfRVZFTlQ9IkF1dGhlbnRpY2F0ZUV2ZW50IixlLkVSUk9SPSJFcnJvciIsZSkpKHp0fHx7fSk7TnMoYHByb2M6JHtwcm9jZXNzLnBpZH06c3Rzb2F1dGgyd29ya2VyLnRzYCk7Y2xhc3MgWWZ7Y29uc3RydWN0b3IodCl7U2UodGhpcyxGZSx2b2lkIDApO1NlKHRoaXMsT3Qsdm9pZCAwKTtTZSh0aGlzLEFyLHZvaWQgMCk7U2UodGhpcyx5bix2b2lkIDApO1NlKHRoaXMsSGUsdm9pZCAwKTtTZSh0aGlzLHZ0LHZvaWQgMCk7U2UodGhpcyxOdCx2b2lkIDApO1NlKHRoaXMsS2Usdm9pZCAwKTtTZSh0aGlzLEt0LHZvaWQgMCk7U2UodGhpcywkbix2b2lkIDApO1NlKHRoaXMsdHQsdm9pZCAwKTtTZSh0aGlzLENyLHZvaWQgMCk7U2UodGhpcyxJcix2b2lkIDApO1NlKHRoaXMsRHIsdm9pZCAwKTtTZSh0aGlzLGNyLHZvaWQgMCk7U2UodGhpcyxqcix2b2lkIDApO1NlKHRoaXMsa3Isdm9pZCAwKTtTZSh0aGlzLFVyLHZvaWQgMCk7Y2UodGhpcyxGZSxudWxsKSxjZSh0aGlzLE90LG5ldyBDZiksY2UodGhpcyxBcixuZXcgSWYpLGNlKHRoaXMseW4sImF1dGhvcml6ZV9vcHRpb25zLnN0c21kYS5jb20uYXUiKSxjZSh0aGlzLEhlLCJzZXNzaW9uLnN0c21kYS5jb20uYXUiKSxjZSh0aGlzLHZ0LG51bGwpLGNlKHRoaXMsTnQsbnVsbCksY2UodGhpcyxLZSxudWxsKSxjZSh0aGlzLEt0LG51bGwpLGNlKHRoaXMsJG4sMCksdGhpcy5TZXR1cExpc3RlbmVyPSgpPT57Vih0aGlzLEt0KS5vbm1lc3NhZ2U9YXN5bmMgcj0+e2NvbnN0IG49ci5kYXRhO3N3aXRjaChuLmNvbW1hbmQpe2Nhc2UgenQuUkVTVE9SRV9TRVNTSU9OOlYodGhpcyx0dCkuY2FsbCh0aGlzLG4sYXdhaXQgVih0aGlzLENyKS5jYWxsKHRoaXMpKTticmVhaztjYXNlIHp0LkFVVEhPUklaRTpWKHRoaXMsdHQpLmNhbGwodGhpcyxuLGF3YWl0IFYodGhpcyxJcikuY2FsbCh0aGlzKSk7YnJlYWs7Y2FzZSB6dC5IQU5ETEVfUkVESVJFQ1Q6Vih0aGlzLHR0KS5jYWxsKHRoaXMsbixhd2FpdCBWKHRoaXMsRHIpLmNhbGwodGhpcyxuLnBheWxvYWQpKTticmVhaztjYXNlIHp0LkxPR09VVDpWKHRoaXMsdHQpLmNhbGwodGhpcyxuLGF3YWl0IFYodGhpcyxVcikuY2FsbCh0aGlzKSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYENvbW1hbmQ6IFske24uY29tbWFuZH0nXSBub3QgZm91bmQuYCl9fX0sY2UodGhpcyx0dCxhc3luYyhyLG4pPT57Y29uc3Qgcz17bWVzc2FnZUlkOnIubWVzc2FnZUlkLGNvbW1hbmQ6ci5jb21tYW5kLHBheWxvYWQ6bn07Vih0aGlzLEt0KS5wb3N0TWVzc2FnZShzKX0pLGNlKHRoaXMsQ3IsYXN5bmMoKT0+e2xldCByPW51bGw7aWYocj1WKHRoaXMsRmUpLmdldChWKHRoaXMsSGUpKSxyIT09bnVsbCljb25zb2xlLmxvZygiU2Vzc2lvbiByZXN0b3JlZCBmcm9tIGNsaWVudCBzdG9yYWdlLiIpLFYodGhpcyx2dCkmJlYodGhpcyx2dCkuVXBkYXRlSW5zdHJ1bWVudCgibSIse0xvZ01lc3NhZ2U6IlNlc3Npb24gcmVzdG9yZWQgZnJvbSBjbGllbnQgc3RvcmFnZS4ifSk7ZWxzZXtjb25zdCBuPWAke3t9LkJST0tFUl9FTkRQT0lOVH06JHt7fS5CUk9LRVJfUE9SVH0ke3t9LkJST0tFUl9BUElfUk9PVH0vc2Vzc2lvbmA7Y29uc29sZS5sb2coIlJlc3RvcmVTZXNzaW9uIiksY29uc29sZS5sb2cobiksVih0aGlzLHZ0KSYmKFYodGhpcyx2dCkuVXBkYXRlSW5zdHJ1bWVudCgibSIse0xvZ01lc3NhZ2U6IlJlc3RvcmVTZXNzaW9uIn0pLFYodGhpcyx2dCkuVXBkYXRlSW5zdHJ1bWVudCgibSIse0xvZ01lc3NhZ2U6bn0pKTt0cnl7Y29uc3Qgcz1hd2FpdCBWbih7bWV0aG9kOiJwb3N0Iix1cmw6bixkYXRhOntbQ3QuT0F1dGgyUGFyYW1ldGVyVHlwZS5DTElFTlRfSURdOnt9LkNMSUVOVF9JRCxbQ3QuT0F1dGgyUGFyYW1ldGVyVHlwZS5TQ09QRV06e30uU0NPUEUsW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuUkVESVJFQ1RfVVJJXTp7fS5SRURJUkVDVF9VUkksW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuQVVESUVOQ0VdOnt9LkFVRElFTkNFfSx3aXRoQ3JlZGVudGlhbHM6ITAsdGltZW91dDpwYXJzZUludCh7fS5USU1FT1VUKX0pO3MuZGF0YS5zdGF0dXM9PT1pci5PSz8ocj1zLmRhdGEuZGV0YWlsLFYodGhpcyxGZSkuc2V0KFYodGhpcyxIZSksciksY29uc29sZS5sb2coIlNlc3Npb24gcmVzdG9yZWQgZnJvbSBzZXJ2ZXIgc2lkZSBjb29raWUuIikpOihjb25zb2xlLmxvZygiQ291bGQgbm90IHJlc3RvcmUgcHJldmlvdXMgc2Vzc2lvbjotIiksY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocy5kYXRhKSkpfWNhdGNoKHMpe2NvbnNvbGUubG9nKCJDb3VsZCBub3QgcmVzdG9yZSBwcmV2aW91cyBzZXNzaW9uIChlcnJvciBzdGF0ZSk6LSIpLGNvbnNvbGUubG9nKHMpLGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHMpKX19cmV0dXJuIHIhPT1udWxsPyhWKHRoaXMsS2UpLmNhbGwodGhpcyxyLmlkX3Rva2VuKSxjb25zb2xlLmxvZygiUmVmcmVzaGluZyB0b2tlbnMgLi4uIiksVih0aGlzLGtyKS5jYWxsKHRoaXMpKTooVih0aGlzLEtlKS5jYWxsKHRoaXMsbnVsbCksITEpfSksY2UodGhpcyxJcixhc3luYygpPT57Y29uc29sZS5sb2coIkF1dGhvcml6ZSAuLi4iKTtjb25zdCByPXt9LkNMSUVOVF9JRCxuPVYodGhpcyxPdCkuQ3JlYXRlUmFuZG9tU3RyaW5nKCkscz1bT28uQ09ERV0sYT17fS5SRURJUkVDVF9VUkksbz1Oby5RVUVSWSxsPXt9LlNDT1BFLGY9Vih0aGlzLE90KS5DcmVhdGVSYW5kb21TdHJpbmcoKSxwPVYodGhpcyxPdCkuQ3JlYXRlUmFuZG9tU3RyaW5nKCksaT1hd2FpdCBWKHRoaXMsT3QpLkRpZ2VzdE1lc3NhZ2UocCksRT17Y2xpZW50X2lkOnIsbm9uY2U6bixyZXNwb25zZV90eXBlOnMscmVkaXJlY3RfdXJpOmEscmVzcG9uc2VfbW9kZTpvLHNjb3BlOmwsc3RhdGU6Zixjb2RlX2NoYWxsZW5nZTppLGNvZGVfY2hhbGxlbmdlX21ldGhvZDoiUzI1NiJ9LFQ9YCR7e30uQVVUSF9FTkRQT0lOVH06JHt7fS5BVVRIX1BPUlR9JHt7fS5BVVRIX0FQSVJPT1R9PyR7Vih0aGlzLEFyKS5DcmVhdGVRdWVyeVBhcmFtcyhFKX1gO3JldHVybiBjb25zb2xlLmxvZyhUKSxFLmNvZGVfdmVyaWZpZXI9cCxjb25zb2xlLmxvZyhgQXV0aG9yaXplOmF1dGhvcml6ZU9wdGlvbnM6IFske0pTT04uc3RyaW5naWZ5KEUpfV1gKSx7dXJsOlQsYXV0aG9yaXplT3B0aW9uczpFfX0pLGNlKHRoaXMsRHIsYXN5bmMgcj0+e2NvbnN0IG49ci5xdWVyeVZhcnMscz1yLmF1dGhvcml6ZU9wdGlvbnM7aWYoY29uc29sZS5sb2coIkhhbmRsZVJlZGlyZWN0IiksY29uc29sZS5sb2coYEhhbmRsZVJlZGlyZWN0OlF1ZXJ5IFZhcnM6IFske0pTT04uc3RyaW5naWZ5KG4pfV1gKSxuW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuQ09ERV0pe2NvbnN0IGE9bjtjb25zb2xlLmxvZyhgYXV0aG9yaXplT3B0aW9ucyBmcm9tIHRyYW5zYWN0aW9uIHN0YXRlOiBbJHtKU09OLnN0cmluZ2lmeShzKX1dYCk7Y29uc3Qgbz1hLnN0YXRlO3JldHVybiBzLnN0YXRlLmxvY2FsZUNvbXBhcmUobyk9PT0wPyhjb25zb2xlLmxvZygicmVkaXJlY3RlZCBzdGF0ZSAoZnJvbSBxdWVyeVZhcnMpIG1hdGNoZWQgcHJldmlvdXNseSBzYXZlZCB0cmFuc2FjdGlvbiBhdXRob3JpemVPcHRpb25zIHN0YXRlIiksYXdhaXQgVih0aGlzLGpyKS5jYWxsKHRoaXMscyxhKSk6KGNvbnNvbGUubG9nKCJyZWRpcmVjdGVkIHN0YXRlIChmcm9tIHF1ZXJ5VmFycykgZGlkIE5PVCBtYXRjaCBwcmV2aW91c2x5IHNhdmVkIHRyYW5zYWN0aW9uIGF1dGhvcml6ZU9wdGlvbnMgc3RhdGUiKSxWKHRoaXMsTnQpLmNhbGwodGhpcyx7bWVzc2FnZToiU3RhdGUgdW4tbWF0Y2hlZCJ9KSwhMSl9ZWxzZSBpZihuW0N0Lk9BdXRoMlBhcmFtZXRlclR5cGUuRVJST1JdKXtjb25zdCBhPW47cmV0dXJuIGEuZXJyb3IsYS5lcnJvcl9kZXNjcmlwdGlvbixWKHRoaXMsTnQpLmNhbGwodGhpcyx7bWVzc2FnZToiU3RhdGUgdW4tbWF0Y2hlZCJ9KSwhMX1lbHNlIHJldHVybiBWKHRoaXMsTnQpLmNhbGwodGhpcyx7bWVzc2FnZToiU3RhdGUgdW4tbWF0Y2hlZCJ9KSwhMX0pLGNlKHRoaXMsY3IsYXN5bmMgcj0+e2NvbnNvbGUubG9nKCIjR2V0VG9rZW5Gcm9tQnJva2VyIiksVih0aGlzLEZlKS5yZW1vdmUoVih0aGlzLEhlKSk7Y29uc3Qgbj1gJHt7fS5CUk9LRVJfRU5EUE9JTlR9OiR7e30uQlJPS0VSX1BPUlR9JHt7fS5CUk9LRVJfQVBJX1JPT1R9L3Rva2VuYDtjb25zb2xlLmxvZyhgI0dldFRva2VuRnJvbUJyb2tlcjp1cmwgPSBbJHtufV1gKSxjb25zb2xlLmxvZyhyKTt0cnl7Y29uc3Qgcz1hd2FpdCBWbih7bWV0aG9kOiJwb3N0Iix1cmw6bixkYXRhOnIsd2l0aENyZWRlbnRpYWxzOiEwLHRpbWVvdXQ6cGFyc2VJbnQoe30uVElNRU9VVCl9KTtpZihjb25zb2xlLmxvZyhgcmV0VmFsOiAke0pTT04uc3RyaW5naWZ5KHMpfWApLHMuc3RhdHVzPT09aXIuT0spe2NvbnNvbGUubG9nKCJTdG9yaW5nIHRva2Vucy4uLiIpO2NvbnN0IGE9cy5kYXRhO3JldHVybiBWKHRoaXMsS2UpLmNhbGwodGhpcyxhLmlkX3Rva2VuKSxWKHRoaXMsRmUpLnNldChWKHRoaXMsSGUpLGEpLCEwfWVsc2UgaWYocy5zdGF0dXM9PT1pci5VTkFVVEhPUklaRUQpe2NvbnNvbGUubG9nKCJOT1QgU3RvcmluZyB0b2tlbnMuLi4iKSxjb25zb2xlLmxvZyhzLnN0YXR1cyksVih0aGlzLEtlKS5jYWxsKHRoaXMsbnVsbCk7Y29uc3QgYT1zLmRhdGE7cmV0dXJuITF9ZWxzZSByZXR1cm4gY29uc29sZS5sb2coIk5PVCBTdG9yaW5nIHRva2Vucy4uLiIpLGNvbnNvbGUubG9nKHMuc3RhdHVzKSxWKHRoaXMsS2UpLmNhbGwodGhpcyxudWxsKSxjb25zb2xlLmxvZygiQ291bGQgbm90IG9idGFpbiBhY2Nlc3NfdG9rZW4gZnJvbSB0b2tlbiBlbmQtcG9pbnQ6LSIpLGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHMuZGF0YSkpLCExfWNhdGNoKHMpe3JldHVybiBWKHRoaXMsS2UpLmNhbGwodGhpcyxudWxsKSxjb25zb2xlLmxvZyhzKSxjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShzKSksITF9fSksY2UodGhpcyxqcixhc3luYyhyLG4pPT57Y29uc29sZS5sb2coIiNHZXRUb2tlbiIpLGNvbnNvbGUubG9nKG4pLFYodGhpcyxGZSkuc2V0KFYodGhpcyxIZSksbnVsbCk7Y29uc3Qgcz17Y2xpZW50X2lkOnt9LkNMSUVOVF9JRCxzY29wZTp7fS5TQ09QRSxjb2RlOm4uY29kZSxyZWRpcmVjdF91cmk6e30uUkVESVJFQ1RfVVJJLGdyYW50X3R5cGU6UnMuQVVUSE9SSVpBVElPTl9DT0RFLGNvZGVfdmVyaWZpZXI6ci5jb2RlX3ZlcmlmaWVyfTtyZXR1cm4gVih0aGlzLGNyKS5jYWxsKHRoaXMscyl9KSxjZSh0aGlzLGtyLGFzeW5jKCk9Pntjb25zb2xlLmxvZygiUmVmcmVzaFRva2VuIik7Y29uc3Qgcj1WKHRoaXMsRmUpLmdldChWKHRoaXMsSGUpKTtpZihyKXtjb25zdCBuPXtjbGllbnRfaWQ6e30uQ0xJRU5UX0lELHNjb3BlOnt9LlNDT1BFLHJlZnJlc2hfdG9rZW46ci5yZWZyZXNoX3Rva2VuLGdyYW50X3R5cGU6UnMuUkVGUkVTSF9UT0tFTn07cmV0dXJuIFYodGhpcyxjcikuY2FsbCh0aGlzLG4pfWVsc2UgcmV0dXJuITF9KSxjZSh0aGlzLFVyLGFzeW5jKCk9Pntjb25zb2xlLmxvZygiTG9nb3V0Iik7Y29uc3Qgcj1gJHt7fS5CUk9LRVJfRU5EUE9JTlR9OiR7e30uQlJPS0VSX1BPUlR9JHt7fS5CUk9LRVJfQVBJX1JPT1R9L2xvZ291dGA7Y29uc29sZS5sb2cocik7Y29uc3Qgcz1WKHRoaXMsRmUpLmdldChWKHRoaXMsSGUpKS5yZWZyZXNoX3Rva2VuO2NvbnNvbGUubG9nKHMpO2NvbnN0IGE9amYocyk7Y29uc29sZS5sb2coYSk7Y29uc3Qgbz1hLnN0c19zZXNzaW9uO2NvbnNvbGUubG9nKG8pLFYodGhpcyxGZSkucmVtb3ZlKFYodGhpcyxIZSkpLFYodGhpcyxLZSkuY2FsbCh0aGlzLG51bGwpO3RyeXtjb25zdCBsPWF3YWl0IFZuKHttZXRob2Q6InBvc3QiLHVybDpyLGRhdGE6e3Nlc3Npb25JZDpvfSx3aXRoQ3JlZGVudGlhbHM6ITAsdGltZW91dDpwYXJzZUludCh7fS5USU1FT1VUKX0pO3JldHVybiBsLmRhdGEuc3RhdHVzPT09aXIuT0s/ITA6KGNvbnNvbGUubG9nKCJFcnJvciBkdXJpbmcgbG9nb3V0IChzZXJ2ZXIgc2lkZSkiKSxjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShsLmRhdGEpKSwhMSl9Y2F0Y2gobCl7cmV0dXJuIGNvbnNvbGUubG9nKCJFcnJvciBkdXJpbmcgbG9nb3V0IChzZXJ2ZXIgc2lkZSkiKSxjb25zb2xlLmxvZyhsKSxjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShsKSksITF9fSksY2UodGhpcyxGZSxuZXcgUWYoe2NsaWVudFN0b3JhZ2VUeXBlOmJvLk1FTU9SWV9TVE9SQUdFfSkuR2V0U3RvcmFnZSgpKSxjZSh0aGlzLEtlLHI9Pntjb25zdCBuPXttZXNzYWdlSWQ6LTEsY29tbWFuZDp6dC5BVVRIRU5USUNBVEVfRVZFTlR9O1YodGhpcyx0dCkuY2FsbCh0aGlzLG4scil9KSxjZSh0aGlzLE50LHI9Pntjb25zdCBuPXttZXNzYWdlSWQ6LTEsY29tbWFuZDp6dC5FUlJPUn07Vih0aGlzLHR0KS5jYWxsKHRoaXMsbixyKX0pLGNlKHRoaXMsS3QsdCksdGhpcy5TZXR1cExpc3RlbmVyKCl9fUZlPW5ldyBXZWFrTWFwLE90PW5ldyBXZWFrTWFwLEFyPW5ldyBXZWFrTWFwLHluPW5ldyBXZWFrTWFwLEhlPW5ldyBXZWFrTWFwLHZ0PW5ldyBXZWFrTWFwLE50PW5ldyBXZWFrTWFwLEtlPW5ldyBXZWFrTWFwLEt0PW5ldyBXZWFrTWFwLCRuPW5ldyBXZWFrTWFwLHR0PW5ldyBXZWFrTWFwLENyPW5ldyBXZWFrTWFwLElyPW5ldyBXZWFrTWFwLERyPW5ldyBXZWFrTWFwLGNyPW5ldyBXZWFrTWFwLGpyPW5ldyBXZWFrTWFwLGtyPW5ldyBXZWFrTWFwLFVyPW5ldyBXZWFrTWFwLG9ubWVzc2FnZT1hc3luYyBmdW5jdGlvbihlKXtjb25zdCB0PWUuZGF0YTtuZXcgWWYodCl9fSkoKTsK",Xn=typeof window!="undefined"&&window.Blob&&new Blob([atob(Wn)],{type:"text/javascript;charset=utf-8"});function Ro(){const e=Xn&&(window.URL||window.webkitURL).createObjectURL(Xn);try{return e?new Worker(e,{}):new Worker("data:application/javascript;base64,"+Wn,{type:"module"})}finally{e&&(window.URL||window.webkitURL).revokeObjectURL(e)}}const fo=jt(`proc:${process.pid}:stsoauth2manager.ts`);class yn{constructor(l,c){pe(this,hc,void 0);pe(this,Hl,void 0);pe(this,Gl,void 0);pe(this,$c,void 0);pe(this,qc,void 0);pe(this,kl,void 0);pe(this,et,void 0);pe(this,pc,void 0);pe(this,Fl,void 0);pe(this,lt,void 0);pe(this,Ml,void 0);pe(this,Gc,void 0);pe(this,Vl,void 0);pe(this,Ol,void 0);pe(this,Wl,void 0);pe(this,Xl,void 0);pe(this,Vc,void 0);pe(this,sl,void 0);pe(this,Wc,void 0);pe(this,Xc,void 0);pe(this,yc,void 0);pe(this,Yc,void 0);ce(this,hc,null),ce(this,Hl,null),ce(this,Gl,null),ce(this,$c,new so),ce(this,qc,new ao),ce(this,kl,"authorize_options.stsmda.com.au"),ce(this,et,"session.stsmda.com.au"),ce(this,pc,null),ce(this,Fl,null),ce(this,lt,{}),ce(this,Gc,0),ce(this,Vl,{}),ce(this,Ol,1e3),ce(this,Wl,null),ce(this,Xl,null),ce(this,Vc,n=>{const a=n.data;if(a.messageId===-1)switch(a.command){case dl.AUTHENTICATE_EVENT:O(this,Xc).call(this,a.payload);break;case dl.ERROR:O(this,Wc).call(this,a.payload);break;default:throw new Error(`ProcessMessageResponse command [${a.command}] not valid.`)}else{const b=O(this,Vl)[a.messageId];if(b)b(a);else throw new Error(`Message: [${a.messageId}] does not exists in callBacks.`)}}),ce(this,sl,n=>(n.messageId=Un(this,Gc)._++,new Promise((a,b)=>{const p=setTimeout(()=>{delete O(this,Vl)[n.messageId],b(`Message: [${n.messageId}] timeout error after: [${O(this,Ol)}] ms.`)},O(this,Ol));O(this,Vl)[n.messageId]=r=>{clearTimeout(p),delete O(this,Vl)[n.messageId],a(r)},O(this,Ml).postMessage(n)}))),ce(this,Wc,n=>{O(this,Gl).commit("AuthorizeError",{message:n}),setTimeout(()=>{O(this,Hl).replace("/error")},0)}),ce(this,Xc,n=>{O(this,Fl).authenticateEvent&&O(this,Fl).authenticateEvent(n),O(this,Gl).commit("stsOAuth2SDK/SessionData",n)}),ce(this,yc,(n,a)=>{a.beforeEach(async(b,p)=>{const r=n.config.globalProperties.$store,o=n.config.globalProperties.$sts;if(fo(`beforeEach: from: [${p.path}], to: [${b.path}]`),r.getters["stsOAuth2SDK/LoggedIn"]===!1){if(console.log("Not logged in"),b.path.localeCompare("/authorize")===0)return console.log("to = /authorize"),!0;if(b.path.localeCompare("/consent")===0&&typeof r.getters.Session.sessionId!="undefined"||b.path.localeCompare("/logout")===0||b.path.localeCompare("/error")===0||b.path.localeCompare("/logout")===0)return!0;const h=b.query;if(h[Hc.OAuth2ParameterType.CODE]||h[Hc.OAuth2ParameterType.ERROR])return console.log(`#SetupRout:str = [${h}]`),await o.om.HandleRedirect(h)?(setTimeout(()=>{window.history.replaceState({},document.title,window.location.origin+"/")},0),!0):(O(this,Hl).replace("/error"),!1);const S=await o.om.RestoreSession();return console.log(`#SetupRoute:sessionRestored [${S}]`),S!==!0?(console.log("Session not restored - Need to Authorize"),o.om.Authorize(),!1):"/"}else return b.path.localeCompare("/consent")===0?"/":b.path.localeCompare("/authorize")===0?(a.replace({path:"/"}),!1):b.path.localeCompare("/logout")===0?(a.replace({path:"/"}),!1):!0})}),ce(this,Yc,()=>{O(this,Gl).registerModule("stsOAuth2SDK",{namespaced:!0,state(){return{sessionData:{}}},getters:{SessionData(n){return n.sessionData},LoggedIn(n){return!(typeof n.sessionData=="undefined"||n.sessionData===null)},UserDetails(n){if(n.sessionData){const a=n.sessionData;return So(a)}else return null}},mutations:{SessionData(n,a){n.sessionData=a,console.log(`commit [sessionData]: ${JSON.stringify(a)}`)}}},{preserveState:!0})}),this.RestoreSession=async()=>{try{return(await O(this,sl).call(this,{command:dl.RESTORE_SESSION})).payload}catch(n){return console.log(`RestoreSession Error: ${n}`),!1}},this.Authorize=async()=>{try{const n=await O(this,sl).call(this,{command:dl.AUTHORIZE});O(this,Xl).set(O(this,kl),n.payload.authorizeOptions);const a=n.payload.url;window.location.replace(a)}catch(n){console.log(`Authorize Error: ${n}`)}},this.HandleRedirect=async n=>{try{let a=null;if(n[Hc.OAuth2ParameterType.CODE]){const b=O(this,Xl).get(O(this,kl));O(this,Xl).remove(O(this,kl)),a=await O(this,sl).call(this,{command:dl.HANDLE_REDIRECT,payload:{queryVars:n,authorizeOptions:b}})}else a=await O(this,sl).call(this,{command:dl.HANDLE_REDIRECT,payload:n});return a.payload}catch(a){return console.log(`HandleRedirect Error: ${a}`),!1}},this.Logout=async()=>{try{return(await O(this,sl).call(this,{command:dl.LOGOUT})).payload}catch(n){return console.log(`Logout Error: ${n}`),!1}},ce(this,Fl,c),ce(this,hc,l.config.globalProperties.$sts.storage),ce(this,Gl,l.config.globalProperties.$store),ce(this,pc,l.config.globalProperties.$sts.aic.PrimaryPublishInstrumentController),ce(this,Hl,l.config.globalProperties.$router),ce(this,Xl,new Yo({clientStorageType:Gn.SESSION_STORAGE}).GetStorage()),ce(this,Wl,new Ro),O(this,Wl).onmessage=n=>{console.log(`this.#worker.onmessage = [${n}]`)},O(this,Wl).onerror=function(n){console.log(`this.#worker.onerror = [${n}]`)};const{port1:t,port2:i}=new MessageChannel;ce(this,Ml,t),O(this,Wl).postMessage(i,[i]),O(this,Ml).onmessage=n=>{O(this,Vc).call(this,n)},O(this,Yc).call(this),O(this,yc).call(this,l,c.router)}}hc=new WeakMap,Hl=new WeakMap,Gl=new WeakMap,$c=new WeakMap,qc=new WeakMap,kl=new WeakMap,et=new WeakMap,pc=new WeakMap,Fl=new WeakMap,lt=new WeakMap,Ml=new WeakMap,Gc=new WeakMap,Vl=new WeakMap,Ol=new WeakMap,Wl=new WeakMap,Xl=new WeakMap,Vc=new WeakMap,sl=new WeakMap,Wc=new WeakMap,Xc=new WeakMap,yc=new WeakMap,Yc=new WeakMap;const Lo={install:(e,l)=>{const c=new yn(e,l);e.config.globalProperties.$sts.om=c}};M.AuthorizeOptionsResponseMode=rn,M.AuthorizeOptionsResponseType=bn,M.IOauth2ListenerCommand=dl,M.OAuthGrantTypes=hn,M.STSOAuth2Manager=yn,M.STSOAuth2ManagerPlugin=Lo,Object.defineProperties(M,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});