TreasureTrails/node_modules/@prisma/studio-core/dist/chunk-LR52PZTP.js
2026-03-18 09:02:21 -05:00

11 lines
No EOL
1.2 MiB

import * as ___react___ from 'react';
import * as ___react_dom___ from 'react-dom';
function require(mod) {
if (mod === 'react') return ___react___;
if (mod === 'react-dom') return ___react_dom___;
throw new Error(`Unknown module ${mod}`);
}
import{b as Io,d as Lo}from"./chunk-6QJ7HVIC.js";var qo=Io((Ti,ki)=>{"use strict";(function(t,e){typeof Ti=="object"&&typeof ki<"u"?ki.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(Ti,(function(){"use strict";var t=1e3,e=6e4,r=36e5,o="millisecond",n="second",s="minute",a="hour",c="day",g="week",w="month",te="quarter",M="year",re="date",f="Invalid Date",Y=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,ut=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,Ke={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(N){var h=["th","st","nd","rd"],d=N%100;return"["+N+(h[(d-20)%10]||h[d]||h[0])+"]"}},ye=function(N,h,d){var m=String(N);return!m||m.length>=h?N:""+Array(h+1-m.length).join(d)+N},xr={s:ye,z:function(N){var h=-N.utcOffset(),d=Math.abs(h),m=Math.floor(d/60),p=d%60;return(h<=0?"+":"-")+ye(m,2,"0")+":"+ye(p,2,"0")},m:function N(h,d){if(h.date()<d.date())return-N(d,h);var m=12*(d.year()-h.year())+(d.month()-h.month()),p=h.clone().add(m,w),y=d-p<0,x=h.clone().add(m+(y?-1:1),w);return+(-(m+(d-p)/(y?p-x:x-p))||0)},a:function(N){return N<0?Math.ceil(N)||0:Math.floor(N)},p:function(N){return{M:w,y:M,w:g,d:c,D:re,h:a,m:s,s:n,ms:o,Q:te}[N]||String(N||"").toLowerCase().replace(/s$/,"")},u:function(N){return N===void 0}},Qe="en",De={};De[Qe]=Ke;var gt="$isDayjsObject",er=function(N){return N instanceof wr||!(!N||!N[gt])},Ge=function N(h,d,m){var p;if(!h)return Qe;if(typeof h=="string"){var y=h.toLowerCase();De[y]&&(p=y),d&&(De[y]=d,p=y);var x=h.split("-");if(!p&&x.length>1)return N(x[0])}else{var I=h.name;De[I]=h,p=I}return!m&&p&&(Qe=p),p||!m&&Qe},z=function(N,h){if(er(N))return N.clone();var d=typeof h=="object"?h:{};return d.date=N,d.args=arguments,new wr(d)},E=xr;E.l=Ge,E.i=er,E.w=function(N,h){return z(N,{locale:h.$L,utc:h.$u,x:h.$x,$offset:h.$offset})};var wr=(function(){function N(d){this.$L=Ge(d.locale,null,!0),this.parse(d),this.$x=this.$x||d.x||{},this[gt]=!0}var h=N.prototype;return h.parse=function(d){this.$d=(function(m){var p=m.date,y=m.utc;if(p===null)return new Date(NaN);if(E.u(p))return new Date;if(p instanceof Date)return new Date(p);if(typeof p=="string"&&!/Z$/i.test(p)){var x=p.match(Y);if(x){var I=x[2]-1||0,Q=(x[7]||"0").substring(0,3);return y?new Date(Date.UTC(x[1],I,x[3]||1,x[4]||0,x[5]||0,x[6]||0,Q)):new Date(x[1],I,x[3]||1,x[4]||0,x[5]||0,x[6]||0,Q)}}return new Date(p)})(d),this.init()},h.init=function(){var d=this.$d;this.$y=d.getFullYear(),this.$M=d.getMonth(),this.$D=d.getDate(),this.$W=d.getDay(),this.$H=d.getHours(),this.$m=d.getMinutes(),this.$s=d.getSeconds(),this.$ms=d.getMilliseconds()},h.$utils=function(){return E},h.isValid=function(){return this.$d.toString()!==f},h.isSame=function(d,m){var p=z(d);return this.startOf(m)<=p&&p<=this.endOf(m)},h.isAfter=function(d,m){return z(d)<this.startOf(m)},h.isBefore=function(d,m){return this.endOf(m)<z(d)},h.$g=function(d,m,p){return E.u(d)?this[m]:this.set(p,d)},h.unix=function(){return Math.floor(this.valueOf()/1e3)},h.valueOf=function(){return this.$d.getTime()},h.startOf=function(d,m){var p=this,y=!!E.u(m)||m,x=E.p(d),I=function(pt,se){var He=E.w(p.$u?Date.UTC(p.$y,se,pt):new Date(p.$y,se,pt),p);return y?He:He.endOf(c)},Q=function(pt,se){return E.w(p.toDate()[pt].apply(p.toDate("s"),(y?[0,0,0,0]:[23,59,59,999]).slice(se)),p)},V=this.$W,X=this.$M,xe=this.$D,Ot="set"+(this.$u?"UTC":"");switch(x){case M:return y?I(1,0):I(31,11);case w:return y?I(1,X):I(0,X+1);case g:var dt=this.$locale().weekStart||0,tr=(V<dt?V+7:V)-dt;return I(y?xe-tr:xe+(6-tr),X);case c:case re:return Q(Ot+"Hours",0);case a:return Q(Ot+"Minutes",1);case s:return Q(Ot+"Seconds",2);case n:return Q(Ot+"Milliseconds",3);default:return this.clone()}},h.endOf=function(d){return this.startOf(d,!1)},h.$set=function(d,m){var p,y=E.p(d),x="set"+(this.$u?"UTC":""),I=(p={},p[c]=x+"Date",p[re]=x+"Date",p[w]=x+"Month",p[M]=x+"FullYear",p[a]=x+"Hours",p[s]=x+"Minutes",p[n]=x+"Seconds",p[o]=x+"Milliseconds",p)[y],Q=y===c?this.$D+(m-this.$W):m;if(y===w||y===M){var V=this.clone().set(re,1);V.$d[I](Q),V.init(),this.$d=V.set(re,Math.min(this.$D,V.daysInMonth())).$d}else I&&this.$d[I](Q);return this.init(),this},h.set=function(d,m){return this.clone().$set(d,m)},h.get=function(d){return this[E.p(d)]()},h.add=function(d,m){var p,y=this;d=Number(d);var x=E.p(m),I=function(X){var xe=z(y);return E.w(xe.date(xe.date()+Math.round(X*d)),y)};if(x===w)return this.set(w,this.$M+d);if(x===M)return this.set(M,this.$y+d);if(x===c)return I(1);if(x===g)return I(7);var Q=(p={},p[s]=e,p[a]=r,p[n]=t,p)[x]||1,V=this.$d.getTime()+d*Q;return E.w(V,this)},h.subtract=function(d,m){return this.add(-1*d,m)},h.format=function(d){var m=this,p=this.$locale();if(!this.isValid())return p.invalidDate||f;var y=d||"YYYY-MM-DDTHH:mm:ssZ",x=E.z(this),I=this.$H,Q=this.$m,V=this.$M,X=p.weekdays,xe=p.months,Ot=p.meridiem,dt=function(se,He,rr,gr){return se&&(se[He]||se(m,y))||rr[He].slice(0,gr)},tr=function(se){return E.s(I%12||12,se,"0")},pt=Ot||function(se,He,rr){var gr=se<12?"AM":"PM";return rr?gr.toLowerCase():gr};return y.replace(ut,(function(se,He){return He||(function(rr){switch(rr){case"YY":return String(m.$y).slice(-2);case"YYYY":return E.s(m.$y,4,"0");case"M":return V+1;case"MM":return E.s(V+1,2,"0");case"MMM":return dt(p.monthsShort,V,xe,3);case"MMMM":return dt(xe,V);case"D":return m.$D;case"DD":return E.s(m.$D,2,"0");case"d":return String(m.$W);case"dd":return dt(p.weekdaysMin,m.$W,X,2);case"ddd":return dt(p.weekdaysShort,m.$W,X,3);case"dddd":return X[m.$W];case"H":return String(I);case"HH":return E.s(I,2,"0");case"h":return tr(1);case"hh":return tr(2);case"a":return pt(I,Q,!0);case"A":return pt(I,Q,!1);case"m":return String(Q);case"mm":return E.s(Q,2,"0");case"s":return String(m.$s);case"ss":return E.s(m.$s,2,"0");case"SSS":return E.s(m.$ms,3,"0");case"Z":return x}return null})(se)||x.replace(":","")}))},h.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},h.diff=function(d,m,p){var y,x=this,I=E.p(m),Q=z(d),V=(Q.utcOffset()-this.utcOffset())*e,X=this-Q,xe=function(){return E.m(x,Q)};switch(I){case M:y=xe()/12;break;case w:y=xe();break;case te:y=xe()/3;break;case g:y=(X-V)/6048e5;break;case c:y=(X-V)/864e5;break;case a:y=X/r;break;case s:y=X/e;break;case n:y=X/t;break;default:y=X}return p?y:E.a(y)},h.daysInMonth=function(){return this.endOf(w).$D},h.$locale=function(){return De[this.$L]},h.locale=function(d,m){if(!d)return this.$L;var p=this.clone(),y=Ge(d,m,!0);return y&&(p.$L=y),p},h.clone=function(){return E.w(this.$d,this)},h.toDate=function(){return new Date(this.valueOf())},h.toJSON=function(){return this.isValid()?this.toISOString():null},h.toISOString=function(){return this.$d.toISOString()},h.toString=function(){return this.$d.toUTCString()},N})(),Ro=wr.prototype;return z.prototype=Ro,[["$ms",o],["$s",n],["$m",s],["$H",a],["$W",c],["$M",w],["$y",M],["$D",re]].forEach((function(N){Ro[N[1]]=function(h){return this.$g(h,N[0],N[1])}})),z.extend=function(N,h){return N.$i||(N(h,wr,z),N.$i=!0),z},z.locale=Ge,z.isDayjs=er,z.unix=function(N){return z(1e3*N)},z.en=De[Qe],z.Ls=De,z.p={},z}))});var Bo=Io((Ei,Ai)=>{"use strict";(function(t,e){typeof Ei=="object"&&typeof Ai<"u"?Ai.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_utc=e()})(Ei,(function(){"use strict";var t="minute",e=/[+-]\d\d(?::?\d\d)?/g,r=/([+-]|\d\d)/g;return function(o,n,s){var a=n.prototype;s.utc=function(f){var Y={date:f,utc:!0,args:arguments};return new n(Y)},a.utc=function(f){var Y=s(this.toDate(),{locale:this.$L,utc:!0});return f?Y.add(this.utcOffset(),t):Y},a.local=function(){return s(this.toDate(),{locale:this.$L,utc:!1})};var c=a.parse;a.parse=function(f){f.utc&&(this.$u=!0),this.$utils().u(f.$offset)||(this.$offset=f.$offset),c.call(this,f)};var g=a.init;a.init=function(){if(this.$u){var f=this.$d;this.$y=f.getUTCFullYear(),this.$M=f.getUTCMonth(),this.$D=f.getUTCDate(),this.$W=f.getUTCDay(),this.$H=f.getUTCHours(),this.$m=f.getUTCMinutes(),this.$s=f.getUTCSeconds(),this.$ms=f.getUTCMilliseconds()}else g.call(this)};var w=a.utcOffset;a.utcOffset=function(f,Y){var ut=this.$utils().u;if(ut(f))return this.$u?0:ut(this.$offset)?w.call(this):this.$offset;if(typeof f=="string"&&(f=(function(Qe){Qe===void 0&&(Qe="");var De=Qe.match(e);if(!De)return null;var gt=(""+De[0]).match(r)||["-",0,0],er=gt[0],Ge=60*+gt[1]+ +gt[2];return Ge===0?0:er==="+"?Ge:-Ge})(f),f===null))return this;var Ke=Math.abs(f)<=16?60*f:f;if(Ke===0)return this.utc(Y);var ye=this.clone();if(Y)return ye.$offset=Ke,ye.$u=!1,ye;var xr=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(ye=this.local().add(Ke+xr,t)).$offset=Ke,ye.$x.$localOffset=xr,ye};var te=a.format;a.format=function(f){var Y=f||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return te.call(this,Y)},a.valueOf=function(){var f=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*f},a.isUTC=function(){return!!this.$u},a.toISOString=function(){return this.toDate().toISOString()},a.toString=function(){return this.toDate().toUTCString()};var M=a.toDate;a.toDate=function(f){return f==="s"&&this.$offset?s(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():M.call(this)};var re=a.diff;a.diff=function(f,Y,ut){if(f&&this.$u===f.$u)return re.call(this,f,Y,ut);var Ke=this.local(),ye=s(f).local();return re.call(Ke,ye,Y,ut)}}}))});var Di=Lo(qo(),1),Mo=Lo(Bo(),1);Di.default.extend(Mo.default);var Yn={};function Po(t){return Yn[t]??=(0,Di.default)(0).utc().format(t)}var Qo="",$o=0,Fo=!1,Us="[]",Ri="{}",Js=Ri;function pe(t){return typeof t>"u"||t===void 0}function L(t){return typeof t=="string"}function Ye(t){return typeof t=="number"}function ht(t){return typeof t=="boolean"}function vt(t){return t===null}function zo(t){return t instanceof Date}function bt(t){return typeof t=="bigint"}function q(t){return typeof t=="function"}function K(t){return typeof t=="object"&&t!==null}function i(t){return Object.freeze(t)}function ir(t){return Z(t)?t:[t]}function Z(t){return Array.isArray(t)}function ie(t){return t}var v=i({is(t){return t.kind==="AlterTableNode"},create(t){return i({kind:"AlterTableNode",table:t})},cloneWithTableProps(t,e){return i({...t,...e})},cloneWithColumnAlteration(t,e){return i({...t,columnAlterations:t.columnAlterations?[...t.columnAlterations,e]:[e]})}});var l=i({is(t){return t.kind==="IdentifierNode"},create(t){return i({kind:"IdentifierNode",name:t})}});var ve=i({is(t){return t.kind==="CreateIndexNode"},create(t){return i({kind:"CreateIndexNode",name:l.create(t)})},cloneWith(t,e){return i({...t,...e})},cloneWithColumns(t,e){return i({...t,columns:[...t.columns||[],...e]})}});var Or=i({is(t){return t.kind==="CreateSchemaNode"},create(t,e){return i({kind:"CreateSchemaNode",schema:l.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var Vo=["preserve rows","delete rows","drop"],_=i({is(t){return t.kind==="CreateTableNode"},create(t){return i({kind:"CreateTableNode",table:t,columns:i([])})},cloneWithColumn(t,e){return i({...t,columns:i([...t.columns,e])})},cloneWithConstraint(t,e){return i({...t,constraints:t.constraints?i([...t.constraints,e]):i([e])})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):i([e])})},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):i([e])})},cloneWith(t,e){return i({...t,...e})}});var ee=i({is(t){return t.kind==="SchemableIdentifierNode"},create(t){return i({kind:"SchemableIdentifierNode",identifier:l.create(t)})},createWithSchema(t,e){return i({kind:"SchemableIdentifierNode",schema:l.create(t),identifier:l.create(e)})}});var Xe=i({is(t){return t.kind==="DropIndexNode"},create(t,e){return i({kind:"DropIndexNode",name:ee.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var or=i({is(t){return t.kind==="DropSchemaNode"},create(t,e){return i({kind:"DropSchemaNode",schema:l.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var nr=i({is(t){return t.kind==="DropTableNode"},create(t,e){return i({kind:"DropTableNode",table:t,...e})},cloneWith(t,e){return i({...t,...e})}});var U=i({is(t){return t.kind==="AliasNode"},create(t,e){return i({kind:"AliasNode",node:t,alias:e})}});var ae=i({is(t){return t.kind==="TableNode"},create(t){return i({kind:"TableNode",table:ee.create(t)})},createWithSchema(t,e){return i({kind:"TableNode",table:ee.createWithSchema(t,e)})}});function D(t){return K(t)&&q(t.toOperationNode)}function vr(t){return K(t)&&"expressionType"in t&&D(t)}function Uo(t){return K(t)&&"expression"in t&&L(t.alias)&&D(t)}var Re=i({is(t){return t.kind==="SelectModifierNode"},create(t,e){return i({kind:"SelectModifierNode",modifier:t,of:e})},createWithExpression(t){return i({kind:"SelectModifierNode",rawModifier:t})}});var ue=i({is(t){return t.kind==="AndNode"},create(t,e){return i({kind:"AndNode",left:t,right:e})}});var be=i({is(t){return t.kind==="OrNode"},create(t,e){return i({kind:"OrNode",left:t,right:e})}});var br=i({is(t){return t.kind==="OnNode"},create(t){return i({kind:"OnNode",on:t})},cloneWithOperation(t,e,r){return i({...t,on:e==="And"?ue.create(t.on,r):be.create(t.on,r)})}});var Ce=i({is(t){return t.kind==="JoinNode"},create(t,e){return i({kind:"JoinNode",joinType:t,table:e,on:void 0})},createWithOn(t,e,r){return i({kind:"JoinNode",joinType:t,table:e,on:br.create(r)})},cloneWithOn(t,e){return i({...t,on:t.on?br.cloneWithOperation(t.on,"And",e):br.create(e)})}});var Ze=i({is(t){return t.kind==="BinaryOperationNode"},create(t,e,r){return i({kind:"BinaryOperationNode",leftOperand:t,operator:e,rightOperand:r})}});var Xn=["=","==","!=","<>",">",">=","<","<=","in","not in","is","is not","like","not like","match","ilike","not ilike","@>","<@","^@","&&","?","?&","?|","!<","!>","<=>","!~","~","~*","!~*","@@","@@@","!!","<->","regexp","is distinct from","is not distinct from"],Zn=["+","-","*","/","%","^","&","|","#","<<",">>"],Jo=["->","->>"],_n=[...Xn,...Zn,"&&","||"],es=["exists","not exists"],ts=["not","-",...es],jo=[..._n,...Jo,...ts,"between","between symmetric"],he=i({is(t){return t.kind==="OperatorNode"},create(t){return i({kind:"OperatorNode",operator:t})}});function Ii(t){return L(t)&&Jo.includes(t)}var O=i({is(t){return t.kind==="ColumnNode"},create(t){return i({kind:"ColumnNode",column:l.create(t)})}});var Ct=i({is(t){return t.kind==="SelectAllNode"},create(){return i({kind:"SelectAllNode"})}});var Wt=i({is(t){return t.kind==="ReferenceNode"},create(t,e){return i({kind:"ReferenceNode",table:e,column:t})},createSelectAll(t){return i({kind:"ReferenceNode",table:t,column:Ct.create()})}});var Cr=class{#e;get dynamicReference(){return this.#e}get refType(){}constructor(e){this.#e=e}toOperationNode(){return Li(this.#e)}};function Wr(t){return K(t)&&D(t)&&L(t.dynamicReference)}var We=i({is(t){return t.kind==="OrderByItemNode"},create(t,e){return i({kind:"OrderByItemNode",orderBy:t,direction:e})},cloneWith(t,e){return i({...t,...e})}});var T=i({is(t){return t.kind==="RawNode"},create(t,e){return i({kind:"RawNode",sqlFragments:i(t),parameters:i(e)})},createWithSql(t){return T.create([t],[])},createWithChild(t){return T.create(["",""],[t])},createWithChildren(t){return T.create(new Array(t.length+1).fill(""),t)}});var Ko=i({is(t){return t.kind==="CollateNode"},create(t){return i({kind:"CollateNode",collation:l.create(t)})}});var Sr=class t{#e;constructor(e){this.#e=i(e)}desc(){return new t({node:We.cloneWith(this.#e.node,{direction:T.createWithSql("desc")})})}asc(){return new t({node:We.cloneWith(this.#e.node,{direction:T.createWithSql("asc")})})}nullsLast(){return new t({node:We.cloneWith(this.#e.node,{nulls:"last"})})}nullsFirst(){return new t({node:We.cloneWith(this.#e.node,{nulls:"first"})})}collate(e){return new t({node:We.cloneWith(this.#e.node,{collation:Ko.create(e)})})}toOperationNode(){return this.#e.node}};var Go=new Set;function Ie(t){Go.has(t)||(Go.add(t),console.log(t))}function Bi(t){return t==="asc"||t==="desc"}function me(t){if(t.length===2)return[qi(t[0],t[1])];if(t.length===1){let[e]=t;return Array.isArray(e)?(Ie("orderBy(array) is deprecated, use multiple orderBy calls instead."),e.map(r=>qi(r))):[qi(e)]}throw new Error(`Invalid number of arguments at order by! expected 1-2, received ${t.length}`)}function qi(t,e){let r=rs(t);if(We.is(r)){if(e)throw new Error("Cannot specify direction twice!");return r}return Ho(r,e)}function rs(t){if($e(t))return de(t);if(Wr(t))return t.toOperationNode();let[e,r]=t.split(" ");return r?(Ie("`orderBy('column asc')` is deprecated. Use `orderBy('column', 'asc')` instead."),Ho(ce(e),r)):ce(t)}function Ho(t,e){if(typeof e=="string"){if(!Bi(e))throw new Error(`Invalid order by direction: ${e}`);return We.create(t,T.createWithSql(e))}if(vr(e))return Ie("`orderBy(..., expr)` is deprecated. Use `orderBy(..., 'asc')` or `orderBy(..., (ob) => ...)` instead."),We.create(t,e.toOperationNode());let r=We.create(t);return e?e(new Sr({node:r})).toOperationNode():r}var St=i({is(t){return t.kind==="JSONReferenceNode"},create(t,e){return i({kind:"JSONReferenceNode",reference:t,traversal:e})},cloneWithTraversal(t,e){return i({...t,traversal:e})}});var Tr=i({is(t){return t.kind==="JSONOperatorChainNode"},create(t){return i({kind:"JSONOperatorChainNode",operator:t,values:i([])})},cloneWithValue(t,e){return i({...t,values:i([...t.values,e])})}});var _e=i({is(t){return t.kind==="JSONPathNode"},create(t){return i({kind:"JSONPathNode",inOperator:t,pathLegs:i([])})},cloneWithLeg(t,e){return i({...t,pathLegs:i([...t.pathLegs,e])})}});function Li(t){return L(t)?ce(t):t.toOperationNode()}function Fe(t){return Z(t)?t.map(e=>G(e)):[G(t)]}function G(t){return $e(t)?de(t):Li(t)}function Yo(t,e){let r=ce(t);if(Ii(e))return St.create(r,Tr.create(he.create(e)));let o=e.slice(0,-1);if(Ii(o))return St.create(r,_e.create(he.create(o)));throw new Error(`Invalid JSON operator: ${e}`)}function ce(t){if(!t.includes("."))return Wt.create(O.create(t));let r=t.split(".").map(Pi);if(r.length===3)return is(r);if(r.length===2)return os(r);throw new Error(`invalid column reference ${t}`)}function Xo(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(Pi);return U.create(ce(r),l.create(o))}else return ce(t)}function Mi(t){return O.create(t)}function Tt(t){if(t.includes(" ")){let[r,o]=t.split(" ").map(Pi);if(!Bi(o))throw new Error(`invalid order direction "${o}" next to "${r}"`);return me([r,o])[0]}else return Mi(t)}function is(t){let[e,r,o]=t;return Wt.create(O.create(o),ae.createWithSchema(e,r))}function os(t){let[e,r]=t;return Wt.create(O.create(r),ae.create(e))}function Pi(t){return t.trim()}var kr=i({is(t){return t.kind==="PrimitiveValueListNode"},create(t){return i({kind:"PrimitiveValueListNode",values:i([...t])})}});var Le=i({is(t){return t.kind==="ValueListNode"},create(t){return i({kind:"ValueListNode",values:i(t)})}});var P=i({is(t){return t.kind==="ValueNode"},create(t){return i({kind:"ValueNode",value:t})},createImmediate(t){return i({kind:"ValueNode",value:t,immediate:!0})}});function Zo(t){return Z(t)?ns(t):k(t)}function k(t){return $e(t)?de(t):P.create(t)}function Er(t){return Ye(t)||ht(t)||vt(t)}function sr(t){if(!Er(t))throw new Error(`unsafe immediate value ${JSON.stringify(t)}`);return P.createImmediate(t)}function ns(t){return t.some($e)?Le.create(t.map(e=>k(e))):kr.create(t)}var le=i({is(t){return t.kind==="ParensNode"},create(t){return i({kind:"ParensNode",node:t})}});function A(t){if(t.length===3)return Ar(t[0],t[1],t[2]);if(t.length===1)return k(t[0]);throw new Error(`invalid arguments: ${JSON.stringify(t)}`)}function Ar(t,e,r){return ss(e)&&en(r)?Ze.create(G(t),Qi(e),P.createImmediate(r)):Ze.create(G(t),Qi(e),Zo(r))}function J(t,e,r){return Ze.create(G(t),Qi(e),G(r))}function $i(t,e){return kt(Object.entries(t).filter(([,r])=>!pe(r)).map(([r,o])=>Ar(r,en(o)?"is":"=",o)),e)}function kt(t,e,r=!0){let o=e==="and"?ue.create:be.create;if(t.length===0)return Ze.create(P.createImmediate(1),he.create("="),P.createImmediate(e==="and"?1:0));let n=_o(t[0]);for(let s=1;s<t.length;++s)n=o(n,_o(t[s]));return t.length>1&&r?le.create(n):n}function ss(t){return t==="is"||t==="is not"}function en(t){return vt(t)||ht(t)}function Qi(t){if(L(t)&&jo.includes(t))return he.create(t);if(D(t))return t.toOperationNode();throw new Error(`invalid operator ${JSON.stringify(t)}`)}function _o(t){return D(t)?t.toOperationNode():t}var ze=i({is(t){return t.kind==="OrderByNode"},create(t){return i({kind:"OrderByNode",items:i([...t])})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var Fi=i({is(t){return t.kind==="PartitionByNode"},create(t){return i({kind:"PartitionByNode",items:i(t)})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var ar=i({is(t){return t.kind==="OverNode"},create(){return i({kind:"OverNode"})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?ze.cloneWithItems(t.orderBy,e):ze.create(e)})},cloneWithPartitionByItems(t,e){return i({...t,partitionBy:t.partitionBy?Fi.cloneWithItems(t.partitionBy,e):Fi.create(e)})}});var ct=i({is(t){return t.kind==="FromNode"},create(t){return i({kind:"FromNode",froms:i(t)})},cloneWithFroms(t,e){return i({...t,froms:i([...t.froms,...e])})}});var zi=i({is(t){return t.kind==="GroupByNode"},create(t){return i({kind:"GroupByNode",items:i(t)})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var Vi=i({is(t){return t.kind==="HavingNode"},create(t){return i({kind:"HavingNode",having:t})},cloneWithOperation(t,e,r){return i({...t,having:e==="And"?ue.create(t.having,r):be.create(t.having,r)})}});var B=i({is(t){return t.kind==="InsertQueryNode"},create(t,e,r){return i({kind:"InsertQueryNode",into:t,...e&&{with:e},replace:r})},createWithoutInto(){return i({kind:"InsertQueryNode"})},cloneWith(t,e){return i({...t,...e})}});var Dr=i({is(t){return t.kind==="ListNode"},create(t){return i({kind:"ListNode",items:i(t)})}});var qe=i({is(t){return t.kind==="UpdateQueryNode"},create(t,e){return i({kind:"UpdateQueryNode",table:t.length===1?t[0]:Dr.create(t),...e&&{with:e}})},createWithoutTable(){return i({kind:"UpdateQueryNode"})},cloneWithFromItems(t,e){return i({...t,from:t.from?ct.cloneWithFroms(t.from,e):ct.create(e)})},cloneWithUpdates(t,e){return i({...t,updates:t.updates?i([...t.updates,...e]):e})},cloneWithLimit(t,e){return i({...t,limit:e})}});var ur=i({is(t){return t.kind==="UsingNode"},create(t){return i({kind:"UsingNode",tables:i(t)})},cloneWithTables(t,e){return i({...t,tables:i([...t.tables,...e])})}});var et=i({is(t){return t.kind==="DeleteQueryNode"},create(t,e){return i({kind:"DeleteQueryNode",from:ct.create(t),...e&&{with:e}})},cloneWithOrderByItems:(t,e)=>u.cloneWithOrderByItems(t,e),cloneWithoutOrderBy:t=>u.cloneWithoutOrderBy(t),cloneWithLimit(t,e){return i({...t,limit:e})},cloneWithoutLimit(t){return i({...t,limit:void 0})},cloneWithUsing(t,e){return i({...t,using:t.using!==void 0?ur.cloneWithTables(t.using,e):ur.create(e)})}});var H=i({is(t){return t.kind==="WhereNode"},create(t){return i({kind:"WhereNode",where:t})},cloneWithOperation(t,e,r){return i({...t,where:e==="And"?ue.create(t.where,r):be.create(t.where,r)})}});var Ui=i({is(t){return t.kind==="ReturningNode"},create(t){return i({kind:"ReturningNode",selections:i(t)})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})}});var tn=i({is(t){return t.kind==="ExplainNode"},create(t,e){return i({kind:"ExplainNode",format:t,options:e})}});var we=i({is(t){return t.kind==="WhenNode"},create(t){return i({kind:"WhenNode",condition:t})},cloneWithResult(t,e){return i({...t,result:e})}});var fe=i({is(t){return t.kind==="MergeQueryNode"},create(t,e){return i({kind:"MergeQueryNode",into:t,...e&&{with:e}})},cloneWithUsing(t,e){return i({...t,using:e})},cloneWithWhen(t,e){return i({...t,whens:t.whens?i([...t.whens,e]):i([e])})},cloneWithThen(t,e){return i({...t,whens:t.whens?i([...t.whens.slice(0,-1),we.cloneWithResult(t.whens[t.whens.length-1],e)]):void 0})}});var Ji=i({is(t){return t.kind==="OutputNode"},create(t){return i({kind:"OutputNode",selections:i(t)})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})}});var u=i({is(t){return S.is(t)||B.is(t)||qe.is(t)||et.is(t)||fe.is(t)},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):i([e])})},cloneWithWhere(t,e){return i({...t,where:t.where?H.cloneWithOperation(t.where,"And",e):H.create(e)})},cloneWithJoin(t,e){return i({...t,joins:t.joins?i([...t.joins,e]):i([e])})},cloneWithReturning(t,e){return i({...t,returning:t.returning?Ui.cloneWithSelections(t.returning,e):Ui.create(e)})},cloneWithoutReturning(t){return i({...t,returning:void 0})},cloneWithoutWhere(t){return i({...t,where:void 0})},cloneWithExplain(t,e,r){return i({...t,explain:tn.create(e,r?.toOperationNode())})},cloneWithTop(t,e){return i({...t,top:e})},cloneWithOutput(t,e){return i({...t,output:t.output?Ji.cloneWithSelections(t.output,e):Ji.create(e)})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?ze.cloneWithItems(t.orderBy,e):ze.create(e)})},cloneWithoutOrderBy(t){return i({...t,orderBy:void 0})}});var S=i({is(t){return t.kind==="SelectQueryNode"},create(t){return i({kind:"SelectQueryNode",...t&&{with:t}})},createFrom(t,e){return i({kind:"SelectQueryNode",from:ct.create(t),...e&&{with:e}})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})},cloneWithDistinctOn(t,e){return i({...t,distinctOn:t.distinctOn?i([...t.distinctOn,...e]):i(e)})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):i([e])})},cloneWithOrderByItems:(t,e)=>u.cloneWithOrderByItems(t,e),cloneWithGroupByItems(t,e){return i({...t,groupBy:t.groupBy?zi.cloneWithItems(t.groupBy,e):zi.create(e)})},cloneWithLimit(t,e){return i({...t,limit:e})},cloneWithOffset(t,e){return i({...t,offset:e})},cloneWithFetch(t,e){return i({...t,fetch:e})},cloneWithHaving(t,e){return i({...t,having:t.having?Vi.cloneWithOperation(t.having,"And",e):Vi.create(e)})},cloneWithSetOperations(t,e){return i({...t,setOperations:t.setOperations?i([...t.setOperations,...e]):i([...e])})},cloneWithoutSelections(t){return i({...t,selections:[]})},cloneWithoutLimit(t){return i({...t,limit:void 0})},cloneWithoutOffset(t){return i({...t,offset:void 0})},cloneWithoutOrderBy:t=>u.cloneWithoutOrderBy(t),cloneWithoutGroupBy(t){return i({...t,groupBy:void 0})}});var Rr=class t{#e;constructor(e){this.#e=i(e)}on(...e){return new t({...this.#e,joinNode:Ce.cloneWithOn(this.#e.joinNode,A(e))})}onRef(e,r,o){return new t({...this.#e,joinNode:Ce.cloneWithOn(this.#e.joinNode,J(e,r,o))})}onTrue(){return new t({...this.#e,joinNode:Ce.cloneWithOn(this.#e.joinNode,T.createWithSql("true"))})}$call(e){return e(this)}toOperationNode(){return this.#e.joinNode}};var rn=i({is(t){return t.kind==="PartitionByItemNode"},create(t){return i({kind:"PartitionByItemNode",partitionBy:t})}});function on(t){return Fe(t).map(rn.create)}var Ir=class t{#e;constructor(e){this.#e=i(e)}orderBy(...e){return new t({overNode:ar.cloneWithOrderByItems(this.#e.overNode,me(e))})}clearOrderBy(){return new t({overNode:u.cloneWithoutOrderBy(this.#e.overNode)})}partitionBy(e){return new t({overNode:ar.cloneWithPartitionByItems(this.#e.overNode,on(e))})}$call(e){return e(this)}toOperationNode(){return this.#e.overNode}};var Et=i({is(t){return t.kind==="SelectionNode"},create(t){return i({kind:"SelectionNode",selection:t})},createSelectAll(){return i({kind:"SelectionNode",selection:Ct.create()})},createSelectAllFromTable(t){return i({kind:"SelectionNode",selection:Wt.createSelectAll(t)})}});function $(t){return q(t)?$(t(oe())):Z(t)?t.map(e=>nn(e)):[nn(t)]}function nn(t){return L(t)?Et.create(Xo(t)):Wr(t)?Et.create(t.toOperationNode()):Et.create(Lr(t))}function j(t){return t?Array.isArray(t)?t.map(sn):[sn(t)]:[Et.createSelectAll()]}function sn(t){if(L(t))return Et.createSelectAllFromTable(b(t));throw new Error(`invalid value selectAll expression: ${JSON.stringify(t)}`)}var an=i({is(t){return t.kind==="ValuesNode"},create(t){return i({kind:"ValuesNode",values:i(t)})}});var un=i({is(t){return t.kind==="DefaultInsertValueNode"},create(){return i({kind:"DefaultInsertValueNode"})}});function qr(t){let e=q(t)?t(oe()):t,r=Z(e)?e:i([e]);return as(r)}function as(t){let e=us(t);return[i([...e.keys()].map(O.create)),an.create(t.map(r=>ds(r,e)))]}function us(t){let e=new Map;for(let r of t){let o=Object.keys(r);for(let n of o)!e.has(n)&&r[n]!==void 0&&e.set(n,e.size)}return e}function ds(t,e){let r=Object.keys(t),o=Array.from({length:e.size}),n=!1,s=r.length;for(let c of r){let g=e.get(c);if(pe(g)){s--;continue}let w=t[c];(pe(w)||$e(w))&&(n=!0),o[g]=w}if(s<e.size||n){let c=un.create();return Le.create(o.map(g=>pe(g)?c:k(g)))}return kr.create(o)}var ji=i({is(t){return t.kind==="ColumnUpdateNode"},create(t,e){return i({kind:"ColumnUpdateNode",column:t,value:e})}});function dn(...t){return t.length===2?[ji.create(G(t[0]),k(t[1]))]:dr(t[0])}function dr(t){let e=q(t)?t(oe()):t;return Object.entries(e).filter(([r,o])=>o!==void 0).map(([r,o])=>ji.create(O.create(r),k(o)))}var pn=i({is(t){return t.kind==="OnDuplicateKeyNode"},create(t){return i({kind:"OnDuplicateKeyNode",updates:t})}});var Br=class{insertId;numInsertedOrUpdatedRows;constructor(e,r){this.insertId=e,this.numInsertedOrUpdatedRows=r}};var ge=class extends Error{node;constructor(e){super("no result"),this.node=e}};function Be(t){return Object.prototype.hasOwnProperty.call(t,"prototype")}var ne=i({is(t){return t.kind==="OnConflictNode"},create(){return i({kind:"OnConflictNode"})},cloneWith(t,e){return i({...t,...e})},cloneWithIndexWhere(t,e){return i({...t,indexWhere:t.indexWhere?H.cloneWithOperation(t.indexWhere,"And",e):H.create(e)})},cloneWithIndexOrWhere(t,e){return i({...t,indexWhere:t.indexWhere?H.cloneWithOperation(t.indexWhere,"Or",e):H.create(e)})},cloneWithUpdateWhere(t,e){return i({...t,updateWhere:t.updateWhere?H.cloneWithOperation(t.updateWhere,"And",e):H.create(e)})},cloneWithUpdateOrWhere(t,e){return i({...t,updateWhere:t.updateWhere?H.cloneWithOperation(t.updateWhere,"Or",e):H.create(e)})},cloneWithoutIndexWhere(t){return i({...t,indexWhere:void 0})},cloneWithoutUpdateWhere(t){return i({...t,updateWhere:void 0})}});var Mr=class t{#e;constructor(e){this.#e=i(e)}column(e){let r=O.create(e);return new t({...this.#e,onConflictNode:ne.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?i([...this.#e.onConflictNode.columns,r]):i([r])})})}columns(e){let r=e.map(O.create);return new t({...this.#e,onConflictNode:ne.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?i([...this.#e.onConflictNode.columns,...r]):i(r)})})}constraint(e){return new t({...this.#e,onConflictNode:ne.cloneWith(this.#e.onConflictNode,{constraint:l.create(e)})})}expression(e){return new t({...this.#e,onConflictNode:ne.cloneWith(this.#e.onConflictNode,{indexExpression:e.toOperationNode()})})}where(...e){return new t({...this.#e,onConflictNode:ne.cloneWithIndexWhere(this.#e.onConflictNode,A(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:ne.cloneWithIndexWhere(this.#e.onConflictNode,J(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:ne.cloneWithoutIndexWhere(this.#e.onConflictNode)})}doNothing(){return new Ki({...this.#e,onConflictNode:ne.cloneWith(this.#e.onConflictNode,{doNothing:!0})})}doUpdateSet(e){return new Gi({...this.#e,onConflictNode:ne.cloneWith(this.#e.onConflictNode,{updates:dr(e)})})}$call(e){return e(this)}},Ki=class{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.onConflictNode}},Gi=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,onConflictNode:ne.cloneWithUpdateWhere(this.#e.onConflictNode,A(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:ne.cloneWithUpdateWhere(this.#e.onConflictNode,J(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:ne.cloneWithoutUpdateWhere(this.#e.onConflictNode)})}$call(e){return e(this)}toOperationNode(){return this.#e.onConflictNode}};var hn=i({is(t){return t.kind==="TopNode"},create(t,e){return i({kind:"TopNode",expression:t,modifiers:e})}});function Se(t,e){if(!Ye(t)&&!bt(t))throw new Error(`Invalid top expression: ${t}`);if(!pe(e)&&!ps(e))throw new Error(`Invalid top modifiers: ${e}`);return hn.create(t,e)}function ps(t){return t==="percent"||t==="with ties"||t==="percent with ties"}var mt=i({is(t){return t.kind==="OrActionNode"},create(t){return i({kind:"OrActionNode",action:t})}});var pr=class t{#e;constructor(e){this.#e=i(e)}values(e){let[r,o]=qr(e);return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{columns:r,values:o})})}columns(e){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{columns:i(e.map(O.create))})})}expression(e){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{values:de(e)})})}defaultValues(){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{defaultValues:!0})})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}ignore(){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{orAction:mt.create("ignore")})})}orIgnore(){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{orAction:mt.create("ignore")})})}orAbort(){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{orAction:mt.create("abort")})})}orFail(){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{orAction:mt.create("fail")})})}orReplace(){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{orAction:mt.create("replace")})})}orRollback(){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{orAction:mt.create("rollback")})})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,Se(e,r))})}onConflict(e){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{onConflict:e(new Mr({onConflictNode:ne.create()})).toOperationNode()})})}onDuplicateKeyUpdate(e){return new t({...this.#e,queryNode:B.cloneWith(this.#e.queryNode,{onDuplicateKey:pn.create(dr(e))})})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,$(e))})}returningAll(){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,j())})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,$(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,j(e))})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new Br(r.insertId,r.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ge){let r=await this.executeTakeFirst();if(r===void 0)throw Be(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var Pr=class{numDeletedRows;constructor(e){this.numDeletedRows=e}};var At=i({is(t){return t.kind==="LimitNode"},create(t){return i({kind:"LimitNode",limit:t})}});var Qr=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,A(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,J(e,r,o))})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,Se(e,r))})}using(e){return new t({...this.#e,queryNode:et.cloneWithUsing(this.#e.queryNode,Te(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,tt(e,r))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,$(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,j(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,$(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,j(e))})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}clearLimit(){return new t({...this.#e,queryNode:et.cloneWithoutLimit(this.#e.queryNode)})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,me(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:et.cloneWithLimit(this.#e.queryNode,At.create(k(e)))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new Pr(r.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ge){let r=await this.executeTakeFirst();if(r===void 0)throw Be(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var $r=class{numUpdatedRows;numChangedRows;constructor(e,r){this.numUpdatedRows=e,this.numChangedRows=r}};var Dt=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,A(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,J(e,r,o))})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,Se(e,r))})}from(e){return new t({...this.#e,queryNode:qe.cloneWithFromItems(this.#e.queryNode,Te(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,tt(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,me(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:qe.cloneWithLimit(this.#e.queryNode,At.create(k(e)))})}set(...e){return new t({...this.#e,queryNode:qe.cloneWithUpdates(this.#e.queryNode,dn(...e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,$(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,j(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,$(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,j(e))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new $r(r.numAffectedRows??BigInt(0),r.numChangedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ge){let r=await this.executeTakeFirst();if(r===void 0)throw Be(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var Hi=i({is(t){return t.kind==="CommonTableExpressionNameNode"},create(t,e){return i({kind:"CommonTableExpressionNameNode",table:ae.create(t),columns:e?i(e.map(O.create)):void 0})}});var Rt=i({is(t){return t.kind==="CommonTableExpressionNode"},create(t,e){return i({kind:"CommonTableExpressionNode",name:t,expression:e})},cloneWith(t,e){return i({...t,...e})}});var Fr=class t{#e;constructor(e){this.#e=i(e)}materialized(){return new t({...this.#e,node:Rt.cloneWith(this.#e.node,{materialized:!0})})}notMaterialized(){return new t({...this.#e,node:Rt.cloneWith(this.#e.node,{materialized:!1})})}toOperationNode(){return this.#e.node}};function Yi(t,e){let r=e(mn()).toOperationNode();return q(t)?t(hs(r)).toOperationNode():Rt.create(cn(t),r)}function hs(t){return e=>new Fr({node:Rt.create(cn(e),t)})}function cn(t){if(t.includes("(")){let e=t.split(/[\(\)]/),r=e[0],o=e[1].split(",").map(n=>n.trim());return Hi.create(r,o)}else return Hi.create(t)}var hr=i({is(t){return t.kind==="WithNode"},create(t,e){return i({kind:"WithNode",expressions:i([t]),...e})},cloneWithExpression(t,e){return i({...t,expressions:i([...t.expressions,e])})}});var ln=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"];function fn(t){let e="";for(let r=0;r<t;++r)e+=cs();return e}function cs(){return ln[~~(Math.random()*ln.length)]}function C(){return new Xi}var Xi=class{#e;get queryId(){return this.#e===void 0&&(this.#e=fn(8)),this.#e}};var rt=class{nodeStack=[];#e=i({AliasNode:this.transformAlias.bind(this),ColumnNode:this.transformColumn.bind(this),IdentifierNode:this.transformIdentifier.bind(this),SchemableIdentifierNode:this.transformSchemableIdentifier.bind(this),RawNode:this.transformRaw.bind(this),ReferenceNode:this.transformReference.bind(this),SelectQueryNode:this.transformSelectQuery.bind(this),SelectionNode:this.transformSelection.bind(this),TableNode:this.transformTable.bind(this),FromNode:this.transformFrom.bind(this),SelectAllNode:this.transformSelectAll.bind(this),AndNode:this.transformAnd.bind(this),OrNode:this.transformOr.bind(this),ValueNode:this.transformValue.bind(this),ValueListNode:this.transformValueList.bind(this),PrimitiveValueListNode:this.transformPrimitiveValueList.bind(this),ParensNode:this.transformParens.bind(this),JoinNode:this.transformJoin.bind(this),OperatorNode:this.transformOperator.bind(this),WhereNode:this.transformWhere.bind(this),InsertQueryNode:this.transformInsertQuery.bind(this),DeleteQueryNode:this.transformDeleteQuery.bind(this),ReturningNode:this.transformReturning.bind(this),CreateTableNode:this.transformCreateTable.bind(this),AddColumnNode:this.transformAddColumn.bind(this),ColumnDefinitionNode:this.transformColumnDefinition.bind(this),DropTableNode:this.transformDropTable.bind(this),DataTypeNode:this.transformDataType.bind(this),OrderByNode:this.transformOrderBy.bind(this),OrderByItemNode:this.transformOrderByItem.bind(this),GroupByNode:this.transformGroupBy.bind(this),GroupByItemNode:this.transformGroupByItem.bind(this),UpdateQueryNode:this.transformUpdateQuery.bind(this),ColumnUpdateNode:this.transformColumnUpdate.bind(this),LimitNode:this.transformLimit.bind(this),OffsetNode:this.transformOffset.bind(this),OnConflictNode:this.transformOnConflict.bind(this),OnDuplicateKeyNode:this.transformOnDuplicateKey.bind(this),CreateIndexNode:this.transformCreateIndex.bind(this),DropIndexNode:this.transformDropIndex.bind(this),ListNode:this.transformList.bind(this),PrimaryKeyConstraintNode:this.transformPrimaryKeyConstraint.bind(this),UniqueConstraintNode:this.transformUniqueConstraint.bind(this),ReferencesNode:this.transformReferences.bind(this),CheckConstraintNode:this.transformCheckConstraint.bind(this),WithNode:this.transformWith.bind(this),CommonTableExpressionNode:this.transformCommonTableExpression.bind(this),CommonTableExpressionNameNode:this.transformCommonTableExpressionName.bind(this),HavingNode:this.transformHaving.bind(this),CreateSchemaNode:this.transformCreateSchema.bind(this),DropSchemaNode:this.transformDropSchema.bind(this),AlterTableNode:this.transformAlterTable.bind(this),DropColumnNode:this.transformDropColumn.bind(this),RenameColumnNode:this.transformRenameColumn.bind(this),AlterColumnNode:this.transformAlterColumn.bind(this),ModifyColumnNode:this.transformModifyColumn.bind(this),AddConstraintNode:this.transformAddConstraint.bind(this),DropConstraintNode:this.transformDropConstraint.bind(this),RenameConstraintNode:this.transformRenameConstraint.bind(this),ForeignKeyConstraintNode:this.transformForeignKeyConstraint.bind(this),CreateViewNode:this.transformCreateView.bind(this),RefreshMaterializedViewNode:this.transformRefreshMaterializedView.bind(this),DropViewNode:this.transformDropView.bind(this),GeneratedNode:this.transformGenerated.bind(this),DefaultValueNode:this.transformDefaultValue.bind(this),OnNode:this.transformOn.bind(this),ValuesNode:this.transformValues.bind(this),SelectModifierNode:this.transformSelectModifier.bind(this),CreateTypeNode:this.transformCreateType.bind(this),DropTypeNode:this.transformDropType.bind(this),ExplainNode:this.transformExplain.bind(this),DefaultInsertValueNode:this.transformDefaultInsertValue.bind(this),AggregateFunctionNode:this.transformAggregateFunction.bind(this),OverNode:this.transformOver.bind(this),PartitionByNode:this.transformPartitionBy.bind(this),PartitionByItemNode:this.transformPartitionByItem.bind(this),SetOperationNode:this.transformSetOperation.bind(this),BinaryOperationNode:this.transformBinaryOperation.bind(this),UnaryOperationNode:this.transformUnaryOperation.bind(this),UsingNode:this.transformUsing.bind(this),FunctionNode:this.transformFunction.bind(this),CaseNode:this.transformCase.bind(this),WhenNode:this.transformWhen.bind(this),JSONReferenceNode:this.transformJSONReference.bind(this),JSONPathNode:this.transformJSONPath.bind(this),JSONPathLegNode:this.transformJSONPathLeg.bind(this),JSONOperatorChainNode:this.transformJSONOperatorChain.bind(this),TupleNode:this.transformTuple.bind(this),MergeQueryNode:this.transformMergeQuery.bind(this),MatchedNode:this.transformMatched.bind(this),AddIndexNode:this.transformAddIndex.bind(this),CastNode:this.transformCast.bind(this),FetchNode:this.transformFetch.bind(this),TopNode:this.transformTop.bind(this),OutputNode:this.transformOutput.bind(this),OrActionNode:this.transformOrAction.bind(this),CollateNode:this.transformCollate.bind(this)});transformNode(e,r){if(!e)return e;this.nodeStack.push(e);let o=this.transformNodeImpl(e,r);return this.nodeStack.pop(),i(o)}transformNodeImpl(e,r){return this.#e[e.kind](e,r)}transformNodeList(e,r){return e&&i(e.map(o=>this.transformNode(o,r)))}transformSelectQuery(e,r){return{kind:"SelectQueryNode",from:this.transformNode(e.from,r),selections:this.transformNodeList(e.selections,r),distinctOn:this.transformNodeList(e.distinctOn,r),joins:this.transformNodeList(e.joins,r),groupBy:this.transformNode(e.groupBy,r),orderBy:this.transformNode(e.orderBy,r),where:this.transformNode(e.where,r),frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),limit:this.transformNode(e.limit,r),offset:this.transformNode(e.offset,r),with:this.transformNode(e.with,r),having:this.transformNode(e.having,r),explain:this.transformNode(e.explain,r),setOperations:this.transformNodeList(e.setOperations,r),fetch:this.transformNode(e.fetch,r),top:this.transformNode(e.top,r)}}transformSelection(e,r){return{kind:"SelectionNode",selection:this.transformNode(e.selection,r)}}transformColumn(e,r){return{kind:"ColumnNode",column:this.transformNode(e.column,r)}}transformAlias(e,r){return{kind:"AliasNode",node:this.transformNode(e.node,r),alias:this.transformNode(e.alias,r)}}transformTable(e,r){return{kind:"TableNode",table:this.transformNode(e.table,r)}}transformFrom(e,r){return{kind:"FromNode",froms:this.transformNodeList(e.froms,r)}}transformReference(e,r){return{kind:"ReferenceNode",column:this.transformNode(e.column,r),table:this.transformNode(e.table,r)}}transformAnd(e,r){return{kind:"AndNode",left:this.transformNode(e.left,r),right:this.transformNode(e.right,r)}}transformOr(e,r){return{kind:"OrNode",left:this.transformNode(e.left,r),right:this.transformNode(e.right,r)}}transformValueList(e,r){return{kind:"ValueListNode",values:this.transformNodeList(e.values,r)}}transformParens(e,r){return{kind:"ParensNode",node:this.transformNode(e.node,r)}}transformJoin(e,r){return{kind:"JoinNode",joinType:e.joinType,table:this.transformNode(e.table,r),on:this.transformNode(e.on,r)}}transformRaw(e,r){return{kind:"RawNode",sqlFragments:i([...e.sqlFragments]),parameters:this.transformNodeList(e.parameters,r)}}transformWhere(e,r){return{kind:"WhereNode",where:this.transformNode(e.where,r)}}transformInsertQuery(e,r){return{kind:"InsertQueryNode",into:this.transformNode(e.into,r),columns:this.transformNodeList(e.columns,r),values:this.transformNode(e.values,r),returning:this.transformNode(e.returning,r),onConflict:this.transformNode(e.onConflict,r),onDuplicateKey:this.transformNode(e.onDuplicateKey,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),ignore:e.ignore,orAction:this.transformNode(e.orAction,r),replace:e.replace,explain:this.transformNode(e.explain,r),defaultValues:e.defaultValues,top:this.transformNode(e.top,r),output:this.transformNode(e.output,r)}}transformValues(e,r){return{kind:"ValuesNode",values:this.transformNodeList(e.values,r)}}transformDeleteQuery(e,r){return{kind:"DeleteQueryNode",from:this.transformNode(e.from,r),using:this.transformNode(e.using,r),joins:this.transformNodeList(e.joins,r),where:this.transformNode(e.where,r),returning:this.transformNode(e.returning,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),orderBy:this.transformNode(e.orderBy,r),limit:this.transformNode(e.limit,r),explain:this.transformNode(e.explain,r),top:this.transformNode(e.top,r),output:this.transformNode(e.output,r)}}transformReturning(e,r){return{kind:"ReturningNode",selections:this.transformNodeList(e.selections,r)}}transformCreateTable(e,r){return{kind:"CreateTableNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),constraints:this.transformNodeList(e.constraints,r),temporary:e.temporary,ifNotExists:e.ifNotExists,onCommit:e.onCommit,frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),selectQuery:this.transformNode(e.selectQuery,r)}}transformColumnDefinition(e,r){return{kind:"ColumnDefinitionNode",column:this.transformNode(e.column,r),dataType:this.transformNode(e.dataType,r),references:this.transformNode(e.references,r),primaryKey:e.primaryKey,autoIncrement:e.autoIncrement,unique:e.unique,notNull:e.notNull,unsigned:e.unsigned,defaultTo:this.transformNode(e.defaultTo,r),check:this.transformNode(e.check,r),generated:this.transformNode(e.generated,r),frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),nullsNotDistinct:e.nullsNotDistinct,identity:e.identity,ifNotExists:e.ifNotExists}}transformAddColumn(e,r){return{kind:"AddColumnNode",column:this.transformNode(e.column,r)}}transformDropTable(e,r){return{kind:"DropTableNode",table:this.transformNode(e.table,r),ifExists:e.ifExists,cascade:e.cascade}}transformOrderBy(e,r){return{kind:"OrderByNode",items:this.transformNodeList(e.items,r)}}transformOrderByItem(e,r){return{kind:"OrderByItemNode",orderBy:this.transformNode(e.orderBy,r),direction:this.transformNode(e.direction,r),collation:this.transformNode(e.collation,r),nulls:e.nulls}}transformGroupBy(e,r){return{kind:"GroupByNode",items:this.transformNodeList(e.items,r)}}transformGroupByItem(e,r){return{kind:"GroupByItemNode",groupBy:this.transformNode(e.groupBy,r)}}transformUpdateQuery(e,r){return{kind:"UpdateQueryNode",table:this.transformNode(e.table,r),from:this.transformNode(e.from,r),joins:this.transformNodeList(e.joins,r),where:this.transformNode(e.where,r),updates:this.transformNodeList(e.updates,r),returning:this.transformNode(e.returning,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),explain:this.transformNode(e.explain,r),limit:this.transformNode(e.limit,r),top:this.transformNode(e.top,r),output:this.transformNode(e.output,r),orderBy:this.transformNode(e.orderBy,r)}}transformColumnUpdate(e,r){return{kind:"ColumnUpdateNode",column:this.transformNode(e.column,r),value:this.transformNode(e.value,r)}}transformLimit(e,r){return{kind:"LimitNode",limit:this.transformNode(e.limit,r)}}transformOffset(e,r){return{kind:"OffsetNode",offset:this.transformNode(e.offset,r)}}transformOnConflict(e,r){return{kind:"OnConflictNode",columns:this.transformNodeList(e.columns,r),constraint:this.transformNode(e.constraint,r),indexExpression:this.transformNode(e.indexExpression,r),indexWhere:this.transformNode(e.indexWhere,r),updates:this.transformNodeList(e.updates,r),updateWhere:this.transformNode(e.updateWhere,r),doNothing:e.doNothing}}transformOnDuplicateKey(e,r){return{kind:"OnDuplicateKeyNode",updates:this.transformNodeList(e.updates,r)}}transformCreateIndex(e,r){return{kind:"CreateIndexNode",name:this.transformNode(e.name,r),table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),unique:e.unique,using:this.transformNode(e.using,r),ifNotExists:e.ifNotExists,where:this.transformNode(e.where,r),nullsNotDistinct:e.nullsNotDistinct}}transformList(e,r){return{kind:"ListNode",items:this.transformNodeList(e.items,r)}}transformDropIndex(e,r){return{kind:"DropIndexNode",name:this.transformNode(e.name,r),table:this.transformNode(e.table,r),ifExists:e.ifExists,cascade:e.cascade}}transformPrimaryKeyConstraint(e,r){return{kind:"PrimaryKeyConstraintNode",columns:this.transformNodeList(e.columns,r),name:this.transformNode(e.name,r),deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformUniqueConstraint(e,r){return{kind:"UniqueConstraintNode",columns:this.transformNodeList(e.columns,r),name:this.transformNode(e.name,r),nullsNotDistinct:e.nullsNotDistinct,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformForeignKeyConstraint(e,r){return{kind:"ForeignKeyConstraintNode",columns:this.transformNodeList(e.columns,r),references:this.transformNode(e.references,r),name:this.transformNode(e.name,r),onDelete:e.onDelete,onUpdate:e.onUpdate,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformSetOperation(e,r){return{kind:"SetOperationNode",operator:e.operator,expression:this.transformNode(e.expression,r),all:e.all}}transformReferences(e,r){return{kind:"ReferencesNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),onDelete:e.onDelete,onUpdate:e.onUpdate}}transformCheckConstraint(e,r){return{kind:"CheckConstraintNode",expression:this.transformNode(e.expression,r),name:this.transformNode(e.name,r)}}transformWith(e,r){return{kind:"WithNode",expressions:this.transformNodeList(e.expressions,r),recursive:e.recursive}}transformCommonTableExpression(e,r){return{kind:"CommonTableExpressionNode",name:this.transformNode(e.name,r),materialized:e.materialized,expression:this.transformNode(e.expression,r)}}transformCommonTableExpressionName(e,r){return{kind:"CommonTableExpressionNameNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r)}}transformHaving(e,r){return{kind:"HavingNode",having:this.transformNode(e.having,r)}}transformCreateSchema(e,r){return{kind:"CreateSchemaNode",schema:this.transformNode(e.schema,r),ifNotExists:e.ifNotExists}}transformDropSchema(e,r){return{kind:"DropSchemaNode",schema:this.transformNode(e.schema,r),ifExists:e.ifExists,cascade:e.cascade}}transformAlterTable(e,r){return{kind:"AlterTableNode",table:this.transformNode(e.table,r),renameTo:this.transformNode(e.renameTo,r),setSchema:this.transformNode(e.setSchema,r),columnAlterations:this.transformNodeList(e.columnAlterations,r),addConstraint:this.transformNode(e.addConstraint,r),dropConstraint:this.transformNode(e.dropConstraint,r),renameConstraint:this.transformNode(e.renameConstraint,r),addIndex:this.transformNode(e.addIndex,r),dropIndex:this.transformNode(e.dropIndex,r)}}transformDropColumn(e,r){return{kind:"DropColumnNode",column:this.transformNode(e.column,r)}}transformRenameColumn(e,r){return{kind:"RenameColumnNode",column:this.transformNode(e.column,r),renameTo:this.transformNode(e.renameTo,r)}}transformAlterColumn(e,r){return{kind:"AlterColumnNode",column:this.transformNode(e.column,r),dataType:this.transformNode(e.dataType,r),dataTypeExpression:this.transformNode(e.dataTypeExpression,r),setDefault:this.transformNode(e.setDefault,r),dropDefault:e.dropDefault,setNotNull:e.setNotNull,dropNotNull:e.dropNotNull}}transformModifyColumn(e,r){return{kind:"ModifyColumnNode",column:this.transformNode(e.column,r)}}transformAddConstraint(e,r){return{kind:"AddConstraintNode",constraint:this.transformNode(e.constraint,r)}}transformDropConstraint(e,r){return{kind:"DropConstraintNode",constraintName:this.transformNode(e.constraintName,r),ifExists:e.ifExists,modifier:e.modifier}}transformRenameConstraint(e,r){return{kind:"RenameConstraintNode",oldName:this.transformNode(e.oldName,r),newName:this.transformNode(e.newName,r)}}transformCreateView(e,r){return{kind:"CreateViewNode",name:this.transformNode(e.name,r),temporary:e.temporary,orReplace:e.orReplace,ifNotExists:e.ifNotExists,materialized:e.materialized,columns:this.transformNodeList(e.columns,r),as:this.transformNode(e.as,r)}}transformRefreshMaterializedView(e,r){return{kind:"RefreshMaterializedViewNode",name:this.transformNode(e.name,r),concurrently:e.concurrently,withNoData:e.withNoData}}transformDropView(e,r){return{kind:"DropViewNode",name:this.transformNode(e.name,r),ifExists:e.ifExists,materialized:e.materialized,cascade:e.cascade}}transformGenerated(e,r){return{kind:"GeneratedNode",byDefault:e.byDefault,always:e.always,identity:e.identity,stored:e.stored,expression:this.transformNode(e.expression,r)}}transformDefaultValue(e,r){return{kind:"DefaultValueNode",defaultValue:this.transformNode(e.defaultValue,r)}}transformOn(e,r){return{kind:"OnNode",on:this.transformNode(e.on,r)}}transformSelectModifier(e,r){return{kind:"SelectModifierNode",modifier:e.modifier,rawModifier:this.transformNode(e.rawModifier,r),of:this.transformNodeList(e.of,r)}}transformCreateType(e,r){return{kind:"CreateTypeNode",name:this.transformNode(e.name,r),enum:this.transformNode(e.enum,r)}}transformDropType(e,r){return{kind:"DropTypeNode",name:this.transformNode(e.name,r),ifExists:e.ifExists}}transformExplain(e,r){return{kind:"ExplainNode",format:e.format,options:this.transformNode(e.options,r)}}transformSchemableIdentifier(e,r){return{kind:"SchemableIdentifierNode",schema:this.transformNode(e.schema,r),identifier:this.transformNode(e.identifier,r)}}transformAggregateFunction(e,r){return{kind:"AggregateFunctionNode",func:e.func,aggregated:this.transformNodeList(e.aggregated,r),distinct:e.distinct,orderBy:this.transformNode(e.orderBy,r),withinGroup:this.transformNode(e.withinGroup,r),filter:this.transformNode(e.filter,r),over:this.transformNode(e.over,r)}}transformOver(e,r){return{kind:"OverNode",orderBy:this.transformNode(e.orderBy,r),partitionBy:this.transformNode(e.partitionBy,r)}}transformPartitionBy(e,r){return{kind:"PartitionByNode",items:this.transformNodeList(e.items,r)}}transformPartitionByItem(e,r){return{kind:"PartitionByItemNode",partitionBy:this.transformNode(e.partitionBy,r)}}transformBinaryOperation(e,r){return{kind:"BinaryOperationNode",leftOperand:this.transformNode(e.leftOperand,r),operator:this.transformNode(e.operator,r),rightOperand:this.transformNode(e.rightOperand,r)}}transformUnaryOperation(e,r){return{kind:"UnaryOperationNode",operator:this.transformNode(e.operator,r),operand:this.transformNode(e.operand,r)}}transformUsing(e,r){return{kind:"UsingNode",tables:this.transformNodeList(e.tables,r)}}transformFunction(e,r){return{kind:"FunctionNode",func:e.func,arguments:this.transformNodeList(e.arguments,r)}}transformCase(e,r){return{kind:"CaseNode",value:this.transformNode(e.value,r),when:this.transformNodeList(e.when,r),else:this.transformNode(e.else,r),isStatement:e.isStatement}}transformWhen(e,r){return{kind:"WhenNode",condition:this.transformNode(e.condition,r),result:this.transformNode(e.result,r)}}transformJSONReference(e,r){return{kind:"JSONReferenceNode",reference:this.transformNode(e.reference,r),traversal:this.transformNode(e.traversal,r)}}transformJSONPath(e,r){return{kind:"JSONPathNode",inOperator:this.transformNode(e.inOperator,r),pathLegs:this.transformNodeList(e.pathLegs,r)}}transformJSONPathLeg(e,r){return{kind:"JSONPathLegNode",type:e.type,value:e.value}}transformJSONOperatorChain(e,r){return{kind:"JSONOperatorChainNode",operator:this.transformNode(e.operator,r),values:this.transformNodeList(e.values,r)}}transformTuple(e,r){return{kind:"TupleNode",values:this.transformNodeList(e.values,r)}}transformMergeQuery(e,r){return{kind:"MergeQueryNode",into:this.transformNode(e.into,r),using:this.transformNode(e.using,r),whens:this.transformNodeList(e.whens,r),with:this.transformNode(e.with,r),top:this.transformNode(e.top,r),endModifiers:this.transformNodeList(e.endModifiers,r),output:this.transformNode(e.output,r),returning:this.transformNode(e.returning,r)}}transformMatched(e,r){return{kind:"MatchedNode",not:e.not,bySource:e.bySource}}transformAddIndex(e,r){return{kind:"AddIndexNode",name:this.transformNode(e.name,r),columns:this.transformNodeList(e.columns,r),unique:e.unique,using:this.transformNode(e.using,r),ifNotExists:e.ifNotExists}}transformCast(e,r){return{kind:"CastNode",expression:this.transformNode(e.expression,r),dataType:this.transformNode(e.dataType,r)}}transformFetch(e,r){return{kind:"FetchNode",rowCount:this.transformNode(e.rowCount,r),modifier:e.modifier}}transformTop(e,r){return{kind:"TopNode",expression:e.expression,modifiers:e.modifiers}}transformOutput(e,r){return{kind:"OutputNode",selections:this.transformNodeList(e.selections,r)}}transformDataType(e,r){return e}transformSelectAll(e,r){return e}transformIdentifier(e,r){return e}transformValue(e,r){return e}transformPrimitiveValueList(e,r){return e}transformOperator(e,r){return e}transformDefaultInsertValue(e,r){return e}transformOrAction(e,r){return e}transformCollate(e,r){return e}};var ms=i({AlterTableNode:!0,CreateIndexNode:!0,CreateSchemaNode:!0,CreateTableNode:!0,CreateTypeNode:!0,CreateViewNode:!0,RefreshMaterializedViewNode:!0,DeleteQueryNode:!0,DropIndexNode:!0,DropSchemaNode:!0,DropTableNode:!0,DropTypeNode:!0,DropViewNode:!0,InsertQueryNode:!0,RawNode:!0,SelectQueryNode:!0,UpdateQueryNode:!0,MergeQueryNode:!0}),ls={json_agg:!0,to_json:!0},zr=class extends rt{#e;#t=new Set;#r=new Set;constructor(e){super(),this.#e=e}transformNodeImpl(e,r){if(!this.#n(e))return super.transformNodeImpl(e,r);let o=this.#d(e);for(let a of o)this.#r.add(a);let n=this.#a(e);for(let a of n)this.#t.add(a);let s=super.transformNodeImpl(e,r);for(let a of n)this.#t.delete(a);for(let a of o)this.#r.delete(a);return s}transformSchemableIdentifier(e,r){let o=super.transformSchemableIdentifier(e,r);return o.schema||!this.#t.has(e.identifier.name)?o:{...o,schema:l.create(this.#e)}}transformReferences(e,r){let o=super.transformReferences(e,r);return o.table.table.schema?o:{...o,table:ae.createWithSchema(this.#e,o.table.table.identifier.name)}}transformAggregateFunction(e,r){return{...super.transformAggregateFunction({...e,aggregated:[]},r),aggregated:this.#o(e,r,"aggregated")}}transformFunction(e,r){return{...super.transformFunction({...e,arguments:[]},r),arguments:this.#o(e,r,"arguments")}}transformSelectModifier(e,r){return{...super.transformSelectModifier({...e,of:void 0},r),of:e.of?.map(o=>ae.is(o)&&!o.table.schema?{...o,table:this.transformIdentifier(o.table.identifier,r)}:this.transformNode(o,r))}}#o(e,r,o){return ls[e.func]?e[o].map(n=>!ae.is(n)||n.table.schema?this.transformNode(n,r):{...n,table:this.transformIdentifier(n.table.identifier,r)}):this.transformNodeList(e[o],r)}#n(e){return e.kind in ms}#a(e){let r=new Set;if("name"in e&&e.name&&ee.is(e.name)&&this.#s(e.name,r),"from"in e&&e.from)for(let o of e.from.froms)this.#i(o,r);if("into"in e&&e.into&&this.#i(e.into,r),"table"in e&&e.table&&this.#i(e.table,r),"joins"in e&&e.joins)for(let o of e.joins)this.#i(o.table,r);return"using"in e&&e.using&&(Ce.is(e.using)?this.#i(e.using.table,r):this.#i(e.using,r)),r}#d(e){let r=new Set;return"with"in e&&e.with&&this.#u(e.with,r),r}#i(e,r){if(ae.is(e))return this.#s(e.table,r);if(U.is(e)&&ae.is(e.node))return this.#s(e.node.table,r);if(Dr.is(e)){for(let o of e.items)this.#i(o,r);return}if(ur.is(e)){for(let o of e.tables)this.#i(o,r);return}}#s(e,r){let o=e.identifier.name;!this.#t.has(o)&&!this.#r.has(o)&&r.add(o)}#u(e,r){for(let o of e.expressions){let n=o.name.table.table.identifier.name;this.#r.has(n)||r.add(n)}}};var Oe=class{#e;constructor(e){this.#e=new zr(e)}transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}async transformResult(e){return e.result}};var Nn=i({is(t){return t.kind==="MatchedNode"},create(t,e=!1){return i({kind:"MatchedNode",not:t,bySource:e})}});function Zi(t,e,r){return we.create(kt([Nn.create(!t.isMatched,t.bySource),...e&&e.length>0?[e.length===3&&r?J(e[0],e[1],e[2]):A(e)]:[]],"and",!1))}function It(t){return L(t)?T.create([t],[]):D(t)?t.toOperationNode():t}var cr=class{#e;#t;#r;constructor(){this.#e=new Promise((e,r)=>{this.#r=r,this.#t=e})}get promise(){return this.#e}resolve=e=>{this.#t&&this.#t(e)};reject=e=>{this.#r&&this.#r(e)}};async function Vr(t){let e=new cr,r=new cr;return t.provideConnection(async o=>(e.resolve(o),await r.promise)).catch(o=>e.reject(o)),i({connection:await e.promise,release:r.resolve})}var fs=i([]),Lt=class{#e;constructor(e=fs){this.#e=e}get plugins(){return this.#e}transformQuery(e,r){for(let o of this.#e){let n=o.transformQuery({node:e,queryId:r});if(n.kind===e.kind)e=n;else throw new Error(["KyselyPlugin.transformQuery must return a node","of the same kind that was given to it.",`The plugin was given a ${e.kind}`,`but it returned a ${n.kind}`].join(" "))}return e}async executeQuery(e){return await this.provideConnection(async r=>{let o=await r.executeQuery(e);return"numUpdatedOrDeletedRows"in o&&Ie("kysely:warning: outdated driver/plugin detected! `QueryResult.numUpdatedOrDeletedRows` has been replaced with `QueryResult.numAffectedRows`."),await this.#t(o,e.queryId)})}async*stream(e,r){let{connection:o,release:n}=await Vr(this);try{for await(let s of o.streamQuery(e,r))yield await this.#t(s,e.queryId)}finally{n()}}async#t(e,r){for(let o of this.#e)e=await o.transformResult({result:e,queryId:r});return e}};var _i=class t extends Lt{get adapter(){throw new Error("this query cannot be compiled to SQL")}compileQuery(){throw new Error("this query cannot be compiled to SQL")}provideConnection(){throw new Error("this query cannot be executed")}withConnectionProvider(){throw new Error("this query cannot have a connection provider")}withPlugin(e){return new t([...this.plugins,e])}withPlugins(e){return new t([...this.plugins,...e])}withPluginAtFront(e){return new t([e,...this.plugins])}withoutPlugins(){return new t([])}},it=new _i;var Ur=class{numChangedRows;constructor(e){this.numChangedRows=e}};var Jr=class t{#e;constructor(e){this.#e=i(e)}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,Se(e,r))})}using(...e){return new ot({...this.#e,queryNode:fe.cloneWithUsing(this.#e.queryNode,tt("Using",e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,$(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,j(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,$(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,j(e))})}},ot=class t{#e;constructor(e){this.#e=i(e)}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,Se(e,r))})}whenMatched(){return this.#t([])}whenMatchedAnd(...e){return this.#t(e)}whenMatchedAndRef(e,r,o){return this.#t([e,r,o],!0)}#t(e,r){return new jr({...this.#e,queryNode:fe.cloneWithWhen(this.#e.queryNode,Zi({isMatched:!0},e,r))})}whenNotMatched(){return this.#r([])}whenNotMatchedAnd(...e){return this.#r(e)}whenNotMatchedAndRef(e,r,o){return this.#r([e,r,o],!0)}whenNotMatchedBySource(){return this.#r([],!1,!0)}whenNotMatchedBySourceAnd(...e){return this.#r(e,!1,!0)}whenNotMatchedBySourceAndRef(e,r,o){return this.#r([e,r,o],!0,!0)}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,$(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,j(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,$(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,j(e))})}#r(e,r=!1,o=!1){let n={...this.#e,queryNode:fe.cloneWithWhen(this.#e.queryNode,Zi({isMatched:!1,bySource:o},e,r))},s=o?jr:eo;return new s(n)}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new Ur(r.numAffectedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ge){let r=await this.executeTakeFirst();if(r===void 0)throw Be(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}},jr=class{#e;constructor(e){this.#e=i(e)}thenDelete(){return new ot({...this.#e,queryNode:fe.cloneWithThen(this.#e.queryNode,It("delete"))})}thenDoNothing(){return new ot({...this.#e,queryNode:fe.cloneWithThen(this.#e.queryNode,It("do nothing"))})}thenUpdate(e){return new ot({...this.#e,queryNode:fe.cloneWithThen(this.#e.queryNode,It(e(new Dt({queryId:this.#e.queryId,executor:it,queryNode:qe.createWithoutTable()}))))})}thenUpdateSet(...e){return this.thenUpdate(r=>r.set(...e))}},eo=class{#e;constructor(e){this.#e=i(e)}thenDoNothing(){return new ot({...this.#e,queryNode:fe.cloneWithThen(this.#e.queryNode,It("do nothing"))})}thenInsertValues(e){let[r,o]=qr(e);return new ot({...this.#e,queryNode:fe.cloneWithThen(this.#e.queryNode,It(B.cloneWith(B.createWithoutInto(),{columns:r,values:o})))})}};var qt=class t{#e;constructor(e){this.#e=i(e)}selectFrom(e){return mr({queryId:C(),executor:this.#e.executor,queryNode:S.createFrom(Te(e),this.#e.withNode)})}selectNoFrom(e){return mr({queryId:C(),executor:this.#e.executor,queryNode:S.cloneWithSelections(S.create(this.#e.withNode),$(e))})}insertInto(e){return new pr({queryId:C(),executor:this.#e.executor,queryNode:B.create(b(e),this.#e.withNode)})}replaceInto(e){return new pr({queryId:C(),executor:this.#e.executor,queryNode:B.create(b(e),this.#e.withNode,!0)})}deleteFrom(e){return new Qr({queryId:C(),executor:this.#e.executor,queryNode:et.create(Te(e),this.#e.withNode)})}updateTable(e){return new Dt({queryId:C(),executor:this.#e.executor,queryNode:qe.create(Te(e),this.#e.withNode)})}mergeInto(e){return new Jr({queryId:C(),executor:this.#e.executor,queryNode:fe.create(to(e),this.#e.withNode)})}with(e,r){let o=Yi(e,r);return new t({...this.#e,withNode:this.#e.withNode?hr.cloneWithExpression(this.#e.withNode,o):hr.create(o)})}withRecursive(e,r){let o=Yi(e,r);return new t({...this.#e,withNode:this.#e.withNode?hr.cloneWithExpression(this.#e.withNode,o):hr.create(o,{recursive:!0})})}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new Oe(e))})}};function mn(){return new qt({executor:it})}function yn(t,e){return new Rr({joinNode:Ce.create(t,lt(e))})}function xn(){return new Ir({overNode:ar.create()})}function tt(t,e){if(e.length===3)return ys(t,e[0],e[1],e[2]);if(e.length===2)return Ns(t,e[0],e[1]);if(e.length===1)return xs(t,e[0]);throw new Error("not implemented")}function Ns(t,e,r){return r(yn(t,e)).toOperationNode()}function ys(t,e,r,o){return Ce.createWithOn(t,lt(e),J(r,"=",o))}function xs(t,e){return Ce.create(t,lt(e))}var wn=i({is(t){return t.kind==="OffsetNode"},create(t){return i({kind:"OffsetNode",offset:t})}});var gn=i({is(t){return t.kind==="GroupByItemNode"},create(t){return i({kind:"GroupByItemNode",groupBy:t})}});function On(t){return t=q(t)?t(oe()):t,Fe(t).map(gn.create)}var Kr=i({is(t){return t.kind==="SetOperationNode"},create(t,e,r){return i({kind:"SetOperationNode",operator:t,expression:e,all:r})}});function ft(t,e,r){return q(e)&&(e=e(Gr())),Z(e)||(e=[e]),e.map(o=>Kr.create(t,de(o),r))}var W=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new lr(this,e)}or(...e){return new ro(be.create(this.#e,A(e)))}and(...e){return new io(ue.create(this.#e,A(e)))}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},lr=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return U.create(this.#e.toOperationNode(),D(this.#t)?this.#t.toOperationNode():l.create(this.#t))}},ro=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new lr(this,e)}or(...e){return new t(be.create(this.#e,A(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return le.create(this.#e)}},io=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new lr(this,e)}and(...e){return new t(ue.create(this.#e,A(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return le.create(this.#e)}};var vn=i({is(t){return t.kind==="FetchNode"},create(t,e){return{kind:"FetchNode",rowCount:P.create(t),modifier:e}}});function bn(t,e){if(!Ye(t)&&!bt(t))throw new Error(`Invalid fetch row count: ${t}`);if(!ws(e))throw new Error(`Invalid fetch modifier: ${e}`);return vn.create(t,e)}function ws(t){return t==="only"||t==="with ties"}var oo=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}get isSelectQueryBuilder(){return!0}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,A(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,J(e,r,o))})}having(...e){return new t({...this.#e,queryNode:S.cloneWithHaving(this.#e.queryNode,A(e))})}havingRef(e,r,o){return new t({...this.#e,queryNode:S.cloneWithHaving(this.#e.queryNode,J(e,r,o))})}select(e){return new t({...this.#e,queryNode:S.cloneWithSelections(this.#e.queryNode,$(e))})}distinctOn(e){return new t({...this.#e,queryNode:S.cloneWithDistinctOn(this.#e.queryNode,Fe(e))})}modifyFront(e){return new t({...this.#e,queryNode:S.cloneWithFrontModifier(this.#e.queryNode,Re.createWithExpression(e.toOperationNode()))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,Re.createWithExpression(e.toOperationNode()))})}distinct(){return new t({...this.#e,queryNode:S.cloneWithFrontModifier(this.#e.queryNode,Re.create("Distinct"))})}forUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,Re.create("ForUpdate",e?ir(e).map(b):void 0))})}forShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,Re.create("ForShare",e?ir(e).map(b):void 0))})}forKeyShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,Re.create("ForKeyShare",e?ir(e).map(b):void 0))})}forNoKeyUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,Re.create("ForNoKeyUpdate",e?ir(e).map(b):void 0))})}skipLocked(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,Re.create("SkipLocked"))})}noWait(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,Re.create("NoWait"))})}selectAll(e){return new t({...this.#e,queryNode:S.cloneWithSelections(this.#e.queryNode,j(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}crossJoin(...e){return this.#t("CrossJoin",e)}innerJoinLateral(...e){return this.#t("LateralInnerJoin",e)}leftJoinLateral(...e){return this.#t("LateralLeftJoin",e)}crossJoinLateral(...e){return this.#t("LateralCrossJoin",e)}crossApply(...e){return this.#t("CrossApply",e)}outerApply(...e){return this.#t("OuterApply",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,tt(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,me(e))})}groupBy(e){return new t({...this.#e,queryNode:S.cloneWithGroupByItems(this.#e.queryNode,On(e))})}limit(e){return new t({...this.#e,queryNode:S.cloneWithLimit(this.#e.queryNode,At.create(k(e)))})}offset(e){return new t({...this.#e,queryNode:S.cloneWithOffset(this.#e.queryNode,wn.create(k(e)))})}fetch(e,r="only"){return new t({...this.#e,queryNode:S.cloneWithFetch(this.#e.queryNode,bn(e,r))})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,Se(e,r))})}union(e){return new t({...this.#e,queryNode:S.cloneWithSetOperations(this.#e.queryNode,ft("union",e,!1))})}unionAll(e){return new t({...this.#e,queryNode:S.cloneWithSetOperations(this.#e.queryNode,ft("union",e,!0))})}intersect(e){return new t({...this.#e,queryNode:S.cloneWithSetOperations(this.#e.queryNode,ft("intersect",e,!1))})}intersectAll(e){return new t({...this.#e,queryNode:S.cloneWithSetOperations(this.#e.queryNode,ft("intersect",e,!0))})}except(e){return new t({...this.#e,queryNode:S.cloneWithSetOperations(this.#e.queryNode,ft("except",e,!1))})}exceptAll(e){return new t({...this.#e,queryNode:S.cloneWithSetOperations(this.#e.queryNode,ft("except",e,!0))})}as(e){return new no(this,e)}clearSelect(){return new t({...this.#e,queryNode:S.cloneWithoutSelections(this.#e.queryNode)})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}clearLimit(){return new t({...this.#e,queryNode:S.cloneWithoutLimit(this.#e.queryNode)})}clearOffset(){return new t({...this.#e,queryNode:S.cloneWithoutOffset(this.#e.queryNode)})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}clearGroupBy(){return new t({...this.#e,queryNode:S.cloneWithoutGroupBy(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}$asTuple(){return new W(this.toOperationNode())}$asScalar(){return new W(this.toOperationNode())}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile();return(await this.#e.executor.executeQuery(e)).rows}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ge){let r=await this.executeTakeFirst();if(r===void 0)throw Be(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};function mr(t){return new oo(t)}var no=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}get isAliasedSelectQueryBuilder(){return!0}toOperationNode(){return U.create(this.#e.toOperationNode(),l.create(this.#t))}};var Me=i({is(t){return t.kind==="AggregateFunctionNode"},create(t,e=[]){return i({kind:"AggregateFunctionNode",func:t,aggregated:e})},cloneWithDistinct(t){return i({...t,distinct:!0})},cloneWithOrderBy(t,e,r=!1){let o=r?"withinGroup":"orderBy";return i({...t,[o]:t[o]?ze.cloneWithItems(t[o],e):ze.create(e)})},cloneWithFilter(t,e){return i({...t,filter:t.filter?H.cloneWithOperation(t.filter,"And",e):H.create(e)})},cloneWithOrFilter(t,e){return i({...t,filter:t.filter?H.cloneWithOperation(t.filter,"Or",e):H.create(e)})},cloneWithOver(t,e){return i({...t,over:e})}});var so=i({is(t){return t.kind==="FunctionNode"},create(t,e){return i({kind:"FunctionNode",func:t,arguments:e})}});var Bt=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}as(e){return new ao(this,e)}distinct(){return new t({...this.#e,aggregateFunctionNode:Me.cloneWithDistinct(this.#e.aggregateFunctionNode)})}orderBy(...e){return new t({...this.#e,aggregateFunctionNode:u.cloneWithOrderByItems(this.#e.aggregateFunctionNode,me(e))})}clearOrderBy(){return new t({...this.#e,aggregateFunctionNode:u.cloneWithoutOrderBy(this.#e.aggregateFunctionNode)})}withinGroupOrderBy(...e){return new t({...this.#e,aggregateFunctionNode:Me.cloneWithOrderBy(this.#e.aggregateFunctionNode,me(e),!0)})}filterWhere(...e){return new t({...this.#e,aggregateFunctionNode:Me.cloneWithFilter(this.#e.aggregateFunctionNode,A(e))})}filterWhereRef(e,r,o){return new t({...this.#e,aggregateFunctionNode:Me.cloneWithFilter(this.#e.aggregateFunctionNode,J(e,r,o))})}over(e){let r=xn();return new t({...this.#e,aggregateFunctionNode:Me.cloneWithOver(this.#e.aggregateFunctionNode,(e?e(r):r).toOperationNode())})}$call(e){return e(this)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e.aggregateFunctionNode}},ao=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return U.create(this.#e.toOperationNode(),l.create(this.#t))}};function Hr(){let t=(r,o)=>new W(so.create(r,Fe(o??[]))),e=(r,o)=>new Bt({aggregateFunctionNode:Me.create(r,o?Fe(o):void 0)});return Object.assign(t,{agg:e,avg(r){return e("avg",[r])},coalesce(...r){return t("coalesce",r)},count(r){return e("count",[r])},countAll(r){return new Bt({aggregateFunctionNode:Me.create("count",j(r))})},max(r){return e("max",[r])},min(r){return e("min",[r])},sum(r){return e("sum",[r])},any(r){return t("any",[r])},jsonAgg(r){return new Bt({aggregateFunctionNode:Me.create("json_agg",[L(r)?b(r):r.toOperationNode()])})},toJson(r){return new W(so.create("to_json",[L(r)?b(r):r.toOperationNode()]))}})}var Cn=i({is(t){return t.kind==="UnaryOperationNode"},create(t,e){return i({kind:"UnaryOperationNode",operator:t,operand:e})}});function Wn(t,e){return Cn.create(he.create(t),G(e))}var Ne=i({is(t){return t.kind==="CaseNode"},create(t){return i({kind:"CaseNode",value:t})},cloneWithWhen(t,e){return i({...t,when:i(t.when?[...t.when,e]:[e])})},cloneWithThen(t,e){return i({...t,when:t.when?i([...t.when.slice(0,-1),we.cloneWithResult(t.when[t.when.length-1],e)]):void 0})},cloneWith(t,e){return i({...t,...e})}});var Mt=class{#e;constructor(e){this.#e=i(e)}when(...e){return new Yr({...this.#e,node:Ne.cloneWithWhen(this.#e.node,we.create(A(e)))})}},Yr=class{#e;constructor(e){this.#e=i(e)}then(e){return new uo({...this.#e,node:Ne.cloneWithThen(this.#e.node,Er(e)?sr(e):k(e))})}},uo=class{#e;constructor(e){this.#e=i(e)}when(...e){return new Yr({...this.#e,node:Ne.cloneWithWhen(this.#e.node,we.create(A(e)))})}else(e){return new po({...this.#e,node:Ne.cloneWith(this.#e.node,{else:Er(e)?sr(e):k(e)})})}end(){return new W(Ne.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new W(Ne.cloneWith(this.#e.node,{isStatement:!0}))}},po=class{#e;constructor(e){this.#e=i(e)}end(){return new W(Ne.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new W(Ne.cloneWith(this.#e.node,{isStatement:!0}))}};var ho=i({is(t){return t.kind==="JSONPathLegNode"},create(t,e){return i({kind:"JSONPathLegNode",type:t,value:e})}});var Pt=class{#e;constructor(e){this.#e=e}at(e){return this.#t("ArrayLocation",e)}key(e){return this.#t("Member",e)}#t(e,r){return St.is(this.#e)?new Xr(St.cloneWithTraversal(this.#e,_e.is(this.#e.traversal)?_e.cloneWithLeg(this.#e.traversal,ho.create(e,r)):Tr.cloneWithValue(this.#e.traversal,P.createImmediate(r)))):new Xr(_e.cloneWithLeg(this.#e,ho.create(e,r)))}},Xr=class t extends Pt{#e;constructor(e){super(e),this.#e=e}get expressionType(){}as(e){return new co(this,e)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},co=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return U.create(this.#e.toOperationNode(),D(this.#t)?this.#t.toOperationNode():l.create(this.#t))}};var mo=i({is(t){return t.kind==="TupleNode"},create(t){return i({kind:"TupleNode",values:i(t)})}});var gs=["varchar","char","text","integer","int2","int4","int8","smallint","bigint","boolean","real","double precision","float4","float8","decimal","numeric","binary","bytea","date","datetime","time","timetz","timestamp","timestamptz","serial","bigserial","uuid","json","jsonb","blob","varbinary","int4range","int4multirange","int8range","int8multirange","numrange","nummultirange","tsrange","tsmultirange","tstzrange","tstzmultirange","daterange","datemultirange"],Os=[/^varchar\(\d+\)$/,/^char\(\d+\)$/,/^decimal\(\d+, \d+\)$/,/^numeric\(\d+, \d+\)$/,/^binary\(\d+\)$/,/^datetime\(\d+\)$/,/^time\(\d+\)$/,/^timetz\(\d+\)$/,/^timestamp\(\d+\)$/,/^timestamptz\(\d+\)$/,/^varbinary\(\d+\)$/],Sn=i({is(t){return t.kind==="DataTypeNode"},create(t){return i({kind:"DataTypeNode",dataType:t})}});function Tn(t){return!!(gs.includes(t)||Os.some(e=>e.test(t)))}function ke(t){if(D(t))return t.toOperationNode();if(Tn(t))return Sn.create(t);throw new Error(`invalid column data type ${JSON.stringify(t)}`)}var kn=i({is(t){return t.kind==="CastNode"},create(t,e){return i({kind:"CastNode",expression:t,dataType:e})}});function Gr(t=it){function e(n,s,a){return new W(Ar(n,s,a))}function r(n,s){return new W(Wn(n,s))}let o=Object.assign(e,{fn:void 0,eb:void 0,selectFrom(n){return mr({queryId:C(),executor:t,queryNode:S.createFrom(Te(n))})},case(n){return new Mt({node:Ne.create(pe(n)?void 0:G(n))})},ref(n,s){return pe(s)?new W(ce(n)):new Pt(Yo(n,s))},jsonPath(){return new Pt(_e.create())},table(n){return new W(b(n))},val(n){return new W(k(n))},refTuple(...n){return new W(mo.create(n.map(G)))},tuple(...n){return new W(mo.create(n.map(k)))},lit(n){return new W(sr(n))},unary:r,not(n){return r("not",n)},exists(n){return r("exists",n)},neg(n){return r("-",n)},between(n,s,a){return new W(Ze.create(G(n),he.create("between"),ue.create(k(s),k(a))))},betweenSymmetric(n,s,a){return new W(Ze.create(G(n),he.create("between symmetric"),ue.create(k(s),k(a))))},and(n){return Z(n)?new W(kt(n,"and")):new W($i(n,"and"))},or(n){return Z(n)?new W(kt(n,"or")):new W($i(n,"or"))},parens(...n){let s=A(n);return le.is(s)?new W(s):new W(le.create(s))},cast(n,s){return new W(kn.create(G(n),ke(s)))},withSchema(n){return Gr(t.withPluginAtFront(new Oe(n)))}});return o.fn=Hr(),o.eb=o,o}function oe(t){return Gr()}function de(t){if(D(t))return t.toOperationNode();if(q(t))return t(oe()).toOperationNode();throw new Error(`invalid expression: ${JSON.stringify(t)}`)}function Lr(t){if(D(t))return t.toOperationNode();if(q(t))return t(oe()).toOperationNode();throw new Error(`invalid aliased expression: ${JSON.stringify(t)}`)}function $e(t){return vr(t)||Uo(t)||q(t)}var Zr=class{#e;get table(){return this.#e}constructor(e){this.#e=e}as(e){return new lo(this.#e,e)}},lo=class{#e;#t;get table(){return this.#e}get alias(){return this.#t}constructor(e,r){this.#e=e,this.#t=r}toOperationNode(){return U.create(b(this.#e),l.create(this.#t))}};function En(t){return K(t)&&D(t)&&L(t.table)&&L(t.alias)}function Te(t){return Z(t)?t.map(e=>lt(e)):[lt(t)]}function lt(t){return L(t)?to(t):En(t)?t.toOperationNode():Lr(t)}function to(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(An);return U.create(b(r),l.create(o))}else return b(t)}function b(t){if(t.includes(".")){let[r,o]=t.split(".").map(An);return ae.createWithSchema(r,o)}else return ae.create(t)}function An(t){return t.trim()}var fo=i({is(t){return t.kind==="AddColumnNode"},create(t){return i({kind:"AddColumnNode",column:t})}});var R=i({is(t){return t.kind==="ColumnDefinitionNode"},create(t,e){return i({kind:"ColumnDefinitionNode",column:O.create(t),dataType:e})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):[e]})},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):[e]})},cloneWith(t,e){return i({...t,...e})}});var No=i({is(t){return t.kind==="DropColumnNode"},create(t){return i({kind:"DropColumnNode",column:O.create(t)})}});var yo=i({is(t){return t.kind==="RenameColumnNode"},create(t,e){return i({kind:"RenameColumnNode",column:O.create(t),renameTo:O.create(e)})}});var Qt=i({is(t){return t.kind==="CheckConstraintNode"},create(t,e){return i({kind:"CheckConstraintNode",expression:t,name:e?l.create(e):void 0})}});var Dn=["no action","restrict","cascade","set null","set default"],$t=i({is(t){return t.kind==="ReferencesNode"},create(t,e){return i({kind:"ReferencesNode",table:t,columns:i([...e])})},cloneWithOnDelete(t,e){return i({...t,onDelete:e})},cloneWithOnUpdate(t,e){return i({...t,onUpdate:e})}});function _r(t){return D(t)?t.toOperationNode():P.createImmediate(t)}var fr=i({is(t){return t.kind==="GeneratedNode"},create(t){return i({kind:"GeneratedNode",...t})},createWithExpression(t){return i({kind:"GeneratedNode",always:!0,expression:t})},cloneWith(t,e){return i({...t,...e})}});var Rn=i({is(t){return t.kind==="DefaultValueNode"},create(t){return i({kind:"DefaultValueNode",defaultValue:t})}});function Ft(t){if(Dn.includes(t))return t;throw new Error(`invalid OnModifyForeignAction ${t}`)}var Ve=class t{#e;constructor(e){this.#e=e}autoIncrement(){return new t(R.cloneWith(this.#e,{autoIncrement:!0}))}identity(){return new t(R.cloneWith(this.#e,{identity:!0}))}primaryKey(){return new t(R.cloneWith(this.#e,{primaryKey:!0}))}references(e){let r=ce(e);if(!r.table||Ct.is(r.column))throw new Error(`invalid call references('${e}'). The reference must have format table.column or schema.table.column`);return new t(R.cloneWith(this.#e,{references:$t.create(r.table,[r.column])}))}onDelete(e){if(!this.#e.references)throw new Error("on delete constraint can only be added for foreign keys");return new t(R.cloneWith(this.#e,{references:$t.cloneWithOnDelete(this.#e.references,Ft(e))}))}onUpdate(e){if(!this.#e.references)throw new Error("on update constraint can only be added for foreign keys");return new t(R.cloneWith(this.#e,{references:$t.cloneWithOnUpdate(this.#e.references,Ft(e))}))}unique(){return new t(R.cloneWith(this.#e,{unique:!0}))}notNull(){return new t(R.cloneWith(this.#e,{notNull:!0}))}unsigned(){return new t(R.cloneWith(this.#e,{unsigned:!0}))}defaultTo(e){return new t(R.cloneWith(this.#e,{defaultTo:Rn.create(_r(e))}))}check(e){return new t(R.cloneWith(this.#e,{check:Qt.create(e.toOperationNode())}))}generatedAlwaysAs(e){return new t(R.cloneWith(this.#e,{generated:fr.createWithExpression(e.toOperationNode())}))}generatedAlwaysAsIdentity(){return new t(R.cloneWith(this.#e,{generated:fr.create({identity:!0,always:!0})}))}generatedByDefaultAsIdentity(){return new t(R.cloneWith(this.#e,{generated:fr.create({identity:!0,byDefault:!0})}))}stored(){if(!this.#e.generated)throw new Error("stored() can only be called after generatedAlwaysAs");return new t(R.cloneWith(this.#e,{generated:fr.cloneWith(this.#e.generated,{stored:!0})}))}modifyFront(e){return new t(R.cloneWithFrontModifier(this.#e,e.toOperationNode()))}nullsNotDistinct(){return new t(R.cloneWith(this.#e,{nullsNotDistinct:!0}))}ifNotExists(){return new t(R.cloneWith(this.#e,{ifNotExists:!0}))}modifyEnd(e){return new t(R.cloneWithEndModifier(this.#e,e.toOperationNode()))}$call(e){return e(this)}toOperationNode(){return this.#e}};var xo=i({is(t){return t.kind==="ModifyColumnNode"},create(t){return i({kind:"ModifyColumnNode",column:t})}});var Ee=i({is(t){return t.kind==="ForeignKeyConstraintNode"},create(t,e,r,o){return i({kind:"ForeignKeyConstraintNode",columns:t,references:$t.create(e,r),name:o?l.create(o):void 0})},cloneWith(t,e){return i({...t,...e})}});var zt=class t{#e;constructor(e){this.#e=e}onDelete(e){return new t(Ee.cloneWith(this.#e,{onDelete:Ft(e)}))}onUpdate(e){return new t(Ee.cloneWith(this.#e,{onUpdate:Ft(e)}))}deferrable(){return new t(Ee.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(Ee.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(Ee.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(Ee.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Vt=i({is(t){return t.kind==="AddConstraintNode"},create(t){return i({kind:"AddConstraintNode",constraint:t})}});var Pe=i({is(t){return t.kind==="UniqueConstraintNode"},create(t,e,r){return i({kind:"UniqueConstraintNode",columns:i(t.map(O.create)),name:e?l.create(e):void 0,nullsNotDistinct:r})},cloneWith(t,e){return i({...t,...e})}});var Ut=i({is(t){return t.kind==="DropConstraintNode"},create(t){return i({kind:"DropConstraintNode",constraintName:l.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Jt=i({is(t){return t.kind==="AlterColumnNode"},create(t,e,r){return i({kind:"AlterColumnNode",column:O.create(t),[e]:r})}});var Nr=class{#e;constructor(e){this.#e=e}setDataType(e){return new Nt(Jt.create(this.#e,"dataType",ke(e)))}setDefault(e){return new Nt(Jt.create(this.#e,"setDefault",_r(e)))}dropDefault(){return new Nt(Jt.create(this.#e,"dropDefault",!0))}setNotNull(){return new Nt(Jt.create(this.#e,"setNotNull",!0))}dropNotNull(){return new Nt(Jt.create(this.#e,"dropNotNull",!0))}$call(e){return e(this)}},Nt=class{#e;constructor(e){this.#e=e}toOperationNode(){return this.#e}};var Ue=class{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var ei=class t{#e;constructor(e){this.#e=i(e)}onDelete(e){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.onDelete(e)})}onUpdate(e){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.onUpdate(e)})}deferrable(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.deferrable()})}notDeferrable(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.notDeferrable()})}initiallyDeferred(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyDeferred()})}initiallyImmediate(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyImmediate()})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(v.cloneWithTableProps(this.#e.node,{addConstraint:Vt.create(this.#e.constraintBuilder.toOperationNode())}),this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var yr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{dropConstraint:Ut.cloneWith(this.#e.node.dropConstraint,{ifExists:!0})})})}cascade(){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{dropConstraint:Ut.cloneWith(this.#e.node.dropConstraint,{modifier:"cascade"})})})}restrict(){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{dropConstraint:Ut.cloneWith(this.#e.node.dropConstraint,{modifier:"restrict"})})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Je=i({is(t){return t.kind==="PrimaryKeyConstraintNode"},create(t,e){return i({kind:"PrimaryKeyConstraintNode",columns:i(t.map(O.create)),name:e?l.create(e):void 0})},cloneWith(t,e){return i({...t,...e})}});var nt=i({is(t){return t.kind==="AddIndexNode"},create(t){return i({kind:"AddIndexNode",name:l.create(t)})},cloneWith(t,e){return i({...t,...e})},cloneWithColumns(t,e){return i({...t,columns:[...t.columns||[],...e]})}});var ti=class t{#e;constructor(e){this.#e=i(e)}unique(){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addIndex:nt.cloneWith(this.#e.node.addIndex,{unique:!0})})})}column(e){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addIndex:nt.cloneWithColumns(this.#e.node.addIndex,[Tt(e)])})})}columns(e){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addIndex:nt.cloneWithColumns(this.#e.node.addIndex,e.map(Tt))})})}expression(e){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addIndex:nt.cloneWithColumns(this.#e.node.addIndex,[e.toOperationNode()])})})}using(e){return new t({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addIndex:nt.cloneWith(this.#e.node.addIndex,{using:T.createWithSql(e)})})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var jt=class t{#e;constructor(e){this.#e=e}nullsNotDistinct(){return new t(Pe.cloneWith(this.#e,{nullsNotDistinct:!0}))}deferrable(){return new t(Pe.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(Pe.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(Pe.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(Pe.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Kt=class t{#e;constructor(e){this.#e=e}deferrable(){return new t(Je.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(Je.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(Je.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(Je.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Gt=class{#e;constructor(e){this.#e=e}$call(e){return e(this)}toOperationNode(){return this.#e}};var In=i({is(t){return t.kind==="RenameConstraintNode"},create(t,e){return i({kind:"RenameConstraintNode",oldName:l.create(t),newName:l.create(e)})}});var ri=class{#e;constructor(e){this.#e=i(e)}renameTo(e){return new Ue({...this.#e,node:v.cloneWithTableProps(this.#e.node,{renameTo:b(e)})})}setSchema(e){return new Ue({...this.#e,node:v.cloneWithTableProps(this.#e.node,{setSchema:l.create(e)})})}alterColumn(e,r){let o=r(new Nr(e));return new yt({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new yt({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,No.create(e))})}renameColumn(e,r){return new yt({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,yo.create(e,r))})}addColumn(e,r,o=ie){let n=o(new Ve(R.create(e,ke(r))));return new yt({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,fo.create(n.toOperationNode()))})}modifyColumn(e,r,o=ie){let n=o(new Ve(R.create(e,ke(r))));return new yt({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,xo.create(n.toOperationNode()))})}addUniqueConstraint(e,r,o=ie){let n=o(new jt(Pe.create(r,e)));return new Ue({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addConstraint:Vt.create(n.toOperationNode())})})}addCheckConstraint(e,r,o=ie){let n=o(new Gt(Qt.create(r.toOperationNode(),e)));return new Ue({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addConstraint:Vt.create(n.toOperationNode())})})}addForeignKeyConstraint(e,r,o,n,s=ie){let a=s(new zt(Ee.create(r.map(O.create),b(o),n.map(O.create),e)));return new ei({...this.#e,constraintBuilder:a})}addPrimaryKeyConstraint(e,r,o=ie){let n=o(new Kt(Je.create(r,e)));return new Ue({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addConstraint:Vt.create(n.toOperationNode())})})}dropConstraint(e){return new yr({...this.#e,node:v.cloneWithTableProps(this.#e.node,{dropConstraint:Ut.create(e)})})}renameConstraint(e,r){return new yr({...this.#e,node:v.cloneWithTableProps(this.#e.node,{renameConstraint:In.create(e,r)})})}addIndex(e){return new ti({...this.#e,node:v.cloneWithTableProps(this.#e.node,{addIndex:nt.create(e)})})}dropIndex(e){return new Ue({...this.#e,node:v.cloneWithTableProps(this.#e.node,{dropIndex:Xe.create(e)})})}$call(e){return e(this)}},yt=class t{#e;constructor(e){this.#e=i(e)}alterColumn(e,r){let o=r(new Nr(e));return new t({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new t({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,No.create(e))})}renameColumn(e,r){return new t({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,yo.create(e,r))})}addColumn(e,r,o=ie){let n=o(new Ve(R.create(e,ke(r))));return new t({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,fo.create(n.toOperationNode()))})}modifyColumn(e,r,o=ie){let n=o(new Ve(R.create(e,ke(r))));return new t({...this.#e,node:v.cloneWithColumnAlteration(this.#e.node,xo.create(n.toOperationNode()))})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Ht=class extends rt{transformPrimitiveValueList(e){return Le.create(e.values.map(P.createImmediate))}transformValue(e){return P.createImmediate(e.value)}};var ii=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:ve.cloneWith(this.#e.node,{ifNotExists:!0})})}unique(){return new t({...this.#e,node:ve.cloneWith(this.#e.node,{unique:!0})})}nullsNotDistinct(){return new t({...this.#e,node:ve.cloneWith(this.#e.node,{nullsNotDistinct:!0})})}on(e){return new t({...this.#e,node:ve.cloneWith(this.#e.node,{table:b(e)})})}column(e){return new t({...this.#e,node:ve.cloneWithColumns(this.#e.node,[Tt(e)])})}columns(e){return new t({...this.#e,node:ve.cloneWithColumns(this.#e.node,e.map(Tt))})}expression(e){return new t({...this.#e,node:ve.cloneWithColumns(this.#e.node,[e.toOperationNode()])})}using(e){return new t({...this.#e,node:ve.cloneWith(this.#e.node,{using:T.createWithSql(e)})})}where(...e){let r=new Ht;return new t({...this.#e,node:u.cloneWithWhere(this.#e.node,r.transformNode(A(e),this.#e.queryId))})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var oi=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:Or.cloneWith(this.#e.node,{ifNotExists:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};function Ln(t){if(Vo.includes(t))return t;throw new Error(`invalid OnCommitAction ${t}`)}var ni=class t{#e;constructor(e){this.#e=i(e)}temporary(){return new t({...this.#e,node:_.cloneWith(this.#e.node,{temporary:!0})})}onCommit(e){return new t({...this.#e,node:_.cloneWith(this.#e.node,{onCommit:Ln(e)})})}ifNotExists(){return new t({...this.#e,node:_.cloneWith(this.#e.node,{ifNotExists:!0})})}addColumn(e,r,o=ie){let n=o(new Ve(R.create(e,ke(r))));return new t({...this.#e,node:_.cloneWithColumn(this.#e.node,n.toOperationNode())})}addPrimaryKeyConstraint(e,r,o=ie){let n=o(new Kt(Je.create(r,e)));return new t({...this.#e,node:_.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addUniqueConstraint(e,r,o=ie){let n=o(new jt(Pe.create(r,e)));return new t({...this.#e,node:_.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addCheckConstraint(e,r,o=ie){let n=o(new Gt(Qt.create(r.toOperationNode(),e)));return new t({...this.#e,node:_.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addForeignKeyConstraint(e,r,o,n,s=ie){let a=s(new zt(Ee.create(r.map(O.create),b(o),n.map(O.create),e)));return new t({...this.#e,node:_.cloneWithConstraint(this.#e.node,a.toOperationNode())})}modifyFront(e){return new t({...this.#e,node:_.cloneWithFrontModifier(this.#e.node,e.toOperationNode())})}modifyEnd(e){return new t({...this.#e,node:_.cloneWithEndModifier(this.#e.node,e.toOperationNode())})}as(e){return new t({...this.#e,node:_.cloneWith(this.#e.node,{selectQuery:de(e)})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var si=class t{#e;constructor(e){this.#e=i(e)}on(e){return new t({...this.#e,node:Xe.cloneWith(this.#e.node,{table:b(e)})})}ifExists(){return new t({...this.#e,node:Xe.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Xe.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var ai=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:or.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:or.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var ui=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:nr.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:nr.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Ae=i({is(t){return t.kind==="CreateViewNode"},create(t){return i({kind:"CreateViewNode",name:ee.create(t)})},cloneWith(t,e){return i({...t,...e})}});var di=class{#e=new Ht;transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}transformResult(e){return Promise.resolve(e.result)}};var pi=class t{#e;constructor(e){this.#e=i(e)}temporary(){return new t({...this.#e,node:Ae.cloneWith(this.#e.node,{temporary:!0})})}materialized(){return new t({...this.#e,node:Ae.cloneWith(this.#e.node,{materialized:!0})})}ifNotExists(){return new t({...this.#e,node:Ae.cloneWith(this.#e.node,{ifNotExists:!0})})}orReplace(){return new t({...this.#e,node:Ae.cloneWith(this.#e.node,{orReplace:!0})})}columns(e){return new t({...this.#e,node:Ae.cloneWith(this.#e.node,{columns:e.map(Mi)})})}as(e){let r=e.withPlugin(new di).toOperationNode();return new t({...this.#e,node:Ae.cloneWith(this.#e.node,{as:r})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Yt=i({is(t){return t.kind==="DropViewNode"},create(t){return i({kind:"DropViewNode",name:ee.create(t)})},cloneWith(t,e){return i({...t,...e})}});var hi=class t{#e;constructor(e){this.#e=i(e)}materialized(){return new t({...this.#e,node:Yt.cloneWith(this.#e.node,{materialized:!0})})}ifExists(){return new t({...this.#e,node:Yt.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Yt.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var ci=i({is(t){return t.kind==="CreateTypeNode"},create(t){return i({kind:"CreateTypeNode",name:t})},cloneWithEnum(t,e){return i({...t,enum:Le.create(e.map(P.createImmediate))})}});var mi=class t{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}asEnum(e){return new t({...this.#e,node:ci.cloneWithEnum(this.#e.node,e)})}$call(e){return e(this)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var li=i({is(t){return t.kind==="DropTypeNode"},create(t){return i({kind:"DropTypeNode",name:t})},cloneWith(t,e){return i({...t,...e})}});var fi=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:li.cloneWith(this.#e.node,{ifExists:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};function wo(t){if(t.includes(".")){let r=t.split(".").map(vs);if(r.length===2)return ee.createWithSchema(r[0],r[1]);throw new Error(`invalid schemable identifier ${t}`)}else return ee.create(t)}function vs(t){return t.trim()}var Xt=i({is(t){return t.kind==="RefreshMaterializedViewNode"},create(t){return i({kind:"RefreshMaterializedViewNode",name:ee.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Ni=class t{#e;constructor(e){this.#e=i(e)}concurrently(){return new t({...this.#e,node:Xt.cloneWith(this.#e.node,{concurrently:!0,withNoData:!1})})}withData(){return new t({...this.#e,node:Xt.cloneWith(this.#e.node,{withNoData:!1})})}withNoData(){return new t({...this.#e,node:Xt.cloneWith(this.#e.node,{withNoData:!0,concurrently:!1})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var yi=class t{#e;constructor(e){this.#e=e}createTable(e){return new ni({queryId:C(),executor:this.#e,node:_.create(b(e))})}dropTable(e){return new ui({queryId:C(),executor:this.#e,node:nr.create(b(e))})}createIndex(e){return new ii({queryId:C(),executor:this.#e,node:ve.create(e)})}dropIndex(e){return new si({queryId:C(),executor:this.#e,node:Xe.create(e)})}createSchema(e){return new oi({queryId:C(),executor:this.#e,node:Or.create(e)})}dropSchema(e){return new ai({queryId:C(),executor:this.#e,node:or.create(e)})}alterTable(e){return new ri({queryId:C(),executor:this.#e,node:v.create(b(e))})}createView(e){return new pi({queryId:C(),executor:this.#e,node:Ae.create(e)})}refreshMaterializedView(e){return new Ni({queryId:C(),executor:this.#e,node:Xt.create(e)})}dropView(e){return new hi({queryId:C(),executor:this.#e,node:Yt.create(e)})}createType(e){return new mi({queryId:C(),executor:this.#e,node:ci.create(wo(e))})}dropType(e){return new fi({queryId:C(),executor:this.#e,node:li.create(wo(e))})}withPlugin(e){return new t(this.#e.withPlugin(e))}withoutPlugins(){return new t(this.#e.withoutPlugins())}withSchema(e){return new t(this.#e.withPluginAtFront(new Oe(e)))}};var xi=class{ref(e){return new Cr(e)}table(e){return new Zr(e)}};var wi=class{#e;constructor(e){this.#e=e}async provideConnection(e){let r=await this.#e.acquireConnection();try{return await e(r)}finally{await this.#e.releaseConnection(r)}}};var gi=class t extends Lt{#e;#t;#r;constructor(e,r,o,n=[]){super(n),this.#e=e,this.#t=r,this.#r=o}get adapter(){return this.#t}compileQuery(e,r){return this.#e.compileQuery(e,r)}provideConnection(e){return this.#r.provideConnection(e)}withPlugins(e){return new t(this.#e,this.#t,this.#r,[...this.plugins,...e])}withPlugin(e){return new t(this.#e,this.#t,this.#r,[...this.plugins,e])}withPluginAtFront(e){return new t(this.#e,this.#t,this.#r,[e,...this.plugins])}withConnectionProvider(e){return new t(this.#e,this.#t,e,[...this.plugins])}withoutPlugins(){return new t(this.#e,this.#t,this.#r,[])}};function Oi(){return typeof performance<"u"&&q(performance.now)?performance.now():Date.now()}var vi=class{#e;#t;#r;#o;#n;#a=new WeakSet;constructor(e,r){this.#o=!1,this.#e=e,this.#t=r}async init(){if(this.#n)throw new Error("driver has already been destroyed");this.#r||(this.#r=this.#e.init().then(()=>{this.#o=!0}).catch(e=>(this.#r=void 0,Promise.reject(e)))),await this.#r}async acquireConnection(){if(this.#n)throw new Error("driver has already been destroyed");this.#o||await this.init();let e=await this.#e.acquireConnection();return this.#a.has(e)||(this.#d()&&this.#i(e),this.#a.add(e)),e}async releaseConnection(e){await this.#e.releaseConnection(e)}beginTransaction(e,r){return this.#e.beginTransaction(e,r)}commitTransaction(e){return this.#e.commitTransaction(e)}rollbackTransaction(e){return this.#e.rollbackTransaction(e)}savepoint(e,r,o){if(this.#e.savepoint)return this.#e.savepoint(e,r,o);throw new Error("The `savepoint` method is not supported by this driver")}rollbackToSavepoint(e,r,o){if(this.#e.rollbackToSavepoint)return this.#e.rollbackToSavepoint(e,r,o);throw new Error("The `rollbackToSavepoint` method is not supported by this driver")}releaseSavepoint(e,r,o){if(this.#e.releaseSavepoint)return this.#e.releaseSavepoint(e,r,o);throw new Error("The `releaseSavepoint` method is not supported by this driver")}async destroy(){this.#r&&(await this.#r,this.#n||(this.#n=this.#e.destroy().catch(e=>(this.#n=void 0,Promise.reject(e)))),await this.#n)}#d(){return this.#t.isLevelEnabled("query")||this.#t.isLevelEnabled("error")}#i(e){let r=e.executeQuery,o=e.streamQuery,n=this;e.executeQuery=async s=>{let a,c=Oi();try{return await r.call(e,s)}catch(g){throw a=g,await n.#s(g,s,c),g}finally{a||await n.#u(s,c)}},e.streamQuery=async function*(s,a){let c,g=Oi();try{for await(let w of o.call(e,s,a))yield w}catch(w){throw c=w,await n.#s(w,s,g),w}finally{c||await n.#u(s,g,!0)}}}async#s(e,r,o){await this.#t.error(()=>({level:"error",error:e,query:r,queryDurationMillis:this.#p(o)}))}async#u(e,r,o=!1){await this.#t.query(()=>({level:"query",isStream:o,query:e,queryDurationMillis:this.#p(r)}))}#p(e){return Oi()-e}};var bs=()=>{},Zt=class{#e;#t;constructor(e){this.#e=e}async provideConnection(e){for(;this.#t;)await this.#t.catch(bs);return this.#t=this.#r(e).finally(()=>{this.#t=void 0}),this.#t}async#r(e){return await e(this.#e)}};var Cs=["read only","read write"],Ws=["read uncommitted","read committed","repeatable read","serializable","snapshot"];function go(t){if(t.accessMode&&!Cs.includes(t.accessMode))throw new Error(`invalid transaction access mode ${t.accessMode}`);if(t.isolationLevel&&!Ws.includes(t.isolationLevel))throw new Error(`invalid transaction isolation level ${t.isolationLevel}`)}var Ss=["query","error"],_O=i(Ss),bi=class{#e;#t;constructor(e){q(e)?(this.#t=e,this.#e=i({query:!0,error:!0})):(this.#t=Ts,this.#e=i({query:e.includes("query"),error:e.includes("error")}))}isLevelEnabled(e){return this.#e[e]}async query(e){this.#e.query&&await this.#t(e())}async error(e){this.#e.error&&await this.#t(e())}};function Ts(t){if(t.level==="query"){let e=`kysely:query:${t.isStream?"stream:":""}`;console.log(`${e} ${t.query.sql}`),console.log(`${e} duration: ${t.queryDurationMillis.toFixed(1)}ms`)}else t.level==="error"&&(t.error instanceof Error?console.error(`kysely:error: ${t.error.stack??t.error.message}`):console.error(`kysely:error: ${JSON.stringify({error:t.error,query:t.query.sql,queryDurationMillis:t.queryDurationMillis})}`))}function qn(t){return K(t)&&q(t.compile)}Symbol.asyncDispose??=Symbol("Symbol.asyncDispose");var _t=class t extends qt{#e;constructor(e){let r,o;if(ks(e))r={executor:e.executor},o={...e};else{let n=e.dialect,s=n.createDriver(),a=n.createQueryCompiler(),c=n.createAdapter(),g=new bi(e.log??[]),w=new vi(s,g),te=new wi(w),M=new gi(a,c,te,e.plugins??[]);r={executor:M},o={config:e,executor:M,dialect:n,driver:w}}super(r),this.#e=i(o)}get schema(){return new yi(this.#e.executor)}get dynamic(){return new xi}get introspection(){return this.#e.dialect.createIntrospector(this.withoutPlugins())}case(e){return new Mt({node:Ne.create(pe(e)?void 0:de(e))})}get fn(){return Hr()}transaction(){return new vo({...this.#e})}startTransaction(){return new bo({...this.#e})}connection(){return new Oo({...this.#e})}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new Oe(e))})}withTables(){return new t({...this.#e})}async destroy(){await this.#e.driver.destroy()}get isTransaction(){return!1}getExecutor(){return this.#e.executor}executeQuery(e,r){r!==void 0&&Ie("Passing `queryId` in `db.executeQuery` is deprecated and will result in a compile-time error in the future.");let o=qn(e)?e.compile():e;return this.getExecutor().executeQuery(o)}async[Symbol.asyncDispose](){await this.destroy()}},Ci=class t extends _t{#e;constructor(e){super(e),this.#e=e}get isTransaction(){return!0}transaction(){throw new Error("calling the transaction method for a Transaction is not supported")}connection(){throw new Error("calling the connection method for a Transaction is not supported")}async destroy(){throw new Error("calling the destroy method for a Transaction is not supported")}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new Oe(e))})}withTables(){return new t({...this.#e})}};function ks(t){return K(t)&&K(t.config)&&K(t.driver)&&K(t.executor)&&K(t.dialect)}var Oo=class{#e;constructor(e){this.#e=i(e)}async execute(e){return this.#e.executor.provideConnection(async r=>{let o=this.#e.executor.withConnectionProvider(new Zt(r)),n=new _t({...this.#e,executor:o});return await e(n)})}},vo=class t{#e;constructor(e){this.#e=i(e)}setAccessMode(e){return new t({...this.#e,accessMode:e})}setIsolationLevel(e){return new t({...this.#e,isolationLevel:e})}async execute(e){let{isolationLevel:r,accessMode:o,...n}=this.#e,s={isolationLevel:r,accessMode:o};return go(s),this.#e.executor.provideConnection(async a=>{let c=this.#e.executor.withConnectionProvider(new Zt(a)),g=new Ci({...n,executor:c}),w=!1;try{await this.#e.driver.beginTransaction(a,s),w=!0;let te=await e(g);return await this.#e.driver.commitTransaction(a),te}catch(te){throw w&&await this.#e.driver.rollbackTransaction(a),te}})}},bo=class t{#e;constructor(e){this.#e=i(e)}setAccessMode(e){return new t({...this.#e,accessMode:e})}setIsolationLevel(e){return new t({...this.#e,isolationLevel:e})}async execute(){let{isolationLevel:e,accessMode:r,...o}=this.#e,n={isolationLevel:e,accessMode:r};go(n);let s=await Vr(this.#e.executor);return await this.#e.driver.beginTransaction(s.connection,n),new Co({...o,connection:s,executor:this.#e.executor.withConnectionProvider(new Zt(s.connection))})}},Co=class t extends Ci{#e;#t;#r;constructor(e){let r={isCommitted:!1,isRolledBack:!1};e={...e,executor:new Wo(e.executor,r)};let{connection:o,...n}=e;super(n),this.#e=i(e),this.#r=r;let s=C();this.#t=a=>e.executor.compileQuery(a,s)}get isCommitted(){return this.#r.isCommitted}get isRolledBack(){return this.#r.isRolledBack}commit(){return wt(this.#r),new xt(async()=>{await this.#e.driver.commitTransaction(this.#e.connection.connection),this.#r.isCommitted=!0,this.#e.connection.release()})}rollback(){return wt(this.#r),new xt(async()=>{await this.#e.driver.rollbackTransaction(this.#e.connection.connection),this.#r.isRolledBack=!0,this.#e.connection.release()})}savepoint(e){return wt(this.#r),new xt(async()=>(await this.#e.driver.savepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}rollbackToSavepoint(e){return wt(this.#r),new xt(async()=>(await this.#e.driver.rollbackToSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}releaseSavepoint(e){return wt(this.#r),new xt(async()=>(await this.#e.driver.releaseSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new Oe(e))})}withTables(){return new t({...this.#e})}},xt=class{#e;constructor(e){this.#e=e}async execute(){return await this.#e()}};function wt(t){if(t.isCommitted)throw new Error("Transaction is already committed");if(t.isRolledBack)throw new Error("Transaction is already rolled back")}var Wo=class t{#e;#t;constructor(e,r){e instanceof t?this.#e=e.#e:this.#e=e,this.#t=r}get adapter(){return this.#e.adapter}get plugins(){return this.#e.plugins}transformQuery(e,r){return this.#e.transformQuery(e,r)}compileQuery(e,r){return this.#e.compileQuery(e,r)}provideConnection(e){return this.#e.provideConnection(e)}executeQuery(e){return wt(this.#t),this.#e.executeQuery(e)}stream(e,r){return wt(this.#t),this.#e.stream(e,r)}withConnectionProvider(e){return new t(this.#e.withConnectionProvider(e),this.#t)}withPlugin(e){return new t(this.#e.withPlugin(e),this.#t)}withPlugins(e){return new t(this.#e.withPlugins(e),this.#t)}withPluginAtFront(e){return new t(this.#e.withPluginAtFront(e),this.#t)}withoutPlugins(){return new t(this.#e.withoutPlugins(),this.#t)}};var So=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}get isRawBuilder(){return!0}as(e){return new To(this,e)}$castTo(){return new t({...this.#e})}$notNull(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,plugins:this.#e.plugins!==void 0?i([...this.#e.plugins,e]):i([e])})}toOperationNode(){return this.#r(this.#t())}compile(e){return this.#o(this.#t(e))}async execute(e){let r=this.#t(e);return r.executeQuery(this.#o(r))}#t(e){let r=e!==void 0?e.getExecutor():it;return this.#e.plugins!==void 0?r.withPlugins(this.#e.plugins):r}#r(e){return e.transformQuery(this.#e.rawNode,this.#e.queryId)}#o(e){return e.compileQuery(this.#r(e),this.#e.queryId)}};function je(t){return new So(t)}var To=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}get rawBuilder(){return this.#e}toOperationNode(){return U.create(this.#e.toOperationNode(),D(this.#t)?this.#t.toOperationNode():l.create(this.#t))}};var F=Object.assign((t,...e)=>je({queryId:C(),rawNode:T.create(t,e?.map(Bn)??[])}),{ref(t){return je({queryId:C(),rawNode:T.createWithChild(ce(t))})},val(t){return je({queryId:C(),rawNode:T.createWithChild(k(t))})},value(t){return this.val(t)},table(t){return je({queryId:C(),rawNode:T.createWithChild(b(t))})},id(...t){let e=new Array(t.length+1).fill(".");return e[0]="",e[e.length-1]="",je({queryId:C(),rawNode:T.create(e,t.map(l.create))})},lit(t){return je({queryId:C(),rawNode:T.createWithChild(P.createImmediate(t))})},literal(t){return this.lit(t)},raw(t){return je({queryId:C(),rawNode:T.createWithSql(t)})},join(t,e=F`, `){let r=new Array(Math.max(2*t.length-1,0)),o=e.toOperationNode();for(let n=0;n<t.length;++n)r[2*n]=Bn(t[n]),n!==t.length-1&&(r[2*n+1]=o);return je({queryId:C(),rawNode:T.createWithChildren(r)})}});function Bn(t){return D(t)?t.toOperationNode():k(t)}var Wi=class{nodeStack=[];get parentNode(){return this.nodeStack[this.nodeStack.length-2]}#e=i({AliasNode:this.visitAlias.bind(this),ColumnNode:this.visitColumn.bind(this),IdentifierNode:this.visitIdentifier.bind(this),SchemableIdentifierNode:this.visitSchemableIdentifier.bind(this),RawNode:this.visitRaw.bind(this),ReferenceNode:this.visitReference.bind(this),SelectQueryNode:this.visitSelectQuery.bind(this),SelectionNode:this.visitSelection.bind(this),TableNode:this.visitTable.bind(this),FromNode:this.visitFrom.bind(this),SelectAllNode:this.visitSelectAll.bind(this),AndNode:this.visitAnd.bind(this),OrNode:this.visitOr.bind(this),ValueNode:this.visitValue.bind(this),ValueListNode:this.visitValueList.bind(this),PrimitiveValueListNode:this.visitPrimitiveValueList.bind(this),ParensNode:this.visitParens.bind(this),JoinNode:this.visitJoin.bind(this),OperatorNode:this.visitOperator.bind(this),WhereNode:this.visitWhere.bind(this),InsertQueryNode:this.visitInsertQuery.bind(this),DeleteQueryNode:this.visitDeleteQuery.bind(this),ReturningNode:this.visitReturning.bind(this),CreateTableNode:this.visitCreateTable.bind(this),AddColumnNode:this.visitAddColumn.bind(this),ColumnDefinitionNode:this.visitColumnDefinition.bind(this),DropTableNode:this.visitDropTable.bind(this),DataTypeNode:this.visitDataType.bind(this),OrderByNode:this.visitOrderBy.bind(this),OrderByItemNode:this.visitOrderByItem.bind(this),GroupByNode:this.visitGroupBy.bind(this),GroupByItemNode:this.visitGroupByItem.bind(this),UpdateQueryNode:this.visitUpdateQuery.bind(this),ColumnUpdateNode:this.visitColumnUpdate.bind(this),LimitNode:this.visitLimit.bind(this),OffsetNode:this.visitOffset.bind(this),OnConflictNode:this.visitOnConflict.bind(this),OnDuplicateKeyNode:this.visitOnDuplicateKey.bind(this),CreateIndexNode:this.visitCreateIndex.bind(this),DropIndexNode:this.visitDropIndex.bind(this),ListNode:this.visitList.bind(this),PrimaryKeyConstraintNode:this.visitPrimaryKeyConstraint.bind(this),UniqueConstraintNode:this.visitUniqueConstraint.bind(this),ReferencesNode:this.visitReferences.bind(this),CheckConstraintNode:this.visitCheckConstraint.bind(this),WithNode:this.visitWith.bind(this),CommonTableExpressionNode:this.visitCommonTableExpression.bind(this),CommonTableExpressionNameNode:this.visitCommonTableExpressionName.bind(this),HavingNode:this.visitHaving.bind(this),CreateSchemaNode:this.visitCreateSchema.bind(this),DropSchemaNode:this.visitDropSchema.bind(this),AlterTableNode:this.visitAlterTable.bind(this),DropColumnNode:this.visitDropColumn.bind(this),RenameColumnNode:this.visitRenameColumn.bind(this),AlterColumnNode:this.visitAlterColumn.bind(this),ModifyColumnNode:this.visitModifyColumn.bind(this),AddConstraintNode:this.visitAddConstraint.bind(this),DropConstraintNode:this.visitDropConstraint.bind(this),RenameConstraintNode:this.visitRenameConstraint.bind(this),ForeignKeyConstraintNode:this.visitForeignKeyConstraint.bind(this),CreateViewNode:this.visitCreateView.bind(this),RefreshMaterializedViewNode:this.visitRefreshMaterializedView.bind(this),DropViewNode:this.visitDropView.bind(this),GeneratedNode:this.visitGenerated.bind(this),DefaultValueNode:this.visitDefaultValue.bind(this),OnNode:this.visitOn.bind(this),ValuesNode:this.visitValues.bind(this),SelectModifierNode:this.visitSelectModifier.bind(this),CreateTypeNode:this.visitCreateType.bind(this),DropTypeNode:this.visitDropType.bind(this),ExplainNode:this.visitExplain.bind(this),DefaultInsertValueNode:this.visitDefaultInsertValue.bind(this),AggregateFunctionNode:this.visitAggregateFunction.bind(this),OverNode:this.visitOver.bind(this),PartitionByNode:this.visitPartitionBy.bind(this),PartitionByItemNode:this.visitPartitionByItem.bind(this),SetOperationNode:this.visitSetOperation.bind(this),BinaryOperationNode:this.visitBinaryOperation.bind(this),UnaryOperationNode:this.visitUnaryOperation.bind(this),UsingNode:this.visitUsing.bind(this),FunctionNode:this.visitFunction.bind(this),CaseNode:this.visitCase.bind(this),WhenNode:this.visitWhen.bind(this),JSONReferenceNode:this.visitJSONReference.bind(this),JSONPathNode:this.visitJSONPath.bind(this),JSONPathLegNode:this.visitJSONPathLeg.bind(this),JSONOperatorChainNode:this.visitJSONOperatorChain.bind(this),TupleNode:this.visitTuple.bind(this),MergeQueryNode:this.visitMergeQuery.bind(this),MatchedNode:this.visitMatched.bind(this),AddIndexNode:this.visitAddIndex.bind(this),CastNode:this.visitCast.bind(this),FetchNode:this.visitFetch.bind(this),TopNode:this.visitTop.bind(this),OutputNode:this.visitOutput.bind(this),OrActionNode:this.visitOrAction.bind(this),CollateNode:this.visitCollate.bind(this)});visitNode=e=>{this.nodeStack.push(e),this.#e[e.kind](e),this.nodeStack.pop()}};var Es=/'/g,st=class extends Wi{#e="";#t=[];get numParameters(){return this.#t.length}compileQuery(e,r){return this.#e="",this.#t=[],this.nodeStack.splice(0,this.nodeStack.length),this.visitNode(e),i({query:e,queryId:r,sql:this.getSql(),parameters:[...this.#t]})}getSql(){return this.#e}visitSelectQuery(e){let r=this.parentNode!==void 0&&!le.is(this.parentNode)&&!B.is(this.parentNode)&&!_.is(this.parentNode)&&!Ae.is(this.parentNode)&&!Kr.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("select"),e.distinctOn&&(this.append(" "),this.compileDistinctOn(e.distinctOn)),e.frontModifiers?.length&&(this.append(" "),this.compileList(e.frontModifiers," ")),e.top&&(this.append(" "),this.visitNode(e.top)),e.selections&&(this.append(" "),this.compileList(e.selections)),e.from&&(this.append(" "),this.visitNode(e.from)),e.joins&&(this.append(" "),this.compileList(e.joins," ")),e.where&&(this.append(" "),this.visitNode(e.where)),e.groupBy&&(this.append(" "),this.visitNode(e.groupBy)),e.having&&(this.append(" "),this.visitNode(e.having)),e.setOperations&&(this.append(" "),this.compileList(e.setOperations," ")),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.offset&&(this.append(" "),this.visitNode(e.offset)),e.fetch&&(this.append(" "),this.visitNode(e.fetch)),e.endModifiers?.length&&(this.append(" "),this.compileList(this.sortSelectModifiers([...e.endModifiers])," ")),r&&this.append(")")}visitFrom(e){this.append("from "),this.compileList(e.froms)}visitSelection(e){this.visitNode(e.selection)}visitColumn(e){this.visitNode(e.column)}compileDistinctOn(e){this.append("distinct on ("),this.compileList(e),this.append(")")}compileList(e,r=", "){let o=e.length-1;for(let n=0;n<=o;n++)this.visitNode(e[n]),n<o&&this.append(r)}visitWhere(e){this.append("where "),this.visitNode(e.where)}visitHaving(e){this.append("having "),this.visitNode(e.having)}visitInsertQuery(e){let r=this.parentNode!==void 0&&!le.is(this.parentNode)&&!T.is(this.parentNode)&&!we.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append(e.replace?"replace":"insert"),e.ignore&&(Ie("`InsertQueryNode.ignore` is deprecated. Use `InsertQueryNode.orAction` instead."),this.append(" ignore")),e.orAction&&(this.append(" "),this.visitNode(e.orAction)),e.top&&(this.append(" "),this.visitNode(e.top)),e.into&&(this.append(" into "),this.visitNode(e.into)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.output&&(this.append(" "),this.visitNode(e.output)),e.values&&(this.append(" "),this.visitNode(e.values)),e.defaultValues&&(this.append(" "),this.append("default values")),e.onConflict&&(this.append(" "),this.visitNode(e.onConflict)),e.onDuplicateKey&&(this.append(" "),this.visitNode(e.onDuplicateKey)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitValues(e){this.append("values "),this.compileList(e.values)}visitDeleteQuery(e){let r=this.parentNode!==void 0&&!le.is(this.parentNode)&&!T.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("delete "),e.top&&(this.visitNode(e.top),this.append(" ")),this.visitNode(e.from),e.output&&(this.append(" "),this.visitNode(e.output)),e.using&&(this.append(" "),this.visitNode(e.using)),e.joins&&(this.append(" "),this.compileList(e.joins," ")),e.where&&(this.append(" "),this.visitNode(e.where)),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitReturning(e){this.append("returning "),this.compileList(e.selections)}visitAlias(e){this.visitNode(e.node),this.append(" as "),this.visitNode(e.alias)}visitReference(e){e.table&&(this.visitNode(e.table),this.append(".")),this.visitNode(e.column)}visitSelectAll(e){this.append("*")}visitIdentifier(e){this.append(this.getLeftIdentifierWrapper()),this.compileUnwrappedIdentifier(e),this.append(this.getRightIdentifierWrapper())}compileUnwrappedIdentifier(e){if(!L(e.name))throw new Error("a non-string identifier was passed to compileUnwrappedIdentifier.");this.append(this.sanitizeIdentifier(e.name))}visitAnd(e){this.visitNode(e.left),this.append(" and "),this.visitNode(e.right)}visitOr(e){this.visitNode(e.left),this.append(" or "),this.visitNode(e.right)}visitValue(e){e.immediate?this.appendImmediateValue(e.value):this.appendValue(e.value)}visitValueList(e){this.append("("),this.compileList(e.values),this.append(")")}visitTuple(e){this.append("("),this.compileList(e.values),this.append(")")}visitPrimitiveValueList(e){this.append("(");let{values:r}=e;for(let o=0;o<r.length;++o)this.appendValue(r[o]),o!==r.length-1&&this.append(", ");this.append(")")}visitParens(e){this.append("("),this.visitNode(e.node),this.append(")")}visitJoin(e){this.append(Ds[e.joinType]),this.append(" "),this.visitNode(e.table),e.on&&(this.append(" "),this.visitNode(e.on))}visitOn(e){this.append("on "),this.visitNode(e.on)}visitRaw(e){let{sqlFragments:r,parameters:o}=e;for(let n=0;n<r.length;++n)this.append(r[n]),o.length>n&&this.visitNode(o[n])}visitOperator(e){this.append(e.operator)}visitTable(e){this.visitNode(e.table)}visitSchemableIdentifier(e){e.schema&&(this.visitNode(e.schema),this.append(".")),this.visitNode(e.identifier)}visitCreateTable(e){this.append("create "),e.frontModifiers&&e.frontModifiers.length>0&&(this.compileList(e.frontModifiers," "),this.append(" ")),e.temporary&&this.append("temporary "),this.append("table "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.table),e.selectQuery?(this.append(" as "),this.visitNode(e.selectQuery)):(this.append(" ("),this.compileList([...e.columns,...e.constraints??[]]),this.append(")"),e.onCommit&&(this.append(" on commit "),this.append(e.onCommit)),e.endModifiers&&e.endModifiers.length>0&&(this.append(" "),this.compileList(e.endModifiers," ")))}visitColumnDefinition(e){e.ifNotExists&&this.append("if not exists "),this.visitNode(e.column),this.append(" "),this.visitNode(e.dataType),e.unsigned&&this.append(" unsigned"),e.frontModifiers&&e.frontModifiers.length>0&&(this.append(" "),this.compileList(e.frontModifiers," ")),e.generated&&(this.append(" "),this.visitNode(e.generated)),e.identity&&this.append(" identity"),e.defaultTo&&(this.append(" "),this.visitNode(e.defaultTo)),e.notNull&&this.append(" not null"),e.unique&&this.append(" unique"),e.nullsNotDistinct&&this.append(" nulls not distinct"),e.primaryKey&&this.append(" primary key"),e.autoIncrement&&(this.append(" "),this.append(this.getAutoIncrement())),e.references&&(this.append(" "),this.visitNode(e.references)),e.check&&(this.append(" "),this.visitNode(e.check)),e.endModifiers&&e.endModifiers.length>0&&(this.append(" "),this.compileList(e.endModifiers," "))}getAutoIncrement(){return"auto_increment"}visitReferences(e){this.append("references "),this.visitNode(e.table),this.append(" ("),this.compileList(e.columns),this.append(")"),e.onDelete&&(this.append(" on delete "),this.append(e.onDelete)),e.onUpdate&&(this.append(" on update "),this.append(e.onUpdate))}visitDropTable(e){this.append("drop table "),e.ifExists&&this.append("if exists "),this.visitNode(e.table),e.cascade&&this.append(" cascade")}visitDataType(e){this.append(e.dataType)}visitOrderBy(e){this.append("order by "),this.compileList(e.items)}visitOrderByItem(e){this.visitNode(e.orderBy),e.collation&&(this.append(" "),this.visitNode(e.collation)),e.direction&&(this.append(" "),this.visitNode(e.direction)),e.nulls&&(this.append(" nulls "),this.append(e.nulls))}visitGroupBy(e){this.append("group by "),this.compileList(e.items)}visitGroupByItem(e){this.visitNode(e.groupBy)}visitUpdateQuery(e){let r=this.parentNode!==void 0&&!le.is(this.parentNode)&&!T.is(this.parentNode)&&!we.is(this.parentNode);if(this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("update "),e.top&&(this.visitNode(e.top),this.append(" ")),e.table&&(this.visitNode(e.table),this.append(" ")),this.append("set "),e.updates&&this.compileList(e.updates),e.output&&(this.append(" "),this.visitNode(e.output)),e.from&&(this.append(" "),this.visitNode(e.from)),e.joins){if(!e.from)throw new Error("Joins in an update query are only supported as a part of a PostgreSQL 'update set from join' query. If you want to create a MySQL 'update join set' query, see https://kysely.dev/docs/examples/update/my-sql-joins");this.append(" "),this.compileList(e.joins," ")}e.where&&(this.append(" "),this.visitNode(e.where)),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitColumnUpdate(e){this.visitNode(e.column),this.append(" = "),this.visitNode(e.value)}visitLimit(e){this.append("limit "),this.visitNode(e.limit)}visitOffset(e){this.append("offset "),this.visitNode(e.offset)}visitOnConflict(e){this.append("on conflict"),e.columns?(this.append(" ("),this.compileList(e.columns),this.append(")")):e.constraint?(this.append(" on constraint "),this.visitNode(e.constraint)):e.indexExpression&&(this.append(" ("),this.visitNode(e.indexExpression),this.append(")")),e.indexWhere&&(this.append(" "),this.visitNode(e.indexWhere)),e.doNothing===!0?this.append(" do nothing"):e.updates&&(this.append(" do update set "),this.compileList(e.updates),e.updateWhere&&(this.append(" "),this.visitNode(e.updateWhere)))}visitOnDuplicateKey(e){this.append("on duplicate key update "),this.compileList(e.updates)}visitCreateIndex(e){this.append("create "),e.unique&&this.append("unique "),this.append("index "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),e.table&&(this.append(" on "),this.visitNode(e.table)),e.using&&(this.append(" using "),this.visitNode(e.using)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.nullsNotDistinct&&this.append(" nulls not distinct"),e.where&&(this.append(" "),this.visitNode(e.where))}visitDropIndex(e){this.append("drop index "),e.ifExists&&this.append("if exists "),this.visitNode(e.name),e.table&&(this.append(" on "),this.visitNode(e.table)),e.cascade&&this.append(" cascade")}visitCreateSchema(e){this.append("create schema "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.schema)}visitDropSchema(e){this.append("drop schema "),e.ifExists&&this.append("if exists "),this.visitNode(e.schema),e.cascade&&this.append(" cascade")}visitPrimaryKeyConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("primary key ("),this.compileList(e.columns),this.append(")"),this.buildDeferrable(e)}buildDeferrable(e){e.deferrable!==void 0&&(e.deferrable?this.append(" deferrable"):this.append(" not deferrable")),e.initiallyDeferred!==void 0&&(e.initiallyDeferred?this.append(" initially deferred"):this.append(" initially immediate"))}visitUniqueConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("unique"),e.nullsNotDistinct&&this.append(" nulls not distinct"),this.append(" ("),this.compileList(e.columns),this.append(")"),this.buildDeferrable(e)}visitCheckConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("check ("),this.visitNode(e.expression),this.append(")")}visitForeignKeyConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("foreign key ("),this.compileList(e.columns),this.append(") "),this.visitNode(e.references),e.onDelete&&(this.append(" on delete "),this.append(e.onDelete)),e.onUpdate&&(this.append(" on update "),this.append(e.onUpdate)),this.buildDeferrable(e)}visitList(e){this.compileList(e.items)}visitWith(e){this.append("with "),e.recursive&&this.append("recursive "),this.compileList(e.expressions)}visitCommonTableExpression(e){this.visitNode(e.name),this.append(" as "),ht(e.materialized)&&(e.materialized||this.append("not "),this.append("materialized ")),this.visitNode(e.expression)}visitCommonTableExpressionName(e){this.visitNode(e.table),e.columns&&(this.append("("),this.compileList(e.columns),this.append(")"))}visitAlterTable(e){this.append("alter table "),this.visitNode(e.table),this.append(" "),e.renameTo&&(this.append("rename to "),this.visitNode(e.renameTo)),e.setSchema&&(this.append("set schema "),this.visitNode(e.setSchema)),e.addConstraint&&this.visitNode(e.addConstraint),e.dropConstraint&&this.visitNode(e.dropConstraint),e.renameConstraint&&this.visitNode(e.renameConstraint),e.columnAlterations&&this.compileColumnAlterations(e.columnAlterations),e.addIndex&&this.visitNode(e.addIndex),e.dropIndex&&this.visitNode(e.dropIndex)}visitAddColumn(e){this.append("add column "),this.visitNode(e.column)}visitRenameColumn(e){this.append("rename column "),this.visitNode(e.column),this.append(" to "),this.visitNode(e.renameTo)}visitDropColumn(e){this.append("drop column "),this.visitNode(e.column)}visitAlterColumn(e){this.append("alter column "),this.visitNode(e.column),this.append(" "),e.dataType&&(this.announcesNewColumnDataType()&&this.append("type "),this.visitNode(e.dataType),e.dataTypeExpression&&(this.append("using "),this.visitNode(e.dataTypeExpression))),e.setDefault&&(this.append("set default "),this.visitNode(e.setDefault)),e.dropDefault&&this.append("drop default"),e.setNotNull&&this.append("set not null"),e.dropNotNull&&this.append("drop not null")}visitModifyColumn(e){this.append("modify column "),this.visitNode(e.column)}visitAddConstraint(e){this.append("add "),this.visitNode(e.constraint)}visitDropConstraint(e){this.append("drop constraint "),e.ifExists&&this.append("if exists "),this.visitNode(e.constraintName),e.modifier==="cascade"?this.append(" cascade"):e.modifier==="restrict"&&this.append(" restrict")}visitRenameConstraint(e){this.append("rename constraint "),this.visitNode(e.oldName),this.append(" to "),this.visitNode(e.newName)}visitSetOperation(e){this.append(e.operator),this.append(" "),e.all&&this.append("all "),this.visitNode(e.expression)}visitCreateView(e){this.append("create "),e.orReplace&&this.append("or replace "),e.materialized&&this.append("materialized "),e.temporary&&this.append("temporary "),this.append("view "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),this.append(" "),e.columns&&(this.append("("),this.compileList(e.columns),this.append(") ")),e.as&&(this.append("as "),this.visitNode(e.as))}visitRefreshMaterializedView(e){this.append("refresh materialized view "),e.concurrently&&this.append("concurrently "),this.visitNode(e.name),e.withNoData?this.append(" with no data"):this.append(" with data")}visitDropView(e){this.append("drop "),e.materialized&&this.append("materialized "),this.append("view "),e.ifExists&&this.append("if exists "),this.visitNode(e.name),e.cascade&&this.append(" cascade")}visitGenerated(e){this.append("generated "),e.always&&this.append("always "),e.byDefault&&this.append("by default "),this.append("as "),e.identity&&this.append("identity"),e.expression&&(this.append("("),this.visitNode(e.expression),this.append(")")),e.stored&&this.append(" stored")}visitDefaultValue(e){this.append("default "),this.visitNode(e.defaultValue)}visitSelectModifier(e){e.rawModifier?this.visitNode(e.rawModifier):this.append(As[e.modifier]),e.of&&(this.append(" of "),this.compileList(e.of,", "))}visitCreateType(e){this.append("create type "),this.visitNode(e.name),e.enum&&(this.append(" as enum "),this.visitNode(e.enum))}visitDropType(e){this.append("drop type "),e.ifExists&&this.append("if exists "),this.visitNode(e.name)}visitExplain(e){this.append("explain"),(e.options||e.format)&&(this.append(" "),this.append(this.getLeftExplainOptionsWrapper()),e.options&&(this.visitNode(e.options),e.format&&this.append(this.getExplainOptionsDelimiter())),e.format&&(this.append("format"),this.append(this.getExplainOptionAssignment()),this.append(e.format)),this.append(this.getRightExplainOptionsWrapper()))}visitDefaultInsertValue(e){this.append("default")}visitAggregateFunction(e){this.append(e.func),this.append("("),e.distinct&&this.append("distinct "),this.compileList(e.aggregated),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),this.append(")"),e.withinGroup&&(this.append(" within group ("),this.visitNode(e.withinGroup),this.append(")")),e.filter&&(this.append(" filter("),this.visitNode(e.filter),this.append(")")),e.over&&(this.append(" "),this.visitNode(e.over))}visitOver(e){this.append("over("),e.partitionBy&&(this.visitNode(e.partitionBy),e.orderBy&&this.append(" ")),e.orderBy&&this.visitNode(e.orderBy),this.append(")")}visitPartitionBy(e){this.append("partition by "),this.compileList(e.items)}visitPartitionByItem(e){this.visitNode(e.partitionBy)}visitBinaryOperation(e){this.visitNode(e.leftOperand),this.append(" "),this.visitNode(e.operator),this.append(" "),this.visitNode(e.rightOperand)}visitUnaryOperation(e){this.visitNode(e.operator),this.isMinusOperator(e.operator)||this.append(" "),this.visitNode(e.operand)}isMinusOperator(e){return he.is(e)&&e.operator==="-"}visitUsing(e){this.append("using "),this.compileList(e.tables)}visitFunction(e){this.append(e.func),this.append("("),this.compileList(e.arguments),this.append(")")}visitCase(e){this.append("case"),e.value&&(this.append(" "),this.visitNode(e.value)),e.when&&(this.append(" "),this.compileList(e.when," ")),e.else&&(this.append(" else "),this.visitNode(e.else)),this.append(" end"),e.isStatement&&this.append(" case")}visitWhen(e){this.append("when "),this.visitNode(e.condition),e.result&&(this.append(" then "),this.visitNode(e.result))}visitJSONReference(e){this.visitNode(e.reference),this.visitNode(e.traversal)}visitJSONPath(e){e.inOperator&&this.visitNode(e.inOperator),this.append("'$");for(let r of e.pathLegs)this.visitNode(r);this.append("'")}visitJSONPathLeg(e){let r=e.type==="ArrayLocation";this.append(r?"[":"."),this.append(String(e.value)),r&&this.append("]")}visitJSONOperatorChain(e){for(let r=0,o=e.values.length;r<o;r++)r===o-1?this.visitNode(e.operator):this.append("->"),this.visitNode(e.values[r])}visitMergeQuery(e){e.with&&(this.visitNode(e.with),this.append(" ")),this.append("merge "),e.top&&(this.visitNode(e.top),this.append(" ")),this.append("into "),this.visitNode(e.into),e.using&&(this.append(" "),this.visitNode(e.using)),e.whens&&(this.append(" "),this.compileList(e.whens," ")),e.returning&&(this.append(" "),this.visitNode(e.returning)),e.output&&(this.append(" "),this.visitNode(e.output)),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitMatched(e){e.not&&this.append("not "),this.append("matched"),e.bySource&&this.append(" by source")}visitAddIndex(e){this.append("add "),e.unique&&this.append("unique "),this.append("index "),this.visitNode(e.name),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.using&&(this.append(" using "),this.visitNode(e.using))}visitCast(e){this.append("cast("),this.visitNode(e.expression),this.append(" as "),this.visitNode(e.dataType),this.append(")")}visitFetch(e){this.append("fetch next "),this.visitNode(e.rowCount),this.append(` rows ${e.modifier}`)}visitOutput(e){this.append("output "),this.compileList(e.selections)}visitTop(e){this.append(`top(${e.expression})`),e.modifiers&&this.append(` ${e.modifiers}`)}visitOrAction(e){this.append(e.action)}visitCollate(e){this.append("collate "),this.visitNode(e.collation)}append(e){this.#e+=e}appendValue(e){this.addParameter(e),this.append(this.getCurrentParameterPlaceholder())}getLeftIdentifierWrapper(){return'"'}getRightIdentifierWrapper(){return'"'}getCurrentParameterPlaceholder(){return"$"+this.numParameters}getLeftExplainOptionsWrapper(){return"("}getExplainOptionAssignment(){return" "}getExplainOptionsDelimiter(){return", "}getRightExplainOptionsWrapper(){return")"}sanitizeIdentifier(e){let r=this.getLeftIdentifierWrapper(),o=this.getRightIdentifierWrapper(),n="";for(let s of e)n+=s,s===r?n+=r:s===o&&(n+=o);return n}sanitizeStringLiteral(e){return e.replace(Es,"''")}addParameter(e){this.#t.push(e)}appendImmediateValue(e){if(L(e))this.appendStringLiteral(e);else if(Ye(e)||ht(e)||bt(e))this.append(e.toString());else if(vt(e))this.append("null");else if(zo(e))this.appendImmediateValue(e.toISOString());else throw new Error(`invalid immediate value ${e}`)}appendStringLiteral(e){this.append("'"),this.append(this.sanitizeStringLiteral(e)),this.append("'")}sortSelectModifiers(e){return e.sort((r,o)=>r.modifier&&o.modifier?Mn[r.modifier]-Mn[o.modifier]:1),i(e)}compileColumnAlterations(e){this.compileList(e)}announcesNewColumnDataType(){return!0}},As=i({ForKeyShare:"for key share",ForNoKeyUpdate:"for no key update",ForUpdate:"for update",ForShare:"for share",NoWait:"nowait",SkipLocked:"skip locked",Distinct:"distinct"}),Mn=i({ForKeyShare:1,ForNoKeyUpdate:1,ForUpdate:1,ForShare:1,NoWait:2,SkipLocked:2,Distinct:0}),Ds=i({InnerJoin:"inner join",LeftJoin:"left join",RightJoin:"right join",FullJoin:"full join",CrossJoin:"cross join",LateralInnerJoin:"inner join lateral",LateralLeftJoin:"left join lateral",LateralCrossJoin:"cross join lateral",OuterApply:"outer apply",CrossApply:"cross apply",Using:"using"});var Si=class{async init(){}async acquireConnection(){return new ko}async beginTransaction(){}async commitTransaction(){}async rollbackTransaction(){}async releaseConnection(){}async destroy(){}async releaseSavepoint(){}async rollbackToSavepoint(){}async savepoint(){}},ko=class{async executeQuery(){return{rows:[]}}async*streamQuery(){}};var at=class{get supportsCreateIfNotExists(){return!0}get supportsTransactionalDdl(){return!1}get supportsReturning(){return!1}get supportsOutput(){return!1}};var Rs=/"/g,Pn=class extends st{visitOrAction(e){this.append("or "),this.append(e.action)}getCurrentParameterPlaceholder(){return"?"}getLeftExplainOptionsWrapper(){return""}getRightExplainOptionsWrapper(){return""}getLeftIdentifierWrapper(){return'"'}getRightIdentifierWrapper(){return'"'}getAutoIncrement(){return"autoincrement"}sanitizeIdentifier(e){return e.replace(Rs,'""')}visitDefaultInsertValue(e){this.append("null")}};var Qn=class extends at{get supportsTransactionalDdl(){return!1}get supportsReturning(){return!0}async acquireMigrationLock(e,r){}async releaseMigrationLock(e,r){}};var Is=/"/g,$n=class extends st{sanitizeIdentifier(e){return e.replace(Is,'""')}};var Ls=BigInt("3853314791062309107"),Fn=class extends at{get supportsTransactionalDdl(){return!0}get supportsReturning(){return!0}async acquireMigrationLock(e,r){await F`select pg_advisory_xact_lock(${F.lit(Ls)})`.execute(e)}async releaseMigrationLock(e,r){}};var qs=/`/g,zn=class extends st{getCurrentParameterPlaceholder(){return"?"}getLeftExplainOptionsWrapper(){return""}getExplainOptionAssignment(){return"="}getExplainOptionsDelimiter(){return" "}getRightExplainOptionsWrapper(){return""}getLeftIdentifierWrapper(){return"`"}getRightIdentifierWrapper(){return"`"}sanitizeIdentifier(e){return e.replace(qs,"``")}visitCreateIndex(e){this.append("create "),e.unique&&this.append("unique "),this.append("index "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),e.using&&(this.append(" using "),this.visitNode(e.using)),e.table&&(this.append(" on "),this.visitNode(e.table)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.where&&(this.append(" "),this.visitNode(e.where))}};var Vn="ea586330-2c93-47c8-908d-981d9d270f9d",Bs=3600,Un=class extends at{get supportsTransactionalDdl(){return!1}get supportsReturning(){return!1}async acquireMigrationLock(e,r){await F`select get_lock(${F.lit(Vn)}, ${F.lit(Bs)})`.execute(e)}async releaseMigrationLock(e,r){await F`select release_lock(${F.lit(Vn)})`.execute(e)}};function Jn(t){return t.trim().replace(/^where\b/i,"").trim().replace(/;+$/u,"").trim()}function dT(t){return t.trim().replace(/;+$/u,"").includes(";")}function lT(t){return new _t({dialect:{createAdapter:()=>new t.Adapter,createDriver:()=>new Si,createIntrospector:()=>null,createQueryCompiler:()=>new t.QueryCompiler},plugins:[...t.noParameters?[new Eo]:[]]})}var Eo=class{#e=new Ao;transformQuery(e){return this.#e.transformNode(e.node)}transformResult(e){return Promise.resolve(e.result)}},Ao=class extends rt{transformPrimitiveValueList(e){return Le.create(e.values.map(P.createImmediate))}transformValue(e){return{...super.transformValue(e),immediate:!0}}};function fT(t){return typeof t=="string"?{parameters:[],sql:t}:t}function NT(t,e){let r=t.compile();return{parameters:r.parameters,sql:r.sql,transformations:e?.transformations}}function yT(t,e){let r=Ms(t,e);return o=>o.where(n=>n.or(r.map(s=>n.and(s.map(([a,c])=>n(a,c===null?"is":Array.isArray(c)?"in":"=",c))))))}function xT(t,e){let r={};for(let o of Object.values(e)){let{name:n,pkPosition:s}=o;s!=null&&(r[n]=t[n]??null)}return r}function Ms(t,e){let r=[],o=[],n=oe();for(let c of t){let g=[];for(let w of Object.values(e)){let{name:te,pkPosition:M}=w;if(M==null)continue;let re=M-1;c===t.at(0)&&(r[re]=n.ref(te)),g[re]=Do(c[te]??null,w)}o.push(r.length===1?g.at(0):jn(g))}let s=r.length===1?r.at(0):jn(r),a=o.length===1?o.at(0):o;return[[[s,a]]]}function jn(t){return F`(${F.join(t,F`, `)})`}function wT(t){let{values:e}=t;return()=>Array.isArray(e)?e.map(r=>Kn({...t,values:r})):Kn({...t,values:e})}function Kn(t){let{columns:e,context:r,supportsDefaultKeyword:o,values:n}=t,s=Object.entries(n),a=r==="update"?[]:Object.values(e).filter(c=>c.isRequired);return r==="insert"&&s.length===0&&a.length===0?{[Object.keys(e).at(0)]:o?F`default`:null}:s.reduce((c,[g,w])=>({...c,[g]:Do(w,e[g],o)}),a.reduce((c,g)=>{let{datatype:w,fkColumn:te,name:M}=g,{format:re,group:f,isArray:Y}=w;return te?c:Y||f==="json"?{...c,[M]:Ri}:f==="boolean"?{...c,[M]:Fo}:f==="string"?{...c,[M]:Qo}:f==="numeric"?{...c,[M]:$o}:(f==="datetime"||f==="time")&&re?{...c,[M]:Po(re)}:c},{}))}function Do(t,e,r=!0){let{datatype:o,defaultValue:n,nullable:s}=e,a=oe();return t===null||t===""&&s?a.lit(null):(t===""||t===void 0)&&n!=null?r?F`default`:a.lit(null):o.isNative?a.val(t):a.cast(a.val(t),F.id(o.schema,o.name))}function Ps(t,e){if(t.length===0)return n=>n.lit(!0);let r=[],o=[];for(let n=0;n<t.length;n++)o.push($s(t[n],e)),(n===t.length-1||t[n].after==="or")&&(r.push(o),o=[]);return n=>{let s=r.map(a=>n.and(a.map(c=>c(n))));return n.or(s)}}var Qs=new Set(["ilike","like","not ilike","not like"]);function $s(t,e){if(t.kind==="ColumnFilter")return r=>{let{column:o,operator:n,value:s}=t,a=e[o];if(Qs.has(n)){let g=typeof s=="string"?s:String(s??"");return r(r.cast(o,"text"),n,g)}return r(a.datatype.group==="raw"?r.cast(o,"text"):o,n,Do(s,a))};if(t.kind==="SqlFilter"){let r=Jn(t.sql);return o=>r.length>0?F`(${F.raw(r)})`:o.lit(!0)}return Ps(t.filters,e)}function Fs(t){let e={blockCommentDepth:0,dollarQuoteDelimiter:"",mode:"normal"},r=[],o=0,n=0;for(;n<t.length;){let s=t[n],a=t[n+1];if(e.mode==="single-quote"){if(s==="'"&&a==="'"){n+=2;continue}s==="'"&&(e.mode="normal"),n+=1;continue}if(e.mode==="double-quote"){if(s==='"'&&a==='"'){n+=2;continue}s==='"'&&(e.mode="normal"),n+=1;continue}if(e.mode==="line-comment"){s===`
`&&(e.mode="normal"),n+=1;continue}if(e.mode==="block-comment"){if(s==="/"&&a==="*"){e.blockCommentDepth+=1,n+=2;continue}if(s==="*"&&a==="/"){e.blockCommentDepth-=1,n+=2,e.blockCommentDepth<=0&&(e.blockCommentDepth=0,e.mode="normal");continue}n+=1;continue}if(e.mode==="dollar-quote"){let c=e.dollarQuoteDelimiter;if(c&&t.startsWith(c,n)){e.dollarQuoteDelimiter="",e.mode="normal",n+=c.length;continue}n+=1;continue}if(s==="'"){e.mode="single-quote",n+=1;continue}if(s==='"'){e.mode="double-quote",n+=1;continue}if(s==="-"&&a==="-"){e.mode="line-comment",n+=2;continue}if(s==="/"&&a==="*"){e.mode="block-comment",e.blockCommentDepth=1,n+=2;continue}if(s==="$"){let c=zs(t,n);if(c){e.mode="dollar-quote",e.dollarQuoteDelimiter=c,n+=c.length;continue}}s===";"&&(Gn(t,o,n,r),o=n+1),n+=1}return Gn(t,o,t.length,r),r}function OT(t){let{sql:e}=t,r=Vs(t.cursorIndex,0,e.length),o=Fs(e);if(o.length===0)return null;for(let a of o)if(r>=a.from&&r<=a.to)return a;let n=o[0],s=Hn(r,n);for(let a of o.slice(1)){let c=Hn(r,a);c<s&&(s=c,n=a)}return n}function Gn(t,e,r,o){if(r<=e)return;let n=t.slice(e,r),s=n.trim();if(s.length===0)return;let a=n.length-n.trimStart().length,c=n.length-n.trimEnd().length,g=e+a,w=r-c;o.push({from:g,statement:s,to:w})}function Hn(t,e){return t<e.from?e.from-t:t>e.to?t-e.to:0}function zs(t,e){if(t[e]!=="$")return null;let r=e+1;for(;r<t.length;){let o=t[r];if(o==="$"){let n=t.slice(e,r+1);return n==="$$"||/^\$[A-Za-z_][A-Za-z0-9_]*\$$/.test(n)?n:null}if(!/[A-Za-z0-9_]/.test(o))return null;r+=1}return null}function Vs(t,e,r){return Math.min(r,Math.max(e,t))}export{qo as a,Po as b,Qo as c,$o as d,Fo as e,Us as f,Ri as g,Js as h,l as i,U as j,ae as k,O as l,Wt as m,P as n,W as o,oe as p,F as q,Pn as r,Qn as s,$n as t,Fn as u,zn as v,Un as w,Jn as x,dT as y,lT as z,fT as A,NT as B,yT as C,xT as D,wT as E,Ps as F,Fs as G,OT as H};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2RheWpzQDEuMTEuMTkvbm9kZV9tb2R1bGVzL2RheWpzL2RheWpzLm1pbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vZGF5anNAMS4xMS4xOS9ub2RlX21vZHVsZXMvZGF5anMvcGx1Z2luL3V0Yy5qcyIsICIuLi9kYXRhL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvb2JqZWN0LXV0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1pbmRleC1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1zY2hlbWEtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtaW5kZXgtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLXNjaGVtYS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtdGFibGUtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3RhYmxlLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3QtbW9kaWZpZXItbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vci1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29uLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcGVyYXRvci1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1hbGwtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZWZlcmVuY2Utbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktaXRlbS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbGxhdGUtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL29yZGVyLWJ5LWl0ZW0tYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2xvZy1vbmNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1yZWZlcmVuY2Utbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLW9wZXJhdG9yLWNoYWluLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcHJpbWl0aXZlLXZhbHVlLWxpc3Qtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL292ZXItbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9mcm9tLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZ3JvdXAtYnktbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9oYXZpbmctbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9pbnNlcnQtcXVlcnktbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9saXN0LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdXBkYXRlLXF1ZXJ5LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdXNpbmctbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS93aGVyZS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JldHVybmluZy1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2V4cGxhaW4tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS93aGVuLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vdXRwdXQtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvam9pbi1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1pdGVtLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3BhcnRpdGlvbi1ieS1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vdmVyLWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0aW9uLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdmFsdWVzLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZGVmYXVsdC1pbnNlcnQtdmFsdWUtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvaW5zZXJ0LXZhbHVlcy1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY29sdW1uLXVwZGF0ZS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vbi1kdXBsaWNhdGUta2V5LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9pbnNlcnQtcmVzdWx0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvbm8tcmVzdWx0LWVycm9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29uLWNvbmZsaWN0LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vbi1jb25mbGljdC1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3RvcC1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci90b3AtcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLWFjdGlvbi1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvaW5zZXJ0LXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9kZWxldGUtcmVzdWx0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9kZWxldGUtcXVlcnktYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL3VwZGF0ZS1yZXN1bHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcXVlcnktYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1uYW1lLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2N0ZS1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci93aXRoLXBhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS93aXRoLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9yYW5kb20tc3RyaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvcXVlcnktaWQuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtdHJhbnNmb3JtZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvbWF0Y2hlZC1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9tZXJnZS1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9kZWZlcnJlZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL3Byb3ZpZGUtY29udHJvbGxlZC1jb25uZWN0aW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWV4ZWN1dG9yL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktZXhlY3V0b3Ivbm9vcC1xdWVyeS1leGVjdXRvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL21lcmdlLXJlc3VsdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL21lcmdlLXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktY3JlYXRvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvcGFyc2UtdXRpbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2pvaW4tcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29mZnNldC1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2dyb3VwLWJ5LWl0ZW0tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZ3JvdXAtYnktcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3NldC1vcGVyYXRpb24tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvc2V0LW9wZXJhdGlvbi1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZmV0Y2gtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZmV0Y2gtcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWdncmVnYXRlLWZ1bmN0aW9uLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZnVuY3Rpb24tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvZnVuY3Rpb24tbW9kdWxlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3VuYXJ5LW9wZXJhdGlvbi1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Nhc2Utbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2Nhc2UtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbGVnLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9qc29uLXBhdGgtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS90dXBsZS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2RhdGEtdHlwZS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9kYXRhLXR5cGUtcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Nhc3Qtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZXhwcmVzc2lvbi1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHluYW1pYy9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZGQtY29sdW1uLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY29sdW1uLWRlZmluaXRpb24tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbHVtbi1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb2x1bW4tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jaGVjay1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlcy1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9kZWZhdWx0LXZhbHVlLXBhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9nZW5lcmF0ZWQtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LXZhbHVlLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL29uLW1vZGlmeS1hY3Rpb24tcGFyc2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jb2x1bW4tZGVmaW5pdGlvbi1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3VuaXF1ZS1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2FsdGVyLWNvbHVtbi1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9hbHRlci10YWJsZS1leGVjdXRvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtZHJvcC1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcHJpbWFyeS1rZXktY29uc3RyYWludC1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9hbHRlci10YWJsZS1hZGQtaW5kZXgtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvdW5pcXVlLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVuYW1lLWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLWluZGV4LWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvb24tY29tbWl0LWFjdGlvbi1wYXJzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLXRhYmxlLWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3AtaW5kZXgtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvZHJvcC1zY2hlbWEtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvZHJvcC10YWJsZS1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL2ltbWVkaWF0ZS12YWx1ZS9pbW1lZGlhdGUtdmFsdWUtcGx1Z2luLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jcmVhdGUtdmlldy1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3Atdmlldy1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLXZpZXctYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdHlwZS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jcmVhdGUtdHlwZS1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtdHlwZS1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLXR5cGUtYnVpbGRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1ub2RlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LWJ1aWxkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3NjaGVtYS5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9keW5hbWljL2R5bmFtaWMuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHJpdmVyL2RlZmF1bHQtY29ubmVjdGlvbi1wcm92aWRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9kZWZhdWx0LXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvcGVyZm9ybWFuY2Utbm93LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RyaXZlci9ydW50aW1lLWRyaXZlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvc2luZ2xlLWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHJpdmVyL2RyaXZlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2xvZy5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2NvbXBpbGFibGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20va3lzZWx5LmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3Jhdy1idWlsZGVyL3Jhdy1idWlsZGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3Jhdy1idWlsZGVyL3NxbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS12aXNpdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWNvbXBpbGVyL2RlZmF1bHQtcXVlcnktY29tcGlsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjEwL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHJpdmVyL2R1bW15LWRyaXZlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L2RpYWxlY3QtYWRhcHRlci1iYXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RpYWxlY3Qvc3FsaXRlL3NxbGl0ZS1xdWVyeS1jb21waWxlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L3NxbGl0ZS9zcWxpdGUtYWRhcHRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L3Bvc3RncmVzL3Bvc3RncmVzLXF1ZXJ5LWNvbXBpbGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RpYWxlY3QvcG9zdGdyZXMvcG9zdGdyZXMtYWRhcHRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMTAvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L215c3FsL215c3FsLXF1ZXJ5LWNvbXBpbGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4xMC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RpYWxlY3QvbXlzcWwvbXlzcWwtYWRhcHRlci5qcyIsICIuLi9saWIvc3FsLWZpbHRlci50cyIsICIuLi9kYXRhL3F1ZXJ5LnRzIiwgIi4uL2RhdGEvc3FsLXN0YXRlbWVudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIiFmdW5jdGlvbih0LGUpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOih0PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikuZGF5anM9ZSgpfSh0aGlzLChmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciB0PTFlMyxlPTZlNCxuPTM2ZTUscj1cIm1pbGxpc2Vjb25kXCIsaT1cInNlY29uZFwiLHM9XCJtaW51dGVcIix1PVwiaG91clwiLGE9XCJkYXlcIixvPVwid2Vla1wiLGM9XCJtb250aFwiLGY9XCJxdWFydGVyXCIsaD1cInllYXJcIixkPVwiZGF0ZVwiLGw9XCJJbnZhbGlkIERhdGVcIiwkPS9eKFxcZHs0fSlbLS9dPyhcXGR7MSwyfSk/Wy0vXT8oXFxkezAsMn0pW1R0XFxzXSooXFxkezEsMn0pPzo/KFxcZHsxLDJ9KT86PyhcXGR7MSwyfSk/Wy46XT8oXFxkKyk/JC8seT0vXFxbKFteXFxdXSspXXxZezEsNH18TXsxLDR9fER7MSwyfXxkezEsNH18SHsxLDJ9fGh7MSwyfXxhfEF8bXsxLDJ9fHN7MSwyfXxaezEsMn18U1NTL2csTT17bmFtZTpcImVuXCIsd2Vla2RheXM6XCJTdW5kYXlfTW9uZGF5X1R1ZXNkYXlfV2VkbmVzZGF5X1RodXJzZGF5X0ZyaWRheV9TYXR1cmRheVwiLnNwbGl0KFwiX1wiKSxtb250aHM6XCJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyXCIuc3BsaXQoXCJfXCIpLG9yZGluYWw6ZnVuY3Rpb24odCl7dmFyIGU9W1widGhcIixcInN0XCIsXCJuZFwiLFwicmRcIl0sbj10JTEwMDtyZXR1cm5cIltcIit0KyhlWyhuLTIwKSUxMF18fGVbbl18fGVbMF0pK1wiXVwifX0sbT1mdW5jdGlvbih0LGUsbil7dmFyIHI9U3RyaW5nKHQpO3JldHVybiFyfHxyLmxlbmd0aD49ZT90OlwiXCIrQXJyYXkoZSsxLXIubGVuZ3RoKS5qb2luKG4pK3R9LHY9e3M6bSx6OmZ1bmN0aW9uKHQpe3ZhciBlPS10LnV0Y09mZnNldCgpLG49TWF0aC5hYnMoZSkscj1NYXRoLmZsb29yKG4vNjApLGk9biU2MDtyZXR1cm4oZTw9MD9cIitcIjpcIi1cIikrbShyLDIsXCIwXCIpK1wiOlwiK20oaSwyLFwiMFwiKX0sbTpmdW5jdGlvbiB0KGUsbil7aWYoZS5kYXRlKCk8bi5kYXRlKCkpcmV0dXJuLXQobixlKTt2YXIgcj0xMioobi55ZWFyKCktZS55ZWFyKCkpKyhuLm1vbnRoKCktZS5tb250aCgpKSxpPWUuY2xvbmUoKS5hZGQocixjKSxzPW4taTwwLHU9ZS5jbG9uZSgpLmFkZChyKyhzPy0xOjEpLGMpO3JldHVybisoLShyKyhuLWkpLyhzP2ktdTp1LWkpKXx8MCl9LGE6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCl8fDA6TWF0aC5mbG9vcih0KX0scDpmdW5jdGlvbih0KXtyZXR1cm57TTpjLHk6aCx3Om8sZDphLEQ6ZCxoOnUsbTpzLHM6aSxtczpyLFE6Zn1bdF18fFN0cmluZyh0fHxcIlwiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLyxcIlwiKX0sdTpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH19LGc9XCJlblwiLEQ9e307RFtnXT1NO3ZhciBwPVwiJGlzRGF5anNPYmplY3RcIixTPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgX3x8ISghdHx8IXRbcF0pfSx3PWZ1bmN0aW9uIHQoZSxuLHIpe3ZhciBpO2lmKCFlKXJldHVybiBnO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXt2YXIgcz1lLnRvTG93ZXJDYXNlKCk7RFtzXSYmKGk9cyksbiYmKERbc109bixpPXMpO3ZhciB1PWUuc3BsaXQoXCItXCIpO2lmKCFpJiZ1Lmxlbmd0aD4xKXJldHVybiB0KHVbMF0pfWVsc2V7dmFyIGE9ZS5uYW1lO0RbYV09ZSxpPWF9cmV0dXJuIXImJmkmJihnPWkpLGl8fCFyJiZnfSxPPWZ1bmN0aW9uKHQsZSl7aWYoUyh0KSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBlP2U6e307cmV0dXJuIG4uZGF0ZT10LG4uYXJncz1hcmd1bWVudHMsbmV3IF8obil9LGI9djtiLmw9dyxiLmk9UyxiLnc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTyh0LHtsb2NhbGU6ZS4kTCx1dGM6ZS4kdSx4OmUuJHgsJG9mZnNldDplLiRvZmZzZXR9KX07dmFyIF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBNKHQpe3RoaXMuJEw9dyh0LmxvY2FsZSxudWxsLCEwKSx0aGlzLnBhcnNlKHQpLHRoaXMuJHg9dGhpcy4keHx8dC54fHx7fSx0aGlzW3BdPSEwfXZhciBtPU0ucHJvdG90eXBlO3JldHVybiBtLnBhcnNlPWZ1bmN0aW9uKHQpe3RoaXMuJGQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRlLG49dC51dGM7aWYobnVsbD09PWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7aWYoYi51KGUpKXJldHVybiBuZXcgRGF0ZTtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUoZSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJiEvWiQvaS50ZXN0KGUpKXt2YXIgcj1lLm1hdGNoKCQpO2lmKHIpe3ZhciBpPXJbMl0tMXx8MCxzPShyWzddfHxcIjBcIikuc3Vic3RyaW5nKDAsMyk7cmV0dXJuIG4/bmV3IERhdGUoRGF0ZS5VVEMoclsxXSxpLHJbM118fDEscls0XXx8MCxyWzVdfHwwLHJbNl18fDAscykpOm5ldyBEYXRlKHJbMV0saSxyWzNdfHwxLHJbNF18fDAscls1XXx8MCxyWzZdfHwwLHMpfX1yZXR1cm4gbmV3IERhdGUoZSl9KHQpLHRoaXMuaW5pdCgpfSxtLmluaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiRkO3RoaXMuJHk9dC5nZXRGdWxsWWVhcigpLHRoaXMuJE09dC5nZXRNb250aCgpLHRoaXMuJEQ9dC5nZXREYXRlKCksdGhpcy4kVz10LmdldERheSgpLHRoaXMuJEg9dC5nZXRIb3VycygpLHRoaXMuJG09dC5nZXRNaW51dGVzKCksdGhpcy4kcz10LmdldFNlY29uZHMoKSx0aGlzLiRtcz10LmdldE1pbGxpc2Vjb25kcygpfSxtLiR1dGlscz1mdW5jdGlvbigpe3JldHVybiBifSxtLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hKHRoaXMuJGQudG9TdHJpbmcoKT09PWwpfSxtLmlzU2FtZT1mdW5jdGlvbih0LGUpe3ZhciBuPU8odCk7cmV0dXJuIHRoaXMuc3RhcnRPZihlKTw9biYmbjw9dGhpcy5lbmRPZihlKX0sbS5pc0FmdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE8odCk8dGhpcy5zdGFydE9mKGUpfSxtLmlzQmVmb3JlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZW5kT2YoZSk8Tyh0KX0sbS4kZz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGIudSh0KT90aGlzW2VdOnRoaXMuc2V0KG4sdCl9LG0udW5peD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpLzFlMyl9LG0udmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLmdldFRpbWUoKX0sbS5zdGFydE9mPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPSEhYi51KGUpfHxlLGY9Yi5wKHQpLGw9ZnVuY3Rpb24odCxlKXt2YXIgaT1iLncobi4kdT9EYXRlLlVUQyhuLiR5LGUsdCk6bmV3IERhdGUobi4keSxlLHQpLG4pO3JldHVybiByP2k6aS5lbmRPZihhKX0sJD1mdW5jdGlvbih0LGUpe3JldHVybiBiLncobi50b0RhdGUoKVt0XS5hcHBseShuLnRvRGF0ZShcInNcIiksKHI/WzAsMCwwLDBdOlsyMyw1OSw1OSw5OTldKS5zbGljZShlKSksbil9LHk9dGhpcy4kVyxNPXRoaXMuJE0sbT10aGlzLiRELHY9XCJzZXRcIisodGhpcy4kdT9cIlVUQ1wiOlwiXCIpO3N3aXRjaChmKXtjYXNlIGg6cmV0dXJuIHI/bCgxLDApOmwoMzEsMTEpO2Nhc2UgYzpyZXR1cm4gcj9sKDEsTSk6bCgwLE0rMSk7Y2FzZSBvOnZhciBnPXRoaXMuJGxvY2FsZSgpLndlZWtTdGFydHx8MCxEPSh5PGc/eSs3OnkpLWc7cmV0dXJuIGwocj9tLUQ6bSsoNi1EKSxNKTtjYXNlIGE6Y2FzZSBkOnJldHVybiAkKHYrXCJIb3Vyc1wiLDApO2Nhc2UgdTpyZXR1cm4gJCh2K1wiTWludXRlc1wiLDEpO2Nhc2UgczpyZXR1cm4gJCh2K1wiU2Vjb25kc1wiLDIpO2Nhc2UgaTpyZXR1cm4gJCh2K1wiTWlsbGlzZWNvbmRzXCIsMyk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5jbG9uZSgpfX0sbS5lbmRPZj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdGFydE9mKHQsITEpfSxtLiRzZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbixvPWIucCh0KSxmPVwic2V0XCIrKHRoaXMuJHU/XCJVVENcIjpcIlwiKSxsPShuPXt9LG5bYV09ZitcIkRhdGVcIixuW2RdPWYrXCJEYXRlXCIsbltjXT1mK1wiTW9udGhcIixuW2hdPWYrXCJGdWxsWWVhclwiLG5bdV09ZitcIkhvdXJzXCIsbltzXT1mK1wiTWludXRlc1wiLG5baV09ZitcIlNlY29uZHNcIixuW3JdPWYrXCJNaWxsaXNlY29uZHNcIixuKVtvXSwkPW89PT1hP3RoaXMuJEQrKGUtdGhpcy4kVyk6ZTtpZihvPT09Y3x8bz09PWgpe3ZhciB5PXRoaXMuY2xvbmUoKS5zZXQoZCwxKTt5LiRkW2xdKCQpLHkuaW5pdCgpLHRoaXMuJGQ9eS5zZXQoZCxNYXRoLm1pbih0aGlzLiRELHkuZGF5c0luTW9udGgoKSkpLiRkfWVsc2UgbCYmdGhpcy4kZFtsXSgkKTtyZXR1cm4gdGhpcy5pbml0KCksdGhpc30sbS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jbG9uZSgpLiRzZXQodCxlKX0sbS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbYi5wKHQpXSgpfSxtLmFkZD1mdW5jdGlvbihyLGYpe3ZhciBkLGw9dGhpcztyPU51bWJlcihyKTt2YXIgJD1iLnAoZikseT1mdW5jdGlvbih0KXt2YXIgZT1PKGwpO3JldHVybiBiLncoZS5kYXRlKGUuZGF0ZSgpK01hdGgucm91bmQodCpyKSksbCl9O2lmKCQ9PT1jKXJldHVybiB0aGlzLnNldChjLHRoaXMuJE0rcik7aWYoJD09PWgpcmV0dXJuIHRoaXMuc2V0KGgsdGhpcy4keStyKTtpZigkPT09YSlyZXR1cm4geSgxKTtpZigkPT09bylyZXR1cm4geSg3KTt2YXIgTT0oZD17fSxkW3NdPWUsZFt1XT1uLGRbaV09dCxkKVskXXx8MSxtPXRoaXMuJGQuZ2V0VGltZSgpK3IqTTtyZXR1cm4gYi53KG0sdGhpcyl9LG0uc3VidHJhY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5hZGQoLTEqdCxlKX0sbS5mb3JtYXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuJGxvY2FsZSgpO2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbi5pbnZhbGlkRGF0ZXx8bDt2YXIgcj10fHxcIllZWVktTU0tRERUSEg6bW06c3NaXCIsaT1iLnoodGhpcykscz10aGlzLiRILHU9dGhpcy4kbSxhPXRoaXMuJE0sbz1uLndlZWtkYXlzLGM9bi5tb250aHMsZj1uLm1lcmlkaWVtLGg9ZnVuY3Rpb24odCxuLGkscyl7cmV0dXJuIHQmJih0W25dfHx0KGUscikpfHxpW25dLnNsaWNlKDAscyl9LGQ9ZnVuY3Rpb24odCl7cmV0dXJuIGIucyhzJTEyfHwxMix0LFwiMFwiKX0sJD1mfHxmdW5jdGlvbih0LGUsbil7dmFyIHI9dDwxMj9cIkFNXCI6XCJQTVwiO3JldHVybiBuP3IudG9Mb3dlckNhc2UoKTpyfTtyZXR1cm4gci5yZXBsYWNlKHksKGZ1bmN0aW9uKHQscil7cmV0dXJuIHJ8fGZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlXCJZWVwiOnJldHVybiBTdHJpbmcoZS4keSkuc2xpY2UoLTIpO2Nhc2VcIllZWVlcIjpyZXR1cm4gYi5zKGUuJHksNCxcIjBcIik7Y2FzZVwiTVwiOnJldHVybiBhKzE7Y2FzZVwiTU1cIjpyZXR1cm4gYi5zKGErMSwyLFwiMFwiKTtjYXNlXCJNTU1cIjpyZXR1cm4gaChuLm1vbnRoc1Nob3J0LGEsYywzKTtjYXNlXCJNTU1NXCI6cmV0dXJuIGgoYyxhKTtjYXNlXCJEXCI6cmV0dXJuIGUuJEQ7Y2FzZVwiRERcIjpyZXR1cm4gYi5zKGUuJEQsMixcIjBcIik7Y2FzZVwiZFwiOnJldHVybiBTdHJpbmcoZS4kVyk7Y2FzZVwiZGRcIjpyZXR1cm4gaChuLndlZWtkYXlzTWluLGUuJFcsbywyKTtjYXNlXCJkZGRcIjpyZXR1cm4gaChuLndlZWtkYXlzU2hvcnQsZS4kVyxvLDMpO2Nhc2VcImRkZGRcIjpyZXR1cm4gb1tlLiRXXTtjYXNlXCJIXCI6cmV0dXJuIFN0cmluZyhzKTtjYXNlXCJISFwiOnJldHVybiBiLnMocywyLFwiMFwiKTtjYXNlXCJoXCI6cmV0dXJuIGQoMSk7Y2FzZVwiaGhcIjpyZXR1cm4gZCgyKTtjYXNlXCJhXCI6cmV0dXJuICQocyx1LCEwKTtjYXNlXCJBXCI6cmV0dXJuICQocyx1LCExKTtjYXNlXCJtXCI6cmV0dXJuIFN0cmluZyh1KTtjYXNlXCJtbVwiOnJldHVybiBiLnModSwyLFwiMFwiKTtjYXNlXCJzXCI6cmV0dXJuIFN0cmluZyhlLiRzKTtjYXNlXCJzc1wiOnJldHVybiBiLnMoZS4kcywyLFwiMFwiKTtjYXNlXCJTU1NcIjpyZXR1cm4gYi5zKGUuJG1zLDMsXCIwXCIpO2Nhc2VcIlpcIjpyZXR1cm4gaX1yZXR1cm4gbnVsbH0odCl8fGkucmVwbGFjZShcIjpcIixcIlwiKX0pKX0sbS51dGNPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTUqLU1hdGgucm91bmQodGhpcy4kZC5nZXRUaW1lem9uZU9mZnNldCgpLzE1KX0sbS5kaWZmPWZ1bmN0aW9uKHIsZCxsKXt2YXIgJCx5PXRoaXMsTT1iLnAoZCksbT1PKHIpLHY9KG0udXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSkqZSxnPXRoaXMtbSxEPWZ1bmN0aW9uKCl7cmV0dXJuIGIubSh5LG0pfTtzd2l0Y2goTSl7Y2FzZSBoOiQ9RCgpLzEyO2JyZWFrO2Nhc2UgYzokPUQoKTticmVhaztjYXNlIGY6JD1EKCkvMzticmVhaztjYXNlIG86JD0oZy12KS82MDQ4ZTU7YnJlYWs7Y2FzZSBhOiQ9KGctdikvODY0ZTU7YnJlYWs7Y2FzZSB1OiQ9Zy9uO2JyZWFrO2Nhc2UgczokPWcvZTticmVhaztjYXNlIGk6JD1nL3Q7YnJlYWs7ZGVmYXVsdDokPWd9cmV0dXJuIGw/JDpiLmEoJCl9LG0uZGF5c0luTW9udGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmRPZihjKS4kRH0sbS4kbG9jYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIERbdGhpcy4kTF19LG0ubG9jYWxlPWZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHRoaXMuJEw7dmFyIG49dGhpcy5jbG9uZSgpLHI9dyh0LGUsITApO3JldHVybiByJiYobi4kTD1yKSxufSxtLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGIudyh0aGlzLiRkLHRoaXMpfSxtLnRvRGF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSl9LG0udG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfSxtLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9JU09TdHJpbmcoKX0sbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCl9LE19KCksaz1fLnByb3RvdHlwZTtyZXR1cm4gTy5wcm90b3R5cGU9ayxbW1wiJG1zXCIscl0sW1wiJHNcIixpXSxbXCIkbVwiLHNdLFtcIiRIXCIsdV0sW1wiJFdcIixhXSxbXCIkTVwiLGNdLFtcIiR5XCIsaF0sW1wiJERcIixkXV0uZm9yRWFjaCgoZnVuY3Rpb24odCl7a1t0WzFdXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZyhlLHRbMF0sdFsxXSl9fSkpLE8uZXh0ZW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuJGl8fCh0KGUsXyxPKSx0LiRpPSEwKSxPfSxPLmxvY2FsZT13LE8uaXNEYXlqcz1TLE8udW5peD1mdW5jdGlvbih0KXtyZXR1cm4gTygxZTMqdCl9LE8uZW49RFtnXSxPLkxzPUQsTy5wPXt9LE99KSk7IiwgIiFmdW5jdGlvbih0LGkpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWkoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGkpOih0PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikuZGF5anNfcGx1Z2luX3V0Yz1pKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9XCJtaW51dGVcIixpPS9bKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9nLGU9LyhbKy1dfFxcZFxcZCkvZztyZXR1cm4gZnVuY3Rpb24ocyxmLG4pe3ZhciB1PWYucHJvdG90eXBlO24udXRjPWZ1bmN0aW9uKHQpe3ZhciBpPXtkYXRlOnQsdXRjOiEwLGFyZ3M6YXJndW1lbnRzfTtyZXR1cm4gbmV3IGYoaSl9LHUudXRjPWZ1bmN0aW9uKGkpe3ZhciBlPW4odGhpcy50b0RhdGUoKSx7bG9jYWxlOnRoaXMuJEwsdXRjOiEwfSk7cmV0dXJuIGk/ZS5hZGQodGhpcy51dGNPZmZzZXQoKSx0KTplfSx1LmxvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy50b0RhdGUoKSx7bG9jYWxlOnRoaXMuJEwsdXRjOiExfSl9O3ZhciByPXUucGFyc2U7dS5wYXJzZT1mdW5jdGlvbih0KXt0LnV0YyYmKHRoaXMuJHU9ITApLHRoaXMuJHV0aWxzKCkudSh0LiRvZmZzZXQpfHwodGhpcy4kb2Zmc2V0PXQuJG9mZnNldCksci5jYWxsKHRoaXMsdCl9O3ZhciBvPXUuaW5pdDt1LmluaXQ9ZnVuY3Rpb24oKXtpZih0aGlzLiR1KXt2YXIgdD10aGlzLiRkO3RoaXMuJHk9dC5nZXRVVENGdWxsWWVhcigpLHRoaXMuJE09dC5nZXRVVENNb250aCgpLHRoaXMuJEQ9dC5nZXRVVENEYXRlKCksdGhpcy4kVz10LmdldFVUQ0RheSgpLHRoaXMuJEg9dC5nZXRVVENIb3VycygpLHRoaXMuJG09dC5nZXRVVENNaW51dGVzKCksdGhpcy4kcz10LmdldFVUQ1NlY29uZHMoKSx0aGlzLiRtcz10LmdldFVUQ01pbGxpc2Vjb25kcygpfWVsc2Ugby5jYWxsKHRoaXMpfTt2YXIgYT11LnV0Y09mZnNldDt1LnV0Y09mZnNldD1mdW5jdGlvbihzLGYpe3ZhciBuPXRoaXMuJHV0aWxzKCkudTtpZihuKHMpKXJldHVybiB0aGlzLiR1PzA6bih0aGlzLiRvZmZzZXQpP2EuY2FsbCh0aGlzKTp0aGlzLiRvZmZzZXQ7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHMmJihzPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PVwiXCIpO3ZhciBzPXQubWF0Y2goaSk7aWYoIXMpcmV0dXJuIG51bGw7dmFyIGY9KFwiXCIrc1swXSkubWF0Y2goZSl8fFtcIi1cIiwwLDBdLG49ZlswXSx1PTYwKitmWzFdKyArZlsyXTtyZXR1cm4gMD09PXU/MDpcIitcIj09PW4/dTotdX0ocyksbnVsbD09PXMpKXJldHVybiB0aGlzO3ZhciB1PU1hdGguYWJzKHMpPD0xNj82MCpzOnM7aWYoMD09PXUpcmV0dXJuIHRoaXMudXRjKGYpO3ZhciByPXRoaXMuY2xvbmUoKTtpZihmKXJldHVybiByLiRvZmZzZXQ9dSxyLiR1PSExLHI7dmFyIG89dGhpcy4kdT90aGlzLnRvRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk6LTEqdGhpcy51dGNPZmZzZXQoKTtyZXR1cm4ocj10aGlzLmxvY2FsKCkuYWRkKHUrbyx0KSkuJG9mZnNldD11LHIuJHguJGxvY2FsT2Zmc2V0PW8scn07dmFyIGg9dS5mb3JtYXQ7dS5mb3JtYXQ9ZnVuY3Rpb24odCl7dmFyIGk9dHx8KHRoaXMuJHU/XCJZWVlZLU1NLUREVEhIOm1tOnNzW1pdXCI6XCJcIik7cmV0dXJuIGguY2FsbCh0aGlzLGkpfSx1LnZhbHVlT2Y9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiR1dGlscygpLnUodGhpcy4kb2Zmc2V0KT8wOnRoaXMuJG9mZnNldCsodGhpcy4keC4kbG9jYWxPZmZzZXR8fHRoaXMuJGQuZ2V0VGltZXpvbmVPZmZzZXQoKSk7cmV0dXJuIHRoaXMuJGQudmFsdWVPZigpLTZlNCp0fSx1LmlzVVRDPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLiR1fSx1LnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKX0sdS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvRGF0ZSgpLnRvVVRDU3RyaW5nKCl9O3ZhciBsPXUudG9EYXRlO3UudG9EYXRlPWZ1bmN0aW9uKHQpe3JldHVyblwic1wiPT09dCYmdGhpcy4kb2Zmc2V0P24odGhpcy5mb3JtYXQoXCJZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1wiKSkudG9EYXRlKCk6bC5jYWxsKHRoaXMpfTt2YXIgYz11LmRpZmY7dS5kaWZmPWZ1bmN0aW9uKHQsaSxlKXtpZih0JiZ0aGlzLiR1PT09dC4kdSlyZXR1cm4gYy5jYWxsKHRoaXMsdCxpLGUpO3ZhciBzPXRoaXMubG9jYWwoKSxmPW4odCkubG9jYWwoKTtyZXR1cm4gYy5jYWxsKHMsZixpLGUpfX19KSk7IiwgImltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcbmltcG9ydCB1dGMgZnJvbSBcImRheWpzL3BsdWdpbi91dGNcIjtcblxuZGF5anMuZXh0ZW5kKHV0Yyk7XG5cbmNvbnN0IERBVEUwX1BFUl9GT1JNQVQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGUwKGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChEQVRFMF9QRVJfRk9STUFUW2Zvcm1hdF0gPz89IGRheWpzKDApLnV0YygpLmZvcm1hdChmb3JtYXQpKTtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RSSU5HID0gXCJcIjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTlVNRVJJQyA9IDA7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JPT0xFQU4gPSBmYWxzZTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVJSQVlfRElTUExBWSA9IFwiW11cIjtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0pTT04gPSBcInt9XCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9BUlJBWV9WQUxVRSA9IERFRkFVTFRfSlNPTjtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb2JqZWN0LXV0aWxzLmQudHNcIiAvPlxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSB8fCBpc1N0cmluZyhvYmopIHx8IGlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9iaikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcgfHwgb2JqID09PSB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdib29sZWFuJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERhdGU7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaWdJbnQob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdiaWdpbnQnO1xufVxuLy8gRG9uJ3QgY2hhbmdlIHRoZSByZXR1cm5kIHR5cGUgdG8gYG9iaiBpcyBCdWZmZXJgIHRvIG5vdCBjcmVhdGUgYVxuLy8gaGFyZCBkZXBlbmRlbmN5IHRvIG5vZGUuXG5leHBvcnQgZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIEJ1ZmZlci5pc0J1ZmZlcihvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5QnVmZmVyT3JWaWV3KG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICAgIGlmICghaXNPYmplY3Qob2JqKSB8fCBnZXRUYWcob2JqKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBwcm90byA9IG9iajtcbiAgICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG87XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFzdChhcnIpIHtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemUob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5KGFyZykge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFthcmddO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBhc1JlYWRvbmx5QXJyYXkoYXJnKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZnJlZXplKFthcmddKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNSZWFkb25seUFycmF5KGFyZykge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gbm9vcChvYmopIHtcbiAgICByZXR1cm4gb2JqO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmUob2JqMSwgb2JqMikge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkob2JqMSkgJiYgaXNSZWFkb25seUFycmF5KG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlQXJyYXlzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChvYmoxKSAmJiBpc09iamVjdChvYmoyKSkge1xuICAgICAgICByZXR1cm4gY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIHJldHVybiBvYmoxID09PSBvYmoyO1xufVxuZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnIxLCBhcnIyKSB7XG4gICAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyMS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoIWNvbXBhcmUoYXJyMVtpXSwgYXJyMltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBpZiAoaXNCdWZmZXIob2JqMSkgJiYgaXNCdWZmZXIob2JqMikpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVCdWZmZXJzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RhdGUob2JqMSkgJiYgaXNEYXRlKG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlRGF0ZXMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIHJldHVybiBjb21wYXJlR2VuZXJpY09iamVjdHMob2JqMSwgb2JqMik7XG59XG5mdW5jdGlvbiBjb21wYXJlQnVmZmVycyhidWYxLCBidWYyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGJ1ZjEsIGJ1ZjIpID09PSAwO1xufVxuZnVuY3Rpb24gY29tcGFyZURhdGVzKGRhdGUxLCBkYXRlMikge1xuICAgIHJldHVybiBkYXRlMS5nZXRUaW1lKCkgPT09IGRhdGUyLmdldFRpbWUoKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVHZW5lcmljT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgY29uc3Qga2V5czEgPSBPYmplY3Qua2V5cyhvYmoxKTtcbiAgICBjb25zdCBrZXlzMiA9IE9iamVjdC5rZXlzKG9iajIpO1xuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGlmICghY29tcGFyZShvYmoxW2tleV0sIG9iajJba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmZ1bmN0aW9uIGdldFRhZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJ1tvYmplY3QgVW5kZWZpbmVkXScgOiAnW29iamVjdCBOdWxsXSc7XG4gICAgfVxuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbHRlclRhYmxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWx0ZXJUYWJsZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FsdGVyVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRhYmxlUHJvcHMobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbihub2RlLCBjb2x1bW5BbHRlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGNvbHVtbkFsdGVyYXRpb25zOiBub2RlLmNvbHVtbkFsdGVyYXRpb25zXG4gICAgICAgICAgICAgICAgPyBbLi4ubm9kZS5jb2x1bW5BbHRlcmF0aW9ucywgY29sdW1uQWx0ZXJhdGlvbl1cbiAgICAgICAgICAgICAgICA6IFtjb2x1bW5BbHRlcmF0aW9uXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pZGVudGlmaWVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSWRlbnRpZmllck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0lkZW50aWZpZXJOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0lkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZUluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5zKG5vZGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uczogWy4uLihub2RlLmNvbHVtbnMgfHwgW10pLCAuLi5jb2x1bW5zXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtc2NoZW1hLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVTY2hlbWFOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDcmVhdGVTY2hlbWFOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzY2hlbWEsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVTY2hlbWFOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKHNjaGVtYSksXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGNyZWF0ZVNjaGVtYSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlU2NoZW1hLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10YWJsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IE9OX0NPTU1JVF9BQ1RJT05TID0gWydwcmVzZXJ2ZSByb3dzJywgJ2RlbGV0ZSByb3dzJywgJ2Ryb3AnXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVUYWJsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZVRhYmxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgY29sdW1uczogZnJlZXplKFtdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW4oY3JlYXRlVGFibGUsIGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgY29sdW1uczogZnJlZXplKFsuLi5jcmVhdGVUYWJsZS5jb2x1bW5zLCBjb2x1bW5dKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb25zdHJhaW50KGNyZWF0ZVRhYmxlLCBjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICBjb25zdHJhaW50czogY3JlYXRlVGFibGUuY29uc3RyYWludHNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuY29uc3RyYWludHMsIGNvbnN0cmFpbnRdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFtjb25zdHJhaW50XSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbnRNb2RpZmllcihjcmVhdGVUYWJsZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiBjcmVhdGVUYWJsZS5mcm9udE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5jcmVhdGVUYWJsZS5mcm9udE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEVuZE1vZGlmaWVyKGNyZWF0ZVRhYmxlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiBjcmVhdGVUYWJsZS5lbmRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuZW5kTW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW21vZGlmaWVyXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGNyZWF0ZVRhYmxlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShpZGVudGlmaWVyKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoU2NoZW1hKHNjaGVtYSwgaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTY2hlbWFibGVJZGVudGlmaWVyTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGlkZW50aWZpZXIpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtaW5kZXgtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wSW5kZXhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wSW5kZXhOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcEluZGV4Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUobmFtZSksXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BJbmRleCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wSW5kZXgsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXNjaGVtYS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFNjaGVtYU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BTY2hlbWFOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzY2hlbWEsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wU2NoZW1hLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wU2NoZW1hLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wVGFibGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVGFibGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BJbmRleCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcEluZGV4LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsaWFzLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWxpYXNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBbGlhc05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5vZGUsIGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FsaWFzTm9kZScsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUYWJsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1RhYmxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUodGFibGUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCB0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCB0YWJsZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3BlcmF0aW9uLW5vZGUtc291cmNlLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikge1xuICAgIHJldHVybiBpc09iamVjdChvYmopICYmIGlzRnVuY3Rpb24ob2JqLnRvT3BlcmF0aW9uTm9kZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2V4cHJlc3Npb24uZC50c1wiIC8+XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc0V4cHJlc3Npb24ob2JqKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgJ2V4cHJlc3Npb25UeXBlJyBpbiBvYmogJiYgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBbGlhc2VkRXhwcmVzc2lvbihvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgJ2V4cHJlc3Npb24nIGluIG9iaiAmJlxuICAgICAgICBpc1N0cmluZyhvYmouYWxpYXMpICYmXG4gICAgICAgIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0LW1vZGlmaWVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0TW9kaWZpZXJOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZWxlY3RNb2RpZmllck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG1vZGlmaWVyLCBvZikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RNb2RpZmllck5vZGUnLFxuICAgICAgICAgICAgbW9kaWZpZXIsXG4gICAgICAgICAgICBvZixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoRXhwcmVzc2lvbihtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RNb2RpZmllck5vZGUnLFxuICAgICAgICAgICAgcmF3TW9kaWZpZXI6IG1vZGlmaWVyLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FuZC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFuZE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FuZE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FuZE5vZGUnLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09yTm9kZScsXG4gICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgcmlnaHQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4vb3Itbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbk5vZGUnLFxuICAgICAgICAgICAgb246IGZpbHRlcixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcGVyYXRpb24ob25Ob2RlLCBvcGVyYXRvciwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub25Ob2RlLFxuICAgICAgICAgICAgb246IG9wZXJhdG9yID09PSAnQW5kJ1xuICAgICAgICAgICAgICAgID8gQW5kTm9kZS5jcmVhdGUob25Ob2RlLm9uLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBPck5vZGUuY3JlYXRlKG9uTm9kZS5vbiwgb3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qb2luLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBPbk5vZGUgfSBmcm9tICcuL29uLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpvaW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKb2luTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoam9pblR5cGUsIHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pvaW5Ob2RlJyxcbiAgICAgICAgICAgIGpvaW5UeXBlLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBvbjogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhPbihqb2luVHlwZSwgdGFibGUsIG9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pvaW5Ob2RlJyxcbiAgICAgICAgICAgIGpvaW5UeXBlLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBvbjogT25Ob2RlLmNyZWF0ZShvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT24oam9pbk5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmpvaW5Ob2RlLFxuICAgICAgICAgICAgb246IGpvaW5Ob2RlLm9uXG4gICAgICAgICAgICAgICAgPyBPbk5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKGpvaW5Ob2RlLm9uLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogT25Ob2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBCaW5hcnlPcGVyYXRpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdCaW5hcnlPcGVyYXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsZWZ0T3BlcmFuZCwgb3BlcmF0b3IsIHJpZ2h0T3BlcmFuZCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdCaW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGxlZnRPcGVyYW5kLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICByaWdodE9wZXJhbmQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3BlcmF0b3Itbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgQ09NUEFSSVNPTl9PUEVSQVRPUlMgPSBbXG4gICAgJz0nLFxuICAgICc9PScsXG4gICAgJyE9JyxcbiAgICAnPD4nLFxuICAgICc+JyxcbiAgICAnPj0nLFxuICAgICc8JyxcbiAgICAnPD0nLFxuICAgICdpbicsXG4gICAgJ25vdCBpbicsXG4gICAgJ2lzJyxcbiAgICAnaXMgbm90JyxcbiAgICAnbGlrZScsXG4gICAgJ25vdCBsaWtlJyxcbiAgICAnbWF0Y2gnLFxuICAgICdpbGlrZScsXG4gICAgJ25vdCBpbGlrZScsXG4gICAgJ0A+JyxcbiAgICAnPEAnLFxuICAgICdeQCcsXG4gICAgJyYmJyxcbiAgICAnPycsXG4gICAgJz8mJyxcbiAgICAnP3wnLFxuICAgICchPCcsXG4gICAgJyE+JyxcbiAgICAnPD0+JyxcbiAgICAnIX4nLFxuICAgICd+JyxcbiAgICAnfionLFxuICAgICchfionLFxuICAgICdAQCcsXG4gICAgJ0BAQCcsXG4gICAgJyEhJyxcbiAgICAnPC0+JyxcbiAgICAncmVnZXhwJyxcbiAgICAnaXMgZGlzdGluY3QgZnJvbScsXG4gICAgJ2lzIG5vdCBkaXN0aW5jdCBmcm9tJyxcbl07XG5leHBvcnQgY29uc3QgQVJJVEhNRVRJQ19PUEVSQVRPUlMgPSBbXG4gICAgJysnLFxuICAgICctJyxcbiAgICAnKicsXG4gICAgJy8nLFxuICAgICclJyxcbiAgICAnXicsXG4gICAgJyYnLFxuICAgICd8JyxcbiAgICAnIycsXG4gICAgJzw8JyxcbiAgICAnPj4nLFxuXTtcbmV4cG9ydCBjb25zdCBKU09OX09QRVJBVE9SUyA9IFsnLT4nLCAnLT4+J107XG5leHBvcnQgY29uc3QgQklOQVJZX09QRVJBVE9SUyA9IFtcbiAgICAuLi5DT01QQVJJU09OX09QRVJBVE9SUyxcbiAgICAuLi5BUklUSE1FVElDX09QRVJBVE9SUyxcbiAgICAnJiYnLFxuICAgICd8fCcsXG5dO1xuZXhwb3J0IGNvbnN0IFVOQVJZX0ZJTFRFUl9PUEVSQVRPUlMgPSBbJ2V4aXN0cycsICdub3QgZXhpc3RzJ107XG5leHBvcnQgY29uc3QgVU5BUllfT1BFUkFUT1JTID0gWydub3QnLCAnLScsIC4uLlVOQVJZX0ZJTFRFUl9PUEVSQVRPUlNdO1xuZXhwb3J0IGNvbnN0IE9QRVJBVE9SUyA9IFtcbiAgICAuLi5CSU5BUllfT1BFUkFUT1JTLFxuICAgIC4uLkpTT05fT1BFUkFUT1JTLFxuICAgIC4uLlVOQVJZX09QRVJBVE9SUyxcbiAgICAnYmV0d2VlbicsXG4gICAgJ2JldHdlZW4gc3ltbWV0cmljJyxcbl07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3BlcmF0b3JOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPcGVyYXRvck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09wZXJhdG9yTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIE9QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaW5hcnlPcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgQklOQVJZX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21wYXJpc29uT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIENPTVBBUklTT05fT1BFUkFUT1JTLmluY2x1ZGVzKG9wKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FyaXRobWV0aWNPcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgQVJJVEhNRVRJQ19PUEVSQVRPUlMuaW5jbHVkZXMob3ApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSlNPTk9wZXJhdG9yKG9wKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKG9wKSAmJiBKU09OX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtYWxsLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0QWxsTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0QWxsTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdEFsbE5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZmVyZW5jZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgU2VsZWN0QWxsTm9kZSB9IGZyb20gJy4vc2VsZWN0LWFsbC1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZWZlcmVuY2VOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZWZlcmVuY2VOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlU2VsZWN0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBjb2x1bW46IFNlbGVjdEFsbE5vZGUuY3JlYXRlKCksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIHtcbiAgICAjZHluYW1pY1JlZmVyZW5jZTtcbiAgICBnZXQgZHluYW1pY1JlZmVyZW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2R5bmFtaWNSZWZlcmVuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGhlcmUganVzdCBzbyB0aGF0IHRoZSB0eXBpbmdzIHdvcmsuIFdpdGhvdXQgdGhpc1xuICAgICAqIHRoZSBnZW5lcmF0ZWQgLmQudHMgZmlsZSBjb250YWlucyBubyByZWZlcmVuY2UgdG8gdGhlIHR5cGUgcGFyYW0gUlxuICAgICAqIHdoaWNoIGNhdXNlcyB0aGlzIHR5cGUgdG8gYmUgZXF1YWwgdG8gRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIgd2l0aFxuICAgICAqIGFueSBSLlxuICAgICAqL1xuICAgIGdldCByZWZUeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UpIHtcbiAgICAgICAgdGhpcy4jZHluYW1pY1JlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uKHRoaXMuI2R5bmFtaWNSZWZlcmVuY2UpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyKG9iaikge1xuICAgIHJldHVybiAoaXNPYmplY3Qob2JqKSAmJlxuICAgICAgICBpc09wZXJhdGlvbk5vZGVTb3VyY2Uob2JqKSAmJlxuICAgICAgICBpc1N0cmluZyhvYmouZHluYW1pY1JlZmVyZW5jZSkpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcmRlci1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JkZXJCeUl0ZW1Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPcmRlckJ5SXRlbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9yZGVyQnksIGRpcmVjdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmF3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmF3Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmF3Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1Jhd05vZGUnLFxuICAgICAgICAgICAgc3FsRnJhZ21lbnRzOiBmcmVlemUoc3FsRnJhZ21lbnRzKSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IGZyZWV6ZShwYXJhbWV0ZXJzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoU3FsKHNxbCkge1xuICAgICAgICByZXR1cm4gUmF3Tm9kZS5jcmVhdGUoW3NxbF0sIFtdKTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhDaGlsZChjaGlsZCkge1xuICAgICAgICByZXR1cm4gUmF3Tm9kZS5jcmVhdGUoWycnLCAnJ10sIFtjaGlsZF0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybiBSYXdOb2RlLmNyZWF0ZShuZXcgQXJyYXkoY2hpbGRyZW4ubGVuZ3RoICsgMSkuZmlsbCgnJyksIGNoaWxkcmVuKTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbGxhdGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbGxhdGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb2xsYXRlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbGxhdGVOb2RlJyxcbiAgICAgICAgICAgIGNvbGxhdGlvbjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbGxhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3JkZXItYnktaXRlbS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sbGF0ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2xsYXRlLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeUl0ZW1Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktaXRlbS1ub2RlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3JkZXJCeUl0ZW1CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBkZXNjYCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBhc2N9IGZvciB0aGUgb3Bwb3NpdGUuXG4gICAgICovXG4gICAgZGVzYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoJ2Rlc2MnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgYXNjYCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBkZXNjfSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIGFzYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoJ2FzYycpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBsYXN0YCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBhbmQgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBudWxsc0ZpcnN0fSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIG51bGxzTGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IG51bGxzOiAnbGFzdCcgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBmaXJzdGAgdG8gdGhlIGBvcmRlciBieWAgaXRlbS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgYW5kIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgbnVsbHNMYXN0fSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIG51bGxzRmlyc3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBudWxsczogJ2ZpcnN0JyB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGNvbGxhdGUgPGNvbGxhdGlvbk5hbWU+YCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqL1xuICAgIGNvbGxhdGUoY29sbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogQ29sbGF0ZU5vZGUuY3JlYXRlKGNvbGxhdGlvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9sb2ctb25jZS5kLnRzXCIgLz5cbmNvbnN0IExPR0dFRF9NRVNTQUdFUyA9IG5ldyBTZXQoKTtcbi8qKlxuICogVXNlIGZvciBzeXN0ZW0tbGV2ZWwgbG9nZ2luZywgc3VjaCBhcyBkZXByZWNhdGlvbiBtZXNzYWdlcy5cbiAqIExvZ3MgYSBtZXNzYWdlIGFuZCBlbnN1cmVzIGl0IHdvbid0IGJlIGxvZ2dlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ09uY2UobWVzc2FnZSkge1xuICAgIGlmIChMT0dHRURfTUVTU0FHRVMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTE9HR0VEX01FU1NBR0VTLmFkZChtZXNzYWdlKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3JkZXItYnktcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciwgfSBmcm9tICcuLi9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB7IE9yZGVyQnlJdGVtTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29yZGVyLWJ5LWl0ZW0tbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeUl0ZW1CdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9vcmRlci1ieS1pdGVtLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgbG9nT25jZSB9IGZyb20gJy4uL3V0aWwvbG9nLW9uY2UuanMnO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uT3JGYWN0b3J5LCBwYXJzZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVN0cmluZ1JlZmVyZW5jZSwgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3JkZXJCeURpcmVjdGlvbih0aGluZykge1xuICAgIHJldHVybiB0aGluZyA9PT0gJ2FzYycgfHwgdGhpbmcgPT09ICdkZXNjJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9yZGVyQnkoYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW3BhcnNlT3JkZXJCeUl0ZW0oYXJnc1swXSwgYXJnc1sxXSldO1xuICAgIH1cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgW29yZGVyQnldID0gYXJncztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3JkZXJCeSkpIHtcbiAgICAgICAgICAgIGxvZ09uY2UoJ29yZGVyQnkoYXJyYXkpIGlzIGRlcHJlY2F0ZWQsIHVzZSBtdWx0aXBsZSBvcmRlckJ5IGNhbGxzIGluc3RlYWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gb3JkZXJCeS5tYXAoKGl0ZW0pID0+IHBhcnNlT3JkZXJCeUl0ZW0oaXRlbSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcGFyc2VPcmRlckJ5SXRlbShvcmRlckJ5KV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIGF0IG9yZGVyIGJ5ISBleHBlY3RlZCAxLTIsIHJlY2VpdmVkICR7YXJncy5sZW5ndGh9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlckJ5SXRlbShleHByLCBtb2RpZmllcnMpIHtcbiAgICBjb25zdCBwYXJzZWRSZWYgPSBwYXJzZU9yZGVyQnlFeHByZXNzaW9uKGV4cHIpO1xuICAgIGlmIChPcmRlckJ5SXRlbU5vZGUuaXMocGFyc2VkUmVmKSkge1xuICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGRpcmVjdGlvbiB0d2ljZSEnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VkUmVmO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VPcmRlckJ5V2l0aE1vZGlmaWVycyhwYXJzZWRSZWYsIG1vZGlmaWVycyk7XG59XG5mdW5jdGlvbiBwYXJzZU9yZGVyQnlFeHByZXNzaW9uKGV4cHIpIHtcbiAgICBpZiAoaXNFeHByZXNzaW9uT3JGYWN0b3J5KGV4cHIpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oZXhwcik7XG4gICAgfVxuICAgIGlmIChpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyKGV4cHIpKSB7XG4gICAgICAgIHJldHVybiBleHByLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBjb25zdCBbcmVmLCBkaXJlY3Rpb25dID0gZXhwci5zcGxpdCgnICcpO1xuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgbG9nT25jZShcImBvcmRlckJ5KCdjb2x1bW4gYXNjJylgIGlzIGRlcHJlY2F0ZWQuIFVzZSBgb3JkZXJCeSgnY29sdW1uJywgJ2FzYycpYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlT3JkZXJCeVdpdGhNb2RpZmllcnMocGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKSwgZGlyZWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlKGV4cHIpO1xufVxuZnVuY3Rpb24gcGFyc2VPcmRlckJ5V2l0aE1vZGlmaWVycyhleHByLCBtb2RpZmllcnMpIHtcbiAgICBpZiAodHlwZW9mIG1vZGlmaWVycyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCFpc09yZGVyQnlEaXJlY3Rpb24obW9kaWZpZXJzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIGJ5IGRpcmVjdGlvbjogJHttb2RpZmllcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9yZGVyQnlJdGVtTm9kZS5jcmVhdGUoZXhwciwgUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKG1vZGlmaWVycykpO1xuICAgIH1cbiAgICBpZiAoaXNFeHByZXNzaW9uKG1vZGlmaWVycykpIHtcbiAgICAgICAgbG9nT25jZShcImBvcmRlckJ5KC4uLiwgZXhwcilgIGlzIGRlcHJlY2F0ZWQuIFVzZSBgb3JkZXJCeSguLi4sICdhc2MnKWAgb3IgYG9yZGVyQnkoLi4uLCAob2IpID0+IC4uLilgIGluc3RlYWQuXCIpO1xuICAgICAgICByZXR1cm4gT3JkZXJCeUl0ZW1Ob2RlLmNyZWF0ZShleHByLCBtb2RpZmllcnMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gT3JkZXJCeUl0ZW1Ob2RlLmNyZWF0ZShleHByKTtcbiAgICBpZiAoIW1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGlmaWVycyhuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHsgbm9kZSB9KSkudG9PcGVyYXRpb25Ob2RlKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tcmVmZXJlbmNlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTlJlZmVyZW5jZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0pTT05SZWZlcmVuY2VOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShyZWZlcmVuY2UsIHRyYXZlcnNhbCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICByZWZlcmVuY2UsXG4gICAgICAgICAgICB0cmF2ZXJzYWwsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVHJhdmVyc2FsKG5vZGUsIHRyYXZlcnNhbCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB0cmF2ZXJzYWwsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1vcGVyYXRvci1jaGFpbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05PcGVyYXRvckNoYWluTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShvcGVyYXRvcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OT3BlcmF0b3JDaGFpbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZShbXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVmFsdWUobm9kZSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUoWy4uLm5vZGUudmFsdWVzLCB2YWx1ZV0pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tcGF0aC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05QYXRoTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTlBhdGhOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpbk9wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTm9kZScsXG4gICAgICAgICAgICBpbk9wZXJhdG9yLFxuICAgICAgICAgICAgcGF0aExlZ3M6IGZyZWV6ZShbXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoTGVnKGpzb25QYXRoTm9kZSwgcGF0aExlZykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmpzb25QYXRoTm9kZSxcbiAgICAgICAgICAgIHBhdGhMZWdzOiBmcmVlemUoWy4uLmpzb25QYXRoTm9kZS5wYXRoTGVncywgcGF0aExlZ10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZmVyZW5jZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBSZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBpc1JlYWRvbmx5QXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCBpc0V4cHJlc3Npb25PckZhY3RvcnksIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09yZGVyQnlEaXJlY3Rpb24sIHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBPcGVyYXRvck5vZGUsIGlzSlNPTk9wZXJhdG9yLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlJlZmVyZW5jZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXJlZmVyZW5jZS1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05PcGVyYXRvckNoYWluTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc1N0cmluZyhleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShleHApO1xuICAgIH1cbiAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChhcmcpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIGFyZy5tYXAoKGl0KSA9PiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oaXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGFyZyldO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbk9yRmFjdG9yeShleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oZXhwKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbihleHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSlNPTlJlZmVyZW5jZShyZWYsIG9wKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZik7XG4gICAgaWYgKGlzSlNPTk9wZXJhdG9yKG9wKSkge1xuICAgICAgICByZXR1cm4gSlNPTlJlZmVyZW5jZU5vZGUuY3JlYXRlKHJlZmVyZW5jZU5vZGUsIEpTT05PcGVyYXRvckNoYWluTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcCkpKTtcbiAgICB9XG4gICAgY29uc3Qgb3BXaXRob3V0TGFzdENoYXIgPSBvcC5zbGljZSgwLCAtMSk7XG4gICAgaWYgKGlzSlNPTk9wZXJhdG9yKG9wV2l0aG91dExhc3RDaGFyKSkge1xuICAgICAgICByZXR1cm4gSlNPTlJlZmVyZW5jZU5vZGUuY3JlYXRlKHJlZmVyZW5jZU5vZGUsIEpTT05QYXRoTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcFdpdGhvdXRMYXN0Q2hhcikpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gb3BlcmF0b3I6ICR7b3B9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKSB7XG4gICAgY29uc3QgQ09MVU1OX1NFUEFSQVRPUiA9ICcuJztcbiAgICBpZiAoIXJlZi5pbmNsdWRlcyhDT0xVTU5fU0VQQVJBVE9SKSkge1xuICAgICAgICByZXR1cm4gUmVmZXJlbmNlTm9kZS5jcmVhdGUoQ29sdW1uTm9kZS5jcmVhdGUocmVmKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gcmVmLnNwbGl0KENPTFVNTl9TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZUFuZFNjaGVtYShwYXJ0cyk7XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlKHBhcnRzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGNvbHVtbiByZWZlcmVuY2UgJHtyZWZ9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlKHJlZikge1xuICAgIGNvbnN0IEFMSUFTX1NFUEFSQVRPUiA9ICcgYXMgJztcbiAgICBpZiAocmVmLmluY2x1ZGVzKEFMSUFTX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtblJlZiwgYWxpYXNdID0gcmVmLnNwbGl0KEFMSUFTX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZShwYXJzZVN0cmluZ1JlZmVyZW5jZShjb2x1bW5SZWYpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUoYWxpYXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbHVtbk5hbWUoY29sdW1uKSB7XG4gICAgcmV0dXJuIENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlcmVkQ29sdW1uTmFtZShjb2x1bW4pIHtcbiAgICBjb25zdCBPUkRFUl9TRVBBUkFUT1IgPSAnICc7XG4gICAgaWYgKGNvbHVtbi5pbmNsdWRlcyhPUkRFUl9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5OYW1lLCBvcmRlcl0gPSBjb2x1bW4uc3BsaXQoT1JERVJfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIGlmICghaXNPcmRlckJ5RGlyZWN0aW9uKG9yZGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9yZGVyIGRpcmVjdGlvbiBcIiR7b3JkZXJ9XCIgbmV4dCB0byBcIiR7Y29sdW1uTmFtZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZU9yZGVyQnkoW2NvbHVtbk5hbWUsIG9yZGVyXSlbMF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VDb2x1bW5OYW1lKGNvbHVtbik7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGVBbmRTY2hlbWEocGFydHMpIHtcbiAgICBjb25zdCBbc2NoZW1hLCB0YWJsZSwgY29sdW1uXSA9IHBhcnRzO1xuICAgIHJldHVybiBSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLCBUYWJsZU5vZGUuY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKSk7XG59XG5mdW5jdGlvbiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZShwYXJ0cykge1xuICAgIGNvbnN0IFt0YWJsZSwgY29sdW1uXSA9IHBhcnRzO1xuICAgIHJldHVybiBSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLCBUYWJsZU5vZGUuY3JlYXRlKHRhYmxlKSk7XG59XG5mdW5jdGlvbiB0cmltKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wcmltaXRpdmUtdmFsdWUtbGlzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ByaW1pdGl2ZVZhbHVlTGlzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQcmltaXRpdmVWYWx1ZUxpc3ROb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKFsuLi52YWx1ZXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1saXN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVmFsdWVMaXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVmFsdWVMaXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTGlzdE5vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUodmFsdWVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVmFsdWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlSW1tZWRpYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWl0aXZlLXZhbHVlLWxpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNCb29sZWFuLCBpc051bGwsIGlzTnVtYmVyLCBpc1JlYWRvbmx5QXJyYXksIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCBpc0V4cHJlc3Npb25PckZhY3RvcnksIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QoYXJnKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbkxpc3QoYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlVmFsdWVFeHByZXNzaW9uKGFyZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbk9yRmFjdG9yeShleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oZXhwKTtcbiAgICB9XG4gICAgcmV0dXJuIFZhbHVlTm9kZS5jcmVhdGUoZXhwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgfHwgaXNCb29sZWFuKHZhbHVlKSB8fCBpc051bGwodmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKCFpc1NhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnNhZmUgaW1tZWRpYXRlIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIH1cbiAgICByZXR1cm4gVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBwYXJzZVZhbHVlRXhwcmVzc2lvbkxpc3QoYXJnKSB7XG4gICAgaWYgKGFyZy5zb21lKGlzRXhwcmVzc2lvbk9yRmFjdG9yeSkpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKGFyZy5tYXAoKGl0KSA9PiBwYXJzZVZhbHVlRXhwcmVzc2lvbihpdCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUuY3JlYXRlKGFyZyk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcmVucy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBhcmVuc05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1BhcmVuc05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUGFyZW5zTm9kZScsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQmluYXJ5T3BlcmF0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0Jvb2xlYW4sIGlzTnVsbCwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgT3BlcmF0b3JOb2RlLCBPUEVSQVRPUlMsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCBwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Itbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZUV4cHJlc3Npb24oYXJnc1swXSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbihsZWZ0LCBvcGVyYXRvciwgcmlnaHQpIHtcbiAgICBpZiAoaXNJc09wZXJhdG9yKG9wZXJhdG9yKSAmJiBuZWVkc0lzT3BlcmF0b3IocmlnaHQpKSB7XG4gICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24obGVmdCksIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpLCBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHJpZ2h0KSk7XG4gICAgfVxuICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24obGVmdCksIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpLCBwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdChyaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGVmdCwgb3BlcmF0b3IsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihsZWZ0KSwgcGFyc2VPcGVyYXRvcihvcGVyYXRvciksIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihyaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmlsdGVyT2JqZWN0KG9iaiwgY29tYmluYXRvcikge1xuICAgIHJldHVybiBwYXJzZUZpbHRlckxpc3QoT2JqZWN0LmVudHJpZXMob2JqKVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gIWlzVW5kZWZpbmVkKHYpKVxuICAgICAgICAubWFwKChbaywgdl0pID0+IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24oaywgbmVlZHNJc09wZXJhdG9yKHYpID8gJ2lzJyA6ICc9JywgdikpLCBjb21iaW5hdG9yKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlckxpc3QobGlzdCwgY29tYmluYXRvciwgd2l0aFBhcmVucyA9IHRydWUpIHtcbiAgICBjb25zdCBjb21iaW5lID0gY29tYmluYXRvciA9PT0gJ2FuZCcgPyBBbmROb2RlLmNyZWF0ZSA6IE9yTm9kZS5jcmVhdGU7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKDEpLCBPcGVyYXRvck5vZGUuY3JlYXRlKCc9JyksIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUoY29tYmluYXRvciA9PT0gJ2FuZCcgPyAxIDogMCkpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9IHRvT3BlcmF0aW9uTm9kZShsaXN0WzBdKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IGNvbWJpbmUobm9kZSwgdG9PcGVyYXRpb25Ob2RlKGxpc3RbaV0pKTtcbiAgICB9XG4gICAgaWYgKGxpc3QubGVuZ3RoID4gMSAmJiB3aXRoUGFyZW5zKSB7XG4gICAgICAgIHJldHVybiBQYXJlbnNOb2RlLmNyZWF0ZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBpc0lzT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3IgPT09ICdpcycgfHwgb3BlcmF0b3IgPT09ICdpcyBub3QnO1xufVxuZnVuY3Rpb24gbmVlZHNJc09wZXJhdG9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzTnVsbCh2YWx1ZSkgfHwgaXNCb29sZWFuKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgICBpZiAoaXNTdHJpbmcob3BlcmF0b3IpICYmIE9QRVJBVE9SUy5pbmNsdWRlcyhvcGVyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIE9wZXJhdG9yTm9kZS5jcmVhdGUob3BlcmF0b3IpO1xuICAgIH1cbiAgICBpZiAoaXNPcGVyYXRpb25Ob2RlU291cmNlKG9wZXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gb3BlcmF0b3IudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcGVyYXRvciAke0pTT04uc3RyaW5naWZ5KG9wZXJhdG9yKX1gKTtcbn1cbmZ1bmN0aW9uIHRvT3BlcmF0aW9uTm9kZShub2RlT3JTb3VyY2UpIHtcbiAgICByZXR1cm4gaXNPcGVyYXRpb25Ob2RlU291cmNlKG5vZGVPclNvdXJjZSlcbiAgICAgICAgPyBub2RlT3JTb3VyY2UudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgOiBub2RlT3JTb3VyY2U7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JkZXJCeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yZGVyQnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKFsuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEl0ZW1zKG9yZGVyQnksIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3JkZXJCeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLm9yZGVyQnkuaXRlbXMsIC4uLml0ZW1zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFydGl0aW9uLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUGFydGl0aW9uQnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQYXJ0aXRpb25CeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJdGVtcyhwYXJ0aXRpb25CeSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5wYXJ0aXRpb25CeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLnBhcnRpdGlvbkJ5Lml0ZW1zLCAuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL292ZXItbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE9yZGVyQnlOb2RlIH0gZnJvbSAnLi9vcmRlci1ieS1ub2RlLmpzJztcbmltcG9ydCB7IFBhcnRpdGlvbkJ5Tm9kZSB9IGZyb20gJy4vcGFydGl0aW9uLWJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE92ZXJOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPdmVyTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ092ZXJOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXMob3Zlck5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3Zlck5vZGUsXG4gICAgICAgICAgICBvcmRlckJ5OiBvdmVyTm9kZS5vcmRlckJ5XG4gICAgICAgICAgICAgICAgPyBPcmRlckJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhvdmVyTm9kZS5vcmRlckJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IE9yZGVyQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoUGFydGl0aW9uQnlJdGVtcyhvdmVyTm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vdmVyTm9kZSxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5OiBvdmVyTm9kZS5wYXJ0aXRpb25CeVxuICAgICAgICAgICAgICAgID8gUGFydGl0aW9uQnlOb2RlLmNsb25lV2l0aEl0ZW1zKG92ZXJOb2RlLnBhcnRpdGlvbkJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IFBhcnRpdGlvbkJ5Tm9kZS5jcmVhdGUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Zyb20tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGcm9tTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRnJvbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZyb21zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Zyb21Ob2RlJyxcbiAgICAgICAgICAgIGZyb21zOiBmcmVlemUoZnJvbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb21zKGZyb20sIGZyb21zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZnJvbSxcbiAgICAgICAgICAgIGZyb21zOiBmcmVlemUoWy4uLmZyb20uZnJvbXMsIC4uLmZyb21zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZ3JvdXAtYnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBHcm91cEJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnR3JvdXBCeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0dyb3VwQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEl0ZW1zKGdyb3VwQnksIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZ3JvdXBCeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLmdyb3VwQnkuaXRlbXMsIC4uLml0ZW1zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaGF2aW5nLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPck5vZGUgfSBmcm9tICcuL29yLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEhhdmluZ05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0hhdmluZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdIYXZpbmdOb2RlJyxcbiAgICAgICAgICAgIGhhdmluZzogZmlsdGVyLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9wZXJhdGlvbihoYXZpbmdOb2RlLCBvcGVyYXRvciwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uaGF2aW5nTm9kZSxcbiAgICAgICAgICAgIGhhdmluZzogb3BlcmF0b3IgPT09ICdBbmQnXG4gICAgICAgICAgICAgICAgPyBBbmROb2RlLmNyZWF0ZShoYXZpbmdOb2RlLmhhdmluZywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogT3JOb2RlLmNyZWF0ZShoYXZpbmdOb2RlLmhhdmluZywgb3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbnNlcnQtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBJbnNlcnRRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0luc2VydFF1ZXJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaW50bywgd2l0aE5vZGUsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSW5zZXJ0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGludG8sXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgICAgIHJlcGxhY2UsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aG91dEludG8oKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0luc2VydFF1ZXJ5Tm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGluc2VydFF1ZXJ5LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmluc2VydFF1ZXJ5LFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbGlzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IExpc3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdMaXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTGlzdE5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXF1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBGcm9tTm9kZSB9IGZyb20gJy4vZnJvbS1ub2RlLmpzJztcbmltcG9ydCB7IExpc3ROb2RlIH0gZnJvbSAnLi9saXN0LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFVwZGF0ZVF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVXBkYXRlUXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZXMsIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VwZGF0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHVzZSB0aGUgcmF3IHRhYmxlIG5vZGUgd2hlbiB0aGVyZSdzIG9ubHkgb25lIHRhYmxlXG4gICAgICAgICAgICAvLyBhbmQgZG9uJ3QgcmVuYW1lIHRoZSBwcm9wZXJ0eSB0byBzb21ldGhpbmcgbGlrZSBgdGFibGVzYC5cbiAgICAgICAgICAgIHRhYmxlOiB0YWJsZXMubGVuZ3RoID09PSAxID8gdGFibGVzWzBdIDogTGlzdE5vZGUuY3JlYXRlKHRhYmxlcyksXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRob3V0VGFibGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VwZGF0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbUl0ZW1zKHVwZGF0ZVF1ZXJ5LCBmcm9tSXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi51cGRhdGVRdWVyeSxcbiAgICAgICAgICAgIGZyb206IHVwZGF0ZVF1ZXJ5LmZyb21cbiAgICAgICAgICAgICAgICA/IEZyb21Ob2RlLmNsb25lV2l0aEZyb21zKHVwZGF0ZVF1ZXJ5LmZyb20sIGZyb21JdGVtcylcbiAgICAgICAgICAgICAgICA6IEZyb21Ob2RlLmNyZWF0ZShmcm9tSXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVwZGF0ZXModXBkYXRlUXVlcnksIHVwZGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi51cGRhdGVRdWVyeSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHVwZGF0ZVF1ZXJ5LnVwZGF0ZXNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udXBkYXRlUXVlcnkudXBkYXRlcywgLi4udXBkYXRlc10pXG4gICAgICAgICAgICAgICAgOiB1cGRhdGVzLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aExpbWl0KHVwZGF0ZVF1ZXJ5LCBsaW1pdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZVF1ZXJ5LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXNpbmctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVc2luZ05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VzaW5nTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VzaW5nTm9kZScsXG4gICAgICAgICAgICB0YWJsZXM6IGZyZWV6ZSh0YWJsZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRhYmxlcyh1c2luZywgdGFibGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4udXNpbmcsXG4gICAgICAgICAgICB0YWJsZXM6IGZyZWV6ZShbLi4udXNpbmcudGFibGVzLCAuLi50YWJsZXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWxldGUtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEZyb21Ob2RlIH0gZnJvbSAnLi9mcm9tLW5vZGUuanMnO1xuaW1wb3J0IHsgVXNpbmdOb2RlIH0gZnJvbSAnLi91c2luZy1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4vcXVlcnktbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVsZXRlUXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEZWxldGVRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZyb21JdGVtcywgd2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRGVsZXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IEZyb21Ob2RlLmNyZWF0ZShmcm9tSXRlbXMpLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXM6IChub2RlLCBpdGVtcykgPT4gUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyhub2RlLCBpdGVtcyksXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhvdXRPcmRlckJ5OiAobm9kZSkgPT4gUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkobm9kZSksXG4gICAgY2xvbmVXaXRoTGltaXQoZGVsZXRlTm9kZSwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kZWxldGVOb2RlLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0TGltaXQoZGVsZXRlTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRlbGV0ZU5vZGUsXG4gICAgICAgICAgICBsaW1pdDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVzaW5nKGRlbGV0ZU5vZGUsIHRhYmxlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRlbGV0ZU5vZGUsXG4gICAgICAgICAgICB1c2luZzogZGVsZXRlTm9kZS51c2luZyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBVc2luZ05vZGUuY2xvbmVXaXRoVGFibGVzKGRlbGV0ZU5vZGUudXNpbmcsIHRhYmxlcylcbiAgICAgICAgICAgICAgICA6IFVzaW5nTm9kZS5jcmVhdGUodGFibGVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aGVyZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4vYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi9vci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBXaGVyZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1doZXJlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1doZXJlTm9kZScsXG4gICAgICAgICAgICB3aGVyZTogZmlsdGVyLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9wZXJhdGlvbih3aGVyZU5vZGUsIG9wZXJhdG9yLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi53aGVyZU5vZGUsXG4gICAgICAgICAgICB3aGVyZTogb3BlcmF0b3IgPT09ICdBbmQnXG4gICAgICAgICAgICAgICAgPyBBbmROb2RlLmNyZWF0ZSh3aGVyZU5vZGUud2hlcmUsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IE9yTm9kZS5jcmVhdGUod2hlcmVOb2RlLndoZXJlLCBvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JldHVybmluZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJldHVybmluZ05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JldHVybmluZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmV0dXJuaW5nTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2VsZWN0aW9ucyhyZXR1cm5pbmcsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5yZXR1cm5pbmcsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiByZXR1cm5pbmcuc2VsZWN0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5yZXR1cm5pbmcuc2VsZWN0aW9ucywgLi4uc2VsZWN0aW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZXhwbGFpbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEV4cGxhaW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdFeHBsYWluTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0V4cGxhaW5Ob2RlJyxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2hlbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFdoZW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdXaGVuTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uZGl0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1doZW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhSZXN1bHQod2hlbk5vZGUsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLndoZW5Ob2RlLFxuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXF1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBXaGVuTm9kZSB9IGZyb20gJy4vd2hlbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBNZXJnZVF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTWVyZ2VRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGludG8sIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01lcmdlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGludG8sXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVc2luZyhtZXJnZU5vZGUsIHVzaW5nKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubWVyZ2VOb2RlLFxuICAgICAgICAgICAgdXNpbmcsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoV2hlbihtZXJnZU5vZGUsIHdoZW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5tZXJnZU5vZGUsXG4gICAgICAgICAgICB3aGVuczogbWVyZ2VOb2RlLndoZW5zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLm1lcmdlTm9kZS53aGVucywgd2hlbl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW3doZW5dKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUaGVuKG1lcmdlTm9kZSwgdGhlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm1lcmdlTm9kZSxcbiAgICAgICAgICAgIHdoZW5zOiBtZXJnZU5vZGUud2hlbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbXG4gICAgICAgICAgICAgICAgICAgIC4uLm1lcmdlTm9kZS53aGVucy5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgICAgIFdoZW5Ob2RlLmNsb25lV2l0aFJlc3VsdChtZXJnZU5vZGUud2hlbnNbbWVyZ2VOb2RlLndoZW5zLmxlbmd0aCAtIDFdLCB0aGVuKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL291dHB1dC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE91dHB1dE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ091dHB1dE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3V0cHV0Tm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2VsZWN0aW9ucyhvdXRwdXQsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vdXRwdXQsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBvdXRwdXQuc2VsZWN0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5vdXRwdXQuc2VsZWN0aW9ucywgLi4uc2VsZWN0aW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4vaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlOb2RlIH0gZnJvbSAnLi9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeU5vZGUgfSBmcm9tICcuL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vZGVsZXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlcmVOb2RlIH0gZnJvbSAnLi93aGVyZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJldHVybmluZ05vZGUgfSBmcm9tICcuL3JldHVybmluZy1ub2RlLmpzJztcbmltcG9ydCB7IEV4cGxhaW5Ob2RlIH0gZnJvbSAnLi9leHBsYWluLW5vZGUuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeU5vZGUgfSBmcm9tICcuL21lcmdlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgT3V0cHV0Tm9kZSB9IGZyb20gJy4vb3V0cHV0LW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeU5vZGUgfSBmcm9tICcuL29yZGVyLWJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gKFNlbGVjdFF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgSW5zZXJ0UXVlcnlOb2RlLmlzKG5vZGUpIHx8XG4gICAgICAgICAgICBVcGRhdGVRdWVyeU5vZGUuaXMobm9kZSkgfHxcbiAgICAgICAgICAgIERlbGV0ZVF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgTWVyZ2VRdWVyeU5vZGUuaXMobm9kZSkpO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRW5kTW9kaWZpZXIobm9kZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiBub2RlLmVuZE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5ub2RlLmVuZE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFdoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB3aGVyZTogbm9kZS53aGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLndoZXJlLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEpvaW4obm9kZSwgam9pbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBqb2luczogbm9kZS5qb2lucyA/IGZyZWV6ZShbLi4ubm9kZS5qb2lucywgam9pbl0pIDogZnJlZXplKFtqb2luXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoUmV0dXJuaW5nKG5vZGUsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiBub2RlLnJldHVybmluZ1xuICAgICAgICAgICAgICAgID8gUmV0dXJuaW5nTm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKG5vZGUucmV0dXJuaW5nLCBzZWxlY3Rpb25zKVxuICAgICAgICAgICAgICAgIDogUmV0dXJuaW5nTm9kZS5jcmVhdGUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0UmV0dXJuaW5nKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0V2hlcmUobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB3aGVyZTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEV4cGxhaW4obm9kZSwgZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGV4cGxhaW46IEV4cGxhaW5Ob2RlLmNyZWF0ZShmb3JtYXQsIG9wdGlvbnM/LnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUb3Aobm9kZSwgdG9wKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPdXRwdXQobm9kZSwgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBvdXRwdXQ6IG5vZGUub3V0cHV0XG4gICAgICAgICAgICAgICAgPyBPdXRwdXROb2RlLmNsb25lV2l0aFNlbGVjdGlvbnMobm9kZS5vdXRwdXQsIHNlbGVjdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBPdXRwdXROb2RlLmNyZWF0ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXMobm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgb3JkZXJCeTogbm9kZS5vcmRlckJ5XG4gICAgICAgICAgICAgICAgPyBPcmRlckJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhub2RlLm9yZGVyQnksIGl0ZW1zKVxuICAgICAgICAgICAgICAgIDogT3JkZXJCeU5vZGUuY3JlYXRlKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRPcmRlckJ5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgb3JkZXJCeTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdC1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRnJvbU5vZGUgfSBmcm9tICcuL2Zyb20tbm9kZS5qcyc7XG5pbXBvcnQgeyBHcm91cEJ5Tm9kZSB9IGZyb20gJy4vZ3JvdXAtYnktbm9kZS5qcyc7XG5pbXBvcnQgeyBIYXZpbmdOb2RlIH0gZnJvbSAnLi9oYXZpbmctbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuL3F1ZXJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0UXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RRdWVyeU5vZGUnLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlRnJvbShmcm9tSXRlbXMsIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiBGcm9tTm9kZS5jcmVhdGUoZnJvbUl0ZW1zKSxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFNlbGVjdGlvbnMoc2VsZWN0LCBzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0aW9uczogc2VsZWN0LnNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0LnNlbGVjdGlvbnMsIC4uLnNlbGVjdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aERpc3RpbmN0T24oc2VsZWN0LCBleHByZXNzaW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGRpc3RpbmN0T246IHNlbGVjdC5kaXN0aW5jdE9uXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnNlbGVjdC5kaXN0aW5jdE9uLCAuLi5leHByZXNzaW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoZXhwcmVzc2lvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb250TW9kaWZpZXIoc2VsZWN0LCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiBzZWxlY3QuZnJvbnRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0LmZyb250TW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW21vZGlmaWVyXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXM6IChub2RlLCBpdGVtcykgPT4gUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyhub2RlLCBpdGVtcyksXG4gICAgY2xvbmVXaXRoR3JvdXBCeUl0ZW1zKHNlbGVjdE5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIGdyb3VwQnk6IHNlbGVjdE5vZGUuZ3JvdXBCeVxuICAgICAgICAgICAgICAgID8gR3JvdXBCeU5vZGUuY2xvbmVXaXRoSXRlbXMoc2VsZWN0Tm9kZS5ncm91cEJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IEdyb3VwQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoTGltaXQoc2VsZWN0Tm9kZSwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT2Zmc2V0KHNlbGVjdE5vZGUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRmV0Y2goc2VsZWN0Tm9kZSwgZmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSGF2aW5nKHNlbGVjdE5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBoYXZpbmc6IHNlbGVjdE5vZGUuaGF2aW5nXG4gICAgICAgICAgICAgICAgPyBIYXZpbmdOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihzZWxlY3ROb2RlLmhhdmluZywgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IEhhdmluZ05vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyhzZWxlY3ROb2RlLCBzZXRPcGVyYXRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIHNldE9wZXJhdGlvbnM6IHNlbGVjdE5vZGUuc2V0T3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5zZWxlY3ROb2RlLnNldE9wZXJhdGlvbnMsIC4uLnNldE9wZXJhdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFsuLi5zZXRPcGVyYXRpb25zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0U2VsZWN0aW9ucyhzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBbXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRMaW1pdChzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBsaW1pdDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dE9mZnNldChzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gdjAuMjlcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGNsb25lV2l0aG91dE9yZGVyQnk6IChub2RlKSA9PiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeShub2RlKSxcbiAgICBjbG9uZVdpdGhvdXRHcm91cEJ5KHNlbGVjdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGdyb3VwQnk6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qb2luLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEpvaW5CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBvbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSm9pbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBqb2luTm9kZTogSm9pbk5vZGUuY2xvbmVXaXRoT24odGhpcy4jcHJvcHMuam9pbk5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVzdCBsaWtlIHtAbGluayBXaGVyZUludGVyZmFjZS53aGVyZVJlZn0gYnV0IGFkZHMgYW4gaXRlbSB0byB0aGUgam9pbidzXG4gICAgICogYG9uYCBjbGF1c2UgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgV2hlcmVJbnRlcmZhY2Uud2hlcmVSZWZ9IGZvciBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy5cbiAgICAgKi9cbiAgICBvblJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jbG9uZVdpdGhPbih0aGlzLiNwcm9wcy5qb2luTm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG9uIHRydWVgLlxuICAgICAqL1xuICAgIG9uVHJ1ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jbG9uZVdpdGhPbih0aGlzLiNwcm9wcy5qb2luTm9kZSwgUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKCd0cnVlJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5qb2luTm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcnRpdGlvbi1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUGFydGl0aW9uQnlJdGVtTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUGFydGl0aW9uQnlJdGVtTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocGFydGl0aW9uQnkpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUGFydGl0aW9uQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBwYXJ0aXRpb25CeSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJ0aXRpb24tYnktcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgUGFydGl0aW9uQnlJdGVtTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJ0aXRpb25CeShwYXJ0aXRpb25CeSkge1xuICAgIHJldHVybiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QocGFydGl0aW9uQnkpLm1hcChQYXJ0aXRpb25CeUl0ZW1Ob2RlLmNyZWF0ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL292ZXItYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IE92ZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Zlci1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VQYXJ0aXRpb25CeSwgfSBmcm9tICcuLi9wYXJzZXIvcGFydGl0aW9uLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3ZlckJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJCdWlsZGVyKHtcbiAgICAgICAgICAgIG92ZXJOb2RlOiBPdmVyTm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMub3Zlck5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICAgICAgb3Zlck5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KHRoaXMuI3Byb3BzLm92ZXJOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhcnRpdGlvbkJ5KHBhcnRpdGlvbkJ5KSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICAgICAgb3Zlck5vZGU6IE92ZXJOb2RlLmNsb25lV2l0aFBhcnRpdGlvbkJ5SXRlbXModGhpcy4jcHJvcHMub3Zlck5vZGUsIHBhcnNlUGFydGl0aW9uQnkocGFydGl0aW9uQnkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMub3Zlck5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3Rpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZU5vZGUgfSBmcm9tICcuL3JlZmVyZW5jZS1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdEFsbE5vZGUgfSBmcm9tICcuL3NlbGVjdC1hbGwtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdGlvbk5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlU2VsZWN0QWxsKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogU2VsZWN0QWxsTm9kZS5jcmVhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVTZWxlY3RBbGxGcm9tVGFibGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0aW9uTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb246IFJlZmVyZW5jZU5vZGUuY3JlYXRlU2VsZWN0QWxsKHRhYmxlKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNSZWFkb25seUFycmF5LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNlbGVjdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUFsaWFzZWRTdHJpbmdSZWZlcmVuY2UgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciwgfSBmcm9tICcuLi9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VBbGlhc2VkRXhwcmVzc2lvbiwgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBleHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKGV4cHJlc3Npb25CdWlsZGVyKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNSZWFkb25seUFycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5tYXAoKGl0KSA9PiBwYXJzZVNlbGVjdEV4cHJlc3Npb24oaXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VTZWxlY3RFeHByZXNzaW9uKHNlbGVjdGlvbildO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlU2VsZWN0RXhwcmVzc2lvbihzZWxlY3Rpb24pIHtcbiAgICBpZiAoaXNTdHJpbmcoc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGUocGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlKHNlbGVjdGlvbikpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyKHNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbk5vZGUuY3JlYXRlKHNlbGVjdGlvbi50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGUocGFyc2VBbGlhc2VkRXhwcmVzc2lvbihzZWxlY3Rpb24pKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZWxlY3RBbGwodGFibGUpIHtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBbU2VsZWN0aW9uTm9kZS5jcmVhdGVTZWxlY3RBbGwoKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGFibGUpKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5tYXAocGFyc2VTZWxlY3RBbGxBcmcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZVNlbGVjdEFsbEFyZyh0YWJsZSldO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlU2VsZWN0QWxsQXJnKHRhYmxlKSB7XG4gICAgaWYgKGlzU3RyaW5nKHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGVTZWxlY3RBbGxGcm9tVGFibGUocGFyc2VUYWJsZSh0YWJsZSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdmFsdWUgc2VsZWN0QWxsIGV4cHJlc3Npb246ICR7SlNPTi5zdHJpbmdpZnkodGFibGUpfWApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZXMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBWYWx1ZXNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdWYWx1ZXNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVzTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZSh2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtaW5zZXJ0LXZhbHVlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEluc2VydFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGVmYXVsdEluc2VydFZhbHVlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RlZmF1bHRJbnNlcnRWYWx1ZU5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC12YWx1ZXMtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltaXRpdmUtdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXksIGlzVW5kZWZpbmVkLCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uIH0gZnJvbSAnLi92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgVmFsdWVzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlcy1ub2RlLmpzJztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbk9yRmFjdG9yeSB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRGVmYXVsdEluc2VydFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2RlZmF1bHQtaW5zZXJ0LXZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5zZXJ0RXhwcmVzc2lvbihhcmcpIHtcbiAgICBjb25zdCBvYmplY3RPckxpc3QgPSBpc0Z1bmN0aW9uKGFyZykgPyBhcmcoZXhwcmVzc2lvbkJ1aWxkZXIoKSkgOiBhcmc7XG4gICAgY29uc3QgbGlzdCA9IGlzUmVhZG9ubHlBcnJheShvYmplY3RPckxpc3QpXG4gICAgICAgID8gb2JqZWN0T3JMaXN0XG4gICAgICAgIDogZnJlZXplKFtvYmplY3RPckxpc3RdKTtcbiAgICByZXR1cm4gcGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzKGxpc3QpO1xufVxuZnVuY3Rpb24gcGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzKHJvd3MpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gcGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMocm93cyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgZnJlZXplKFsuLi5jb2x1bW5zLmtleXMoKV0ubWFwKENvbHVtbk5vZGUuY3JlYXRlKSksXG4gICAgICAgIFZhbHVlc05vZGUuY3JlYXRlKHJvd3MubWFwKChyb3cpID0+IHBhcnNlUm93VmFsdWVzKHJvdywgY29sdW1ucykpKSxcbiAgICBdO1xufVxuZnVuY3Rpb24gcGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMocm93cykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCBjb2xzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xuICAgICAgICAgICAgaWYgKCFjb2x1bW5zLmhhcyhjb2wpICYmIHJvd1tjb2xdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnNldChjb2wsIGNvbHVtbnMuc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbnM7XG59XG5mdW5jdGlvbiBwYXJzZVJvd1ZhbHVlcyhyb3csIGNvbHVtbnMpIHtcbiAgICBjb25zdCByb3dDb2x1bW5zID0gT2JqZWN0LmtleXMocm93KTtcbiAgICBjb25zdCByb3dWYWx1ZXMgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiBjb2x1bW5zLnNpemUsXG4gICAgfSk7XG4gICAgbGV0IGhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMgPSBmYWxzZTtcbiAgICBsZXQgaW5kZXhlZFJvd0NvbHVtbnMgPSByb3dDb2x1bW5zLmxlbmd0aDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiByb3dDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbklkeCA9IGNvbHVtbnMuZ2V0KGNvbCk7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChjb2x1bW5JZHgpKSB7XG4gICAgICAgICAgICBpbmRleGVkUm93Q29sdW1ucy0tO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbY29sXTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCBpc0V4cHJlc3Npb25PckZhY3RvcnkodmFsdWUpKSB7XG4gICAgICAgICAgICBoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByb3dWYWx1ZXNbY29sdW1uSWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBoYXNNaXNzaW5nQ29sdW1ucyA9IGluZGV4ZWRSb3dDb2x1bW5zIDwgY29sdW1ucy5zaXplO1xuICAgIGlmIChoYXNNaXNzaW5nQ29sdW1ucyB8fCBoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IERlZmF1bHRJbnNlcnRWYWx1ZU5vZGUuY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShyb3dWYWx1ZXMubWFwKChpdCkgPT4gaXNVbmRlZmluZWQoaXQpID8gZGVmYXVsdFZhbHVlIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24oaXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlLmNyZWF0ZShyb3dWYWx1ZXMpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb2x1bW4tdXBkYXRlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29sdW1uVXBkYXRlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sdW1uVXBkYXRlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5VcGRhdGVOb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VwZGF0ZS1zZXQtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtblVwZGF0ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tdXBkYXRlLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uIH0gZnJvbSAnLi92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcGRhdGUoLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgQ29sdW1uVXBkYXRlTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGFyZ3NbMF0pLCBwYXJzZVZhbHVlRXhwcmVzc2lvbihhcmdzWzFdKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24oYXJnc1swXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSkge1xuICAgIGNvbnN0IHVwZGF0ZU9iaiA9IGlzRnVuY3Rpb24odXBkYXRlKSA/IHVwZGF0ZShleHByZXNzaW9uQnVpbGRlcigpKSA6IHVwZGF0ZTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModXBkYXRlT2JqKVxuICAgICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIENvbHVtblVwZGF0ZU5vZGUuY3JlYXRlKENvbHVtbk5vZGUuY3JlYXRlKGtleSksIHBhcnNlVmFsdWVFeHByZXNzaW9uKHZhbHVlKSk7XG4gICAgfSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWR1cGxpY2F0ZS1rZXktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPbkR1cGxpY2F0ZUtleU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09uRHVwbGljYXRlS2V5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodXBkYXRlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbkR1cGxpY2F0ZUtleU5vZGUnLFxuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbnNlcnQtcmVzdWx0LmQudHNcIiAvPlxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIGFuIGluc2VydCBxdWVyeS5cbiAqXG4gKiBJZiB0aGUgdGFibGUgaGFzIGFuIGF1dG8gaW5jcmVtZW50aW5nIHByaW1hcnkga2V5IHtAbGluayBpbnNlcnRJZH0gd2lsbCBob2xkXG4gKiB0aGUgZ2VuZXJhdGVkIGlkIG9uIGRpYWxlY3RzIHRoYXQgc3VwcG9ydCBpdC4gRm9yIGV4YW1wbGUgUG9zdGdyZVNRTCBkb2Vzbid0XG4gKiByZXR1cm4gdGhlIGlkIGJ5IGRlZmF1bHQgYW5kIHtAbGluayBpbnNlcnRJZH0gaXMgdW5kZWZpbmVkLiBPbiBQb3N0Z3JlU1FMIHlvdVxuICogbmVlZCB0byB1c2Uge0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmd9IG9yIHtAbGluayBSZXR1cm5pbmdJbnRlcmZhY2UucmV0dXJuaW5nQWxsfVxuICogdG8gZ2V0IG91dCB0aGUgaW5zZXJ0ZWQgaWQuXG4gKlxuICoge0BsaW5rIG51bUluc2VydGVkT3JVcGRhdGVkUm93c30gaG9sZHMgdGhlIG51bWJlciBvZiAoYWN0dWFsbHkpIGluc2VydGVkIHJvd3MuXG4gKiBPbiBNeVNRTCwgdXBkYXRlZCByb3dzIGFyZSBjb3VudGVkIHR3aWNlIHdoZW4gdXNpbmcgYG9uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlYC5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydFBlcnNvbihwZXJzb246IE5ld1BlcnNvbikge1xuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICogICAgIC52YWx1ZXMocGVyc29uKVxuICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gKlxuICogICBjb25zb2xlLmxvZyhyZXN1bHQuaW5zZXJ0SWQpIC8vIHJlbGV2YW50IG9uIE15U1FMXG4gKiAgIGNvbnNvbGUubG9nKHJlc3VsdC5udW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MpIC8vIGFsd2F5cyByZWxldmFudFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnNlcnRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRvIGluY3JlbWVudGluZyBwcmltYXJ5IGtleSBvZiB0aGUgaW5zZXJ0ZWQgcm93LlxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdW5kZWZpbmVkIHdoZW4gdGhlIHF1ZXJ5IGNvbnRhaW5zIGFuIGBvbiBjb25mbGljdGBcbiAgICAgKiBjbGF1c2UgdGhhdCBtYWtlcyB0aGUgcXVlcnkgc3VjY2VlZCBldmVuIHdoZW4gbm90aGluZyBnZXRzIGluc2VydGVkLlxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgdW5kZWZpbmVkIG9uIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCB0aGF0XG4gICAgICogZG9uJ3QgcmV0dXJuIHRoZSBpbnNlcnRlZCBpZCBieSBkZWZhdWx0LiBPbiB0aG9zZSBkaWFsZWN0cyB5b3UgbmVlZFxuICAgICAqIHRvIHVzZSB0aGUge0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmcgfCByZXR1cm5pbmd9IG1ldGhvZC5cbiAgICAgKi9cbiAgICBpbnNlcnRJZDtcbiAgICAvKipcbiAgICAgKiBBZmZlY3RlZCByb3dzIGNvdW50LlxuICAgICAqL1xuICAgIG51bUluc2VydGVkT3JVcGRhdGVkUm93cztcbiAgICBjb25zdHJ1Y3RvcihpbnNlcnRJZCwgbnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzKSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0SWQgPSBpbnNlcnRJZDtcbiAgICAgICAgdGhpcy5udW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MgPSBudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9uby1yZXN1bHQtZXJyb3IuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgTm9SZXN1bHRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0aW9uIG5vZGUgdHJlZSBvZiB0aGUgcXVlcnkgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAgICovXG4gICAgbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHN1cGVyKCdubyByZXN1bHQnKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZm4pIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZuLCAncHJvdG90eXBlJyk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWNvbmZsaWN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBXaGVyZU5vZGUgfSBmcm9tICcuL3doZXJlLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9uQ29uZmxpY3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPbkNvbmZsaWN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09uQ29uZmxpY3ROb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSW5kZXhXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgaW5kZXhXaGVyZTogbm9kZS5pbmRleFdoZXJlXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKG5vZGUuaW5kZXhXaGVyZSwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJbmRleE9yV2hlcmUobm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IG5vZGUuaW5kZXhXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLmluZGV4V2hlcmUsICdPcicsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVcGRhdGVXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdXBkYXRlV2hlcmU6IG5vZGUudXBkYXRlV2hlcmVcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24obm9kZS51cGRhdGVXaGVyZSwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVcGRhdGVPcldoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB1cGRhdGVXaGVyZTogbm9kZS51cGRhdGVXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLnVwZGF0ZVdoZXJlLCAnT3InLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0SW5kZXhXaGVyZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRVcGRhdGVXaGVyZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHVwZGF0ZVdoZXJlOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tY29uZmxpY3QtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBPbkNvbmZsaWN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29uLWNvbmZsaWN0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT25Db25mbGljdEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBzaW5nbGUgY29sdW1uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGNvbHVtbnN9LCB7QGxpbmsgY29uc3RyYWludH0gYW5kIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIG1ldGhvZHMgZm9yIGFsdGVybmF0aXZlIHdheXMgdG8gc3BlY2lmeSB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIGNvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgY29uc3QgY29sdW1uTm9kZSA9IENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1ucywgY29sdW1uTm9kZV0pXG4gICAgICAgICAgICAgICAgICAgIDogZnJlZXplKFtjb2x1bW5Ob2RlXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBsaXN0IG9mIGNvbHVtbnMgYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbnN0cmFpbnR9IGFuZCB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTm9kZXMgPSBjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1ucywgLi4uY29sdW1uTm9kZXNdKVxuICAgICAgICAgICAgICAgICAgICA6IGZyZWV6ZShjb2x1bW5Ob2RlcyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBzcGVjaWZpYyBjb25zdHJhaW50IGJ5IG5hbWUgYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbHVtbnN9IGFuZCB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBjb25zdHJhaW50KGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludDogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBleHByZXNzaW9uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSB1bmlxdWUgaW5kZXggaXMgYW4gZXhwcmVzc2lvbiBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbHVtbnN9IGFuZCB7QGxpbmsgY29uc3RyYWludH1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICBpbmRleEV4cHJlc3Npb246IGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhJbmRleFdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aEluZGV4V2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aG91dEluZGV4V2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJkbyBub3RoaW5nXCIgY29uZmxpY3QgYWN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IGZpcnN0X25hbWUgPSAnSm9obidcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1x1MDBBMGZpcnN0X25hbWUsIGlkIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgLmRvTm90aGluZygpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJpZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpIGRvIG5vdGhpbmdcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdERvTm90aGluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgZG9Ob3RoaW5nOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImRvIHVwZGF0ZSBzZXRcIiBjb25mbGljdCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaWQgPSAxXG4gICAgICogY29uc3QgZmlyc3RfbmFtZSA9ICdKb2huJ1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XHUwMEEwZmlyc3RfbmFtZSwgaWQgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignaWQnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBmaXJzdF9uYW1lIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJpZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpXG4gICAgICogZG8gdXBkYXRlIHNldCBcImZpcnN0X25hbWVcIiA9ICQzXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGUgbmV4dCBleGFtcGxlIHdlIHVzZSB0aGUgYHJlZmAgbWV0aG9kIHRvIHJlZmVyZW5jZVxuICAgICAqIGNvbHVtbnMgb2YgdGhlIHZpcnR1YWwgdGFibGUgYGV4Y2x1ZGVkYCBpbiBhIHR5cGUtc2FmZSB3YXlcbiAgICAgKiB0byBjcmVhdGUgYW4gdXBzZXJ0IG9wZXJhdGlvbjpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UGVyc29uKHBlcnNvbjogTmV3UGVyc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICogICBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHBlcnNvbilcbiAgICAgKiAgICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgICAuZG9VcGRhdGVTZXQoKGViKSA9PiAoe1xuICAgICAqICAgICAgICAgZmlyc3RfbmFtZTogZWIucmVmKCdleGNsdWRlZC5maXJzdF9uYW1lJyksXG4gICAgICogICAgICAgICBsYXN0X25hbWU6IGViLnJlZignZXhjbHVkZWQubGFzdF9uYW1lJylcbiAgICAgKiAgICAgICB9KVxuICAgICAqICAgICApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIpXG4gICAgICogb24gY29uZmxpY3QgKFwiaWRcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0XG4gICAgICogIFwiZmlyc3RfbmFtZVwiID0gZXhjbHVkZWQuXCJmaXJzdF9uYW1lXCIsXG4gICAgICogIFwibGFzdF9uYW1lXCIgPSBleGNsdWRlZC5cImxhc3RfbmFtZVwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZG9VcGRhdGVTZXQodXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgdXBkYXRlczogcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgT25Db25mbGljdERvTm90aGluZ0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RVcGRhdGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aFVwZGF0ZVdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSB3aGVyZSBjb25kaXRpb24gZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBXaGVyZUludGVyZmFjZS53aGVyZVJlZn0gZm9yIG1vcmUgaW5mby5cbiAgICAgKi9cbiAgICB3aGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhVcGRhdGVXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRob3V0VXBkYXRlV2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3RvcC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRvcE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1RvcE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUb3BOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBtb2RpZmllcnMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdG9wLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IFRvcE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90b3Atbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0JpZ0ludCwgaXNOdW1iZXIsIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgIGlmICghaXNOdW1iZXIoZXhwcmVzc2lvbikgJiYgIWlzQmlnSW50KGV4cHJlc3Npb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0b3AgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1vZGlmaWVycykgJiYgIWlzVG9wTW9kaWZpZXJzKG1vZGlmaWVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRvcCBtb2RpZmllcnM6ICR7bW9kaWZpZXJzfWApO1xuICAgIH1cbiAgICByZXR1cm4gVG9wTm9kZS5jcmVhdGUoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKTtcbn1cbmZ1bmN0aW9uIGlzVG9wTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAgIHJldHVybiAobW9kaWZpZXJzID09PSAncGVyY2VudCcgfHxcbiAgICAgICAgbW9kaWZpZXJzID09PSAnd2l0aCB0aWVzJyB8fFxuICAgICAgICBtb2RpZmllcnMgPT09ICdwZXJjZW50IHdpdGggdGllcycpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vci1hY3Rpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPckFjdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yQWN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09yQWN0aW9uTm9kZScsXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaW5zZXJ0LXF1ZXJ5LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VJbnNlcnRFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9pbnNlcnQtdmFsdWVzLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pbnNlcnQtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdXBkYXRlLXNldC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgT25EdXBsaWNhdGVLZXlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb24tZHVwbGljYXRlLWtleS1ub2RlLmpzJztcbmltcG9ydCB7IEluc2VydFJlc3VsdCB9IGZyb20gJy4vaW5zZXJ0LXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBPbkNvbmZsaWN0QnVpbGRlciwgfSBmcm9tICcuL29uLWNvbmZsaWN0LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgT25Db25mbGljdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vbi1jb25mbGljdC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVG9wIH0gZnJvbSAnLi4vcGFyc2VyL3RvcC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgT3JBY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3ItYWN0aW9uLW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIEluc2VydFF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWVzIHRvIGluc2VydCBmb3IgYW4ge0BsaW5rIEt5c2VseS5pbnNlcnRJbnRvIHwgaW5zZXJ0fSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBjb2x1bW4gbmFtZXMgYW5kIHZhbHVlcyBhcmVcbiAgICAgKiB2YWx1ZXMgdG8gaW5zZXJ0LiBJbiBhZGRpdGlvbiB0byB0aGUgY29sdW1uJ3MgdHlwZSwgdGhlIHZhbHVlcyBjYW4gYmVcbiAgICAgKiByYXcge0BsaW5rIHNxbH0gc25pcHBldHMgb3Igc2VsZWN0IHF1ZXJpZXMuXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCBwcm92aWRlIGFsbCBmaWVsZHMgeW91IGhhdmVuJ3QgZXhwbGljaXRseSBtYXJrZWQgYXMgbnVsbGFibGVcbiAgICAgKiBvciBvcHRpb25hbCB1c2luZyB7QGxpbmsgR2VuZXJhdGVkfSBvciB7QGxpbmsgQ29sdW1uVHlwZX0uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIGFuIGBpbnNlcnRgIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnNlcnRSZXN1bHR9LiBUaGVcbiAgICAgKiB7QGxpbmsgSW5zZXJ0UmVzdWx0Lmluc2VydElkIHwgaW5zZXJ0SWR9IGZpZWxkIGhvbGRzIHRoZSBhdXRvIGluY3JlbWVudGVkIHByaW1hcnlcbiAgICAgKiBrZXkgaWYgdGhlIGRhdGFiYXNlIHJldHVybmVkIG9uZS5cbiAgICAgKlxuICAgICAqIE9uIFBvc3RncmVTUUwgYW5kIHNvbWUgb3RoZXIgZGlhbGVjdHMsIHlvdSBuZWVkIHRvIGNhbGwgYHJldHVybmluZ2AgdG8gZ2V0XG4gICAgICogc29tZXRoaW5nIG91dCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4cHJlc3Npb259IG1ldGhvZCBmb3IgaW5zZXJ0aW5nIHRoZSByZXN1bHQgb2YgYSBzZWxlY3RcbiAgICAgKiBxdWVyeSBvciBhbnkgb3RoZXIgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIlNpbmdsZSByb3dcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogSW5zZXJ0IGEgc2luZ2xlIHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICBhZ2U6IDQwXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqXG4gICAgICogLy8gYGluc2VydElkYCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBkaWFsZWN0cyB0aGF0XG4gICAgICogLy8gYXV0b21hdGljYWxseSByZXR1cm4gdGhlIGlkIG9mIHRoZSBpbnNlcnRlZCByb3dcbiAgICAgKiAvLyBzdWNoIGFzIE15U1FMIGFuZCBTUUxpdGUuIE9uIFBvc3RncmVTUUwsIGZvciBleGFtcGxlLFxuICAgICAqIC8vIHlvdSBuZWVkIHRvIGFkZCBhIGByZXR1cm5pbmdgIGNsYXVzZSB0byB0aGUgcXVlcnkgdG9cbiAgICAgKiAvLyBnZXQgYW55dGhpbmcgb3V0LiBTZWUgdGhlIFwicmV0dXJuaW5nIGRhdGFcIiBleGFtcGxlLlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWApIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJpbnNlcnRcIiwgXCJNdWx0aXBsZSByb3dzXCIsIDIwKSAtLT5cbiAgICAgKlxuICAgICAqIE9uIGRpYWxlY3RzIHRoYXQgc3VwcG9ydCBpdCAoZm9yIGV4YW1wbGUgUG9zdGdyZVNRTCkgeW91IGNhbiBpbnNlcnQgbXVsdGlwbGVcbiAgICAgKiByb3dzIGJ5IHByb3ZpZGluZyBhbiBhcnJheS4gTm90ZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgb25jZSBhZ2FpbiB2ZXJ5XG4gICAgICogZGlhbGVjdC1zcGVjaWZpYy4gU29tZSBkYXRhYmFzZXMgbWF5IG9ubHkgcmV0dXJuIHRoZSBpZCBvZiB0aGUgKmxhc3QqIGluc2VydGVkXG4gICAgICogcm93IGFuZCBzb21lIHJldHVybiBub3RoaW5nIGF0IGFsbCB1bmxlc3MgeW91IGNhbGwgYHJldHVybmluZ2AuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoW3tcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgIGFnZTogNDAsXG4gICAgICogICB9LCB7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdBcm5vbGQnLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdTY2h3YXJ6ZW5lZ2dlcicsXG4gICAgICogICAgIGFnZTogNzAsXG4gICAgICogICB9XSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImFnZVwiKSB2YWx1ZXMgKCgkMSwgJDIsICQzKSwgKCQ0LCAkNSwgJDYpKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIlJldHVybmluZyBkYXRhXCIsIDMwKSAtLT5cbiAgICAgKlxuICAgICAqIE9uIHN1cHBvcnRlZCBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgeW91IG5lZWQgdG8gY2hhaW4gYHJldHVybmluZ2AgdG8gdGhlIHF1ZXJ5IHRvIGdldFxuICAgICAqIHRoZSBpbnNlcnRlZCByb3cncyBjb2x1bW5zIChvciBhbnkgb3RoZXIgZXhwcmVzc2lvbikgYXMgdGhlIHJldHVybiB2YWx1ZS4gYHJldHVybmluZ2BcbiAgICAgKiB3b3JrcyBqdXN0IGxpa2UgYHNlbGVjdGAuIFJlZmVyIHRvIGBzZWxlY3RgIG1ldGhvZCdzIGV4YW1wbGVzIGFuZCBkb2N1bWVudGF0aW9uIGZvclxuICAgICAqIG1vcmUgaW5mby5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICBhZ2U6IDQwLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lIGFzIG5hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJhZ2VcIikgdmFsdWVzICgkMSwgJDIsICQzKSByZXR1cm5pbmcgXCJpZFwiLCBcImZpcnN0X25hbWVcIiBhcyBcIm5hbWVcIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIkNvbXBsZXggdmFsdWVzXCIsIDQwKSAtLT5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIHByaW1pdGl2ZXMsIHRoZSB2YWx1ZXMgY2FuIGFsc28gYmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zLlxuICAgICAqIFlvdSBjYW4gYnVpbGQgdGhlIGV4cHJlc3Npb25zIGJ5IHVzaW5nIGEgY2FsbGJhY2sgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZHNcbiAgICAgKiBvbiB0aGUgZXhwcmVzc2lvbiBidWlsZGVyIHBhc3NlZCB0byBpdDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgYW5pID0gXCJBbmlcIlxuICAgICAqIGNvbnN0IHN0b24gPSBcInN0b25cIlxuICAgICAqXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcygoeyByZWYsIHNlbGVjdEZyb20sIGZuIH0pID0+ICh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogc3FsPHN0cmluZz5gY29uY2F0KCR7YW5pfSwgJHtzdG9ufSlgLFxuICAgICAqICAgICBtaWRkbGVfbmFtZTogcmVmKCdmaXJzdF9uYW1lJyksXG4gICAgICogICAgIGFnZTogc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgICAuc2VsZWN0KGZuLmF2ZzxudW1iZXI+KCdhZ2UnKS5hcygnYXZnX2FnZScpKSxcbiAgICAgKiAgIH0pKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXG4gICAgICogICBcImZpcnN0X25hbWVcIixcbiAgICAgKiAgIFwibGFzdF9uYW1lXCIsXG4gICAgICogICBcIm1pZGRsZV9uYW1lXCIsXG4gICAgICogICBcImFnZVwiXG4gICAgICogKVxuICAgICAqIHZhbHVlcyAoXG4gICAgICogICAkMSxcbiAgICAgKiAgIGNvbmNhdCgkMiwgJDMpLFxuICAgICAqICAgXCJmaXJzdF9uYW1lXCIsXG4gICAgICogICAoc2VsZWN0IGF2ZyhcImFnZVwiKSBhcyBcImF2Z19hZ2VcIiBmcm9tIFwicGVyc29uXCIpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHVzZSB0aGUgY2FsbGJhY2sgdmVyc2lvbiBvZiBzdWJxdWVyaWVzIG9yIHJhdyBleHByZXNzaW9uczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIud2l0aCgnamVubmlmZXInLCAoZGIpID0+IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0plbm5pZmVyJylcbiAgICAgKiAgIC5zZWxlY3QoWydpZCcsICdmaXJzdF9uYW1lJywgJ2dlbmRlciddKVxuICAgICAqICAgLmxpbWl0KDEpXG4gICAgICogKS5pbnNlcnRJbnRvKCdwZXQnKS52YWx1ZXMoKGViKSA9PiAoe1xuICAgICAqICAgb3duZXJfaWQ6IGViLnNlbGVjdEZyb20oJ2plbm5pZmVyJykuc2VsZWN0KCdpZCcpLFxuICAgICAqICAgbmFtZTogZWIuc2VsZWN0RnJvbSgnamVubmlmZXInKS5zZWxlY3QoJ2ZpcnN0X25hbWUnKSxcbiAgICAgKiAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqIH0pKVxuICAgICAqIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHdpdGggXCJqZW5uaWZlclwiIGFzIChcbiAgICAgKiAgIHNlbGVjdCBcImlkXCIsIFwiZmlyc3RfbmFtZVwiLCBcImdlbmRlclwiXG4gICAgICogICBmcm9tIFwicGVyc29uXCJcbiAgICAgKiAgIHdoZXJlIFwiZmlyc3RfbmFtZVwiID0gJDFcbiAgICAgKiAgIGxpbWl0ICQyXG4gICAgICogKVxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwib3duZXJfaWRcIiwgXCJuYW1lXCIsIFwic3BlY2llc1wiKVxuICAgICAqIHZhbHVlcyAoXG4gICAgICogIChzZWxlY3QgXCJpZFwiIGZyb20gXCJqZW5uaWZlclwiKSxcbiAgICAgKiAgKHNlbGVjdCBcImZpcnN0X25hbWVcIiBmcm9tIFwiamVubmlmZXJcIiksXG4gICAgICogICQzXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHZhbHVlcyhpbnNlcnQpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtbnMsIHZhbHVlc10gPSBwYXJzZUluc2VydEV4cHJlc3Npb24oaW5zZXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbHVtbnMgdG8gaW5zZXJ0LlxuICAgICAqXG4gICAgICogVGhlIHtAbGluayB2YWx1ZXN9IG1ldGhvZCBzZXRzIGJvdGggdGhlIGNvbHVtbnMgYW5kIHRoZSB2YWx1ZXMgYW5kIHRoaXMgbWV0aG9kXG4gICAgICogaXMgbm90IG5lZWRlZC4gQnV0IGlmIHlvdSBhcmUgdXNpbmcgdGhlIHtAbGluayBleHByZXNzaW9ufSBtZXRob2QsIHlvdSBjYW4gdXNlXG4gICAgICogdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBjb2x1bW5zIHRvIGluc2VydC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJ10pXG4gICAgICogICAuZXhwcmVzc2lvbigoZWIpID0+IGViLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdCgncGV0Lm5hbWUnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiKVxuICAgICAqIHNlbGVjdCBcInBldFwiLlwibmFtZVwiIGZyb20gXCJwZXRcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbHVtbnMoY29sdW1ucykge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGFuIGFyYml0cmFyeSBleHByZXNzaW9uLiBGb3IgZXhhbXBsZSB0aGUgcmVzdWx0IG9mIGEgc2VsZWN0IHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiSW5zZXJ0IHN1YnF1ZXJ5XCIsIDUwKSAtLT5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gY3JlYXRlIGFuIGBJTlNFUlQgSU5UTyBTRUxFQ1QgRlJPTWAgcXVlcnkgdXNpbmcgdGhlIGBleHByZXNzaW9uYCBtZXRob2QuXG4gICAgICogVGhpcyBBUEkgZG9lc24ndCBmb2xsb3cgb3VyIFdZU0lXWUcgcHJpbmNpcGxlcyBhbmQgbWlnaHQgYmUgYSBiaXQgZGlmZmljdWx0IHRvXG4gICAgICogcmVtZW1iZXIuIFRoZSByZWFzb25zIGZvciB0aGlzIGRlc2lnbiBzdGVtIGZyb20gaW1wbGVtZW50YXRpb24gZGlmZmljdWx0aWVzLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdhZ2UnXSlcbiAgICAgKiAgIC5leHByZXNzaW9uKChlYikgPT4gZWJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BldCcpXG4gICAgICogICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICogICAgICAgJ3BldC5uYW1lJyxcbiAgICAgKiAgICAgICBlYi52YWwoJ1BldHNvbicpLmFzKCdsYXN0X25hbWUnKSxcbiAgICAgKiAgICAgICBlYi5saXQoNykuYXMoJ2FnZScpLFxuICAgICAqICAgICBdKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiYWdlXCIpXG4gICAgICogc2VsZWN0IFwicGV0XCIuXCJuYW1lXCIsICQxIGFzIFwibGFzdF9uYW1lXCIsIDcgYXMgXCJhZ2UgZnJvbSBcInBldFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIHZhbHVlczogcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGBpbnNlcnQgaW50byBcInBlcnNvblwiIGRlZmF1bHQgdmFsdWVzYCBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmRlZmF1bHRWYWx1ZXMoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiBkZWZhdWx0IHZhbHVlc1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRlZmF1bHRWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLm1vZGlmeUVuZChzcWxgLS0gVGhpcyBpcyBhIGNvbW1lbnRgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIGBwZXJzb25gIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIilcbiAgICAgKiB2YWx1ZXMgKD8sID8sID8pIC0tIFRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBpZ25vcmUgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNeVNRTC5cbiAgICAgKlxuICAgICAqIFRvIGF2b2lkIGEgZm9vdGd1biwgd2hlbiBpbnZva2VkIHdpdGggdGhlIFNRTGl0ZSBkaWFsZWN0LCB0aGlzIG1ldGhvZCB3aWxsXG4gICAgICogYmUgaGFuZGxlZCBsaWtlIHtAbGluayBvcklnbm9yZX0uIFNlZSBhbHNvLCB7QGxpbmsgb3JBYm9ydH0sIHtAbGluayBvckZhaWx9LFxuICAgICAqIHtAbGluayBvclJlcGxhY2V9LCBhbmQge0BsaW5rIG9yUm9sbGJhY2t9LlxuICAgICAqXG4gICAgICogSWYgeW91IHVzZSB0aGUgaWdub3JlIG1vZGlmaWVyLCBpZ25vcmFibGUgZXJyb3JzIHRoYXQgb2NjdXIgd2hpbGUgZXhlY3V0aW5nIHRoZVxuICAgICAqIGluc2VydCBzdGF0ZW1lbnQgYXJlIGlnbm9yZWQuIEZvciBleGFtcGxlLCB3aXRob3V0IGlnbm9yZSwgYSByb3cgdGhhdCBkdXBsaWNhdGVzXG4gICAgICogYW4gZXhpc3RpbmcgdW5pcXVlIGluZGV4IG9yIHByaW1hcnkga2V5IHZhbHVlIGluIHRoZSB0YWJsZSBjYXVzZXMgYSBkdXBsaWNhdGUta2V5XG4gICAgICogZXJyb3IgYW5kIHRoZSBzdGF0ZW1lbnQgaXMgYWJvcnRlZC4gV2l0aCBpZ25vcmUsIHRoZSByb3cgaXMgZGlzY2FyZGVkIGFuZCBubyBlcnJvclxuICAgICAqIG9jY3Vycy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmlnbm9yZSgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaWdub3JlIGludG8gYHBlcnNvbmAgKGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBnZW5kZXJgKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBpZ25vcmUgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGlnbm9yZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2lnbm9yZScpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciBpZ25vcmUgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBUbyBhdm9pZCBhIGZvb3RndW4sIHdoZW4gaW52b2tlZCB3aXRoIHRoZSBNeVNRTCBkaWFsZWN0LCB0aGlzIG1ldGhvZCB3aWxsXG4gICAgICogYmUgaGFuZGxlZCBsaWtlIHtAbGluayBpZ25vcmV9LlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sIHtAbGluayBvclJlcGxhY2V9LCBhbmQge0BsaW5rIG9yUm9sbGJhY2t9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAub3JJZ25vcmUoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBpZ25vcmUgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpZ25vcmUgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGdlbmRlcmApIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvcklnbm9yZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2lnbm9yZScpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciBhYm9ydCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvLCB7QGxpbmsgb3JJZ25vcmV9LCB7QGxpbmsgb3JGYWlsfSwge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vckFib3J0KClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgb3IgYWJvcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9yQWJvcnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdhYm9ydCcpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciBmYWlsIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vckZhaWwoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBmYWlsIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvckZhaWwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdmYWlsJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIHJlcGxhY2UgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHtAbGluayBLeXNlbHkucmVwbGFjZUludG99IHRvIGFjaGlldmUgdGhlIHNhbWUgcmVzdWx0LlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vclJlcGxhY2UoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciByZXBsYWNlIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvclJlcGxhY2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdyZXBsYWNlJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIHJvbGxiYWNrIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sIGFuZCB7QGxpbmsgb3JSZXBsYWNlfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yUm9sbGJhY2soKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciByb2xsYmFjayBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3JSb2xsYmFjaygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ3JvbGxiYWNrJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IHRvcCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogSW5zZXJ0IHRoZSBmaXJzdCA1IHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnZ2VuZGVyJ10pXG4gICAgICogICAuZXhwcmVzc2lvbihcbiAgICAgKiAgICAgKGViKSA9PiBlYi5zZWxlY3RGcm9tKCdwZXQnKS5zZWxlY3QoWyduYW1lJywgc3FsLmxpdCgnb3RoZXInKS5hcygnZ2VuZGVyJyldKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IHRvcCg1KSBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImdlbmRlclwiKSBzZWxlY3QgXCJuYW1lXCIsICdvdGhlcicgYXMgXCJnZW5kZXJcIiBmcm9tIFwicGV0XCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluc2VydCB0aGUgZmlyc3QgNTAgcGVyY2VudCBvZiByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1MCwgJ3BlcmNlbnQnKVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2dlbmRlciddKVxuICAgICAqICAgLmV4cHJlc3Npb24oXG4gICAgICogICAgIChlYikgPT4gZWIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0KFsnbmFtZScsIHNxbC5saXQoJ290aGVyJykuYXMoJ2dlbmRlcicpXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCB0b3AoNTApIHBlcmNlbnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJnZW5kZXJcIikgc2VsZWN0IFwibmFtZVwiLCAnb3RoZXInIGFzIFwiZ2VuZGVyXCIgZnJvbSBcInBldFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBgb24gY29uZmxpY3RgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBgb24gY29uZmxpY3RgIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIGFuZCBTUUxpdGUuIE9uIE15U1FMXG4gICAgICogeW91IGNhbiB1c2Uge0BsaW5rIGlnbm9yZX0gYW5kIHtAbGluayBvbkR1cGxpY2F0ZUtleVVwZGF0ZX0gdG8gYWNoaWV2ZSBzaW1pbGFyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ25hbWUnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBzcGVjaWVzOiAnaGFtc3RlcicgfSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwibmFtZVwiLCBcInNwZWNpZXNcIiwgXCJvd25lcl9pZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBvbiBjb25mbGljdCAoXCJuYW1lXCIpXG4gICAgICogZG8gdXBkYXRlIHNldCBcInNwZWNpZXNcIiA9ICQ0XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHByb3ZpZGUgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQgaW5zdGVhZCBvZiBhIGNvbHVtbiBuYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbnN0cmFpbnQoJ3BldF9uYW1lX2tleScpXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IHNwZWNpZXM6ICdoYW1zdGVyJyB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IG9uIGNvbnN0cmFpbnQgXCJwZXRfbmFtZV9rZXlcIlxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJzcGVjaWVzXCIgPSAkNFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYW4gZXhwcmVzc2lvbiBhcyB0aGUgY29uZmxpY3QgdGFyZ2V0IGluIGNhc2VcbiAgICAgKiB0aGUgdW5pcXVlIGluZGV4IGlzIGFuIGV4cHJlc3Npb24gaW5kZXg6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuZXhwcmVzc2lvbihzcWw8c3RyaW5nPmBsb3dlcihuYW1lKWApXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IHNwZWNpZXM6ICdoYW1zdGVyJyB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IChsb3dlcihuYW1lKSlcbiAgICAgKiBkbyB1cGRhdGUgc2V0IFwic3BlY2llc1wiID0gJDRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWRkIGEgZmlsdGVyIGZvciB0aGUgdXBkYXRlIHN0YXRlbWVudCBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCduYW1lJylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgc3BlY2llczogJ2hhbXN0ZXInIH0pXG4gICAgICogICAgIC53aGVyZSgnZXhjbHVkZWQubmFtZScsICchPScsICdDYXR0bycpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3QgKFwibmFtZVwiKVxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJzcGVjaWVzXCIgPSAkNFxuICAgICAqIHdoZXJlIFwiZXhjbHVkZWRcIi5cIm5hbWVcIiAhPSAkNVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBjcmVhdGUgYW4gYG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgIGNsYXVzZXMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignbmFtZScpXG4gICAgICogICAgIC5kb05vdGhpbmcoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IChcIm5hbWVcIikgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiByZWZlciB0byB0aGUgY29sdW1ucyBvZiB0aGUgdmlydHVhbCBgZXhjbHVkZWRgIHRhYmxlXG4gICAgICogaW4gYSB0eXBlLXNhZmUgd2F5IHVzaW5nIGEgY2FsbGJhY2sgYW5kIHRoZSBgcmVmYCBtZXRob2Qgb2ZcbiAgICAgKiBgRXhwcmVzc2lvbkJ1aWxkZXJgOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGlkOiAxLFxuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KG9jID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAoZWIpID0+IGViLnJlZignZXhjbHVkZWQuZmlyc3RfbmFtZScpLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogKGViKSA9PiBlYi5yZWYoJ2V4Y2x1ZGVkLmxhc3RfbmFtZScpXG4gICAgICogICAgIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImlkXCIsIFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMywgJDQpXG4gICAgICogb24gY29uZmxpY3QgKFwiaWRcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0XG4gICAgICogIFwiZmlyc3RfbmFtZVwiID0gXCJleGNsdWRlZFwiLlwiZmlyc3RfbmFtZVwiLFxuICAgICAqICBcImxhc3RfbmFtZVwiID0gXCJleGNsdWRlZFwiLlwibGFzdF9uYW1lXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvbkNvbmZsaWN0KGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9uQ29uZmxpY3Q6IGNhbGxiYWNrKG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jcmVhdGUoKSxcbiAgICAgICAgICAgICAgICB9KSkudG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG9uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlYCB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugc3BlY2lmeSBgb24gZHVwbGljYXRlIGtleSB1cGRhdGVgLCBhbmQgYSByb3cgaXMgaW5zZXJ0ZWQgdGhhdCB3b3VsZCBjYXVzZVxuICAgICAqIGEgZHVwbGljYXRlIHZhbHVlIGluIGEgdW5pcXVlIGluZGV4IG9yIHByaW1hcnkga2V5LCBhbiB1cGRhdGUgb2YgdGhlIG9sZCByb3cgb2NjdXJzLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNeVNRTC4gT24gbW9zdCBkaWFsZWN0cyB5b3Ugc2hvdWxkXG4gICAgICogdXNlIHtAbGluayBvbkNvbmZsaWN0fSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBpZDogMSxcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25EdXBsaWNhdGVLZXlVcGRhdGUoeyB1cGRhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBgcGVyc29uYCAoYGlkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGdlbmRlcmApXG4gICAgICogdmFsdWVzICg/LCA/LCA/LCA/KVxuICAgICAqIG9uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlIGB1cGRhdGVkX2F0YCA9ID9cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvbkR1cGxpY2F0ZUtleVVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb25EdXBsaWNhdGVLZXk6IE9uRHVwbGljYXRlS2V5Tm9kZS5jcmVhdGUocGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmcoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmdBbGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXQoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGByZXR1cm5pbmdgIGNsYXVzZXMgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoeyBmaXJzdF9uYW1lOiAnSmFtZXMnLCBsYXN0X25hbWU6ICdTbWl0aCcsIGdlbmRlcjogJ21hbGUnIH0pXG4gICAgICogICAucmV0dXJuaW5nKFsnZmlyc3RfbmFtZSddKVxuICAgICAqICAgLmNsZWFyUmV0dXJuaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhclJldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHsgZmlyc3RfbmFtZTogJ0pvaG4nLCBsYXN0X25hbWU6ICdEb2UnLCBnZW5kZXI6ICdtYWxlJyB9KVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTmV3UGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydFBlcnNvbih2YWx1ZXM6IE5ld1BlcnNvbiwgcmV0dXJuTGFzdE5hbWU6IGJvb2xlYW4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgLnZhbHVlcyh2YWx1ZXMpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAgIC4kaWYocmV0dXJuTGFzdE5hbWUsIChxYikgPT4gcWIucmV0dXJuaW5nKCdsYXN0X25hbWUnKSlcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbnkgc2VsZWN0aW9ucyBhZGRlZCBpbnNpZGUgdGhlIGBpZmAgY2FsbGJhY2sgd2lsbCBiZSBhZGRlZCBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlXG4gICAgICogb3V0cHV0IHR5cGUgc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IG1hZGUgYmVmb3JlIHJ1bm5pbmdcbiAgICAgKiB0aGUgY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgaW5zZXJ0UGVyc29uYCBmdW5jdGlvbiBpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogUHJvbWlzZTx7XG4gICAgICogICBpZDogbnVtYmVyXG4gICAgICogICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAgICAgKiAgIGxhc3RfbmFtZT86IHN0cmluZ1xuICAgICAqIH0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBJbnNlcnRRdWVyeUJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIChwYXJ0cyBvZikgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEt5c2VseSB0cmllcyB0byBiZSBhcyB0eXBlLXNhZmUgYXMgcG9zc2libGUsIGJ1dCBpbiBzb21lIGNhc2VzIHdlIGhhdmUgdG8gbWFrZVxuICAgICAqIGNvbXByb21pc2VzIGZvciBiZXR0ZXIgbWFpbnRhaW5hYmlsaXR5IGFuZCBjb21waWxhdGlvbiBwZXJmb3JtYW5jZS4gQXQgcHJlc2VudCxcbiAgICAgKiBLeXNlbHkgZG9lc24ndCBuYXJyb3cgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeSBiYXNlZCBvbiB7QGxpbmsgdmFsdWVzfSBpbnB1dFxuICAgICAqIHdoZW4gdXNpbmcge0BsaW5rIHJldHVybmluZ30gb3Ige0BsaW5rIHJldHVybmluZ0FsbH0uXG4gICAgICpcbiAgICAgKiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHZlcnkgdXNlZnVsIGZvciB0aGVzZSBzaXR1YXRpb25zLCBhcyBpdCByZW1vdmVzIHVubmNlc3NhcnlcbiAgICAgKiBydW50aW1lIGFzc2VydGlvbi9ndWFyZCBjb2RlLiBJdHMgaW5wdXQgdHlwZSBpcyBsaW1pdGVkIHRvIHRoZSBvdXRwdXQgdHlwZVxuICAgICAqIG9mIHRoZSBxdWVyeSwgc28geW91IGNhbid0IGFkZCBhIGNvbHVtbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIG9yIGNoYW5nZSBhIGNvbHVtbidzXG4gICAgICogdHlwZSB0byBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGl0cyB1bmlvbiB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUdXJuIHRoaXMgY29kZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgICBudWxsYWJsZV9jb2x1bW46ICdoZWxsIHllYWghJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGlmIChpc1dpdGhOb051bGxWYWx1ZShwZXJzb24pKSB7XG4gICAgICogICBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uOiBQZXJzb24pOiBwZXJzb24gaXMgUGVyc29uICYgeyBudWxsYWJsZV9jb2x1bW46IHN0cmluZyB9IHtcbiAgICAgKiAgIHJldHVybiBwZXJzb24ubnVsbGFibGVfY29sdW1uICE9IG51bGxcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbnRvIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTm90TnVsbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgICAgbnVsbGFibGVfY29sdW1uOiAnaGVsbCB5ZWFoISdcbiAgICAgKiAgIH0pXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC4kbmFycm93VHlwZTx7IG51bGxhYmxlX2NvbHVtbjogTm90TnVsbCB9PigpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzc2VydHMgdGhhdCBxdWVyeSdzIG91dHB1dCByb3cgdHlwZSBlcXVhbHMgdGhlIGdpdmVuIHR5cGUgYFRgLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgZXhjZXNzaXZlbHkgY29tcGxleCB0eXBlcyB0byBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAgICAgKiBhbmQgbXVjaCBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdXNlcyBjb21wbGV4IHR5cGUgbWFnaWMgdG8gYWNoaWV2ZSBpdHMgdHlwZSBzYWZldHkuIFRoaXMgY29tcGxleGl0eSBpcyBzb21ldGltZXMgdG9vIG11Y2hcbiAgICAgKiBmb3IgVHlwZVNjcmlwdCBhbmQgeW91IGdldCBlcnJvcnMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZXJyb3IgVFMyNTg5OiBUeXBlIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGUuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGVzZSBjYXNlIHlvdSBjYW4gb2Z0ZW4gdXNlIHRoaXMgbWV0aG9kIHRvIGhlbHAgVHlwZVNjcmlwdCBhIGxpdHRsZSBiaXQuIFdoZW4geW91IHVzZSB0aGlzXG4gICAgICogbWV0aG9kIHRvIGFzc2VydCB0aGUgb3V0cHV0IHR5cGUgb2YgYSBxdWVyeSwgS3lzZWx5IGNhbiBkcm9wIHRoZSBjb21wbGV4IG91dHB1dCB0eXBlIHRoYXRcbiAgICAgKiBjb25zaXN0cyBvZiBtdWx0aXBsZSBuZXN0ZWQgaGVscGVyIHR5cGVzIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHNpbXBsZSBhc3NlcnRlZCB0eXBlLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2QgZG9lc24ndCByZWR1Y2UgdHlwZSBzYWZldHkgYXQgYWxsLiBZb3UgaGF2ZSB0byBwYXNzIGluIGEgdHlwZSB0aGF0IGlzXG4gICAgICogc3RydWN0dXJhbGx5IGVxdWFsIHRvIHRoZSBjdXJyZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24sIE5ld1BldCwgU3BlY2llcyB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBpbnNlcnRQZXJzb25BbmRQZXQocGVyc29uOiBOZXdQZXJzb24sIHBldDogT21pdDxOZXdQZXQsICdvd25lcl9pZCc+KSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLndpdGgoJ25ld19wZXJzb24nLCAocWIpID0+IHFiXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgICAgLnZhbHVlcyhwZXJzb24pXG4gICAgICogICAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAgIC4kYXNzZXJ0VHlwZTx7IGlkOiBudW1iZXIgfT4oKVxuICAgICAqICAgICApXG4gICAgICogICAgIC53aXRoKCduZXdfcGV0JywgKHFiKSA9PiBxYlxuICAgICAqICAgICAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAgIC52YWx1ZXMoKGViKSA9PiAoe1xuICAgICAqICAgICAgICAgb3duZXJfaWQ6IGViLnNlbGVjdEZyb20oJ25ld19wZXJzb24nKS5zZWxlY3QoJ2lkJyksXG4gICAgICogICAgICAgICAuLi5wZXRcbiAgICAgKiAgICAgICB9KSlcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKFsnbmFtZSBhcyBwZXRfbmFtZScsICdzcGVjaWVzJ10pXG4gICAgICogICAgICAgLiRhc3NlcnRUeXBlPHsgcGV0X25hbWU6IHN0cmluZywgc3BlY2llczogU3BlY2llcyB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oWyduZXdfcGVyc29uJywgJ25ld19wZXQnXSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRhc3NlcnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgSW5zZXJ0UXVlcnlCdWlsZGVyIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3R9IGFuZCB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3d9IG1ldGhvZHMuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSk7XG4gICAgICAgIGNvbnN0IHsgYWRhcHRlciB9ID0gdGhpcy4jcHJvcHMuZXhlY3V0b3I7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gY29tcGlsZWRRdWVyeS5xdWVyeTtcbiAgICAgICAgaWYgKChxdWVyeS5yZXR1cm5pbmcgJiYgYWRhcHRlci5zdXBwb3J0c1JldHVybmluZykgfHxcbiAgICAgICAgICAgIChxdWVyeS5vdXRwdXQgJiYgYWRhcHRlci5zdXBwb3J0c091dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEluc2VydFJlc3VsdChyZXN1bHQuaW5zZXJ0SWQsIHJlc3VsdC5udW1BZmZlY3RlZFJvd3MgPz8gQmlnSW50KDApKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0KCkge1xuICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB0aHJvd3MgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTm9SZXN1bHRFcnJvcn0gaXMgdGhyb3duLCBidXQgeW91IGNhblxuICAgICAqIHByb3ZpZGUgYSBjdXN0b20gZXJyb3IgY2xhc3MsIG9yIGNhbGxiYWNrIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHRocm93IGEgZGlmZmVyZW50XG4gICAgICogZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coZXJyb3JDb25zdHJ1Y3RvciA9IE5vUmVzdWx0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGFrZUZpcnN0KCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvcihlcnJvckNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICAgID8gbmV3IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSlcbiAgICAgICAgICAgICAgICA6IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyAqc3RyZWFtKGNodW5rU2l6ZSA9IDEwMCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpO1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgICB5aWVsZCogaXRlbS5yb3dzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGV4cGxhaW4oZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRXhwbGFpbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIGZvcm1hdCwgb3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVpbGRlci5leGVjdXRlKCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWxldGUtcmVzdWx0LmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIERlbGV0ZVJlc3VsdCB7XG4gICAgbnVtRGVsZXRlZFJvd3M7XG4gICAgY29uc3RydWN0b3IobnVtRGVsZXRlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1EZWxldGVkUm93cyA9IG51bURlbGV0ZWRSb3dzO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbGltaXQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBMaW1pdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0xpbWl0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTGltaXROb2RlJyxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlbGV0ZS1xdWVyeS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QXJnLCBwYXJzZVNlbGVjdEFsbCwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yLCBOb1Jlc3VsdEVycm9yLCB9IGZyb20gJy4vbm8tcmVzdWx0LWVycm9yLmpzJztcbmltcG9ydCB7IERlbGV0ZVJlc3VsdCB9IGZyb20gJy4vZGVsZXRlLXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBEZWxldGVRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBMaW1pdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9saW1pdC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgRGVsZXRlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB3aGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0V2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBgZGVsZXRlIGZyb21gIHF1ZXJ5IGludG8gYSBgZGVsZXRlIHRvcCBmcm9tYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogRGVsZXRlIHRoZSBmaXJzdCA1IHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC50b3AoNSlcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgdG9wKDUpIGZyb20gXCJwZXJzb25cIiB3aGVyZSBcImFnZVwiID4gQDFcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIERlbGV0ZSB0aGUgZmlyc3QgNTAlIG9mIHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC50b3AoNTAsICdwZXJjZW50JylcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgdG9wKDUwKSBwZXJjZW50IGZyb20gXCJwZXJzb25cIiB3aGVyZSBcImFnZVwiID4gQDFcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1c2luZyh0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IERlbGV0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhVc2luZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KHRhYmxlcykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5uZXJKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0lubmVySm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBsZWZ0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICByaWdodEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignUmlnaHRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGZ1bGxKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Z1bGxKb2luJywgYXJncyk7XG4gICAgfVxuICAgICNqb2luKGpvaW5UeXBlLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoSm9pbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgYHJldHVybmluZ2AgY2xhdXNlcyBmcm9tIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXQnKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAud2hlcmUoJ25hbWUnLCAnPScsICdNYXgnKVxuICAgICAqICAgLmNsZWFyUmV0dXJuaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gXCJwZXRcIiB3aGVyZSBcIm5hbWVcIiA9IFwiTWF4XCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhclJldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgYGxpbWl0YCBjbGF1c2UgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLndoZXJlKCduYW1lJywgJz0nLCAnTWF4JylcbiAgICAgKiAgIC5saW1pdCg1KVxuICAgICAqICAgLmNsZWFyTGltaXQoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBcInBldFwiIHdoZXJlIFwibmFtZVwiID0gXCJNYXhcIiByZXR1cm5pbmcgKlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNsZWFyTGltaXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY2xvbmVXaXRob3V0TGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbWl0IGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBBIGxpbWl0IGNsYXVzZSBpbiBhIGRlbGV0ZSBxdWVyeSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzXG4gICAgICogbGlrZSBNeVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogRGVsZXRlIDUgb2xkZXN0IGl0ZW1zIGluIGEgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgIC5vcmRlckJ5KCdjcmVhdGVkX2F0JylcbiAgICAgKiAgIC5saW1pdCg1KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIGBwZXRgIG9yZGVyIGJ5IGBjcmVhdGVkX2F0YCBsaW1pdCA/XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbGltaXQobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IERlbGV0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhMaW1pdCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIExpbWl0Tm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24obGltaXQpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0pvaG4nKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWxgLS0gVGhpcyBpcyBhIGNvbW1lbnRgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIGBwZXJzb25gXG4gICAgICogd2hlcmUgYGZpcnN0X25hbWVgID0gXCJKb2huXCIgLS0gVGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZGVsZXRlUGVyc29uKGlkOiBudW1iZXIsIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYGRlbGV0ZVBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgRGVsZXRlUXVlcnlCdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmFycm93cyAocGFydHMgb2YpIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdHJpZXMgdG8gYmUgYXMgdHlwZS1zYWZlIGFzIHBvc3NpYmxlLCBidXQgaW4gc29tZSBjYXNlcyB3ZSBoYXZlIHRvIG1ha2VcbiAgICAgKiBjb21wcm9taXNlcyBmb3IgYmV0dGVyIG1haW50YWluYWJpbGl0eSBhbmQgY29tcGlsYXRpb24gcGVyZm9ybWFuY2UuIEF0IHByZXNlbnQsXG4gICAgICogS3lzZWx5IGRvZXNuJ3QgbmFycm93IHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkgd2hlbiB1c2luZyB7QGxpbmsgd2hlcmV9IGFuZCB7QGxpbmsgcmV0dXJuaW5nfSBvciB7QGxpbmsgcmV0dXJuaW5nQWxsfS5cbiAgICAgKlxuICAgICAqIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdmVyeSB1c2VmdWwgZm9yIHRoZXNlIHNpdHVhdGlvbnMsIGFzIGl0IHJlbW92ZXMgdW5uY2Vzc2FyeVxuICAgICAqIHJ1bnRpbWUgYXNzZXJ0aW9uL2d1YXJkIGNvZGUuIEl0cyBpbnB1dCB0eXBlIGlzIGxpbWl0ZWQgdG8gdGhlIG91dHB1dCB0eXBlXG4gICAgICogb2YgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuJ3QgYWRkIGEgY29sdW1uIHRoYXQgZG9lc24ndCBleGlzdCwgb3IgY2hhbmdlIGEgY29sdW1uJ3NcbiAgICAgKiB0eXBlIHRvIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gaXRzIHVuaW9uIHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFR1cm4gdGhpcyBjb2RlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdpZCcsICc9JywgMylcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBpZiAoaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uKSkge1xuICAgICAqICAgZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbjogUGVyc29uKTogcGVyc29uIGlzIFBlcnNvbiAmIHsgbnVsbGFibGVfY29sdW1uOiBzdHJpbmcgfSB7XG4gICAgICogICByZXR1cm4gcGVyc29uLm51bGxhYmxlX2NvbHVtbiAhPSBudWxsXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW50byB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5vdE51bGwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdpZCcsICc9JywgMylcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC4kbmFycm93VHlwZTx7IG51bGxhYmxlX2NvbHVtbjogTm90TnVsbCB9PigpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzc2VydHMgdGhhdCBxdWVyeSdzIG91dHB1dCByb3cgdHlwZSBlcXVhbHMgdGhlIGdpdmVuIHR5cGUgYFRgLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgZXhjZXNzaXZlbHkgY29tcGxleCB0eXBlcyB0byBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAgICAgKiBhbmQgbXVjaCBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdXNlcyBjb21wbGV4IHR5cGUgbWFnaWMgdG8gYWNoaWV2ZSBpdHMgdHlwZSBzYWZldHkuIFRoaXMgY29tcGxleGl0eSBpcyBzb21ldGltZXMgdG9vIG11Y2hcbiAgICAgKiBmb3IgVHlwZVNjcmlwdCBhbmQgeW91IGdldCBlcnJvcnMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZXJyb3IgVFMyNTg5OiBUeXBlIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGUuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGVzZSBjYXNlIHlvdSBjYW4gb2Z0ZW4gdXNlIHRoaXMgbWV0aG9kIHRvIGhlbHAgVHlwZVNjcmlwdCBhIGxpdHRsZSBiaXQuIFdoZW4geW91IHVzZSB0aGlzXG4gICAgICogbWV0aG9kIHRvIGFzc2VydCB0aGUgb3V0cHV0IHR5cGUgb2YgYSBxdWVyeSwgS3lzZWx5IGNhbiBkcm9wIHRoZSBjb21wbGV4IG91dHB1dCB0eXBlIHRoYXRcbiAgICAgKiBjb25zaXN0cyBvZiBtdWx0aXBsZSBuZXN0ZWQgaGVscGVyIHR5cGVzIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHNpbXBsZSBhc3NlcnRlZCB0eXBlLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2QgZG9lc24ndCByZWR1Y2UgdHlwZSBzYWZldHkgYXQgYWxsLiBZb3UgaGF2ZSB0byBwYXNzIGluIGEgdHlwZSB0aGF0IGlzXG4gICAgICogc3RydWN0dXJhbGx5IGVxdWFsIHRvIHRoZSBjdXJyZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBTcGVjaWVzIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVBlcnNvbkFuZFBldHMocGVyc29uSWQ6IG51bWJlcikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC53aXRoKCdkZWxldGVkX3BlcnNvbicsIChxYikgPT4gcWJcbiAgICAgKiAgICAgICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAgICAgIC53aGVyZSgnaWQnLCAnPScsIHBlcnNvbklkKVxuICAgICAqICAgICAgICAucmV0dXJuaW5nKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgICAgICAgLiRhc3NlcnRUeXBlPHsgZmlyc3RfbmFtZTogc3RyaW5nIH0+KClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAud2l0aCgnZGVsZXRlZF9wZXRzJywgKHFiKSA9PiBxYlxuICAgICAqICAgICAgIC5kZWxldGVGcm9tKCdwZXQnKVxuICAgICAqICAgICAgIC53aGVyZSgnb3duZXJfaWQnLCAnPScsIHBlcnNvbklkKVxuICAgICAqICAgICAgIC5yZXR1cm5pbmcoWyduYW1lIGFzIHBldF9uYW1lJywgJ3NwZWNpZXMnXSlcbiAgICAgKiAgICAgICAuJGFzc2VydFR5cGU8eyBwZXRfbmFtZTogc3RyaW5nLCBzcGVjaWVzOiBTcGVjaWVzIH0+KClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAuc2VsZWN0RnJvbShbJ2RlbGV0ZWRfcGVyc29uJywgJ2RlbGV0ZWRfcGV0cyddKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIERlbGV0ZVF1ZXJ5QnVpbGRlciBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtuZXcgRGVsZXRlUmVzdWx0KHJlc3VsdC5udW1BZmZlY3RlZFJvd3MgPz8gQmlnSW50KDApKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdCgpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdGhyb3dzIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vUmVzdWx0RXJyb3J9IGlzIHRocm93biwgYnV0IHlvdSBjYW5cbiAgICAgKiBwcm92aWRlIGEgY3VzdG9tIGVycm9yIGNsYXNzLCBvciBjYWxsYmFjayBhcyB0aGUgb25seSBhcmd1bWVudCB0byB0aHJvdyBhIGRpZmZlcmVudFxuICAgICAqIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEV4cGxhaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBmb3JtYXQsIG9wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1aWxkZXIuZXhlY3V0ZSgpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXJlc3VsdC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBVcGRhdGVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyB0aGUgdXBkYXRlIHF1ZXJ5IHVwZGF0ZWQgKGV2ZW4gaWYgbm90IGNoYW5nZWQpLlxuICAgICAqL1xuICAgIG51bVVwZGF0ZWRSb3dzO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyB0aGUgdXBkYXRlIHF1ZXJ5IGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzICoqb3B0aW9uYWwqKiBhbmQgb25seSBzdXBwb3J0ZWQgaW4gZGlhbGVjdHMgc3VjaCBhcyBNeVNRTC5cbiAgICAgKiBZb3Ugd291bGQgcHJvYmFibHkgdXNlIHtAbGluayBudW1VcGRhdGVkUm93c30gaW4gbW9zdCBjYXNlcy5cbiAgICAgKi9cbiAgICBudW1DaGFuZ2VkUm93cztcbiAgICBjb25zdHJ1Y3RvcihudW1VcGRhdGVkUm93cywgbnVtQ2hhbmdlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1VcGRhdGVkUm93cyA9IG51bVVwZGF0ZWRSb3dzO1xuICAgICAgICB0aGlzLm51bUNoYW5nZWRSb3dzID0gbnVtQ2hhbmdlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91cGRhdGUtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IHBhcnNlSm9pbiwgfSBmcm9tICcuLi9wYXJzZXIvam9pbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS91cGRhdGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVVwZGF0ZSwgfSBmcm9tICcuLi9wYXJzZXIvdXBkYXRlLXNldC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgVXBkYXRlUmVzdWx0IH0gZnJvbSAnLi91cGRhdGUtcmVzdWx0LmpzJztcbmltcG9ydCB7IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yLCBOb1Jlc3VsdEVycm9yLCB9IGZyb20gJy4vbm8tcmVzdWx0LWVycm9yLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTGltaXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbGltaXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBVcGRhdGVRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJXaGVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgdXBkYXRlYCBxdWVyeSBpbnRvIGEgYHVwZGF0ZSB0b3BgIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYHRvcGAgY2xhdXNlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBVcGRhdGUgdGhlIGZpcnN0IHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAudG9wKDEpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0ZvbycgfSlcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgdG9wKDEpIFwicGVyc29uXCIgc2V0IFwiZmlyc3RfbmFtZVwiID0gQDEgd2hlcmUgXCJhZ2VcIiA+IEAyXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBVcGRhdGUgdGhlIDUwJSBmaXJzdCByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC50b3AoNTAsICdwZXJjZW50JylcbiAgICAgKiAgIC5zZXQoeyBmaXJzdF9uYW1lOiAnRm9vJyB9KVxuICAgICAqICAgLndoZXJlKCdhZ2UnLCAnPicsIDE4KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHVwZGF0ZSB0b3AoNTApIHBlcmNlbnQgXCJwZXJzb25cIiBzZXQgXCJmaXJzdF9uYW1lXCIgPSBAMSB3aGVyZSBcImFnZVwiID4gQDJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmcm9tKGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhGcm9tSXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdChmcm9tKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbm5lckpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xlZnRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIHJpZ2h0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdSaWdodEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgZnVsbEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignRnVsbEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgI2pvaW4oam9pblR5cGUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhKb2luKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaW1pdCBjbGF1c2UgdG8gdGhlIHVwZGF0ZSBxdWVyeSBmb3Igc3VwcG9ydGVkIGRhdGFiYXNlcywgc3VjaCBhcyBNeVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBmaXJzdCAyIHJvd3MgaW4gdGhlICdwZXJzb24nIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdGb28nIH0pXG4gICAgICogICAubGltaXQoMilcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgYHBlcnNvbmAgc2V0IGBmaXJzdF9uYW1lYCA9ID8gbGltaXQgP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY2xvbmVXaXRoTGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBMaW1pdE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKGxpbWl0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhVcGRhdGVzKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VVcGRhdGUoLi4uYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBhZ2U6IDM5IH0pXG4gICAgICogICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKb2huJylcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsLnJhdygnLS0gVGhpcyBpcyBhIGNvbW1lbnQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgYHBlcnNvbmBcbiAgICAgKiBzZXQgYGFnZWAgPSAzOVxuICAgICAqIHdoZXJlIGBmaXJzdF9uYW1lYCA9IFwiSm9oblwiIC0tIFRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGByZXR1cm5pbmdgIGNsYXVzZXMgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC5zZXQoeyBhZ2U6IDM5IH0pXG4gICAgICogICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKb2huJylcbiAgICAgKiAgIC5jbGVhclJldHVybmluZygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHVwZGF0ZSBcInBlcnNvblwiIHNldCBcImFnZVwiID0gMzkgd2hlcmUgXCJmaXJzdF9uYW1lXCIgPSBcIkpvaG5cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNsZWFyUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBhIG1ldGhvZCBvbiBgdGhpc2AsIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgJGlmfSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFRoZSBuZXh0IGV4YW1wbGUgdXNlcyBhIGhlbHBlciBmdW5jdGlvbiBgbG9nYCB0byBsb2cgYSBxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBDb21waWxhYmxlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgKiAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiB9IHNhdGlzZmllcyBQZXJzb25VcGRhdGVcbiAgICAgKlxuICAgICAqIGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh2YWx1ZXMpXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb25VcGRhdGUgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGVyc29uKGlkOiBudW1iZXIsIHVwZGF0ZXM6IFBlcnNvblVwZGF0ZSwgcmV0dXJuTGFzdE5hbWU6IGJvb2xlYW4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAgIC5zZXQodXBkYXRlcylcbiAgICAgKiAgICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAgIC4kaWYocmV0dXJuTGFzdE5hbWUsIChxYikgPT4gcWIucmV0dXJuaW5nKCdsYXN0X25hbWUnKSlcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbnkgc2VsZWN0aW9ucyBhZGRlZCBpbnNpZGUgdGhlIGBpZmAgY2FsbGJhY2sgd2lsbCBiZSBhZGRlZCBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlXG4gICAgICogb3V0cHV0IHR5cGUgc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IG1hZGUgYmVmb3JlIHJ1bm5pbmdcbiAgICAgKiB0aGUgY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgdXBkYXRlUGVyc29uYCBmdW5jdGlvbiBpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogUHJvbWlzZTx7XG4gICAgICogICBpZDogbnVtYmVyXG4gICAgICogICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAgICAgKiAgIGxhc3RfbmFtZT86IHN0cmluZ1xuICAgICAqIH0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBVcGRhdGVRdWVyeUJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIChwYXJ0cyBvZikgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEt5c2VseSB0cmllcyB0byBiZSBhcyB0eXBlLXNhZmUgYXMgcG9zc2libGUsIGJ1dCBpbiBzb21lIGNhc2VzIHdlIGhhdmUgdG8gbWFrZVxuICAgICAqIGNvbXByb21pc2VzIGZvciBiZXR0ZXIgbWFpbnRhaW5hYmlsaXR5IGFuZCBjb21waWxhdGlvbiBwZXJmb3JtYW5jZS4gQXQgcHJlc2VudCxcbiAgICAgKiBLeXNlbHkgZG9lc24ndCBuYXJyb3cgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeSBiYXNlZCBvbiB7QGxpbmsgc2V0fSBpbnB1dFxuICAgICAqIHdoZW4gdXNpbmcge0BsaW5rIHdoZXJlfSBhbmQvb3Ige0BsaW5rIHJldHVybmluZ30gb3Ige0BsaW5rIHJldHVybmluZ0FsbH0uXG4gICAgICpcbiAgICAgKiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHZlcnkgdXNlZnVsIGZvciB0aGVzZSBzaXR1YXRpb25zLCBhcyBpdCByZW1vdmVzIHVubmNlc3NhcnlcbiAgICAgKiBydW50aW1lIGFzc2VydGlvbi9ndWFyZCBjb2RlLiBJdHMgaW5wdXQgdHlwZSBpcyBsaW1pdGVkIHRvIHRoZSBvdXRwdXQgdHlwZVxuICAgICAqIG9mIHRoZSBxdWVyeSwgc28geW91IGNhbid0IGFkZCBhIGNvbHVtbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIG9yIGNoYW5nZSBhIGNvbHVtbidzXG4gICAgICogdHlwZSB0byBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGl0cyB1bmlvbiB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUdXJuIHRoaXMgY29kZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgaWQgPSAxXG4gICAgICogY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBkZWxldGVkX2F0OiBub3cgfSlcbiAgICAgKiAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgLndoZXJlKCdudWxsYWJsZV9jb2x1bW4nLCAnaXMgbm90JywgbnVsbClcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGlmIChpc1dpdGhOb051bGxWYWx1ZShwZXJzb24pKSB7XG4gICAgICogICBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uOiBQZXJzb24pOiBwZXJzb24gaXMgUGVyc29uICYgeyBudWxsYWJsZV9jb2x1bW46IHN0cmluZyB9IHtcbiAgICAgKiAgIHJldHVybiBwZXJzb24ubnVsbGFibGVfY29sdW1uICE9IG51bGxcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbnRvIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTm90TnVsbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZGVsZXRlZF9hdDogbm93IH0pXG4gICAgICogICAud2hlcmUoJ2lkJywgJz0nLCBpZClcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC4kbmFycm93VHlwZTx7IGRlbGV0ZWRfYXQ6IERhdGU7IG51bGxhYmxlX2NvbHVtbjogTm90TnVsbCB9PigpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzc2VydHMgdGhhdCBxdWVyeSdzIG91dHB1dCByb3cgdHlwZSBlcXVhbHMgdGhlIGdpdmVuIHR5cGUgYFRgLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgZXhjZXNzaXZlbHkgY29tcGxleCB0eXBlcyB0byBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAgICAgKiBhbmQgbXVjaCBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdXNlcyBjb21wbGV4IHR5cGUgbWFnaWMgdG8gYWNoaWV2ZSBpdHMgdHlwZSBzYWZldHkuIFRoaXMgY29tcGxleGl0eSBpcyBzb21ldGltZXMgdG9vIG11Y2hcbiAgICAgKiBmb3IgVHlwZVNjcmlwdCBhbmQgeW91IGdldCBlcnJvcnMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZXJyb3IgVFMyNTg5OiBUeXBlIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGUuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGVzZSBjYXNlIHlvdSBjYW4gb2Z0ZW4gdXNlIHRoaXMgbWV0aG9kIHRvIGhlbHAgVHlwZVNjcmlwdCBhIGxpdHRsZSBiaXQuIFdoZW4geW91IHVzZSB0aGlzXG4gICAgICogbWV0aG9kIHRvIGFzc2VydCB0aGUgb3V0cHV0IHR5cGUgb2YgYSBxdWVyeSwgS3lzZWx5IGNhbiBkcm9wIHRoZSBjb21wbGV4IG91dHB1dCB0eXBlIHRoYXRcbiAgICAgKiBjb25zaXN0cyBvZiBtdWx0aXBsZSBuZXN0ZWQgaGVscGVyIHR5cGVzIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHNpbXBsZSBhc3NlcnRlZCB0eXBlLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2QgZG9lc24ndCByZWR1Y2UgdHlwZSBzYWZldHkgYXQgYWxsLiBZb3UgaGF2ZSB0byBwYXNzIGluIGEgdHlwZSB0aGF0IGlzXG4gICAgICogc3RydWN0dXJhbGx5IGVxdWFsIHRvIHRoZSBjdXJyZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb25VcGRhdGUsIFBldFVwZGF0ZSwgU3BlY2llcyB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSB7XG4gICAgICogICBpZDogMSxcbiAgICAgKiAgIGdlbmRlcjogJ290aGVyJyxcbiAgICAgKiB9IHNhdGlzZmllcyBQZXJzb25VcGRhdGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHBldCA9IHtcbiAgICAgKiAgIG5hbWU6ICdGbHVmZnknLFxuICAgICAqIH0gc2F0aXNmaWVzIFBldFVwZGF0ZVxuICAgICAqXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoKCd1cGRhdGVkX3BlcnNvbicsIChxYikgPT4gcWJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgICAuc2V0KHBlcnNvbilcbiAgICAgKiAgICAgLndoZXJlKCdpZCcsICc9JywgcGVyc29uLmlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgICAgLiRhc3NlcnRUeXBlPHsgZmlyc3RfbmFtZTogc3RyaW5nIH0+KClcbiAgICAgKiAgIClcbiAgICAgKiAgIC53aXRoKCd1cGRhdGVkX3BldCcsIChxYikgPT4gcWJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgICAuc2V0KHBldClcbiAgICAgKiAgICAgLndoZXJlKCdvd25lcl9pZCcsICc9JywgcGVyc29uLmlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnbmFtZSBhcyBwZXRfbmFtZScsICdzcGVjaWVzJ10pXG4gICAgICogICAgIC4kYXNzZXJ0VHlwZTx7IHBldF9uYW1lOiBzdHJpbmcsIHNwZWNpZXM6IFNwZWNpZXMgfT4oKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oWyd1cGRhdGVkX3BlcnNvbicsICd1cGRhdGVkX3BldCddKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRhc3NlcnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgVXBkYXRlUXVlcnlCdWlsZGVyIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3R9IGFuZCB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3d9IG1ldGhvZHMuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSk7XG4gICAgICAgIGNvbnN0IHsgYWRhcHRlciB9ID0gdGhpcy4jcHJvcHMuZXhlY3V0b3I7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gY29tcGlsZWRRdWVyeS5xdWVyeTtcbiAgICAgICAgaWYgKChxdWVyeS5yZXR1cm5pbmcgJiYgYWRhcHRlci5zdXBwb3J0c1JldHVybmluZykgfHxcbiAgICAgICAgICAgIChxdWVyeS5vdXRwdXQgJiYgYWRhcHRlci5zdXBwb3J0c091dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IFVwZGF0ZVJlc3VsdChyZXN1bHQubnVtQWZmZWN0ZWRSb3dzID8/IEJpZ0ludCgwKSwgcmVzdWx0Lm51bUNoYW5nZWRSb3dzKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0KCkge1xuICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB0aHJvd3MgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTm9SZXN1bHRFcnJvcn0gaXMgdGhyb3duLCBidXQgeW91IGNhblxuICAgICAqIHByb3ZpZGUgYSBjdXN0b20gZXJyb3IgY2xhc3MsIG9yIGNhbGxiYWNrIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHRocm93IGEgZGlmZmVyZW50XG4gICAgICogZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coZXJyb3JDb25zdHJ1Y3RvciA9IE5vUmVzdWx0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGFrZUZpcnN0KCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvcihlcnJvckNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICAgID8gbmV3IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSlcbiAgICAgICAgICAgICAgICA6IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyAqc3RyZWFtKGNodW5rU2l6ZSA9IDEwMCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpO1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgICB5aWVsZCogaXRlbS5yb3dzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGV4cGxhaW4oZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRXhwbGFpbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIGZvcm1hdCwgb3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVpbGRlci5leGVjdXRlKCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1uYW1lLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBUYWJsZU5vZGUgfSBmcm9tICcuL3RhYmxlLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGVOYW1lLCBjb2x1bW5OYW1lcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogVGFibGVOb2RlLmNyZWF0ZSh0YWJsZU5hbWUpLFxuICAgICAgICAgICAgY29sdW1uczogY29sdW1uTmFtZXNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShjb2x1bW5OYW1lcy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jdGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBDVEVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29tbW9uIHRhYmxlIGV4cHJlc3Npb24gbWF0ZXJpYWxpemVkLlxuICAgICAqL1xuICAgIG1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDVEVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbW1vbiB0YWJsZSBleHByZXNzaW9uIG5vdCBtYXRlcmlhbGl6ZWQuXG4gICAgICovXG4gICAgbm90TWF0ZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IENURUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMubm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1uYW1lLW5vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlDcmVhdG9yIH0gZnJvbSAnLi9wYXJzZS11dGlscy5qcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ1RFQnVpbGRlciwgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2N0ZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbihuYW1lT3JCdWlsZGVyQ2FsbGJhY2ssIGV4cHJlc3Npb24pIHtcbiAgICBjb25zdCBleHByZXNzaW9uTm9kZSA9IGV4cHJlc3Npb24oY3JlYXRlUXVlcnlDcmVhdG9yKCkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKG5hbWVPckJ1aWxkZXJDYWxsYmFjaykpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVPckJ1aWxkZXJDYWxsYmFjayhjdGVCdWlsZGVyRmFjdG9yeShleHByZXNzaW9uTm9kZSkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jcmVhdGUocGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5hbWVPckJ1aWxkZXJDYWxsYmFjayksIGV4cHJlc3Npb25Ob2RlKTtcbn1cbmZ1bmN0aW9uIGN0ZUJ1aWxkZXJGYWN0b3J5KGV4cHJlc3Npb25Ob2RlKSB7XG4gICAgcmV0dXJuIChuYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ1RFQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlLmNyZWF0ZShwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobmFtZSksIGV4cHJlc3Npb25Ob2RlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZShuYW1lKSB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJygnKSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IG5hbWUuc3BsaXQoL1tcXChcXCldLyk7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gcGFydHNbMF07XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBwYXJ0c1sxXS5zcGxpdCgnLCcpLm1hcCgoaXQpID0+IGl0LnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZS5jcmVhdGUodGFibGUsIGNvbHVtbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlLmNyZWF0ZShuYW1lKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBXaXRoTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnV2l0aE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaXRoTm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uczogZnJlZXplKFtleHByZXNzaW9uXSksXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRXhwcmVzc2lvbih3aXRoTm9kZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLndpdGhOb2RlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbnM6IGZyZWV6ZShbLi4ud2l0aE5vZGUuZXhwcmVzc2lvbnMsIGV4cHJlc3Npb25dKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yYW5kb20tc3RyaW5nLmQudHNcIiAvPlxuY29uc3QgQ0hBUlMgPSBbXG4gICAgJ0EnLFxuICAgICdCJyxcbiAgICAnQycsXG4gICAgJ0QnLFxuICAgICdFJyxcbiAgICAnRicsXG4gICAgJ0cnLFxuICAgICdIJyxcbiAgICAnSScsXG4gICAgJ0onLFxuICAgICdLJyxcbiAgICAnTCcsXG4gICAgJ00nLFxuICAgICdOJyxcbiAgICAnTycsXG4gICAgJ1AnLFxuICAgICdRJyxcbiAgICAnUicsXG4gICAgJ1MnLFxuICAgICdUJyxcbiAgICAnVScsXG4gICAgJ1YnLFxuICAgICdXJyxcbiAgICAnWCcsXG4gICAgJ1knLFxuICAgICdaJyxcbiAgICAnYScsXG4gICAgJ2InLFxuICAgICdjJyxcbiAgICAnZCcsXG4gICAgJ2UnLFxuICAgICdmJyxcbiAgICAnZycsXG4gICAgJ2gnLFxuICAgICdpJyxcbiAgICAnaicsXG4gICAgJ2snLFxuICAgICdsJyxcbiAgICAnbScsXG4gICAgJ24nLFxuICAgICdvJyxcbiAgICAncCcsXG4gICAgJ3EnLFxuICAgICdyJyxcbiAgICAncycsXG4gICAgJ3QnLFxuICAgICd1JyxcbiAgICAndicsXG4gICAgJ3cnLFxuICAgICd4JyxcbiAgICAneScsXG4gICAgJ3onLFxuICAgICcwJyxcbiAgICAnMScsXG4gICAgJzInLFxuICAgICczJyxcbiAgICAnNCcsXG4gICAgJzUnLFxuICAgICc2JyxcbiAgICAnNycsXG4gICAgJzgnLFxuICAgICc5Jyxcbl07XG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tU3RyaW5nKGxlbmd0aCkge1xuICAgIGxldCBjaGFycyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2hhcnMgKz0gcmFuZG9tQ2hhcigpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhcnM7XG59XG5mdW5jdGlvbiByYW5kb21DaGFyKCkge1xuICAgIHJldHVybiBDSEFSU1t+fihNYXRoLnJhbmRvbSgpICogQ0hBUlMubGVuZ3RoKV07XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWlkLmQudHNcIiAvPlxuaW1wb3J0IHsgcmFuZG9tU3RyaW5nIH0gZnJvbSAnLi9yYW5kb20tc3RyaW5nLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWVyeUlkKCkge1xuICAgIHJldHVybiBuZXcgTGF6eVF1ZXJ5SWQoKTtcbn1cbmNsYXNzIExhenlRdWVyeUlkIHtcbiAgICAjcXVlcnlJZDtcbiAgICBnZXQgcXVlcnlJZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI3F1ZXJ5SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jcXVlcnlJZCA9IHJhbmRvbVN0cmluZyg4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jcXVlcnlJZDtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVxdWlyZUFsbFByb3BzIH0gZnJvbSAnLi4vdXRpbC9yZXF1aXJlLWFsbC1wcm9wcy5qcyc7XG4vKipcbiAqIFRyYW5zZm9ybXMgYW4gb3BlcmF0aW9uIG5vZGUgdHJlZSBpbnRvIGFub3RoZXIgb25lLlxuICpcbiAqIEt5c2VseSBxdWVyaWVzIGFyZSBleHByZXNzZWQgaW50ZXJuYWxseSBhcyBhIHRyZWUgb2Ygb2JqZWN0cyAob3BlcmF0aW9uIG5vZGVzKS5cbiAqIGBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXJgIHRha2VzIHN1Y2ggYSB0cmVlIGFzIGl0cyBpbnB1dCBhbmQgcmV0dXJucyBhXG4gKiB0cmFuc2Zvcm1lZCBkZWVwIGNvcHkgb2YgaXQuIEJ5IGRlZmF1bHQgdGhlIGBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXJgXG4gKiBkb2VzIG5vdGhpbmcuIFlvdSBuZWVkIHRvIG92ZXJyaWRlIG9uZSBvciBtb3JlIG1ldGhvZHMgdG8gbWFrZSBpdCBkb1xuICogc29tZXRoaW5nLlxuICpcbiAqIFRoZXJlJ3MgYSBtZXRob2QgZm9yIGVhY2ggbm9kZSB0eXBlLiBGb3IgZXhhbXBsZSBpZiB5b3UnZCBsaWtlIHRvIGNvbnZlcnRcbiAqIGVhY2ggaWRlbnRpZmllciAodGFibGUgbmFtZSwgY29sdW1uIG5hbWUsIGFsaWFzIGV0Yy4pIGZyb20gY2FtZWxDYXNlIHRvXG4gKiBzbmFrZV9jYXNlLCB5b3UnZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyB0eXBlIElkZW50aWZpZXJOb2RlLCBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIgfSBmcm9tICdreXNlbHknXG4gKiBpbXBvcnQgc25ha2VDYXNlIGZyb20gJ2xvZGFzaC9zbmFrZUNhc2UnXG4gKlxuICogY2xhc3MgQ2FtZWxDYXNlVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICogICBvdmVycmlkZSB0cmFuc2Zvcm1JZGVudGlmaWVyKG5vZGU6IElkZW50aWZpZXJOb2RlKTogSWRlbnRpZmllck5vZGUge1xuICogICAgIG5vZGUgPSBzdXBlci50cmFuc2Zvcm1JZGVudGlmaWVyKG5vZGUpXG4gKlxuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi5ub2RlLFxuICogICAgICAgbmFtZTogc25ha2VDYXNlKG5vZGUubmFtZSksXG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKlxuICogY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgQ2FtZWxDYXNlVHJhbnNmb3JtZXIoKVxuICpcbiAqIGNvbnN0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSlcbiAqXG4gKiBjb25zdCB0cmVlID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtTm9kZShxdWVyeS50b09wZXJhdGlvbk5vZGUoKSlcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIHtcbiAgICBub2RlU3RhY2sgPSBbXTtcbiAgICAjdHJhbnNmb3JtZXJzID0gZnJlZXplKHtcbiAgICAgICAgQWxpYXNOb2RlOiB0aGlzLnRyYW5zZm9ybUFsaWFzLmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIElkZW50aWZpZXJOb2RlOiB0aGlzLnRyYW5zZm9ybUlkZW50aWZpZXIuYmluZCh0aGlzKSxcbiAgICAgICAgU2NoZW1hYmxlSWRlbnRpZmllck5vZGU6IHRoaXMudHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBSYXdOb2RlOiB0aGlzLnRyYW5zZm9ybVJhdy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VOb2RlOiB0aGlzLnRyYW5zZm9ybVJlZmVyZW5jZS5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtU2VsZWN0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgVGFibGVOb2RlOiB0aGlzLnRyYW5zZm9ybVRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIEZyb21Ob2RlOiB0aGlzLnRyYW5zZm9ybUZyb20uYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0QWxsTm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3RBbGwuYmluZCh0aGlzKSxcbiAgICAgICAgQW5kTm9kZTogdGhpcy50cmFuc2Zvcm1BbmQuYmluZCh0aGlzKSxcbiAgICAgICAgT3JOb2RlOiB0aGlzLnRyYW5zZm9ybU9yLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTm9kZTogdGhpcy50cmFuc2Zvcm1WYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBWYWx1ZUxpc3ROb2RlOiB0aGlzLnRyYW5zZm9ybVZhbHVlTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlOiB0aGlzLnRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJlbnNOb2RlOiB0aGlzLnRyYW5zZm9ybVBhcmVucy5iaW5kKHRoaXMpLFxuICAgICAgICBKb2luTm9kZTogdGhpcy50cmFuc2Zvcm1Kb2luLmJpbmQodGhpcyksXG4gICAgICAgIE9wZXJhdG9yTm9kZTogdGhpcy50cmFuc2Zvcm1PcGVyYXRvci5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVyZU5vZGU6IHRoaXMudHJhbnNmb3JtV2hlcmUuYmluZCh0aGlzKSxcbiAgICAgICAgSW5zZXJ0UXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybUluc2VydFF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIERlbGV0ZVF1ZXJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1EZWxldGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBSZXR1cm5pbmdOb2RlOiB0aGlzLnRyYW5zZm9ybVJldHVybmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgQWRkQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1BZGRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uRGVmaW5pdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtQ29sdW1uRGVmaW5pdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVGFibGVOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBEYXRhVHlwZU5vZGU6IHRoaXMudHJhbnNmb3JtRGF0YVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgT3JkZXJCeU5vZGU6IHRoaXMudHJhbnNmb3JtT3JkZXJCeS5iaW5kKHRoaXMpLFxuICAgICAgICBPcmRlckJ5SXRlbU5vZGU6IHRoaXMudHJhbnNmb3JtT3JkZXJCeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgR3JvdXBCeU5vZGU6IHRoaXMudHJhbnNmb3JtR3JvdXBCeS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5SXRlbU5vZGU6IHRoaXMudHJhbnNmb3JtR3JvdXBCeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgVXBkYXRlUXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybVVwZGF0ZVF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtblVwZGF0ZU5vZGU6IHRoaXMudHJhbnNmb3JtQ29sdW1uVXBkYXRlLmJpbmQodGhpcyksXG4gICAgICAgIExpbWl0Tm9kZTogdGhpcy50cmFuc2Zvcm1MaW1pdC5iaW5kKHRoaXMpLFxuICAgICAgICBPZmZzZXROb2RlOiB0aGlzLnRyYW5zZm9ybU9mZnNldC5iaW5kKHRoaXMpLFxuICAgICAgICBPbkNvbmZsaWN0Tm9kZTogdGhpcy50cmFuc2Zvcm1PbkNvbmZsaWN0LmJpbmQodGhpcyksXG4gICAgICAgIE9uRHVwbGljYXRlS2V5Tm9kZTogdGhpcy50cmFuc2Zvcm1PbkR1cGxpY2F0ZUtleS5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVJbmRleE5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcEluZGV4Tm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgTGlzdE5vZGU6IHRoaXMudHJhbnNmb3JtTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtUHJpbWFyeUtleUNvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgVW5pcXVlQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtVW5pcXVlQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VzTm9kZTogdGhpcy50cmFuc2Zvcm1SZWZlcmVuY2VzLmJpbmQodGhpcyksXG4gICAgICAgIENoZWNrQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtQ2hlY2tDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFdpdGhOb2RlOiB0aGlzLnRyYW5zZm9ybVdpdGguYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZTogdGhpcy50cmFuc2Zvcm1Db21tb25UYWJsZUV4cHJlc3Npb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGU6IHRoaXMudHJhbnNmb3JtQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZS5iaW5kKHRoaXMpLFxuICAgICAgICBIYXZpbmdOb2RlOiB0aGlzLnRyYW5zZm9ybUhhdmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVTY2hlbWFOb2RlOiB0aGlzLnRyYW5zZm9ybUNyZWF0ZVNjaGVtYS5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wU2NoZW1hTm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wU2NoZW1hLmJpbmQodGhpcyksXG4gICAgICAgIEFsdGVyVGFibGVOb2RlOiB0aGlzLnRyYW5zZm9ybUFsdGVyVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcENvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBSZW5hbWVDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybVJlbmFtZUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBBbHRlckNvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtQWx0ZXJDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgTW9kaWZ5Q29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1Nb2RpZnlDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQWRkQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtQWRkQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgUmVuYW1lQ29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtUmVuYW1lQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBGb3JlaWduS2V5Q29uc3RyYWludE5vZGU6IHRoaXMudHJhbnNmb3JtRm9yZWlnbktleUNvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlVmlld05vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGU6IHRoaXMudHJhbnNmb3JtUmVmcmVzaE1hdGVyaWFsaXplZFZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFZpZXdOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BWaWV3LmJpbmQodGhpcyksXG4gICAgICAgIEdlbmVyYXRlZE5vZGU6IHRoaXMudHJhbnNmb3JtR2VuZXJhdGVkLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRWYWx1ZU5vZGU6IHRoaXMudHJhbnNmb3JtRGVmYXVsdFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIE9uTm9kZTogdGhpcy50cmFuc2Zvcm1Pbi5iaW5kKHRoaXMpLFxuICAgICAgICBWYWx1ZXNOb2RlOiB0aGlzLnRyYW5zZm9ybVZhbHVlcy5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RNb2RpZmllck5vZGU6IHRoaXMudHJhbnNmb3JtU2VsZWN0TW9kaWZpZXIuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlVHlwZU5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVHlwZU5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcFR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRXhwbGFpbk5vZGU6IHRoaXMudHJhbnNmb3JtRXhwbGFpbi5iaW5kKHRoaXMpLFxuICAgICAgICBEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlOiB0aGlzLnRyYW5zZm9ybURlZmF1bHRJbnNlcnRWYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBBZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgT3Zlck5vZGU6IHRoaXMudHJhbnNmb3JtT3Zlci5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJ0aXRpb25CeU5vZGU6IHRoaXMudHJhbnNmb3JtUGFydGl0aW9uQnkuYmluZCh0aGlzKSxcbiAgICAgICAgUGFydGl0aW9uQnlJdGVtTm9kZTogdGhpcy50cmFuc2Zvcm1QYXJ0aXRpb25CeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgU2V0T3BlcmF0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1TZXRPcGVyYXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQmluYXJ5T3BlcmF0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1CaW5hcnlPcGVyYXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgVW5hcnlPcGVyYXRpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybVVuYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVzaW5nTm9kZTogdGhpcy50cmFuc2Zvcm1Vc2luZy5iaW5kKHRoaXMpLFxuICAgICAgICBGdW5jdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtRnVuY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ2FzZU5vZGU6IHRoaXMudHJhbnNmb3JtQ2FzZS5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVuTm9kZTogdGhpcy50cmFuc2Zvcm1XaGVuLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05SZWZlcmVuY2VOb2RlOiB0aGlzLnRyYW5zZm9ybUpTT05SZWZlcmVuY2UuYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlBhdGhOb2RlOiB0aGlzLnRyYW5zZm9ybUpTT05QYXRoLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTGVnTm9kZTogdGhpcy50cmFuc2Zvcm1KU09OUGF0aExlZy5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OT3BlcmF0b3JDaGFpbk5vZGU6IHRoaXMudHJhbnNmb3JtSlNPTk9wZXJhdG9yQ2hhaW4uYmluZCh0aGlzKSxcbiAgICAgICAgVHVwbGVOb2RlOiB0aGlzLnRyYW5zZm9ybVR1cGxlLmJpbmQodGhpcyksXG4gICAgICAgIE1lcmdlUXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybU1lcmdlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgTWF0Y2hlZE5vZGU6IHRoaXMudHJhbnNmb3JtTWF0Y2hlZC5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRJbmRleE5vZGU6IHRoaXMudHJhbnNmb3JtQWRkSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgQ2FzdE5vZGU6IHRoaXMudHJhbnNmb3JtQ2FzdC5iaW5kKHRoaXMpLFxuICAgICAgICBGZXRjaE5vZGU6IHRoaXMudHJhbnNmb3JtRmV0Y2guYmluZCh0aGlzKSxcbiAgICAgICAgVG9wTm9kZTogdGhpcy50cmFuc2Zvcm1Ub3AuYmluZCh0aGlzKSxcbiAgICAgICAgT3V0cHV0Tm9kZTogdGhpcy50cmFuc2Zvcm1PdXRwdXQuYmluZCh0aGlzKSxcbiAgICAgICAgT3JBY3Rpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybU9yQWN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIENvbGxhdGVOb2RlOiB0aGlzLnRyYW5zZm9ybUNvbGxhdGUuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB0cmFuc2Zvcm1Ob2RlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKG5vZGUpO1xuICAgICAgICBjb25zdCBvdXQgPSB0aGlzLnRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wb3AoKTtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZShvdXQpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lcnNbbm9kZS5raW5kXShub2RlLCBxdWVyeUlkKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTm9kZUxpc3QobGlzdCwgcXVlcnlJZCkge1xuICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcmVlemUobGlzdC5tYXAoKG5vZGUpID0+IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLCBxdWVyeUlkKSkpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZWxlY3RRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mcm9tLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5zZWxlY3Rpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRpc3RpbmN0T246IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5kaXN0aW5jdE9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGpvaW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuam9pbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZ3JvdXBCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZ3JvdXBCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBsaW1pdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGltaXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vZmZzZXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aCwgcXVlcnlJZCksXG4gICAgICAgICAgICBoYXZpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmhhdmluZywgcXVlcnlJZCksXG4gICAgICAgICAgICBleHBsYWluOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHBsYWluLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNldE9wZXJhdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5zZXRPcGVyYXRpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZldGNoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mZXRjaCwgcXVlcnlJZCksXG4gICAgICAgICAgICB0b3A6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRvcCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZWxlY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2VsZWN0aW9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWxpYXMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbGlhc05vZGUnLFxuICAgICAgICAgICAgbm9kZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubm9kZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBhbGlhczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuYWxpYXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZyb20obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGcm9tTm9kZScsXG4gICAgICAgICAgICBmcm9tczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb21zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlZmVyZW5jZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFuZChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FuZE5vZGUnLFxuICAgICAgICAgICAgbGVmdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGVmdCwgcXVlcnlJZCksXG4gICAgICAgICAgICByaWdodDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmlnaHQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3Iobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPck5vZGUnLFxuICAgICAgICAgICAgbGVmdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGVmdCwgcXVlcnlJZCksXG4gICAgICAgICAgICByaWdodDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmlnaHQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVmFsdWVMaXN0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVMaXN0Tm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUGFyZW5zKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUGFyZW5zTm9kZScsXG4gICAgICAgICAgICBub2RlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ub2RlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpvaW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKb2luTm9kZScsXG4gICAgICAgICAgICBqb2luVHlwZTogbm9kZS5qb2luVHlwZSxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmF3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmF3Tm9kZScsXG4gICAgICAgICAgICBzcWxGcmFnbWVudHM6IGZyZWV6ZShbLi4ubm9kZS5zcWxGcmFnbWVudHNdKSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5wYXJhbWV0ZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVdoZXJlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnV2hlcmVOb2RlJyxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1JbnNlcnRRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0luc2VydFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBpbnRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbnRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uQ29uZmxpY3Q6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9uQ29uZmxpY3QsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb25EdXBsaWNhdGVLZXk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9uRHVwbGljYXRlS2V5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlnbm9yZTogbm9kZS5pZ25vcmUsXG4gICAgICAgICAgICBvckFjdGlvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JBY3Rpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVwbGFjZTogbm9kZS5yZXBsYWNlLFxuICAgICAgICAgICAgZXhwbGFpbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwbGFpbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWVzOiBub2RlLmRlZmF1bHRWYWx1ZXMsXG4gICAgICAgICAgICB0b3A6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRvcCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm91dHB1dCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZXMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZXNOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1EZWxldGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0RlbGV0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mcm9tLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICBqb2luczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmpvaW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXR1cm5pbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJldHVybmluZywgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGxpbWl0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5saW1pdCwgcXVlcnlJZCksXG4gICAgICAgICAgICBleHBsYWluOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHBsYWluLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJldHVybmluZyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JldHVybmluZ05vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnNlbGVjdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29uc3RyYWludHMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGVtcG9yYXJ5OiBub2RlLnRlbXBvcmFyeSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICAgICAgb25Db21taXQ6IG5vZGUub25Db21taXQsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBzZWxlY3RRdWVyeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2VsZWN0UXVlcnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sdW1uRGVmaW5pdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbkRlZmluaXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kYXRhVHlwZSwgcXVlcnlJZCksXG4gICAgICAgICAgICByZWZlcmVuY2VzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZWZlcmVuY2VzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHByaW1hcnlLZXk6IG5vZGUucHJpbWFyeUtleSxcbiAgICAgICAgICAgIGF1dG9JbmNyZW1lbnQ6IG5vZGUuYXV0b0luY3JlbWVudCxcbiAgICAgICAgICAgIHVuaXF1ZTogbm9kZS51bmlxdWUsXG4gICAgICAgICAgICBub3ROdWxsOiBub2RlLm5vdE51bGwsXG4gICAgICAgICAgICB1bnNpZ25lZDogbm9kZS51bnNpZ25lZCxcbiAgICAgICAgICAgIGRlZmF1bHRUbzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGVmYXVsdFRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNoZWNrOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jaGVjaywgcXVlcnlJZCksXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmdlbmVyYXRlZCwgcXVlcnlJZCksXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiBub2RlLm51bGxzTm90RGlzdGluY3QsXG4gICAgICAgICAgICBpZGVudGl0eTogbm9kZS5pZGVudGl0eSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWRkQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9yZGVyQnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLml0ZW1zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9yZGVyQnlJdGVtKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3JkZXJCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kaXJlY3Rpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sbGF0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2xsYXRpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbnVsbHM6IG5vZGUubnVsbHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Hcm91cEJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5pdGVtcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Hcm91cEJ5SXRlbShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0dyb3VwQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBncm91cEJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ncm91cEJ5LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVVwZGF0ZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVXBkYXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBmcm9tOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5mcm9tLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGpvaW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuam9pbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS51cGRhdGVzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGV4cGxhaW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cGxhaW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxpbWl0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sdW1uVXBkYXRlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uVXBkYXRlTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudmFsdWUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTGltaXQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdMaW1pdE5vZGUnLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxpbWl0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9mZnNldChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09mZnNldE5vZGUnLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vZmZzZXQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT25Db25mbGljdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09uQ29uZmxpY3ROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaW5kZXhFeHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbmRleEV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaW5kZXhXaGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW5kZXhXaGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB1cGRhdGVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudXBkYXRlcywgcXVlcnlJZCksXG4gICAgICAgICAgICB1cGRhdGVXaGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXBkYXRlV2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZG9Ob3RoaW5nOiBub2RlLmRvTm90aGluZyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9uRHVwbGljYXRlS2V5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT25EdXBsaWNhdGVLZXlOb2RlJyxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS51cGRhdGVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNyZWF0ZUluZGV4KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVuaXF1ZTogbm9kZS51bmlxdWUsXG4gICAgICAgICAgICB1c2luZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXNpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgICAgICB3aGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogbm9kZS5udWxsc05vdERpc3RpbmN0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTGlzdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0xpc3ROb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuaXRlbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcEluZGV4KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcEluZGV4Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVByaW1hcnlLZXlDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGVmZXJyYWJsZTogbm9kZS5kZWZlcnJhYmxlLFxuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IG5vZGUuaW5pdGlhbGx5RGVmZXJyZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1VbmlxdWVDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVW5pcXVlQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiBub2RlLm51bGxzTm90RGlzdGluY3QsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBub2RlLmRlZmVycmFibGUsXG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogbm9kZS5pbml0aWFsbHlEZWZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZvcmVpZ25LZXlDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRm9yZWlnbktleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlZmVyZW5jZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBvbkRlbGV0ZTogbm9kZS5vbkRlbGV0ZSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBub2RlLm9uVXBkYXRlLFxuICAgICAgICAgICAgZGVmZXJyYWJsZTogbm9kZS5kZWZlcnJhYmxlLFxuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IG5vZGUuaW5pdGlhbGx5RGVmZXJyZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZXRPcGVyYXRpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZXRPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yOiBub2RlLm9wZXJhdG9yLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBhbGw6IG5vZGUuYWxsLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVmZXJlbmNlcyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZXNOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBvbkRlbGV0ZTogbm9kZS5vbkRlbGV0ZSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBub2RlLm9uVXBkYXRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ2hlY2tDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ2hlY2tDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtV2l0aChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1dpdGhOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVjdXJzaXZlOiBub2RlLnJlY3Vyc2l2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbW1vblRhYmxlRXhwcmVzc2lvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IG5vZGUubWF0ZXJpYWxpemVkLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUhhdmluZyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0hhdmluZ05vZGUnLFxuICAgICAgICAgICAgaGF2aW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5oYXZpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlU2NoZW1hKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNjaGVtYSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BTY2hlbWEobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNjaGVtYSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFsdGVyVGFibGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlclRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVuYW1lVG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlbmFtZVRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNldFNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2V0U2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbkFsdGVyYXRpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYWRkQ29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuYWRkQ29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICBkcm9wQ29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZHJvcENvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVuYW1lQ29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVuYW1lQ29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICBhZGRJbmRleDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuYWRkSW5kZXgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZHJvcEluZGV4OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kcm9wSW5kZXgsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcENvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlbmFtZUNvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlbmFtZUNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVuYW1lVG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlbmFtZVRvLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFsdGVyQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWx0ZXJDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kYXRhVHlwZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkYXRhVHlwZUV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlRXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBzZXREZWZhdWx0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZXREZWZhdWx0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRyb3BEZWZhdWx0OiBub2RlLmRyb3BEZWZhdWx0LFxuICAgICAgICAgICAgc2V0Tm90TnVsbDogbm9kZS5zZXROb3ROdWxsLFxuICAgICAgICAgICAgZHJvcE5vdE51bGw6IG5vZGUuZHJvcE5vdE51bGwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Nb2RpZnlDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNb2RpZnlDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFkZENvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnROYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb25zdHJhaW50TmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIG1vZGlmaWVyOiBub2RlLm1vZGlmaWVyLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVuYW1lQ29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlbmFtZUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIG9sZE5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9sZE5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmV3TmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmV3TmFtZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVWaWV3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB0ZW1wb3Jhcnk6IG5vZGUudGVtcG9yYXJ5LFxuICAgICAgICAgICAgb3JSZXBsYWNlOiBub2RlLm9yUmVwbGFjZSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiBub2RlLm1hdGVyaWFsaXplZCxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZWZyZXNoTWF0ZXJpYWxpemVkVmlldyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1JlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbmN1cnJlbnRseTogbm9kZS5jb25jdXJyZW50bHksXG4gICAgICAgICAgICB3aXRoTm9EYXRhOiBub2RlLndpdGhOb0RhdGEsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wVmlldyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BWaWV3Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiBub2RlLm1hdGVyaWFsaXplZCxcbiAgICAgICAgICAgIGNhc2NhZGU6IG5vZGUuY2FzY2FkZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUdlbmVyYXRlZChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0dlbmVyYXRlZE5vZGUnLFxuICAgICAgICAgICAgYnlEZWZhdWx0OiBub2RlLmJ5RGVmYXVsdCxcbiAgICAgICAgICAgIGFsd2F5czogbm9kZS5hbHdheXMsXG4gICAgICAgICAgICBpZGVudGl0eTogbm9kZS5pZGVudGl0eSxcbiAgICAgICAgICAgIHN0b3JlZDogbm9kZS5zdG9yZWQsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURlZmF1bHRWYWx1ZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0RlZmF1bHRWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kZWZhdWx0VmFsdWUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbk5vZGUnLFxuICAgICAgICAgICAgb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdE1vZGlmaWVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0TW9kaWZpZXJOb2RlJyxcbiAgICAgICAgICAgIG1vZGlmaWVyOiBub2RlLm1vZGlmaWVyLFxuICAgICAgICAgICAgcmF3TW9kaWZpZXI6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJhd01vZGlmaWVyLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9mOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUub2YsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlVHlwZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW51bTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZW51bSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wVHlwZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BUeXBlTm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRXhwbGFpbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0V4cGxhaW5Ob2RlJyxcbiAgICAgICAgICAgIGZvcm1hdDogbm9kZS5mb3JtYXQsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcHRpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNjaGVtYWJsZUlkZW50aWZpZXIobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTY2hlbWFibGVJZGVudGlmaWVyTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNjaGVtYSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pZGVudGlmaWVyLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFnZ3JlZ2F0ZUZ1bmN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWdncmVnYXRlRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmM6IG5vZGUuZnVuYyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZWQ6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5hZ2dyZWdhdGVkLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRpc3RpbmN0OiBub2RlLmRpc3RpbmN0LFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoaW5Hcm91cDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aGluR3JvdXAsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZmlsdGVyOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5maWx0ZXIsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3ZlcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3ZlciwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PdmVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3Zlck5vZGUnLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICBwYXJ0aXRpb25CeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucGFydGl0aW9uQnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUGFydGl0aW9uQnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJ0aXRpb25CeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5pdGVtcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QYXJ0aXRpb25CeUl0ZW0obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJ0aXRpb25CeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5wYXJ0aXRpb25CeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1CaW5hcnlPcGVyYXRpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdCaW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGxlZnRPcGVyYW5kOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5sZWZ0T3BlcmFuZCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmlnaHRPcGVyYW5kOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yaWdodE9wZXJhbmQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVW5hcnlPcGVyYXRpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVbmFyeU9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3I6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wZXJhdG9yLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9wZXJhbmQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wZXJhbmQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVXNpbmcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVc2luZ05vZGUnLFxuICAgICAgICAgICAgdGFibGVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudGFibGVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZ1bmN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmM6IG5vZGUuZnVuYyxcbiAgICAgICAgICAgIGFyZ3VtZW50czogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmFyZ3VtZW50cywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DYXNlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ2FzZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnZhbHVlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZW46IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS53aGVuLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVsc2U6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmVsc2UsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaXNTdGF0ZW1lbnQ6IG5vZGUuaXNTdGF0ZW1lbnQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1XaGVuKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnV2hlbk5vZGUnLFxuICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb25kaXRpb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVzdWx0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXN1bHQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSlNPTlJlZmVyZW5jZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pTT05SZWZlcmVuY2VOb2RlJyxcbiAgICAgICAgICAgIHJlZmVyZW5jZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVmZXJlbmNlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRyYXZlcnNhbDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudHJhdmVyc2FsLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpTT05QYXRoKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlBhdGhOb2RlJyxcbiAgICAgICAgICAgIGluT3BlcmF0b3I6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmluT3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcGF0aExlZ3M6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5wYXRoTGVncywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1KU09OUGF0aExlZyhub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUGF0aExlZ05vZGUnLFxuICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1KU09OT3BlcmF0b3JDaGFpbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pTT05PcGVyYXRvckNoYWluTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVR1cGxlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVHVwbGVOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1NZXJnZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTWVyZ2VRdWVyeU5vZGUnLFxuICAgICAgICAgICAgaW50bzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW50bywgcXVlcnlJZCksXG4gICAgICAgICAgICB1c2luZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXNpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS53aGVucywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm91dHB1dCwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXR1cm5pbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJldHVybmluZywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1NYXRjaGVkKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ01hdGNoZWROb2RlJyxcbiAgICAgICAgICAgIG5vdDogbm9kZS5ub3QsXG4gICAgICAgICAgICBieVNvdXJjZTogbm9kZS5ieVNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFkZEluZGV4KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWRkSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdW5pcXVlOiBub2RlLnVuaXF1ZSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNhc3Qobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDYXN0Tm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kYXRhVHlwZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1GZXRjaChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0ZldGNoTm9kZScsXG4gICAgICAgICAgICByb3dDb3VudDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucm93Q291bnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbW9kaWZpZXI6IG5vZGUubW9kaWZpZXIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ub3Aobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVG9wTm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uOiBub2RlLmV4cHJlc3Npb24sXG4gICAgICAgICAgICBtb2RpZmllcnM6IG5vZGUubW9kaWZpZXJzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3V0cHV0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3V0cHV0Tm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuc2VsZWN0aW9ucywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1EYXRhVHlwZShub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZWxlY3RBbGwobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSWRlbnRpZmllcihub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZShub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QcmltaXRpdmVWYWx1ZUxpc3Qobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3BlcmF0b3Iobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRGVmYXVsdEluc2VydFZhbHVlKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9yQWN0aW9uKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbGxhdGUobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBMaXN0Tm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2xpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS10cmFuc2Zvcm1lci5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBVc2luZ05vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS91c2luZy1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uLy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8vIFRoaXMgb2JqZWN0IGV4aXN0IG9ubHkgc28gdGhhdCB3ZSBnZXQgYSB0eXBlIGVycm9yIHdoZW4gYSBuZXcgUm9vdE9wZXJhdGlvbk5vZGVcbi8vIGlzIGFkZGVkLiBJZiB5b3UgZ2V0IGEgdHlwZSBlcnJvciBoZXJlLCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBuZXcgcm9vdCBub2RlIGFuZFxuLy8gaGFuZGxlIGl0IGNvcnJlY3RseSBpbiB0aGUgdHJhbnNmb3JtZXIuXG4vL1xuLy8gRE8gTk9UIFJFRkFDVE9SIFRISVMgRVZFTiBJRiBJVCBTRUVNUyBVU0VMRVNTIFRPIFlPVSFcbmNvbnN0IFJPT1RfT1BFUkFUSU9OX05PREVTID0gZnJlZXplKHtcbiAgICBBbHRlclRhYmxlTm9kZTogdHJ1ZSxcbiAgICBDcmVhdGVJbmRleE5vZGU6IHRydWUsXG4gICAgQ3JlYXRlU2NoZW1hTm9kZTogdHJ1ZSxcbiAgICBDcmVhdGVUYWJsZU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlVHlwZU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlVmlld05vZGU6IHRydWUsXG4gICAgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlOiB0cnVlLFxuICAgIERlbGV0ZVF1ZXJ5Tm9kZTogdHJ1ZSxcbiAgICBEcm9wSW5kZXhOb2RlOiB0cnVlLFxuICAgIERyb3BTY2hlbWFOb2RlOiB0cnVlLFxuICAgIERyb3BUYWJsZU5vZGU6IHRydWUsXG4gICAgRHJvcFR5cGVOb2RlOiB0cnVlLFxuICAgIERyb3BWaWV3Tm9kZTogdHJ1ZSxcbiAgICBJbnNlcnRRdWVyeU5vZGU6IHRydWUsXG4gICAgUmF3Tm9kZTogdHJ1ZSxcbiAgICBTZWxlY3RRdWVyeU5vZGU6IHRydWUsXG4gICAgVXBkYXRlUXVlcnlOb2RlOiB0cnVlLFxuICAgIE1lcmdlUXVlcnlOb2RlOiB0cnVlLFxufSk7XG5jb25zdCBTQ0hFTUFMRVNTX0ZVTkNUSU9OUyA9IHtcbiAgICBqc29uX2FnZzogdHJ1ZSxcbiAgICB0b19qc29uOiB0cnVlLFxufTtcbmV4cG9ydCBjbGFzcyBXaXRoU2NoZW1hVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICAgICNzY2hlbWE7XG4gICAgI3NjaGVtYWJsZUlkcyA9IG5ldyBTZXQoKTtcbiAgICAjY3RlcyA9IG5ldyBTZXQoKTtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jc2NoZW1hID0gc2NoZW1hO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGlmICghdGhpcy4jaXNSb290T3BlcmF0aW9uTm9kZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN0ZXMgPSB0aGlzLiNjb2xsZWN0Q1RFcyhub2RlKTtcbiAgICAgICAgZm9yIChjb25zdCBjdGUgb2YgY3Rlcykge1xuICAgICAgICAgICAgdGhpcy4jY3Rlcy5hZGQoY3RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZXMgPSB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzKG5vZGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgICAgICAgdGhpcy4jc2NoZW1hYmxlSWRzLmFkZCh0YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBzdXBlci50cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NjaGVtYWJsZUlkcy5kZWxldGUodGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3RlIG9mIGN0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2N0ZXMuZGVsZXRlKGN0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TY2hlbWFibGVJZGVudGlmaWVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBzdXBlci50cmFuc2Zvcm1TY2hlbWFibGVJZGVudGlmaWVyKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQuc2NoZW1hIHx8ICF0aGlzLiNzY2hlbWFibGVJZHMuaGFzKG5vZGUuaWRlbnRpZmllci5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50cmFuc2Zvcm1lZCxcbiAgICAgICAgICAgIHNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI3NjaGVtYSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlZmVyZW5jZXMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHN1cGVyLnRyYW5zZm9ybVJlZmVyZW5jZXMobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZC50YWJsZS50YWJsZS5zY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udHJhbnNmb3JtZWQsXG4gICAgICAgICAgICB0YWJsZTogVGFibGVOb2RlLmNyZWF0ZVdpdGhTY2hlbWEodGhpcy4jc2NoZW1hLCB0cmFuc2Zvcm1lZC50YWJsZS50YWJsZS5pZGVudGlmaWVyLm5hbWUpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BZ2dyZWdhdGVGdW5jdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci50cmFuc2Zvcm1BZ2dyZWdhdGVGdW5jdGlvbih7IC4uLm5vZGUsIGFnZ3JlZ2F0ZWQ6IFtdIH0sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYWdncmVnYXRlZDogdGhpcy4jdHJhbnNmb3JtVGFibGVBcmdzV2l0aG91dFNjaGVtYXMobm9kZSwgcXVlcnlJZCwgJ2FnZ3JlZ2F0ZWQnKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3VwZXIudHJhbnNmb3JtRnVuY3Rpb24oeyAuLi5ub2RlLCBhcmd1bWVudHM6IFtdIH0sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB0aGlzLiN0cmFuc2Zvcm1UYWJsZUFyZ3NXaXRob3V0U2NoZW1hcyhub2RlLCBxdWVyeUlkLCAnYXJndW1lbnRzJyksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdE1vZGlmaWVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN1cGVyLnRyYW5zZm9ybVNlbGVjdE1vZGlmaWVyKHsgLi4ubm9kZSwgb2Y6IHVuZGVmaW5lZCB9LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9mOiBub2RlLm9mPy5tYXAoKGl0ZW0pID0+IFRhYmxlTm9kZS5pcyhpdGVtKSAmJiAhaXRlbS50YWJsZS5zY2hlbWFcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtSWRlbnRpZmllcihpdGVtLnRhYmxlLmlkZW50aWZpZXIsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHRoaXMudHJhbnNmb3JtTm9kZShpdGVtLCBxdWVyeUlkKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgICN0cmFuc2Zvcm1UYWJsZUFyZ3NXaXRob3V0U2NoZW1hcyhub2RlLCBxdWVyeUlkLCBhcmdzS2V5KSB7XG4gICAgICAgIHJldHVybiBTQ0hFTUFMRVNTX0ZVTkNUSU9OU1tub2RlLmZ1bmNdXG4gICAgICAgICAgICA/IG5vZGVbYXJnc0tleV0ubWFwKChhcmcpID0+ICFUYWJsZU5vZGUuaXMoYXJnKSB8fCBhcmcudGFibGUuc2NoZW1hXG4gICAgICAgICAgICAgICAgPyB0aGlzLnRyYW5zZm9ybU5vZGUoYXJnLCBxdWVyeUlkKVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5hcmcsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybUlkZW50aWZpZXIoYXJnLnRhYmxlLmlkZW50aWZpZXIsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZVthcmdzS2V5XSwgcXVlcnlJZCk7XG4gICAgfVxuICAgICNpc1Jvb3RPcGVyYXRpb25Ob2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCBpbiBST09UX09QRVJBVElPTl9OT0RFUztcbiAgICB9XG4gICAgI2NvbGxlY3RTY2hlbWFibGVJZHMobm9kZSkge1xuICAgICAgICBjb25zdCBzY2hlbWFibGVJZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGlmICgnbmFtZScgaW4gbm9kZSAmJiBub2RlLm5hbWUgJiYgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuaXMobm9kZS5uYW1lKSkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUubmFtZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Zyb20nIGluIG5vZGUgJiYgbm9kZS5mcm9tKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZyb20gb2Ygbm9kZS5mcm9tLmZyb21zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIoZnJvbSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2ludG8nIGluIG5vZGUgJiYgbm9kZS5pbnRvKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLmludG8sIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCd0YWJsZScgaW4gbm9kZSAmJiBub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnam9pbnMnIGluIG5vZGUgJiYgbm9kZS5qb2lucykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBqb2luIG9mIG5vZGUuam9pbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihqb2luLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgndXNpbmcnIGluIG5vZGUgJiYgbm9kZS51c2luZykge1xuICAgICAgICAgICAgaWYgKEpvaW5Ob2RlLmlzKG5vZGUudXNpbmcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZS51c2luZy50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKG5vZGUudXNpbmcsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjaGVtYWJsZUlkcztcbiAgICB9XG4gICAgI2NvbGxlY3RDVEVzKG5vZGUpIHtcbiAgICAgICAgY29uc3QgY3RlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKCd3aXRoJyBpbiBub2RlICYmIG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdENURUlkcyhub2RlLndpdGgsIGN0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdGVzO1xuICAgIH1cbiAgICAjY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZSwgc2NoZW1hYmxlSWRzKSB7XG4gICAgICAgIGlmIChUYWJsZU5vZGUuaXMobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWQobm9kZS50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQWxpYXNOb2RlLmlzKG5vZGUpICYmIFRhYmxlTm9kZS5pcyhub2RlLm5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUubm9kZS50YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTGlzdE5vZGUuaXMobm9kZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFibGUgb2Ygbm9kZS5pdGVtcykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKHRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChVc2luZ05vZGUuaXMobm9kZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFibGUgb2Ygbm9kZS50YWJsZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcih0YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUsIHNjaGVtYWJsZUlkcykge1xuICAgICAgICBjb25zdCBpZCA9IG5vZGUuaWRlbnRpZmllci5uYW1lO1xuICAgICAgICBpZiAoIXRoaXMuI3NjaGVtYWJsZUlkcy5oYXMoaWQpICYmICF0aGlzLiNjdGVzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHNjaGVtYWJsZUlkcy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNjb2xsZWN0Q1RFSWRzKG5vZGUsIGN0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIG5vZGUuZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0ZUlkID0gZXhwci5uYW1lLnRhYmxlLnRhYmxlLmlkZW50aWZpZXIubmFtZTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jY3Rlcy5oYXMoY3RlSWQpKSB7XG4gICAgICAgICAgICAgICAgY3Rlcy5hZGQoY3RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aXRoLXNjaGVtYS1wbHVnaW4uZC50c1wiIC8+XG5pbXBvcnQgeyBXaXRoU2NoZW1hVHJhbnNmb3JtZXIgfSBmcm9tICcuL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmpzJztcbmV4cG9ydCBjbGFzcyBXaXRoU2NoZW1hUGx1Z2luIHtcbiAgICAjdHJhbnNmb3JtZXI7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zZm9ybWVyID0gbmV3IFdpdGhTY2hlbWFUcmFuc2Zvcm1lcihzY2hlbWEpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1RdWVyeShhcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSwgYXJncy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgdHJhbnNmb3JtUmVzdWx0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MucmVzdWx0O1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWF0Y2hlZC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE1hdGNoZWROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdNYXRjaGVkTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobm90LCBieVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01hdGNoZWROb2RlJyxcbiAgICAgICAgICAgIG5vdCxcbiAgICAgICAgICAgIGJ5U291cmNlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IE1hdGNoZWROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWF0Y2hlZC1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvd2hlbi1ub2RlLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VGaWx0ZXJMaXN0LCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4vYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVyZ2VXaGVuKHR5cGUsIGFyZ3MsIHJlZlJpZ2h0KSB7XG4gICAgcmV0dXJuIFdoZW5Ob2RlLmNyZWF0ZShwYXJzZUZpbHRlckxpc3QoW1xuICAgICAgICBNYXRjaGVkTm9kZS5jcmVhdGUoIXR5cGUuaXNNYXRjaGVkLCB0eXBlLmJ5U291cmNlKSxcbiAgICAgICAgLi4uKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMyAmJiByZWZSaWdodFxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgXSwgJ2FuZCcsIGZhbHNlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXJnZVRoZW4ocmVzdWx0KSB7XG4gICAgaWYgKGlzU3RyaW5nKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKFtyZXN1bHRdLCBbXSk7XG4gICAgfVxuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZlcnJlZC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgI3Byb21pc2U7XG4gICAgI3Jlc29sdmU7XG4gICAgI3JlamVjdDtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy4jcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHRoaXMuI3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbiAgICByZXNvbHZlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNyZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVqZWN0ID0gKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLiNyZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3Byb3ZpZGUtY29udHJvbGxlZC1jb25uZWN0aW9uLmQudHNcIiAvPlxuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuL2RlZmVycmVkLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24oY29ubmVjdGlvblByb3ZpZGVyKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbkRlZmVyID0gbmV3IERlZmVycmVkKCk7XG4gICAgY29uc3QgY29ubmVjdGlvblJlbGVhc2VEZWZlciA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIGNvbm5lY3Rpb25Qcm92aWRlclxuICAgICAgICAucHJvdmlkZUNvbm5lY3Rpb24oYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgY29ubmVjdGlvbkRlZmVyLnJlc29sdmUoY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb25uZWN0aW9uUmVsZWFzZURlZmVyLnByb21pc2U7XG4gICAgfSlcbiAgICAgICAgLmNhdGNoKChleCkgPT4gY29ubmVjdGlvbkRlZmVyLnJlamVjdChleCkpO1xuICAgIC8vIENyZWF0ZSBjb21wb3NpdGUgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZSByZWxlYXNlIG1ldGhvZCBpbnN0ZWFkIG9mXG4gICAgLy8gbW9kaWZ5aW5nIHRoZSBjb25uZWN0aW9uIG9yIGNyZWF0aW5nIGEgbmV3IG5lc3RpbmcgYERhdGFiYXNlQ29ubmVjdGlvbmAuXG4gICAgLy8gVGhpcyB3YXkgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IG92ZXJyaWRlIGFueSBtZXRob2RzIG9mIDNyZCBwYXJ0eVxuICAgIC8vIGNvbm5lY3Rpb25zIGFuZCBkb24ndCByZXR1cm4gd3JhcHBlZCBjb25uZWN0aW9ucyB0byBkcml2ZXJzIHRoYXRcbiAgICAvLyBleHBlY3QgYSBjZXJ0YWluIHNwZWNpZmljIGNvbm5lY3Rpb24gY2xhc3MuXG4gICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgIGNvbm5lY3Rpb246IGF3YWl0IGNvbm5lY3Rpb25EZWZlci5wcm9taXNlLFxuICAgICAgICByZWxlYXNlOiBjb25uZWN0aW9uUmVsZWFzZURlZmVyLnJlc29sdmUsXG4gICAgfSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24gfSBmcm9tICcuLi91dGlsL3Byb3ZpZGUtY29udHJvbGxlZC1jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IGxvZ09uY2UgfSBmcm9tICcuLi91dGlsL2xvZy1vbmNlLmpzJztcbmNvbnN0IE5PX1BMVUdJTlMgPSBmcmVlemUoW10pO1xuZXhwb3J0IGNsYXNzIFF1ZXJ5RXhlY3V0b3JCYXNlIHtcbiAgICAjcGx1Z2lucztcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW5zID0gTk9fUExVR0lOUykge1xuICAgICAgICB0aGlzLiNwbHVnaW5zID0gcGx1Z2lucztcbiAgICB9XG4gICAgZ2V0IHBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwbHVnaW5zO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1RdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuI3BsdWdpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkTm9kZSA9IHBsdWdpbi50cmFuc2Zvcm1RdWVyeSh7IG5vZGUsIHF1ZXJ5SWQgfSk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIGEgcnVudGltZSBjaGVjayBoZXJlLiBUaGVyZSBpcyBubyBnb29kIHdheVxuICAgICAgICAgICAgLy8gdG8gd3JpdGUgdHlwZXMgdGhhdCBlbmZvcmNlIHRoaXMgY29uc3RyYWludC5cbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZE5vZGUua2luZCA9PT0gbm9kZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHRyYW5zZm9ybWVkTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgICAgICAgICAgICAgIGBLeXNlbHlQbHVnaW4udHJhbnNmb3JtUXVlcnkgbXVzdCByZXR1cm4gYSBub2RlYCxcbiAgICAgICAgICAgICAgICAgICAgYG9mIHRoZSBzYW1lIGtpbmQgdGhhdCB3YXMgZ2l2ZW4gdG8gaXQuYCxcbiAgICAgICAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gd2FzIGdpdmVuIGEgJHtub2RlLmtpbmR9YCxcbiAgICAgICAgICAgICAgICAgICAgYGJ1dCBpdCByZXR1cm5lZCBhICR7dHJhbnNmb3JtZWROb2RlLmtpbmR9YCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgICAgIGlmICgnbnVtVXBkYXRlZE9yRGVsZXRlZFJvd3MnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxvZ09uY2UoJ2t5c2VseTp3YXJuaW5nOiBvdXRkYXRlZCBkcml2ZXIvcGx1Z2luIGRldGVjdGVkISBgUXVlcnlSZXN1bHQubnVtVXBkYXRlZE9yRGVsZXRlZFJvd3NgIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYFF1ZXJ5UmVzdWx0Lm51bUFmZmVjdGVkUm93c2AuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgY29tcGlsZWRRdWVyeS5xdWVyeUlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSB7XG4gICAgICAgIGNvbnN0IHsgY29ubmVjdGlvbiwgcmVsZWFzZSB9ID0gYXdhaXQgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCByZXN1bHQgb2YgY29ubmVjdGlvbi5zdHJlYW1RdWVyeShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgYXdhaXQgdGhpcy4jdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgY29tcGlsZWRRdWVyeS5xdWVyeUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyAjdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgcXVlcnlJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLiNwbHVnaW5zKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBwbHVnaW4udHJhbnNmb3JtUmVzdWx0KHsgcmVzdWx0LCBxdWVyeUlkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmQudHNcIiAvPlxuaW1wb3J0IHsgUXVlcnlFeGVjdXRvckJhc2UgfSBmcm9tICcuL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuanMnO1xuLyoqXG4gKiBBIHtAbGluayBRdWVyeUV4ZWN1dG9yfSBzdWJjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4geW91IGRvbid0XG4gKiBoYXZlIGEge0BsaW5rIFF1ZXJ5Q29tcGlsZXJ9LCB7QGxpbmsgQ29ubmVjdGlvblByb3ZpZGVyfSBvciBhbnlcbiAqIG90aGVyIG5lZWRlZCB0aGluZ3MgdG8gYWN0dWFsbHkgZXhlY3V0ZSBxdWVyaWVzLlxuICovXG5leHBvcnQgY2xhc3MgTm9vcFF1ZXJ5RXhlY3V0b3IgZXh0ZW5kcyBRdWVyeUV4ZWN1dG9yQmFzZSB7XG4gICAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBxdWVyeSBjYW5ub3QgYmUgY29tcGlsZWQgdG8gU1FMJyk7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBiZSBjb21waWxlZCB0byBTUUwnKTtcbiAgICB9XG4gICAgcHJvdmlkZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBxdWVyeSBjYW5ub3QgYmUgZXhlY3V0ZWQnKTtcbiAgICB9XG4gICAgd2l0aENvbm5lY3Rpb25Qcm92aWRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBoYXZlIGEgY29ubmVjdGlvbiBwcm92aWRlcicpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKFsuLi50aGlzLnBsdWdpbnMsIHBsdWdpbl0pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoWy4uLnRoaXMucGx1Z2lucywgLi4ucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luQXRGcm9udChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wUXVlcnlFeGVjdXRvcihbcGx1Z2luLCAuLi50aGlzLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoW10pO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBOT09QX1FVRVJZX0VYRUNVVE9SID0gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKCk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXJlc3VsdC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBNZXJnZVJlc3VsdCB7XG4gICAgbnVtQ2hhbmdlZFJvd3M7XG4gICAgY29uc3RydWN0b3IobnVtQ2hhbmdlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1DaGFuZ2VkUm93cyA9IG51bUNoYW5nZWRSb3dzO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWVyZ2UtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlSW5zZXJ0RXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvaW5zZXJ0LXZhbHVlcy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZU1lcmdlVGhlbiwgcGFyc2VNZXJnZVdoZW4gfSBmcm9tICcuLi9wYXJzZXIvbWVyZ2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QWxsLCBwYXJzZVNlbGVjdEFyZywgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmltcG9ydCB7IE5PT1BfUVVFUllfRVhFQ1VUT1IgfSBmcm9tICcuLi9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE1lcmdlUmVzdWx0IH0gZnJvbSAnLi9tZXJnZS1yZXN1bHQuanMnO1xuaW1wb3J0IHsgTm9SZXN1bHRFcnJvciwgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi91cGRhdGUtcXVlcnktYnVpbGRlci5qcyc7XG5leHBvcnQgY2xhc3MgTWVyZ2VRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsLnJhdygnLS0gdGhpcyBpcyBhIGNvbW1lbnQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIiB1c2luZyBcInBldFwiIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCIgd2hlbiBtYXRjaGVkIHRoZW4gZGVsZXRlIC0tIHRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBgbWVyZ2UgaW50b2AgcXVlcnkgdG8gYW4gYG1lcmdlIHRvcCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogQWZmZWN0IDUgbWF0Y2hlZCByb3dzIGF0IG1vc3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC50b3AoNSlcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIHRvcCg1KSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZGVsZXRlXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBZmZlY3QgNTAlIG9mIG1hdGNoZWQgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1MCwgJ3BlcmNlbnQnKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgdG9wKDUwKSBwZXJjZW50IGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVXNpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUpvaW4oJ1VzaW5nJywgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWwucmF3KCctLSB0aGlzIGlzIGEgY29tbWVudCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiIHVzaW5nIFwicGV0XCIgb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIiB3aGVuIG1hdGNoZWQgdGhlbiBkZWxldGUgLS0gdGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBNZXJnZVF1ZXJ5QnVpbGRlci50b3B9LlxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBgd2hlbiBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlIHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkQW5kfS5cbiAgICAgKlxuICAgICAqIEZvciBhIHNpbXBsZSBgd2hlbiBub3QgbWF0Y2hlZGAgY2xhdXNlLCBzZWUge0BsaW5rIHdoZW5Ob3RNYXRjaGVkfS5cbiAgICAgKlxuICAgICAqIEZvciBhIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2Ugd2l0aCBhbiBgYW5kYCBjb25kaXRpb24sIHNlZSB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aGVuTWF0Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5NYXRjaGVkKFtdKTtcbiAgICB9XG4gICAgd2hlbk1hdGNoZWRBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkgd2l0aCBhbiBgYW5kYCBjb25kaXRpb24uIEJ1dCB1bmxpa2VcbiAgICAgKiB7QGxpbmsgd2hlbk1hdGNoZWRBbmR9LCB0aGlzIG1ldGhvZCBhY2NlcHRzIGEgY29sdW1uIHJlZmVyZW5jZSBhcyB0aGUgM3JkIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB7QGxpbmsgU2VsZWN0UXVlcnlCdWlsZGVyLndoZXJlUmVmfSwgc28gc2VlIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgICogZm9yIHRoYXQgbWV0aG9kIGZvciBtb3JlIGV4YW1wbGVzLlxuICAgICAqL1xuICAgIHdoZW5NYXRjaGVkQW5kUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoW2xocywgb3AsIHJoc10sIHRydWUpO1xuICAgIH1cbiAgICAjd2hlbk1hdGNoZWQoYXJncywgcmVmUmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VXaGVuKHsgaXNNYXRjaGVkOiB0cnVlIH0sIGFyZ3MsIHJlZlJpZ2h0KSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTm90TWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiBGb3IgYSBzaW1wbGUgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkfS5cbiAgICAgKlxuICAgICAqIEZvciBhIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk5vdE1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5JbnNlcnRWYWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBub3QgbWF0Y2hlZCB0aGVuXG4gICAgICogICBpbnNlcnQgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiKSB2YWx1ZXMgKCQxLCAkMilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtdKTtcbiAgICB9XG4gICAgd2hlbk5vdE1hdGNoZWRBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5IHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLiBCdXQgdW5saWtlXG4gICAgICoge0BsaW5rIHdoZW5Ob3RNYXRjaGVkQW5kfSwgdGhpcyBtZXRob2QgYWNjZXB0cyBhIGNvbHVtbiByZWZlcmVuY2UgYXMgdGhlIDNyZCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgd2hlbk1hdGNoZWRBbmRSZWZ9LCB5b3UgY2Fubm90IHJlZmVyZW5jZSBjb2x1bW5zIGZyb20gdGhlIHRhcmdldCB0YWJsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8ge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlci53aGVyZVJlZn0sIHNvIHNlZSB0aGUgZG9jdW1lbnRhdGlvblxuICAgICAqIGZvciB0aGF0IG1ldGhvZCBmb3IgbW9yZSBleGFtcGxlcy5cbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZEFuZFJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtsaHMsIG9wLCByaHNdLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBgd2hlbiBub3QgbWF0Y2hlZCBieSBzb3VyY2VgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgaW4gTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIHdoZW5Ob3RNYXRjaGVkfSwgYnV0IHJldHVybnMgYSB7QGxpbmsgTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXJ9LlxuICAgICAqL1xuICAgIHdoZW5Ob3RNYXRjaGVkQnlTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTm90TWF0Y2hlZChbXSwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICB3aGVuTm90TWF0Y2hlZEJ5U291cmNlQW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKGFyZ3MsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYHdoZW4gbm90IG1hdGNoZWQgYnkgc291cmNlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5IHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmRSZWZ9LCBidXQgeW91IGNhbiByZWZlcmVuY2UgY29sdW1ucyBmcm9tXG4gICAgICogdGhlIHRhcmdldCB0YWJsZSwgYW5kIG5vdCBmcm9tIHNvdXJjZSB0YWJsZSBhbmQgcmV0dXJucyBhIHtAbGluayBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICovXG4gICAgd2hlbk5vdE1hdGNoZWRCeVNvdXJjZUFuZFJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtsaHMsIG9wLCByaHNdLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjd2hlbk5vdE1hdGNoZWQoYXJncywgcmVmUmlnaHQgPSBmYWxzZSwgYnlTb3VyY2UgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVuKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VNZXJnZVdoZW4oeyBpc01hdGNoZWQ6IGZhbHNlLCBieVNvdXJjZSB9LCBhcmdzLCByZWZSaWdodCkpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBCdWlsZGVyID0gYnlTb3VyY2VcbiAgICAgICAgICAgID8gTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXJcbiAgICAgICAgICAgIDogTm90TWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXI7XG4gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdKb2huJyB9KVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBlcnNvbihpZDogbnVtYmVyLCB1cGRhdGVzOiBQZXJzb25VcGRhdGUsIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgICAuc2V0KHVwZGF0ZXMpXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYHVwZGF0ZVBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtuZXcgTWVyZ2VSZXN1bHQocmVzdWx0Lm51bUFmZmVjdGVkUm93cyldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYGRlbGV0ZWAgYWN0aW9uLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRG9Ob3RoaW5nfS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGB1cGRhdGVgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuVXBkYXRlfSBvciB7QGxpbmsgdGhlblVwZGF0ZVNldH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5EZWxldGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZGVsZXRlJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN1cHBvcnRlZCBpbiBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRlbGV0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5EZWxldGV9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYHVwZGF0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5VcGRhdGV9IG9yIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRvTm90aGluZygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5Eb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZG8gbm90aGluZycpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYW4gYHVwZGF0ZWAgb3BlcmF0aW9uIHdpdGggYSBmdWxsLWZsZWRnZWQge0BsaW5rIFVwZGF0ZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICogVGhpcyBpcyBoYW5keSB3aGVuIG11bHRpcGxlIGBzZXRgIGludm9jYXRpb25zIGFyZSBuZWVkZWQuXG4gICAgICpcbiAgICAgKiBGb3IgYSBzaG9ydGhhbmQgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCwgc2VlIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGBkZWxldGVgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRGVsZXRlfS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlbkRvTm90aGluZ30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5VcGRhdGUoKHViKSA9PiB1YlxuICAgICAqICAgICAuc2V0KHNxbGBtZXRhZGF0YVsnaGFzX3BldHMnXWAsICdZJylcbiAgICAgKiAgICAgLnNldCh7XG4gICAgICogICAgICAgdXBkYXRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAqICAgICB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIHVwZGF0ZSBzZXQgbWV0YWRhdGFbJ2hhc19wZXRzJ10gPSAkMSwgXCJ1cGRhdGVkX2F0XCIgPSAkMlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5VcGRhdGUoc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbihzZXQobmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAgICAgcXVlcnlJZDogdGhpcy4jcHJvcHMucXVlcnlJZCxcbiAgICAgICAgICAgICAgICBleGVjdXRvcjogTk9PUF9RVUVSWV9FWEVDVVRPUixcbiAgICAgICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jcmVhdGVXaXRob3V0VGFibGUoKSxcbiAgICAgICAgICAgIH0pKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhlblVwZGF0ZVNldCguLi5hcmdzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgbm90IHN1cmUgaG93IHRvIHR5cGUgdGhpcyBzbyBpdCB3b24ndCBjb21wbGFpbiBhYm91dCBzZXQoLi4uYXJncykuXG4gICAgICAgIHJldHVybiB0aGlzLnRoZW5VcGRhdGUoKHViKSA9PiB1Yi5zZXQoLi4uYXJncykpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBOb3RNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN1cHBvcnRlZCBpbiBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGluc2VydGAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5JbnNlcnRWYWx1ZXN9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5Ob3RNYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRG9Ob3RoaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbm90IG1hdGNoZWQgdGhlblxuICAgICAqICAgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5Eb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZG8gbm90aGluZycpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRoZW5JbnNlcnRWYWx1ZXMoaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5zLCB2YWx1ZXNdID0gcGFyc2VJbnNlcnRFeHByZXNzaW9uKGluc2VydCk7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbihJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKEluc2VydFF1ZXJ5Tm9kZS5jcmVhdGVXaXRob3V0SW50bygpLCB7XG4gICAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWNyZWF0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIsIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL3NlbGVjdC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IEluc2VydFF1ZXJ5QnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9pbnNlcnQtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEZWxldGVRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvZGVsZXRlLXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL3VwZGF0ZS1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvZGVsZXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS9pbnNlcnQtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvdXBkYXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSwgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIHBhcnNlQWxpYXNlZFRhYmxlLCB9IGZyb20gJy4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbiwgfSBmcm9tICcuL3BhcnNlci93aXRoLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBXaXRoTm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvd2l0aC1ub2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuL3V0aWwvcXVlcnktaWQuanMnO1xuaW1wb3J0IHsgV2l0aFNjaGVtYVBsdWdpbiB9IGZyb20gJy4vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QXJnLCB9IGZyb20gJy4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvbWVyZ2UtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBNZXJnZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgUXVlcnlDcmVhdG9yIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYHNlbGVjdGAgcXVlcnkgYnVpbGRlciBmb3IgdGhlIGdpdmVuIHRhYmxlIG9yIHRhYmxlcy5cbiAgICAgKlxuICAgICAqIFRoZSB0YWJsZXMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIGFyZSBidWlsdCBhcyB0aGUgcXVlcnkncyBgZnJvbWAgY2xhdXNlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzZWxlY3QgcXVlcnkgZm9yIG9uZSB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0QWxsKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgc2VsZWN0IHF1ZXJ5IGZvciBvbmUgdGFibGUgd2l0aCBhbiBhbGlhczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcGVyc29ucyA9IGF3YWl0IGRiLnNlbGVjdEZyb20oJ3BlcnNvbiBhcyBwJylcbiAgICAgKiAgIC5zZWxlY3QoWydwLmlkJywgJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHBlcnNvbnNbMF0uaWQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuXCJpZFwiLCBcImZpcnN0X25hbWVcIiBmcm9tIFwicGVyc29uXCIgYXMgXCJwXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIHNlbGVjdCBxdWVyeSBmcm9tIGEgc3VicXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHBlcnNvbnMgPSBhd2FpdCBkYi5zZWxlY3RGcm9tKFxuICAgICAqICAgICAoZWIpID0+IGViLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdCgncGVyc29uLmlkIGFzIGlkZW50aWZpZXInKS5hcygncCcpXG4gICAgICogICApXG4gICAgICogICAuc2VsZWN0KCdwLmlkZW50aWZpZXInKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocGVyc29uc1swXS5pZGVudGlmaWVyKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicFwiLlwiaWRlbnRpZmllclwiLFxuICAgICAqIGZyb20gKFxuICAgICAqICAgc2VsZWN0IFwicGVyc29uXCIuXCJpZFwiIGFzIFwiaWRlbnRpZmllclwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqICkgYXMgcFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgc2VsZWN0IHF1ZXJ5IGZyb20gcmF3IHNxbDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBpdGVtcyA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbShzcWw8eyBvbmU6IG51bWJlciB9PmAoc2VsZWN0IDEgYXMgb25lKWAuYXMoJ3EnKSlcbiAgICAgKiAgIC5zZWxlY3QoJ3Eub25lJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGl0ZW1zWzBdLm9uZSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInFcIi5cIm9uZVwiLFxuICAgICAqIGZyb20gKFxuICAgICAqICAgc2VsZWN0IDEgYXMgb25lXG4gICAgICogKSBhcyBxXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaGVuIHlvdSB1c2UgdGhlIGBzcWxgIHRhZyB5b3UgbmVlZCB0byBhbHNvIHByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZVxuICAgICAqIHJhdyBzbmlwcGV0IC8gcXVlcnkgc28gdGhhdCBLeXNlbHkgY2FuIGZpZ3VyZSBvdXQgd2hhdCBjb2x1bW5zIGFyZVxuICAgICAqIGF2YWlsYWJsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhlIGBzZWxlY3RGcm9tYCBtZXRob2QgYWxzbyBhY2NlcHRzIGFuIGFycmF5IGZvciBtdWx0aXBsZSB0YWJsZXMuIEFsbFxuICAgICAqIHRoZSBhYm92ZSBleGFtcGxlcyBjYW4gYWxzbyBiZSB1c2VkIGluIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGl0ZW1zID0gYXdhaXQgZGIuc2VsZWN0RnJvbShbXG4gICAgICogICAgICdwZXJzb24gYXMgcCcsXG4gICAgICogICAgIGRiLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdCgncGV0LnNwZWNpZXMnKS5hcygnYScpLFxuICAgICAqICAgICBzcWw8eyBvbmU6IG51bWJlciB9PmAoc2VsZWN0IDEgYXMgb25lKWAuYXMoJ3EnKVxuICAgICAqICAgXSlcbiAgICAgKiAgIC5zZWxlY3QoWydwLmlkJywgJ2Euc3BlY2llcycsICdxLm9uZSddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicFwiLmlkLCBcImFcIi5cInNwZWNpZXNcIiwgXCJxXCIuXCJvbmVcIlxuICAgICAqIGZyb21cbiAgICAgKiAgIFwicGVyc29uXCIgYXMgXCJwXCIsXG4gICAgICogICAoc2VsZWN0IFwicGV0XCIuXCJzcGVjaWVzXCIgZnJvbSBcInBldFwiKSBhcyBhLFxuICAgICAqICAgKHNlbGVjdCAxIGFzIG9uZSkgYXMgXCJxXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZWxlY3RGcm9tKGZyb20pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jcmVhdGVGcm9tKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KGZyb20pLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZWxlY3ROb0Zyb20oc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyhTZWxlY3RRdWVyeU5vZGUuY3JlYXRlKHRoaXMuI3Byb3BzLndpdGhOb2RlKSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBxdWVyeSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSW5zZXJ0UmVzdWx0fS4ge0BsaW5rIEluc2VydFJlc3VsdH1cbiAgICAgKiBoYXMgdGhlIHtAbGluayBJbnNlcnRSZXN1bHQuaW5zZXJ0SWQgfCBpbnNlcnRJZH0gZmllbGQgdGhhdCBob2xkcyB0aGUgYXV0byBpbmNyZW1lbnRlZCBpZCBvZlxuICAgICAqIHRoZSBpbnNlcnRlZCByb3cgaWYgdGhlIGRiIHJldHVybmVkIG9uZS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIEluc2VydFF1ZXJ5QnVpbGRlci52YWx1ZXMgfCB2YWx1ZXN9IG1ldGhvZCBmb3IgbW9yZSBpbmZvIGFuZCBleGFtcGxlcy4gQWxzbyBzZWVcbiAgICAgKiB0aGUge0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmcgfCByZXR1cm5pbmd9IG1ldGhvZCBmb3IgYSB3YXkgdG8gcmV0dXJuIGNvbHVtbnNcbiAgICAgKiBvbiBzdXBwb3J0ZWQgZGF0YWJhc2VzIGxpa2UgUG9zdGdyZVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbidcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQuaW5zZXJ0SWQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTb21lIGRhdGFiYXNlcyBsaWtlIFBvc3RncmVTUUwgc3VwcG9ydCB0aGUgYHJldHVybmluZ2AgbWV0aG9kOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB7IGlkIH0gPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbidcbiAgICAgKiAgIH0pXG4gICAgICogICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGluc2VydEludG8odGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgXCJyZXBsYWNlIGludG9cIiBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMIG9yIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8gTXlTUUwncyB7QGxpbmsgSW5zZXJ0UXVlcnlCdWlsZGVyLm9uRHVwbGljYXRlS2V5VXBkYXRlfSB0aGF0IGRlbGV0ZXNcbiAgICAgKiBhbmQgaW5zZXJ0cyB2YWx1ZXMgb24gY29sbGlzaW9uIGluc3RlYWQgb2YgdXBkYXRpbmcgZXhpc3Rpbmcgcm93cy5cbiAgICAgKlxuICAgICAqIEFuIGFsaWFzIG9mIFNRTGl0ZSdzIHtAbGluayBJbnNlcnRRdWVyeUJ1aWxkZXIub3JSZXBsYWNlfS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBxdWVyeSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSW5zZXJ0UmVzdWx0fS4ge0BsaW5rIEluc2VydFJlc3VsdH1cbiAgICAgKiBoYXMgdGhlIHtAbGluayBJbnNlcnRSZXN1bHQuaW5zZXJ0SWQgfCBpbnNlcnRJZH0gZmllbGQgdGhhdCBob2xkcyB0aGUgYXV0byBpbmNyZW1lbnRlZCBpZCBvZlxuICAgICAqIHRoZSBpbnNlcnRlZCByb3cgaWYgdGhlIGRiIHJldHVybmVkIG9uZS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIEluc2VydFF1ZXJ5QnVpbGRlci52YWx1ZXMgfCB2YWx1ZXN9IG1ldGhvZCBmb3IgbW9yZSBpbmZvIGFuZCBleGFtcGxlcy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnJlcGxhY2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiByZXBsYWNlIGludG8gYHBlcnNvbmAgKGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWApIHZhbHVlcyAoPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZXBsYWNlSW50byh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VUYWJsZSh0YWJsZSksIHRoaXMuI3Byb3BzLndpdGhOb2RlLCB0cnVlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBEZWxldGVRdWVyeUJ1aWxkZXIud2hlcmV9IG1ldGhvZCBmb3IgZXhhbXBsZXMgb24gaG93IHRvIHNwZWNpZnlcbiAgICAgKiBhIHdoZXJlIGNsYXVzZSBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBxdWVyeSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGVsZXRlUmVzdWx0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImRlbGV0ZVwiLCBcIlNpbmdsZSByb3dcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogRGVsZXRlIGEgc2luZ2xlIHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdwZXJzb24uaWQnLCAnPScsIDEpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQubnVtRGVsZXRlZFJvd3MpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBcInBlcnNvblwiIHdoZXJlIFwicGVyc29uXCIuXCJpZFwiID0gJDFcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNvbWUgZGF0YWJhc2VzIHN1Y2ggYXMgTXlTUUwgc3VwcG9ydCBkZWxldGluZyBmcm9tIG11bHRpcGxlIHRhYmxlczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5kZWxldGVGcm9tKFsncGVyc29uJywgJ3BldCddKVxuICAgICAqICAgLnVzaW5nKCdwZXJzb24nKVxuICAgICAqICAgLmlubmVySm9pbigncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLndoZXJlKCdwZXJzb24uaWQnLCAnPScsIDEpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gYHBlcnNvbmAsIGBwZXRgXG4gICAgICogdXNpbmcgYHBlcnNvbmBcbiAgICAgKiBpbm5lciBqb2luIGBwZXRgIG9uIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gICAgICogd2hlcmUgYHBlcnNvbmAuYGlkYCA9ID9cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkZWxldGVGcm9tKGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY3JlYXRlKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KGZyb20pLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHVwZGF0ZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIFVwZGF0ZVF1ZXJ5QnVpbGRlci53aGVyZX0gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG8gc3BlY2lmeVxuICAgICAqIGEgd2hlcmUgY2xhdXNlIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIFVwZGF0ZVF1ZXJ5QnVpbGRlci5zZXR9IG1ldGhvZCBmb3IgZXhhbXBsZXMgb24gaG93IHRvXG4gICAgICogc3BlY2lmeSB0aGUgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHF1ZXJ5IGlzIGFuIHtAbGluayBVcGRhdGVSZXN1bHR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyB9KVxuICAgICAqICAgLndoZXJlKCdwZXJzb24uaWQnLCAnPScsIDEpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQubnVtVXBkYXRlZFJvd3MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdXBkYXRlVGFibGUodGFibGVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNyZWF0ZShwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCh0YWJsZXMpLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWVyZ2UgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBxdWVyeSBpcyBhIHtAbGluayBNZXJnZVJlc3VsdH0uXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBNZXJnZVF1ZXJ5QnVpbGRlci51c2luZ30gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG8gc3BlY2lmeVxuICAgICAqIHRoZSBvdGhlciB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcIm1lcmdlXCIsIFwiU291cmNlIHJvdyBleGlzdGVuY2VcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogVXBkYXRlIGEgdGFyZ2V0IGNvbHVtbiBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc291cmNlIHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5tZXJnZUludG8oJ3BlcnNvbiBhcyB0YXJnZXQnKVxuICAgICAqICAgLnVzaW5nKCdwZXQgYXMgc291cmNlJywgJ3NvdXJjZS5vd25lcl9pZCcsICd0YXJnZXQuaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkQW5kKCd0YXJnZXQuaGFzX3BldHMnLCAnIT0nLCAnWScpXG4gICAgICogICAudGhlblVwZGF0ZVNldCh7IGhhc19wZXRzOiAnWScgfSlcbiAgICAgKiAgIC53aGVuTm90TWF0Y2hlZEJ5U291cmNlQW5kKCd0YXJnZXQuaGFzX3BldHMnLCAnPScsICdZJylcbiAgICAgKiAgIC50aGVuVXBkYXRlU2V0KHsgaGFzX3BldHM6ICdOJyB9KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5udW1DaGFuZ2VkUm93cylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCJcbiAgICAgKiBvbiBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIGFuZCBcImhhc19wZXRzXCIgIT0gJDFcbiAgICAgKiB0aGVuIHVwZGF0ZSBzZXQgXCJoYXNfcGV0c1wiID0gJDJcbiAgICAgKiB3aGVuIG5vdCBtYXRjaGVkIGJ5IHNvdXJjZSBhbmQgXCJoYXNfcGV0c1wiID0gJDNcbiAgICAgKiB0aGVuIHVwZGF0ZSBzZXQgXCJoYXNfcGV0c1wiID0gJDRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJtZXJnZVwiLCBcIlRlbXBvcmFyeSBjaGFuZ2VzIHRhYmxlXCIsIDIwKSAtLT5cbiAgICAgKlxuICAgICAqIE1lcmdlIG5ldyBlbnRyaWVzIGZyb20gYSB0ZW1wb3JhcnkgY2hhbmdlcyB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5tZXJnZUludG8oJ3dpbmUgYXMgdGFyZ2V0JylcbiAgICAgKiAgIC51c2luZyhcbiAgICAgKiAgICAgJ3dpbmVfc3RvY2tfY2hhbmdlIGFzIHNvdXJjZScsXG4gICAgICogICAgICdzb3VyY2Uud2luZV9uYW1lJyxcbiAgICAgKiAgICAgJ3RhcmdldC5uYW1lJyxcbiAgICAgKiAgIClcbiAgICAgKiAgIC53aGVuTm90TWF0Y2hlZEFuZCgnc291cmNlLnN0b2NrX2RlbHRhJywgJz4nLCAwKVxuICAgICAqICAgLnRoZW5JbnNlcnRWYWx1ZXMoKHsgcmVmIH0pID0+ICh7XG4gICAgICogICAgIG5hbWU6IHJlZignc291cmNlLndpbmVfbmFtZScpLFxuICAgICAqICAgICBzdG9jazogcmVmKCdzb3VyY2Uuc3RvY2tfZGVsdGEnKSxcbiAgICAgKiAgIH0pKVxuICAgICAqICAgLndoZW5NYXRjaGVkQW5kKFxuICAgICAqICAgICAoZWIpID0+IGViKCd0YXJnZXQuc3RvY2snLCAnKycsIGViLnJlZignc291cmNlLnN0b2NrX2RlbHRhJykpLFxuICAgICAqICAgICAnPicsXG4gICAgICogICAgIDAsXG4gICAgICogICApXG4gICAgICogICAudGhlblVwZGF0ZVNldCgnc3RvY2snLCAoZWIpID0+XG4gICAgICogICAgIGViKCd0YXJnZXQuc3RvY2snLCAnKycsIGViLnJlZignc291cmNlLnN0b2NrX2RlbHRhJykpLFxuICAgICAqICAgKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwid2luZVwiIGFzIFwidGFyZ2V0XCJcbiAgICAgKiB1c2luZyBcIndpbmVfc3RvY2tfY2hhbmdlXCIgYXMgXCJzb3VyY2VcIlxuICAgICAqIG9uIFwic291cmNlXCIuXCJ3aW5lX25hbWVcIiA9IFwidGFyZ2V0XCIuXCJuYW1lXCJcbiAgICAgKiB3aGVuIG5vdCBtYXRjaGVkIGFuZCBcInNvdXJjZVwiLlwic3RvY2tfZGVsdGFcIiA+ICQxXG4gICAgICogdGhlbiBpbnNlcnQgKFwibmFtZVwiLCBcInN0b2NrXCIpIHZhbHVlcyAoXCJzb3VyY2VcIi5cIndpbmVfbmFtZVwiLCBcInNvdXJjZVwiLlwic3RvY2tfZGVsdGFcIilcbiAgICAgKiB3aGVuIG1hdGNoZWQgYW5kIFwidGFyZ2V0XCIuXCJzdG9ja1wiICsgXCJzb3VyY2VcIi5cInN0b2NrX2RlbHRhXCIgPiAkMlxuICAgICAqIHRoZW4gdXBkYXRlIHNldCBcInN0b2NrXCIgPSBcInRhcmdldFwiLlwic3RvY2tcIiArIFwic291cmNlXCIuXCJzdG9ja19kZWx0YVwiXG4gICAgICogd2hlbiBtYXRjaGVkXG4gICAgICogdGhlbiBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtZXJnZUludG8odGFyZ2V0VGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNyZWF0ZShwYXJzZUFsaWFzZWRUYWJsZSh0YXJnZXRUYWJsZSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgd2l0aGAgcXVlcnkgKENvbW1vbiBUYWJsZSBFeHByZXNzaW9uKS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImN0ZVwiLCBcIlNpbXBsZSBzZWxlY3RzXCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIENvbW1vbiB0YWJsZSBleHByZXNzaW9ucyAoQ1RFKSBhcmUgYSBncmVhdCB3YXkgdG8gbW9kdWxhcml6ZSBjb21wbGV4IHF1ZXJpZXMuXG4gICAgICogRXNzZW50aWFsbHkgdGhleSBhbGxvdyB5b3UgdG8gcnVuIG11bHRpcGxlIHNlcGFyYXRlIHF1ZXJpZXMgd2l0aGluIGFcbiAgICAgKiBzaW5nbGUgcm91bmR0cmlwIHRvIHRoZSBEQi5cbiAgICAgKlxuICAgICAqIFNpbmNlIENURXMgYXJlIGEgcGFydCBvZiB0aGUgbWFpbiBxdWVyeSwgcXVlcnkgb3B0aW1pemVycyBpbnNpZGUgREJcbiAgICAgKiBlbmdpbmVzIGFyZSBhYmxlIHRvIG9wdGltaXplIHRoZSBvdmVyYWxsIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgcG9zdGdyZXNcbiAgICAgKiBpcyBhYmxlIHRvIGlubGluZSB0aGUgQ1RFcyBpbnNpZGUgdGhlIHVzaW5nIHF1ZXJpZXMgaWYgaXQgZGVjaWRlcyBpdCdzXG4gICAgICogZmFzdGVyLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLy8gQ3JlYXRlIGEgQ1RFIGNhbGxlZCBgamVubmlmZXJzYCB0aGF0IHNlbGVjdHMgYWxsXG4gICAgICogICAvLyBwZXJzb25zIG5hbWVkICdKZW5uaWZlcicuXG4gICAgICogICAud2l0aCgnamVubmlmZXJzJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgICAuc2VsZWN0KFsnaWQnLCAnYWdlJ10pXG4gICAgICogICApXG4gICAgICogICAvLyBTZWxlY3QgYWxsIHJvd3MgZnJvbSB0aGUgYGplbm5pZmVyc2AgQ1RFIGFuZFxuICAgICAqICAgLy8gZnVydGhlciBmaWx0ZXIgaXQuXG4gICAgICogICAud2l0aCgnYWR1bHRfamVubmlmZXJzJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgnamVubmlmZXJzJylcbiAgICAgKiAgICAgLndoZXJlKCdhZ2UnLCAnPicsIDE4KVxuICAgICAqICAgICAuc2VsZWN0KFsnaWQnLCAnYWdlJ10pXG4gICAgICogICApXG4gICAgICogICAvLyBGaW5hbGx5IHNlbGVjdCBhbGwgYWR1bHQgamVubmlmZXJzIHRoYXQgYXJlXG4gICAgICogICAvLyBhbHNvIHlvdW5nZXIgdGhhbiA2MC5cbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdhZHVsdF9qZW5uaWZlcnMnKVxuICAgICAqICAgLndoZXJlKCdhZ2UnLCAnPCcsIDYwKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiY3RlXCIsIFwiSW5zZXJ0cywgdXBkYXRlcyBhbmQgZGVsZXRpb25zXCIsIDIwKSAtLT5cbiAgICAgKlxuICAgICAqIFNvbWUgZGF0YWJhc2VzIGxpa2UgcG9zdGdyZXMgYWxzbyBhbGxvdyB5b3UgdG8gcnVuIG90aGVyIHF1ZXJpZXMgdGhhbiBzZWxlY3RzXG4gICAgICogaW4gQ1RFcy4gT24gdGhlc2UgZGF0YWJhc2VzIENURXMgYXJlIGV4dHJlbWVseSBwb3dlcmZ1bDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoKCduZXdfcGVyc29uJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgICBhZ2U6IDM1LFxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICApXG4gICAgICogICAud2l0aCgnbmV3X3BldCcsIChkYikgPT4gZGJcbiAgICAgKiAgICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIG5hbWU6ICdEb2dnbycsXG4gICAgICogICAgICAgc3BlY2llczogJ2RvZycsXG4gICAgICogICAgICAgaXNfZmF2b3JpdGU6IHRydWUsXG4gICAgICogICAgICAgLy8gVXNlIHRoZSBpZCBvZiB0aGUgcGVyc29uIHdlIGp1c3QgaW5zZXJ0ZWQuXG4gICAgICogICAgICAgb3duZXJfaWQ6IGRiXG4gICAgICogICAgICAgICAuc2VsZWN0RnJvbSgnbmV3X3BlcnNvbicpXG4gICAgICogICAgICAgICAuc2VsZWN0KCdpZCcpXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3RGcm9tKFsnbmV3X3BlcnNvbicsICduZXdfcGV0J10pXG4gICAgICogICAuc2VsZWN0KFtcbiAgICAgKiAgICAgJ25ld19wZXJzb24uaWQgYXMgcGVyc29uX2lkJyxcbiAgICAgKiAgICAgJ25ld19wZXQuaWQgYXMgcGV0X2lkJ1xuICAgICAqICAgXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBDVEUgbmFtZSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGNvbHVtbiBuYW1lcyBpbiBhZGRpdGlvbiB0b1xuICAgICAqIGEgbmFtZS4gSW4gdGhhdCBjYXNlIEt5c2VseSByZXF1aXJlcyB0aGUgZXhwcmVzc2lvbiB0byByZXR1blxuICAgICAqIHJvd3Mgd2l0aCB0aGUgc2FtZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGgoJ2plbm5pZmVycyhpZCwgYWdlKScsIChkYikgPT4gZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0plbm5pZmVyJylcbiAgICAgKiAgICAgLy8gVGhpcyBpcyBvayBzaW5jZSB3ZSByZXR1cm4gY29sdW1ucyB3aXRoIHRoZSBzYW1lXG4gICAgICogICAgIC8vIG5hbWVzIGFzIHNwZWNpZmllZCBieSBgamVubmlmZXJzKGlkLCBhZ2UpYC5cbiAgICAgKiAgICAgLnNlbGVjdChbJ2lkJywgJ2FnZSddKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ2plbm5pZmVycycpXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBmaXJzdCBhcmd1bWVudCBjYW4gYWxzbyBiZSBhIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICogYSBgQ1RFQnVpbGRlcmAgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIENURTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoKFxuICAgICAqICAgICAoY3RlKSA9PiBjdGUoJ2plbm5pZmVycycpLm1hdGVyaWFsaXplZCgpLFxuICAgICAqICAgICAoZGIpID0+IGRiXG4gICAgICogICAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgICAgIC5zZWxlY3QoWydpZCcsICdhZ2UnXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdqZW5uaWZlcnMnKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgd2l0aChuYW1lT3JCdWlsZGVyLCBleHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGN0ZSA9IHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uKG5hbWVPckJ1aWxkZXIsIGV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHdpdGhOb2RlOiB0aGlzLiNwcm9wcy53aXRoTm9kZVxuICAgICAgICAgICAgICAgID8gV2l0aE5vZGUuY2xvbmVXaXRoRXhwcmVzc2lvbih0aGlzLiNwcm9wcy53aXRoTm9kZSwgY3RlKVxuICAgICAgICAgICAgICAgIDogV2l0aE5vZGUuY3JlYXRlKGN0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVjdXJzaXZlIGB3aXRoYCBxdWVyeSAoQ29tbW9uIFRhYmxlIEV4cHJlc3Npb24pLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHJlY3Vyc2l2ZW5lc3MgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgd2hvbGUgYHdpdGhgIHN0YXRlbWVudC5cbiAgICAgKiBZb3UgY2Fubm90IGhhdmUgcmVjdXJzaXZlIGFuZCBub24tcmVjdXJzaXZlIENURXMgaW4gYSBzYW1lIGB3aXRoYCBzdGF0ZW1lbnQuXG4gICAgICogVGhlcmVmb3JlIHRoZSByZWN1cnNpdmVuZXNzIGlzIGRldGVybWluZWQgYnkgdGhlICoqZmlyc3QqKiBgd2l0aGAgb3JcbiAgICAgKiBgd2l0aFJlY3VzaXZlYCBjYWxsIHlvdSBtYWtlLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgd2l0aH0gbWV0aG9kIGZvciBleGFtcGxlcyBhbmQgbW9yZSBkb2N1bWVudGF0aW9uLlxuICAgICAqL1xuICAgIHdpdGhSZWN1cnNpdmUobmFtZU9yQnVpbGRlciwgZXhwcmVzc2lvbikge1xuICAgICAgICBjb25zdCBjdGUgPSBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbihuYW1lT3JCdWlsZGVyLCBleHByZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICB3aXRoTm9kZTogdGhpcy4jcHJvcHMud2l0aE5vZGVcbiAgICAgICAgICAgICAgICA/IFdpdGhOb2RlLmNsb25lV2l0aEV4cHJlc3Npb24odGhpcy4jcHJvcHMud2l0aE5vZGUsIGN0ZSlcbiAgICAgICAgICAgICAgICA6IFdpdGhOb2RlLmNyZWF0ZShjdGUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBxdWVyeSBjcmVhdG9yIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBxdWVyeSBjcmVhdG9yIGluc3RhbmNlIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzY2hlbWEgdG8gYmUgdXNlZCBmb3IgYWxsIHRhYmxlIHJlZmVyZW5jZXMgdGhhdCBkb24ndCBleHBsaWNpdGx5XG4gICAgICogc3BlY2lmeSBhIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSBhZmZlY3RzIHRoZSBxdWVyeSBjcmVhdGVkIHRocm91Z2ggdGhlIGJ1aWxkZXIgcmV0dXJuZWQgZnJvbVxuICAgICAqIHRoaXMgbWV0aG9kIGFuZCBkb2Vzbid0IG1vZGlmeSB0aGUgYGRiYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIFNlZSBbdGhpcyByZWNpcGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9reXNlbHktb3JnL2t5c2VseS9ibG9iL21hc3Rlci9zaXRlL2RvY3MvcmVjaXBlcy8wMDA3LXNjaGVtYXMubWQpXG4gICAgICogZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoU2NoZW1hKCdtYW1tYWxzJylcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXQnKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuaW5uZXJKb2luKCdwdWJsaWMucGVyc29uJywgJ3B1YmxpYy5wZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCAqIGZyb20gXCJtYW1tYWxzXCIuXCJwZXRcIlxuICAgICAqIGlubmVyIGpvaW4gXCJwdWJsaWNcIi5cInBlcnNvblwiXG4gICAgICogb24gXCJwdWJsaWNcIi5cInBlcnNvblwiLlwiaWRcIiA9IFwibWFtbWFsc1wiLlwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgd2l0aFNjaGVtYWAgaXMgc21hcnQgZW5vdWdoIHRvIG5vdCBhZGQgc2NoZW1hIGZvciBhbGlhc2VzLFxuICAgICAqIGNvbW1vbiB0YWJsZSBleHByZXNzaW9ucyBvciBvdGhlciBwbGFjZXMgd2hlcmUgdGhlIHNjaGVtYVxuICAgICAqIGRvZXNuJ3QgYmVsb25nIHRvOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoU2NoZW1hKCdtYW1tYWxzJylcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXQgYXMgcCcpXG4gICAgICogICAuc2VsZWN0KCdwLm5hbWUnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicFwiLlwibmFtZVwiIGZyb20gXCJtYW1tYWxzXCIuXCJwZXRcIiBhcyBcInBcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcnNlLXV0aWxzLmQudHNcIiAvPlxuaW1wb3J0IHsgSm9pbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qb2luLW5vZGUuanMnO1xuaW1wb3J0IHsgT3Zlck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vdmVyLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgSm9pbkJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2pvaW4tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBPdmVyQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvb3Zlci1idWlsZGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciBhcyBuZXdTZWxlY3RRdWVyeUJ1aWxkZXIsIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9zZWxlY3QtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBRdWVyeUNyZWF0b3IgfSBmcm9tICcuLi9xdWVyeS1jcmVhdG9yLmpzJztcbmltcG9ydCB7IE5PT1BfUVVFUllfRVhFQ1VUT1IgfSBmcm9tICcuLi9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGVFeHByZXNzaW9uLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3RhYmxlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKCkge1xuICAgIHJldHVybiBuZXdTZWxlY3RRdWVyeUJ1aWxkZXIoe1xuICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgIGV4ZWN1dG9yOiBOT09QX1FVRVJZX0VYRUNVVE9SLFxuICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jcmVhdGVGcm9tKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KFtdKSksXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUXVlcnlDcmVhdG9yKCkge1xuICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgZXhlY3V0b3I6IE5PT1BfUVVFUllfRVhFQ1VUT1IsXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSm9pbkJ1aWxkZXIoam9pblR5cGUsIHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jcmVhdGUoam9pblR5cGUsIHBhcnNlVGFibGVFeHByZXNzaW9uKHRhYmxlKSksXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3ZlckJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBPdmVyQnVpbGRlcih7XG4gICAgICAgIG92ZXJOb2RlOiBPdmVyTm9kZS5jcmVhdGUoKSxcbiAgICB9KTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vam9pbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIH0gZnJvbSAnLi9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVKb2luQnVpbGRlciB9IGZyb20gJy4vcGFyc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb24sIH0gZnJvbSAnLi90YWJsZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gcGFyc2VTaW5nbGVPbkpvaW4oam9pblR5cGUsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gcGFyc2VDYWxsYmFja0pvaW4oam9pblR5cGUsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcGFyc2VPbmxlc3NKb2luKGpvaW5UeXBlLCBhcmdzWzBdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VDYWxsYmFja0pvaW4oam9pblR5cGUsIGZyb20sIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUpvaW5CdWlsZGVyKGpvaW5UeXBlLCBmcm9tKSkudG9PcGVyYXRpb25Ob2RlKCk7XG59XG5mdW5jdGlvbiBwYXJzZVNpbmdsZU9uSm9pbihqb2luVHlwZSwgZnJvbSwgbGhzQ29sdW1uLCByaHNDb2x1bW4pIHtcbiAgICByZXR1cm4gSm9pbk5vZGUuY3JlYXRlV2l0aE9uKGpvaW5UeXBlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbihmcm9tKSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHNDb2x1bW4sICc9JywgcmhzQ29sdW1uKSk7XG59XG5mdW5jdGlvbiBwYXJzZU9ubGVzc0pvaW4oam9pblR5cGUsIGZyb20pIHtcbiAgICByZXR1cm4gSm9pbk5vZGUuY3JlYXRlKGpvaW5UeXBlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbihmcm9tKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29mZnNldC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9mZnNldE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09mZnNldE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPZmZzZXROb2RlJyxcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ncm91cC1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgR3JvdXBCeUl0ZW1Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdHcm91cEJ5SXRlbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGdyb3VwQnkpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIGdyb3VwQnksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZ3JvdXAtYnktcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgR3JvdXBCeUl0ZW1Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZ3JvdXAtYnktaXRlbS1ub2RlLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdyb3VwQnkoZ3JvdXBCeSkge1xuICAgIGdyb3VwQnkgPSBpc0Z1bmN0aW9uKGdyb3VwQnkpID8gZ3JvdXBCeShleHByZXNzaW9uQnVpbGRlcigpKSA6IGdyb3VwQnk7XG4gICAgcmV0dXJuIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChncm91cEJ5KS5tYXAoR3JvdXBCeUl0ZW1Ob2RlLmNyZWF0ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NldC1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZXRPcGVyYXRpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZXRPcGVyYXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShvcGVyYXRvciwgZXhwcmVzc2lvbiwgYWxsKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NldE9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgYWxsLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NldC1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU2V0T3BlcmF0aW9uTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZXQtb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNSZWFkb25seUFycmF5IH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZXRPcGVyYXRpb25zKG9wZXJhdG9yLCBleHByZXNzaW9uLCBhbGwpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihleHByZXNzaW9uKSkge1xuICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbihjcmVhdGVFeHByZXNzaW9uQnVpbGRlcigpKTtcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5QXJyYXkoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwcmVzc2lvbiA9IFtleHByZXNzaW9uXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHJlc3Npb24ubWFwKChleHByKSA9PiBTZXRPcGVyYXRpb25Ob2RlLmNyZWF0ZShvcGVyYXRvciwgcGFyc2VFeHByZXNzaW9uKGV4cHIpLCBhbGwpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZXhwcmVzc2lvbi13cmFwcGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29yLW5vZGUuanMnO1xuaW1wb3J0IHsgUGFyZW5zTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uV3JhcHBlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcldyYXBwZXIoT3JOb2RlLmNyZWF0ZSh0aGlzLiNub2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSk7XG4gICAgfVxuICAgIGFuZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5kV3JhcHBlcihBbmROb2RlLmNyZWF0ZSh0aGlzLiNub2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYEV4cHJlc3Npb25XcmFwcGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9taXQgbnVsbCBmcm9tIHRoZSBleHByZXNzaW9uJ3MgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB5b3Uga25vdyBhbiBleHByZXNzaW9uIGNhbid0IGJlXG4gICAgICogbnVsbCwgYnV0IEt5c2VseSBpcyB1bmFibGUgdG8gaW5mZXIgaXQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIGB0aGlzYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHRoaXMuI25vZGUpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIge1xuICAgICNleHByO1xuICAgICNhbGlhcztcbiAgICBjb25zdHJ1Y3RvcihleHByLCBhbGlhcykge1xuICAgICAgICB0aGlzLiNleHByID0gZXhwcjtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleHByO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbGlhcztcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZSh0aGlzLiNleHByLnRvT3BlcmF0aW9uTm9kZSgpLCBpc09wZXJhdGlvbk5vZGVTb3VyY2UodGhpcy4jYWxpYXMpXG4gICAgICAgICAgICA/IHRoaXMuI2FsaWFzLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgICAgICA6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPcldyYXBwZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICBvciguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JXcmFwcGVyKE9yTm9kZS5jcmVhdGUodGhpcy4jbm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBPcldyYXBwZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcldyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIFBhcmVuc05vZGUuY3JlYXRlKHRoaXMuI25vZGUpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbmRXcmFwcGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEV4cHJlc3Npb25XcmFwcGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgYW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmRXcmFwcGVyKEFuZE5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgQW5kV3JhcHBlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFuZFdyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIFBhcmVuc05vZGUuY3JlYXRlKHRoaXMuI25vZGUpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZmV0Y2gtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4vdmFsdWUtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRmV0Y2hOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGZXRjaE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHJvd0NvdW50LCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ0ZldGNoTm9kZScsXG4gICAgICAgICAgICByb3dDb3VudDogVmFsdWVOb2RlLmNyZWF0ZShyb3dDb3VudCksXG4gICAgICAgICAgICBtb2RpZmllcixcbiAgICAgICAgfTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZldGNoLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEZldGNoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZldGNoLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNCaWdJbnQsIGlzTnVtYmVyIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmV0Y2gocm93Q291bnQsIG1vZGlmaWVyKSB7XG4gICAgaWYgKCFpc051bWJlcihyb3dDb3VudCkgJiYgIWlzQmlnSW50KHJvd0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmV0Y2ggcm93IGNvdW50OiAke3Jvd0NvdW50fWApO1xuICAgIH1cbiAgICBpZiAoIWlzRmV0Y2hNb2RpZmllcihtb2RpZmllcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZldGNoIG1vZGlmaWVyOiAke21vZGlmaWVyfWApO1xuICAgIH1cbiAgICByZXR1cm4gRmV0Y2hOb2RlLmNyZWF0ZShyb3dDb3VudCwgbW9kaWZpZXIpO1xufVxuZnVuY3Rpb24gaXNGZXRjaE1vZGlmaWVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnb25seScgfHwgdmFsdWUgPT09ICd3aXRoIHRpZXMnO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0TW9kaWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LW1vZGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTGltaXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbGltaXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPZmZzZXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb2Zmc2V0LW5vZGUuanMnO1xuaW1wb3J0IHsgYXNBcnJheSwgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VHcm91cEJ5IH0gZnJvbSAnLi4vcGFyc2VyL2dyb3VwLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNldE9wZXJhdGlvbnMsIH0gZnJvbSAnLi4vcGFyc2VyL3NldC1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUZldGNoIH0gZnJvbSAnLi4vcGFyc2VyL2ZldGNoLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmNsYXNzIFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGlzU2VsZWN0UXVlcnlCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhdmluZyguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEhhdmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGF2aW5nUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhIYXZpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VsZWN0KHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXN0aW5jdE9uKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhEaXN0aW5jdE9uKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbW9kaWZ5RnJvbnQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGVXaXRoRXhwcmVzc2lvbihtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZVdpdGhFeHByZXNzaW9uKG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0Rpc3RpbmN0JykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yVXBkYXRlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yVXBkYXRlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvclNoYXJlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yU2hhcmUnLCBvZiA/IGFzQXJyYXkob2YpLm1hcChwYXJzZVRhYmxlKSA6IHVuZGVmaW5lZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yS2V5U2hhcmUob2YpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdGb3JLZXlTaGFyZScsIG9mID8gYXNBcnJheShvZikubWFwKHBhcnNlVGFibGUpIDogdW5kZWZpbmVkKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3JOb0tleVVwZGF0ZShvZikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0Zvck5vS2V5VXBkYXRlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNraXBMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnU2tpcExvY2tlZCcpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vV2FpdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdOb1dhaXQnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZWxlY3RBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbm5lckpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xlZnRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIHJpZ2h0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdSaWdodEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgZnVsbEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignRnVsbEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Nyb3NzSm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBpbm5lckpvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxJbm5lckpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgbGVmdEpvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBjcm9zc0pvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxDcm9zc0pvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NBcHBseSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdDcm9zc0FwcGx5JywgYXJncyk7XG4gICAgfVxuICAgIG91dGVyQXBwbHkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignT3V0ZXJBcHBseScsIGFyZ3MpO1xuICAgIH1cbiAgICAjam9pbihqb2luVHlwZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhKb2luKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdyb3VwQnkoZ3JvdXBCeSkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhHcm91cEJ5SXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUdyb3VwQnkoZ3JvdXBCeSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGltaXQobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoTGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBMaW1pdE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKGxpbWl0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb2Zmc2V0KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPZmZzZXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBPZmZzZXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihvZmZzZXQpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmZXRjaChyb3dDb3VudCwgbW9kaWZpZXIgPSAnb25seScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRmV0Y2godGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUZldGNoKHJvd0NvdW50LCBtb2RpZmllcikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygndW5pb24nLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW5pb25BbGwoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCd1bmlvbicsIGV4cHJlc3Npb24sIHRydWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludGVyc2VjdChleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNldE9wZXJhdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNldE9wZXJhdGlvbnMoJ2ludGVyc2VjdCcsIGV4cHJlc3Npb24sIGZhbHNlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcnNlY3RBbGwoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdpbnRlcnNlY3QnLCBleHByZXNzaW9uLCB0cnVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleGNlcHQoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdleGNlcHQnLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXhjZXB0QWxsKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygnZXhjZXB0JywgZXhwcmVzc2lvbiwgdHJ1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIGNsZWFyU2VsZWN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRTZWxlY3Rpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0TGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPZmZzZXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJHcm91cEJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRHcm91cEJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgJGFzVHVwbGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgICRhc1NjYWxhcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHByb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHByb3BzKTtcbn1cbi8qKlxuICoge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlcn0gd2l0aCBhbiBhbGlhcy4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXIuYXN9LlxuICovXG5jbGFzcyBBbGlhc2VkU2VsZWN0UXVlcnlCdWlsZGVySW1wbCB7XG4gICAgI3F1ZXJ5QnVpbGRlcjtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IocXVlcnlCdWlsZGVyLCBhbGlhcykge1xuICAgICAgICB0aGlzLiNxdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXI7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcXVlcnlCdWlsZGVyO1xuICAgIH1cbiAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbGlhcztcbiAgICB9XG4gICAgZ2V0IGlzQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4jcXVlcnlCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlcmVOb2RlIH0gZnJvbSAnLi93aGVyZS1ub2RlLmpzJztcbmltcG9ydCB7IE9yZGVyQnlOb2RlIH0gZnJvbSAnLi9vcmRlci1ieS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoYWdncmVnYXRlRnVuY3Rpb24sIGFnZ3JlZ2F0ZWQgPSBbXSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZ2dyZWdhdGVGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYzogYWdncmVnYXRlRnVuY3Rpb24sXG4gICAgICAgICAgICBhZ2dyZWdhdGVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aERpc3RpbmN0KGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIGRpc3RpbmN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9yZGVyQnkoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBvcmRlckl0ZW1zLCB3aXRoaW5Hcm91cCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSB3aXRoaW5Hcm91cCA/ICd3aXRoaW5Hcm91cCcgOiAnb3JkZXJCeSc7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uYWdncmVnYXRlRnVuY3Rpb25Ob2RlLFxuICAgICAgICAgICAgW3Byb3BdOiBhZ2dyZWdhdGVGdW5jdGlvbk5vZGVbcHJvcF1cbiAgICAgICAgICAgICAgICA/IE9yZGVyQnlOb2RlLmNsb25lV2l0aEl0ZW1zKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZVtwcm9wXSwgb3JkZXJJdGVtcylcbiAgICAgICAgICAgICAgICA6IE9yZGVyQnlOb2RlLmNyZWF0ZShvcmRlckl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGaWx0ZXIoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBmaWx0ZXI6IGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5maWx0ZXJcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24oYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlciwgJ0FuZCcsIGZpbHRlcilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUoZmlsdGVyKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPckZpbHRlcihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIGZpbHRlcjogYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlclxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUuZmlsdGVyLCAnT3InLCBmaWx0ZXIpXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKGZpbHRlciksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3ZlcihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIG92ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBvdmVyLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Z1bmN0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRnVuY3Rpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGdW5jdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZ1bmMsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWdncmVnYXRlLWZ1bmN0aW9uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZU92ZXJCdWlsZGVyIH0gZnJvbSAnLi4vcGFyc2VyL3BhcnNlLXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFsaWFzZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBzbGFwcGluZyBgYXMgXCJ0aGVfYWxpYXNcImAgdG8gdGhlIGVuZCBvZiB0aGUgU1FMLFxuICAgICAqIHRoaXMgbWV0aG9kIGFsc28gcHJvdmlkZXMgc3RyaWN0IHR5cGluZzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChcbiAgICAgKiAgICAgKGViKSA9PiBlYi5mbi5jb3VudDxudW1iZXI+KCdpZCcpLmFzKCdwZXJzb25fY291bnQnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIC8vIGBwZXJzb25fY291bnQ6IG51bWJlcmAgZmllbGQgZXhpc3RzIGluIHRoZSByZXN1bHQgdHlwZS5cbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQucGVyc29uX2NvdW50KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGNvdW50KFwiaWRcIikgYXMgXCJwZXJzb25fY291bnRcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgZGlzdGluY3RgIGNsYXVzZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoKGViKSA9PlxuICAgICAqICAgICBlYi5mbi5jb3VudDxudW1iZXI+KCdmaXJzdF9uYW1lJykuZGlzdGluY3QoKS5hcygnZmlyc3RfbmFtZV9jb3VudCcpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGNvdW50KGRpc3RpbmN0IFwiZmlyc3RfbmFtZVwiKSBhcyBcImZpcnN0X25hbWVfY291bnRcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNsb25lV2l0aERpc3RpbmN0KHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhpbkdyb3VwT3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoT3JkZXJCeSh0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSwgdHJ1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaWx0ZXJXaGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoRmlsdGVyKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYGZpbHRlcmAgY2xhdXNlIHdpdGggYSBuZXN0ZWQgYHdoZXJlYCBjbGF1c2UgYWZ0ZXIgdGhlIGZ1bmN0aW9uLCB3aGVyZVxuICAgICAqIGJvdGggc2lkZXMgb2YgdGhlIG9wZXJhdG9yIGFyZSByZWZlcmVuY2VzIHRvIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHtAbGluayBXaGVyZUludGVyZmFjZX0ncyBgd2hlcmVSZWZgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogQ291bnQgcGVvcGxlIHdpdGggc2FtZSBmaXJzdCBhbmQgbGFzdCBuYW1lcyB2ZXJzdXMgZ2VuZXJhbCBwdWJsaWM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICogICAgIGViLmZuXG4gICAgICogICAgICAgLmNvdW50PG51bWJlcj4oJ2lkJylcbiAgICAgKiAgICAgICAuZmlsdGVyV2hlcmVSZWYoJ2ZpcnN0X25hbWUnLCAnPScsICdsYXN0X25hbWUnKVxuICAgICAqICAgICAgIC5hcygncmVwZWF0X25hbWVfY291bnQnKSxcbiAgICAgKiAgICAgZWIuZm4uY291bnQ8bnVtYmVyPignaWQnKS5hcygndG90YWxfY291bnQnKSxcbiAgICAgKiAgIF0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0XG4gICAgICogICBjb3VudChcImlkXCIpIGZpbHRlcih3aGVyZSBcImZpcnN0X25hbWVcIiA9IFwibGFzdF9uYW1lXCIpIGFzIFwicmVwZWF0X25hbWVfY291bnRcIixcbiAgICAgKiAgIGNvdW50KFwiaWRcIikgYXMgXCJ0b3RhbF9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZmlsdGVyV2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoRmlsdGVyKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYG92ZXJgIGNsYXVzZSAod2luZG93IGZ1bmN0aW9ucykgYWZ0ZXIgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoXG4gICAgICogICAgIChlYikgPT4gZWIuZm4uYXZnPG51bWJlcj4oJ2FnZScpLm92ZXIoKS5hcygnYXZlcmFnZV9hZ2UnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGF2ZyhcImFnZVwiKSBvdmVyKCkgYXMgXCJhdmVyYWdlX2FnZVwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbHNvIHN1cHBvcnRzIHBhc3NpbmcgYSBjYWxsYmFjayB0aGF0IHJldHVybnMgYW4gb3ZlciBidWlsZGVyLFxuICAgICAqIGFsbG93aW5nIHRvIGFkZCBwYXJ0aXRpb24gYnkgYW5kIHNvcnQgYnkgY2xhdXNlcyBpbnNpZGUgb3Zlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChcbiAgICAgKiAgICAgKGViKSA9PiBlYi5mbi5hdmc8bnVtYmVyPignYWdlJykub3ZlcihcbiAgICAgKiAgICAgICBvYiA9PiBvYi5wYXJ0aXRpb25CeSgnbGFzdF9uYW1lJykub3JkZXJCeSgnZmlyc3RfbmFtZScsICdhc2MnKVxuICAgICAqICAgICApLmFzKCdhdmVyYWdlX2FnZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgYXZnKFwiYWdlXCIpIG92ZXIocGFydGl0aW9uIGJ5IFwibGFzdF9uYW1lXCIgb3JkZXIgYnkgXCJmaXJzdF9uYW1lXCIgYXNjKSBhcyBcImF2ZXJhZ2VfYWdlXCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvdmVyKG92ZXIpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZU92ZXJCdWlsZGVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoT3Zlcih0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIChvdmVyID8gb3ZlcihidWlsZGVyKSA6IGJ1aWxkZXIpLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FzdHMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9taXQgbnVsbCBmcm9tIHRoZSBleHByZXNzaW9uJ3MgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB5b3Uga25vdyBhbiBleHByZXNzaW9uIGNhbid0IGJlXG4gICAgICogbnVsbCwgYnV0IEt5c2VseSBpcyB1bmFibGUgdG8gaW5mZXIgaXQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIGB0aGlzYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTtcbiAgICB9XG59XG4vKipcbiAqIHtAbGluayBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXJ9IHdpdGggYW4gYWxpYXMuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB7QGxpbmsgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyLmFzfS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFsaWFzZWRBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIge1xuICAgICNhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKGFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyID0gYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcjtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4jYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Z1bmN0aW9uLW1vZHVsZS5kLnRzXCIgLz5cbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgQWdncmVnYXRlRnVuY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWdncmVnYXRlLWZ1bmN0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZnVuY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBbGwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uTW9kdWxlKCkge1xuICAgIGNvbnN0IGZuID0gKG5hbWUsIGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihGdW5jdGlvbk5vZGUuY3JlYXRlKG5hbWUsIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChhcmdzID8/IFtdKSkpO1xuICAgIH07XG4gICAgY29uc3QgYWdnID0gKG5hbWUsIGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY3JlYXRlKG5hbWUsIGFyZ3MgPyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QoYXJncykgOiB1bmRlZmluZWQpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGZuLCB7XG4gICAgICAgIGFnZyxcbiAgICAgICAgYXZnKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnYXZnJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBjb2FsZXNjZSguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmbignY29hbGVzY2UnLCB2YWx1ZXMpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ2NvdW50JywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudEFsbCh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNyZWF0ZSgnY291bnQnLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1heChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ21heCcsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWluKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnbWluJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBzdW0oY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gYWdnKCdzdW0nLCBbY29sdW1uXSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFueShjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmbignYW55JywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBqc29uQWdnKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY3JlYXRlKCdqc29uX2FnZycsIFtcbiAgICAgICAgICAgICAgICAgICAgaXNTdHJpbmcodGFibGUpID8gcGFyc2VUYWJsZSh0YWJsZSkgOiB0YWJsZS50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB0b0pzb24odGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoRnVuY3Rpb25Ob2RlLmNyZWF0ZSgndG9fanNvbicsIFtcbiAgICAgICAgICAgICAgICBpc1N0cmluZyh0YWJsZSkgPyBwYXJzZVRhYmxlKHRhYmxlKSA6IHRhYmxlLnRvT3BlcmF0aW9uTm9kZSgpLFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmFyeS1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVbmFyeU9wZXJhdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VuYXJ5T3BlcmF0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3BlcmF0b3IsIG9wZXJhbmQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgb3BlcmFuZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgT3BlcmF0b3JOb2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgVW5hcnlPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5hcnktb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeGlzdHMob3BlcmFuZCkge1xuICAgIHJldHVybiBwYXJzZVVuYXJ5T3BlcmF0aW9uKCdleGlzdHMnLCBvcGVyYW5kKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vdEV4aXN0cyhvcGVyYW5kKSB7XG4gICAgcmV0dXJuIHBhcnNlVW5hcnlPcGVyYXRpb24oJ25vdCBleGlzdHMnLCBvcGVyYW5kKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuYXJ5T3BlcmF0aW9uKG9wZXJhdG9yLCBvcGVyYW5kKSB7XG4gICAgcmV0dXJuIFVuYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcGVyYXRvciksIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihvcGVyYW5kKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc2Utbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi93aGVuLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDYXNlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ2FzZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoV2hlbihjYXNlTm9kZSwgd2hlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgd2hlbjogZnJlZXplKGNhc2VOb2RlLndoZW4gPyBbLi4uY2FzZU5vZGUud2hlbiwgd2hlbl0gOiBbd2hlbl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRoZW4oY2FzZU5vZGUsIHRoZW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jYXNlTm9kZSxcbiAgICAgICAgICAgIHdoZW46IGNhc2VOb2RlLndoZW5cbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbXG4gICAgICAgICAgICAgICAgICAgIC4uLmNhc2VOb2RlLndoZW4uc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgICAgICAgICBXaGVuTm9kZS5jbG9uZVdpdGhSZXN1bHQoY2FzZU5vZGUud2hlbltjYXNlTm9kZS53aGVuLmxlbmd0aCAtIDFdLCB0aGVuKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjYXNlTm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jYXNlTm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc2UtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ2FzZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jYXNlLW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS93aGVuLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNTYWZlSW1tZWRpYXRlVmFsdWUsIHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlLCBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBDYXNlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZVRoZW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5ub2RlLCBXaGVuTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ2FzZVRoZW5CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB0aGVuKHZhbHVlRXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VXaGVuQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMubm9kZSwgaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgID8gcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWVFeHByZXNzaW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlV2hlbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHdoZW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VUaGVuQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aFdoZW4odGhpcy4jcHJvcHMubm9kZSwgV2hlbk5vZGUuY3JlYXRlKHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UodmFsdWVFeHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZUVuZEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGVsc2U6IGlzU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlRXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWVFeHByZXNzaW9uKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlzU3RhdGVtZW50OiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGVuZENhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlRW5kQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgZW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlzU3RhdGVtZW50OiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGVuZENhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1wYXRoLWxlZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05QYXRoTGVnTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTlBhdGhMZWdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0eXBlLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUGF0aExlZ05vZGUnLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tcGF0aC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OT3BlcmF0b3JDaGFpbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLW9wZXJhdG9yLWNoYWluLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlBhdGhMZWdOb2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1sZWctbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUmVmZXJlbmNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIEpTT05QYXRoQnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWNjZXNzIGFuIGVsZW1lbnQgb2YgYSBKU09OIGFycmF5IGluIGEgc3BlY2lmaWMgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBTaW5jZSB0aGVyZSdzIG5vIGd1YXJhbnRlZSBhbiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgZ2l2ZW4gYXJyYXkgbG9jYXRpb24sIHRoZVxuICAgICAqIHJlc3VsdGluZyB0eXBlIGlzIGFsd2F5cyBudWxsYWJsZS4gSWYgeW91J3JlIHN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzLCB5b3VcbiAgICAgKiBzaG91bGQgdXNlIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXIuJGFzc2VydFR5cGV9IHRvIG5hcnJvdyB0aGUgdHlwZSBzYWZlbHkuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbyB7QGxpbmsga2V5fSB0byBhY2Nlc3MgcHJvcGVydGllcyBvZiBKU09OIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoZWIgPT5cbiAgICAgKiAgICAgZWIucmVmKCduaWNrbmFtZXMnLCAnLT4nKS5hdCgwKS5hcygncHJpbWFyeV9uaWNrbmFtZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJuaWNrbmFtZXNcIi0+MCBhcyBcInByaW1hcnlfbmlja25hbWVcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKmBgYFxuICAgICAqXG4gICAgICogQ29tYmluZWQgd2l0aCB7QGxpbmsga2V5fTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ2V4cGVyaWVuY2UnLCAnLT4nKS5hdCgwKS5rZXkoJ3JvbGUnKS5hcygnZmlyc3Rfcm9sZScpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwiZXhwZXJpZW5jZVwiLT4wLT4ncm9sZScgYXMgXCJmaXJzdF9yb2xlXCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHVzZSBgJ2xhc3QnYCB0byBhY2Nlc3MgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgaW4gTXlTUUw6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChlYiA9PlxuICAgICAqICAgZWIucmVmKCduaWNrbmFtZXMnLCAnLT4kJykuYXQoJ2xhc3QnKS5hcygnbGFzdF9uaWNrbmFtZScpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBgbmlja25hbWVzYC0+JyRbbGFzdF0nIGFzIGBsYXN0X25pY2tuYW1lYCBmcm9tIGBwZXJzb25gXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBPciBgJyMtMSdgIGluIFNRTGl0ZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ25pY2tuYW1lcycsICctPj4kJykuYXQoJyMtMScpLmFzKCdsYXN0X25pY2tuYW1lJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcIm5pY2tuYW1lc1wiLT4+JyRbIy0xXScgYXMgYGxhc3Rfbmlja25hbWVgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhdChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKCdBcnJheUxvY2F0aW9uJywgaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgYSBwcm9wZXJ0eSBvZiBhIEpTT04gb2JqZWN0LlxuICAgICAqXG4gICAgICogSWYgYSBmaWVsZCBpcyBvcHRpb25hbCwgdGhlIHJlc3VsdGluZyB0eXBlIHdpbGwgYmUgbnVsbGFibGUuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbyB7QGxpbmsgYXR9IHRvIGFjY2VzcyBlbGVtZW50cyBvZiBKU09OIGFycmF5cy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignYWRkcmVzcycsICctPicpLmtleSgnY2l0eScpLmFzKCdjaXR5JylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJhZGRyZXNzXCItPidjaXR5JyBhcyBcImNpdHlcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEdvaW5nIGRlZXBlcjpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ3Byb2ZpbGUnLCAnLT4kJykua2V5KCd3ZWJzaXRlJykua2V5KCd1cmwnKS5hcygnd2Vic2l0ZV91cmwnKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgYHByb2ZpbGVgLT4nJC53ZWJzaXRlLnVybCcgYXMgYHdlYnNpdGVfdXJsYCBmcm9tIGBwZXJzb25gXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBDb21iaW5lZCB3aXRoIHtAbGluayBhdH06XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChlYiA9PlxuICAgICAqICAgZWIucmVmKCdwcm9maWxlJywgJy0+Jykua2V5KCdhZGRyZXNzZXMnKS5hdCgwKS5rZXkoJ2NpdHknKS5hcygnY2l0eScpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicHJvZmlsZVwiLT4nYWRkcmVzc2VzJy0+MC0+J2NpdHknIGFzIFwiY2l0eVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGtleShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUJ1aWxkZXJXaXRoUGF0aExlZygnTWVtYmVyJywga2V5KTtcbiAgICB9XG4gICAgI2NyZWF0ZUJ1aWxkZXJXaXRoUGF0aExlZyhsZWdUeXBlLCB2YWx1ZSkge1xuICAgICAgICBpZiAoSlNPTlJlZmVyZW5jZU5vZGUuaXModGhpcy4jbm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyKEpTT05SZWZlcmVuY2VOb2RlLmNsb25lV2l0aFRyYXZlcnNhbCh0aGlzLiNub2RlLCBKU09OUGF0aE5vZGUuaXModGhpcy4jbm9kZS50cmF2ZXJzYWwpXG4gICAgICAgICAgICAgICAgPyBKU09OUGF0aE5vZGUuY2xvbmVXaXRoTGVnKHRoaXMuI25vZGUudHJhdmVyc2FsLCBKU09OUGF0aExlZ05vZGUuY3JlYXRlKGxlZ1R5cGUsIHZhbHVlKSlcbiAgICAgICAgICAgICAgICA6IEpTT05PcGVyYXRvckNoYWluTm9kZS5jbG9uZVdpdGhWYWx1ZSh0aGlzLiNub2RlLnRyYXZlcnNhbCwgVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSh2YWx1ZSkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIoSlNPTlBhdGhOb2RlLmNsb25lV2l0aExlZyh0aGlzLiNub2RlLCBKU09OUGF0aExlZ05vZGUuY3JlYXRlKGxlZ1R5cGUsIHZhbHVlKSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIgZXh0ZW5kcyBKU09OUGF0aEJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgc3VwZXIobm9kZSk7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEpTT05QYXRoQnVpbGRlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIGpzb24gcGF0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgSlNPTlBhdGhCdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyKHRoaXMuI25vZGUpO1xuICAgIH1cbiAgICAkbm90TnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsaWFzZWRKU09OUGF0aEJ1aWxkZXIge1xuICAgICNqc29uUGF0aDtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IoanNvblBhdGgsIGFsaWFzKSB7XG4gICAgICAgIHRoaXMuI2pzb25QYXRoID0ganNvblBhdGg7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4janNvblBhdGg7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI2pzb25QYXRoLnRvT3BlcmF0aW9uTm9kZSgpLCBpc09wZXJhdGlvbk5vZGVTb3VyY2UodGhpcy4jYWxpYXMpXG4gICAgICAgICAgICA/IHRoaXMuI2FsaWFzLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgICAgICA6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdHVwbGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUdXBsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1R1cGxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1R1cGxlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZSh2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RhdGEtdHlwZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuY29uc3QgU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTID0gW1xuICAgICd2YXJjaGFyJyxcbiAgICAnY2hhcicsXG4gICAgJ3RleHQnLFxuICAgICdpbnRlZ2VyJyxcbiAgICAnaW50MicsXG4gICAgJ2ludDQnLFxuICAgICdpbnQ4JyxcbiAgICAnc21hbGxpbnQnLFxuICAgICdiaWdpbnQnLFxuICAgICdib29sZWFuJyxcbiAgICAncmVhbCcsXG4gICAgJ2RvdWJsZSBwcmVjaXNpb24nLFxuICAgICdmbG9hdDQnLFxuICAgICdmbG9hdDgnLFxuICAgICdkZWNpbWFsJyxcbiAgICAnbnVtZXJpYycsXG4gICAgJ2JpbmFyeScsXG4gICAgJ2J5dGVhJyxcbiAgICAnZGF0ZScsXG4gICAgJ2RhdGV0aW1lJyxcbiAgICAndGltZScsXG4gICAgJ3RpbWV0eicsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3RpbWVzdGFtcHR6JyxcbiAgICAnc2VyaWFsJyxcbiAgICAnYmlnc2VyaWFsJyxcbiAgICAndXVpZCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uYicsXG4gICAgJ2Jsb2InLFxuICAgICd2YXJiaW5hcnknLFxuICAgICdpbnQ0cmFuZ2UnLFxuICAgICdpbnQ0bXVsdGlyYW5nZScsXG4gICAgJ2ludDhyYW5nZScsXG4gICAgJ2ludDhtdWx0aXJhbmdlJyxcbiAgICAnbnVtcmFuZ2UnLFxuICAgICdudW1tdWx0aXJhbmdlJyxcbiAgICAndHNyYW5nZScsXG4gICAgJ3RzbXVsdGlyYW5nZScsXG4gICAgJ3RzdHpyYW5nZScsXG4gICAgJ3RzdHptdWx0aXJhbmdlJyxcbiAgICAnZGF0ZXJhbmdlJyxcbiAgICAnZGF0ZW11bHRpcmFuZ2UnLFxuXTtcbmNvbnN0IENPTFVNTl9EQVRBX1RZUEVfUkVHRVggPSBbXG4gICAgL152YXJjaGFyXFwoXFxkK1xcKSQvLFxuICAgIC9eY2hhclxcKFxcZCtcXCkkLyxcbiAgICAvXmRlY2ltYWxcXChcXGQrLCBcXGQrXFwpJC8sXG4gICAgL15udW1lcmljXFwoXFxkKywgXFxkK1xcKSQvLFxuICAgIC9eYmluYXJ5XFwoXFxkK1xcKSQvLFxuICAgIC9eZGF0ZXRpbWVcXChcXGQrXFwpJC8sXG4gICAgL150aW1lXFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXR6XFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXN0YW1wXFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXN0YW1wdHpcXChcXGQrXFwpJC8sXG4gICAgL152YXJiaW5hcnlcXChcXGQrXFwpJC8sXG5dO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERhdGFUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGF0YVR5cGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShkYXRhVHlwZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEYXRhVHlwZU5vZGUnLFxuICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbHVtbkRhdGFUeXBlKGRhdGFUeXBlKSB7XG4gICAgaWYgKFNJTVBMRV9DT0xVTU5fREFUQV9UWVBFUy5pbmNsdWRlcyhkYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDT0xVTU5fREFUQV9UWVBFX1JFR0VYLnNvbWUoKHIpID0+IHIudGVzdChkYXRhVHlwZSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RhdGEtdHlwZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEYXRhVHlwZU5vZGUsIGlzQ29sdW1uRGF0YVR5cGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZGF0YS10eXBlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgaWYgKGlzQ29sdW1uRGF0YVR5cGUoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBEYXRhVHlwZU5vZGUuY3JlYXRlKGRhdGFUeXBlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGNvbHVtbiBkYXRhIHR5cGUgJHtKU09OLnN0cmluZ2lmeShkYXRhVHlwZSl9YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc3Qtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDYXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ2FzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Nhc3ROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBkYXRhVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIsIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9zZWxlY3QtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgcGFyc2VUYWJsZSwgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhTY2hlbWFQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW4vd2l0aC1zY2hlbWEvd2l0aC1zY2hlbWEtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlLCB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvZnVuY3Rpb24tbW9kdWxlLmpzJztcbmltcG9ydCB7IHBhcnNlSlNPTlJlZmVyZW5jZSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCBwYXJzZVN0cmluZ1JlZmVyZW5jZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUZpbHRlckxpc3QsIHBhcnNlRmlsdGVyT2JqZWN0LCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICcuL2V4cHJlc3Npb24td3JhcHBlci5qcyc7XG5pbXBvcnQgeyBPcGVyYXRvck5vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVVuYXJ5T3BlcmF0aW9uIH0gZnJvbSAnLi4vcGFyc2VyL3VuYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUsIHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgQ2FzZUJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2Nhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Nhc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBpc1JlYWRvbmx5QXJyYXksIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSlNPTlBhdGhCdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9qc29uLXBhdGgtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCaW5hcnlPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYmluYXJ5LW9wZXJhdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBUdXBsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90dXBsZS1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05QYXRoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kYXRhLXR5cGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IENhc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2FzdC1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHByZXNzaW9uQnVpbGRlcihleGVjdXRvciA9IE5PT1BfUVVFUllfRVhFQ1VUT1IpIHtcbiAgICBmdW5jdGlvbiBiaW5hcnkobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5hcnkob3AsIGV4cHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVVuYXJ5T3BlcmF0aW9uKG9wLCBleHByKSk7XG4gICAgfVxuICAgIGNvbnN0IGViID0gT2JqZWN0LmFzc2lnbihiaW5hcnksIHtcbiAgICAgICAgZm46IHVuZGVmaW5lZCxcbiAgICAgICAgZWI6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VsZWN0RnJvbSh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNyZWF0ZUZyb20ocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QodGFibGUpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjYXNlKHJlZmVyZW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXNlQnVpbGRlcih7XG4gICAgICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY3JlYXRlKGlzVW5kZWZpbmVkKHJlZmVyZW5jZSlcbiAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24ocmVmZXJlbmNlKSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmKHJlZmVyZW5jZSwgb3ApIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChvcCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZmVyZW5jZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OUGF0aEJ1aWxkZXIocGFyc2VKU09OUmVmZXJlbmNlKHJlZmVyZW5jZSwgb3ApKTtcbiAgICAgICAgfSxcbiAgICAgICAganNvblBhdGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEpTT05QYXRoQnVpbGRlcihKU09OUGF0aE5vZGUuY3JlYXRlKCkpO1xuICAgICAgICB9LFxuICAgICAgICB0YWJsZSh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVRhYmxlKHRhYmxlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpO1xuICAgICAgICB9LFxuICAgICAgICByZWZUdXBsZSguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoVHVwbGVOb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbikpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHVwbGUoLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKFR1cGxlTm9kZS5jcmVhdGUodmFsdWVzLm1hcChwYXJzZVZhbHVlRXhwcmVzc2lvbikpKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGl0KHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHVuYXJ5LFxuICAgICAgICBub3QoZXhwcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuYXJ5KCdub3QnLCBleHByKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhpc3RzKGV4cHIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeSgnZXhpc3RzJywgZXhwcik7XG4gICAgICAgIH0sXG4gICAgICAgIG5lZyhleHByKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnkoJy0nLCBleHByKTtcbiAgICAgICAgfSxcbiAgICAgICAgYmV0d2VlbihleHByLCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihleHByKSwgT3BlcmF0b3JOb2RlLmNyZWF0ZSgnYmV0d2VlbicpLCBBbmROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihzdGFydCksIHBhcnNlVmFsdWVFeHByZXNzaW9uKGVuZCkpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGJldHdlZW5TeW1tZXRyaWMoZXhwciwgc3RhcnQsIGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwciksIE9wZXJhdG9yTm9kZS5jcmVhdGUoJ2JldHdlZW4gc3ltbWV0cmljJyksIEFuZE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKHN0YXJ0KSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24oZW5kKSkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgYW5kKGV4cHJzKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWFkb25seUFycmF5KGV4cHJzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VGaWx0ZXJMaXN0KGV4cHJzLCAnYW5kJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlck9iamVjdChleHBycywgJ2FuZCcpKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3IoZXhwcnMpIHtcbiAgICAgICAgICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoZXhwcnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlckxpc3QoZXhwcnMsICdvcicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VGaWx0ZXJPYmplY3QoZXhwcnMsICdvcicpKTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyZW5zKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICAgICAgaWYgKFBhcmVuc05vZGUuaXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBObyBkb3VibGUgd3JhcHBpbmcuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoUGFyZW5zTm9kZS5jcmVhdGUobm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYXN0KGV4cHIsIGRhdGFUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc3ROb2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwciksIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKGV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICBlYi5mbiA9IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlKCk7XG4gICAgZWIuZWIgPSBlYjtcbiAgICByZXR1cm4gZWI7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwcmVzc2lvbkJ1aWxkZXIoXykge1xuICAgIHJldHVybiBjcmVhdGVFeHByZXNzaW9uQnVpbGRlcigpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzQWxpYXNlZEV4cHJlc3Npb24sIGlzRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cChleHByZXNzaW9uQnVpbGRlcigpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGV4cHJlc3Npb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFsaWFzZWRFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cChleHByZXNzaW9uQnVpbGRlcigpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFsaWFzZWQgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbk9yRmFjdG9yeShvYmopIHtcbiAgICByZXR1cm4gaXNFeHByZXNzaW9uKG9iaikgfHwgaXNBbGlhc2VkRXhwcmVzc2lvbihvYmopIHx8IGlzRnVuY3Rpb24ob2JqKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHluYW1pYy10YWJsZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEeW5hbWljVGFibGVCdWlsZGVyIHtcbiAgICAjdGFibGU7XG4gICAgZ2V0IHRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFibGU7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhYmxlKSB7XG4gICAgICAgIHRoaXMuI3RhYmxlID0gdGFibGU7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIodGhpcy4jdGFibGUsIGFsaWFzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIge1xuICAgICN0YWJsZTtcbiAgICAjYWxpYXM7XG4gICAgZ2V0IHRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFibGU7XG4gICAgfVxuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0YWJsZSwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jdGFibGUgPSB0YWJsZTtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRoaXMuI3RhYmxlKSwgSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIob2JqKSB7XG4gICAgcmV0dXJuIChpc09iamVjdChvYmopICYmXG4gICAgICAgIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopICYmXG4gICAgICAgIGlzU3RyaW5nKG9iai50YWJsZSkgJiZcbiAgICAgICAgaXNTdHJpbmcob2JqLmFsaWFzKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3RhYmxlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzUmVhZG9ubHlBcnJheSwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IFRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3RhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VBbGlhc2VkRXhwcmVzc2lvbiwgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIsIH0gZnJvbSAnLi4vZHluYW1pYy9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KHRhYmxlKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheSh0YWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLm1hcCgoaXQpID0+IHBhcnNlVGFibGVFeHByZXNzaW9uKGl0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW3BhcnNlVGFibGVFeHByZXNzaW9uKHRhYmxlKV07XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFibGVFeHByZXNzaW9uKHRhYmxlKSB7XG4gICAgaWYgKGlzU3RyaW5nKHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VBbGlhc2VkVGFibGUodGFibGUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyKHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gdGFibGUudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VBbGlhc2VkRXhwcmVzc2lvbih0YWJsZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWxpYXNlZFRhYmxlKGZyb20pIHtcbiAgICBjb25zdCBBTElBU19TRVBBUkFUT1IgPSAnIGFzICc7XG4gICAgaWYgKGZyb20uaW5jbHVkZXMoQUxJQVNfU0VQQVJBVE9SKSkge1xuICAgICAgICBjb25zdCBbdGFibGUsIGFsaWFzXSA9IGZyb20uc3BsaXQoQUxJQVNfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUoYWxpYXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZVRhYmxlKGZyb20pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhYmxlKGZyb20pIHtcbiAgICBjb25zdCBTQ0hFTUFfU0VQQVJBVE9SID0gJy4nO1xuICAgIGlmIChmcm9tLmluY2x1ZGVzKFNDSEVNQV9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFtzY2hlbWEsIHRhYmxlXSA9IGZyb20uc3BsaXQoU0NIRU1BX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICByZXR1cm4gVGFibGVOb2RlLmNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCB0YWJsZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gVGFibGVOb2RlLmNyZWF0ZShmcm9tKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmltKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hZGQtY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWRkQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWRkQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FkZENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29sdW1uRGVmaW5pdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbHVtbkRlZmluaXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbkRlZmluaXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgICAgIGRhdGFUeXBlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb250TW9kaWZpZXIobm9kZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgZnJvbnRNb2RpZmllcnM6IG5vZGUuZnJvbnRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ubm9kZS5mcm9udE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogW21vZGlmaWVyXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbmRNb2RpZmllcihub2RlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IG5vZGUuZW5kTW9kaWZpZXJzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLm5vZGUuZW5kTW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBbbW9kaWZpZXJdLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLWNvbHVtbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZW5hbWUtY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmVuYW1lQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmVuYW1lQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVuYW1lQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbiksXG4gICAgICAgICAgICByZW5hbWVUbzogQ29sdW1uTm9kZS5jcmVhdGUobmV3Q29sdW1uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jaGVjay1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDaGVja0NvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDaGVja0NvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShleHByZXNzaW9uLCBjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDaGVja0NvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50TmFtZVxuICAgICAgICAgICAgICAgID8gSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZmVyZW5jZXMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TID0gW1xuICAgICdubyBhY3Rpb24nLFxuICAgICdyZXN0cmljdCcsXG4gICAgJ2Nhc2NhZGUnLFxuICAgICdzZXQgbnVsbCcsXG4gICAgJ3NldCBkZWZhdWx0Jyxcbl07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmVmZXJlbmNlc05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZmVyZW5jZXNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSwgY29sdW1ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZlcmVuY2VzTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShbLi4uY29sdW1uc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9uRGVsZXRlKHJlZmVyZW5jZXMsIG9uRGVsZXRlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ucmVmZXJlbmNlcyxcbiAgICAgICAgICAgIG9uRGVsZXRlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9uVXBkYXRlKHJlZmVyZW5jZXMsIG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ucmVmZXJlbmNlcyxcbiAgICAgICAgICAgIG9uVXBkYXRlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtdmFsdWUtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbih2YWx1ZSkge1xuICAgIHJldHVybiBpc09wZXJhdGlvbk5vZGVTb3VyY2UodmFsdWUpXG4gICAgICAgID8gdmFsdWUudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgOiBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHZhbHVlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZ2VuZXJhdGVkLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgR2VuZXJhdGVkTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnR2VuZXJhdGVkTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0dlbmVyYXRlZE5vZGUnLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhFeHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnR2VuZXJhdGVkTm9kZScsXG4gICAgICAgICAgICBhbHdheXM6IHRydWUsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtdmFsdWUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VmFsdWVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEZWZhdWx0VmFsdWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRGVmYXVsdFZhbHVlTm9kZScsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZmVyZW5jZXMtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKE9OX01PRElGWV9GT1JFSUdOX0FDVElPTlMuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgT25Nb2RpZnlGb3JlaWduQWN0aW9uICR7YWN0aW9ufWApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb2x1bW4tZGVmaW5pdGlvbi1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ2hlY2tDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NoZWNrLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBSZWZlcmVuY2VzTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZWZlcmVuY2VzLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0QWxsTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1hbGwtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVN0cmluZ1JlZmVyZW5jZSB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLWRlZmluaXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RlZmF1bHQtdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IEdlbmVyYXRlZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9nZW5lcmF0ZWQtbm9kZS5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0VmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZGVmYXVsdC12YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIH0gZnJvbSAnLi4vcGFyc2VyL29uLW1vZGlmeS1hY3Rpb24tcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgYXV0b19pbmNyZW1lbnRgIG9yIGBhdXRvaW5jcmVtZW50YCB0byB0aGUgY29sdW1uIGRlZmluaXRpb25cbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGRpYWxlY3QuXG4gICAgICpcbiAgICAgKiBTb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBkb24ndCBzdXBwb3J0IHRoaXMuIE9uIFBvc3RncmVTUUxcbiAgICAgKiB5b3UgY2FuIHVzZSB0aGUgYHNlcmlhbGAgb3IgYGJpZ3NlcmlhbGAgZGF0YSB0eXBlIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5hdXRvSW5jcmVtZW50KCkucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgaWRgIGludGVnZXIgcHJpbWFyeSBrZXkgYXV0b19pbmNyZW1lbnRcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXV0b0luY3JlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBhdXRvSW5jcmVtZW50OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbHVtbiBhbiBpZGVudGl0eSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIE1TIFNRTCBTZXJ2ZXIgKE1TU1FMKS5cbiAgICAgKlxuICAgICAqIEZvciBQb3N0Z3JlU1FMJ3MgYGdlbmVyYXRlZCBhbHdheXMgYXMgaWRlbnRpdHlgIHVzZSB7QGxpbmsgZ2VuZXJhdGVkQWx3YXlzQXNJZGVudGl0eX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5pZGVudGl0eSgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNU1NRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBpZGVudGl0eSBwcmltYXJ5IGtleVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpZGVudGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBpZGVudGl0eTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBjb2x1bW4gdGhlIHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSB1c2UgdGhlXG4gICAgICoge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRQcmltYXJ5S2V5Q29uc3RyYWludH0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgaWRgIGludGVnZXIgcHJpbWFyeSBrZXlcbiAgICAgKiApXG4gICAgICovXG4gICAgcHJpbWFyeUtleSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBwcmltYXJ5S2V5OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBJZiB5b3VyIGRhdGFiYXNlIGVuZ2luZSBkb2Vzbid0IHN1cHBvcnQgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgaW4gdGhlXG4gICAgICogY29sdW1uIGRlZmluaXRpb24gKGxpa2UgTXlTUUwgNSkgeW91IG5lZWQgdG8gY2FsbCB0aGUgdGFibGUgbGV2ZWxcbiAgICAgKiB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wucmVmZXJlbmNlcygncGVyc29uLmlkJykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXRcIiAoXG4gICAgICogICBcIm93bmVyX2lkXCIgaW50ZWdlciByZWZlcmVuY2VzIFwicGVyc29uXCIgKFwiaWRcIilcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcmVmZXJlbmNlcyhyZWYpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZik7XG4gICAgICAgIGlmICghcmVmZXJlbmNlcy50YWJsZSB8fCBTZWxlY3RBbGxOb2RlLmlzKHJlZmVyZW5jZXMuY29sdW1uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGNhbGwgcmVmZXJlbmNlcygnJHtyZWZ9JykuIFRoZSByZWZlcmVuY2UgbXVzdCBoYXZlIGZvcm1hdCB0YWJsZS5jb2x1bW4gb3Igc2NoZW1hLnRhYmxlLmNvbHVtbmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNyZWF0ZShyZWZlcmVuY2VzLnRhYmxlLCBbXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlcy5jb2x1bW4sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGBvbiBkZWxldGVgIGNvbnN0cmFpbnQgZm9yIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBJZiB5b3VyIGRhdGFiYXNlIGVuZ2luZSBkb2Vzbid0IHN1cHBvcnQgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgaW4gdGhlXG4gICAgICogY29sdW1uIGRlZmluaXRpb24gKGxpa2UgTXlTUUwgNSkgeW91IG5lZWQgdG8gY2FsbCB0aGUgdGFibGUgbGV2ZWxcbiAgICAgKiB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oXG4gICAgICogICAgICdvd25lcl9pZCcsXG4gICAgICogICAgICdpbnRlZ2VyJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpLm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBldFwiIChcbiAgICAgKiAgIFwib3duZXJfaWRcIiBpbnRlZ2VyIHJlZmVyZW5jZXMgXCJwZXJzb25cIiAoXCJpZFwiKSBvbiBkZWxldGUgY2FzY2FkZVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvbkRlbGV0ZShvbkRlbGV0ZSkge1xuICAgICAgICBpZiAoIXRoaXMuI25vZGUucmVmZXJlbmNlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbiBkZWxldGUgY29uc3RyYWludCBjYW4gb25seSBiZSBhZGRlZCBmb3IgZm9yZWlnbiBrZXlzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgcmVmZXJlbmNlczogUmVmZXJlbmNlc05vZGUuY2xvbmVXaXRoT25EZWxldGUodGhpcy4jbm9kZS5yZWZlcmVuY2VzLCBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbihvbkRlbGV0ZSkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYG9uIHVwZGF0ZWAgY29uc3RyYWludCBmb3IgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi5cbiAgICAgKlxuICAgICAqIElmIHlvdXIgZGF0YWJhc2UgZW5naW5lIGRvZXNuJ3Qgc3VwcG9ydCBmb3JlaWduIGtleSBjb25zdHJhaW50cyBpbiB0aGVcbiAgICAgKiBjb2x1bW4gZGVmaW5pdGlvbiAobGlrZSBNeVNRTCA1KSB5b3UgbmVlZCB0byBjYWxsIHRoZSB0YWJsZSBsZXZlbFxuICAgICAqIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkRm9yZWlnbktleUNvbnN0cmFpbnR9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ293bmVyX2lkJyxcbiAgICAgKiAgICAgJ2ludGVnZXInLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wucmVmZXJlbmNlcygncGVyc29uLmlkJykub25VcGRhdGUoJ2Nhc2NhZGUnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGV0XCIgKFxuICAgICAqICAgXCJvd25lcl9pZFwiIGludGVnZXIgcmVmZXJlbmNlcyBcInBlcnNvblwiIChcImlkXCIpIG9uIHVwZGF0ZSBjYXNjYWRlXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9uVXBkYXRlKG9uVXBkYXRlKSB7XG4gICAgICAgIGlmICghdGhpcy4jbm9kZS5yZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uIHVwZGF0ZSBjb25zdHJhaW50IGNhbiBvbmx5IGJlIGFkZGVkIGZvciBmb3JlaWduIGtleXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzTm9kZS5jbG9uZVdpdGhPblVwZGF0ZSh0aGlzLiNub2RlLnJlZmVyZW5jZXMsIHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uKG9uVXBkYXRlKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHVuaXF1ZSBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZW1haWwnLCAndmFyY2hhcigyNTUpJywgY29sID0+IGNvbC51bmlxdWUoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGVtYWlsYCB2YXJjaGFyKDI1NSkgdW5pcXVlXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHVuaXF1ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyB1bmlxdWU6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYG5vdCBudWxsYCBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDI1NSknLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGZpcnN0X25hbWVgIHZhcmNoYXIoMjU1KSBub3QgbnVsbFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IG5vdE51bGw6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYHVuc2lnbmVkYCBtb2RpZmllciBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSB3b3JrcyBvbiBzb21lIGRpYWxlY3RzIGxpa2UgTXlTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdhZ2UnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wudW5zaWduZWQoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGFnZWAgaW50ZWdlciB1bnNpZ25lZFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB1bnNpZ25lZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyB1bnNpZ25lZDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBkZWZhdWx0IHZhbHVlIGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdudW1iZXJfb2ZfbGVncycsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLmRlZmF1bHRUbyg0KSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBldGAgKFxuICAgICAqICAgYG51bWJlcl9vZl9sZWdzYCBpbnRlZ2VyIGRlZmF1bHQgNFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFZhbHVlcyBwYXNzZWQgdG8gYGRlZmF1bHRUb2AgYXJlIGludGVycHJldGVkIGFzIHZhbHVlIGxpdGVyYWxzIGJ5IGRlZmF1bHQuIFlvdSBjYW4gZGVmaW5lXG4gICAgICogYW4gYXJiaXRyYXJ5IFNRTCBleHByZXNzaW9uIHVzaW5nIHRoZSB7QGxpbmsgc3FsfSB0ZW1wbGF0ZSB0YWc6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnY3JlYXRlZF9hdCcsXG4gICAgICogICAgICd0aW1lc3RhbXAnLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wuZGVmYXVsdFRvKHNxbGBDVVJSRU5UX1RJTUVTVEFNUGApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXRgIChcbiAgICAgKiAgIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgZGVmYXVsdCBDVVJSRU5UX1RJTUVTVEFNUFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkZWZhdWx0VG8odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZGVmYXVsdFRvOiBEZWZhdWx0VmFsdWVOb2RlLmNyZWF0ZShwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24odmFsdWUpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2hlY2sgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignbnVtYmVyX29mX2xlZ3MnLCAnaW50ZWdlcicsIChjb2wpID0+XG4gICAgICogICAgIGNvbC5jaGVjayhzcWxgbnVtYmVyX29mX2xlZ3MgPCA1YClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBldGAgKFxuICAgICAqICAgYG51bWJlcl9vZl9sZWdzYCBpbnRlZ2VyIGNoZWNrIChudW1iZXJfb2ZfbGVncyA8IDUpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNoZWNrKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgY2hlY2s6IENoZWNrQ29uc3RyYWludE5vZGUuY3JlYXRlKGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBjb2x1bW4gYSBnZW5lcmF0ZWQgY29sdW1uIHVzaW5nIGEgYGdlbmVyYXRlZCBhbHdheXMgYXNgIHN0YXRlbWVudC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZnVsbF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5nZW5lcmF0ZWRBbHdheXNBcyhzcWxgY29uY2F0KGZpcnN0X25hbWUsICcgJywgbGFzdF9uYW1lKWApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBmdWxsX25hbWVgIHZhcmNoYXIoMjU1KSBnZW5lcmF0ZWQgYWx3YXlzIGFzIChjb25jYXQoZmlyc3RfbmFtZSwgJyAnLCBsYXN0X25hbWUpKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRBbHdheXNBcyhleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkTm9kZS5jcmVhdGVXaXRoRXhwcmVzc2lvbihleHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBgZ2VuZXJhdGVkIGFsd2F5cyBhcyBpZGVudGl0eWAgc3BlY2lmaWVyLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogRm9yIE1TIFNRTCBTZXJ2ZXIgKE1TU1FMKSdzIGlkZW50aXR5IGNvbHVtbiB1c2Uge0BsaW5rIGlkZW50aXR5fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLmdlbmVyYXRlZEFsd2F5c0FzSWRlbnRpdHkoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBnZW5lcmF0ZWQgYWx3YXlzIGFzIGlkZW50aXR5IHByaW1hcnkga2V5XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdlbmVyYXRlZEFsd2F5c0FzSWRlbnRpdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkTm9kZS5jcmVhdGUoeyBpZGVudGl0eTogdHJ1ZSwgYWx3YXlzOiB0cnVlIH0pLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBhcyBpZGVudGl0eWAgc3BlY2lmaWVyIG9uIHN1cHBvcnRlZCBkaWFsZWN0cy5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSB3b3JrcyBvbiBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTC5cbiAgICAgKlxuICAgICAqIEZvciBNUyBTUUwgU2VydmVyIChNU1NRTCkncyBpZGVudGl0eSBjb2x1bW4gdXNlIHtAbGluayBpZGVudGl0eX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5nZW5lcmF0ZWRCeURlZmF1bHRBc0lkZW50aXR5KCkucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgYXMgaWRlbnRpdHkgcHJpbWFyeSBrZXlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2VuZXJhdGVkQnlEZWZhdWx0QXNJZGVudGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWROb2RlLmNyZWF0ZSh7IGlkZW50aXR5OiB0cnVlLCBieURlZmF1bHQ6IHRydWUgfSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBnZW5lcmF0ZWQgY29sdW1uIHN0b3JlZCBpbnN0ZWFkIG9mIHZpcnR1YWwuIFRoaXMgbWV0aG9kIGNhbiBvbmx5XG4gICAgICogYmUgdXNlZCB3aXRoIHtAbGluayBnZW5lcmF0ZWRBbHdheXNBc31cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2Z1bGxfbmFtZScsICd2YXJjaGFyKDI1NSknLCAoY29sKSA9PiBjb2xcbiAgICAgKiAgICAgLmdlbmVyYXRlZEFsd2F5c0FzKHNxbGBjb25jYXQoZmlyc3RfbmFtZSwgJyAnLCBsYXN0X25hbWUpYClcbiAgICAgKiAgICAgLnN0b3JlZCgpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBmdWxsX25hbWVgIHZhcmNoYXIoMjU1KSBnZW5lcmF0ZWQgYWx3YXlzIGFzIChjb25jYXQoZmlyc3RfbmFtZSwgJyAnLCBsYXN0X25hbWUpKSBzdG9yZWRcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgc3RvcmVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuI25vZGUuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0b3JlZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBnZW5lcmF0ZWRBbHdheXNBcycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZS5nZW5lcmF0ZWQsIHtcbiAgICAgICAgICAgICAgICBzdG9yZWQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgcmlnaHQgYWZ0ZXIgdGhlIGNvbHVtbidzIGRhdGEgdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oXG4gICAgICogICAgICdmaXJzdF9uYW1lJyxcbiAgICAgKiAgICAgJ3ZhcmNoYXIoMzYpJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLm1vZGlmeUZyb250KHNxbGBjb2xsYXRlIHV0ZjhtYjRfZ2VuZXJhbF9jaWApLm5vdE51bGwoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgaWRgIGludGVnZXIgcHJpbWFyeSBrZXksXG4gICAgICogICBgZmlyc3RfbmFtZWAgdmFyY2hhcigzNikgY29sbGF0ZSB1dGY4bWI0X2dlbmVyYWxfY2kgbm90IG51bGxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RnJvbnQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGhGcm9udE1vZGlmaWVyKHRoaXMuI25vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG51bGxzIG5vdCBkaXN0aW5jdGAgc3BlY2lmaWVyLlxuICAgICAqIFNob3VsZCBiZSB1c2VkIHdpdGggYHVuaXF1ZWAgY29uc3RyYWludC5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSB3b3JrcyBvbiBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcigzMCknLCBjb2wgPT4gY29sLnVuaXF1ZSgpLm51bGxzTm90RGlzdGluY3QoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgXCJmaXJzdF9uYW1lXCIgdmFyY2hhcigzMCkgdW5pcXVlIG51bGxzIG5vdCBkaXN0aW5jdFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IG51bGxzTm90RGlzdGluY3Q6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBpZiBub3QgZXhpc3RzYCBzcGVjaWZpZXIuIFRoaXMgb25seSB3b3JrcyBmb3IgUG9zdGdyZVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZW1haWwnLCAndmFyY2hhcigyNTUpJywgY29sID0+IGNvbC51bmlxdWUoKS5pZk5vdEV4aXN0cygpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgXCJwZXJzb25cIiBhZGQgY29sdW1uIGlmIG5vdCBleGlzdHMgXCJlbWFpbFwiIHZhcmNoYXIoMjU1KSB1bmlxdWVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBpZk5vdEV4aXN0czogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBjb2x1bW4gZGVmaW5pdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oXG4gICAgICogICAgICdhZ2UnLFxuICAgICAqICAgICAnaW50ZWdlcicsXG4gICAgICogICAgIGNvbCA9PiBjb2wudW5zaWduZWQoKVxuICAgICAqICAgICAgIC5ub3ROdWxsKClcbiAgICAgKiAgICAgICAubW9kaWZ5RW5kKHNxbGBjb21tZW50ICR7c3FsLmxpdCgnaXQgaXMgbm90IHBvbGl0ZSB0byBhc2sgYSB3b21hbiBoZXIgYWdlJyl9YClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgYGFnZWAgaW50ZWdlciB1bnNpZ25lZCBub3QgbnVsbCBjb21tZW50ICdpdCBpcyBub3QgcG9saXRlIHRvIGFzayBhIHdvbWFuIGhlciBhZ2UnXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI25vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21vZGlmeS1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBNb2RpZnlDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdNb2RpZnlDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTW9kaWZ5Q29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZm9yZWlnbi1rZXktY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBSZWZlcmVuY2VzTm9kZSwgfSBmcm9tICcuL3JlZmVyZW5jZXMtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRm9yZWlnbktleUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNvdXJjZUNvbHVtbnMsIHRhcmdldFRhYmxlLCB0YXJnZXRDb2x1bW5zLCBjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogc291cmNlQ29sdW1ucyxcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNyZWF0ZSh0YXJnZXRUYWJsZSwgdGFyZ2V0Q29sdW1ucyksXG4gICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50TmFtZVxuICAgICAgICAgICAgICAgID8gSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24gfSBmcm9tICcuLi9wYXJzZXIvb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgb25EZWxldGUob25EZWxldGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBvbkRlbGV0ZTogcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25EZWxldGUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIG9uVXBkYXRlKG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgb25VcGRhdGU6IHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uKG9uVXBkYXRlKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBkZWZlcnJhYmxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgZGVmZXJyYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGluaXRpYWxseURlZmVycmVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGluaXRpYWxseUltbWVkaWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWRkLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWRkQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29uc3RyYWludCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmlxdWUtY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVW5pcXVlQ29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VuaXF1ZUNvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW5zLCBjb25zdHJhaW50TmFtZSwgbnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVbmlxdWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKSxcbiAgICAgICAgICAgIG5hbWU6IGNvbnN0cmFpbnROYW1lXG4gICAgICAgICAgICAgICAgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0LFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRHJvcENvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29uc3RyYWludE5hbWU6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShjb25zdHJhaW50TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BDb25zdHJhaW50LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BDb25zdHJhaW50LFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWx0ZXJDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBbHRlckNvbHVtbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbiwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWx0ZXJDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgICAgIFtwcm9wXTogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItY29sdW1uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbHRlckNvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RlZmF1bHQtdmFsdWUtcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBBbHRlckNvbHVtbkJ1aWxkZXIge1xuICAgICNjb2x1bW47XG4gICAgY29uc3RydWN0b3IoY29sdW1uKSB7XG4gICAgICAgIHRoaXMuI2NvbHVtbiA9IGNvbHVtbjtcbiAgICB9XG4gICAgc2V0RGF0YVR5cGUoZGF0YVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlcmVkQ29sdW1uQnVpbGRlcihBbHRlckNvbHVtbk5vZGUuY3JlYXRlKHRoaXMuI2NvbHVtbiwgJ2RhdGFUeXBlJywgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSk7XG4gICAgfVxuICAgIHNldERlZmF1bHQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlcmVkQ29sdW1uQnVpbGRlcihBbHRlckNvbHVtbk5vZGUuY3JlYXRlKHRoaXMuI2NvbHVtbiwgJ3NldERlZmF1bHQnLCBwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24odmFsdWUpKSk7XG4gICAgfVxuICAgIGRyb3BEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyZWRDb2x1bW5CdWlsZGVyKEFsdGVyQ29sdW1uTm9kZS5jcmVhdGUodGhpcy4jY29sdW1uLCAnZHJvcERlZmF1bHQnLCB0cnVlKSk7XG4gICAgfVxuICAgIHNldE5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdzZXROb3ROdWxsJywgdHJ1ZSkpO1xuICAgIH1cbiAgICBkcm9wTm90TnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlcmVkQ29sdW1uQnVpbGRlcihBbHRlckNvbHVtbk5vZGUuY3JlYXRlKHRoaXMuI2NvbHVtbiwgJ2Ryb3BOb3ROdWxsJywgdHJ1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbGxvd3MgdXMgdG8gZm9yY2UgY29uc3VtZXJzIHRvIGRvIGV4YWN0bHkgb25lIGFsdGVyYXRpb24gdG8gYSBjb2x1bW4uXG4gKlxuICogT25lIGNhbm5vdCBkbyBubyBhbHRlcmF0aW9uczpcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgZGIuc2NoZW1hXG4gKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICogLy8gIC5leGVjdXRlKCkgLy8gUHJvcGVydHkgJ2V4ZWN1dGUnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0FsdGVyZWRDb2x1bW5CdWlsZGVyJy5cbiAqIGBgYFxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBkYi5zY2hlbWFcbiAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gKiAvLyAgLmFsdGVyQ29sdW1uKCdhZ2UnLCAoYWMpID0+IGFjKSAvLyBUeXBlICdBbHRlckNvbHVtbkJ1aWxkZXInIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ0FsdGVyZWRDb2x1bW5CdWlsZGVyJy5cbiAqIC8vICAuZXhlY3V0ZSgpXG4gKiBgYGBcbiAqXG4gKiBPbmUgY2Fubm90IGRvIG11bHRpcGxlIGFsdGVyYXRpb25zOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBkYi5zY2hlbWFcbiAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gKiAvLyAgLmFsdGVyQ29sdW1uKCdhZ2UnLCAoYWMpID0+IGFjLmRyb3BOb3ROdWxsKCkuc2V0Tm90TnVsbCgpKSAvLyBQcm9wZXJ0eSAnc2V0Tm90TnVsbCcgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQWx0ZXJlZENvbHVtbkJ1aWxkZXInLlxuICogLy8gIC5leGVjdXRlKClcbiAqIGBgYFxuICpcbiAqIFdoaWNoIHdvdWxkIG5vdyB0aHJvdyBhIGNvbXBpbGF0aW9uIGVycm9yLCBpbnN0ZWFkIG9mIGEgcnVudGltZSBlcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEFsdGVyZWRDb2x1bW5CdWlsZGVyIHtcbiAgICAjYWx0ZXJDb2x1bW5Ob2RlO1xuICAgIGNvbnN0cnVjdG9yKGFsdGVyQ29sdW1uTm9kZSkge1xuICAgICAgICB0aGlzLiNhbHRlckNvbHVtbk5vZGUgPSBhbHRlckNvbHVtbk5vZGU7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsdGVyQ29sdW1uTm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLXRhYmxlLWV4ZWN1dG9yLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVFeGVjdXRvciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1hZGQtZm9yZWlnbi1rZXktY29uc3RyYWludC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWRkQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgb25EZWxldGUob25EZWxldGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLm9uRGVsZXRlKG9uRGVsZXRlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uVXBkYXRlKG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5vblVwZGF0ZShvblVwZGF0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZlcnJhYmxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIuZGVmZXJyYWJsZSgpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLm5vdERlZmVycmFibGUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluaXRpYWxseURlZmVycmVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIuaW5pdGlhbGx5RGVmZXJyZWQoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluaXRpYWxseUltbWVkaWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLmluaXRpYWxseUltbWVkaWF0ZSgpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeShBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgIGFkZENvbnN0cmFpbnQ6IEFkZENvbnN0cmFpbnROb2RlLmNyZWF0ZSh0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLXRhYmxlLWRyb3AtY29uc3RyYWludC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWx0ZXJUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IERyb3BDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBpZkV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IERyb3BDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZS5kcm9wQ29uc3RyYWludCwge1xuICAgICAgICAgICAgICAgICAgICBpZkV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FzY2FkZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IERyb3BDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZS5kcm9wQ29uc3RyYWludCwge1xuICAgICAgICAgICAgICAgICAgICBtb2RpZmllcjogJ2Nhc2NhZGUnLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXN0cmljdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IERyb3BDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZS5kcm9wQ29uc3RyYWludCwge1xuICAgICAgICAgICAgICAgICAgICBtb2RpZmllcjogJ3Jlc3RyaWN0JyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW5zLCBjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogZnJlZXplKGNvbHVtbnMubWFwKENvbHVtbk5vZGUuY3JlYXRlKSksXG4gICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50TmFtZVxuICAgICAgICAgICAgICAgID8gSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHsgLi4ubm9kZSwgLi4ucHJvcHMgfSk7XG4gICAgfSxcbn0pO1xuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgYSB0eXBvIGluIHRoZSBjb2RlYmFzZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZX0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1hcnlDb25zdHJhaW50Tm9kZSA9IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWRkLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FkZEluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5zKG5vZGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uczogWy4uLihub2RlLmNvbHVtbnMgfHwgW10pLCAuLi5jb2x1bW5zXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1hZGQtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGluZGV4IHVuaXF1ZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZEluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5jb2x1bW4oJ2VtYWlsJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKGBlbWFpbGApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgaW5kZXguXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB7QGxpbmsgY29sdW1uc30gZm9yIGFkZGluZyBtdWx0aXBsZSBjb2x1bW5zIGF0IG9uY2Ugb3Ige0BsaW5rIGV4cHJlc3Npb259XG4gICAgICogZm9yIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgIC5jb2x1bW4oJ2FnZSBkZXNjJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZS5hZGRJbmRleCwgW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbiksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbn0gZm9yIGFkZGluZyBhIHNpbmdsZSBjb2x1bW4gb3Ige0BsaW5rIGV4cHJlc3Npb259IGZvclxuICAgICAqIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnYWdlIGRlc2MnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCBjb2x1bW5zLm1hcChwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAgLmV4cHJlc3Npb24oc3FsPGJvb2xlYW4+YChmaXJzdF9uYW1lIDwgJ1NhbWknKWApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKChmaXJzdF9uYW1lIDwgJ1NhbWknKSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkSW5kZXg6IEFkZEluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIFtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcoaW5kZXhUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgdXNpbmc6IFJhd05vZGUuY3JlYXRlV2l0aFNxbChpbmRleFR5cGUpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdW5pcXVlLWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHRvIHRoZSB1bmlxdWUgY29uc3RyYWludCBkZWZpbml0aW9uXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgYnkgUG9zdGdyZVNRTCBkaWFsZWN0IG9ubHlcbiAgICAgKi9cbiAgICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBudWxsc05vdERpc3RpbmN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgZGVmZXJyYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpbml0aWFsbHlJbW1lZGlhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWFyeS1rZXktY29uc3RyYWludC1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIoUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgQ2hlY2tDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVuYW1lLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlbmFtZUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZW5hbWVDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob2xkTmFtZSwgbmV3TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBvbGROYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUob2xkTmFtZSksXG4gICAgICAgICAgICBuZXdOYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUobmV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLWRlZmluaXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIG5vb3AgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciwgfSBmcm9tICcuL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgTW9kaWZ5Q29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWRkQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRHJvcENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJDb2x1bW5CdWlsZGVyLCB9IGZyb20gJy4vYWx0ZXItY29sdW1uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZUV4ZWN1dG9yIH0gZnJvbSAnLi9hbHRlci10YWJsZS1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1hZGQtZm9yZWlnbi1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWRyb3AtY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciwgfSBmcm9tICcuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZW5hbWUtY29uc3RyYWludC1ub2RlLmpzJztcbi8qKlxuICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGBhbHRlciB0YWJsZWAgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgcmVuYW1lVG8obmV3VGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lVG86IHBhcnNlVGFibGUobmV3VGFibGVOYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0U2NoZW1hKG5ld1NjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHNldFNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5ld1NjaGVtYSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRVbmlxdWVDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZENvbnN0cmFpbnQ6IEFkZENvbnN0cmFpbnROb2RlLmNyZWF0ZSh1bmlxdWVDb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZENoZWNrQ29uc3RyYWludH1cbiAgICAgKi9cbiAgICBhZGRDaGVja0NvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNoZWNrRXhwcmVzc2lvbiwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IENoZWNrQ29uc3RyYWludEJ1aWxkZXIoQ2hlY2tDb25zdHJhaW50Tm9kZS5jcmVhdGUoY2hlY2tFeHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH1cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSB0aGlzIG1ldGhvZCByZXR1cm5zXG4gICAgICogdGhlIGNvbnN0cmFpbnQgYnVpbGRlciBhbmQgZG9lc24ndCB0YWtlIGEgY2FsbGJhY2sgYXMgdGhlIGxhc3QgYXJndW1lbnQuIFRoaXNcbiAgICAgKiBpcyBiZWNhdXNlIHlvdSBjYW4gb25seSBhZGQgb25lIGNvbHVtbiBwZXIgYEFMVEVSIFRBQkxFYCBxdWVyeS5cbiAgICAgKi9cbiAgICBhZGRGb3JlaWduS2V5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgdGFyZ2V0VGFibGUsIHRhcmdldENvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIHBhcnNlVGFibGUodGFyZ2V0VGFibGUpLCB0YXJnZXRDb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZFByaW1hcnlLZXlDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFByaW1hcnlLZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkQ29uc3RyYWludDogQWRkQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IERyb3BDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb25zdHJhaW50KG9sZE5hbWUsIG5ld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQ29uc3RyYWludDogUmVuYW1lQ29uc3RyYWludE5vZGUuY3JlYXRlKG9sZE5hbWUsIG5ld05hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBpbmRleCB0byB0YWJsZS5cbiAgICAgKlxuICAgICAqICAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdlbWFpbCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZW1haWxfaW5kZXhgIChgZW1haWxgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZEluZGV4KGluZGV4TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRyb3AgaW5kZXggZnJvbSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zY2hlbWEuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgZHJvcCBpbmRleCBgdGVzdF9maXJzdF9uYW1lX2luZGV4YFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXg6IERyb3BJbmRleE5vZGUuY3JlYXRlKGluZGV4TmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLiRjYWxsfVxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5kLnRzXCIgLz5cbmltcG9ydCB7IE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmpzJztcbmltcG9ydCB7IFZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG4vKipcbiAqIFRyYW5zZm9ybXMgYWxsIFZhbHVlTm9kZXMgdG8gaW1tZWRpYXRlLlxuICpcbiAqIFdBUk5JTkchIFRoaXMgc2hvdWxkIG5ldmVyIGJlIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIFVzZXJzIHNob3VsZCBuZXZlciB1c2UgdGhpcy5cbiAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciBleHRlbmRzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gICAgdHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKG5vZGUudmFsdWVzLm1hcChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUobm9kZS52YWx1ZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENyZWF0ZUluZGV4Tm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5qcyc7XG5leHBvcnQgY2xhc3MgQ3JlYXRlSW5kZXhCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImlmIG5vdCBleGlzdHNcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHRoZSBpbmRleCBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgaXMgdGhyb3duIGlmIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZk5vdEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGluZGV4IHVuaXF1ZS5cbiAgICAgKi9cbiAgICB1bmlxdWUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHNwZWNpZmllciB0byBpbmRleC5cbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogIC5vbigncGVyc29uJylcbiAgICAgKiAgLmNvbHVtbignZmlyc3RfbmFtZScpXG4gICAgICogIC5udWxsc05vdERpc3RpbmN0KClcbiAgICAgKiAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfaW5kZXhcIlxuICAgICAqIG9uIFwidGVzdFwiIChcImZpcnN0X25hbWVcIilcbiAgICAgKiBudWxscyBub3QgZGlzdGluY3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIHRhYmxlIGZvciB0aGUgaW5kZXguXG4gICAgICovXG4gICAgb24odGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcGFyc2VUYWJsZSh0YWJsZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbnN9IGZvciBhZGRpbmcgbXVsdGlwbGUgY29sdW1ucyBhdCBvbmNlIG9yIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIGZvciBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgICAgICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4JylcbiAgICAgKiAgICAgICAgIC5vbigncGVyc29uJylcbiAgICAgKiAgICAgICAgIC5jb2x1bW4oJ2ZpcnN0X25hbWUnKVxuICAgICAqICAgICAgICAgLmNvbHVtbignYWdlIGRlc2MnKVxuICAgICAqICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImFnZVwiIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUsIFtcbiAgICAgICAgICAgICAgICBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbn0gZm9yIGFkZGluZyBhIHNpbmdsZSBjb2x1bW4gb3Ige0BsaW5rIGV4cHJlc3Npb259IGZvclxuICAgICAqIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAgICAgICAuY3JlYXRlSW5kZXgoJ3BlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXgnKVxuICAgICAqICAgICAgICAgLm9uKCdwZXJzb24nKVxuICAgICAqICAgICAgICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2FnZSBkZXNjJ10pXG4gICAgICogICAgICAgICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgaW5kZXggXCJwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4XCIgb24gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiYWdlXCIgZGVzYylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLCBjb2x1bW5zLm1hcChwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gZm9yIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogICAub24oJ3BlcnNvbicpXG4gICAgICogICAuZXhwcmVzc2lvbihzcWxgZmlyc3RfbmFtZSBDT0xMQVRFIFwiZmlfRklcImApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgaW5kZXggXCJwZXJzb25fZmlyc3RfbmFtZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKGZpcnN0X25hbWUgQ09MTEFURSBcImZpX0ZJXCIpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZSwgW1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKGluZGV4VHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHVzaW5nOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoaW5kZXhUeXBlKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLm5vZGUsIHRyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSwgdGhpcy4jcHJvcHMucXVlcnlJZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENyZWF0ZVNjaGVtYU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtc2NoZW1hLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZVNjaGVtYUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmTm90RXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVNjaGVtYUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVTY2hlbWFOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlmTm90RXhpc3RzOiB0cnVlIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWNvbW1pdC1hY3Rpb24tcGFyc2UuZC50c1wiIC8+XG5pbXBvcnQgeyBPTl9DT01NSVRfQUNUSU9OUywgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPbkNvbW1pdEFjdGlvbihhY3Rpb24pIHtcbiAgICBpZiAoT05fQ09NTUlUX0FDVElPTlMuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgT25Db21taXRBY3Rpb24gJHthY3Rpb259YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10YWJsZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tZGVmaW5pdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IENyZWF0ZVRhYmxlTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciB9IGZyb20gJy4vY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIG5vb3AgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltYXJ5LWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgVW5pcXVlQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS91bmlxdWUtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jaGVjay1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VPbkNvbW1pdEFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1jb21taXQtYWN0aW9uLXBhcnNlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciwgfSBmcm9tICcuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnLi4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vY2hlY2stY29uc3RyYWludC1idWlsZGVyLmpzJztcbi8qKlxuICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGBjcmVhdGUgdGFibGVgIHF1ZXJ5LlxuICovXG5leHBvcnQgY2xhc3MgQ3JlYXRlVGFibGVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcInRlbXBvcmFyeVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHRhYmxlLlxuICAgICAqL1xuICAgIHRlbXBvcmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0ZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gXCJvbiBjb21taXRcIiBzdGF0ZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGVtcG9yYXJ5IHRhYmxlcyBvbiBzdXBwb3J0ZWQgZGF0YWJhc2VzXG4gICAgICogbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqL1xuICAgIG9uQ29tbWl0KG9uQ29tbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgb25Db21taXQ6IHBhcnNlT25Db21taXRBY3Rpb24ob25Db21taXQpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImlmIG5vdCBleGlzdHNcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgaXMgdGhyb3duIGlmIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZk5vdEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wuYXV0b0luY3JlbWVudCgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig1MCknLCAoY29sKSA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScpXG4gICAgICogICAuYWRkQ29sdW1uKCdiYW5rX2JhbGFuY2UnLCAnbnVtZXJpYyg4LCAyKScpXG4gICAgICogICAvLyBZb3UgY2FuIHNwZWNpZnkgYW55IGRhdGEgdHlwZSB1c2luZyB0aGUgYHNxbGAgdGFnIGlmIHRoZSB0eXBlc1xuICAgICAqICAgLy8gZG9uJ3QgaW5jbHVkZSBpdC5cbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2RhdGEnLCBzcWxgYW55X3R5cGVfaGVyZWApXG4gICAgICogICAuYWRkQ29sdW1uKCdwYXJlbnRfaWQnLCAnaW50ZWdlcicsIChjb2wpID0+XG4gICAgICogICAgIGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKS5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaXRoIHRoaXMgbWV0aG9kLCBpdCdzIG9uY2UgYWdhaW4gZ29vZCB0byByZW1lbWJlciB0aGF0IEt5c2VseSBqdXN0IGJ1aWxkcyB0aGVcbiAgICAgKiBxdWVyeSBhbmQgZG9lc24ndCBwcm92aWRlIHRoZSBzYW1lIEFQSSBmb3IgYWxsIGRhdGFiYXNlcy4gRm9yIGV4YW1wbGUsIHNvbWVcbiAgICAgKiBkYXRhYmFzZXMgbGlrZSBvbGRlciBNeVNRTCBkb24ndCBzdXBwb3J0IHRoZSBgcmVmZXJlbmNlc2Agc3RhdGVtZW50IGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uLiBJbnN0ZWFkIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIG5lZWQgdG8gYmUgZGVmaW5lZCBpbiB0aGVcbiAgICAgKiBgY3JlYXRlIHRhYmxlYCBxdWVyeS4gU2VlIHRoZSBuZXh0IGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdwYXJlbnRfaWQnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoXG4gICAgICogICAgICdwZXJzb25fcGFyZW50X2lkX2ZrJyxcbiAgICAgKiAgICAgWydwYXJlbnRfaWQnXSxcbiAgICAgKiAgICAgJ3BlcnNvbicsXG4gICAgICogICAgIFsnaWQnXSxcbiAgICAgKiAgICAgKGNiKSA9PiBjYi5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbm90aGVyIGdvb2QgZXhhbXBsZSBpcyB0aGF0IFBvc3RncmVTUUwgZG9lc24ndCBzdXBwb3J0IHRoZSBgYXV0b19pbmNyZW1lbnRgXG4gICAgICoga2V5d29yZCBhbmQgeW91IG5lZWQgdG8gZGVmaW5lIGFuIGF1dG9pbmNyZW1lbnRpbmcgY29sdW1uIGZvciBleGFtcGxlIHVzaW5nXG4gICAgICogYHNlcmlhbGA6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnc2VyaWFsJywgKGNvbCkgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRDb2x1bW4oY29sdW1uTmFtZSwgZGF0YVR5cGUsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb2x1bW5CdWlsZGVyID0gYnVpbGQobmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNyZWF0ZShjb2x1bW5OYW1lLCBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbih0aGlzLiNwcm9wcy5ub2RlLCBjb2x1bW5CdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBwcmltYXJ5IGtleSBjb25zdHJhaW50IGZvciBvbmUgb3IgbW9yZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkUHJpbWFyeUtleUNvbnN0cmFpbnQoJ3ByaW1hcnlfa2V5JywgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZFByaW1hcnlLZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbnN0cmFpbnQodGhpcy4jcHJvcHMubm9kZSwgY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHVuaXF1ZSBjb25zdHJhaW50IGZvciBvbmUgb3IgbW9yZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkVW5pcXVlQ29uc3RyYWludChcbiAgICAgKiAgICAgJ2ZpcnN0X25hbWVfbGFzdF9uYW1lX3VuaXF1ZScsXG4gICAgICogICAgIFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gZGlhbGVjdHMgc3VjaCBhcyBQb3N0Z3JlU1FMIHlvdSBjYW4gc3BlY2lmeSBgbnVsbHMgbm90IGRpc3RpbmN0YCBhcyBmb2xsb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRVbmlxdWVDb25zdHJhaW50KFxuICAgICAqICAgICAnZmlyc3RfbmFtZV9sYXN0X25hbWVfdW5pcXVlJyxcbiAgICAgKiAgICAgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddLFxuICAgICAqICAgICAoY2IpID0+IGNiLm51bGxzTm90RGlzdGluY3QoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIHVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGVjayBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgnYW5pbWFsJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ251bWJlcl9vZl9sZWdzJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZENoZWNrQ29uc3RyYWludCgnY2hlY2tfbGVncycsIHNxbGBudW1iZXJfb2ZfbGVncyA8IDVgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZENoZWNrQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY2hlY2tFeHByZXNzaW9uLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgQ2hlY2tDb25zdHJhaW50QnVpbGRlcihDaGVja0NvbnN0cmFpbnROb2RlLmNyZWF0ZShjaGVja0V4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmb3JlaWduIGtleSBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZCcsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRGb3JlaWduS2V5Q29uc3RyYWludChcbiAgICAgKiAgICAgJ293bmVyX2lkX2ZvcmVpZ24nLFxuICAgICAqICAgICBbJ293bmVyX2lkJ10sXG4gICAgICogICAgICdwZXJzb24nLFxuICAgICAqICAgICBbJ2lkJ10sXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBZGQgY29uc3RyYWludCBmb3IgbXVsdGlwbGUgY29sdW1uczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZDEnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZDInLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoXG4gICAgICogICAgICdvd25lcl9pZF9mb3JlaWduJyxcbiAgICAgKiAgICAgWydvd25lcl9pZDEnLCAnb3duZXJfaWQyJ10sXG4gICAgICogICAgICdwZXJzb24nLFxuICAgICAqICAgICBbJ2lkMScsICdpZDInXSxcbiAgICAgKiAgICAgKGNiKSA9PiBjYi5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIHRhcmdldFRhYmxlLCB0YXJnZXRDb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIHBhcnNlVGFibGUodGFyZ2V0VGFibGUpLCB0YXJnZXRDb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVlcnkgX19hZnRlcl9fIHRoZSBgY3JlYXRlYCBrZXl3b3JkLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIHRlbXBvcmFyeX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAubW9kaWZ5RnJvbnQoc3FsYGdsb2JhbCB0ZW1wb3JhcnlgKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDY0KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZXMpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGdsb2JhbCB0ZW1wb3JhcnkgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiIHZhcmNoYXIoNjQpIG5vdCBudWxsLFxuICAgICAqICAgXCJsYXN0X25hbWVcIiB2YXJjaGFyKDY0KSBub3QgbnVsbFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlGcm9udChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhGcm9udE1vZGlmaWVyKHRoaXMuI3Byb3BzLm5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBvbkNvbW1pdH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcig2NCknLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsYGNvbGxhdGUgdXRmOF91bmljb2RlX2NpYClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgYGZpcnN0X25hbWVgIHZhcmNoYXIoNjQpIG5vdCBudWxsLFxuICAgICAqICAgYGxhc3RfbmFtZWAgdmFyY2hhcig2NCkgbm90IG51bGxcbiAgICAgKiApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLm5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyB0byBjcmVhdGUgdGFibGUgZnJvbSBgc2VsZWN0YCBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgnY29weScpXG4gICAgICogICAudGVtcG9yYXJ5KClcbiAgICAgKiAgIC5hcyhkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0ZW1wb3JhcnkgdGFibGUgXCJjb3B5XCIgYXNcbiAgICAgKiBzZWxlY3QgXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXMoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHNlbGVjdFF1ZXJ5OiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgndGVzdCcpXG4gICAgICogICAuJGNhbGwoKGJ1aWxkZXIpID0+IGJ1aWxkZXIuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcmV1c2FibGUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB3aXRoIGEgYnVpbGRlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgdHlwZSBDcmVhdGVUYWJsZUJ1aWxkZXIsIHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGFkZERlZmF1bHRDb2x1bW5zID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgICAqICAgcmV0dXJuIGN0YlxuICAgICAqICAgICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgICAgLmFkZENvbHVtbignY3JlYXRlZF9hdCcsICdkYXRlJywgKGNvbCkgPT5cbiAgICAgKiAgICAgICBjb2wubm90TnVsbCgpLmRlZmF1bHRUbyhzcWxgbm93KClgKVxuICAgICAqICAgICApXG4gICAgICogICAgIC5hZGRDb2x1bW4oJ3VwZGF0ZWRfYXQnLCAnZGF0ZScsIChjb2wpID0+XG4gICAgICogICAgICAgY29sLm5vdE51bGwoKS5kZWZhdWx0VG8oc3FsYG5vdygpYClcbiAgICAgKiAgICAgKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCd0ZXN0JylcbiAgICAgKiAgIC4kY2FsbChhZGREZWZhdWx0Q29sdW1ucylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BJbmRleE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BJbmRleEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdGFibGUgdGhlIGluZGV4IHdhcyBjcmVhdGVkIGZvci4gVGhpcyBpcyBub3QgbmVlZGVkXG4gICAgICogaW4gYWxsIGRpYWxlY3RzLlxuICAgICAqL1xuICAgIG9uKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcGFyc2VUYWJsZSh0YWJsZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1zY2hlbWEtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHJvcFNjaGVtYUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BTY2hlbWFCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFNjaGVtYU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZkV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FzY2FkZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BTY2hlbWFOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BUYWJsZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVWaWV3Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVmlld05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uZC50c1wiIC8+XG5pbXBvcnQgeyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi9pbW1lZGlhdGUtdmFsdWUtdHJhbnNmb3JtZXIuanMnO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFsbCBWYWx1ZU5vZGVzIHRvIGltbWVkaWF0ZS5cbiAqXG4gKiBXQVJOSU5HISBUaGlzIHNob3VsZCBuZXZlciBiZSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMuXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEltbWVkaWF0ZVZhbHVlUGx1Z2luIHtcbiAgICAjdHJhbnNmb3JtZXIgPSBuZXcgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lcigpO1xuICAgIHRyYW5zZm9ybVF1ZXJ5KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUoYXJncy5ub2RlLCBhcmdzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZXN1bHQoYXJncykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFyZ3MucmVzdWx0KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS12aWV3LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VDb2x1bW5OYW1lIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgSW1tZWRpYXRlVmFsdWVQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZVZpZXdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcInRlbXBvcmFyeVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHZpZXcuXG4gICAgICovXG4gICAgdGVtcG9yYXJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0ZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGltcGxlbWVudGVkIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuIE9uIG1vc3QgZGlhbGVjdHMsIHVzZSB7QGxpbmsgb3JSZXBsYWNlfS5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZOb3RFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9yUmVwbGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgb3JSZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucy5tYXAocGFyc2VDb2x1bW5OYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2VsZWN0IHF1ZXJ5IG9yIGEgYHZhbHVlc2Agc3RhdGVtZW50IHRoYXQgY3JlYXRlcyB0aGUgdmlldy5cbiAgICAgKlxuICAgICAqIFdBUk5JTkchXG4gICAgICogU29tZSBkaWFsZWN0cyBkb24ndCBzdXBwb3J0IHBhcmFtZXRlcml6ZWQgcXVlcmllcyBpbiBEREwgc3RhdGVtZW50cyBhbmQgdGhlcmVmb3JlXG4gICAgICogdGhlIHF1ZXJ5IG9yIHJhdyB7QGxpbmsgc3FsIH0gZXhwcmVzc2lvbiBwYXNzZWQgaGVyZSBpcyBpbnRlcnBvbGF0ZWQgaW50byBhIHNpbmdsZVxuICAgICAqIHN0cmluZyBvcGVuaW5nIGFuIFNRTCBpbmplY3Rpb24gdnVsbmVyYWJpbGl0eS4gRE8gTk9UIHBhc3MgdW5jaGVja2VkIHVzZXIgaW5wdXRcbiAgICAgKiBpbnRvIHRoZSBxdWVyeSBvciByYXcgZXhwcmVzc2lvbiBwYXNzZWQgdG8gdGhpcyBtZXRob2QhXG4gICAgICovXG4gICAgYXMocXVlcnkpIHtcbiAgICAgICAgY29uc3QgcXVlcnlOb2RlID0gcXVlcnlcbiAgICAgICAgICAgIC53aXRoUGx1Z2luKG5ldyBJbW1lZGlhdGVWYWx1ZVBsdWdpbigpKVxuICAgICAgICAgICAgLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhczogcXVlcnlOb2RlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC12aWV3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFZpZXdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVmlld05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcFZpZXcsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3Atdmlldy1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC12aWV3LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BWaWV3QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgbWF0ZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi92YWx1ZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVHlwZU5vZGUnLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbnVtKGNyZWF0ZVR5cGUsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVR5cGUsXG4gICAgICAgICAgICBlbnVtOiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdHlwZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdHlwZS1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBDcmVhdGVUeXBlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW51bSB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYS5jcmVhdGVUeXBlKCdzcGVjaWVzJykuYXNFbnVtKFsnY2F0JywgJ2RvZycsICdmcm9nJ10pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXNFbnVtKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVHlwZU5vZGUuY2xvbmVXaXRoRW51bSh0aGlzLiNwcm9wcy5ub2RlLCB2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFR5cGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BUeXBlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wVHlwZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXR5cGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BUeXBlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtdHlwZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wVHlwZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaWRlbnRpZmllci1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2NoZW1hYmxlSWRlbnRpZmllcihpZCkge1xuICAgIGNvbnN0IFNDSEVNQV9TRVBBUkFUT1IgPSAnLic7XG4gICAgaWYgKGlkLmluY2x1ZGVzKFNDSEVNQV9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gaWQuc3BsaXQoU0NIRU1BX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlV2l0aFNjaGVtYShwYXJ0c1swXSwgcGFydHNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNjaGVtYWJsZSBpZGVudGlmaWVyICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUoaWQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImNvbmN1cnJlbnRseVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gcmVmcmVzaCB0aGUgdmlldyB3aXRob3V0IGxvY2tpbmcgb3V0IGNvbmN1cnJlbnQgc2VsZWN0cyBvbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcuXG4gICAgICpcbiAgICAgKiBXQVJOSU5HIVxuICAgICAqIFRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGUgXCJ3aXRoIG5vIGRhdGFcIiBtb2RpZmllci5cbiAgICAgKi9cbiAgICBjb25jdXJyZW50bHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY29uY3VycmVudGx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHdpdGhOb0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcIndpdGggZGF0YVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogSWYgc3BlY2lmaWVkIChvciBkZWZhdWx0cykgdGhlIGJhY2tpbmcgcXVlcnkgaXMgZXhlY3V0ZWQgdG8gcHJvdmlkZSB0aGUgbmV3IGRhdGEsIGFuZCB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgaXMgbGVmdCBpbiBhIHNjYW5uYWJsZSBzdGF0ZVxuICAgICAqL1xuICAgIHdpdGhEYXRhKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHdpdGhOb0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcIndpdGggbm8gZGF0YVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogSWYgc3BlY2lmaWVkLCBubyBuZXcgZGF0YSBpcyBnZW5lcmF0ZWQgYW5kIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBpcyBsZWZ0IGluIGFuIHVuc2Nhbm5hYmxlIHN0YXRlLlxuICAgICAqXG4gICAgICogV0FSTklORyFcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhlIFwiY29uY3VycmVudGx5XCIgbW9kaWZpZXIuXG4gICAgICovXG4gICAgd2l0aE5vRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB3aXRoTm9EYXRhOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbnRseTogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zY2hlbWEuZC50c1wiIC8+XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZUluZGV4QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLWluZGV4LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXRhYmxlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRHJvcEluZGV4QnVpbGRlciB9IGZyb20gJy4vZHJvcC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BUYWJsZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdGFibGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXZpZXctbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUeXBlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXR5cGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdHlwZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVR5cGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIgfSBmcm9tICcuLi9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1ub2RlLmpzJztcbi8qKlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgYnVpbGRpbmcgZGF0YWJhc2Ugc2NoZW1hLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTW9kdWxlIHtcbiAgICAjZXhlY3V0b3I7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyB0YWJsZSB3aXRoIGNvbHVtbnMgYGlkYCwgYGZpcnN0X25hbWVgLFxuICAgICAqIGBsYXN0X25hbWVgIGFuZCBgZ2VuZGVyYDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcicsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZ2VuZGVyJywgJ3ZhcmNoYXInKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZm9yZWlnbiBrZXkuIE5vdCBhbGwgZGF0YWJhc2VcbiAgICAgKiBlbmdpbmVzIHN1cHBvcnQgY29sdW1uLWxldmVsIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMuXG4gICAgICogRm9yIGV4YW1wbGUgaWYgeW91IGFyZSB1c2luZyBNeVNRTCA1Llggc2VlIHRoZSBuZXh0IGV4YW1wbGUgYWZ0ZXJcbiAgICAgKiB0aGlzIG9uZS5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2xcbiAgICAgKiAgICAgLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpXG4gICAgICogICAgIC5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgYWRkcyBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZm9yIGEgY29sdW1ucyBqdXN0XG4gICAgICogbGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHVzaW5nIGEgdGFibGUtbGV2ZWwgc3RhdGVtZW50LlxuICAgICAqIE9uIE15U1FMIDUuWCB5b3UgbmVlZCB0byBkZWZpbmUgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgbGlrZVxuICAgICAqIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpLmF1dG9JbmNyZW1lbnQoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50KFxuICAgICAqICAgICAncGV0X293bmVyX2lkX2ZvcmVpZ24nLCBbJ293bmVyX2lkJ10sICdwZXJzb24nLCBbJ2lkJ10sXG4gICAgICogICAgIChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVUYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaW5kZXguXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5vbigncGVyc29uJylcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhbiBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkcm9wSW5kZXgoaW5kZXhOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVTY2hlbWEoJ3NvbWVfc2NoZW1hJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVTY2hlbWFOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhIHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wU2NoZW1hKCdzb21lX3NjaGVtYScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wU2NoZW1hTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsdGVyIGEgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hbHRlckNvbHVtbignZmlyc3RfbmFtZScsIChhYykgPT4gYWMuc2V0RGF0YVR5cGUoJ3RleHQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhbHRlclRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVZpZXcoJ2RvZ3MnKVxuICAgICAqICAgLm9yUmVwbGFjZSgpXG4gICAgICogICAuYXMoZGIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0QWxsKCkud2hlcmUoJ3NwZWNpZXMnLCAnPScsICdkb2cnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVWaWV3KHZpZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggYSBtYXRlcmlhbGl6ZWQgdmlldy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5yZWZyZXNoTWF0ZXJpYWxpemVkVmlldygnbXlfdmlldycpXG4gICAgICogICAuY29uY3VycmVudGx5KClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWZyZXNoTWF0ZXJpYWxpemVkVmlldyh2aWV3TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmRyb3BWaWV3KCdkb2dzJylcbiAgICAgKiAgIC5pZkV4aXN0cygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFZpZXcodmlld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNyZWF0ZSh2aWV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgdHlwZS5cbiAgICAgKlxuICAgICAqIE9ubHkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgaGF2ZSB1c2VyLWRlZmluZWQgdHlwZXMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuYXNFbnVtKFsnZG9nJywgJ2NhdCcsICdmcm9nJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlVHlwZSh0eXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVR5cGVOb2RlLmNyZWF0ZShwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIodHlwZU5hbWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0eXBlLlxuICAgICAqXG4gICAgICogT25seSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBoYXZlIHVzZXItZGVmaW5lZCB0eXBlcy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuaWZFeGlzdHMoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BUeXBlKHR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jcmVhdGUocGFyc2VTY2hlbWFibGVJZGVudGlmaWVyKHR5cGVOYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYU1vZHVsZSh0aGlzLiNleGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIFF1ZXJ5Q3JlYXRvci53aXRoU2NoZW1hfVxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R5bmFtaWMuZC50c1wiIC8+XG5pbXBvcnQgeyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlciB9IGZyb20gJy4vZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNNb2R1bGUge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkeW5hbWljIHJlZmVyZW5jZSB0byBhIGNvbHVtbiB0aGF0IGlzIG5vdCBrbm93IGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKlxuICAgICAqIEt5c2VseSBpcyBidWlsdCBpbiBhIHdheSB0aGF0IGJ5IGRlZmF1bHQgeW91IGNhbid0IHJlZmVyIHRvIHRhYmxlcyBvciBjb2x1bW5zXG4gICAgICogdGhhdCBhcmUgbm90IGFjdHVhbGx5IHZpc2libGUgaW4gdGhlIGN1cnJlbnQgcXVlcnkgYW5kIGNvbnRleHQuIFRoaXMgaXMgYWxsXG4gICAgICogZG9uZSBieSBUeXBlU2NyaXB0IGF0IGNvbXBpbGUgdGltZSwgd2hpY2ggbWVhbnMgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZVxuICAgICAqIGNvbHVtbnMgYW5kIHRhYmxlcyBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgbm90IGFsd2F5cyB0aGUgY2FzZSBvZiBjb3Vyc2UuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBjb2x1bW4gbmFtZXNcbiAgICAgKiBjb21lIGZyb20gdGhlIHVzZXIgaW5wdXQgb3IgYXJlIG5vdCBvdGhlcndpc2Uga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqXG4gICAgICogV0FSTklORyEgVW5saWtlIHZhbHVlcywgY29sdW1uIG5hbWVzIGFyZSBub3QgZXNjYXBlZCBieSB0aGUgZGF0YWJhc2UgZW5naW5lXG4gICAgICogb3IgS3lzZWx5IGFuZCBpZiB5b3UgcGFzcyBpbiB1bmNoZWNrZWQgY29sdW1uIG5hbWVzIHVzaW5nIHRoaXMgbWV0aG9kLCB5b3VcbiAgICAgKiBjcmVhdGUgYW4gU1FMIGluamVjdGlvbiB2dWxuZXJhYmlsaXR5LiBBbHdheXMgX19hbHdheXNfXyB2YWxpZGF0ZSB0aGUgdXNlclxuICAgICAqIGlucHV0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogVGhlcmUgYXJlIGNvdXBsZSBvZiBleGFtcGxlcyBiZWxvdyBmb3Igc29tZSB1c2UgY2FzZXMsIGJ1dCB5b3UgY2FuIHBhc3NcbiAgICAgKiBgcmVmYCB0byBvdGhlciBtZXRob2RzIGFzIHdlbGwuIElmIHRoZSB0eXBlcyBhbGxvdyB5b3UgdG8gcGFzcyBhIGByZWZgXG4gICAgICogdmFsdWUgdG8gc29tZSBwbGFjZSwgaXQgc2hvdWxkIHdvcmsuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIEZpbHRlciBieSBhIGNvbHVtbiBub3Qga25vdyBhdCBjb21waWxlIHRpbWU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHNvbWVRdWVyeShmaWx0ZXJDb2x1bW46IHN0cmluZywgZmlsdGVyVmFsdWU6IHN0cmluZykge1xuICAgICAqICAgY29uc3QgeyByZWYgfSA9IGRiLmR5bmFtaWNcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLndoZXJlKHJlZihmaWx0ZXJDb2x1bW4pLCAnPScsIGZpbHRlclZhbHVlKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmaXJzdF9uYW1lJywgJ0Fybm9sZCcpXG4gICAgICogc29tZVF1ZXJ5KCdwZXJzb24ubGFzdF9uYW1lJywgJ0FuaXN0b24nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogT3JkZXIgYnkgYSBjb2x1bW4gbm90IGtub3cgYXQgY29tcGlsZSB0aW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBzb21lUXVlcnkob3JkZXJCeTogc3RyaW5nKSB7XG4gICAgICogICBjb25zdCB7IHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC5zZWxlY3QoJ3BlcnNvbi5maXJzdF9uYW1lIGFzIGZuJylcbiAgICAgKiAgICAgLm9yZGVyQnkocmVmKG9yZGVyQnkpKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2UgYWRkIHNlbGVjdGlvbnMgZHluYW1pY2FsbHk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgcmVmIH0gPSBkYi5keW5hbWljXG4gICAgICpcbiAgICAgKiAvLyBTb21lIGNvbHVtbiBuYW1lIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBWYWx1ZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqIGNvbnN0IGNvbHVtbkZyb21Vc2VySW5wdXQ6IFBvc3NpYmxlQ29sdW1ucyA9ICdiaXJ0aGRhdGUnO1xuICAgICAqXG4gICAgICogLy8gQSB0eXBlIHRoYXQgbGlzdHMgYWxsIHBvc3NpYmxlIHZhbHVlcyBgY29sdW1uRnJvbVVzZXJJbnB1dGAgY2FuIGhhdmUuXG4gICAgICogLy8gWW91IGNhbiB1c2UgYGtleW9mIFBlcnNvbmAgaWYgYW55IGNvbHVtbiBvZiBhbiBpbnRlcmZhY2UgaXMgYWxsb3dlZC5cbiAgICAgKiB0eXBlIFBvc3NpYmxlQ29sdW1ucyA9ICdsYXN0X25hbWUnIHwgJ2ZpcnN0X25hbWUnIHwgJ2JpcnRoZGF0ZSdcbiAgICAgKlxuICAgICAqIGNvbnN0IFtwZXJzb25dID0gYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICByZWY8UG9zc2libGVDb2x1bW5zPihjb2x1bW5Gcm9tVXNlcklucHV0KSxcbiAgICAgKiAgICAgJ2lkJ1xuICAgICAqICAgXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHRpbmcgdHlwZSBjb250YWlucyBhbGwgYFBvc3NpYmxlQ29sdW1uc2AgYXMgb3B0aW9uYWwgZmllbGRzXG4gICAgICogLy8gYmVjYXVzZSB3ZSBjYW5ub3Qga25vdyB3aGljaCBmaWVsZCB3YXMgYWN0dWFsbHkgc2VsZWN0ZWQgYmVmb3JlXG4gICAgICogLy8gcnVubmluZyB0aGUgY29kZS5cbiAgICAgKiBjb25zdCBsYXN0TmFtZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHBlcnNvbj8ubGFzdF9uYW1lXG4gICAgICogY29uc3QgZmlyc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwZXJzb24/LmZpcnN0X25hbWVcbiAgICAgKiBjb25zdCBiaXJ0aERhdGU6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkID0gcGVyc29uPy5iaXJ0aGRhdGVcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHQgdHlwZSBhbHNvIGNvbnRhaW5zIHRoZSBjb21waWxlIHRpbWUgc2VsZWN0aW9uIGBpZGAuXG4gICAgICogcGVyc29uPy5pZFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlZihyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihyZWZlcmVuY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGFibGUgcmVmZXJlbmNlIHRvIGEgdGFibGUgdGhhdCdzIG5vdCBmdWxseSBrbm93biBhdCBjb21waWxlIHRpbWUuXG4gICAgICpcbiAgICAgKiBUaGUgdHlwZSBgVGAgaXMgYWxsb3dlZCB0byBiZSBhIHVuaW9uIG9mIG11bHRpcGxlIHRhYmxlcy5cbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJzZWxlY3RcIiwgXCJHZW5lcmljIGZpbmQgcXVlcnlcIiwgMTMwKSAtLT5cbiAgICAgKlxuICAgICAqIEEgZ2VuZXJpYyB0eXBlLXNhZmUgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIGEgcm93IGJ5IGEgY29sdW1uIHZhbHVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBTZWxlY3RUeXBlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBnZXRSb3dCeUNvbHVtbjxcbiAgICAgKiAgIFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSxcbiAgICAgKiAgIEMgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZVtUXSAmIHN0cmluZyxcbiAgICAgKiAgIFYgZXh0ZW5kcyBTZWxlY3RUeXBlPERhdGFiYXNlW1RdW0NdPixcbiAgICAgKiA+KHQ6IFQsIGM6IEMsIHY6IFYpIHtcbiAgICAgKiAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBkeW5hbWljIG1vZHVsZSBzaW5jZSB0aGUgdGFibGUgbmFtZVxuICAgICAqICAgLy8gaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKiAgIGNvbnN0IHsgdGFibGUsIHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20odGFibGUodCkuYXMoJ3QnKSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC53aGVyZShyZWYoYyksICc9JywgdilcbiAgICAgKiAgICAgLm9yZGVyQnkoJ3QuaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGdldFJvd0J5Q29sdW1uKCdwZXJzb24nLCAnZmlyc3RfbmFtZScsICdBcm5vbGQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY1RhYmxlQnVpbGRlcih0YWJsZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB7XG4gICAgI2RyaXZlcjtcbiAgICBjb25zdHJ1Y3Rvcihkcml2ZXIpIHtcbiAgICAgICAgdGhpcy4jZHJpdmVyID0gZHJpdmVyO1xuICAgIH1cbiAgICBhc3luYyBwcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcikge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy4jZHJpdmVyLmFjcXVpcmVDb25uZWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY29uc3VtZXIoY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkcml2ZXIucmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBRdWVyeUV4ZWN1dG9yQmFzZSB9IGZyb20gJy4vcXVlcnktZXhlY3V0b3ItYmFzZS5qcyc7XG5leHBvcnQgY2xhc3MgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgZXh0ZW5kcyBRdWVyeUV4ZWN1dG9yQmFzZSB7XG4gICAgI2NvbXBpbGVyO1xuICAgICNhZGFwdGVyO1xuICAgICNjb25uZWN0aW9uUHJvdmlkZXI7XG4gICAgY29uc3RydWN0b3IoY29tcGlsZXIsIGFkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgcGx1Z2lucyA9IFtdKSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbnMpO1xuICAgICAgICB0aGlzLiNjb21waWxlciA9IGNvbXBpbGVyO1xuICAgICAgICB0aGlzLiNhZGFwdGVyID0gYWRhcHRlcjtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyID0gY29ubmVjdGlvblByb3ZpZGVyO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FkYXB0ZXI7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIucHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IodGhpcy4jY29tcGlsZXIsIHRoaXMuI2FkYXB0ZXIsIHRoaXMuI2Nvbm5lY3Rpb25Qcm92aWRlciwgWy4uLnRoaXMucGx1Z2lucywgLi4ucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFsuLi50aGlzLnBsdWdpbnMsIHBsdWdpbl0pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luQXRGcm9udChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyLCBbcGx1Z2luLCAuLi50aGlzLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aENvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgY29ubmVjdGlvblByb3ZpZGVyLCBbLi4udGhpcy5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFtdKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BlcmZvcm1hbmNlLW5vdy5kLnRzXCIgLz5cbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7XG4gICAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNGdW5jdGlvbihwZXJmb3JtYW5jZS5ub3cpKSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcnVudGltZS1kcml2ZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwZXJmb3JtYW5jZU5vdyB9IGZyb20gJy4uL3V0aWwvcGVyZm9ybWFuY2Utbm93LmpzJztcbi8qKlxuICogQSBzbWFsbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgRHJpdmVyfSB0aGF0IG1ha2VzIHN1cmUgdGhlIGRyaXZlciBpc1xuICogaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIHVzZWQsIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIGRlc3Ryb3llZFxuICogb25jZSBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRHJpdmVyIHtcbiAgICAjZHJpdmVyO1xuICAgICNsb2c7XG4gICAgI2luaXRQcm9taXNlO1xuICAgICNpbml0RG9uZTtcbiAgICAjZGVzdHJveVByb21pc2U7XG4gICAgI2Nvbm5lY3Rpb25zID0gbmV3IFdlYWtTZXQoKTtcbiAgICBjb25zdHJ1Y3Rvcihkcml2ZXIsIGxvZykge1xuICAgICAgICB0aGlzLiNpbml0RG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNkcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIHRoaXMuI2xvZyA9IGxvZztcbiAgICB9XG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rlc3Ryb3lQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RyaXZlciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy4jaW5pdFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRQcm9taXNlID0gdGhpcy4jZHJpdmVyXG4gICAgICAgICAgICAgICAgLmluaXQoKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNpbml0RG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaW5pdFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNpbml0UHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLiNkZXN0cm95UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkcml2ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2luaXREb25lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy4jZHJpdmVyLmFjcXVpcmVDb25uZWN0aW9uKCk7XG4gICAgICAgIGlmICghdGhpcy4jY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jbmVlZHNMb2dnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRMb2dnaW5nKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBhc3luYyByZWxlYXNlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2RyaXZlci5yZWxlYXNlQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLCBzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLmJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBjb21taXRUcmFuc2FjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkcml2ZXIuY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5zYXZlcG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkcml2ZXIuc2F2ZXBvaW50KGNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIGNvbXBpbGVRdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHNhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgcm9sbGJhY2tUb1NhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5yb2xsYmFja1RvU2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgcm9sbGJhY2tUb1NhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgcmVsZWFzZVNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5yZWxlYXNlU2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJlbGVhc2VTYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgcmVsZWFzZVNhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNpbml0UHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2luaXRQcm9taXNlO1xuICAgICAgICBpZiAoIXRoaXMuI2Rlc3Ryb3lQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNkZXN0cm95UHJvbWlzZSA9IHRoaXMuI2RyaXZlci5kZXN0cm95KCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rlc3Ryb3lQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jZGVzdHJveVByb21pc2U7XG4gICAgfVxuICAgICNuZWVkc0xvZ2dpbmcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jbG9nLmlzTGV2ZWxFbmFibGVkKCdxdWVyeScpIHx8IHRoaXMuI2xvZy5pc0xldmVsRW5hYmxlZCgnZXJyb3InKSk7XG4gICAgfVxuICAgIC8vIFRoaXMgbWV0aG9kIG1vbmtleSBwYXRjaGVzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uJ3MgZXhlY3V0ZVF1ZXJ5IG1ldGhvZFxuICAgIC8vIGJ5IGFkZGluZyBsb2dnaW5nIGNvZGUgYXJvdW5kIGl0LiBNb25rZXkgcGF0Y2hpbmcgaXMgbm90IHByZXR0eSwgYnV0IGl0J3NcbiAgICAvLyB0aGUgYmVzdCBvcHRpb24gaW4gdGhpcyBjYXNlLlxuICAgICNhZGRMb2dnaW5nKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZXhlY3V0ZVF1ZXJ5ID0gY29ubmVjdGlvbi5leGVjdXRlUXVlcnk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVF1ZXJ5ID0gY29ubmVjdGlvbi5zdHJlYW1RdWVyeTtcbiAgICAgICAgY29uc3QgZGlzID0gdGhpcztcbiAgICAgICAgY29ubmVjdGlvbi5leGVjdXRlUXVlcnkgPSBhc3luYyAoY29tcGlsZWRRdWVyeSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNhdWdodEVycm9yO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVRdWVyeS5jYWxsKGNvbm5lY3Rpb24sIGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXVnaHRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25uZWN0aW9uLnN0cmVhbVF1ZXJ5ID0gYXN5bmMgZnVuY3Rpb24qIChjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpIHtcbiAgICAgICAgICAgIGxldCBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIHN0cmVhbVF1ZXJ5LmNhbGwoY29ubmVjdGlvbiwgY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXVnaHRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyAjbG9nRXJyb3IoZXJyb3IsIGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNsb2cuZXJyb3IoKCkgPT4gKHtcbiAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBxdWVyeTogY29tcGlsZWRRdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5RHVyYXRpb25NaWxsaXM6IHRoaXMuI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgYXN5bmMgI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSwgaXNTdHJlYW0gPSBmYWxzZSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNsb2cucXVlcnkoKCkgPT4gKHtcbiAgICAgICAgICAgIGxldmVsOiAncXVlcnknLFxuICAgICAgICAgICAgaXNTdHJlYW0sXG4gICAgICAgICAgICBxdWVyeTogY29tcGlsZWRRdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5RHVyYXRpb25NaWxsaXM6IHRoaXMuI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2VOb3coKSAtIHN0YXJ0VGltZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NpbmdsZS1jb25uZWN0aW9uLXByb3ZpZGVyLmQudHNcIiAvPlxuY29uc3QgaWdub3JlRXJyb3IgPSAoKSA9PiB7IH07XG5leHBvcnQgY2xhc3MgU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcnVubmluZ1Byb21pc2U7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgcHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuI3J1bm5pbmdQcm9taXNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5uaW5nUHJvbWlzZS5jYXRjaChpZ25vcmVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYCNydW5uaW5nUHJvbWlzZWAgbXVzdCBiZSBzZXQgdG8gdW5kZWZpbmVkIGJlZm9yZSBpdCdzXG4gICAgICAgIC8vIHJlc29sdmVkIG9yIHJlamVjdGVkLiBPdGhlcndpc2UgdGhlIHdoaWxlIGxvb3AgYWJvdmVcbiAgICAgICAgLy8gd2lsbCBtaXNiZWhhdmUuXG4gICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdGhpcy4jcnVuKGNvbnN1bWVyKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3J1bm5pbmdQcm9taXNlO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIHJ1bm5lciBpbiBhbiBhc3luYyBmdW5jdGlvbiB0byBtYWtlIHN1cmUgaXQgZG9lc24ndFxuICAgIC8vIHRocm93IHN5bmNocm9ub3VzIGVycm9ycy5cbiAgICBhc3luYyAjcnVuKHJ1bm5lcikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVubmVyKHRoaXMuI2Nvbm5lY3Rpb24pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJpdmVyLmQudHNcIiAvPlxuZXhwb3J0IGNvbnN0IFRSQU5TQUNUSU9OX0FDQ0VTU19NT0RFUyA9IFsncmVhZCBvbmx5JywgJ3JlYWQgd3JpdGUnXTtcbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTID0gW1xuICAgICdyZWFkIHVuY29tbWl0dGVkJyxcbiAgICAncmVhZCBjb21taXR0ZWQnLFxuICAgICdyZXBlYXRhYmxlIHJlYWQnLFxuICAgICdzZXJpYWxpemFibGUnLFxuICAgICdzbmFwc2hvdCcsXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncykge1xuICAgIGlmIChzZXR0aW5ncy5hY2Nlc3NNb2RlICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9BQ0NFU1NfTU9ERVMuaW5jbHVkZXMoc2V0dGluZ3MuYWNjZXNzTW9kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRyYW5zYWN0aW9uIGFjY2VzcyBtb2RlICR7c2V0dGluZ3MuYWNjZXNzTW9kZX1gKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTLmluY2x1ZGVzKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsICR7c2V0dGluZ3MuaXNvbGF0aW9uTGV2ZWx9YCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9sb2cuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUsIGlzRnVuY3Rpb24gfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5jb25zdCBsb2dMZXZlbHMgPSBbJ3F1ZXJ5JywgJ2Vycm9yJ107XG5leHBvcnQgY29uc3QgTE9HX0xFVkVMUyA9IGZyZWV6ZShsb2dMZXZlbHMpO1xuZXhwb3J0IGNsYXNzIExvZyB7XG4gICAgI2xldmVscztcbiAgICAjbG9nZ2VyO1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLiNsZXZlbHMgPSBmcmVlemUoe1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBkZWZhdWx0TG9nZ2VyO1xuICAgICAgICAgICAgdGhpcy4jbGV2ZWxzID0gZnJlZXplKHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29uZmlnLmluY2x1ZGVzKCdxdWVyeScpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBjb25maWcuaW5jbHVkZXMoJ2Vycm9yJyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0xldmVsRW5hYmxlZChsZXZlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGV2ZWxzW2xldmVsXTtcbiAgICB9XG4gICAgYXN5bmMgcXVlcnkoZ2V0RXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2xldmVscy5xdWVyeSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jbG9nZ2VyKGdldEV2ZW50KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGVycm9yKGdldEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNsZXZlbHMuZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2xvZ2dlcihnZXRFdmVudCgpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGRlZmF1bHRMb2dnZXIoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQubGV2ZWwgPT09ICdxdWVyeScpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gYGt5c2VseTpxdWVyeToke2V2ZW50LmlzU3RyZWFtID8gJ3N0cmVhbTonIDogJyd9YDtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSAke2V2ZW50LnF1ZXJ5LnNxbH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSBkdXJhdGlvbjogJHtldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLnRvRml4ZWQoMSl9bXNgKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQubGV2ZWwgPT09ICdlcnJvcicpIHtcbiAgICAgICAgaWYgKGV2ZW50LmVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGt5c2VseTplcnJvcjogJHtldmVudC5lcnJvci5zdGFjayA/PyBldmVudC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihga3lzZWx5OmVycm9yOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXZlbnQuZXJyb3IsXG4gICAgICAgICAgICAgICAgcXVlcnk6IGV2ZW50LnF1ZXJ5LnNxbCxcbiAgICAgICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiBldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbXBpbGFibGUuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBpbGFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzRnVuY3Rpb24odmFsdWUuY29tcGlsZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2t5c2VseS5kLnRzXCIgLz5cbmltcG9ydCB7IFNjaGVtYU1vZHVsZSB9IGZyb20gJy4vc2NoZW1hL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlIH0gZnJvbSAnLi9keW5hbWljL2R5bmFtaWMuanMnO1xuaW1wb3J0IHsgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB9IGZyb20gJy4vZHJpdmVyL2RlZmF1bHQtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyBRdWVyeUNyZWF0b3IgfSBmcm9tICcuL3F1ZXJ5LWNyZWF0b3IuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgfSBmcm9tICcuL3F1ZXJ5LWV4ZWN1dG9yL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc09iamVjdCwgaXNVbmRlZmluZWQgfSBmcm9tICcuL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJ1bnRpbWVEcml2ZXIgfSBmcm9tICcuL2RyaXZlci9ydW50aW1lLWRyaXZlci5qcyc7XG5pbXBvcnQgeyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIgfSBmcm9tICcuL2RyaXZlci9zaW5nbGUtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3MsIH0gZnJvbSAnLi9kcml2ZXIvZHJpdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlLCB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMnO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi91dGlsL2xvZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGlzQ29tcGlsYWJsZSB9IGZyb20gJy4vdXRpbC9jb21waWxhYmxlLmpzJztcbmltcG9ydCB7IENhc2VCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL2Nhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiB9IGZyb20gJy4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhTY2hlbWFQbHVnaW4gfSBmcm9tICcuL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uLCB9IGZyb20gJy4vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBsb2dPbmNlIH0gZnJvbSAnLi91dGlsL2xvZy1vbmNlLmpzJztcbi8vIEB0cy1pZ25vcmVcblN5bWJvbC5hc3luY0Rpc3Bvc2UgPz89IFN5bWJvbCgnU3ltYm9sLmFzeW5jRGlzcG9zZScpO1xuLyoqXG4gKiBUaGUgbWFpbiBLeXNlbHkgY2xhc3MuXG4gKlxuICogWW91IHNob3VsZCBjcmVhdGUgb25lIGluc3RhbmNlIG9mIGBLeXNlbHlgIHBlciBkYXRhYmFzZSB1c2luZyB0aGUge0BsaW5rIEt5c2VseX1cbiAqIGNvbnN0cnVjdG9yLiBFYWNoIGBLeXNlbHlgIGluc3RhbmNlIG1haW50YWlucyBpdHMgb3duIGNvbm5lY3Rpb24gcG9vbC5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBUaGlzIGV4YW1wbGUgYXNzdW1lcyB5b3VyIGRhdGFiYXNlIGhhcyBhIFwicGVyc29uXCIgdGFibGU6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCAqIGFzIFNxbGl0ZSBmcm9tICdiZXR0ZXItc3FsaXRlMydcbiAqIGltcG9ydCB7XHUwMEEwdHlwZSBHZW5lcmF0ZWQsIEt5c2VseSwgU3FsaXRlRGlhbGVjdCB9IGZyb20gJ2t5c2VseSdcbiAqXG4gKiBpbnRlcmZhY2UgRGF0YWJhc2Uge1xuICogICBwZXJzb246IHtcbiAqICAgICBpZDogR2VuZXJhdGVkPG51bWJlcj5cbiAqICAgICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAqICAgICBsYXN0X25hbWU6IHN0cmluZyB8IG51bGxcbiAqICAgfVxuICogfVxuICpcbiAqIGNvbnN0IGRiID0gbmV3IEt5c2VseTxEYXRhYmFzZT4oe1xuICogICBkaWFsZWN0OiBuZXcgU3FsaXRlRGlhbGVjdCh7XG4gKiAgICAgZGF0YWJhc2U6IG5ldyBTcWxpdGUoJzptZW1vcnk6JyksXG4gKiAgIH0pXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHR5cGVQYXJhbSBEQiAtIFRoZSBkYXRhYmFzZSBpbnRlcmZhY2UgdHlwZS4gS2V5cyBvZiB0aGlzIHR5cGUgbXVzdCBiZSB0YWJsZSBuYW1lc1xuICogICAgaW4gdGhlIGRhdGFiYXNlIGFuZCB2YWx1ZXMgbXVzdCBiZSBpbnRlcmZhY2VzIHRoYXQgZGVzY3JpYmUgdGhlIHJvd3MgaW4gdGhvc2VcbiAqICAgIHRhYmxlcy4gU2VlIHRoZSBleGFtcGxlcyBhYm92ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEt5c2VseSBleHRlbmRzIFF1ZXJ5Q3JlYXRvciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgbGV0IHN1cGVyUHJvcHM7XG4gICAgICAgIGxldCBwcm9wcztcbiAgICAgICAgaWYgKGlzS3lzZWx5UHJvcHMoYXJncykpIHtcbiAgICAgICAgICAgIHN1cGVyUHJvcHMgPSB7IGV4ZWN1dG9yOiBhcmdzLmV4ZWN1dG9yIH07XG4gICAgICAgICAgICBwcm9wcyA9IHsgLi4uYXJncyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGlhbGVjdCA9IGFyZ3MuZGlhbGVjdDtcbiAgICAgICAgICAgIGNvbnN0IGRyaXZlciA9IGRpYWxlY3QuY3JlYXRlRHJpdmVyKCk7XG4gICAgICAgICAgICBjb25zdCBjb21waWxlciA9IGRpYWxlY3QuY3JlYXRlUXVlcnlDb21waWxlcigpO1xuICAgICAgICAgICAgY29uc3QgYWRhcHRlciA9IGRpYWxlY3QuY3JlYXRlQWRhcHRlcigpO1xuICAgICAgICAgICAgY29uc3QgbG9nID0gbmV3IExvZyhhcmdzLmxvZyA/PyBbXSk7XG4gICAgICAgICAgICBjb25zdCBydW50aW1lRHJpdmVyID0gbmV3IFJ1bnRpbWVEcml2ZXIoZHJpdmVyLCBsb2cpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvblByb3ZpZGVyID0gbmV3IERlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIocnVudGltZURyaXZlcik7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRvciA9IG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcihjb21waWxlciwgYWRhcHRlciwgY29ubmVjdGlvblByb3ZpZGVyLCBhcmdzLnBsdWdpbnMgPz8gW10pO1xuICAgICAgICAgICAgc3VwZXJQcm9wcyA9IHsgZXhlY3V0b3IgfTtcbiAgICAgICAgICAgIHByb3BzID0ge1xuICAgICAgICAgICAgICAgIGNvbmZpZzogYXJncyxcbiAgICAgICAgICAgICAgICBleGVjdXRvcixcbiAgICAgICAgICAgICAgICBkaWFsZWN0LFxuICAgICAgICAgICAgICAgIGRyaXZlcjogcnVudGltZURyaXZlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoc3VwZXJQcm9wcyk7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFNjaGVtYU1vZHVsZX0gbW9kdWxlIGZvciBidWlsZGluZyBkYXRhYmFzZSBzY2hlbWEuXG4gICAgICovXG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFNb2R1bGUodGhpcy4jcHJvcHMuZXhlY3V0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdGhlIHtAbGluayBEeW5hbWljTW9kdWxlfSBtb2R1bGUuXG4gICAgICpcbiAgICAgKiBUaGUge0BsaW5rIER5bmFtaWNNb2R1bGV9IG1vZHVsZSBjYW4gYmUgdXNlZCB0byBieXBhc3Mgc3RyaWN0IHR5cGluZyBhbmRcbiAgICAgKiBwYXNzaW5nIGluIGR5bmFtaWMgdmFsdWVzIGZvciB0aGUgcXVlcmllcy5cbiAgICAgKi9cbiAgICBnZXQgZHluYW1pYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljTW9kdWxlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgRGF0YWJhc2VJbnRyb3NwZWN0b3IgfCBkYXRhYmFzZSBpbnRyb3NwZWN0b3J9LlxuICAgICAqL1xuICAgIGdldCBpbnRyb3NwZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZGlhbGVjdC5jcmVhdGVJbnRyb3NwZWN0b3IodGhpcy53aXRob3V0UGx1Z2lucygpKTtcbiAgICB9XG4gICAgY2FzZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VCdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNyZWF0ZShpc1VuZGVmaW5lZCh2YWx1ZSkgPyB1bmRlZmluZWQgOiBwYXJzZUV4cHJlc3Npb24odmFsdWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgRnVuY3Rpb25Nb2R1bGV9IHRoYXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgc29tZXdoYXQgdHlwZS1zYWZlIGZ1bmN0aW9uXG4gICAgICogY2FsbHMuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgY291bnQgfSA9IGRiLmZuXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLmlubmVySm9pbigncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLnNlbGVjdChbXG4gICAgICogICAgICdpZCcsXG4gICAgICogICAgIGNvdW50KCdwZXQuaWQnKS5hcygncGVyc29uX2NvdW50JyksXG4gICAgICogICBdKVxuICAgICAqICAgLmdyb3VwQnkoJ3BlcnNvbi5pZCcpXG4gICAgICogICAuaGF2aW5nKGNvdW50KCdwZXQuaWQnKSwgJz4nLCAxMClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInBlcnNvblwiLlwiaWRcIiwgY291bnQoXCJwZXRcIi5cImlkXCIpIGFzIFwicGVyc29uX2NvdW50XCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBpbm5lciBqb2luIFwicGV0XCIgb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICAgICAqIGdyb3VwIGJ5IFwicGVyc29uXCIuXCJpZFwiXG4gICAgICogaGF2aW5nIGNvdW50KFwicGV0XCIuXCJpZFwiKSA+ICQxXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaHkgXCJzb21ld2hhdFwiIHR5cGUtc2FmZT8gQmVjYXVzZSB0aGUgZnVuY3Rpb24gY2FsbHMgYXJlIG5vdCBib3VuZCB0byB0aGVcbiAgICAgKiBjdXJyZW50IHF1ZXJ5IGNvbnRleHQuIFRoZXkgYWxsb3cgeW91IHRvIHJlZmVyZW5jZSBjb2x1bW5zIGFuZCB0YWJsZXMgdGhhdFxuICAgICAqIGFyZSBub3QgaW4gdGhlIGN1cnJlbnQgcXVlcnkuIEUuZy4gcmVtb3ZlIHRoZSBgaW5uZXJKb2luYCBmcm9tIHRoZSBwcmV2aW91c1xuICAgICAqIHF1ZXJ5IGFuZCBUeXBlU2NyaXB0IHdvbid0IGV2ZW4gY29tcGxhaW4uXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBtYWtlIHRoZSBmdW5jdGlvbiBjYWxscyBmdWxseSB0eXBlLXNhZmUsIHlvdSBjYW4gdXNlIHRoZVxuICAgICAqIHtAbGluayBFeHByZXNzaW9uQnVpbGRlci5mbn0gZ2V0dGVyIGZvciBhIHF1ZXJ5IGNvbnRleHQtYXdhcmUsIHN0cmljdGVyIHtAbGluayBGdW5jdGlvbk1vZHVsZX0uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuaW5uZXJKb2luKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAqICAgICAncGVyc29uLmlkJyxcbiAgICAgKiAgICAgZWIuZm4uY291bnQoJ3BldC5pZCcpLmFzKCdwZXRfY291bnQnKVxuICAgICAqICAgXSlcbiAgICAgKiAgIC5ncm91cEJ5KCdwZXJzb24uaWQnKVxuICAgICAqICAgLmhhdmluZygoZWIpID0+IGViLmZuLmNvdW50KCdwZXQuaWQnKSwgJz4nLCAxMClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgZm4oKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbk1vZHVsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlcn0gdGhhdCBjYW4gYmUgdXNlZCB0byBydW4gcXVlcmllcyBpbnNpZGUgYSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyfSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHRyYW5zYWN0aW9uLiBUaGVcbiAgICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyLmV4ZWN1dGV9IG1ldGhvZCBjYW4gdGhlbiBiZSBjYWxsZWQgdG8gcnVuIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyLmV4ZWN1dGV9IHRha2VzIGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gaW5zaWRlIHRoZVxuICAgICAqIHRyYW5zYWN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gdGhyb3dzIGFuIGV4Y2VwdGlvbixcbiAgICAgKiAxLiB0aGUgZXhjZXB0aW9uIGlzIGNhdWdodCxcbiAgICAgKiAyLiB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2ssIGFuZFxuICAgICAqIDMuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGFnYWluLlxuICAgICAqIE90aGVyd2lzZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlIHwgZXhlY3V0ZX1cbiAgICAgKiBtZXRob2QgZ2V0cyB0aGUgdHJhbnNhY3Rpb24gb2JqZWN0IGFzIGl0cyBvbmx5IGFyZ3VtZW50LiBUaGUgdHJhbnNhY3Rpb24gaXNcbiAgICAgKiBvZiB0eXBlIHtAbGluayBUcmFuc2FjdGlvbn0gd2hpY2ggaW5oZXJpdHMge0BsaW5rIEt5c2VseX0uIEFueSBxdWVyeVxuICAgICAqIHN0YXJ0ZWQgdGhyb3VnaCB0aGUgdHJhbnNhY3Rpb24gb2JqZWN0IGlzIGV4ZWN1dGVkIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUbyBydW4gYSBjb250cm9sbGVkIHRyYW5zYWN0aW9uLCBhbGxvd2luZyB5b3UgdG8gY29tbWl0IGFuZCByb2xsYmFjayBtYW51YWxseSxcbiAgICAgKiB1c2Uge0BsaW5rIHN0YXJ0VHJhbnNhY3Rpb259IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJ0cmFuc2FjdGlvbnNcIiwgXCJTaW1wbGUgdHJhbnNhY3Rpb25cIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGluc2VydHMgdHdvIHJvd3MgaW4gYSB0cmFuc2FjdGlvbi4gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBpbnNpZGVcbiAgICAgKiB0aGUgY2FsbGJhY2sgcGFzc2VkIHRvIHRoZSBgZXhlY3V0ZWAgbWV0aG9kLFxuICAgICAqIDEuIHRoZSBleGNlcHRpb24gaXMgY2F1Z2h0LFxuICAgICAqIDIuIHRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjaywgYW5kXG4gICAgICogMy4gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gYWdhaW4uXG4gICAgICogT3RoZXJ3aXNlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGNhdHRvID0gYXdhaXQgZGIudHJhbnNhY3Rpb24oKS5leGVjdXRlKGFzeW5jICh0cngpID0+IHtcbiAgICAgKiAgIGNvbnN0IGplbm5pZmVyID0gYXdhaXQgdHJ4Lmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgICAgYWdlOiA0MCxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgdHJ4Lmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIG93bmVyX2lkOiBqZW5uaWZlci5pZCxcbiAgICAgKiAgICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICAgIGlzX2Zhdm9yaXRlOiBmYWxzZSxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2V0dGluZyB0aGUgaXNvbGF0aW9uIGxldmVsOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAudHJhbnNhY3Rpb24oKVxuICAgICAqICAgLnNldElzb2xhdGlvbkxldmVsKCdzZXJpYWxpemFibGUnKVxuICAgICAqICAgLmV4ZWN1dGUoYXN5bmMgKHRyeCkgPT4ge1xuICAgICAqICAgICBhd2FpdCBkb1N0dWZmKHRyeClcbiAgICAgKiAgIH0pXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1N0dWZmKGt5c2VseTogdHlwZW9mIGRiKSB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcn0gdGhhdCBjYW4gYmUgdXNlZCB0byBydW4gcXVlcmllcyBpbnNpZGUgYSBjb250cm9sbGVkIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIHJldHVybmVkIHtAbGluayBDb250cm9sbGVkVHJhbnNhY3Rpb25CdWlsZGVyfSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIFRoZSB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSBtZXRob2QgY2FuIHRoZW4gYmUgY2FsbGVkXG4gICAgICogdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFuZCByZXR1cm4gYSB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9ufS5cbiAgICAgKlxuICAgICAqIEEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbn0gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LFxuICAgICAqIGV4ZWN1dGUgc2F2ZXBvaW50IGNvbW1hbmRzLiBJdCBleHRlbmRzIHtAbGluayBUcmFuc2FjdGlvbn0gd2hpY2ggZXh0ZW5kcyB7QGxpbmsgS3lzZWx5fSxcbiAgICAgKiBzbyB5b3UgY2FuIHJ1biBxdWVyaWVzIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uIE9uY2UgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZCxcbiAgICAgKiBvciByb2xsZWQgYmFjaywgaXQgY2FuJ3QgYmUgdXNlZCBhbnltb3JlIC0gYWxsIHF1ZXJpZXMgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKiBUaGlzIGlzIHRvIHByZXZlbnQgYWNjaWRlbnRhbGx5IHJ1bm5pbmcgcXVlcmllcyBvdXRzaWRlIHRoZSB0cmFuc2FjdGlvbiAtIHdoZXJlXG4gICAgICogYXRvbWljaXR5IGlzIG5vdCBndWFyYW50ZWVkIGFueW1vcmUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJ0cmFuc2FjdGlvbnNcIiwgXCJDb250cm9sbGVkIHRyYW5zYWN0aW9uXCIsIDExKSAtLT5cbiAgICAgKlxuICAgICAqIEEgY29udHJvbGxlZCB0cmFuc2FjdGlvbiBhbGxvd3MgeW91IHRvIGNvbW1pdCBhbmQgcm9sbGJhY2sgbWFudWFsbHksIGV4ZWN1dGVcbiAgICAgKiBzYXZlcG9pbnQgY29tbWFuZHMsIGFuZCBxdWVyaWVzIGluIGdlbmVyYWwuXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2Ugc3RhcnQgYSB0cmFuc2FjdGlvbiwgdXNlIGl0IHRvIGluc2VydCB0d28gcm93cyBhbmQgdGhlbiBjb21taXRcbiAgICAgKiB0aGUgdHJhbnNhY3Rpb24uIElmIGFuIGVycm9yIGlzIHRocm93biwgd2UgY2F0Y2ggaXQgYW5kIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGNvbnN0IGplbm5pZmVyID0gYXdhaXQgdHJ4Lmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgICAgYWdlOiA0MCxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICBjb25zdCBjYXR0byA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgICBpc19mYXZvcml0ZTogZmFsc2UsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguY29tbWl0KCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiAgIC8vIC4uLlxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cngucm9sbGJhY2soKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiQ29udHJvbGxlZCB0cmFuc2FjdGlvbiAvdyBzYXZlcG9pbnRzXCIsIDEyKSAtLT5cbiAgICAgKlxuICAgICAqIEEgY29udHJvbGxlZCB0cmFuc2FjdGlvbiBhbGxvd3MgeW91IHRvIGNvbW1pdCBhbmQgcm9sbGJhY2sgbWFudWFsbHksIGV4ZWN1dGVcbiAgICAgKiBzYXZlcG9pbnQgY29tbWFuZHMsIGFuZCBxdWVyaWVzIGluIGdlbmVyYWwuXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2Ugc3RhcnQgYSB0cmFuc2FjdGlvbiwgaW5zZXJ0IGEgcGVyc29uLCBjcmVhdGUgYSBzYXZlcG9pbnQsXG4gICAgICogdHJ5IGluc2VydGluZyBhIHRveSBhbmQgYSBwZXQsIGFuZCBpZiBhbiBlcnJvciBpcyB0aHJvd24sIHdlIHJvbGxiYWNrIHRvIHRoZVxuICAgICAqIHNhdmVwb2ludC4gRXZlbnR1YWxseSB3ZSByZWxlYXNlIHRoZSBzYXZlcG9pbnQsIGluc2VydCBhbiBhdWRpdCByZWNvcmQgYW5kXG4gICAgICogY29tbWl0IHRoZSB0cmFuc2FjdGlvbi4gSWYgYW4gZXJyb3IgaXMgdGhyb3duLCB3ZSBjYXRjaCBpdCBhbmQgcm9sbGJhY2sgdGhlXG4gICAgICogdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeFxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJyxcbiAgICAgKiAgICAgICBhZ2U6IDQwLFxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiAgIGNvbnN0IHRyeEFmdGVySmVubmlmZXIgPSBhd2FpdCB0cnguc2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICB0cnkge1xuICAgICAqICAgICBjb25zdCBjYXR0byA9IGF3YWl0IHRyeEFmdGVySmVubmlmZXJcbiAgICAgKiAgICAgICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICAgIG93bmVyX2lkOiBqZW5uaWZlci5pZCxcbiAgICAgKiAgICAgICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgICB9KVxuICAgICAqICAgICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXJcbiAgICAgKiAgICAgICAuaW5zZXJ0SW50bygndG95JylcbiAgICAgKiAgICAgICAudmFsdWVzKHsgbmFtZTogJ0JvbmUnLCBwcmljZTogMS45OSwgcGV0X2lkOiBjYXR0by5pZCB9KVxuICAgICAqICAgICAgIC5leGVjdXRlKClcbiAgICAgKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucm9sbGJhY2tUb1NhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yZWxlYXNlU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguaW5zZXJ0SW50bygnYXVkaXQnKS52YWx1ZXMoeyBhY3Rpb246ICdhZGRlZCBKZW5uaWZlcicgfSkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeC5jb21taXQoKS5leGVjdXRlKClcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0YXJ0VHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIGt5c2VseSBpbnN0YW5jZSBib3VuZCB0byBhIHNpbmdsZSBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuY29ubmVjdGlvbigpXG4gICAgICogICAuZXhlY3V0ZShhc3luYyAoZGIpID0+IHtcbiAgICAgKiAgICAgLy8gYGRiYCBpcyBhbiBpbnN0YW5jZSBvZiBgS3lzZWx5YCB0aGF0J3MgYm91bmQgdG8gYSBzaW5nbGVcbiAgICAgKiAgICAgLy8gZGF0YWJhc2UgY29ubmVjdGlvbi4gQWxsIHF1ZXJpZXMgZXhlY3V0ZWQgdGhyb3VnaCBgZGJgIHVzZVxuICAgICAqICAgICAvLyB0aGUgc2FtZSBjb25uZWN0aW9uLlxuICAgICAqICAgICBhd2FpdCBkb1N0dWZmKGRiKVxuICAgICAqICAgfSlcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU3R1ZmYoa3lzZWx5OiB0eXBlb2YgZGIpIHtcbiAgICAgKiAgIC8vIC4uLlxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25CdWlsZGVyKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBLeXNlbHkoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBLeXNlbHkgaW5zdGFuY2Ugd2l0aG91dCBhbnkgcGx1Z2lucy5cbiAgICAgKi9cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBLeXNlbHkoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aG91dFBsdWdpbnMoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBLeXNlbHkgaW5zdGFuY2Ugd2l0aCB0YWJsZXMgYWRkZWQgdG8gaXRzXG4gICAgICogZGF0YWJhc2UgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgbW9kaWZpZXMgdGhlIHR5cGVzIGFuZCBkb2Vzbid0IGFmZmVjdCBhbnkgb2YgdGhlXG4gICAgICogZXhlY3V0ZWQgcXVlcmllcyBpbiBhbnkgd2F5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgYWRkcyBhbmQgdXNlcyBhIHRlbXBvcmFyeSB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3RlbXBfdGFibGUnKVxuICAgICAqICAgLnRlbXBvcmFyeSgpXG4gICAgICogICAuYWRkQ29sdW1uKCdzb21lX2NvbHVtbicsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHRlbXBEYiA9IGRiLndpdGhUYWJsZXM8e1xuICAgICAqICAgdGVtcF90YWJsZToge1xuICAgICAqICAgICBzb21lX2NvbHVtbjogbnVtYmVyXG4gICAgICogICB9XG4gICAgICogfT4oKVxuICAgICAqXG4gICAgICogYXdhaXQgdGVtcERiXG4gICAgICogICAuaW5zZXJ0SW50bygndGVtcF90YWJsZScpXG4gICAgICogICAudmFsdWVzKHsgc29tZV9jb2x1bW46IDEwMCB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgYW5kIGRpc2Nvbm5lY3RzIGZyb20gdGhlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGFyZSBkb25lIHVzaW5nIHRoZSBgS3lzZWx5YCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBgS3lzZWx5YCBpbnN0YW5jZSBpcyBhIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHVzZSBgZGIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmAuXG4gICAgICovXG4gICAgZ2V0IGlzVHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRFeGVjdXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyBhIGdpdmVuIGNvbXBpbGVkIHF1ZXJ5IG9yIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9reXNlbHktb3JnL2t5c2VseS9ibG9iL21hc3Rlci9zaXRlL2RvY3MvcmVjaXBlcy8wMDA0LXNwbGl0dGluZy1xdWVyeS1idWlsZGluZy1hbmQtZXhlY3V0aW9uLm1kI2V4ZWN1dGUtY29tcGlsZWQtcXVlcmllcyBzcGxpdHRpbmcgYnVpbGQsIGNvbXBpbGUgYW5kIGV4ZWN1dGUgY29kZSByZWNpcGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIGV4ZWN1dGVRdWVyeShxdWVyeSwgXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW4gdGhlIGZ1dHVyZS4gZGVwcmVjYXRlZCBpbiAgMC4yOC54XG4gICAgcXVlcnlJZCkge1xuICAgICAgICBpZiAocXVlcnlJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2dPbmNlKCdQYXNzaW5nIGBxdWVyeUlkYCBpbiBgZGIuZXhlY3V0ZVF1ZXJ5YCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGUtdGltZSBlcnJvciBpbiB0aGUgZnV0dXJlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSBpc0NvbXBpbGFibGUocXVlcnkpID8gcXVlcnkuY29tcGlsZSgpIDogcXVlcnk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgIH1cbiAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEt5c2VseSB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBwcm9wcztcbiAgICB9XG4gICAgLy8gVGhlIHJldHVybiB0eXBlIGlzIGB0cnVlYCBpbnN0ZWFkIG9mIGBib29sZWFuYCB0byBtYWtlIEt5c2VseTxEQj5cbiAgICAvLyB1bmFzc2lnbmFibGUgdG8gVHJhbnNhY3Rpb248REI+IHdoaWxlIGFsbG93aW5nIGFzc2lnbm1lbnQgdGhlXG4gICAgLy8gb3RoZXIgd2F5IGFyb3VuZC5cbiAgICBnZXQgaXNUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRyYW5zYWN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIHRyYW5zYWN0aW9uIG1ldGhvZCBmb3IgYSBUcmFuc2FjdGlvbiBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIGNvbm5lY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0aGUgY29ubmVjdGlvbiBtZXRob2QgZm9yIGEgVHJhbnNhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgICBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIGRlc3Ryb3kgbWV0aG9kIGZvciBhIFRyYW5zYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRob3V0UGx1Z2lucygpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNLeXNlbHlQcm9wcyhvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgaXNPYmplY3Qob2JqLmNvbmZpZykgJiZcbiAgICAgICAgaXNPYmplY3Qob2JqLmRyaXZlcikgJiZcbiAgICAgICAgaXNPYmplY3Qob2JqLmV4ZWN1dG9yKSAmJlxuICAgICAgICBpc09iamVjdChvYmouZGlhbGVjdCkpO1xufVxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoQ29ubmVjdGlvblByb3ZpZGVyKG5ldyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvbikpO1xuICAgICAgICAgICAgY29uc3QgZGIgPSBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgICAgICBleGVjdXRvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGRiKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgc2V0QWNjZXNzTW9kZShhY2Nlc3NNb2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWNjZXNzTW9kZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldElzb2xhdGlvbkxldmVsKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUsIC4uLmt5c2VseVByb3BzIH0gPSB0aGlzLiNwcm9wcztcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlIH07XG4gICAgICAgIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihhc3luYyAoY29ubmVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoQ29ubmVjdGlvblByb3ZpZGVyKG5ldyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvbikpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgICAgIC4uLmt5c2VseVByb3BzLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25CZWd1biA9IGZhbHNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLCBzZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25CZWd1biA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FsbGJhY2sodHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5jb21taXRUcmFuc2FjdGlvbihjb25uZWN0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uQmVndW4pIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgc2V0QWNjZXNzTW9kZShhY2Nlc3NNb2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFjY2Vzc01vZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRJc29sYXRpb25MZXZlbChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBpc29sYXRpb25MZXZlbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUsIC4uLnByb3BzIH0gPSB0aGlzLiNwcm9wcztcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlIH07XG4gICAgICAgIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24odGhpcy4jcHJvcHMuZXhlY3V0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uLmNvbm5lY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZWRUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uIHtcbiAgICAjcHJvcHM7XG4gICAgI2NvbXBpbGVRdWVyeTtcbiAgICAjc3RhdGU7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGlzQ29tbWl0dGVkOiBmYWxzZSwgaXNSb2xsZWRCYWNrOiBmYWxzZSB9O1xuICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcihwcm9wcy5leGVjdXRvciwgc3RhdGUpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24sIC4uLnRyYW5zYWN0aW9uUHJvcHMgfSA9IHByb3BzO1xuICAgICAgICBzdXBlcih0cmFuc2FjdGlvblByb3BzKTtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgICAgICBjb25zdCBxdWVyeUlkID0gY3JlYXRlUXVlcnlJZCgpO1xuICAgICAgICB0aGlzLiNjb21waWxlUXVlcnkgPSAobm9kZSkgPT4gcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICBnZXQgaXNDb21taXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0ZS5pc0NvbW1pdHRlZDtcbiAgICB9XG4gICAgZ2V0IGlzUm9sbGVkQmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlLmlzUm9sbGVkQmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cngpXG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeC5jb21taXQoKS5leGVjdXRlKClcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9Tb21ldGhpbmcoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbW1pdCgpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5jb21taXRUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNDb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4jcHJvcHMuY29ubmVjdGlvbi5yZWxlYXNlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgY29tbWl0fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4LmNvbW1pdCgpLmV4ZWN1dGUoKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cngucm9sbGJhY2soKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2soKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNSb2xsZWRCYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24ucmVsZWFzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgcm9sbGJhY2tUb1NhdmVwb2ludH0gYW5kIHtAbGluayByZWxlYXNlU2F2ZXBvaW50fS5cbiAgICAgKlxuICAgICAqIEZvciBhIHR5cGUtc2FmZSBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgZnJvbSBub3cgb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBpbnNlcnRKZW5uaWZlcih0cngpXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cnhBZnRlckplbm5pZmVyKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnNhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRvIGEgc2F2ZXBvaW50IHdpdGggYSBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBzYXZlcG9pbnR9IGFuZCB7QGxpbmsgcmVsZWFzZVNhdmVwb2ludH0uXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCB1c2UgdGhlIHNhbWUgaW5zdGFuY2UgcmV0dXJuZWQgYnkge0BsaW5rIHNhdmVwb2ludH0sIG9yXG4gICAgICogZXNjYXBlIHRoZSB0eXBlLWNoZWNrIGJ5IHVzaW5nIGBhcyBhbnlgLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogYXdhaXQgaW5zZXJ0SmVubmlmZXIodHJ4KVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4QWZ0ZXJKZW5uaWZlciA9IGF3YWl0IHRyeC5zYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgYXdhaXQgZG9Tb21ldGhpbmcodHJ4QWZ0ZXJKZW5uaWZlcilcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yb2xsYmFja1RvU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydEplbm5pZmVyKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2tUb1NhdmVwb2ludChzYXZlcG9pbnROYW1lKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUb1NhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgc2F2ZXBvaW50fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogWW91IG11c3QgdXNlIHRoZSBzYW1lIGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBzYXZlcG9pbnR9LCBvclxuICAgICAqIGVzY2FwZSB0aGUgdHlwZS1jaGVjayBieSB1c2luZyBgYXMgYW55YC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGF3YWl0IGluc2VydEplbm5pZmVyKHRyeClcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeEFmdGVySmVubmlmZXIgPSBhd2FpdCB0cnguc2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeEFmdGVySmVubmlmZXIpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucm9sbGJhY2tUb1NhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJlbGVhc2VTYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBkb1NvbWV0aGluZ0Vsc2UodHJ4KVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZ0Vsc2Uoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlbGVhc2VTYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJlbGVhc2VTYXZlcG9pbnQ/Lih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIHRoaXMuI2NvbXBpbGVRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbW1hbmQge1xuICAgICNjYjtcbiAgICBjb25zdHJ1Y3RvcihjYikge1xuICAgICAgICB0aGlzLiNjYiA9IGNiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2IoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2soc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuaXNDb21taXR0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBpcyBhbHJlYWR5IGNvbW1pdHRlZCcpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuaXNSb2xsZWRCYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaXMgYWxyZWFkeSByb2xsZWQgYmFjaycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXhlY3V0b3Igd3JhcHBlciB0aGF0IGFzc2VydHMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc3RhdGUgaXMgbm90IGNvbW1pdHRlZFxuICogb3Igcm9sbGVkIGJhY2sgd2hlbiBhIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciB7XG4gICAgI2V4ZWN1dG9yO1xuICAgICNzdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvciwgc3RhdGUpIHtcbiAgICAgICAgaWYgKGV4ZWN1dG9yIGluc3RhbmNlb2YgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuI2V4ZWN1dG9yID0gZXhlY3V0b3IuI2V4ZWN1dG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLmFkYXB0ZXI7XG4gICAgfVxuICAgIGdldCBwbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IucGx1Z2lucztcbiAgICB9XG4gICAgdHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcik7XG4gICAgfVxuICAgIGV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSk7XG4gICAgfVxuICAgIHN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpO1xuICAgIH1cbiAgICB3aXRoQ29ubmVjdGlvblByb3ZpZGVyKGNvbm5lY3Rpb25Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvblByb3ZpZGVyKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbnMocGx1Z2lucyksIHRoaXMuI3N0YXRlKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcih0aGlzLiNleGVjdXRvci53aXRob3V0UGx1Z2lucygpLCB0aGlzLiNzdGF0ZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yYXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmNsYXNzIFJhd0J1aWxkZXJJbXBsIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBpc1Jhd0J1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRSYXdCdWlsZGVySW1wbCh0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwoeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG4gICAgJG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFJhd0J1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcGx1Z2luczogdGhpcy4jcHJvcHMucGx1Z2lucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnRoaXMuI3Byb3BzLnBsdWdpbnMsIHBsdWdpbl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW3BsdWdpbl0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdG9PcGVyYXRpb25Ob2RlKHRoaXMuI2dldEV4ZWN1dG9yKCkpO1xuICAgIH1cbiAgICBjb21waWxlKGV4ZWN1dG9yUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGUodGhpcy4jZ2V0RXhlY3V0b3IoZXhlY3V0b3JQcm92aWRlcikpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKGV4ZWN1dG9yUHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLiNnZXRFeGVjdXRvcihleGVjdXRvclByb3ZpZGVyKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLiNjb21waWxlKGV4ZWN1dG9yKSk7XG4gICAgfVxuICAgICNnZXRFeGVjdXRvcihleGVjdXRvclByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dG9yID0gZXhlY3V0b3JQcm92aWRlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGV4ZWN1dG9yUHJvdmlkZXIuZ2V0RXhlY3V0b3IoKVxuICAgICAgICAgICAgOiBOT09QX1FVRVJZX0VYRUNVVE9SO1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMucGx1Z2lucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGV4ZWN1dG9yLndpdGhQbHVnaW5zKHRoaXMuI3Byb3BzLnBsdWdpbnMpXG4gICAgICAgICAgICA6IGV4ZWN1dG9yO1xuICAgIH1cbiAgICAjdG9PcGVyYXRpb25Ob2RlKGV4ZWN1dG9yKSB7XG4gICAgICAgIHJldHVybiBleGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5yYXdOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgI2NvbXBpbGUoZXhlY3V0b3IpIHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLiN0b09wZXJhdGlvbk5vZGUoZXhlY3V0b3IpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmF3QnVpbGRlcihwcm9wcykge1xuICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwocHJvcHMpO1xufVxuY2xhc3MgQWxpYXNlZFJhd0J1aWxkZXJJbXBsIHtcbiAgICAjcmF3QnVpbGRlcjtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IocmF3QnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jcmF3QnVpbGRlciA9IHJhd0J1aWxkZXI7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmF3QnVpbGRlcjtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGdldCByYXdCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmF3QnVpbGRlcjtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZSh0aGlzLiNyYXdCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBpc09wZXJhdGlvbk5vZGVTb3VyY2UodGhpcy4jYWxpYXMpXG4gICAgICAgICAgICA/IHRoaXMuI2FsaWFzLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgICAgICA6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc3FsLmQudHNcIiAvPlxuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlU3RyaW5nUmVmZXJlbmNlIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24gfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJhd0J1aWxkZXIgfSBmcm9tICcuL3Jhdy1idWlsZGVyLmpzJztcbmV4cG9ydCBjb25zdCBzcWwgPSBPYmplY3QuYXNzaWduKChzcWxGcmFnbWVudHMsIC4uLnBhcmFtZXRlcnMpID0+IHtcbiAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgcmF3Tm9kZTogUmF3Tm9kZS5jcmVhdGUoc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzPy5tYXAocGFyc2VQYXJhbWV0ZXIpID8/IFtdKSxcbiAgICB9KTtcbn0sIHtcbiAgICByZWYoY29sdW1uUmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkKHBhcnNlU3RyaW5nUmVmZXJlbmNlKGNvbHVtblJlZmVyZW5jZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbCh2YWx1ZSk7XG4gICAgfSxcbiAgICB0YWJsZSh0YWJsZVJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChwYXJzZVRhYmxlKHRhYmxlUmVmZXJlbmNlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgaWQoLi4uaWRzKSB7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50cyA9IG5ldyBBcnJheShpZHMubGVuZ3RoICsgMSkuZmlsbCgnLicpO1xuICAgICAgICBmcmFnbWVudHNbMF0gPSAnJztcbiAgICAgICAgZnJhZ21lbnRzW2ZyYWdtZW50cy5sZW5ndGggLSAxXSA9ICcnO1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZShmcmFnbWVudHMsIGlkcy5tYXAoSWRlbnRpZmllck5vZGUuY3JlYXRlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgbGl0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUodmFsdWUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBsaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpdCh2YWx1ZSk7XG4gICAgfSxcbiAgICByYXcoc3FsKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aFNxbChzcWwpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGpvaW4oYXJyYXksIHNlcGFyYXRvciA9IHNxbCBgLCBgKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5KE1hdGgubWF4KDIgKiBhcnJheS5sZW5ndGggLSAxLCAwKSk7XG4gICAgICAgIGNvbnN0IHNlcCA9IHNlcGFyYXRvci50b09wZXJhdGlvbk5vZGUoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbm9kZXNbMiAqIGldID0gcGFyc2VQYXJhbWV0ZXIoYXJyYXlbaV0pO1xuICAgICAgICAgICAgaWYgKGkgIT09IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBub2Rlc1syICogaSArIDFdID0gc2VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkcmVuKG5vZGVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXIocGFyYW0pIHtcbiAgICBpZiAoaXNPcGVyYXRpb25Ob2RlU291cmNlKHBhcmFtKSkge1xuICAgICAgICByZXR1cm4gcGFyYW0udG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbihwYXJhbSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29wZXJhdGlvbi1ub2RlLXZpc2l0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uTm9kZVZpc2l0b3Ige1xuICAgIG5vZGVTdGFjayA9IFtdO1xuICAgIGdldCBwYXJlbnROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlU3RhY2tbdGhpcy5ub2RlU3RhY2subGVuZ3RoIC0gMl07XG4gICAgfVxuICAgICN2aXNpdG9ycyA9IGZyZWV6ZSh7XG4gICAgICAgIEFsaWFzTm9kZTogdGhpcy52aXNpdEFsaWFzLmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtbk5vZGU6IHRoaXMudmlzaXRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgSWRlbnRpZmllck5vZGU6IHRoaXMudmlzaXRJZGVudGlmaWVyLmJpbmQodGhpcyksXG4gICAgICAgIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlOiB0aGlzLnZpc2l0U2NoZW1hYmxlSWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBSYXdOb2RlOiB0aGlzLnZpc2l0UmF3LmJpbmQodGhpcyksXG4gICAgICAgIFJlZmVyZW5jZU5vZGU6IHRoaXMudmlzaXRSZWZlcmVuY2UuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0UXVlcnlOb2RlOiB0aGlzLnZpc2l0U2VsZWN0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0aW9uTm9kZTogdGhpcy52aXNpdFNlbGVjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBUYWJsZU5vZGU6IHRoaXMudmlzaXRUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBGcm9tTm9kZTogdGhpcy52aXNpdEZyb20uYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0QWxsTm9kZTogdGhpcy52aXNpdFNlbGVjdEFsbC5iaW5kKHRoaXMpLFxuICAgICAgICBBbmROb2RlOiB0aGlzLnZpc2l0QW5kLmJpbmQodGhpcyksXG4gICAgICAgIE9yTm9kZTogdGhpcy52aXNpdE9yLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTm9kZTogdGhpcy52aXNpdFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTGlzdE5vZGU6IHRoaXMudmlzaXRWYWx1ZUxpc3QuYmluZCh0aGlzKSxcbiAgICAgICAgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZTogdGhpcy52aXNpdFByaW1pdGl2ZVZhbHVlTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJlbnNOb2RlOiB0aGlzLnZpc2l0UGFyZW5zLmJpbmQodGhpcyksXG4gICAgICAgIEpvaW5Ob2RlOiB0aGlzLnZpc2l0Sm9pbi5iaW5kKHRoaXMpLFxuICAgICAgICBPcGVyYXRvck5vZGU6IHRoaXMudmlzaXRPcGVyYXRvci5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVyZU5vZGU6IHRoaXMudmlzaXRXaGVyZS5iaW5kKHRoaXMpLFxuICAgICAgICBJbnNlcnRRdWVyeU5vZGU6IHRoaXMudmlzaXRJbnNlcnRRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBEZWxldGVRdWVyeU5vZGU6IHRoaXMudmlzaXREZWxldGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBSZXR1cm5pbmdOb2RlOiB0aGlzLnZpc2l0UmV0dXJuaW5nLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVRhYmxlTm9kZTogdGhpcy52aXNpdENyZWF0ZVRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIEFkZENvbHVtbk5vZGU6IHRoaXMudmlzaXRBZGRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uRGVmaW5pdGlvbk5vZGU6IHRoaXMudmlzaXRDb2x1bW5EZWZpbml0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUYWJsZU5vZGU6IHRoaXMudmlzaXREcm9wVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRGF0YVR5cGVOb2RlOiB0aGlzLnZpc2l0RGF0YVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgT3JkZXJCeU5vZGU6IHRoaXMudmlzaXRPcmRlckJ5LmJpbmQodGhpcyksXG4gICAgICAgIE9yZGVyQnlJdGVtTm9kZTogdGhpcy52aXNpdE9yZGVyQnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgIEdyb3VwQnlOb2RlOiB0aGlzLnZpc2l0R3JvdXBCeS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5SXRlbU5vZGU6IHRoaXMudmlzaXRHcm91cEJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBVcGRhdGVRdWVyeU5vZGU6IHRoaXMudmlzaXRVcGRhdGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5VcGRhdGVOb2RlOiB0aGlzLnZpc2l0Q29sdW1uVXBkYXRlLmJpbmQodGhpcyksXG4gICAgICAgIExpbWl0Tm9kZTogdGhpcy52aXNpdExpbWl0LmJpbmQodGhpcyksXG4gICAgICAgIE9mZnNldE5vZGU6IHRoaXMudmlzaXRPZmZzZXQuYmluZCh0aGlzKSxcbiAgICAgICAgT25Db25mbGljdE5vZGU6IHRoaXMudmlzaXRPbkNvbmZsaWN0LmJpbmQodGhpcyksXG4gICAgICAgIE9uRHVwbGljYXRlS2V5Tm9kZTogdGhpcy52aXNpdE9uRHVwbGljYXRlS2V5LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZUluZGV4Tm9kZTogdGhpcy52aXNpdENyZWF0ZUluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BJbmRleE5vZGU6IHRoaXMudmlzaXREcm9wSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgTGlzdE5vZGU6IHRoaXMudmlzaXRMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdFByaW1hcnlLZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFVuaXF1ZUNvbnN0cmFpbnROb2RlOiB0aGlzLnZpc2l0VW5pcXVlQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VzTm9kZTogdGhpcy52aXNpdFJlZmVyZW5jZXMuYmluZCh0aGlzKSxcbiAgICAgICAgQ2hlY2tDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdENoZWNrQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBXaXRoTm9kZTogdGhpcy52aXNpdFdpdGguYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZTogdGhpcy52aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZTogdGhpcy52aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUuYmluZCh0aGlzKSxcbiAgICAgICAgSGF2aW5nTm9kZTogdGhpcy52aXNpdEhhdmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVTY2hlbWFOb2RlOiB0aGlzLnZpc2l0Q3JlYXRlU2NoZW1hLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BTY2hlbWFOb2RlOiB0aGlzLnZpc2l0RHJvcFNjaGVtYS5iaW5kKHRoaXMpLFxuICAgICAgICBBbHRlclRhYmxlTm9kZTogdGhpcy52aXNpdEFsdGVyVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbHVtbk5vZGU6IHRoaXMudmlzaXREcm9wQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIFJlbmFtZUNvbHVtbk5vZGU6IHRoaXMudmlzaXRSZW5hbWVDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQWx0ZXJDb2x1bW5Ob2RlOiB0aGlzLnZpc2l0QWx0ZXJDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgTW9kaWZ5Q29sdW1uTm9kZTogdGhpcy52aXNpdE1vZGlmeUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdEFkZENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbnN0cmFpbnROb2RlOiB0aGlzLnZpc2l0RHJvcENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgUmVuYW1lQ29uc3RyYWludE5vZGU6IHRoaXMudmlzaXRSZW5hbWVDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdEZvcmVpZ25LZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVZpZXdOb2RlOiB0aGlzLnZpc2l0Q3JlYXRlVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGU6IHRoaXMudmlzaXRSZWZyZXNoTWF0ZXJpYWxpemVkVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVmlld05vZGU6IHRoaXMudmlzaXREcm9wVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBHZW5lcmF0ZWROb2RlOiB0aGlzLnZpc2l0R2VuZXJhdGVkLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRWYWx1ZU5vZGU6IHRoaXMudmlzaXREZWZhdWx0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgT25Ob2RlOiB0aGlzLnZpc2l0T24uYmluZCh0aGlzKSxcbiAgICAgICAgVmFsdWVzTm9kZTogdGhpcy52aXNpdFZhbHVlcy5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RNb2RpZmllck5vZGU6IHRoaXMudmlzaXRTZWxlY3RNb2RpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUeXBlTm9kZTogdGhpcy52aXNpdENyZWF0ZVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFR5cGVOb2RlOiB0aGlzLnZpc2l0RHJvcFR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRXhwbGFpbk5vZGU6IHRoaXMudmlzaXRFeHBsYWluLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRJbnNlcnRWYWx1ZU5vZGU6IHRoaXMudmlzaXREZWZhdWx0SW5zZXJ0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgQWdncmVnYXRlRnVuY3Rpb25Ob2RlOiB0aGlzLnZpc2l0QWdncmVnYXRlRnVuY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgT3Zlck5vZGU6IHRoaXMudmlzaXRPdmVyLmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5Tm9kZTogdGhpcy52aXNpdFBhcnRpdGlvbkJ5LmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5SXRlbU5vZGU6IHRoaXMudmlzaXRQYXJ0aXRpb25CeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgU2V0T3BlcmF0aW9uTm9kZTogdGhpcy52aXNpdFNldE9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBCaW5hcnlPcGVyYXRpb25Ob2RlOiB0aGlzLnZpc2l0QmluYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVuYXJ5T3BlcmF0aW9uTm9kZTogdGhpcy52aXNpdFVuYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVzaW5nTm9kZTogdGhpcy52aXNpdFVzaW5nLmJpbmQodGhpcyksXG4gICAgICAgIEZ1bmN0aW9uTm9kZTogdGhpcy52aXNpdEZ1bmN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIENhc2VOb2RlOiB0aGlzLnZpc2l0Q2FzZS5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVuTm9kZTogdGhpcy52aXNpdFdoZW4uYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlJlZmVyZW5jZU5vZGU6IHRoaXMudmlzaXRKU09OUmVmZXJlbmNlLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTm9kZTogdGhpcy52aXNpdEpTT05QYXRoLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTGVnTm9kZTogdGhpcy52aXNpdEpTT05QYXRoTGVnLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05PcGVyYXRvckNoYWluTm9kZTogdGhpcy52aXNpdEpTT05PcGVyYXRvckNoYWluLmJpbmQodGhpcyksXG4gICAgICAgIFR1cGxlTm9kZTogdGhpcy52aXNpdFR1cGxlLmJpbmQodGhpcyksXG4gICAgICAgIE1lcmdlUXVlcnlOb2RlOiB0aGlzLnZpc2l0TWVyZ2VRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBNYXRjaGVkTm9kZTogdGhpcy52aXNpdE1hdGNoZWQuYmluZCh0aGlzKSxcbiAgICAgICAgQWRkSW5kZXhOb2RlOiB0aGlzLnZpc2l0QWRkSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgQ2FzdE5vZGU6IHRoaXMudmlzaXRDYXN0LmJpbmQodGhpcyksXG4gICAgICAgIEZldGNoTm9kZTogdGhpcy52aXNpdEZldGNoLmJpbmQodGhpcyksXG4gICAgICAgIFRvcE5vZGU6IHRoaXMudmlzaXRUb3AuYmluZCh0aGlzKSxcbiAgICAgICAgT3V0cHV0Tm9kZTogdGhpcy52aXNpdE91dHB1dC5iaW5kKHRoaXMpLFxuICAgICAgICBPckFjdGlvbk5vZGU6IHRoaXMudmlzaXRPckFjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb2xsYXRlTm9kZTogdGhpcy52aXNpdENvbGxhdGUuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB2aXNpdE5vZGUgPSAobm9kZSkgPT4ge1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKG5vZGUpO1xuICAgICAgICB0aGlzLiN2aXNpdG9yc1tub2RlLmtpbmRdKG5vZGUpO1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wb3AoKTtcbiAgICB9O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXF1ZXJ5LWNvbXBpbGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ3JlYXRlVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uTm9kZVZpc2l0b3IgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS12aXNpdG9yLmpzJztcbmltcG9ydCB7IE9wZXJhdG9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgUGFyZW5zTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIGlzU3RyaW5nLCBpc051bWJlciwgaXNCb29sZWFuLCBpc051bGwsIGlzRGF0ZSwgaXNCaWdJbnQsIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdmlldy1ub2RlLmpzJztcbmltcG9ydCB7IFNldE9wZXJhdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZXQtb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS93aGVuLW5vZGUuanMnO1xuaW1wb3J0IHsgbG9nT25jZSB9IGZyb20gJy4uL3V0aWwvbG9nLW9uY2UuanMnO1xuY29uc3QgTElUX1dSQVBfUkVHRVggPSAvJy9nO1xuZXhwb3J0IGNsYXNzIERlZmF1bHRRdWVyeUNvbXBpbGVyIGV4dGVuZHMgT3BlcmF0aW9uTm9kZVZpc2l0b3Ige1xuICAgICNzcWwgPSAnJztcbiAgICAjcGFyYW1ldGVycyA9IFtdO1xuICAgIGdldCBudW1QYXJhbWV0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFyYW1ldGVycy5sZW5ndGg7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHRoaXMuI3NxbCA9ICcnO1xuICAgICAgICB0aGlzLiNwYXJhbWV0ZXJzID0gW107XG4gICAgICAgIHRoaXMubm9kZVN0YWNrLnNwbGljZSgwLCB0aGlzLm5vZGVTdGFjay5sZW5ndGgpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlKTtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBxdWVyeTogbm9kZSxcbiAgICAgICAgICAgIHF1ZXJ5SWQsXG4gICAgICAgICAgICBzcWw6IHRoaXMuZ2V0U3FsKCksXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBbLi4udGhpcy4jcGFyYW1ldGVyc10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRTcWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzcWw7XG4gICAgfVxuICAgIHZpc2l0U2VsZWN0UXVlcnkobm9kZSkge1xuICAgICAgICBjb25zdCB3cmFwSW5QYXJlbnMgPSB0aGlzLnBhcmVudE5vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIVBhcmVuc05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIUluc2VydFF1ZXJ5Tm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhQ3JlYXRlVGFibGVOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFDcmVhdGVWaWV3Tm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhU2V0T3BlcmF0aW9uTm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlID09PSB1bmRlZmluZWQgJiYgbm9kZS5leHBsYWluKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cGxhaW4pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcEluUGFyZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndpdGgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2l0aCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdzZWxlY3QnKTtcbiAgICAgICAgaWYgKG5vZGUuZGlzdGluY3RPbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZURpc3RpbmN0T24obm9kZS5kaXN0aW5jdE9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnRvcCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZWxlY3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnNlbGVjdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZyb20pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmpvaW5zLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZ3JvdXBCeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZ3JvdXBCeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuaGF2aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5oYXZpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnNldE9wZXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuc2V0T3BlcmF0aW9ucywgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vcmRlckJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcmRlckJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5saW1pdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGltaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mZXRjaCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZmV0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdCh0aGlzLnNvcnRTZWxlY3RNb2RpZmllcnMoWy4uLm5vZGUuZW5kTW9kaWZpZXJzXSksICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEZyb20obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZnJvbSAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmZyb21zKTtcbiAgICB9XG4gICAgdmlzaXRTZWxlY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNlbGVjdGlvbik7XG4gICAgfVxuICAgIHZpc2l0Q29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICBjb21waWxlRGlzdGluY3RPbihleHByZXNzaW9ucykge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGlzdGluY3Qgb24gKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KGV4cHJlc3Npb25zKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgY29tcGlsZUxpc3Qobm9kZXMsIHNlcGFyYXRvciA9ICcsICcpIHtcbiAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gbm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGFzdEluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGVzW2ldKTtcbiAgICAgICAgICAgIGlmIChpIDwgbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFdoZXJlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3doZXJlICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICB9XG4gICAgdmlzaXRIYXZpbmcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnaGF2aW5nICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmhhdmluZyk7XG4gICAgfVxuICAgIHZpc2l0SW5zZXJ0UXVlcnkobm9kZSkge1xuICAgICAgICBjb25zdCB3cmFwSW5QYXJlbnMgPSB0aGlzLnBhcmVudE5vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIVBhcmVuc05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVJhd05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVdoZW5Ob2RlLmlzKHRoaXMucGFyZW50Tm9kZSk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUgPT09IHVuZGVmaW5lZCAmJiBub2RlLmV4cGxhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwbGFpbik7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5yZXBsYWNlID8gJ3JlcGxhY2UnIDogJ2luc2VydCcpO1xuICAgICAgICAvLyBUT0RPOiByZW1vdmUgaW4gMC4yOS5cbiAgICAgICAgaWYgKG5vZGUuaWdub3JlKSB7XG4gICAgICAgICAgICBsb2dPbmNlKCdgSW5zZXJ0UXVlcnlOb2RlLmlnbm9yZWAgaXMgZGVwcmVjYXRlZC4gVXNlIGBJbnNlcnRRdWVyeU5vZGUub3JBY3Rpb25gIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGlnbm9yZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vckFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50b3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmludG8pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgaW50byAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW50byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS52YWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkZWZhdWx0IHZhbHVlcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uQ29uZmxpY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9uQ29uZmxpY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uRHVwbGljYXRlS2V5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vbkR1cGxpY2F0ZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZW5kTW9kaWZpZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCAnICcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0VmFsdWVzKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3ZhbHVlcyAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnZhbHVlcyk7XG4gICAgfVxuICAgIHZpc2l0RGVsZXRlUXVlcnkobm9kZSkge1xuICAgICAgICBjb25zdCB3cmFwSW5QYXJlbnMgPSB0aGlzLnBhcmVudE5vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIVBhcmVuc05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVJhd05vZGUuaXModGhpcy5wYXJlbnROb2RlKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSA9PT0gdW5kZWZpbmVkICYmIG5vZGUuZXhwbGFpbikge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHBsYWluKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aXRoKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGgpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnZGVsZXRlICcpO1xuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5mcm9tKTtcbiAgICAgICAgaWYgKG5vZGUub3V0cHV0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuam9pbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuam9pbnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vcmRlckJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcmRlckJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5saW1pdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGltaXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnJldHVybmluZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmV0dXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcEluUGFyZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJldHVybmluZyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdyZXR1cm5pbmcgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5zZWxlY3Rpb25zKTtcbiAgICB9XG4gICAgdmlzaXRBbGlhcyhub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubm9kZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgYXMgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYWxpYXMpO1xuICAgIH1cbiAgICB2aXNpdFJlZmVyZW5jZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdEFsbChfKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcqJyk7XG4gICAgfVxuICAgIHZpc2l0SWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCkpO1xuICAgICAgICB0aGlzLmNvbXBpbGVVbndyYXBwZWRJZGVudGlmaWVyKG5vZGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldFJpZ2h0SWRlbnRpZmllcldyYXBwZXIoKSk7XG4gICAgfVxuICAgIGNvbXBpbGVVbndyYXBwZWRJZGVudGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0cmluZyhub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Egbm9uLXN0cmluZyBpZGVudGlmaWVyIHdhcyBwYXNzZWQgdG8gY29tcGlsZVVud3JhcHBlZElkZW50aWZpZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQodGhpcy5zYW5pdGl6ZUlkZW50aWZpZXIobm9kZS5uYW1lKSk7XG4gICAgfVxuICAgIHZpc2l0QW5kKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0KTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhbmQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmlnaHQpO1xuICAgIH1cbiAgICB2aXNpdE9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0KTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBvciAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yaWdodCk7XG4gICAgfVxuICAgIHZpc2l0VmFsdWUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kSW1tZWRpYXRlVmFsdWUobm9kZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZFZhbHVlKG5vZGUudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0VmFsdWVMaXN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnZhbHVlcyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0VHVwbGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUudmFsdWVzKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRQcmltaXRpdmVWYWx1ZUxpc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICBjb25zdCB7IHZhbHVlcyB9ID0gbm9kZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kVmFsdWUodmFsdWVzW2ldKTtcbiAgICAgICAgICAgIGlmIChpICE9PSB2YWx1ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0UGFyZW5zKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5ub2RlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRKb2luKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoSk9JTl9UWVBFX1NRTFtub2RlLmpvaW5UeXBlXSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICBpZiAobm9kZS5vbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0T24obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb24gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub24pO1xuICAgIH1cbiAgICB2aXNpdFJhdyhub2RlKSB7XG4gICAgICAgIGNvbnN0IHsgc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzOiBwYXJhbXMgfSA9IG5vZGU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3FsRnJhZ21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChzcWxGcmFnbWVudHNbaV0pO1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiBpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUocGFyYW1zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9wZXJhdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vcGVyYXRvcik7XG4gICAgfVxuICAgIHZpc2l0VGFibGUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICB9XG4gICAgdmlzaXRTY2hlbWFibGVJZGVudGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNjaGVtYSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaWRlbnRpZmllcik7XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlVGFibGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlICcpO1xuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycyAmJiBub2RlLmZyb250TW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5mcm9udE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudGVtcG9yYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgndGVtcG9yYXJ5ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd0YWJsZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZOb3RFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBub3QgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICBpZiAobm9kZS5zZWxlY3RRdWVyeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2VsZWN0UXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KFsuLi5ub2RlLmNvbHVtbnMsIC4uLihub2RlLmNvbnN0cmFpbnRzID8/IFtdKV0pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgICAgIGlmIChub2RlLm9uQ29tbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiBjb21taXQgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vbkNvbW1pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnMgJiYgbm9kZS5lbmRNb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENvbHVtbkRlZmluaXRpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pZk5vdEV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIG5vdCBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmRhdGFUeXBlKTtcbiAgICAgICAgaWYgKG5vZGUudW5zaWduZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdW5zaWduZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycyAmJiBub2RlLmZyb250TW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5nZW5lcmF0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlkZW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGlkZW50aXR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFRvKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kZWZhdWx0VG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm5vdE51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbm90IG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS51bmlxdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdW5pcXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBudWxscyBub3QgZGlzdGluY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHByaW1hcnkga2V5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYXV0b0luY3JlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0QXV0b0luY3JlbWVudCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZWZlcmVuY2VzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGVjaykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycyAmJiBub2RlLmVuZE1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdXRvSW5jcmVtZW50KCkge1xuICAgICAgICByZXR1cm4gJ2F1dG9faW5jcmVtZW50JztcbiAgICB9XG4gICAgdmlzaXRSZWZlcmVuY2VzKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlZmVyZW5jZXMgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICBpZiAobm9kZS5vbkRlbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiBkZWxldGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uRGVsZXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vblVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiB1cGRhdGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BUYWJsZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIHRhYmxlICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUuY2FzY2FkZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNjYWRlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREYXRhVHlwZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuZGF0YVR5cGUpO1xuICAgIH1cbiAgICB2aXNpdE9yZGVyQnkobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb3JkZXIgYnkgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5pdGVtcyk7XG4gICAgfVxuICAgIHZpc2l0T3JkZXJCeUl0ZW0obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICBpZiAobm9kZS5jb2xsYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbGxhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kaXJlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm51bGxzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG51bGxzICcpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5udWxscyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRHcm91cEJ5KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2dyb3VwIGJ5ICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdEdyb3VwQnlJdGVtKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5ncm91cEJ5KTtcbiAgICB9XG4gICAgdmlzaXRVcGRhdGVRdWVyeShub2RlKSB7XG4gICAgICAgIGNvbnN0IHdyYXBJblBhcmVucyA9IHRoaXMucGFyZW50Tm9kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhUGFyZW5zTm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhUmF3Tm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhV2hlbk5vZGUuaXModGhpcy5wYXJlbnROb2RlKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSA9PT0gdW5kZWZpbmVkICYmIG5vZGUuZXhwbGFpbikge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHBsYWluKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aXRoKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGgpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgndXBkYXRlICcpO1xuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnc2V0ICcpO1xuICAgICAgICBpZiAobm9kZS51cGRhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUudXBkYXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3V0cHV0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZyb20pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICBpZiAoIW5vZGUuZnJvbSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkpvaW5zIGluIGFuIHVwZGF0ZSBxdWVyeSBhcmUgb25seSBzdXBwb3J0ZWQgYXMgYSBwYXJ0IG9mIGEgUG9zdGdyZVNRTCAndXBkYXRlIHNldCBmcm9tIGpvaW4nIHF1ZXJ5LiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBNeVNRTCAndXBkYXRlIGpvaW4gc2V0JyBxdWVyeSwgc2VlIGh0dHBzOi8va3lzZWx5LmRldi9kb2NzL2V4YW1wbGVzL3VwZGF0ZS9teS1zcWwtam9pbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmpvaW5zLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3JkZXJCeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JkZXJCeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yZXR1cm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJldHVybmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRDb2x1bW5VcGRhdGUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgPSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS52YWx1ZSk7XG4gICAgfVxuICAgIHZpc2l0TGltaXQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnbGltaXQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGltaXQpO1xuICAgIH1cbiAgICB2aXNpdE9mZnNldChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdvZmZzZXQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2Zmc2V0KTtcbiAgICB9XG4gICAgdmlzaXRPbkNvbmZsaWN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ29uIGNvbmZsaWN0Jyk7XG4gICAgICAgIGlmIChub2RlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5pbmRleEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5pbmRleEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pbmRleFdoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5pbmRleFdoZXJlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5kb05vdGhpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgZG8gbm90aGluZycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUudXBkYXRlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBkbyB1cGRhdGUgc2V0ICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnVwZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKG5vZGUudXBkYXRlV2hlcmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudXBkYXRlV2hlcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0T25EdXBsaWNhdGVLZXkobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb24gZHVwbGljYXRlIGtleSB1cGRhdGUgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS51cGRhdGVzKTtcbiAgICB9XG4gICAgdmlzaXRDcmVhdGVJbmRleChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgJyk7XG4gICAgICAgIGlmIChub2RlLnVuaXF1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3VuaXF1ZSAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnaW5kZXggJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHVzaW5nICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm51bGxzTm90RGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbnVsbHMgbm90IGRpc3RpbmN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BJbmRleChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGluZGV4ICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNhc2NhZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzY2FkZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlU2NoZW1hKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2NyZWF0ZSBzY2hlbWEgJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNjaGVtYSk7XG4gICAgfVxuICAgIHZpc2l0RHJvcFNjaGVtYShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIHNjaGVtYSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zY2hlbWEpO1xuICAgICAgICBpZiAobm9kZS5jYXNjYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFByaW1hcnlLZXlDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbnN0cmFpbnQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgncHJpbWFyeSBrZXkgKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIHRoaXMuYnVpbGREZWZlcnJhYmxlKG5vZGUpO1xuICAgIH1cbiAgICBidWlsZERlZmVycmFibGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5kZWZlcnJhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmRlZmVycmFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGRlZmVycmFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbm90IGRlZmVycmFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pbml0aWFsbHlEZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pbml0aWFsbHlEZWZlcnJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgaW5pdGlhbGx5IGRlZmVycmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGluaXRpYWxseSBpbW1lZGlhdGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFVuaXF1ZUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd1bmlxdWUnKTtcbiAgICAgICAgaWYgKG5vZGUubnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBudWxscyBub3QgZGlzdGluY3QnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB0aGlzLmJ1aWxkRGVmZXJyYWJsZShub2RlKTtcbiAgICB9XG4gICAgdmlzaXRDaGVja0NvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjaGVjayAoJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0Rm9yZWlnbktleUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdmb3JlaWduIGtleSAoJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJykgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVmZXJlbmNlcyk7XG4gICAgICAgIGlmIChub2RlLm9uRGVsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uIGRlbGV0ZSAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub25EZWxldGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uIHVwZGF0ZSAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub25VcGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVpbGREZWZlcnJhYmxlKG5vZGUpO1xuICAgIH1cbiAgICB2aXNpdExpc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdFdpdGgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnd2l0aCAnKTtcbiAgICAgICAgaWYgKG5vZGUucmVjdXJzaXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgncmVjdXJzaXZlICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7XG4gICAgfVxuICAgIHZpc2l0Q29tbW9uVGFibGVFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgaWYgKGlzQm9vbGVhbihub2RlLm1hdGVyaWFsaXplZCkpIHtcbiAgICAgICAgICAgIGlmICghbm9kZS5tYXRlcmlhbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnbm90ICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ21hdGVyaWFsaXplZCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICB2aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRBbHRlclRhYmxlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FsdGVyIHRhYmxlICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgaWYgKG5vZGUucmVuYW1lVG8pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdyZW5hbWUgdG8gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlbmFtZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXRTY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdzZXQgc2NoZW1hICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zZXRTY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFkZENvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYWRkQ29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcENvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZHJvcENvbnN0cmFpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnJlbmFtZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVuYW1lQ29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUNvbHVtbkFsdGVyYXRpb25zKG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFkZEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmFkZEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5kcm9wSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZHJvcEluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEFkZENvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhZGQgY29sdW1uICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgfVxuICAgIHZpc2l0UmVuYW1lQ29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlbmFtZSBjb2x1bW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyB0byAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZW5hbWVUbyk7XG4gICAgfVxuICAgIHZpc2l0RHJvcENvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdEFsdGVyQ29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FsdGVyIGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICBpZiAobm9kZS5kYXRhVHlwZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3VuY2VzTmV3Q29sdW1uRGF0YVR5cGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd0eXBlICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZSk7XG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhVHlwZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgndXNpbmcgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZUV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnNldERlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdzZXQgZGVmYXVsdCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2V0RGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcERlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGRlZmF1bHQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXROb3ROdWxsKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnc2V0IG5vdCBudWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcE5vdE51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIG5vdCBudWxsJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNb2RpZnlDb2x1bW4obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnbW9kaWZ5IGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdEFkZENvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnYWRkICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICB2aXNpdERyb3BDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Ryb3AgY29uc3RyYWludCAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb25zdHJhaW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlLm1vZGlmaWVyID09PSAnY2FzY2FkZScpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzY2FkZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubW9kaWZpZXIgPT09ICdyZXN0cmljdCcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgcmVzdHJpY3QnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlbmFtZUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncmVuYW1lIGNvbnN0cmFpbnQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2xkTmFtZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgdG8gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmV3TmFtZSk7XG4gICAgfVxuICAgIHZpc2l0U2V0T3BlcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vcGVyYXRvcik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIGlmIChub2RlLmFsbCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2FsbCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICB2aXNpdENyZWF0ZVZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlICcpO1xuICAgICAgICBpZiAobm9kZS5vclJlcGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdvciByZXBsYWNlICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm1hdGVyaWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ21hdGVyaWFsaXplZCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS50ZW1wb3JhcnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd0ZW1wb3JhcnkgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3ZpZXcgJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJykgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdhcyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0UmVmcmVzaE1hdGVyaWFsaXplZFZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncmVmcmVzaCBtYXRlcmlhbGl6ZWQgdmlldyAnKTtcbiAgICAgICAgaWYgKG5vZGUuY29uY3VycmVudGx5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uY3VycmVudGx5ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChub2RlLndpdGhOb0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgd2l0aCBubyBkYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHdpdGggZGF0YScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0RHJvcFZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCAnKTtcbiAgICAgICAgaWYgKG5vZGUubWF0ZXJpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbWF0ZXJpYWxpemVkICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd2aWV3ICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS5jYXNjYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEdlbmVyYXRlZChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdnZW5lcmF0ZWQgJyk7XG4gICAgICAgIGlmIChub2RlLmFsd2F5cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2Fsd2F5cyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5ieURlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdieSBkZWZhdWx0ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhcyAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWRlbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZGVudGl0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zdG9yZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgc3RvcmVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREZWZhdWx0VmFsdWUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGVmYXVsdCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdE1vZGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUucmF3TW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmF3TW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoU0VMRUNUX01PRElGSUVSX1NRTFtub2RlLm1vZGlmaWVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub2YpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb2YgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUub2YsICcsICcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlVHlwZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgdHlwZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUuZW51bSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyBlbnVtICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5lbnVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BUeXBlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Ryb3AgdHlwZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICB9XG4gICAgdmlzaXRFeHBsYWluKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2V4cGxhaW4nKTtcbiAgICAgICAgaWYgKG5vZGUub3B0aW9ucyB8fCBub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpKTtcbiAgICAgICAgICAgIGlmIChub2RlLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEV4cGxhaW5PcHRpb25zRGVsaW1pdGVyKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdmb3JtYXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEV4cGxhaW5PcHRpb25Bc3NpZ25tZW50KCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuZm9ybWF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0UmlnaHRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREZWZhdWx0SW5zZXJ0VmFsdWUoXykge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGVmYXVsdCcpO1xuICAgIH1cbiAgICB2aXNpdEFnZ3JlZ2F0ZUZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5mdW5jKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgaWYgKG5vZGUuZGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkaXN0aW5jdCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuYWdncmVnYXRlZCk7XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIGlmIChub2RlLndpdGhpbkdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHdpdGhpbiBncm91cCAoJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGhpbkdyb3VwKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGZpbHRlcignKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZmlsdGVyKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3Zlcikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3Zlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRPdmVyKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ292ZXIoJyk7XG4gICAgICAgIGlmIChub2RlLnBhcnRpdGlvbkJ5KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnBhcnRpdGlvbkJ5KTtcbiAgICAgICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JkZXJCeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRQYXJ0aXRpb25CeShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdwYXJ0aXRpb24gYnkgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5pdGVtcyk7XG4gICAgfVxuICAgIHZpc2l0UGFydGl0aW9uQnlJdGVtKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5wYXJ0aXRpb25CeSk7XG4gICAgfVxuICAgIHZpc2l0QmluYXJ5T3BlcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0T3BlcmFuZCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3BlcmF0b3IpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJpZ2h0T3BlcmFuZCk7XG4gICAgfVxuICAgIHZpc2l0VW5hcnlPcGVyYXRpb24obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhdG9yKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzTWludXNPcGVyYXRvcihub2RlLm9wZXJhdG9yKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhbmQpO1xuICAgIH1cbiAgICBpc01pbnVzT3BlcmF0b3Iobm9kZSkge1xuICAgICAgICByZXR1cm4gT3BlcmF0b3JOb2RlLmlzKG5vZGUpICYmIG5vZGUub3BlcmF0b3IgPT09ICctJztcbiAgICB9XG4gICAgdmlzaXRVc2luZyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCd1c2luZyAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnRhYmxlcyk7XG4gICAgfVxuICAgIHZpc2l0RnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChub2RlLmZ1bmMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRDYXNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Nhc2UnKTtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aGVuKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLndoZW4sICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZWxzZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBlbHNlICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5lbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnIGVuZCcpO1xuICAgICAgICBpZiAobm9kZS5pc1N0YXRlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRXaGVuKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3doZW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTtcbiAgICAgICAgaWYgKG5vZGUucmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHRoZW4gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRKU09OUmVmZXJlbmNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRyYXZlcnNhbCk7XG4gICAgfVxuICAgIHZpc2l0SlNPTlBhdGgobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pbk9wZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmluT3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKFwiJyRcIik7XG4gICAgICAgIGZvciAoY29uc3QgcGF0aExlZyBvZiBub2RlLnBhdGhMZWdzKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShwYXRoTGVnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZChcIidcIik7XG4gICAgfVxuICAgIHZpc2l0SlNPTlBhdGhMZWcobm9kZSkge1xuICAgICAgICBjb25zdCBpc0FycmF5TG9jYXRpb24gPSBub2RlLnR5cGUgPT09ICdBcnJheUxvY2F0aW9uJztcbiAgICAgICAgdGhpcy5hcHBlbmQoaXNBcnJheUxvY2F0aW9uID8gJ1snIDogJy4nKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoU3RyaW5nKG5vZGUudmFsdWUpKTtcbiAgICAgICAgaWYgKGlzQXJyYXlMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ10nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEpTT05PcGVyYXRvckNoYWluKG5vZGUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG5vZGUudmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3BlcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJy0+Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNZXJnZVF1ZXJ5KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ21lcmdlICcpO1xuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2ludG8gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW50byk7XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUud2hlbnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNYXRjaGVkKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm90KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbm90ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdtYXRjaGVkJyk7XG4gICAgICAgIGlmIChub2RlLmJ5U291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGJ5IHNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0QWRkSW5kZXgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnYWRkICcpO1xuICAgICAgICBpZiAobm9kZS51bmlxdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd1bmlxdWUgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2luZGV4ICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudXNpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdXNpbmcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnVzaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENhc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY2FzdCgnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0RmV0Y2gobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZmV0Y2ggbmV4dCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yb3dDb3VudCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKGAgcm93cyAke25vZGUubW9kaWZpZXJ9YCk7XG4gICAgfVxuICAgIHZpc2l0T3V0cHV0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ291dHB1dCAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnNlbGVjdGlvbnMpO1xuICAgIH1cbiAgICB2aXNpdFRvcChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGB0b3AoJHtub2RlLmV4cHJlc3Npb259KWApO1xuICAgICAgICBpZiAobm9kZS5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKGAgJHtub2RlLm1vZGlmaWVyc31gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9yQWN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5hY3Rpb24pO1xuICAgIH1cbiAgICB2aXNpdENvbGxhdGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY29sbGF0ZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2xsYXRpb24pO1xuICAgIH1cbiAgICBhcHBlbmQoc3RyKSB7XG4gICAgICAgIHRoaXMuI3NxbCArPSBzdHI7XG4gICAgfVxuICAgIGFwcGVuZFZhbHVlKHBhcmFtZXRlcikge1xuICAgICAgICB0aGlzLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpO1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpKTtcbiAgICB9XG4gICAgZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJ1wiJztcbiAgICB9XG4gICAgZ2V0UmlnaHRJZGVudGlmaWVyV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICdcIic7XG4gICAgfVxuICAgIGdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuICckJyArIHRoaXMubnVtUGFyYW1ldGVycztcbiAgICB9XG4gICAgZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICcoJztcbiAgICB9XG4gICAgZ2V0RXhwbGFpbk9wdGlvbkFzc2lnbm1lbnQoKSB7XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgfVxuICAgIGdldEV4cGxhaW5PcHRpb25zRGVsaW1pdGVyKCkge1xuICAgICAgICByZXR1cm4gJywgJztcbiAgICB9XG4gICAgZ2V0UmlnaHRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnKSc7XG4gICAgfVxuICAgIHNhbml0aXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IGxlZnRXcmFwID0gdGhpcy5nZXRMZWZ0SWRlbnRpZmllcldyYXBwZXIoKTtcbiAgICAgICAgY29uc3QgcmlnaHRXcmFwID0gdGhpcy5nZXRSaWdodElkZW50aWZpZXJXcmFwcGVyKCk7XG4gICAgICAgIGxldCBzYW5pdGl6ZWQgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHNhbml0aXplZCArPSBjO1xuICAgICAgICAgICAgaWYgKGMgPT09IGxlZnRXcmFwKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkICs9IGxlZnRXcmFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gcmlnaHRXcmFwKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkICs9IHJpZ2h0V3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuaXRpemVkO1xuICAgIH1cbiAgICBzYW5pdGl6ZVN0cmluZ0xpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoTElUX1dSQVBfUkVHRVgsIFwiJydcIik7XG4gICAgfVxuICAgIGFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpIHtcbiAgICAgICAgdGhpcy4jcGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcik7XG4gICAgfVxuICAgIGFwcGVuZEltbWVkaWF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kU3RyaW5nTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNOdW1iZXIodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkgfHwgaXNCaWdJbnQodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc051bGwodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbnVsbCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kSW1tZWRpYXRlVmFsdWUodmFsdWUudG9JU09TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW1tZWRpYXRlIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwZW5kU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChcIidcIik7XG4gICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuc2FuaXRpemVTdHJpbmdMaXRlcmFsKHZhbHVlKSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKFwiJ1wiKTtcbiAgICB9XG4gICAgc29ydFNlbGVjdE1vZGlmaWVycyhhcnIpIHtcbiAgICAgICAgYXJyLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm1vZGlmaWVyICYmIHJpZ2h0Lm1vZGlmaWVyXG4gICAgICAgICAgICA/IFNFTEVDVF9NT0RJRklFUl9QUklPUklUWVtsZWZ0Lm1vZGlmaWVyXSAtXG4gICAgICAgICAgICAgICAgU0VMRUNUX01PRElGSUVSX1BSSU9SSVRZW3JpZ2h0Lm1vZGlmaWVyXVxuICAgICAgICAgICAgOiAxKTtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZShhcnIpO1xuICAgIH1cbiAgICBjb21waWxlQ29sdW1uQWx0ZXJhdGlvbnMoY29sdW1uQWx0ZXJhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChjb2x1bW5BbHRlcmF0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRpYWxlY3QgYWRkcyBhIFwidHlwZVwiIGtleXdvcmQgYmVmb3JlIGEgY29sdW1uJ3MgbmV3IGRhdGFcbiAgICAgKiB0eXBlIGluIGFuIEFMVEVSIFRBQkxFIHN0YXRlbWVudC5cbiAgICAgKi9cbiAgICBhbm5vdW5jZXNOZXdDb2x1bW5EYXRhVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuY29uc3QgU0VMRUNUX01PRElGSUVSX1NRTCA9IGZyZWV6ZSh7XG4gICAgRm9yS2V5U2hhcmU6ICdmb3Iga2V5IHNoYXJlJyxcbiAgICBGb3JOb0tleVVwZGF0ZTogJ2ZvciBubyBrZXkgdXBkYXRlJyxcbiAgICBGb3JVcGRhdGU6ICdmb3IgdXBkYXRlJyxcbiAgICBGb3JTaGFyZTogJ2ZvciBzaGFyZScsXG4gICAgTm9XYWl0OiAnbm93YWl0JyxcbiAgICBTa2lwTG9ja2VkOiAnc2tpcCBsb2NrZWQnLFxuICAgIERpc3RpbmN0OiAnZGlzdGluY3QnLFxufSk7XG5jb25zdCBTRUxFQ1RfTU9ESUZJRVJfUFJJT1JJVFkgPSBmcmVlemUoe1xuICAgIEZvcktleVNoYXJlOiAxLFxuICAgIEZvck5vS2V5VXBkYXRlOiAxLFxuICAgIEZvclVwZGF0ZTogMSxcbiAgICBGb3JTaGFyZTogMSxcbiAgICBOb1dhaXQ6IDIsXG4gICAgU2tpcExvY2tlZDogMixcbiAgICBEaXN0aW5jdDogMCxcbn0pO1xuY29uc3QgSk9JTl9UWVBFX1NRTCA9IGZyZWV6ZSh7XG4gICAgSW5uZXJKb2luOiAnaW5uZXIgam9pbicsXG4gICAgTGVmdEpvaW46ICdsZWZ0IGpvaW4nLFxuICAgIFJpZ2h0Sm9pbjogJ3JpZ2h0IGpvaW4nLFxuICAgIEZ1bGxKb2luOiAnZnVsbCBqb2luJyxcbiAgICBDcm9zc0pvaW46ICdjcm9zcyBqb2luJyxcbiAgICBMYXRlcmFsSW5uZXJKb2luOiAnaW5uZXIgam9pbiBsYXRlcmFsJyxcbiAgICBMYXRlcmFsTGVmdEpvaW46ICdsZWZ0IGpvaW4gbGF0ZXJhbCcsXG4gICAgTGF0ZXJhbENyb3NzSm9pbjogJ2Nyb3NzIGpvaW4gbGF0ZXJhbCcsXG4gICAgT3V0ZXJBcHBseTogJ291dGVyIGFwcGx5JyxcbiAgICBDcm9zc0FwcGx5OiAnY3Jvc3MgYXBwbHknLFxuICAgIFVzaW5nOiAndXNpbmcnLFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R1bW15LWRyaXZlci5kLnRzXCIgLz5cbi8qKlxuICogQSBkcml2ZXIgdGhhdCBkb2VzIGFic29sdXRlbHkgbm90aGluZy5cbiAqXG4gKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGNyZWF0ZSBLeXNlbHkgaW5zdGFuY2VzIHNvbGVseSBmb3IgYnVpbGRpbmcgcXVlcmllc1xuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgS3lzZWx5IGluc3RhbmNlIGZvciBidWlsZGluZyBwb3N0Z3JlcyBxdWVyaWVzOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1xuICogICBEdW1teURyaXZlcixcbiAqICAgS3lzZWx5LFxuICogICBQb3N0Z3Jlc0FkYXB0ZXIsXG4gKiAgIFBvc3RncmVzSW50cm9zcGVjdG9yLFxuICogICBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXJcbiAqIH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogY29uc3QgZGIgPSBuZXcgS3lzZWx5PERhdGFiYXNlPih7XG4gKiAgIGRpYWxlY3Q6IHtcbiAqICAgICBjcmVhdGVBZGFwdGVyOiAoKSA9PiBuZXcgUG9zdGdyZXNBZGFwdGVyKCksXG4gKiAgICAgY3JlYXRlRHJpdmVyOiAoKSA9PiBuZXcgRHVtbXlEcml2ZXIoKSxcbiAqICAgICBjcmVhdGVJbnRyb3NwZWN0b3I6IChkYjogS3lzZWx5PGFueT4pID0+IG5ldyBQb3N0Z3Jlc0ludHJvc3BlY3RvcihkYiksXG4gKiAgICAgY3JlYXRlUXVlcnlDb21waWxlcjogKCkgPT4gbmV3IFBvc3RncmVzUXVlcnlDb21waWxlcigpLFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gdXNlIGl0IHRvIGJ1aWxkIGEgcXVlcnkgYW5kIGNvbXBpbGUgaXQgdG8gU1FMIGJ1dCB0cnlpbmcgdG9cbiAqIGV4ZWN1dGUgdGhlIHF1ZXJ5IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3FsIH0gPSBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3RBbGwoKS5jb21waWxlKClcbiAqIGNvbnNvbGUubG9nKHNxbCkgLy8gc2VsZWN0ICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIER1bW15RHJpdmVyIHtcbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVDb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IER1bW15Q29ubmVjdGlvbigpO1xuICAgIH1cbiAgICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyByZWxlYXNlU2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVG9TYXZlcG9pbnQoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgc2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuY2xhc3MgRHVtbXlDb25uZWN0aW9uIHtcbiAgICBhc3luYyBleGVjdXRlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3dzOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbVF1ZXJ5KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kaWFsZWN0LWFkYXB0ZXItYmFzZS5kLnRzXCIgLz5cbi8qKlxuICogQSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBgRGlhbGVjdEFkYXB0ZXJgIHdpdGggc2Vuc2libGUgZGVmYXVsdCB2YWx1ZXMuXG4gKiBUaGlyZC1wYXJ0eSBkaWFsZWN0cyBjYW4gZXh0ZW5kIHRoaXMgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhlIGBEaWFsZWN0QWRhcHRlcmBcbiAqIGludGVyZmFjZSBmcm9tIHNjcmF0Y2guIFRoYXQgd2F5IGFsbCBuZXcgc2V0dGluZ3Mgd2lsbCBnZXQgZGVmYXVsdCB2YWx1ZXMgd2hlblxuICogdGhleSBhcmUgYWRkZWQgYW5kIHRoZXJlIHdpbGwgYmUgbGVzcyBicmVha2luZyBjaGFuZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgRGlhbGVjdEFkYXB0ZXJCYXNlIHtcbiAgICBnZXQgc3VwcG9ydHNDcmVhdGVJZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c1RyYW5zYWN0aW9uYWxEZGwoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHN1cHBvcnRzUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c091dHB1dCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc3FsaXRlLXF1ZXJ5LWNvbXBpbGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgRGVmYXVsdFF1ZXJ5Q29tcGlsZXIgfSBmcm9tICcuLi8uLi9xdWVyeS1jb21waWxlci9kZWZhdWx0LXF1ZXJ5LWNvbXBpbGVyLmpzJztcbmNvbnN0IElEX1dSQVBfUkVHRVggPSAvXCIvZztcbmV4cG9ydCBjbGFzcyBTcWxpdGVRdWVyeUNvbXBpbGVyIGV4dGVuZHMgRGVmYXVsdFF1ZXJ5Q29tcGlsZXIge1xuICAgIHZpc2l0T3JBY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb3IgJyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuYWN0aW9uKTtcbiAgICB9XG4gICAgZ2V0Q3VycmVudFBhcmFtZXRlclBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gJz8nO1xuICAgIH1cbiAgICBnZXRMZWZ0RXhwbGFpbk9wdGlvbnNXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGdldFJpZ2h0RXhwbGFpbk9wdGlvbnNXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGdldExlZnRJZGVudGlmaWVyV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICdcIic7XG4gICAgfVxuICAgIGdldFJpZ2h0SWRlbnRpZmllcldyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnXCInO1xuICAgIH1cbiAgICBnZXRBdXRvSW5jcmVtZW50KCkge1xuICAgICAgICByZXR1cm4gJ2F1dG9pbmNyZW1lbnQnO1xuICAgIH1cbiAgICBzYW5pdGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5yZXBsYWNlKElEX1dSQVBfUkVHRVgsICdcIlwiJyk7XG4gICAgfVxuICAgIHZpc2l0RGVmYXVsdEluc2VydFZhbHVlKF8pIHtcbiAgICAgICAgLy8gc3FsaXRlIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYGRlZmF1bHRgIGtleXdvcmQgaW4gaW5zZXJ0cy5cbiAgICAgICAgdGhpcy5hcHBlbmQoJ251bGwnKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NxbGl0ZS1hZGFwdGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgRGlhbGVjdEFkYXB0ZXJCYXNlIH0gZnJvbSAnLi4vZGlhbGVjdC1hZGFwdGVyLWJhc2UuanMnO1xuZXhwb3J0IGNsYXNzIFNxbGl0ZUFkYXB0ZXIgZXh0ZW5kcyBEaWFsZWN0QWRhcHRlckJhc2Uge1xuICAgIGdldCBzdXBwb3J0c1RyYW5zYWN0aW9uYWxEZGwoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHN1cHBvcnRzUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZU1pZ3JhdGlvbkxvY2soX2RiLCBfb3B0KSB7XG4gICAgICAgIC8vIFNRTGl0ZSBvbmx5IGhhcyBvbmUgY29ubmVjdGlvbiB0aGF0J3MgcmVzZXJ2ZWQgYnkgdGhlIG1pZ3JhdGlvbiBzeXN0ZW1cbiAgICAgICAgLy8gZm9yIHRoZSB3aG9sZSB0aW1lIGJldHdlZW4gYWNxdWlyZU1pZ3JhdGlvbkxvY2sgYW5kIHJlbGVhc2VNaWdyYXRpb25Mb2NrLlxuICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJlbGVhc2VNaWdyYXRpb25Mb2NrKF9kYiwgX29wdCkge1xuICAgICAgICAvLyBTUUxpdGUgb25seSBoYXMgb25lIGNvbm5lY3Rpb24gdGhhdCdzIHJlc2VydmVkIGJ5IHRoZSBtaWdyYXRpb24gc3lzdGVtXG4gICAgICAgIC8vIGZvciB0aGUgd2hvbGUgdGltZSBiZXR3ZWVuIGFjcXVpcmVNaWdyYXRpb25Mb2NrIGFuZCByZWxlYXNlTWlncmF0aW9uTG9jay5cbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLlxuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcG9zdGdyZXMtcXVlcnktY29tcGlsZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEZWZhdWx0UXVlcnlDb21waWxlciB9IGZyb20gJy4uLy4uL3F1ZXJ5LWNvbXBpbGVyL2RlZmF1bHQtcXVlcnktY29tcGlsZXIuanMnO1xuY29uc3QgSURfV1JBUF9SRUdFWCA9IC9cIi9nO1xuZXhwb3J0IGNsYXNzIFBvc3RncmVzUXVlcnlDb21waWxlciBleHRlbmRzIERlZmF1bHRRdWVyeUNvbXBpbGVyIHtcbiAgICBzYW5pdGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5yZXBsYWNlKElEX1dSQVBfUkVHRVgsICdcIlwiJyk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wb3N0Z3Jlcy1hZGFwdGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgc3FsIH0gZnJvbSAnLi4vLi4vcmF3LWJ1aWxkZXIvc3FsLmpzJztcbmltcG9ydCB7IERpYWxlY3RBZGFwdGVyQmFzZSB9IGZyb20gJy4uL2RpYWxlY3QtYWRhcHRlci1iYXNlLmpzJztcbi8vIFJhbmRvbSBpZCBmb3Igb3VyIHRyYW5zYWN0aW9uIGxvY2suXG5jb25zdCBMT0NLX0lEID0gQmlnSW50KCczODUzMzE0NzkxMDYyMzA5MTA3Jyk7XG5leHBvcnQgY2xhc3MgUG9zdGdyZXNBZGFwdGVyIGV4dGVuZHMgRGlhbGVjdEFkYXB0ZXJCYXNlIHtcbiAgICBnZXQgc3VwcG9ydHNUcmFuc2FjdGlvbmFsRGRsKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IHN1cHBvcnRzUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZU1pZ3JhdGlvbkxvY2soZGIsIF9vcHQpIHtcbiAgICAgICAgLy8gQWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxldmVsIGFkdmlzb3J5IGxvY2suXG4gICAgICAgIGF3YWl0IHNxbCBgc2VsZWN0IHBnX2Fkdmlzb3J5X3hhY3RfbG9jaygke3NxbC5saXQoTE9DS19JRCl9KWAuZXhlY3V0ZShkYik7XG4gICAgfVxuICAgIGFzeW5jIHJlbGVhc2VNaWdyYXRpb25Mb2NrKF9kYiwgX29wdCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuIGBwZ19hZHZpc29yeV94YWN0X2xvY2tgIGlzIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQgYXQgdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gYW5kIHNpbmNlIGBzdXBwb3J0c1RyYW5zYWN0aW9uYWxEZGxgIHRydWUsIHdlIGtub3dcbiAgICAgICAgLy8gdGhlIGBkYmAgaW5zdGFuY2UgcGFzc2VkIHRvIGFjcXVpcmVNaWdyYXRpb25Mb2NrIGlzIGFjdHVhbGx5IGEgdHJhbnNhY3Rpb24uXG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9teXNxbC1xdWVyeS1jb21waWxlci5kLnRzXCIgLz5cbmltcG9ydCB7IERlZmF1bHRRdWVyeUNvbXBpbGVyIH0gZnJvbSAnLi4vLi4vcXVlcnktY29tcGlsZXIvZGVmYXVsdC1xdWVyeS1jb21waWxlci5qcyc7XG5jb25zdCBJRF9XUkFQX1JFR0VYID0gL2AvZztcbmV4cG9ydCBjbGFzcyBNeXNxbFF1ZXJ5Q29tcGlsZXIgZXh0ZW5kcyBEZWZhdWx0UXVlcnlDb21waWxlciB7XG4gICAgZ2V0Q3VycmVudFBhcmFtZXRlclBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gJz8nO1xuICAgIH1cbiAgICBnZXRMZWZ0RXhwbGFpbk9wdGlvbnNXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGdldEV4cGxhaW5PcHRpb25Bc3NpZ25tZW50KCkge1xuICAgICAgICByZXR1cm4gJz0nO1xuICAgIH1cbiAgICBnZXRFeHBsYWluT3B0aW9uc0RlbGltaXRlcigpIHtcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICB9XG4gICAgZ2V0UmlnaHRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJ2AnO1xuICAgIH1cbiAgICBnZXRSaWdodElkZW50aWZpZXJXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJ2AnO1xuICAgIH1cbiAgICBzYW5pdGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5yZXBsYWNlKElEX1dSQVBfUkVHRVgsICdgYCcpO1xuICAgIH1cbiAgICB2aXNpdENyZWF0ZUluZGV4KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2NyZWF0ZSAnKTtcbiAgICAgICAgaWYgKG5vZGUudW5pcXVlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgndW5pcXVlICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdpbmRleCAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZOb3RFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBub3QgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHVzaW5nICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbXlzcWwtYWRhcHRlci5kLnRzXCIgLz5cbmltcG9ydCB7IHNxbCB9IGZyb20gJy4uLy4uL3Jhdy1idWlsZGVyL3NxbC5qcyc7XG5pbXBvcnQgeyBEaWFsZWN0QWRhcHRlckJhc2UgfSBmcm9tICcuLi9kaWFsZWN0LWFkYXB0ZXItYmFzZS5qcyc7XG5jb25zdCBMT0NLX0lEID0gJ2VhNTg2MzMwLTJjOTMtNDdjOC05MDhkLTk4MWQ5ZDI3MGY5ZCc7XG5jb25zdCBMT0NLX1RJTUVPVVRfU0VDT05EUyA9IDYwICogNjA7XG5leHBvcnQgY2xhc3MgTXlzcWxBZGFwdGVyIGV4dGVuZHMgRGlhbGVjdEFkYXB0ZXJCYXNlIHtcbiAgICBnZXQgc3VwcG9ydHNUcmFuc2FjdGlvbmFsRGRsKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c1JldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhc3luYyBhY3F1aXJlTWlncmF0aW9uTG9jayhkYiwgX29wdCkge1xuICAgICAgICAvLyBLeXNlbHkgdXNlcyBhIHNpbmdsZSBjb25uZWN0aW9uIHRvIHJ1biB0aGUgbWlncmF0aW9ucy4gQmVjYXVzZSBvZiB0aGF0LCB3ZVxuICAgICAgICAvLyBjYW4gdGFrZSBhIGxvY2sgdXNpbmcgYGdldF9sb2NrYC4gTG9ja3MgYWNxdWlyZWQgdXNpbmcgYGdldF9sb2NrYCBnZXRcbiAgICAgICAgLy8gcmVsZWFzZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWQgKHNlc3Npb24gZW5kcykgb3Igd2hlbiB0aGUgbG9ja1xuICAgICAgICAvLyBpcyByZWxlYXNlZCB1c2luZyBgcmVsZWFzZV9sb2NrYC4gVGhpcyB3YXkgd2Uga25vdyB0aGF0IHRoZSBsb2NrIGlzIGVpdGhlclxuICAgICAgICAvLyByZWxlYXNlZCBieSB1cyBhZnRlciBzdWNjZXNzZnVsbCBvciBmYWlsZWQgbWlncmF0aW9ucyBPUiBpdCdzIHJlbGVhc2VkIGJ5XG4gICAgICAgIC8vIE15U1FMIGlmIHRoZSBwcm9jZXNzIGdldHMga2lsbGVkIGZvciBzb21lIHJlYXNvbi5cbiAgICAgICAgYXdhaXQgc3FsIGBzZWxlY3QgZ2V0X2xvY2soJHtzcWwubGl0KExPQ0tfSUQpfSwgJHtzcWwubGl0KExPQ0tfVElNRU9VVF9TRUNPTkRTKX0pYC5leGVjdXRlKGRiKTtcbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZU1pZ3JhdGlvbkxvY2soZGIsIF9vcHQpIHtcbiAgICAgICAgYXdhaXQgc3FsIGBzZWxlY3QgcmVsZWFzZV9sb2NrKCR7c3FsLmxpdChMT0NLX0lEKX0pYC5leGVjdXRlKGRiKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNxbFdoZXJlQ2xhdXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3aXRob3V0TGVhZGluZ1doZXJlID0gaW5wdXRcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2UoL153aGVyZVxcYi9pLCBcIlwiKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIHdpdGhvdXRMZWFkaW5nV2hlcmUucmVwbGFjZSgvOyskL3UsIFwiXCIpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0VtYmVkZGVkU3FsU3RhdGVtZW50U2VwYXJhdG9yKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlucHV0LnRyaW0oKS5yZXBsYWNlKC87KyQvdSwgXCJcIikuaW5jbHVkZXMoXCI7XCIpO1xufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQ29tcGlsYWJsZSxcbiAgdHlwZSBEaWFsZWN0QWRhcHRlcixcbiAgRHVtbXlEcml2ZXIsXG4gIHR5cGUgRXhwcmVzc2lvbixcbiAgdHlwZSBFeHByZXNzaW9uQnVpbGRlcixcbiAgZXhwcmVzc2lvbkJ1aWxkZXIsXG4gIHR5cGUgRXhwcmVzc2lvbldyYXBwZXIsXG4gIHR5cGUgSW5zZXJ0T2JqZWN0LFxuICBLeXNlbHksXG4gIHR5cGUgS3lzZWx5UGx1Z2luLFxuICBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIsXG4gIHR5cGUgUGx1Z2luVHJhbnNmb3JtUXVlcnlBcmdzLFxuICB0eXBlIFBsdWdpblRyYW5zZm9ybVJlc3VsdEFyZ3MsXG4gIHR5cGUgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSxcbiAgdHlwZSBRdWVyeUNvbXBpbGVyLFxuICB0eXBlIFF1ZXJ5UmVzdWx0IGFzIEt5c2VseVF1ZXJ5UmVzdWx0LFxuICB0eXBlIFJvb3RPcGVyYXRpb25Ob2RlLFxuICBzcWwsXG4gIHR5cGUgU3FsQm9vbCxcbiAgdHlwZSBVbmtub3duUm93LFxuICB0eXBlIFVwZGF0ZU9iamVjdCxcbiAgVmFsdWVMaXN0Tm9kZSxcbiAgVmFsdWVOb2RlLFxuICB0eXBlIFdoZXJlSW50ZXJmYWNlLFxufSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZVNxbFdoZXJlQ2xhdXNlIH0gZnJvbSBcIi4uL2xpYi9zcWwtZmlsdGVyXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbHVtbixcbiAgQ29sdW1uRmlsdGVyLFxuICBGaWx0ZXJHcm91cCxcbiAgU3FsRmlsdGVyLFxuICBUYWJsZSxcbn0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9CT09MRUFOLFxuICBERUZBVUxUX0pTT04sXG4gIERFRkFVTFRfTlVNRVJJQyxcbiAgREVGQVVMVF9TVFJJTkcsXG4gIGdldERhdGUwLFxufSBmcm9tIFwiLi9kZWZhdWx0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJSZXF1aXJlbWVudHMge1xuICBBZGFwdGVyOiB7IG5ldyAoKTogRGlhbGVjdEFkYXB0ZXIgfTtcbiAgbm9QYXJhbWV0ZXJzPzogYm9vbGVhbjtcbiAgUXVlcnlDb21waWxlcjogeyBuZXcgKCk6IFF1ZXJ5Q29tcGlsZXIgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkZXI8REI+KHJlcXVpcmVtZW50czogQnVpbGRlclJlcXVpcmVtZW50cyk6IEt5c2VseTxEQj4ge1xuICByZXR1cm4gbmV3IEt5c2VseSh7XG4gICAgZGlhbGVjdDoge1xuICAgICAgY3JlYXRlQWRhcHRlcjogKCkgPT4gbmV3IHJlcXVpcmVtZW50cy5BZGFwdGVyKCksXG4gICAgICBjcmVhdGVEcml2ZXI6ICgpID0+IG5ldyBEdW1teURyaXZlcigpLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHdlIGRvbid0IG5lZWQgYnVpbHQtaW4gaW50cm9zcGVjdGlvbiBpbiB0aGlzIGNhc2VcbiAgICAgIGNyZWF0ZUludHJvc3BlY3RvcjogKCkgPT4gbnVsbCxcbiAgICAgIGNyZWF0ZVF1ZXJ5Q29tcGlsZXI6ICgpID0+IG5ldyByZXF1aXJlbWVudHMuUXVlcnlDb21waWxlcigpLFxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgLi4uKHJlcXVpcmVtZW50cy5ub1BhcmFtZXRlcnMgPyBbbmV3IEltbWVkaWF0ZVZhbHVlUGx1Z2luKCldIDogW10pLFxuICAgIF0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIHRoYXQgdHJhbnNmb3JtcyBhbGwgdmFsdWVzIHRvIGltbWVkaWF0ZSB2YWx1ZXMuIFRoaXMgbWVhbnMgdGhlaXIgaW5qZWN0ZWQgaW50byB0aGUgU1FMIHN0cmluZyBpbnN0ZWFkIG9mIHBvcHVsYXRpbmcgdGhlIHBhcmFtZXRlcnMgYXJyYXkuXG4gKiBJbiBzb21lIHNpdHVhdGlvbnMsIGEgZGF0YWJhc2UgZHJpdmVyIG1pZ2h0IG5vdCBzdXBwb3J0IHBhcmFtZXRlcnMsIGFuZCB0aGlzIHBsdWdpbiBjYW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGF0LlxuICovXG5jbGFzcyBJbW1lZGlhdGVWYWx1ZVBsdWdpbiBpbXBsZW1lbnRzIEt5c2VseVBsdWdpbiB7XG4gIHJlYWRvbmx5ICN0cmFuc2Zvcm1lciA9IG5ldyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyKCk7XG5cbiAgdHJhbnNmb3JtUXVlcnkoYXJnczogUGx1Z2luVHJhbnNmb3JtUXVlcnlBcmdzKTogUm9vdE9wZXJhdGlvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSk7XG4gIH1cblxuICB0cmFuc2Zvcm1SZXN1bHQoXG4gICAgYXJnczogUGx1Z2luVHJhbnNmb3JtUmVzdWx0QXJncyxcbiAgKTogUHJvbWlzZTxLeXNlbHlRdWVyeVJlc3VsdDxVbmtub3duUm93Pj4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXJncy5yZXN1bHQpO1xuICB9XG59XG5cbmNsYXNzIEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0KFxuICAgIG5vZGU6IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUsXG4gICk6IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUge1xuICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShcbiAgICAgIG5vZGUudmFsdWVzLm1hcChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKSxcbiAgICApIGFzIG5ldmVyO1xuICB9XG5cbiAgb3ZlcnJpZGUgdHJhbnNmb3JtVmFsdWUobm9kZTogVmFsdWVOb2RlKTogVmFsdWVOb2RlIHtcbiAgICByZXR1cm4geyAuLi5zdXBlci50cmFuc2Zvcm1WYWx1ZShub2RlKSwgaW1tZWRpYXRlOiB0cnVlIH07XG4gIH1cbn1cblxuZGVjbGFyZSBjb25zdCBxdWVyeVR5cGU6IHVuaXF1ZSBzeW1ib2w7XG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBbcXVlcnlUeXBlXT86IFQ7XG4gIHBhcmFtZXRlcnM6IHJlYWRvbmx5IHVua25vd25bXTtcbiAgc3FsOiBzdHJpbmc7XG4gIHRyYW5zZm9ybWF0aW9ucz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIFwianNvbi1wYXJzZVwiPj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc1F1ZXJ5PFQ+KHF1ZXJ5OiBzdHJpbmcgfCBRdWVyeTx1bmtub3duPik6IFF1ZXJ5PFQ+IHtcbiAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7IHBhcmFtZXRlcnM6IFtdLCBzcWw6IHF1ZXJ5IH0gYXMgbmV2ZXI7XG4gIH1cblxuICByZXR1cm4gcXVlcnkgYXMgbmV2ZXI7XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UmVzdWx0PFQ+ID1cbiAgVCBleHRlbmRzIFF1ZXJ5PGluZmVyIFI+XG4gICAgPyBSW11cbiAgICA6IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IFF1ZXJ5PGluZmVyIFI+XG4gICAgICA/IFJbXVxuICAgICAgOiBuZXZlcjtcblxuZXhwb3J0IGludGVyZmFjZSBDb21waWxlT3B0aW9uczxUPiB7XG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgY29sdW1uIG5hbWVzIHRvIHRyYW5zZm9ybWF0aW9ucyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSByZXN1bHQuXG4gICAqIEN1cnJlbnRseSBzdXBwb3J0ZWQgdHJhbnNmb3JtYXRpb24gaXMgXCJqc29uLXBhcnNlXCIsIHdoaWNoIHBhcnNlcyBhIEpTT04gc3RyaW5nIGludG8gYW4gb2JqZWN0LlxuICAgKi9cbiAgdHJhbnNmb3JtYXRpb25zPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgXCJqc29uLXBhcnNlXCI+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGU8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgY29tcGlsZWFibGU6IENvbXBpbGFibGU8VD4sXG4gIG9wdGlvbnM/OiBDb21waWxlT3B0aW9uczxUPixcbik6IFF1ZXJ5PFQ+IHtcbiAgY29uc3QgY29tcGlsZWRRdWVyeSA9IGNvbXBpbGVhYmxlLmNvbXBpbGUoKTtcblxuICByZXR1cm4ge1xuICAgIHBhcmFtZXRlcnM6IGNvbXBpbGVkUXVlcnkucGFyYW1ldGVycyxcbiAgICBzcWw6IGNvbXBpbGVkUXVlcnkuc3FsLFxuICAgIHRyYW5zZm9ybWF0aW9uczogb3B0aW9ucz8udHJhbnNmb3JtYXRpb25zLFxuICB9O1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBmaWx0ZXIgdG8gdGhlIGdpdmVuIHJvd3MgYmFzZWQgb24gdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxuICpcbiAqIEBleGFtcGxlIGRiLnNlbGVjdEZyb20oXCJ1c2Vyc1wiKS4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSkuc2VsZWN0QWxsKClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKFxuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICBjb2x1bW5zOiBUYWJsZVtcImNvbHVtbnNcIl0sXG4pIHtcbiAgY29uc3Qgcm93RmlsdGVycyA9IGluZmVyUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZXR1cm4gPFFCIGV4dGVuZHMgV2hlcmVJbnRlcmZhY2U8YW55LCBhbnk+PihxYjogUUIpOiBRQiA9PlxuICAgIHFiLndoZXJlKChlYikgPT4ge1xuICAgICAgcmV0dXJuIGViLm9yKFxuICAgICAgICByb3dGaWx0ZXJzLm1hcCgocm93RmlsdGVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGViLmFuZChcbiAgICAgICAgICAgIHJvd0ZpbHRlci5tYXAoKFtjb2x1bW5OYW1lLCB2YWx1ZV0pID0+XG4gICAgICAgICAgICAgIGViKFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWUgPT09IG51bGwgPyBcImlzXCIgOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFwiaW5cIiA6IFwiPVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSkgYXMgbmV2ZXI7XG59XG5cbi8qKlxuICogUGFydCBvZiBhIGZpbHRlciB0aGF0IHByZWRpY3RzIGEgbWF0Y2guXG4gKiBpZS4gLi4uIFdIRVJFICRDb2x1bU5hbWUgPSAkVmFsdWUgLi4uXG4gKi9cblxudHlwZSBSb3dGaWx0ZXJQcmVkaWNhdGUgPSBbXG4gIENvbHVtbk5hbWU6IHN0cmluZyB8IEV4cHJlc3Npb248YW55PixcbiAgVmFsdWU6IHVua25vd24sXG5dO1xuXG4vKipcbiAqIEEgcm93IGZpbHRlciBpcyBjb21wcmlzZWQgb2Ygb25lIG9yIG1vcmUgcHJlZGljYXRlcy5cbiAqL1xudHlwZSBSb3dGaWx0ZXIgPSBSb3dGaWx0ZXJQcmVkaWNhdGVbXTtcblxuLyoqXG4gKiBSb3cgZmlsdGVycyBpcyBzaW1wbHkgYSBzZXQgb2YgbXVsdGlwbGUge0BsaW5rIFJvd0ZpbHRlcn0uXG4gKi9cbnR5cGUgUm93RmlsdGVycyA9IFJvd0ZpbHRlcltdO1xuXG4vKipcbiAqIEluZmVycyB0aGUgZmlsdGVyIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgZ2l2ZW4gcm93XG4gKiBpbmRpdmlkdWFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckZpbHRlck9iamVjdChcbiAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBmaWx0ZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyhjb2x1bW5zKSkge1xuICAgIGNvbnN0IHsgbmFtZTogY29sdW1uTmFtZSwgcGtQb3NpdGlvbiB9ID0gY29sdW1uO1xuXG4gICAgaWYgKHBrUG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZmlsdGVyW2NvbHVtbk5hbWVdID0gcm93W2NvbHVtbk5hbWVdID8/IG51bGw7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyO1xufVxuXG4vKipcbiAqIEluZmVycyB0aGUgZmlsdGVyIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIHVuaXF1ZWx5IGlkZW50aWZ5IG11bHRpcGxlIHJvd3NcbiAqIGluZGl2aWR1YWxseS5cbiAqXG4gKiBFbGVnYW50bHkgaW5mZXJzIHRoZSBiZXN0IHBvc3NpYmxlIHN0YXRlbWVudCB0byBmaWx0ZXIgd2l0aC5cbiAqIFRPRE86IGlmIHdlIGV2ZXIgc3VwcG9ydCBNU1NRTCwgd2UnbGwgbmVlZCB0byBkcm9wIHRvIGR1bWIgKC4uLiBhbmQgLi4uKSBvciAoLi4uIGFuZCAuLi4pIGxpa2UgaW4gdGhlIG9sZCB3YXkganVzdCBmb3IgTVNTUUwuXG4gKlxuICogRm9yIHNpbmdsZSBjb2x1bW4gcHJpbWFyeSBrZXk6XG4gKlxuICogMS4gaWYgb25seSAxIHJvdzogY29sID0gdmFsdWVcbiAqIDIuIGlmIG11bHRpcGxlIHJvd3M6IGNvbCBJTiAodmFsdWUxLCB2YWx1ZTIsIC4uLilcbiAqXG4gKiBGb3IgY29tcG9zaXRlIHByaW1hcnkga2V5OlxuICpcbiAqIDEuIGlmIG9ubHkgMSByb3c6IChjb2wxLCBjb2wyLCAuLi4pID0gKHZhbHVlMSwgdmFsdWUyLCAuLi4pXG4gKiAyLiBpZiBtdWx0aXBsZSByb3dzOiAoY29sMSwgY29sMiwgLi4uKSBJTiAoKHZhbHVlMWEsIHZhbHVlMmEsIC4uLiksICh2YWx1ZTFiLCB2YWx1ZTJiLCAuLi4pLCAuLi4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlclJvd0ZpbHRlcnMoXG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSxcbik6IFJvd0ZpbHRlcnMge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCByZWZzOiBFeHByZXNzaW9uV3JhcHBlcjxhbnksIGFueSwgYW55PltdID0gW107XG4gIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gW107XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3QgZWIgPSBleHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4oKTtcblxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgY29uc3QgdmFsdWVzRm9yUm93OiB1bmtub3duW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoY29sdW1ucykpIHtcbiAgICAgIGNvbnN0IHsgbmFtZTogY29sdW1uTmFtZSwgcGtQb3NpdGlvbiB9ID0gY29sdW1uO1xuXG4gICAgICBpZiAocGtQb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa0luZGV4ID0gcGtQb3NpdGlvbiAtIDE7XG5cbiAgICAgIGlmIChyb3cgPT09IHJvd3MuYXQoMCkpIHtcbiAgICAgICAgcmVmc1twa0luZGV4XSA9IGViLnJlZihjb2x1bW5OYW1lKTtcbiAgICAgIH1cblxuICAgICAgdmFsdWVzRm9yUm93W3BrSW5kZXhdID0gdHJhbnNmb3JtVmFsdWUocm93W2NvbHVtbk5hbWVdID8/IG51bGwsIGNvbHVtbik7XG4gICAgfVxuXG4gICAgdmFsdWVzLnB1c2goXG4gICAgICByZWZzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc0ZvclJvdy5hdCgwKSEgOiB0dXBsZUZyb20odmFsdWVzRm9yUm93KSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbGhzID0gcmVmcy5sZW5ndGggPT09IDEgPyByZWZzLmF0KDApISA6IHR1cGxlRnJvbShyZWZzKTtcbiAgY29uc3QgcmhzID0gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlcy5hdCgwKSEgOiB2YWx1ZXM7XG5cbiAgcmV0dXJuIFtbW2xocywgcmhzXV1dO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gdHVwbGVGcm9tKGl0ZW1zOiB1bmtub3duW10pOiBFeHByZXNzaW9uPGFueT4ge1xuICByZXR1cm4gc3FsYCgke3NxbC5qb2luKGl0ZW1zLCBzcWxgLCBgKX0pYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseVdyaXRlVHJhbnNmb3JtYXRpb25zUHJvcHM8QyBleHRlbmRzIFwiaW5zZXJ0XCIgfCBcInVwZGF0ZVwiPiB7XG4gIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXTtcbiAgY29udGV4dDogQztcbiAgdmFsdWVzOiBDIGV4dGVuZHMgXCJ1cGRhdGVcIlxuICAgID8gUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VHJhbnNmb3JtYXRpb25zPEMgZXh0ZW5kcyBcImluc2VydFwiIHwgXCJ1cGRhdGVcIj4oXG4gIHByb3BzOiBBcHBseVdyaXRlVHJhbnNmb3JtYXRpb25zUHJvcHM8Qz4sXG4pOiBDIGV4dGVuZHMgXCJ1cGRhdGVcIlxuICA/ICgpID0+IFVwZGF0ZU9iamVjdDxhbnksIGFueT5cbiAgOiAoKSA9PiBJbnNlcnRPYmplY3Q8YW55LCBhbnk+IHwgSW5zZXJ0T2JqZWN0PGFueSwgYW55PltdIHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHByb3BzO1xuXG4gIHJldHVybiAoKSA9PlxuICAgIEFycmF5LmlzQXJyYXkodmFsdWVzKVxuICAgICAgPyB2YWx1ZXMubWFwKChyb3cpID0+IHRyYW5zZm9ybVZhbHVlcyh7IC4uLnByb3BzLCB2YWx1ZXM6IHJvdyB9KSlcbiAgICAgIDogdHJhbnNmb3JtVmFsdWVzKHsgLi4ucHJvcHMsIHZhbHVlcyB9KTtcbn1cblxuaW50ZXJmYWNlIFRyYW5zZm9ybVZhbHVlc1Byb3BzIHtcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdO1xuICBjb250ZXh0OiBcImluc2VydFwiIHwgXCJ1cGRhdGVcIjtcbiAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZDogYm9vbGVhbjtcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtVmFsdWVzKFxuICBwcm9wczogVHJhbnNmb3JtVmFsdWVzUHJvcHMsXG4pOiBJbnNlcnRPYmplY3Q8dW5rbm93biwgbmV2ZXI+IHwgVXBkYXRlT2JqZWN0PHVua25vd24sIG5ldmVyPiB7XG4gIGNvbnN0IHsgY29sdW1ucywgY29udGV4dCwgc3VwcG9ydHNEZWZhdWx0S2V5d29yZCwgdmFsdWVzIH0gPSBwcm9wcztcblxuICBjb25zdCB2YWx1ZUVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZXMpO1xuXG4gIGNvbnN0IHJlcXVpcmVkQ29sdW1ucyA9XG4gICAgY29udGV4dCA9PT0gXCJ1cGRhdGVcIlxuICAgICAgPyBbXVxuICAgICAgOiBPYmplY3QudmFsdWVzKGNvbHVtbnMpLmZpbHRlcigoY29sKSA9PiBjb2wuaXNSZXF1aXJlZCk7XG5cbiAgaWYgKFxuICAgIGNvbnRleHQgPT09IFwiaW5zZXJ0XCIgJiZcbiAgICB2YWx1ZUVudHJpZXMubGVuZ3RoID09PSAwICYmXG4gICAgcmVxdWlyZWRDb2x1bW5zLmxlbmd0aCA9PT0gMFxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgW09iamVjdC5rZXlzKGNvbHVtbnMpLmF0KDApIV06IHN1cHBvcnRzRGVmYXVsdEtleXdvcmRcbiAgICAgICAgPyBzcWxgZGVmYXVsdGBcbiAgICAgICAgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdmFsdWVFbnRyaWVzLnJlZHVjZShcbiAgICAob2JqLCBba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAuLi5vYmosXG4gICAgICBba2V5XTogdHJhbnNmb3JtVmFsdWUodmFsdWUsIGNvbHVtbnNba2V5XSEsIHN1cHBvcnRzRGVmYXVsdEtleXdvcmQpLFxuICAgIH0pLFxuICAgIHJlcXVpcmVkQ29sdW1ucy5yZWR1Y2UoKGRlZmF1bHRzLCBjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHsgZGF0YXR5cGUsIGZrQ29sdW1uLCBuYW1lIH0gPSBjb2x1bW47XG4gICAgICBjb25zdCB7IGZvcm1hdCwgZ3JvdXAsIGlzQXJyYXkgfSA9IGRhdGF0eXBlO1xuXG4gICAgICAvLyBkbyBub3QgYXR0ZW1wdCB0byBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciBmb3JlaWduIGtleXMsIGFzIGl0J2xsIHByb2JhYmx5XG4gICAgICAvLyBmYWlsIGR1ZSB0byByZWZlcmVudGlhbCBpbnRlZ3JpdHkgY2hlY2tzIVxuICAgICAgaWYgKGZrQ29sdW1uKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkgfHwgZ3JvdXAgPT09IFwianNvblwiKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRzLCBbbmFtZV06IERFRkFVTFRfSlNPTiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3JvdXAgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRzLCBbbmFtZV06IERFRkFVTFRfQk9PTEVBTiB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3JvdXAgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uZGVmYXVsdHMsIFtuYW1lXTogREVGQVVMVF9TVFJJTkcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdyb3VwID09PSBcIm51bWVyaWNcIikge1xuICAgICAgICByZXR1cm4geyAuLi5kZWZhdWx0cywgW25hbWVdOiBERUZBVUxUX05VTUVSSUMgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKChncm91cCA9PT0gXCJkYXRldGltZVwiIHx8IGdyb3VwID09PSBcInRpbWVcIikgJiYgZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB7IC4uLmRlZmF1bHRzLCBbbmFtZV06IGdldERhdGUwKGZvcm1hdCkgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH0sIHt9KSBhcyBJbnNlcnRPYmplY3Q8dW5rbm93biwgbmV2ZXI+IHwgVXBkYXRlT2JqZWN0PHVua25vd24sIG5ldmVyPixcbiAgKTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb2x1bW46IENvbHVtbixcbiAgc3VwcG9ydHNEZWZhdWx0S2V5d29yZCA9IHRydWUsXG4pOiBFeHByZXNzaW9uPGFueT4ge1xuICBjb25zdCB7IGRhdGF0eXBlLCBkZWZhdWx0VmFsdWUsIG51bGxhYmxlIH0gPSBjb2x1bW47XG5cbiAgY29uc3QgZWIgPSBleHByZXNzaW9uQnVpbGRlcigpO1xuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCAodmFsdWUgPT09IFwiXCIgJiYgbnVsbGFibGUpKSB7XG4gICAgcmV0dXJuIGViLmxpdChudWxsKTtcbiAgfVxuXG4gIGlmICgodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICByZXR1cm4gc3VwcG9ydHNEZWZhdWx0S2V5d29yZCA/IHNxbGBkZWZhdWx0YCA6IGViLmxpdChudWxsKTtcbiAgfVxuXG4gIGlmICghZGF0YXR5cGUuaXNOYXRpdmUpIHtcbiAgICByZXR1cm4gZWIuY2FzdChlYi52YWwodmFsdWUpLCBzcWwuaWQoZGF0YXR5cGUuc2NoZW1hLCBkYXRhdHlwZS5uYW1lKSk7XG4gIH1cblxuICByZXR1cm4gZWIudmFsKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oXG4gIGZpbHRlcnM6IChDb2x1bW5GaWx0ZXIgfCBGaWx0ZXJHcm91cCB8IFNxbEZpbHRlcilbXSxcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuKTogKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IEV4cHJlc3Npb248U3FsQm9vbD4ge1xuICBpZiAoZmlsdGVycy5sZW5ndGggPT09IDApIHJldHVybiAoZWIpID0+IGViLmxpdCh0cnVlKTsgLy8gbm8gZmlsdGVycywgYWx3YXlzIHRydWVcblxuICBjb25zdCBvckdyb3Vwc09mQW5kQnVpbGRlcnM6ICgoXG4gICAgZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PixcbiAgKSA9PiBFeHByZXNzaW9uPFNxbEJvb2w+KVtdW10gPSBbXTtcblxuICBsZXQgY3VycmVudEFuZEdyb3VwQnVpbGRlcnM6ICgoXG4gICAgZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PixcbiAgKSA9PiBFeHByZXNzaW9uPFNxbEJvb2w+KVtdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgY3VycmVudEFuZEdyb3VwQnVpbGRlcnMucHVzaChcbiAgICAgIGJ1aWxkQmFzZUV4cHJlc3Npb25CdWlsZGVyKGZpbHRlcnNbaV0hLCBjb2x1bW5zKSxcbiAgICApO1xuXG4gICAgLy8gJm4gQU5EIGdyb3VwIGVuZHMgaWYgaXQncyB0aGUgbGFzdCBmaWx0ZXIsIG9yIHRoZSBpdGVtIGlzIGZvbGxvd2VkIGJ5IGFuICdvcidcbiAgICBpZiAoaSA9PT0gZmlsdGVycy5sZW5ndGggLSAxIHx8IGZpbHRlcnNbaV0hLmFmdGVyID09PSBcIm9yXCIpIHtcbiAgICAgIG9yR3JvdXBzT2ZBbmRCdWlsZGVycy5wdXNoKGN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzKTtcbiAgICAgIGN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzID0gW107IC8vIHN0YXJ0IGEgbmV3IGdyb3VwXG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmV0dXJuIChlYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc3QgYW5kRXhwcmVzc2lvbnMgPSBvckdyb3Vwc09mQW5kQnVpbGRlcnMubWFwKChncm91cCkgPT4ge1xuICAgICAgcmV0dXJuIGViLmFuZChncm91cC5tYXAoKGJ1aWxkZXIpID0+IGJ1aWxkZXIoZWIpKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWIub3IoYW5kRXhwcmVzc2lvbnMpO1xuICB9O1xufVxuXG5jb25zdCBURVhUX01BVENIX09QRVJBVE9SUyA9IG5ldyBTZXQoW1xuICBcImlsaWtlXCIsXG4gIFwibGlrZVwiLFxuICBcIm5vdCBpbGlrZVwiLFxuICBcIm5vdCBsaWtlXCIsXG5dKTtcblxuLy8gSGVscGVyIHRvIGJ1aWxkIGFuIGV4cHJlc3Npb24gYnVpbGRlciBmb3IgYSBzaW5nbGUgZmlsdGVyIG9yIGEgZ3JvdXBcbmZ1bmN0aW9uIGJ1aWxkQmFzZUV4cHJlc3Npb25CdWlsZGVyKFxuICBzcGVjOiBDb2x1bW5GaWx0ZXIgfCBGaWx0ZXJHcm91cCB8IFNxbEZpbHRlcixcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuKTogKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IEV4cHJlc3Npb248U3FsQm9vbD4ge1xuICBpZiAoc3BlYy5raW5kID09PSBcIkNvbHVtbkZpbHRlclwiKSB7XG4gICAgcmV0dXJuIChlYikgPT4ge1xuICAgICAgY29uc3QgeyBjb2x1bW4sIG9wZXJhdG9yLCB2YWx1ZSB9ID0gc3BlYztcbiAgICAgIGNvbnN0IGNvbHVtbk1ldGEgPSBjb2x1bW5zW2NvbHVtbl0hO1xuICAgICAgY29uc3QgaXNUZXh0TWF0Y2hPcGVyYXRvciA9IFRFWFRfTUFUQ0hfT1BFUkFUT1JTLmhhcyhvcGVyYXRvcik7XG5cbiAgICAgIGlmIChpc1RleHRNYXRjaE9wZXJhdG9yKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFBhdHRlcm4gPVxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogU3RyaW5nKHZhbHVlID8/IFwiXCIpO1xuXG4gICAgICAgIHJldHVybiBlYihlYi5jYXN0KGNvbHVtbiwgXCJ0ZXh0XCIpLCBvcGVyYXRvciwgc2VhcmNoUGF0dGVybik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlYihcbiAgICAgICAgY29sdW1uTWV0YS5kYXRhdHlwZS5ncm91cCA9PT0gXCJyYXdcIiA/IGViLmNhc3QoY29sdW1uLCBcInRleHRcIikgOiBjb2x1bW4sXG4gICAgICAgIG9wZXJhdG9yLFxuICAgICAgICB0cmFuc2Zvcm1WYWx1ZSh2YWx1ZSwgY29sdW1uTWV0YSksXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBpZiAoc3BlYy5raW5kID09PSBcIlNxbEZpbHRlclwiKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENsYXVzZSA9IG5vcm1hbGl6ZVNxbFdoZXJlQ2xhdXNlKHNwZWMuc3FsKTtcblxuICAgIHJldHVybiAoZWIpID0+XG4gICAgICBub3JtYWxpemVkQ2xhdXNlLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzcWw8U3FsQm9vbD5gKCR7c3FsLnJhdyhub3JtYWxpemVkQ2xhdXNlKX0pYFxuICAgICAgICA6IGViLmxpdCh0cnVlKTtcbiAgfVxuXG4gIHJldHVybiBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uKHNwZWMuZmlsdGVycywgY29sdW1ucyk7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBTcWxTdGF0ZW1lbnRTZWdtZW50IHtcbiAgZnJvbTogbnVtYmVyO1xuICBzdGF0ZW1lbnQ6IHN0cmluZztcbiAgdG86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFBhcnNlU3RhdGUge1xuICBtb2RlOlxuICAgIHwgXCJub3JtYWxcIlxuICAgIHwgXCJzaW5nbGUtcXVvdGVcIlxuICAgIHwgXCJkb3VibGUtcXVvdGVcIlxuICAgIHwgXCJsaW5lLWNvbW1lbnRcIlxuICAgIHwgXCJibG9jay1jb21tZW50XCJcbiAgICB8IFwiZG9sbGFyLXF1b3RlXCI7XG4gIGJsb2NrQ29tbWVudERlcHRoOiBudW1iZXI7XG4gIGRvbGxhclF1b3RlRGVsaW1pdGVyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFRvcExldmVsU3FsU3RhdGVtZW50cyhzcWw6IHN0cmluZyk6IFNxbFN0YXRlbWVudFNlZ21lbnRbXSB7XG4gIGNvbnN0IHN0YXRlOiBQYXJzZVN0YXRlID0ge1xuICAgIGJsb2NrQ29tbWVudERlcHRoOiAwLFxuICAgIGRvbGxhclF1b3RlRGVsaW1pdGVyOiBcIlwiLFxuICAgIG1vZGU6IFwibm9ybWFsXCIsXG4gIH07XG4gIGNvbnN0IHNlZ21lbnRzOiBTcWxTdGF0ZW1lbnRTZWdtZW50W10gPSBbXTtcbiAgbGV0IHNlZ21lbnRTdGFydCA9IDA7XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGluZGV4IDwgc3FsLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBzcWxbaW5kZXhdITtcbiAgICBjb25zdCBuZXh0Q2hhciA9IHNxbFtpbmRleCArIDFdO1xuXG4gICAgaWYgKHN0YXRlLm1vZGUgPT09IFwic2luZ2xlLXF1b3RlXCIpIHtcbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIikge1xuICAgICAgICBzdGF0ZS5tb2RlID0gXCJub3JtYWxcIjtcbiAgICAgIH1cblxuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5tb2RlID09PSBcImRvdWJsZS1xdW90ZVwiKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicpIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFwibm9ybWFsXCI7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJsaW5lLWNvbW1lbnRcIikge1xuICAgICAgaWYgKGNoYXIgPT09IFwiXFxuXCIpIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFwibm9ybWFsXCI7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJibG9jay1jb21tZW50XCIpIHtcbiAgICAgIGlmIChjaGFyID09PSBcIi9cIiAmJiBuZXh0Q2hhciA9PT0gXCIqXCIpIHtcbiAgICAgICAgc3RhdGUuYmxvY2tDb21tZW50RGVwdGggKz0gMTtcbiAgICAgICAgaW5kZXggKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIipcIiAmJiBuZXh0Q2hhciA9PT0gXCIvXCIpIHtcbiAgICAgICAgc3RhdGUuYmxvY2tDb21tZW50RGVwdGggLT0gMTtcbiAgICAgICAgaW5kZXggKz0gMjtcblxuICAgICAgICBpZiAoc3RhdGUuYmxvY2tDb21tZW50RGVwdGggPD0gMCkge1xuICAgICAgICAgIHN0YXRlLmJsb2NrQ29tbWVudERlcHRoID0gMDtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gXCJub3JtYWxcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLm1vZGUgPT09IFwiZG9sbGFyLXF1b3RlXCIpIHtcbiAgICAgIGNvbnN0IGRlbGltaXRlciA9IHN0YXRlLmRvbGxhclF1b3RlRGVsaW1pdGVyO1xuXG4gICAgICBpZiAoZGVsaW1pdGVyICYmIHNxbC5zdGFydHNXaXRoKGRlbGltaXRlciwgaW5kZXgpKSB7XG4gICAgICAgIHN0YXRlLmRvbGxhclF1b3RlRGVsaW1pdGVyID0gXCJcIjtcbiAgICAgICAgc3RhdGUubW9kZSA9IFwibm9ybWFsXCI7XG4gICAgICAgIGluZGV4ICs9IGRlbGltaXRlci5sZW5ndGg7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICBzdGF0ZS5tb2RlID0gXCJzaW5nbGUtcXVvdGVcIjtcbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgc3RhdGUubW9kZSA9IFwiZG91YmxlLXF1b3RlXCI7XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiLVwiICYmIG5leHRDaGFyID09PSBcIi1cIikge1xuICAgICAgc3RhdGUubW9kZSA9IFwibGluZS1jb21tZW50XCI7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiL1wiICYmIG5leHRDaGFyID09PSBcIipcIikge1xuICAgICAgc3RhdGUubW9kZSA9IFwiYmxvY2stY29tbWVudFwiO1xuICAgICAgc3RhdGUuYmxvY2tDb21tZW50RGVwdGggPSAxO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIiRcIikge1xuICAgICAgY29uc3QgZGVsaW1pdGVyID0gcmVhZERvbGxhclF1b3RlRGVsaW1pdGVyKHNxbCwgaW5kZXgpO1xuXG4gICAgICBpZiAoZGVsaW1pdGVyKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBcImRvbGxhci1xdW90ZVwiO1xuICAgICAgICBzdGF0ZS5kb2xsYXJRdW90ZURlbGltaXRlciA9IGRlbGltaXRlcjtcbiAgICAgICAgaW5kZXggKz0gZGVsaW1pdGVyLmxlbmd0aDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09IFwiO1wiKSB7XG4gICAgICBwdXNoU3RhdGVtZW50U2VnbWVudChzcWwsIHNlZ21lbnRTdGFydCwgaW5kZXgsIHNlZ21lbnRzKTtcbiAgICAgIHNlZ21lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICB9XG5cbiAgICBpbmRleCArPSAxO1xuICB9XG5cbiAgcHVzaFN0YXRlbWVudFNlZ21lbnQoc3FsLCBzZWdtZW50U3RhcnQsIHNxbC5sZW5ndGgsIHNlZ21lbnRzKTtcblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3BMZXZlbFNxbFN0YXRlbWVudEF0Q3Vyc29yKGFyZ3M6IHtcbiAgY3Vyc29ySW5kZXg6IG51bWJlcjtcbiAgc3FsOiBzdHJpbmc7XG59KTogU3FsU3RhdGVtZW50U2VnbWVudCB8IG51bGwge1xuICBjb25zdCB7IHNxbCB9ID0gYXJncztcbiAgY29uc3QgY3Vyc29ySW5kZXggPSBjbGFtcChhcmdzLmN1cnNvckluZGV4LCAwLCBzcWwubGVuZ3RoKTtcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFRvcExldmVsU3FsU3RhdGVtZW50cyhzcWwpO1xuXG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGlmIChjdXJzb3JJbmRleCA+PSBzZWdtZW50LmZyb20gJiYgY3Vyc29ySW5kZXggPD0gc2VnbWVudC50bykge1xuICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgfVxuICB9XG5cbiAgbGV0IG5lYXJlc3RTZWdtZW50ID0gc2VnbWVudHNbMF0hO1xuICBsZXQgc21hbGxlc3REaXN0YW5jZSA9IGdldERpc3RhbmNlVG9TZWdtZW50KGN1cnNvckluZGV4LCBuZWFyZXN0U2VnbWVudCk7XG5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzLnNsaWNlKDEpKSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBnZXREaXN0YW5jZVRvU2VnbWVudChjdXJzb3JJbmRleCwgc2VnbWVudCk7XG4gICAgaWYgKGRpc3RhbmNlIDwgc21hbGxlc3REaXN0YW5jZSkge1xuICAgICAgc21hbGxlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgbmVhcmVzdFNlZ21lbnQgPSBzZWdtZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWFyZXN0U2VnbWVudDtcbn1cblxuZnVuY3Rpb24gcHVzaFN0YXRlbWVudFNlZ21lbnQoXG4gIHNxbDogc3RyaW5nLFxuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlcixcbiAgc2VnbWVudHM6IFNxbFN0YXRlbWVudFNlZ21lbnRbXSxcbik6IHZvaWQge1xuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmF3U2VnbWVudCA9IHNxbC5zbGljZShzdGFydCwgZW5kKTtcbiAgY29uc3QgdHJpbW1lZFN0YXRlbWVudCA9IHJhd1NlZ21lbnQudHJpbSgpO1xuXG4gIGlmICh0cmltbWVkU3RhdGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxlYWRpbmdXaGl0ZXNwYWNlTGVuZ3RoID1cbiAgICByYXdTZWdtZW50Lmxlbmd0aCAtIHJhd1NlZ21lbnQudHJpbVN0YXJ0KCkubGVuZ3RoO1xuICBjb25zdCB0cmFpbGluZ1doaXRlc3BhY2VMZW5ndGggPVxuICAgIHJhd1NlZ21lbnQubGVuZ3RoIC0gcmF3U2VnbWVudC50cmltRW5kKCkubGVuZ3RoO1xuICBjb25zdCBmcm9tID0gc3RhcnQgKyBsZWFkaW5nV2hpdGVzcGFjZUxlbmd0aDtcbiAgY29uc3QgdG8gPSBlbmQgLSB0cmFpbGluZ1doaXRlc3BhY2VMZW5ndGg7XG5cbiAgc2VnbWVudHMucHVzaCh7XG4gICAgZnJvbSxcbiAgICBzdGF0ZW1lbnQ6IHRyaW1tZWRTdGF0ZW1lbnQsXG4gICAgdG8sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXREaXN0YW5jZVRvU2VnbWVudChcbiAgY3Vyc29yOiBudW1iZXIsXG4gIHNlZ21lbnQ6IFNxbFN0YXRlbWVudFNlZ21lbnQsXG4pOiBudW1iZXIge1xuICBpZiAoY3Vyc29yIDwgc2VnbWVudC5mcm9tKSB7XG4gICAgcmV0dXJuIHNlZ21lbnQuZnJvbSAtIGN1cnNvcjtcbiAgfVxuXG4gIGlmIChjdXJzb3IgPiBzZWdtZW50LnRvKSB7XG4gICAgcmV0dXJuIGN1cnNvciAtIHNlZ21lbnQudG87XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gcmVhZERvbGxhclF1b3RlRGVsaW1pdGVyKHNxbDogc3RyaW5nLCBzdGFydDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChzcWxbc3RhcnRdICE9PSBcIiRcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IGluZGV4ID0gc3RhcnQgKyAxO1xuXG4gIHdoaWxlIChpbmRleCA8IHNxbC5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc3FsW2luZGV4XSE7XG5cbiAgICBpZiAoY2hhciA9PT0gXCIkXCIpIHtcbiAgICAgIGNvbnN0IGRlbGltaXRlciA9IHNxbC5zbGljZShzdGFydCwgaW5kZXggKyAxKTtcblxuICAgICAgaWYgKGRlbGltaXRlciA9PT0gXCIkJFwiKSB7XG4gICAgICAgIHJldHVybiBkZWxpbWl0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmICgvXlxcJFtBLVphLXpfXVtBLVphLXowLTlfXSpcXCQkLy50ZXN0KGRlbGltaXRlcikpIHtcbiAgICAgICAgcmV0dXJuIGRlbGltaXRlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCEvW0EtWmEtejAtOV9dLy50ZXN0KGNoYXIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpbmRleCArPSAxO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdmFsdWUpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7O2lEQUFBLElBQUFBLEdBQUFDLEdBQUEsQ0FBQUMsR0FBQUMsS0FBQSxlQUFDLFNBQVMsRUFBRSxFQUFFLENBQVcsT0FBT0QsSUFBakIsVUFBdUMsT0FBT0MsR0FBcEIsSUFBMkJBLEdBQU8sUUFBUSxFQUFFLEVBQWMsT0FBTyxRQUFuQixZQUEyQixPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBZSxPQUFPLFdBQXBCLElBQStCLFdBQVcsR0FBRyxNQUFNLE1BQU0sRUFBRSxDQUFDLEdBQUVELElBQU0sVUFBVSxDQUFDLGFBQWEsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJRSxFQUFFLEtBQUtDLEVBQUUsY0FBY0MsRUFBRSxTQUFTLEVBQUUsU0FBU0MsRUFBRSxPQUFPQyxFQUFFLE1BQU1DLEVBQUUsT0FBT0MsRUFBRSxRQUFRQyxHQUFFLFVBQVVDLEVBQUUsT0FBT0MsR0FBRSxPQUFPQyxFQUFFLGVBQWVDLEVBQUUsNkZBQTZGQyxHQUFFLHNGQUFzRkMsR0FBRSxDQUFDLEtBQUssS0FBSyxTQUFTLDJEQUEyRCxNQUFNLEdBQUcsRUFBRSxPQUFPLHdGQUF3RixNQUFNLEdBQUcsRUFBRSxRQUFRLFNBQVNDLEVBQUUsQ0FBQyxJQUFJQyxFQUFFLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxFQUFFZixFQUFFYyxFQUFFLElBQUksTUFBTSxJQUFJQSxHQUFHQyxHQUFHZixFQUFFLElBQUksRUFBRSxHQUFHZSxFQUFFZixDQUFDLEdBQUdlLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFQyxHQUFFLFNBQVNGLEVBQUVDLEVBQUVmLEVBQUUsQ0FBQyxJQUFJQyxFQUFFLE9BQU9hLENBQUMsRUFBRSxNQUFNLENBQUNiLEdBQUdBLEVBQUUsUUFBUWMsRUFBRUQsRUFBRSxHQUFHLE1BQU1DLEVBQUUsRUFBRWQsRUFBRSxNQUFNLEVBQUUsS0FBS0QsQ0FBQyxFQUFFYyxDQUFDLEVBQUVHLEdBQUUsQ0FBQyxFQUFFRCxHQUFFLEVBQUUsU0FBU0YsRUFBRSxDQUFDLElBQUlDLEVBQUUsQ0FBQ0QsRUFBRSxVQUFVLEVBQUVkLEVBQUUsS0FBSyxJQUFJZSxDQUFDLEVBQUVkLEVBQUUsS0FBSyxNQUFNRCxFQUFFLEVBQUUsRUFBRUUsRUFBRUYsRUFBRSxHQUFHLE9BQU9lLEdBQUcsRUFBRSxJQUFJLEtBQUtDLEdBQUVmLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSWUsR0FBRWQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsU0FBU1ksRUFBRUMsRUFBRWYsRUFBRSxDQUFDLEdBQUdlLEVBQUUsS0FBSyxFQUFFZixFQUFFLEtBQUssRUFBRSxNQUFNLENBQUNjLEVBQUVkLEVBQUVlLENBQUMsRUFBRSxJQUFJZCxFQUFFLElBQUlELEVBQUUsS0FBSyxFQUFFZSxFQUFFLEtBQUssSUFBSWYsRUFBRSxNQUFNLEVBQUVlLEVBQUUsTUFBTSxHQUFHYixFQUFFYSxFQUFFLE1BQU0sRUFBRSxJQUFJZCxFQUFFSyxDQUFDLEVBQUVZLEVBQUVsQixFQUFFRSxFQUFFLEVBQUVDLEVBQUVZLEVBQUUsTUFBTSxFQUFFLElBQUlkLEdBQUdpQixFQUFFLEdBQUcsR0FBR1osQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFTCxHQUFHRCxFQUFFRSxJQUFJZ0IsRUFBRWhCLEVBQUVDLEVBQUVBLEVBQUVELEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBU1ksRUFBRSxDQUFDLE9BQU9BLEVBQUUsRUFBRSxLQUFLLEtBQUtBLENBQUMsR0FBRyxFQUFFLEtBQUssTUFBTUEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxTQUFTQSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUVSLEVBQUUsRUFBRUUsRUFBRSxFQUFFSCxFQUFFLEVBQUVELEVBQUUsRUFBRUssR0FBRSxFQUFFTixFQUFFLEVBQUUsRUFBRSxFQUFFRCxFQUFFLEdBQUdELEVBQUUsRUFBRU0sRUFBQyxFQUFFTyxD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QUMsR0FBRyxFQUFFaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLakIsRUFBRSxDQUFDLEVBQUVDLEVBQUVELEVBQUUsQ0FBQyxHQUFHLEVBQUVBLEVBQUUsQ0FBQyxHQUFHLEVBQUVBLEVBQUUsQ0FBQyxHQUFHLEVBQUVBLEVBQUUsQ0FBQyxHQUFHLEVBQUVpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLSCxDQUFDLENBQUMsR0FBRUQsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUVFLEVBQUUsS0FBSyxVQUFVLENBQUMsSUFBSUYsRUFBRSxLQUFLLEdBQUcsS0FBSyxHQUFHQSxFQUFFLFlBQVksRUFBRSxLQUFLLEdBQUdBLEVBQUUsU0FBUyxFQUFFLEtBQUssR0FBR0EsRUFBRSxRQUFRLEVBQUUsS0FBSyxHQUFHQSxFQUFFLE9BQU8sRUFBRSxLQUFLLEdBQUdBLEVBQUUsU0FBUyxFQUFFLEtBQUssR0FBR0EsRUFBRSxXQUFXLEVBQUUsS0FBSyxHQUFHQSxFQUFFLFdBQVcsRUFBRSxLQUFLLElBQUlBLEVBQUUsZ0JBQWdCLENBQUMsRUFBRUUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxPQUFPVSxDQUFDLEVBQUVWLEVBQUUsUUFBUSxVQUFVLENBQUMsT0FBUSxLQUFLLEdBQUcsU0FBUyxJQUFJTixDQUFFLEVBQUVNLEVBQUUsT0FBTyxTQUFTRixFQUFFQyxFQUFFLENBQUMsSUFBSWYsRUFBRXlCLEVBQUVYLENBQUMsRUFBRSxPQUFPLEtBQUssUUFBUUMsQ0FBQyxHQUFHZixHQUFHQSxHQUFHLEtBQUssTUFBTWUsQ0FBQyxDQUFDLEVBQUVDLEVBQUUsUUFBUSxTQUFTRixFQUFFQyxFQUFFLENBQUMsT0FBT1UsRUFBRVgsQ0FBQyxFQUFFLEtBQUssUUFBUUMsQ0FBQyxDQUFDLEVBQUVDLEVBQUUsU0FBUyxTQUFTRixFQUFFQyxFQUFFLENBQUMsT0FBTyxLQUFLLE1BQU1BLENBQUMsRUFBRVUsRUFBRVgsQ0FBQyxDQUFDLEVBQUVFLEVBQUUsR0FBRyxTQUFTRixFQUFFQyxFQUFFZixFQUFFLENBQUMsT0FBTzBCLEVBQUUsRUFBRVosQ0FBQyxFQUFFLEtBQUtDLENBQUMsRUFBRSxLQUFLLElBQUlmLEVBQUVjLENBQUMsQ0FBQyxFQUFFRSxFQUFFLEtBQUssVUFBVSxDQUFDLE9BQU8sS0FBSyxNQUFNLEtBQUssUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFQSxFQUFFLFFBQVEsVUFBVSxDQUFDLE9BQU8sS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFQSxFQUFFLFFBQVEsU0FBU0YsRUFBRUMsRUFBRSxDQUFDLElBQUlmLEVBQUUsS0FBS0MsRUFBRSxDQUFDLENBQUN5QixFQUFFLEVBQUVYLENBQUMsR0FBR0EsRUFBRVIsRUFBRW1CLEVBQUUsRUFBRVosQ0FBQyxFQUFFSixFQUFFLFNBQVNJLEdBQUVDLEdBQUUsQ0FBQyxJQUFJYixHQUFFd0IsRUFBRSxFQUFFMUIsRUFBRSxHQUFHLEtBQUssSUFBSUEsRUFBRSxHQUFHZSxHQUFFRCxFQUFDLEVBQUUsSUFBSSxLQUFLZCxFQUFFLEdBQUdlLEdBQUVELEVBQUMsRUFBRWQsQ0FBQyxFQUFFLE9BQU9DLEVBQUVDLEdBQUVBLEdBQUUsTUFBTUUsQ0FBQyxDQUFDLEVBQUVPLEVBQUUsU0FBU0csR0FBRUMsR0FBRSxDQUFDLE9BQU9XLEVBQUUsRUFBRTFCLEVBQUUsT0FBTyxFQUFFYyxFQUFDLEVBQUUsTUFBTWQsRUFBRSxPQUFPLEdBQUcsR0FBR0MsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNYyxFQUFDLENBQUMsRUFBRWYsQ0FBQyxDQUFDLEVBQUVZLEVBQUUsS0FBSyxHQUFHQyxFQUFFLEtBQUssR0FBR0csR0FBRSxLQUFLLEdBQUdDLEdBQUUsT0FBTyxLQUFLLEdBQUcsTUFBTSxJQUFJLE9BQU9WLEVBQUUsQ0FBQyxLQUFLQyxFQUFFLE9BQU9QLEVBQUVTLEVBQUUsRUFBRSxDQUFDLEVBQUVBLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBS0osRUFBRSxPQUFPTCxFQUFF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QUUsQ0FBQyxJQUFJLEtBQUssT0FBTyxPQUFPQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLE9BQU8sT0FBT1csRUFBRSxFQUFFWCxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU9YLEVBQUUsRUFBRSxJQUFJLEtBQUssT0FBT3NCLEVBQUUsRUFBRXRCLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLE1BQU0sT0FBT0ksR0FBRVIsRUFBRSxZQUFZSSxFQUFFRSxHQUFFLENBQUMsRUFBRSxJQUFJLE9BQU8sT0FBT0UsR0FBRUYsR0FBRUYsQ0FBQyxFQUFFLElBQUksSUFBSSxPQUFPVyxFQUFFLEdBQUcsSUFBSSxLQUFLLE9BQU9XLEVBQUUsRUFBRVgsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxPQUFPLE9BQU9BLEVBQUUsRUFBRSxFQUFFLElBQUksS0FBSyxPQUFPUCxHQUFFUixFQUFFLFlBQVllLEVBQUUsR0FBR1YsRUFBRSxDQUFDLEVBQUUsSUFBSSxNQUFNLE9BQU9HLEdBQUVSLEVBQUUsY0FBY2UsRUFBRSxHQUFHVixFQUFFLENBQUMsRUFBRSxJQUFJLE9BQU8sT0FBT0EsRUFBRVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLE9BQU8sT0FBT0csQ0FBQyxFQUFFLElBQUksS0FBSyxPQUFPUSxFQUFFLEVBQUVSLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU9ULEdBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxPQUFPQSxHQUFFLENBQUMsRUFBRSxJQUFJLElBQUksT0FBT0UsR0FBRU8sRUFBRWYsRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLE9BQU9RLEdBQUVPLEVBQUVmLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxPQUFPLE9BQU9BLENBQUMsRUFBRSxJQUFJLEtBQUssT0FBT3VCLEVBQUUsRUFBRXZCLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU8sT0FBT1ksRUFBRSxFQUFFLEVBQUUsSUFBSSxLQUFLLE9BQU9XLEVBQUUsRUFBRVgsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksTUFBTSxPQUFPVyxFQUFFLEVBQUVYLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLElBQUksT0FBT2IsQ0FBQyxDQUFDLE9BQU8sSUFBSSxHQUFFWSxFQUFDLEdBQUdaLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRWMsRUFBRSxVQUFVLFVBQVUsQ0FBQyxNQUFPLElBQUcsQ0FBQyxLQUFLLE1BQU0sS0FBSyxHQUFHLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxFQUFFQSxFQUFFLEtBQUssU0FBU2YsRUFBRVEsRUFBRUMsRUFBRSxDQUFDLElBQUlDLEVBQUVDLEVBQUUsS0FBS0MsRUFBRWEsRUFBRSxFQUFFakIsQ0FBQyxFQUFFTyxFQUFFUyxFQUFFeEIsQ0FBQyxFQUFFZ0IsR0FBR0QsRUFBRSxVQUFVLEVBQUUsS0FBSyxVQUFVLEdBQUcsRUFBRUcsRUFBRSxLQUFLSCxFQUFFSSxHQUFFLFVBQVUsQ0FBQyxPQUFPTSxFQUFFLEVBQUVkLEVBQUVJLENBQUMsQ0FBQyxFQUFFLE9BQU9ILEVBQUUsQ0FBQyxLQUFLTCxFQUFFRyxFQUFFUyxHQUFFLEVBQUUsR0FBRyxNQUFNLEtBQUtkLEVBQUVLLEVBQUVTLEdBQUUsRUFBRSxNQUFNLEtBQUtiLEdBQUVJLEVBQUVTLEdBQUUsRUFBRSxFQUFFLE1BQU0sS0FBS2YsRUFBRU0sR0FBR1EsRUFBRUYsR0FBRyxPQUFPLE1BQU0sS0FBS2IsRUFBRU8sR0FBR1EsRUFBRUYsR0FBRyxNQUFNLE1BQU0sS0FBS2QsRUFBRVEsRUFBRVEsRUFBRW5CLEVBQUUsTUFBTSxLQUFLLEVBQUVXLEVBQUVRLEVBQUUsRUFBRSxNQUFNLEtBQUtqQixFQUFFUyxFQUFFUSxFQUFFLEVBQUUsTUFBTSxRQUFRUixFQUFFUSxDQUFDLENBQUMsT0FBT1QsRUFBRUMsRUFBRWUsRUFBRSxFQUFFZixDQUFDLENBQUMsRUFBRUssRUFBRSxZQUFZLFVBQVUsQ0FBQyxPQUFPLEtBQUssTUFBTVYsQ0FBQyxFQUFFLEVBQUUsRUFBRVUsRUFBRSxRQUFRLFVBQVUsQ0FBQyxPQUFPSSxHQUFFLEtBQUssRUFBRSxDQUFDLEVBQUVKLEVBQUUsT0FBTyxTQUFTRixFQUFFQyxFQUFFLENBQUMsR0FBRyxDQUFDRCxFQUFFLE9BQU8sS0FBSyxHQUFHLElBQUlkLEVBQUUsS0FBSyxNQUFNLEVBQUVDLEVBQUV1QixHQUFFVixFQUFFQyxFQUFFLEVBQUUsRUFBRSxPQUFPZCxJQUFJRCxFQUFFLEdBQUdDLEdBQUdELENBQUMsRUFBRWdCLEVBQUUsTUFBTSxVQUFVLENBQUMsT0FBT1UsRUFBRSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRVYsRUFBRSxPQUFPLFVBQVUsQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLEVBQUVBLEVBQUUsT0FBTyxVQUFVLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRSxLQUFLLFlBQVksRUFBRSxJQUFJLEVBQUVBLEVBQUUsWUFBWSxVQUFVLENBQUMsT0FBTyxLQUFLLEdBQUcsWUFBWSxDQUFDLEVBQUVBLEVBQUUsU0FBUyxVQUFVLENBQUMsT0FBTyxLQUFLLEdBQUcsWUFBWSxDQUFDLEVBQUVILENBQUMsR0FBRSxFQUFFYyxHQUFFSixHQUFFLFVBQVUsT0FBT0UsRUFBRSxVQUFVRSxHQUFFLENBQUMsQ0FBQyxNQUFNMUIsQ0FBQyxFQUFFLENBQUMsS0FBS0MsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLQyxDQUFDLEVBQUUsQ0FBQyxLQUFLQyxDQUFDLEVBQUUsQ0FBQyxLQUFLRSxDQUFDLEVBQUUsQ0FBQyxLQUFLRSxDQUFDLEVBQUUsQ0FBQyxLQUFLQyxFQUFDLENBQUMsRUFBRSxTQUFTLFNBQVNLLEVBQUUsQ0FBQ2EsR0FBRWIsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTQyxFQUFFLENBQUMsT0FBTyxLQUFLLEdBQUdBLEVBQUVELEVBQUUsQ0FBQyxFQUFFQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFB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RyxFQUNqQ0UsRUFBbUJELEVBQVcsS0FBSyxFQUV6QyxHQUFJQyxFQUFpQixTQUFXLEVBQzlCLE9BR0YsSUFBTUMsRUFDSkYsRUFBVyxPQUFTQSxFQUFXLFVBQVUsRUFBRSxPQUN2Q0csRUFDSkgsRUFBVyxPQUFTQSxFQUFXLFFBQVEsRUFBRSxPQUNyQ0ksRUFBT04sRUFBUUksRUFDZkcsRUFBS04sRUFBTUksRUFFakJ0QixFQUFTLEtBQUssQ0FDWixLQUFBdUIsRUFDQSxVQUFXSCxFQUNYLEdBQUFJLENBQ0YsQ0FBQyxDQUNILENBRUEsU0FBU1QsR0FDUFUsRUFDQWIsRUFDUSxDQUNSLE9BQUlhLEVBQVNiLEVBQVEsS0FDWkEsRUFBUSxLQUFPYSxFQUdwQkEsRUFBU2IsRUFBUSxHQUNaYSxFQUFTYixFQUFRLEdBR25CLENBQ1QsQ0FFQSxTQUFTTixHQUF5QlIsRUFBYW1CLEVBQThCLENBQzNFLEdBQUluQixFQUFJbUIsQ0FBSyxJQUFNLElBQ2pCLE9BQU8sS0FHVCxJQUFJZixFQUFRZSxFQUFRLEVBRXBCLEtBQU9mLEVBQVFKLEVBQUksUUFBUSxDQUN6QixJQUFNSyxFQUFPTCxFQUFJSSxDQUFLLEVBRXRCLEdBQUlDLElBQVMsSUFBSyxDQUNoQixJQUFNRSxFQUFZUCxFQUFJLE1BQU1tQixFQUFPZixFQUFRLENBQUMsRUFNNUMsT0FKSUcsSUFBYyxNQUlkLCtCQUErQixLQUFLQSxDQUFTLEVBQ3hDQSxFQUdGLElBQ1QsQ0FFQSxHQUFJLENBQUMsZUFBZSxLQUFLRixDQUFJLEVBQzNCLE9BQU8sS0FHVEQsR0FBUyxDQUNYLENBRUEsT0FBTyxJQUNULENBRUEsU0FBU1MsR0FBTWUsRUFBZUMsRUFBYUMsRUFBcUIsQ0FDOUQsT0FBTyxLQUFLLElBQUlBLEVBQUssS0FBSyxJQUFJRCxFQUFLRCxDQUFLLENBQUMsQ0FDM0MiLAogICJuYW1lcyI6IFsicmVxdWlyZV9kYXlqc19taW4iLCAiX19jb21tb25KU01pbiIsICJleHBvcnRzIiwgIm1vZHVsZSIsICJuIiwgInIiLCAiaSIsICJ1IiwgImEiLCAibyIsICJjIiwgImYiLCAiaCIsICJkIiwgImwiLCAiJCIsICJ5IiwgIk0iLCAidCIsICJlIiwgIm0iLCAidiIsICJzIiwgImciLCAiRCIsICJwIiwgIlMiLCAiXyIsICJ3IiwgIk8iLCAiYiIsICJrIiwgInJlcXVpcmVfdXRjIiwgIl9fY29tbW9uSlNNaW4iLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAiaSIsICJlIiwgInMiLCAiZiIsICJuIiwgInUiLCAidCIsICJyIiwgIm8iLCAiYSIsICJoIiwgImwiLCAiYyIsICJpbXBvcnRfZGF5anMiLCAiaW1wb3J0X3V0YyIsICJkYXlqcyIsICJ1dGMiLCAiREFURTBfUEVSX0ZPUk1BVCIsICJnZXREYXRlMCIsICJmb3JtYXQiLCAiREVGQVVMVF9TVFJJTkciLCAiREVGQVVMVF9OVU1FUklDIiwgIkRFRkFVTFRfQk9PTEVBTiIsICJERUZBVUxUX0FSUkFZX0RJU1BMQVkiLCAiREVGQVVMVF9KU09OIiwgIkRFRkFVTFRfQVJSQVlfVkFMVUUiLCAiaXNVbmRlZmluZWQiLCAib2JqIiwgImlzU3RyaW5nIiwgImlzTnVtYmVyIiwgImlzQm9vbGVhbiIsICJpc051bGwiLCAiaXNEYXRlIiwgImlzQmlnSW50IiwgImlzRnVuY3Rpb24iLCAib2JqIiwgImlzT2JqZWN0IiwgImZyZWV6ZSIsICJvYmoiLCAiYXNBcnJheSIsICJhcmciLCAiaXNSZWFkb25seUFycmF5IiwgImlzUmVhZG9ubHlBcnJheSIsICJhcmciLCAibm9vcCIsICJvYmoiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGUiLCAicHJvcHMiLCAiY29sdW1uQWx0ZXJhdGlvbiIsICJJZGVudGlmaWVyTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgInByb3BzIiwgImNvbHVtbnMiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJzY2hlbWEiLCAicGFyYW1zIiwgIklkZW50aWZpZXJOb2RlIiwgImNyZWF0ZVNjaGVtYSIsICJPTl9DT01NSVRfQUNUSU9OUyIsICJDcmVhdGVUYWJsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGUiLCAiY3JlYXRlVGFibGUiLCAiY29sdW1uIiwgImNvbnN0cmFpbnQiLCAibW9kaWZpZXIiLCAicGFyYW1zIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImlkZW50aWZpZXIiLCAiSWRlbnRpZmllck5vZGUiLCAic2NoZW1hIiwgIkRyb3BJbmRleE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJwYXJhbXMiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiZHJvcEluZGV4IiwgInByb3BzIiwgIkRyb3BTY2hlbWFOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNjaGVtYSIsICJwYXJhbXMiLCAiSWRlbnRpZmllck5vZGUiLCAiZHJvcFNjaGVtYSIsICJEcm9wVGFibGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgInBhcmFtcyIsICJkcm9wSW5kZXgiLCAiQWxpYXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImFsaWFzIiwgIlRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJzY2hlbWEiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIm9iaiIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgImlzRXhwcmVzc2lvbiIsICJvYmoiLCAiaXNPYmplY3QiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzQWxpYXNlZEV4cHJlc3Npb24iLCAiaXNTdHJpbmciLCAiU2VsZWN0TW9kaWZpZXJOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm1vZGlmaWVyIiwgIm9mIiwgIkFuZE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGVmdCIsICJyaWdodCIsICJPck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGVmdCIsICJyaWdodCIsICJPbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgIm9uTm9kZSIsICJvcGVyYXRvciIsICJvcGVyYXRpb24iLCAiQW5kTm9kZSIsICJPck5vZGUiLCAiSm9pbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiam9pblR5cGUiLCAidGFibGUiLCAib24iLCAiT25Ob2RlIiwgImpvaW5Ob2RlIiwgIm9wZXJhdGlvbiIsICJCaW5hcnlPcGVyYXRpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImxlZnRPcGVyYW5kIiwgIm9wZXJhdG9yIiwgInJpZ2h0T3BlcmFuZCIsICJDT01QQVJJU09OX09QRVJBVE9SUyIsICJBUklUSE1FVElDX09QRVJBVE9SUyIsICJKU09OX09QRVJBVE9SUyIsICJCSU5BUllfT1BFUkFUT1JTIiwgIlVOQVJZX0ZJTFRFUl9PUEVSQVRPUlMiLCAiVU5BUllfT1BFUkFUT1JTIiwgIk9QRVJBVE9SUyIsICJPcGVyYXRvck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3BlcmF0b3IiLCAiaXNKU09OT3BlcmF0b3IiLCAib3AiLCAiaXNTdHJpbmciLCAiSlNPTl9PUEVSQVRPUlMiLCAiQ29sdW1uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAiSWRlbnRpZmllck5vZGUiLCAiU2VsZWN0QWxsTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJSZWZlcmVuY2VOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJ0YWJsZSIsICJTZWxlY3RBbGxOb2RlIiwgIkR5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIiwgIiNkeW5hbWljUmVmZXJlbmNlIiwgInJlZmVyZW5jZSIsICJwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAiaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJvYmoiLCAiaXNPYmplY3QiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzU3RyaW5nIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcmRlckJ5IiwgImRpcmVjdGlvbiIsICJwcm9wcyIsICJSYXdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNxbEZyYWdtZW50cyIsICJwYXJhbWV0ZXJzIiwgInNxbCIsICJjaGlsZCIsICJjaGlsZHJlbiIsICJDb2xsYXRlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2xsYXRpb24iLCAiSWRlbnRpZmllck5vZGUiLCAiT3JkZXJCeUl0ZW1CdWlsZGVyIiwgIl9PcmRlckJ5SXRlbUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJPcmRlckJ5SXRlbU5vZGUiLCAiUmF3Tm9kZSIsICJjb2xsYXRpb24iLCAiQ29sbGF0ZU5vZGUiLCAiTE9HR0VEX01FU1NBR0VTIiwgImxvZ09uY2UiLCAibWVzc2FnZSIsICJpc09yZGVyQnlEaXJlY3Rpb24iLCAidGhpbmciLCAicGFyc2VPcmRlckJ5IiwgImFyZ3MiLCAicGFyc2VPcmRlckJ5SXRlbSIsICJvcmRlckJ5IiwgImxvZ09uY2UiLCAiaXRlbSIsICJleHByIiwgIm1vZGlmaWVycyIsICJwYXJzZWRSZWYiLCAicGFyc2VPcmRlckJ5RXhwcmVzc2lvbiIsICJPcmRlckJ5SXRlbU5vZGUiLCAicGFyc2VPcmRlckJ5V2l0aE1vZGlmaWVycyIsICJpc0V4cHJlc3Npb25PckZhY3RvcnkiLCAicGFyc2VFeHByZXNzaW9uIiwgImlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAicmVmIiwgImRpcmVjdGlvbiIsICJwYXJzZVN0cmluZ1JlZmVyZW5jZSIsICJSYXdOb2RlIiwgImlzRXhwcmVzc2lvbiIsICJub2RlIiwgIk9yZGVyQnlJdGVtQnVpbGRlciIsICJKU09OUmVmZXJlbmNlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJyZWZlcmVuY2UiLCAidHJhdmVyc2FsIiwgIkpTT05PcGVyYXRvckNoYWluTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJ2YWx1ZSIsICJKU09OUGF0aE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaW5PcGVyYXRvciIsICJqc29uUGF0aE5vZGUiLCAicGF0aExlZyIsICJwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAiZXhwIiwgImlzU3RyaW5nIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCIsICJhcmciLCAiaXNSZWFkb25seUFycmF5IiwgIml0IiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJpc0V4cHJlc3Npb25PckZhY3RvcnkiLCAicGFyc2VFeHByZXNzaW9uIiwgInBhcnNlSlNPTlJlZmVyZW5jZSIsICJyZWYiLCAib3AiLCAicmVmZXJlbmNlTm9kZSIsICJpc0pTT05PcGVyYXRvciIsICJKU09OUmVmZXJlbmNlTm9kZSIsICJKU09OT3BlcmF0b3JDaGFpbk5vZGUiLCAiT3BlcmF0b3JOb2RlIiwgIm9wV2l0aG91dExhc3RDaGFyIiwgIkpTT05QYXRoTm9kZSIsICJSZWZlcmVuY2VOb2RlIiwgIkNvbHVtbk5vZGUiLCAicGFydHMiLCAidHJpbSIsICJwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZUFuZFNjaGVtYSIsICJwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZSIsICJwYXJzZUFsaWFzZWRTdHJpbmdSZWZlcmVuY2UiLCAiQUxJQVNfU0VQQVJBVE9SIiwgImNvbHVtblJlZiIsICJhbGlhcyIsICJBbGlhc05vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAicGFyc2VDb2x1bW5OYW1lIiwgImNvbHVtbiIsICJwYXJzZU9yZGVyZWRDb2x1bW5OYW1lIiwgImNvbHVtbk5hbWUiLCAib3JkZXIiLCAiaXNPcmRlckJ5RGlyZWN0aW9uIiwgInBhcnNlT3JkZXJCeSIsICJzY2hlbWEiLCAidGFibGUiLCAiVGFibGVOb2RlIiwgInN0ciIsICJQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlcyIsICJWYWx1ZUxpc3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlcyIsICJWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QiLCAiYXJnIiwgImlzUmVhZG9ubHlBcnJheSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbkxpc3QiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAiZXhwIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAiVmFsdWVOb2RlIiwgImlzU2FmZUltbWVkaWF0ZVZhbHVlIiwgInZhbHVlIiwgImlzTnVtYmVyIiwgImlzQm9vbGVhbiIsICJpc051bGwiLCAicGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUiLCAiVmFsdWVMaXN0Tm9kZSIsICJpdCIsICJQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIiwgIlBhcmVuc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJhcmdzIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24iLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAibGVmdCIsICJvcGVyYXRvciIsICJyaWdodCIsICJpc0lzT3BlcmF0b3IiLCAibmVlZHNJc09wZXJhdG9yIiwgIkJpbmFyeU9wZXJhdGlvbk5vZGUiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgInBhcnNlT3BlcmF0b3IiLCAiVmFsdWVOb2RlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uT3JMaXN0IiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAicGFyc2VGaWx0ZXJPYmplY3QiLCAib2JqIiwgImNvbWJpbmF0b3IiLCAicGFyc2VGaWx0ZXJMaXN0IiwgInYiLCAiaXNVbmRlZmluZWQiLCAiayIsICJsaXN0IiwgIndpdGhQYXJlbnMiLCAiY29tYmluZSIsICJBbmROb2RlIiwgIk9yTm9kZSIsICJPcGVyYXRvck5vZGUiLCAibm9kZSIsICJ0b09wZXJhdGlvbk5vZGUiLCAiaSIsICJQYXJlbnNOb2RlIiwgInZhbHVlIiwgImlzTnVsbCIsICJpc0Jvb2xlYW4iLCAiaXNTdHJpbmciLCAiT1BFUkFUT1JTIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJub2RlT3JTb3VyY2UiLCAiT3JkZXJCeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAib3JkZXJCeSIsICJQYXJ0aXRpb25CeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAicGFydGl0aW9uQnkiLCAiT3Zlck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3Zlck5vZGUiLCAiaXRlbXMiLCAiT3JkZXJCeU5vZGUiLCAiUGFydGl0aW9uQnlOb2RlIiwgIkZyb21Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZyb21zIiwgImZyb20iLCAiR3JvdXBCeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAiZ3JvdXBCeSIsICJIYXZpbmdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZpbHRlciIsICJoYXZpbmdOb2RlIiwgIm9wZXJhdG9yIiwgIm9wZXJhdGlvbiIsICJBbmROb2RlIiwgIk9yTm9kZSIsICJJbnNlcnRRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaW50byIsICJ3aXRoTm9kZSIsICJyZXBsYWNlIiwgImluc2VydFF1ZXJ5IiwgInByb3BzIiwgIkxpc3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIml0ZW1zIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZXMiLCAid2l0aE5vZGUiLCAiTGlzdE5vZGUiLCAidXBkYXRlUXVlcnkiLCAiZnJvbUl0ZW1zIiwgIkZyb21Ob2RlIiwgInVwZGF0ZXMiLCAibGltaXQiLCAiVXNpbmdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlcyIsICJ1c2luZyIsICJEZWxldGVRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZnJvbUl0ZW1zIiwgIndpdGhOb2RlIiwgIkZyb21Ob2RlIiwgIml0ZW1zIiwgIlF1ZXJ5Tm9kZSIsICJkZWxldGVOb2RlIiwgImxpbWl0IiwgInRhYmxlcyIsICJVc2luZ05vZGUiLCAiV2hlcmVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZpbHRlciIsICJ3aGVyZU5vZGUiLCAib3BlcmF0b3IiLCAib3BlcmF0aW9uIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgIlJldHVybmluZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2VsZWN0aW9ucyIsICJyZXR1cm5pbmciLCAiRXhwbGFpbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiV2hlbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uZGl0aW9uIiwgIndoZW5Ob2RlIiwgInJlc3VsdCIsICJNZXJnZVF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbnRvIiwgIndpdGhOb2RlIiwgIm1lcmdlTm9kZSIsICJ1c2luZyIsICJ3aGVuIiwgInRoZW4iLCAiV2hlbk5vZGUiLCAiT3V0cHV0Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJzZWxlY3Rpb25zIiwgIm91dHB1dCIsICJRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiU2VsZWN0UXVlcnlOb2RlIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJVcGRhdGVRdWVyeU5vZGUiLCAiRGVsZXRlUXVlcnlOb2RlIiwgIk1lcmdlUXVlcnlOb2RlIiwgIm1vZGlmaWVyIiwgIm9wZXJhdGlvbiIsICJXaGVyZU5vZGUiLCAiam9pbiIsICJzZWxlY3Rpb25zIiwgIlJldHVybmluZ05vZGUiLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiRXhwbGFpbk5vZGUiLCAidG9wIiwgIk91dHB1dE5vZGUiLCAiaXRlbXMiLCAiT3JkZXJCeU5vZGUiLCAiU2VsZWN0UXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIndpdGhOb2RlIiwgImZyb21JdGVtcyIsICJGcm9tTm9kZSIsICJzZWxlY3QiLCAic2VsZWN0aW9ucyIsICJleHByZXNzaW9ucyIsICJtb2RpZmllciIsICJpdGVtcyIsICJRdWVyeU5vZGUiLCAic2VsZWN0Tm9kZSIsICJHcm91cEJ5Tm9kZSIsICJsaW1pdCIsICJvZmZzZXQiLCAiZmV0Y2giLCAib3BlcmF0aW9uIiwgIkhhdmluZ05vZGUiLCAic2V0T3BlcmF0aW9ucyIsICJKb2luQnVpbGRlciIsICJfSm9pbkJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIkpvaW5Ob2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIlJhd05vZGUiLCAiZnVuYyIsICJQYXJ0aXRpb25CeUl0ZW1Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcnRpdGlvbkJ5IiwgInBhcnNlUGFydGl0aW9uQnkiLCAicGFydGl0aW9uQnkiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgIlBhcnRpdGlvbkJ5SXRlbU5vZGUiLCAiT3ZlckJ1aWxkZXIiLCAiX092ZXJCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJPdmVyTm9kZSIsICJwYXJzZU9yZGVyQnkiLCAiUXVlcnlOb2RlIiwgInBhcnRpdGlvbkJ5IiwgInBhcnNlUGFydGl0aW9uQnkiLCAiZnVuYyIsICJTZWxlY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNlbGVjdGlvbiIsICJTZWxlY3RBbGxOb2RlIiwgInRhYmxlIiwgIlJlZmVyZW5jZU5vZGUiLCAicGFyc2VTZWxlY3RBcmciLCAic2VsZWN0aW9uIiwgImlzRnVuY3Rpb24iLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAiaXNSZWFkb25seUFycmF5IiwgIml0IiwgInBhcnNlU2VsZWN0RXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJTZWxlY3Rpb25Ob2RlIiwgInBhcnNlQWxpYXNlZFN0cmluZ1JlZmVyZW5jZSIsICJpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAicGFyc2VTZWxlY3RBbGwiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGxBcmciLCAicGFyc2VUYWJsZSIsICJWYWx1ZXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlcyIsICJEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcnNlSW5zZXJ0RXhwcmVzc2lvbiIsICJhcmciLCAib2JqZWN0T3JMaXN0IiwgImlzRnVuY3Rpb24iLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAibGlzdCIsICJpc1JlYWRvbmx5QXJyYXkiLCAiZnJlZXplIiwgInBhcnNlSW5zZXJ0Q29sdW1uc0FuZFZhbHVlcyIsICJyb3dzIiwgImNvbHVtbnMiLCAicGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMiLCAiQ29sdW1uTm9kZSIsICJWYWx1ZXNOb2RlIiwgInJvdyIsICJwYXJzZVJvd1ZhbHVlcyIsICJjb2xzIiwgImNvbCIsICJyb3dDb2x1bW5zIiwgInJvd1ZhbHVlcyIsICJoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zIiwgImluZGV4ZWRSb3dDb2x1bW5zIiwgImNvbHVtbklkeCIsICJpc1VuZGVmaW5lZCIsICJ2YWx1ZSIsICJpc0V4cHJlc3Npb25PckZhY3RvcnkiLCAiZGVmYXVsdFZhbHVlIiwgIkRlZmF1bHRJbnNlcnRWYWx1ZU5vZGUiLCAiVmFsdWVMaXN0Tm9kZSIsICJpdCIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIiwgIkNvbHVtblVwZGF0ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgInZhbHVlIiwgInBhcnNlVXBkYXRlIiwgImFyZ3MiLCAiQ29sdW1uVXBkYXRlTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAicGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uIiwgInVwZGF0ZSIsICJ1cGRhdGVPYmoiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJfIiwgInZhbHVlIiwgImtleSIsICJDb2x1bW5Ob2RlIiwgIk9uRHVwbGljYXRlS2V5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ1cGRhdGVzIiwgIkluc2VydFJlc3VsdCIsICJpbnNlcnRJZCIsICJudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MiLCAiTm9SZXN1bHRFcnJvciIsICJub2RlIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImZuIiwgIk9uQ29uZmxpY3ROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInByb3BzIiwgIm9wZXJhdGlvbiIsICJXaGVyZU5vZGUiLCAiT25Db25mbGljdEJ1aWxkZXIiLCAiX09uQ29uZmxpY3RCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiY29sdW1uIiwgImNvbHVtbk5vZGUiLCAiQ29sdW1uTm9kZSIsICJPbkNvbmZsaWN0Tm9kZSIsICJjb2x1bW5zIiwgImNvbHVtbk5vZGVzIiwgImNvbnN0cmFpbnROYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgImV4cHJlc3Npb24iLCAiYXJncyIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJPbkNvbmZsaWN0RG9Ob3RoaW5nQnVpbGRlciIsICJ1cGRhdGUiLCAiT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIiLCAicGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uIiwgImZ1bmMiLCAiX09uQ29uZmxpY3RVcGRhdGVCdWlsZGVyIiwgIlRvcE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAiaXNOdW1iZXIiLCAiaXNCaWdJbnQiLCAiaXNVbmRlZmluZWQiLCAiaXNUb3BNb2RpZmllcnMiLCAiVG9wTm9kZSIsICJPckFjdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiYWN0aW9uIiwgIkluc2VydFF1ZXJ5QnVpbGRlciIsICJfSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiaW5zZXJ0IiwgImNvbHVtbnMiLCAidmFsdWVzIiwgInBhcnNlSW5zZXJ0RXhwcmVzc2lvbiIsICJJbnNlcnRRdWVyeU5vZGUiLCAiQ29sdW1uTm9kZSIsICJleHByZXNzaW9uIiwgInBhcnNlRXhwcmVzc2lvbiIsICJtb2RpZmllciIsICJRdWVyeU5vZGUiLCAiT3JBY3Rpb25Ob2RlIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJjYWxsYmFjayIsICJPbkNvbmZsaWN0QnVpbGRlciIsICJPbkNvbmZsaWN0Tm9kZSIsICJ1cGRhdGUiLCAiT25EdXBsaWNhdGVLZXlOb2RlIiwgInBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbiIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAicGFyc2VTZWxlY3RBbGwiLCAiYXJncyIsICJ0YWJsZSIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJwbHVnaW4iLCAiY29tcGlsZWRRdWVyeSIsICJyZXN1bHQiLCAiYWRhcHRlciIsICJxdWVyeSIsICJJbnNlcnRSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImNodW5rU2l6ZSIsICJzdHJlYW0iLCAiaXRlbSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJEZWxldGVSZXN1bHQiLCAibnVtRGVsZXRlZFJvd3MiLCAiTGltaXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImxpbWl0IiwgIkRlbGV0ZVF1ZXJ5QnVpbGRlciIsICJfRGVsZXRlUXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJRdWVyeU5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAidGFibGVzIiwgIkRlbGV0ZVF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICIjam9pbiIsICJqb2luVHlwZSIsICJwYXJzZUpvaW4iLCAic2VsZWN0aW9uIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgInBhcnNlT3JkZXJCeSIsICJsaW1pdCIsICJMaW1pdE5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAibW9kaWZpZXIiLCAiZnVuYyIsICJjb25kaXRpb24iLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiRGVsZXRlUmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiVXBkYXRlUmVzdWx0IiwgIm51bVVwZGF0ZWRSb3dzIiwgIm51bUNoYW5nZWRSb3dzIiwgIlVwZGF0ZVF1ZXJ5QnVpbGRlciIsICJfVXBkYXRlUXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJRdWVyeU5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAiZnJvbSIsICJVcGRhdGVRdWVyeU5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QiLCAiI2pvaW4iLCAiam9pblR5cGUiLCAicGFyc2VKb2luIiwgInBhcnNlT3JkZXJCeSIsICJsaW1pdCIsICJMaW1pdE5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAicGFyc2VVcGRhdGUiLCAic2VsZWN0aW9uIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgIm1vZGlmaWVyIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgInBsdWdpbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJhZGFwdGVyIiwgInF1ZXJ5IiwgIlVwZGF0ZVJlc3VsdCIsICJlcnJvckNvbnN0cnVjdG9yIiwgIk5vUmVzdWx0RXJyb3IiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiY2h1bmtTaXplIiwgInN0cmVhbSIsICJpdGVtIiwgImZvcm1hdCIsICJvcHRpb25zIiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlTmFtZSIsICJjb2x1bW5OYW1lcyIsICJUYWJsZU5vZGUiLCAiQ29sdW1uTm9kZSIsICJDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiZXhwcmVzc2lvbiIsICJwcm9wcyIsICJDVEVCdWlsZGVyIiwgIl9DVEVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSIsICJwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbiIsICJuYW1lT3JCdWlsZGVyQ2FsbGJhY2siLCAiZXhwcmVzc2lvbiIsICJleHByZXNzaW9uTm9kZSIsICJjcmVhdGVRdWVyeUNyZWF0b3IiLCAiaXNGdW5jdGlvbiIsICJjdGVCdWlsZGVyRmFjdG9yeSIsICJDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIiwgInBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZSIsICJuYW1lIiwgIkNURUJ1aWxkZXIiLCAicGFydHMiLCAidGFibGUiLCAiY29sdW1ucyIsICJpdCIsICJDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZSIsICJXaXRoTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJleHByZXNzaW9uIiwgInBhcmFtcyIsICJ3aXRoTm9kZSIsICJDSEFSUyIsICJyYW5kb21TdHJpbmciLCAibGVuZ3RoIiwgImNoYXJzIiwgImkiLCAicmFuZG9tQ2hhciIsICJjcmVhdGVRdWVyeUlkIiwgIkxhenlRdWVyeUlkIiwgIiNxdWVyeUlkIiwgInJhbmRvbVN0cmluZyIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAiI3RyYW5zZm9ybWVycyIsICJmcmVlemUiLCAibm9kZSIsICJxdWVyeUlkIiwgIm91dCIsICJsaXN0IiwgIl9xdWVyeUlkIiwgIlJPT1RfT1BFUkFUSU9OX05PREVTIiwgImZyZWV6ZSIsICJTQ0hFTUFMRVNTX0ZVTkNUSU9OUyIsICJXaXRoU2NoZW1hVHJhbnNmb3JtZXIiLCAiT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIiwgIiNzY2hlbWEiLCAiI3NjaGVtYWJsZUlkcyIsICIjY3RlcyIsICJzY2hlbWEiLCAibm9kZSIsICJxdWVyeUlkIiwgIiNpc1Jvb3RPcGVyYXRpb25Ob2RlIiwgImN0ZXMiLCAiI2NvbGxlY3RDVEVzIiwgImN0ZSIsICJ0YWJsZXMiLCAiI2NvbGxlY3RTY2hlbWFibGVJZHMiLCAidGFibGUiLCAidHJhbnNmb3JtZWQiLCAiSWRlbnRpZmllck5vZGUiLCAiVGFibGVOb2RlIiwgIiN0cmFuc2Zvcm1UYWJsZUFyZ3NXaXRob3V0U2NoZW1hcyIsICJpdGVtIiwgImFyZ3NLZXkiLCAiYXJnIiwgInNjaGVtYWJsZUlkcyIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICIjY29sbGVjdFNjaGVtYWJsZUlkIiwgImZyb20iLCAiI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByIiwgImpvaW4iLCAiSm9pbk5vZGUiLCAiI2NvbGxlY3RDVEVJZHMiLCAiQWxpYXNOb2RlIiwgIkxpc3ROb2RlIiwgIlVzaW5nTm9kZSIsICJpZCIsICJleHByIiwgImN0ZUlkIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiI3RyYW5zZm9ybWVyIiwgInNjaGVtYSIsICJXaXRoU2NoZW1hVHJhbnNmb3JtZXIiLCAiYXJncyIsICJNYXRjaGVkTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJub3QiLCAiYnlTb3VyY2UiLCAicGFyc2VNZXJnZVdoZW4iLCAidHlwZSIsICJhcmdzIiwgInJlZlJpZ2h0IiwgIldoZW5Ob2RlIiwgInBhcnNlRmlsdGVyTGlzdCIsICJNYXRjaGVkTm9kZSIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAicGFyc2VNZXJnZVRoZW4iLCAicmVzdWx0IiwgImlzU3RyaW5nIiwgIlJhd05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIkRlZmVycmVkIiwgIiNwcm9taXNlIiwgIiNyZXNvbHZlIiwgIiNyZWplY3QiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAidmFsdWUiLCAicmVhc29uIiwgInByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAiY29ubmVjdGlvbkRlZmVyIiwgIkRlZmVycmVkIiwgImNvbm5lY3Rpb25SZWxlYXNlRGVmZXIiLCAiY29ubmVjdGlvbiIsICJleCIsICJmcmVlemUiLCAiTk9fUExVR0lOUyIsICJmcmVlemUiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAiI3BsdWdpbnMiLCAicGx1Z2lucyIsICJub2RlIiwgInF1ZXJ5SWQiLCAicGx1Z2luIiwgInRyYW5zZm9ybWVkTm9kZSIsICJjb21waWxlZFF1ZXJ5IiwgImNvbm5lY3Rpb24iLCAicmVzdWx0IiwgImxvZ09uY2UiLCAiI3RyYW5zZm9ybVJlc3VsdCIsICJjaHVua1NpemUiLCAicmVsZWFzZSIsICJwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24iLCAiTm9vcFF1ZXJ5RXhlY3V0b3IiLCAiX05vb3BRdWVyeUV4ZWN1dG9yIiwgIlF1ZXJ5RXhlY3V0b3JCYXNlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgIk5PT1BfUVVFUllfRVhFQ1VUT1IiLCAiTWVyZ2VSZXN1bHQiLCAibnVtQ2hhbmdlZFJvd3MiLCAiTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiX01lcmdlUXVlcnlCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAibW9kaWZpZXIiLCAiUXVlcnlOb2RlIiwgImV4cHJlc3Npb24iLCAibW9kaWZpZXJzIiwgInBhcnNlVG9wIiwgImFyZ3MiLCAiV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiTWVyZ2VRdWVyeU5vZGUiLCAicGFyc2VKb2luIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgInBhcnNlU2VsZWN0QWxsIiwgIl9XaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICIjd2hlbk1hdGNoZWQiLCAibGhzIiwgIm9wIiwgInJocyIsICJyZWZSaWdodCIsICJNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICJwYXJzZU1lcmdlV2hlbiIsICIjd2hlbk5vdE1hdGNoZWQiLCAiYnlTb3VyY2UiLCAiQnVpbGRlciIsICJOb3RNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJhZGFwdGVyIiwgInF1ZXJ5IiwgIk1lcmdlUmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJwYXJzZU1lcmdlVGhlbiIsICJzZXQiLCAiVXBkYXRlUXVlcnlCdWlsZGVyIiwgIk5PT1BfUVVFUllfRVhFQ1VUT1IiLCAiVXBkYXRlUXVlcnlOb2RlIiwgInViIiwgImluc2VydCIsICJjb2x1bW5zIiwgInZhbHVlcyIsICJwYXJzZUluc2VydEV4cHJlc3Npb24iLCAiSW5zZXJ0UXVlcnlOb2RlIiwgIlF1ZXJ5Q3JlYXRvciIsICJfUXVlcnlDcmVhdG9yIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiZnJvbSIsICJjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIiLCAiY3JlYXRlUXVlcnlJZCIsICJTZWxlY3RRdWVyeU5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QiLCAic2VsZWN0aW9uIiwgInBhcnNlU2VsZWN0QXJnIiwgInRhYmxlIiwgIkluc2VydFF1ZXJ5QnVpbGRlciIsICJJbnNlcnRRdWVyeU5vZGUiLCAicGFyc2VUYWJsZSIsICJEZWxldGVRdWVyeUJ1aWxkZXIiLCAiRGVsZXRlUXVlcnlOb2RlIiwgInRhYmxlcyIsICJVcGRhdGVRdWVyeUJ1aWxkZXIiLCAiVXBkYXRlUXVlcnlOb2RlIiwgInRhcmdldFRhYmxlIiwgIk1lcmdlUXVlcnlCdWlsZGVyIiwgIk1lcmdlUXVlcnlOb2RlIiwgInBhcnNlQWxpYXNlZFRhYmxlIiwgIm5hbWVPckJ1aWxkZXIiLCAiZXhwcmVzc2lvbiIsICJjdGUiLCAicGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb24iLCAiV2l0aE5vZGUiLCAicGx1Z2luIiwgInNjaGVtYSIsICJXaXRoU2NoZW1hUGx1Z2luIiwgImNyZWF0ZVF1ZXJ5Q3JlYXRvciIsICJRdWVyeUNyZWF0b3IiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJjcmVhdGVKb2luQnVpbGRlciIsICJqb2luVHlwZSIsICJ0YWJsZSIsICJKb2luQnVpbGRlciIsICJKb2luTm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbiIsICJjcmVhdGVPdmVyQnVpbGRlciIsICJPdmVyQnVpbGRlciIsICJPdmVyTm9kZSIsICJwYXJzZUpvaW4iLCAiam9pblR5cGUiLCAiYXJncyIsICJwYXJzZVNpbmdsZU9uSm9pbiIsICJwYXJzZUNhbGxiYWNrSm9pbiIsICJwYXJzZU9ubGVzc0pvaW4iLCAiZnJvbSIsICJjYWxsYmFjayIsICJjcmVhdGVKb2luQnVpbGRlciIsICJsaHNDb2x1bW4iLCAicmhzQ29sdW1uIiwgIkpvaW5Ob2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiT2Zmc2V0Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvZmZzZXQiLCAiR3JvdXBCeUl0ZW1Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImdyb3VwQnkiLCAicGFyc2VHcm91cEJ5IiwgImdyb3VwQnkiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QiLCAiR3JvdXBCeUl0ZW1Ob2RlIiwgIlNldE9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3BlcmF0b3IiLCAiZXhwcmVzc2lvbiIsICJhbGwiLCAicGFyc2VTZXRPcGVyYXRpb25zIiwgIm9wZXJhdG9yIiwgImV4cHJlc3Npb24iLCAiYWxsIiwgImlzRnVuY3Rpb24iLCAiY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIiLCAiaXNSZWFkb25seUFycmF5IiwgImV4cHIiLCAiU2V0T3BlcmF0aW9uTm9kZSIsICJwYXJzZUV4cHJlc3Npb24iLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAiX0V4cHJlc3Npb25XcmFwcGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiYWxpYXMiLCAiQWxpYXNlZEV4cHJlc3Npb25XcmFwcGVyIiwgImFyZ3MiLCAiT3JXcmFwcGVyIiwgIk9yTm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgIkFuZFdyYXBwZXIiLCAiQW5kTm9kZSIsICIjZXhwciIsICIjYWxpYXMiLCAiZXhwciIsICJBbGlhc05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIklkZW50aWZpZXJOb2RlIiwgIl9PcldyYXBwZXIiLCAiUGFyZW5zTm9kZSIsICJfQW5kV3JhcHBlciIsICJGZXRjaE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicm93Q291bnQiLCAibW9kaWZpZXIiLCAiVmFsdWVOb2RlIiwgInBhcnNlRmV0Y2giLCAicm93Q291bnQiLCAibW9kaWZpZXIiLCAiaXNOdW1iZXIiLCAiaXNCaWdJbnQiLCAiaXNGZXRjaE1vZGlmaWVyIiwgIkZldGNoTm9kZSIsICJ2YWx1ZSIsICJTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsIiwgIl9TZWxlY3RRdWVyeUJ1aWxkZXJJbXBsIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJRdWVyeU5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiU2VsZWN0UXVlcnlOb2RlIiwgInNlbGVjdGlvbiIsICJwYXJzZVNlbGVjdEFyZyIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QiLCAibW9kaWZpZXIiLCAiU2VsZWN0TW9kaWZpZXJOb2RlIiwgIm9mIiwgImFzQXJyYXkiLCAicGFyc2VUYWJsZSIsICJ0YWJsZSIsICJwYXJzZVNlbGVjdEFsbCIsICIjam9pbiIsICJqb2luVHlwZSIsICJwYXJzZUpvaW4iLCAicGFyc2VPcmRlckJ5IiwgImdyb3VwQnkiLCAicGFyc2VHcm91cEJ5IiwgImxpbWl0IiwgIkxpbWl0Tm9kZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJvZmZzZXQiLCAiT2Zmc2V0Tm9kZSIsICJyb3dDb3VudCIsICJwYXJzZUZldGNoIiwgImV4cHJlc3Npb24iLCAibW9kaWZpZXJzIiwgInBhcnNlVG9wIiwgInBhcnNlU2V0T3BlcmF0aW9ucyIsICJhbGlhcyIsICJBbGlhc2VkU2VsZWN0UXVlcnlCdWlsZGVySW1wbCIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJFeHByZXNzaW9uV3JhcHBlciIsICJwbHVnaW4iLCAiY29tcGlsZWRRdWVyeSIsICJyZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImNodW5rU2l6ZSIsICJzdHJlYW0iLCAiaXRlbSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIiLCAiI3F1ZXJ5QnVpbGRlciIsICIjYWxpYXMiLCAicXVlcnlCdWlsZGVyIiwgIkFsaWFzTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJBZ2dyZWdhdGVGdW5jdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiYWdncmVnYXRlRnVuY3Rpb24iLCAiYWdncmVnYXRlZCIsICJhZ2dyZWdhdGVGdW5jdGlvbk5vZGUiLCAib3JkZXJJdGVtcyIsICJ3aXRoaW5Hcm91cCIsICJwcm9wIiwgIk9yZGVyQnlOb2RlIiwgImZpbHRlciIsICJXaGVyZU5vZGUiLCAib3ZlciIsICJGdW5jdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZnVuYyIsICJhcmdzIiwgIkFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICJfQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYWxpYXMiLCAiQWxpYXNlZEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICJBZ2dyZWdhdGVGdW5jdGlvbk5vZGUiLCAiYXJncyIsICJRdWVyeU5vZGUiLCAicGFyc2VPcmRlckJ5IiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIm92ZXIiLCAiYnVpbGRlciIsICJjcmVhdGVPdmVyQnVpbGRlciIsICJmdW5jIiwgIiNhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiI2FsaWFzIiwgImFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICJBbGlhc05vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlRnVuY3Rpb25Nb2R1bGUiLCAiZm4iLCAibmFtZSIsICJhcmdzIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgIkZ1bmN0aW9uTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QiLCAiYWdnIiwgIkFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICJBZ2dyZWdhdGVGdW5jdGlvbk5vZGUiLCAiY29sdW1uIiwgInZhbHVlcyIsICJ0YWJsZSIsICJwYXJzZVNlbGVjdEFsbCIsICJpc1N0cmluZyIsICJwYXJzZVRhYmxlIiwgIlVuYXJ5T3BlcmF0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJvcGVyYW5kIiwgInBhcnNlVW5hcnlPcGVyYXRpb24iLCAib3BlcmF0b3IiLCAib3BlcmFuZCIsICJVbmFyeU9wZXJhdGlvbk5vZGUiLCAiT3BlcmF0b3JOb2RlIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJDYXNlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ2YWx1ZSIsICJjYXNlTm9kZSIsICJ3aGVuIiwgInRoZW4iLCAiV2hlbk5vZGUiLCAicHJvcHMiLCAiQ2FzZUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIkNhc2VUaGVuQnVpbGRlciIsICJDYXNlTm9kZSIsICJXaGVuTm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgInZhbHVlRXhwcmVzc2lvbiIsICJDYXNlV2hlbkJ1aWxkZXIiLCAiaXNTYWZlSW1tZWRpYXRlVmFsdWUiLCAicGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAiQ2FzZUVuZEJ1aWxkZXIiLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAiSlNPTlBhdGhMZWdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInR5cGUiLCAidmFsdWUiLCAiSlNPTlBhdGhCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiaW5kZXgiLCAiI2NyZWF0ZUJ1aWxkZXJXaXRoUGF0aExlZyIsICJrZXkiLCAibGVnVHlwZSIsICJ2YWx1ZSIsICJKU09OUmVmZXJlbmNlTm9kZSIsICJUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIiLCAiSlNPTlBhdGhOb2RlIiwgIkpTT05QYXRoTGVnTm9kZSIsICJKU09OT3BlcmF0b3JDaGFpbk5vZGUiLCAiVmFsdWVOb2RlIiwgIl9UcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIiLCAiYWxpYXMiLCAiQWxpYXNlZEpTT05QYXRoQnVpbGRlciIsICIjanNvblBhdGgiLCAiI2FsaWFzIiwgImpzb25QYXRoIiwgIkFsaWFzTm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiSWRlbnRpZmllck5vZGUiLCAiVHVwbGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInZhbHVlcyIsICJTSU1QTEVfQ09MVU1OX0RBVEFfVFlQRVMiLCAiQ09MVU1OX0RBVEFfVFlQRV9SRUdFWCIsICJEYXRhVHlwZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZGF0YVR5cGUiLCAiaXNDb2x1bW5EYXRhVHlwZSIsICJyIiwgInBhcnNlRGF0YVR5cGVFeHByZXNzaW9uIiwgImRhdGFUeXBlIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJpc0NvbHVtbkRhdGFUeXBlIiwgIkRhdGFUeXBlTm9kZSIsICJDYXN0Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJleHByZXNzaW9uIiwgImRhdGFUeXBlIiwgImNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyIiwgImV4ZWN1dG9yIiwgIk5PT1BfUVVFUllfRVhFQ1VUT1IiLCAiYmluYXJ5IiwgImxocyIsICJvcCIsICJyaHMiLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbiIsICJ1bmFyeSIsICJleHByIiwgInBhcnNlVW5hcnlPcGVyYXRpb24iLCAiZWIiLCAidGFibGUiLCAiY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiU2VsZWN0UXVlcnlOb2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0IiwgInJlZmVyZW5jZSIsICJDYXNlQnVpbGRlciIsICJDYXNlTm9kZSIsICJpc1VuZGVmaW5lZCIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAicGFyc2VTdHJpbmdSZWZlcmVuY2UiLCAiSlNPTlBhdGhCdWlsZGVyIiwgInBhcnNlSlNPTlJlZmVyZW5jZSIsICJKU09OUGF0aE5vZGUiLCAicGFyc2VUYWJsZSIsICJ2YWx1ZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAiVHVwbGVOb2RlIiwgInBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlIiwgInN0YXJ0IiwgImVuZCIsICJCaW5hcnlPcGVyYXRpb25Ob2RlIiwgIk9wZXJhdG9yTm9kZSIsICJBbmROb2RlIiwgImV4cHJzIiwgImlzUmVhZG9ubHlBcnJheSIsICJwYXJzZUZpbHRlckxpc3QiLCAicGFyc2VGaWx0ZXJPYmplY3QiLCAiYXJncyIsICJub2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiUGFyZW5zTm9kZSIsICJkYXRhVHlwZSIsICJDYXN0Tm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJzY2hlbWEiLCAiV2l0aFNjaGVtYVBsdWdpbiIsICJjcmVhdGVGdW5jdGlvbk1vZHVsZSIsICJleHByZXNzaW9uQnVpbGRlciIsICJfIiwgInBhcnNlRXhwcmVzc2lvbiIsICJleHAiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzRnVuY3Rpb24iLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAicGFyc2VBbGlhc2VkRXhwcmVzc2lvbiIsICJpc0V4cHJlc3Npb25PckZhY3RvcnkiLCAib2JqIiwgImlzRXhwcmVzc2lvbiIsICJpc0FsaWFzZWRFeHByZXNzaW9uIiwgIkR5bmFtaWNUYWJsZUJ1aWxkZXIiLCAiI3RhYmxlIiwgInRhYmxlIiwgImFsaWFzIiwgIkFsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyIiwgIiNhbGlhcyIsICJBbGlhc05vZGUiLCAicGFyc2VUYWJsZSIsICJJZGVudGlmaWVyTm9kZSIsICJpc0FsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyIiwgIm9iaiIsICJpc09iamVjdCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNTdHJpbmciLCAicGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QiLCAidGFibGUiLCAiaXNSZWFkb25seUFycmF5IiwgIml0IiwgInBhcnNlVGFibGVFeHByZXNzaW9uIiwgImlzU3RyaW5nIiwgInBhcnNlQWxpYXNlZFRhYmxlIiwgImlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIiLCAicGFyc2VBbGlhc2VkRXhwcmVzc2lvbiIsICJmcm9tIiwgIkFMSUFTX1NFUEFSQVRPUiIsICJhbGlhcyIsICJ0cmltIiwgIkFsaWFzTm9kZSIsICJwYXJzZVRhYmxlIiwgIklkZW50aWZpZXJOb2RlIiwgInNjaGVtYSIsICJUYWJsZU5vZGUiLCAic3RyIiwgIkFkZENvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJkYXRhVHlwZSIsICJDb2x1bW5Ob2RlIiwgIm1vZGlmaWVyIiwgInByb3BzIiwgIkRyb3BDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJDb2x1bW5Ob2RlIiwgIlJlbmFtZUNvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgIm5ld0NvbHVtbiIsICJDb2x1bW5Ob2RlIiwgIkNoZWNrQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJjb25zdHJhaW50TmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIlJlZmVyZW5jZXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgImNvbHVtbnMiLCAicmVmZXJlbmNlcyIsICJvbkRlbGV0ZSIsICJvblVwZGF0ZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAidmFsdWUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIlZhbHVlTm9kZSIsICJHZW5lcmF0ZWROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcmFtcyIsICJleHByZXNzaW9uIiwgIkRlZmF1bHRWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZGVmYXVsdFZhbHVlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgImFjdGlvbiIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIkNvbHVtbkRlZmluaXRpb25CdWlsZGVyIiwgIl9Db2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgInJlZiIsICJyZWZlcmVuY2VzIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIlNlbGVjdEFsbE5vZGUiLCAiUmVmZXJlbmNlc05vZGUiLCAib25EZWxldGUiLCAicGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24iLCAib25VcGRhdGUiLCAidmFsdWUiLCAiRGVmYXVsdFZhbHVlTm9kZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZXhwcmVzc2lvbiIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgIkdlbmVyYXRlZE5vZGUiLCAibW9kaWZpZXIiLCAiZnVuYyIsICJNb2RpZnlDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic291cmNlQ29sdW1ucyIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIlJlZmVyZW5jZXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgInByb3BzIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJfRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAib25EZWxldGUiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgIm9uVXBkYXRlIiwgImZ1bmMiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludCIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIm51bGxzTm90RGlzdGluY3QiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiZHJvcENvbnN0cmFpbnQiLCAicHJvcHMiLCAiQWx0ZXJDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJwcm9wIiwgInZhbHVlIiwgIkNvbHVtbk5vZGUiLCAiQWx0ZXJDb2x1bW5CdWlsZGVyIiwgIiNjb2x1bW4iLCAiY29sdW1uIiwgImRhdGFUeXBlIiwgIkFsdGVyZWRDb2x1bW5CdWlsZGVyIiwgIkFsdGVyQ29sdW1uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJ2YWx1ZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZnVuYyIsICIjYWx0ZXJDb2x1bW5Ob2RlIiwgImFsdGVyQ29sdW1uTm9kZSIsICJBbHRlclRhYmxlRXhlY3V0b3IiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAib25EZWxldGUiLCAib25VcGRhdGUiLCAiZnVuYyIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRDb25zdHJhaW50Tm9kZSIsICJBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiRHJvcENvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbnMiLCAiY29uc3RyYWludE5hbWUiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJBZGRJbmRleE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJjb2x1bW5zIiwgIkFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiX0FsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRJbmRleE5vZGUiLCAiY29sdW1uIiwgInBhcnNlT3JkZXJlZENvbHVtbk5hbWUiLCAiY29sdW1ucyIsICJleHByZXNzaW9uIiwgImluZGV4VHlwZSIsICJSYXdOb2RlIiwgImZ1bmMiLCAiVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIiwgIl9VbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiI25vZGUiLCAibm9kZSIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmdW5jIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJfUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgImZ1bmMiLCAiUmVuYW1lQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgIkFsdGVyVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAibmV3VGFibGVOYW1lIiwgIkFsdGVyVGFibGVFeGVjdXRvciIsICJBbHRlclRhYmxlTm9kZSIsICJwYXJzZVRhYmxlIiwgIm5ld1NjaGVtYSIsICJJZGVudGlmaWVyTm9kZSIsICJjb2x1bW4iLCAiYWx0ZXJhdGlvbiIsICJidWlsZGVyIiwgIkFsdGVyQ29sdW1uQnVpbGRlciIsICJBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyIiwgIkRyb3BDb2x1bW5Ob2RlIiwgIm5ld0NvbHVtbiIsICJSZW5hbWVDb2x1bW5Ob2RlIiwgImNvbHVtbk5hbWUiLCAiZGF0YVR5cGUiLCAiYnVpbGQiLCAibm9vcCIsICJDb2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICJDb2x1bW5EZWZpbml0aW9uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJBZGRDb2x1bW5Ob2RlIiwgIk1vZGlmeUNvbHVtbk5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJ1bmlxdWVDb25zdHJhaW50QnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiVW5pcXVlQ29uc3RyYWludE5vZGUiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiY2hlY2tFeHByZXNzaW9uIiwgImNvbnN0cmFpbnRCdWlsZGVyIiwgIkNoZWNrQ29uc3RyYWludEJ1aWxkZXIiLCAiQ2hlY2tDb25zdHJhaW50Tm9kZSIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiQ29sdW1uTm9kZSIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUiLCAiQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIlJlbmFtZUNvbnN0cmFpbnROb2RlIiwgImluZGV4TmFtZSIsICJBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyIiwgIkFkZEluZGV4Tm9kZSIsICJEcm9wSW5kZXhOb2RlIiwgImZ1bmMiLCAiX0FsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAibm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIlZhbHVlTm9kZSIsICJDcmVhdGVJbmRleEJ1aWxkZXIiLCAiX0NyZWF0ZUluZGV4QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJ0YWJsZSIsICJwYXJzZVRhYmxlIiwgImNvbHVtbiIsICJwYXJzZU9yZGVyZWRDb2x1bW5OYW1lIiwgImNvbHVtbnMiLCAiZXhwcmVzc2lvbiIsICJpbmRleFR5cGUiLCAiUmF3Tm9kZSIsICJhcmdzIiwgInRyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiUXVlcnlOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiZnVuYyIsICJDcmVhdGVTY2hlbWFCdWlsZGVyIiwgIl9DcmVhdGVTY2hlbWFCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJmdW5jIiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiYWN0aW9uIiwgIk9OX0NPTU1JVF9BQ1RJT05TIiwgIkNyZWF0ZVRhYmxlQnVpbGRlciIsICJfQ3JlYXRlVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlVGFibGVOb2RlIiwgIm9uQ29tbWl0IiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiY29sdW1uTmFtZSIsICJkYXRhVHlwZSIsICJidWlsZCIsICJub29wIiwgImNvbHVtbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbk5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJjb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgInVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIiwgIlVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJjaGVja0V4cHJlc3Npb24iLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgInRhcmdldFRhYmxlIiwgInRhcmdldENvbHVtbnMiLCAiYnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgIkNvbHVtbk5vZGUiLCAicGFyc2VUYWJsZSIsICJtb2RpZmllciIsICJleHByZXNzaW9uIiwgInBhcnNlRXhwcmVzc2lvbiIsICJmdW5jIiwgIkRyb3BJbmRleEJ1aWxkZXIiLCAiX0Ryb3BJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJ0YWJsZSIsICJEcm9wSW5kZXhOb2RlIiwgInBhcnNlVGFibGUiLCAiZnVuYyIsICJEcm9wU2NoZW1hQnVpbGRlciIsICJfRHJvcFNjaGVtYUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wU2NoZW1hTm9kZSIsICJmdW5jIiwgIkRyb3BUYWJsZUJ1aWxkZXIiLCAiX0Ryb3BUYWJsZUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wVGFibGVOb2RlIiwgImZ1bmMiLCAiQ3JlYXRlVmlld05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJjcmVhdGVWaWV3IiwgInBhcmFtcyIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJhcmdzIiwgIkNyZWF0ZVZpZXdCdWlsZGVyIiwgIl9DcmVhdGVWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZVZpZXdOb2RlIiwgImNvbHVtbnMiLCAicGFyc2VDb2x1bW5OYW1lIiwgInF1ZXJ5IiwgInF1ZXJ5Tm9kZSIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICJmdW5jIiwgIkRyb3BWaWV3Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImRyb3BWaWV3IiwgInBhcmFtcyIsICJEcm9wVmlld0J1aWxkZXIiLCAiX0Ryb3BWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkRyb3BWaWV3Tm9kZSIsICJmdW5jIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiY3JlYXRlVHlwZSIsICJ2YWx1ZXMiLCAiVmFsdWVMaXN0Tm9kZSIsICJWYWx1ZU5vZGUiLCAiQ3JlYXRlVHlwZUJ1aWxkZXIiLCAiX0NyZWF0ZVR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAidmFsdWVzIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZ1bmMiLCAiRHJvcFR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiZHJvcFR5cGUiLCAicGFyYW1zIiwgIkRyb3BUeXBlQnVpbGRlciIsICJfRHJvcFR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiRHJvcFR5cGVOb2RlIiwgImZ1bmMiLCAicGFyc2VTY2hlbWFibGVJZGVudGlmaWVyIiwgImlkIiwgInBhcnRzIiwgInRyaW0iLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAic3RyIiwgIlJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImNyZWF0ZVZpZXciLCAicGFyYW1zIiwgIlJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlciIsICJfUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIiwgImZ1bmMiLCAiU2NoZW1hTW9kdWxlIiwgIl9TY2hlbWFNb2R1bGUiLCAiI2V4ZWN1dG9yIiwgImV4ZWN1dG9yIiwgInRhYmxlIiwgIkNyZWF0ZVRhYmxlQnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJwYXJzZVRhYmxlIiwgIkRyb3BUYWJsZUJ1aWxkZXIiLCAiRHJvcFRhYmxlTm9kZSIsICJpbmRleE5hbWUiLCAiQ3JlYXRlSW5kZXhCdWlsZGVyIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJEcm9wSW5kZXhCdWlsZGVyIiwgIkRyb3BJbmRleE5vZGUiLCAic2NoZW1hIiwgIkNyZWF0ZVNjaGVtYUJ1aWxkZXIiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJEcm9wU2NoZW1hQnVpbGRlciIsICJEcm9wU2NoZW1hTm9kZSIsICJBbHRlclRhYmxlQnVpbGRlciIsICJBbHRlclRhYmxlTm9kZSIsICJ2aWV3TmFtZSIsICJDcmVhdGVWaWV3QnVpbGRlciIsICJDcmVhdGVWaWV3Tm9kZSIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIiwgIkRyb3BWaWV3QnVpbGRlciIsICJEcm9wVmlld05vZGUiLCAidHlwZU5hbWUiLCAiQ3JlYXRlVHlwZUJ1aWxkZXIiLCAiQ3JlYXRlVHlwZU5vZGUiLCAicGFyc2VTY2hlbWFibGVJZGVudGlmaWVyIiwgIkRyb3BUeXBlQnVpbGRlciIsICJEcm9wVHlwZU5vZGUiLCAicGx1Z2luIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiRHluYW1pY01vZHVsZSIsICJyZWZlcmVuY2UiLCAiRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAidGFibGUiLCAiRHluYW1pY1RhYmxlQnVpbGRlciIsICJEZWZhdWx0Q29ubmVjdGlvblByb3ZpZGVyIiwgIiNkcml2ZXIiLCAiZHJpdmVyIiwgImNvbnN1bWVyIiwgImNvbm5lY3Rpb24iLCAiRGVmYXVsdFF1ZXJ5RXhlY3V0b3IiLCAiX0RlZmF1bHRRdWVyeUV4ZWN1dG9yIiwgIlF1ZXJ5RXhlY3V0b3JCYXNlIiwgIiNjb21waWxlciIsICIjYWRhcHRlciIsICIjY29ubmVjdGlvblByb3ZpZGVyIiwgImNvbXBpbGVyIiwgImFkYXB0ZXIiLCAiY29ubmVjdGlvblByb3ZpZGVyIiwgInBsdWdpbnMiLCAibm9kZSIsICJxdWVyeUlkIiwgImNvbnN1bWVyIiwgInBsdWdpbiIsICJwZXJmb3JtYW5jZU5vdyIsICJpc0Z1bmN0aW9uIiwgIlJ1bnRpbWVEcml2ZXIiLCAiI2RyaXZlciIsICIjbG9nIiwgIiNpbml0UHJvbWlzZSIsICIjaW5pdERvbmUiLCAiI2Rlc3Ryb3lQcm9taXNlIiwgIiNjb25uZWN0aW9ucyIsICJkcml2ZXIiLCAibG9nIiwgImVyciIsICJjb25uZWN0aW9uIiwgIiNuZWVkc0xvZ2dpbmciLCAiI2FkZExvZ2dpbmciLCAic2V0dGluZ3MiLCAic2F2ZXBvaW50TmFtZSIsICJjb21waWxlUXVlcnkiLCAiZXhlY3V0ZVF1ZXJ5IiwgInN0cmVhbVF1ZXJ5IiwgImRpcyIsICJjb21waWxlZFF1ZXJ5IiwgImNhdWdodEVycm9yIiwgInN0YXJ0VGltZSIsICJwZXJmb3JtYW5jZU5vdyIsICJlcnJvciIsICIjbG9nRXJyb3IiLCAiI2xvZ1F1ZXJ5IiwgImNodW5rU2l6ZSIsICJyZXN1bHQiLCAiI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzIiwgImlzU3RyZWFtIiwgImlnbm9yZUVycm9yIiwgIlNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlciIsICIjY29ubmVjdGlvbiIsICIjcnVubmluZ1Byb21pc2UiLCAiY29ubmVjdGlvbiIsICJjb25zdW1lciIsICIjcnVuIiwgInJ1bm5lciIsICJUUkFOU0FDVElPTl9BQ0NFU1NfTU9ERVMiLCAiVFJBTlNBQ1RJT05fSVNPTEFUSU9OX0xFVkVMUyIsICJ2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3MiLCAic2V0dGluZ3MiLCAibG9nTGV2ZWxzIiwgIkxPR19MRVZFTFMiLCAiZnJlZXplIiwgIkxvZyIsICIjbGV2ZWxzIiwgIiNsb2dnZXIiLCAiY29uZmlnIiwgImlzRnVuY3Rpb24iLCAiZGVmYXVsdExvZ2dlciIsICJsZXZlbCIsICJnZXRFdmVudCIsICJldmVudCIsICJwcmVmaXgiLCAiaXNDb21waWxhYmxlIiwgInZhbHVlIiwgImlzT2JqZWN0IiwgImlzRnVuY3Rpb24iLCAiS3lzZWx5IiwgIl9LeXNlbHkiLCAiUXVlcnlDcmVhdG9yIiwgIiNwcm9wcyIsICJhcmdzIiwgInN1cGVyUHJvcHMiLCAicHJvcHMiLCAiaXNLeXNlbHlQcm9wcyIsICJkaWFsZWN0IiwgImRyaXZlciIsICJjb21waWxlciIsICJhZGFwdGVyIiwgImxvZyIsICJMb2ciLCAicnVudGltZURyaXZlciIsICJSdW50aW1lRHJpdmVyIiwgImNvbm5lY3Rpb25Qcm92aWRlciIsICJEZWZhdWx0Q29ubmVjdGlvblByb3ZpZGVyIiwgImV4ZWN1dG9yIiwgIkRlZmF1bHRRdWVyeUV4ZWN1dG9yIiwgImZyZWV6ZSIsICJTY2hlbWFNb2R1bGUiLCAiRHluYW1pY01vZHVsZSIsICJ2YWx1ZSIsICJDYXNlQnVpbGRlciIsICJDYXNlTm9kZSIsICJpc1VuZGVmaW5lZCIsICJwYXJzZUV4cHJlc3Npb24iLCAiY3JlYXRlRnVuY3Rpb25Nb2R1bGUiLCAiVHJhbnNhY3Rpb25CdWlsZGVyIiwgIkNvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIiLCAiQ29ubmVjdGlvbkJ1aWxkZXIiLCAicGx1Z2luIiwgInNjaGVtYSIsICJXaXRoU2NoZW1hUGx1Z2luIiwgInF1ZXJ5IiwgInF1ZXJ5SWQiLCAibG9nT25jZSIsICJjb21waWxlZFF1ZXJ5IiwgImlzQ29tcGlsYWJsZSIsICJUcmFuc2FjdGlvbiIsICJfVHJhbnNhY3Rpb24iLCAib2JqIiwgImlzT2JqZWN0IiwgImNhbGxiYWNrIiwgImNvbm5lY3Rpb24iLCAiU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIiwgImRiIiwgIl9UcmFuc2FjdGlvbkJ1aWxkZXIiLCAiYWNjZXNzTW9kZSIsICJpc29sYXRpb25MZXZlbCIsICJreXNlbHlQcm9wcyIsICJzZXR0aW5ncyIsICJ2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3MiLCAidHJhbnNhY3Rpb24iLCAidHJhbnNhY3Rpb25CZWd1biIsICJyZXN1bHQiLCAiZXJyb3IiLCAiX0NvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIiLCAicHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uIiwgIkNvbnRyb2xsZWRUcmFuc2FjdGlvbiIsICJfQ29udHJvbGxlZFRyYW5zYWN0aW9uIiwgIiNjb21waWxlUXVlcnkiLCAiI3N0YXRlIiwgInN0YXRlIiwgIk5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yIiwgInRyYW5zYWN0aW9uUHJvcHMiLCAiY3JlYXRlUXVlcnlJZCIsICJub2RlIiwgImFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayIsICJDb21tYW5kIiwgInNhdmVwb2ludE5hbWUiLCAiI2NiIiwgImNiIiwgIl9Ob3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciIsICIjZXhlY3V0b3IiLCAiY29uc3VtZXIiLCAiY2h1bmtTaXplIiwgInBsdWdpbnMiLCAiUmF3QnVpbGRlckltcGwiLCAiX1Jhd0J1aWxkZXJJbXBsIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYWxpYXMiLCAiQWxpYXNlZFJhd0J1aWxkZXJJbXBsIiwgInBsdWdpbiIsICIjdG9PcGVyYXRpb25Ob2RlIiwgIiNnZXRFeGVjdXRvciIsICJleGVjdXRvclByb3ZpZGVyIiwgIiNjb21waWxlIiwgImV4ZWN1dG9yIiwgIk5PT1BfUVVFUllfRVhFQ1VUT1IiLCAiY3JlYXRlUmF3QnVpbGRlciIsICIjcmF3QnVpbGRlciIsICIjYWxpYXMiLCAicmF3QnVpbGRlciIsICJBbGlhc05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIklkZW50aWZpZXJOb2RlIiwgInNxbCIsICJzcWxGcmFnbWVudHMiLCAicGFyYW1ldGVycyIsICJjcmVhdGVSYXdCdWlsZGVyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiUmF3Tm9kZSIsICJwYXJzZVBhcmFtZXRlciIsICJjb2x1bW5SZWZlcmVuY2UiLCAicGFyc2VTdHJpbmdSZWZlcmVuY2UiLCAidmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAidGFibGVSZWZlcmVuY2UiLCAicGFyc2VUYWJsZSIsICJpZHMiLCAiZnJhZ21lbnRzIiwgIklkZW50aWZpZXJOb2RlIiwgIlZhbHVlTm9kZSIsICJhcnJheSIsICJzZXBhcmF0b3IiLCAibm9kZXMiLCAic2VwIiwgImkiLCAicGFyYW0iLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIk9wZXJhdGlvbk5vZGVWaXNpdG9yIiwgIiN2aXNpdG9ycyIsICJmcmVlemUiLCAibm9kZSIsICJMSVRfV1JBUF9SRUdFWCIsICJEZWZhdWx0UXVlcnlDb21waWxlciIsICJPcGVyYXRpb25Ob2RlVmlzaXRvciIsICIjc3FsIiwgIiNwYXJhbWV0ZXJzIiwgIm5vZGUiLCAicXVlcnlJZCIsICJmcmVlemUiLCAid3JhcEluUGFyZW5zIiwgIlBhcmVuc05vZGUiLCAiSW5zZXJ0UXVlcnlOb2RlIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJDcmVhdGVWaWV3Tm9kZSIsICJTZXRPcGVyYXRpb25Ob2RlIiwgImV4cHJlc3Npb25zIiwgIm5vZGVzIiwgInNlcGFyYXRvciIsICJsYXN0SW5kZXgiLCAiaSIsICJSYXdOb2RlIiwgIldoZW5Ob2RlIiwgImxvZ09uY2UiLCAiXyIsICJpc1N0cmluZyIsICJ2YWx1ZXMiLCAiSk9JTl9UWVBFX1NRTCIsICJzcWxGcmFnbWVudHMiLCAicGFyYW1zIiwgImlzQm9vbGVhbiIsICJTRUxFQ1RfTU9ESUZJRVJfU1FMIiwgIk9wZXJhdG9yTm9kZSIsICJwYXRoTGVnIiwgImlzQXJyYXlMb2NhdGlvbiIsICJsZW4iLCAic3RyIiwgInBhcmFtZXRlciIsICJpZGVudGlmaWVyIiwgImxlZnRXcmFwIiwgInJpZ2h0V3JhcCIsICJzYW5pdGl6ZWQiLCAiYyIsICJ2YWx1ZSIsICJpc051bWJlciIsICJpc0JpZ0ludCIsICJpc051bGwiLCAiaXNEYXRlIiwgImFyciIsICJsZWZ0IiwgInJpZ2h0IiwgIlNFTEVDVF9NT0RJRklFUl9QUklPUklUWSIsICJjb2x1bW5BbHRlcmF0aW9ucyIsICJEdW1teURyaXZlciIsICJEdW1teUNvbm5lY3Rpb24iLCAiRGlhbGVjdEFkYXB0ZXJCYXNlIiwgIklEX1dSQVBfUkVHRVgiLCAiU3FsaXRlUXVlcnlDb21waWxlciIsICJEZWZhdWx0UXVlcnlDb21waWxlciIsICJub2RlIiwgImlkZW50aWZpZXIiLCAiXyIsICJTcWxpdGVBZGFwdGVyIiwgIkRpYWxlY3RBZGFwdGVyQmFzZSIsICJfZGIiLCAiX29wdCIsICJJRF9XUkFQX1JFR0VYIiwgIlBvc3RncmVzUXVlcnlDb21waWxlciIsICJEZWZhdWx0UXVlcnlDb21waWxlciIsICJpZGVudGlmaWVyIiwgIkxPQ0tfSUQiLCAiUG9zdGdyZXNBZGFwdGVyIiwgIkRpYWxlY3RBZGFwdGVyQmFzZSIsICJkYiIsICJfb3B0IiwgInNxbCIsICJfZGIiLCAiSURfV1JBUF9SRUdFWCIsICJNeXNxbFF1ZXJ5Q29tcGlsZXIiLCAiRGVmYXVsdFF1ZXJ5Q29tcGlsZXIiLCAiaWRlbnRpZmllciIsICJub2RlIiwgIkxPQ0tfSUQiLCAiTE9DS19USU1FT1VUX1NFQ09ORFMiLCAiTXlzcWxBZGFwdGVyIiwgIkRpYWxlY3RBZGFwdGVyQmFzZSIsICJkYiIsICJfb3B0IiwgInNxbCIsICJub3JtYWxpemVTcWxXaGVyZUNsYXVzZSIsICJpbnB1dCIsICJoYXNFbWJlZGRlZFNxbFN0YXRlbWVudFNlcGFyYXRvciIsICJnZXRCdWlsZGVyIiwgInJlcXVpcmVtZW50cyIsICJLeXNlbHkiLCAiRHVtbXlEcml2ZXIiLCAiSW1tZWRpYXRlVmFsdWVQbHVnaW4iLCAiI3RyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiYXJncyIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAibm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIlZhbHVlTm9kZSIsICJhc1F1ZXJ5IiwgInF1ZXJ5IiwgImNvbXBpbGUiLCAiY29tcGlsZWFibGUiLCAib3B0aW9ucyIsICJjb21waWxlZFF1ZXJ5IiwgImFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzIiwgInJvd3MiLCAiY29sdW1ucyIsICJyb3dGaWx0ZXJzIiwgImluZmVyUm93RmlsdGVycyIsICJxYiIsICJlYiIsICJyb3dGaWx0ZXIiLCAiY29sdW1uTmFtZSIsICJ2YWx1ZSIsICJpbmZlckZpbHRlck9iamVjdCIsICJyb3ciLCAiZmlsdGVyIiwgImNvbHVtbiIsICJwa1Bvc2l0aW9uIiwgInJlZnMiLCAidmFsdWVzIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInZhbHVlc0ZvclJvdyIsICJwa0luZGV4IiwgInRyYW5zZm9ybVZhbHVlIiwgInR1cGxlRnJvbSIsICJsaHMiLCAicmhzIiwgIml0ZW1zIiwgInNxbCIsICJhcHBseVRyYW5zZm9ybWF0aW9ucyIsICJwcm9wcyIsICJ0cmFuc2Zvcm1WYWx1ZXMiLCAiY29udGV4dCIsICJzdXBwb3J0c0RlZmF1bHRLZXl3b3JkIiwgInZhbHVlRW50cmllcyIsICJyZXF1aXJlZENvbHVtbnMiLCAiY29sIiwgIm9iaiIsICJrZXkiLCAiZGVmYXVsdHMiLCAiZGF0YXR5cGUiLCAiZmtDb2x1bW4iLCAibmFtZSIsICJmb3JtYXQiLCAiZ3JvdXAiLCAiaXNBcnJheSIsICJERUZBVUxUX0pTT04iLCAiREVGQVVMVF9CT09MRUFOIiwgIkRFRkFVTFRfU1RSSU5HIiwgIkRFRkFVTFRfTlVNRVJJQyIsICJnZXREYXRlMCIsICJkZWZhdWx0VmFsdWUiLCAibnVsbGFibGUiLCAiZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbiIsICJmaWx0ZXJzIiwgIm9yR3JvdXBzT2ZBbmRCdWlsZGVycyIsICJjdXJyZW50QW5kR3JvdXBCdWlsZGVycyIsICJpIiwgImJ1aWxkQmFzZUV4cHJlc3Npb25CdWlsZGVyIiwgImFuZEV4cHJlc3Npb25zIiwgImJ1aWxkZXIiLCAiVEVYVF9NQVRDSF9PUEVSQVRPUlMiLCAic3BlYyIsICJvcGVyYXRvciIsICJjb2x1bW5NZXRhIiwgInNlYXJjaFBhdHRlcm4iLCAibm9ybWFsaXplZENsYXVzZSIsICJub3JtYWxpemVTcWxXaGVyZUNsYXVzZSIsICJzcGxpdFRvcExldmVsU3FsU3RhdGVtZW50cyIsICJzcWwiLCAic3RhdGUiLCAic2VnbWVudHMiLCAic2VnbWVudFN0YXJ0IiwgImluZGV4IiwgImNoYXIiLCAibmV4dENoYXIiLCAiZGVsaW1pdGVyIiwgInJlYWREb2xsYXJRdW90ZURlbGltaXRlciIsICJwdXNoU3RhdGVtZW50U2VnbWVudCIsICJnZXRUb3BMZXZlbFNxbFN0YXRlbWVudEF0Q3Vyc29yIiwgImFyZ3MiLCAiY3Vyc29ySW5kZXgiLCAiY2xhbXAiLCAic2VnbWVudCIsICJuZWFyZXN0U2VnbWVudCIsICJzbWFsbGVzdERpc3RhbmNlIiwgImdldERpc3RhbmNlVG9TZWdtZW50IiwgImRpc3RhbmNlIiwgInN0YXJ0IiwgImVuZCIsICJyYXdTZWdtZW50IiwgInRyaW1tZWRTdGF0ZW1lbnQiLCAibGVhZGluZ1doaXRlc3BhY2VMZW5ndGgiLCAidHJhaWxpbmdXaGl0ZXNwYWNlTGVuZ3RoIiwgImZyb20iLCAidG8iLCAiY3Vyc29yIiwgInZhbHVlIiwgIm1pbiIsICJtYXgiXQp9Cg==