@ditojs/ui 2.15.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dito-ui.es.js +61 -57
- package/dist/dito-ui.umd.js +4 -4
- package/package.json +6 -6
package/dist/dito-ui.umd.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
(function(D,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@vue/shared"),require("@ditojs/utils")):typeof define=="function"&&define.amd?define(["exports","@vue/shared","@ditojs/utils"],l):(D=typeof globalThis<"u"?globalThis:D||self,l(D["dito-ui"]={},D["@vue/shared"],D["@ditojs/utils"]))})(this,function(D,l,R){"use strict";function wt(e){return{year:(e==null?void 0:e.getFullYear())??0,month:(e==null?void 0:e.getMonth())??0,day:(e==null?void 0:e.getDate())??0,hour:(e==null?void 0:e.getHours())??0,minute:(e==null?void 0:e.getMinutes())??0,second:(e==null?void 0:e.getSeconds())??0,millisecond:(e==null?void 0:e.getMilliseconds())??0}}function Fe(e,t={}){return new Date(...Object.values({...wt(e),...t}))}function je(e,{locale:t="en-US",date:n=!0,time:o=!0}={}){const i=o?null:0;let[s,r,a,f,u,,d=i,,c=i,,p=i,,h=i]=Qt(e,{date:n,time:o});if(u&&u.length>=4){t==="en-US"&&r==="/"&&f==="/"&&([s,a]=[a,s]),a=Ps(a,{locale:t});const w=_=>_===null||_.length===2;if(a!==null&&(!o||w(d)&&w(c)&&w(p)))return new Date(+u,+a,+s,+d,+c,+p,+h)}return null}function bt(e,t,{locale:n="en-US",date:o=!0,time:i=!0}={}){const s=Qt(e,{date:o,time:i}),r=(c,p=s.length)=>{var _;let h=0,w=0;for(;(c===null||h<=c)&&w<p;)h+=((_=s[w++])==null?void 0:_.length)??0;return{position:h,index:w}},a=o?0:r(null,6).position;t+=a;let{index:f}=r(t);const u=n==="en-US",d=[u?"month":"day",null,u?"day":"month",null,"year",null,"hour",null,"minute",null,"second",null,"millisecond"];for(;f--;)if(d[f]){const c=r(null,f).position-a,p=c+s[f].length;return{name:d[f],start:c,end:p}}return null}function Qt(e,{date:t=!0,time:n=!0}={}){const o=(e==null?void 0:e.split(/([\s.,:/]+)/))||[];return t||o.unshift("1",".","1",".","2000"," "),!n&&o.length>5&&(o.length=5),o}function Ps(e,{locale:t="en-US"}={}){const n=+e;if(!isNaN(n))return n-1;const o=e.trim().toLowerCase();if(o.length<3)return null;const i=new Intl.DateTimeFormat(t,{month:"short"}),s=new Intl.DateTimeFormat(t,{month:"long"});for(let r=0;r<12;r++){const a=new Date(2e3,r,1);if(i.format(a).toLowerCase().startsWith(o)||s.format(a).toLowerCase().startsWith(o))return r}return null}function Zt(e,...t){console.warn(`[Vue warn] ${e}`,...t)}let en;function Ms(e,t=en){t&&t.active&&t.effects.push(e)}function xs(){return en}const _t=e=>{const t=new Set(e);return t.w=0,t.n=0,t},tn=e=>(e.w&se)>0,nn=e=>(e.n&se)>0,ks=({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=se},Fs=e=>{const{deps:t}=e;if(t.length){let n=0;for(let o=0;o<t.length;o++){const i=t[o];tn(i)&&!nn(i)?i.delete(e):t[n++]=i,i.w&=~se,i.n&=~se}t.length=n}},vt=new WeakMap;let Ie=0,se=1;const St=30;let B;const he=Symbol(process.env.NODE_ENV!=="production"?"iterate":""),Et=Symbol(process.env.NODE_ENV!=="production"?"Map key iterate":"");class Is{constructor(t,n=null,o){this.fn=t,this.scheduler=n,this.active=!0,this.deps=[],this.parent=void 0,Ms(this,o)}run(){if(!this.active)return this.fn();let t=B,n=ge;for(;t;){if(t===this)return;t=t.parent}try{return this.parent=B,B=this,ge=!0,se=1<<++Ie,Ie<=St?ks(this):sn(this),this.fn()}finally{Ie<=St&&Fs(this),se=1<<--Ie,B=this.parent,ge=n,this.parent=void 0,this.deferStop&&this.stop()}}stop(){B===this?this.deferStop=!0:this.active&&(sn(this),this.onStop&&this.onStop(),this.active=!1)}}function sn(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}let ge=!0;const on=[];function Dt(){on.push(ge),ge=!1}function Vt(){const e=on.pop();ge=e===void 0?!0:e}function k(e,t,n){if(ge&&B){let o=vt.get(e);o||vt.set(e,o=new Map);let i=o.get(n);i||o.set(n,i=_t());const s=process.env.NODE_ENV!=="production"?{effect:B,target:e,type:t,key:n}:void 0;As(i,s)}}function As(e,t){let n=!1;Ie<=St?nn(e)||(e.n|=se,n=!tn(e)):n=!e.has(B),n&&(e.add(B),B.deps.push(e),process.env.NODE_ENV!=="production"&&B.onTrack&&B.onTrack(l.extend({effect:B},t)))}function oe(e,t,n,o,i,s){const r=vt.get(e);if(!r)return;let a=[];if(t==="clear")a=[...r.values()];else if(n==="length"&&l.isArray(e)){const u=Number(o);r.forEach((d,c)=>{(c==="length"||!l.isSymbol(c)&&c>=u)&&a.push(d)})}else switch(n!==void 0&&a.push(r.get(n)),t){case"add":l.isArray(e)?l.isIntegerKey(n)&&a.push(r.get("length")):(a.push(r.get(he)),l.isMap(e)&&a.push(r.get(Et)));break;case"delete":l.isArray(e)||(a.push(r.get(he)),l.isMap(e)&&a.push(r.get(Et)));break;case"set":l.isMap(e)&&a.push(r.get(he));break}const f=process.env.NODE_ENV!=="production"?{target:e,type:t,key:n,newValue:o,oldValue:i,oldTarget:s}:void 0;if(a.length===1)a[0]&&(process.env.NODE_ENV!=="production"?Ye(a[0],f):Ye(a[0]));else{const u=[];for(const d of a)d&&u.push(...d);process.env.NODE_ENV!=="production"?Ye(_t(u),f):Ye(_t(u))}}function Ye(e,t){const n=l.isArray(e)?e:[...e];for(const o of n)o.computed&&rn(o,t);for(const o of n)o.computed||rn(o,t)}function rn(e,t){(e!==B||e.allowRecurse)&&(process.env.NODE_ENV!=="production"&&e.onTrigger&&e.onTrigger(l.extend({effect:e},t)),e.scheduler?e.scheduler():e.run())}const $s=l.makeMap("__proto__,__v_isRef,__isVue"),ln=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(l.isSymbol)),an=Rs();function Rs(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const o=v(this);for(let s=0,r=this.length;s<r;s++)k(o,"get",s+"");const i=o[t](...n);return i===-1||i===!1?o[t](...n.map(v)):i}}),["push","pop","shift","unshift","splice"].forEach(t=>{e[t]=function(...n){Dt();const o=v(this)[t].apply(this,n);return Vt(),o}}),e}function Bs(e){const t=v(this);return k(t,"has",e),t.hasOwnProperty(e)}class un{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,o){const i=this._isReadonly,s=this._shallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return s;if(n==="__v_raw"&&o===(i?s?wn:yn:s?Qs:mn).get(t))return t;const r=l.isArray(t);if(!i){if(r&&l.hasOwn(an,n))return Reflect.get(an,n,o);if(n==="hasOwnProperty")return Bs}const a=Reflect.get(t,n,o);return(l.isSymbol(n)?ln.has(n):$s(n))||(i||k(t,"get",n),s)?a:A(a)?r&&l.isIntegerKey(n)?a:a.value:l.isObject(a)?i?_n(a):bn(a):a}}class Ls extends un{constructor(t=!1){super(!1,t)}set(t,n,o,i){let s=t[n];if(ye(s)&&A(s)&&!A(o))return!1;if(!this._shallow&&(!Ot(o)&&!ye(o)&&(s=v(s),o=v(o)),!l.isArray(t)&&A(s)&&!A(o)))return s.value=o,!0;const r=l.isArray(t)&&l.isIntegerKey(n)?Number(n)<t.length:l.hasOwn(t,n),a=Reflect.set(t,n,o,i);return t===v(i)&&(r?l.hasChanged(o,s)&&oe(t,"set",n,o,s):oe(t,"add",n,o)),a}deleteProperty(t,n){const o=l.hasOwn(t,n),i=t[n],s=Reflect.deleteProperty(t,n);return s&&o&&oe(t,"delete",n,void 0,i),s}has(t,n){const o=Reflect.has(t,n);return(!l.isSymbol(n)||!ln.has(n))&&k(t,"has",n),o}ownKeys(t){return k(t,"iterate",l.isArray(t)?"length":he),Reflect.ownKeys(t)}}class cn extends un{constructor(t=!1){super(!0,t)}set(t,n){return process.env.NODE_ENV!=="production"&&Zt(`Set operation on key "${String(n)}" failed: target is readonly.`,t),!0}deleteProperty(t,n){return process.env.NODE_ENV!=="production"&&Zt(`Delete operation on key "${String(n)}" failed: target is readonly.`,t),!0}}const zs=new Ls,Hs=new cn,Ks=new cn(!0),Nt=e=>e,We=e=>Reflect.getPrototypeOf(e);function qe(e,t,n=!1,o=!1){e=e.__v_raw;const i=v(e),s=v(t);n||(l.hasChanged(t,s)&&k(i,"get",t),k(i,"get",s));const{has:r}=We(i),a=o?Nt:n?xt:Mt;if(r.call(i,t))return a(e.get(t));if(r.call(i,s))return a(e.get(s));e!==i&&e.get(t)}function Je(e,t=!1){const n=this.__v_raw,o=v(n),i=v(e);return t||(l.hasChanged(e,i)&&k(o,"has",e),k(o,"has",i)),e===i?n.has(e):n.has(e)||n.has(i)}function Ge(e,t=!1){return e=e.__v_raw,!t&&k(v(e),"iterate",he),Reflect.get(e,"size",e)}function fn(e){e=v(e);const t=v(this);return We(t).has.call(t,e)||(t.add(e),oe(t,"add",e,e)),this}function dn(e,t){t=v(t);const n=v(this),{has:o,get:i}=We(n);let s=o.call(n,e);s?process.env.NODE_ENV!=="production"&&gn(n,o,e):(e=v(e),s=o.call(n,e));const r=i.call(n,e);return n.set(e,t),s?l.hasChanged(t,r)&&oe(n,"set",e,t,r):oe(n,"add",e,t),this}function pn(e){const t=v(this),{has:n,get:o}=We(t);let i=n.call(t,e);i?process.env.NODE_ENV!=="production"&&gn(t,n,e):(e=v(e),i=n.call(t,e));const s=o?o.call(t,e):void 0,r=t.delete(e);return i&&oe(t,"delete",e,void 0,s),r}function hn(){const e=v(this),t=e.size!==0,n=process.env.NODE_ENV!=="production"?l.isMap(e)?new Map(e):new Set(e):void 0,o=e.clear();return t&&oe(e,"clear",void 0,void 0,n),o}function Xe(e,t){return function(o,i){const s=this,r=s.__v_raw,a=v(r),f=t?Nt:e?xt:Mt;return!e&&k(a,"iterate",he),r.forEach((u,d)=>o.call(i,f(u),f(d),s))}}function Qe(e,t,n){return function(...o){const i=this.__v_raw,s=v(i),r=l.isMap(s),a=e==="entries"||e===Symbol.iterator&&r,f=e==="keys"&&r,u=i[e](...o),d=n?Nt:t?xt:Mt;return!t&&k(s,"iterate",f?Et:he),{next(){const{value:c,done:p}=u.next();return p?{value:c,done:p}:{value:a?[d(c[0]),d(c[1])]:d(c),done:p}},[Symbol.iterator](){return this}}}}function ie(e){return function(...t){if(process.env.NODE_ENV!=="production"){const n=t[0]?`on key "${t[0]}" `:"";console.warn(`${l.capitalize(e)} operation ${n}failed: target is readonly.`,v(this))}return e==="delete"?!1:this}}function Us(){const e={get(s){return qe(this,s)},get size(){return Ge(this)},has:Je,add:fn,set:dn,delete:pn,clear:hn,forEach:Xe(!1,!1)},t={get(s){return qe(this,s,!1,!0)},get size(){return Ge(this)},has:Je,add:fn,set:dn,delete:pn,clear:hn,forEach:Xe(!1,!0)},n={get(s){return qe(this,s,!0)},get size(){return Ge(this,!0)},has(s){return Je.call(this,s,!0)},add:ie("add"),set:ie("set"),delete:ie("delete"),clear:ie("clear"),forEach:Xe(!0,!1)},o={get(s){return qe(this,s,!0,!0)},get size(){return Ge(this,!0)},has(s){return Je.call(this,s,!0)},add:ie("add"),set:ie("set"),delete:ie("delete"),clear:ie("clear"),forEach:Xe(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Qe(s,!1,!1),n[s]=Qe(s,!0,!1),t[s]=Qe(s,!1,!0),o[s]=Qe(s,!0,!0)}),[e,n,t,o]}const[js,Ys,Ws,qs]=Us();function Ct(e,t){const n=t?e?qs:Ws:e?Ys:js;return(o,i,s)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?o:Reflect.get(l.hasOwn(n,i)&&i in o?n:o,i,s)}const Js={get:Ct(!1,!1)},Gs={get:Ct(!0,!1)},Xs={get:Ct(!0,!0)};function gn(e,t,n){const o=v(n);if(o!==n&&t.call(e,o)){const i=l.toRawType(e);console.warn(`Reactive ${i} contains both the raw and reactive versions of the same object${i==="Map"?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}const mn=new WeakMap,Qs=new WeakMap,yn=new WeakMap,wn=new WeakMap;function Zs(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function eo(e){return e.__v_skip||!Object.isExtensible(e)?0:Zs(l.toRawType(e))}function bn(e){return ye(e)?e:Tt(e,!1,zs,Js,mn)}function _n(e){return Tt(e,!0,Hs,Gs,yn)}function Ze(e){return Tt(e,!0,Ks,Xs,wn)}function Tt(e,t,n,o,i){if(!l.isObject(e))return process.env.NODE_ENV!=="production"&&console.warn(`value cannot be made reactive: ${String(e)}`),e;if(e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=i.get(e);if(s)return s;const r=eo(e);if(r===0)return e;const a=new Proxy(e,r===2?o:n);return i.set(e,a),a}function me(e){return ye(e)?me(e.__v_raw):!!(e&&e.__v_isReactive)}function ye(e){return!!(e&&e.__v_isReadonly)}function Ot(e){return!!(e&&e.__v_isShallow)}function Pt(e){return me(e)||ye(e)}function v(e){const t=e&&e.__v_raw;return t?v(t):e}function to(e){return l.def(e,"__v_skip",!0),e}const Mt=e=>l.isObject(e)?bn(e):e,xt=e=>l.isObject(e)?_n(e):e;function A(e){return!!(e&&e.__v_isRef===!0)}function no(e){return A(e)?e.value:e}const so={get:(e,t,n)=>no(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const i=e[t];return A(i)&&!A(n)?(i.value=n,!0):Reflect.set(e,t,n,o)}};function oo(e){return me(e)?e:new Proxy(e,so)}const we=[];function io(e){we.push(e)}function ro(){we.pop()}function S(e,...t){if(process.env.NODE_ENV==="production")return;Dt();const n=we.length?we[we.length-1].component:null,o=n&&n.appContext.config.warnHandler,i=lo();if(o)be(o,n,11,[e+t.join(""),n&&n.proxy,i.map(({vnode:s})=>`at <${ns(n,s.type)}>`).join(`
|
|
1
|
+
(function(D,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@vue/shared"),require("@ditojs/utils")):typeof define=="function"&&define.amd?define(["exports","@vue/shared","@ditojs/utils"],l):(D=typeof globalThis<"u"?globalThis:D||self,l(D["dito-ui"]={},D["@vue/shared"],D["@ditojs/utils"]))})(this,function(D,l,R){"use strict";function wt(e){return{year:(e==null?void 0:e.getFullYear())??0,month:(e==null?void 0:e.getMonth())??0,day:(e==null?void 0:e.getDate())??0,hour:(e==null?void 0:e.getHours())??0,minute:(e==null?void 0:e.getMinutes())??0,second:(e==null?void 0:e.getSeconds())??0,millisecond:(e==null?void 0:e.getMilliseconds())??0}}function Fe(e,t={}){return new Date(...Object.values({...wt(e),...t}))}function je(e,{locale:t="en-US",date:n=!0,time:o=!0}={}){const i=o?null:0;let[s,r,a,f,u,,d=i,,c=i,,p=i,,h=i]=Qt(e,{date:n,time:o});if(u&&u.length>=4){t==="en-US"&&r==="/"&&f==="/"&&([s,a]=[a,s]),a=Ps(a,{locale:t});const w=_=>_===null||_.length===2;if(a!==null&&(!o||w(d)&&w(c)&&w(p)))return new Date(+u,+a,+s,+d,+c,+p,+h)}return null}function bt(e,t,{locale:n="en-US",date:o=!0,time:i=!0}={}){const s=Qt(e,{date:o,time:i}),r=(c,p=s.length)=>{var _;let h=0,w=0;for(;(c===null||h<=c)&&w<p;)h+=((_=s[w++])==null?void 0:_.length)??0;return{position:h,index:w}},a=o?0:r(null,6).position;t+=a;let{index:f}=r(t);const u=n==="en-US",d=[u?"month":"day",null,u?"day":"month",null,"year",null,"hour",null,"minute",null,"second",null,"millisecond"];for(;f--;)if(d[f]){const c=r(null,f).position-a,p=c+s[f].length;return{name:d[f],start:c,end:p}}return null}function Qt(e,{date:t=!0,time:n=!0}={}){const o=(e==null?void 0:e.split(/([\s.,:/]+)/))||[];return t||o.unshift("1",".","1",".","2000"," "),!n&&o.length>5&&(o.length=5),o}function Ps(e,{locale:t="en-US"}={}){const n=+e;if(!isNaN(n))return n-1;const o=e.trim().toLowerCase();if(o.length<3)return null;const i=new Intl.DateTimeFormat(t,{month:"short"}),s=new Intl.DateTimeFormat(t,{month:"long"});for(let r=0;r<12;r++){const a=new Date(2e3,r,1);if(i.format(a).toLowerCase().startsWith(o)||s.format(a).toLowerCase().startsWith(o))return r}return null}function Zt(e,...t){console.warn(`[Vue warn] ${e}`,...t)}let en;function Ms(e,t=en){t&&t.active&&t.effects.push(e)}function xs(){return en}const _t=e=>{const t=new Set(e);return t.w=0,t.n=0,t},tn=e=>(e.w&se)>0,nn=e=>(e.n&se)>0,ks=({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=se},Fs=e=>{const{deps:t}=e;if(t.length){let n=0;for(let o=0;o<t.length;o++){const i=t[o];tn(i)&&!nn(i)?i.delete(e):t[n++]=i,i.w&=~se,i.n&=~se}t.length=n}},vt=new WeakMap;let Ie=0,se=1;const St=30;let B;const he=Symbol(process.env.NODE_ENV!=="production"?"iterate":""),Et=Symbol(process.env.NODE_ENV!=="production"?"Map key iterate":"");class Is{constructor(t,n=null,o){this.fn=t,this.scheduler=n,this.active=!0,this.deps=[],this.parent=void 0,Ms(this,o)}run(){if(!this.active)return this.fn();let t=B,n=ge;for(;t;){if(t===this)return;t=t.parent}try{return this.parent=B,B=this,ge=!0,se=1<<++Ie,Ie<=St?ks(this):sn(this),this.fn()}finally{Ie<=St&&Fs(this),se=1<<--Ie,B=this.parent,ge=n,this.parent=void 0,this.deferStop&&this.stop()}}stop(){B===this?this.deferStop=!0:this.active&&(sn(this),this.onStop&&this.onStop(),this.active=!1)}}function sn(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}let ge=!0;const on=[];function Dt(){on.push(ge),ge=!1}function Vt(){const e=on.pop();ge=e===void 0?!0:e}function k(e,t,n){if(ge&&B){let o=vt.get(e);o||vt.set(e,o=new Map);let i=o.get(n);i||o.set(n,i=_t());const s=process.env.NODE_ENV!=="production"?{effect:B,target:e,type:t,key:n}:void 0;As(i,s)}}function As(e,t){let n=!1;Ie<=St?nn(e)||(e.n|=se,n=!tn(e)):n=!e.has(B),n&&(e.add(B),B.deps.push(e),process.env.NODE_ENV!=="production"&&B.onTrack&&B.onTrack(l.extend({effect:B},t)))}function oe(e,t,n,o,i,s){const r=vt.get(e);if(!r)return;let a=[];if(t==="clear")a=[...r.values()];else if(n==="length"&&l.isArray(e)){const u=Number(o);r.forEach((d,c)=>{(c==="length"||!l.isSymbol(c)&&c>=u)&&a.push(d)})}else switch(n!==void 0&&a.push(r.get(n)),t){case"add":l.isArray(e)?l.isIntegerKey(n)&&a.push(r.get("length")):(a.push(r.get(he)),l.isMap(e)&&a.push(r.get(Et)));break;case"delete":l.isArray(e)||(a.push(r.get(he)),l.isMap(e)&&a.push(r.get(Et)));break;case"set":l.isMap(e)&&a.push(r.get(he));break}const f=process.env.NODE_ENV!=="production"?{target:e,type:t,key:n,newValue:o,oldValue:i,oldTarget:s}:void 0;if(a.length===1)a[0]&&(process.env.NODE_ENV!=="production"?Ye(a[0],f):Ye(a[0]));else{const u=[];for(const d of a)d&&u.push(...d);process.env.NODE_ENV!=="production"?Ye(_t(u),f):Ye(_t(u))}}function Ye(e,t){const n=l.isArray(e)?e:[...e];for(const o of n)o.computed&&rn(o,t);for(const o of n)o.computed||rn(o,t)}function rn(e,t){(e!==B||e.allowRecurse)&&(process.env.NODE_ENV!=="production"&&e.onTrigger&&e.onTrigger(l.extend({effect:e},t)),e.scheduler?e.scheduler():e.run())}const $s=l.makeMap("__proto__,__v_isRef,__isVue"),ln=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(l.isSymbol)),an=Rs();function Rs(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const o=v(this);for(let s=0,r=this.length;s<r;s++)k(o,"get",s+"");const i=o[t](...n);return i===-1||i===!1?o[t](...n.map(v)):i}}),["push","pop","shift","unshift","splice"].forEach(t=>{e[t]=function(...n){Dt();const o=v(this)[t].apply(this,n);return Vt(),o}}),e}function Bs(e){const t=v(this);return k(t,"has",e),t.hasOwnProperty(e)}class un{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,o){const i=this._isReadonly,s=this._shallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return s;if(n==="__v_raw"&&o===(i?s?wn:yn:s?Qs:mn).get(t))return t;const r=l.isArray(t);if(!i){if(r&&l.hasOwn(an,n))return Reflect.get(an,n,o);if(n==="hasOwnProperty")return Bs}const a=Reflect.get(t,n,o);return(l.isSymbol(n)?ln.has(n):$s(n))||(i||k(t,"get",n),s)?a:A(a)?r&&l.isIntegerKey(n)?a:a.value:l.isObject(a)?i?_n(a):bn(a):a}}class Ls extends un{constructor(t=!1){super(!1,t)}set(t,n,o,i){let s=t[n];if(ye(s)&&A(s)&&!A(o))return!1;if(!this._shallow&&(!Ot(o)&&!ye(o)&&(s=v(s),o=v(o)),!l.isArray(t)&&A(s)&&!A(o)))return s.value=o,!0;const r=l.isArray(t)&&l.isIntegerKey(n)?Number(n)<t.length:l.hasOwn(t,n),a=Reflect.set(t,n,o,i);return t===v(i)&&(r?l.hasChanged(o,s)&&oe(t,"set",n,o,s):oe(t,"add",n,o)),a}deleteProperty(t,n){const o=l.hasOwn(t,n),i=t[n],s=Reflect.deleteProperty(t,n);return s&&o&&oe(t,"delete",n,void 0,i),s}has(t,n){const o=Reflect.has(t,n);return(!l.isSymbol(n)||!ln.has(n))&&k(t,"has",n),o}ownKeys(t){return k(t,"iterate",l.isArray(t)?"length":he),Reflect.ownKeys(t)}}class cn extends un{constructor(t=!1){super(!0,t)}set(t,n){return process.env.NODE_ENV!=="production"&&Zt(`Set operation on key "${String(n)}" failed: target is readonly.`,t),!0}deleteProperty(t,n){return process.env.NODE_ENV!=="production"&&Zt(`Delete operation on key "${String(n)}" failed: target is readonly.`,t),!0}}const zs=new Ls,Hs=new cn,Ks=new cn(!0),Nt=e=>e,We=e=>Reflect.getPrototypeOf(e);function qe(e,t,n=!1,o=!1){e=e.__v_raw;const i=v(e),s=v(t);n||(l.hasChanged(t,s)&&k(i,"get",t),k(i,"get",s));const{has:r}=We(i),a=o?Nt:n?xt:Mt;if(r.call(i,t))return a(e.get(t));if(r.call(i,s))return a(e.get(s));e!==i&&e.get(t)}function Je(e,t=!1){const n=this.__v_raw,o=v(n),i=v(e);return t||(l.hasChanged(e,i)&&k(o,"has",e),k(o,"has",i)),e===i?n.has(e):n.has(e)||n.has(i)}function Ge(e,t=!1){return e=e.__v_raw,!t&&k(v(e),"iterate",he),Reflect.get(e,"size",e)}function fn(e){e=v(e);const t=v(this);return We(t).has.call(t,e)||(t.add(e),oe(t,"add",e,e)),this}function dn(e,t){t=v(t);const n=v(this),{has:o,get:i}=We(n);let s=o.call(n,e);s?process.env.NODE_ENV!=="production"&&gn(n,o,e):(e=v(e),s=o.call(n,e));const r=i.call(n,e);return n.set(e,t),s?l.hasChanged(t,r)&&oe(n,"set",e,t,r):oe(n,"add",e,t),this}function pn(e){const t=v(this),{has:n,get:o}=We(t);let i=n.call(t,e);i?process.env.NODE_ENV!=="production"&&gn(t,n,e):(e=v(e),i=n.call(t,e));const s=o?o.call(t,e):void 0,r=t.delete(e);return i&&oe(t,"delete",e,void 0,s),r}function hn(){const e=v(this),t=e.size!==0,n=process.env.NODE_ENV!=="production"?l.isMap(e)?new Map(e):new Set(e):void 0,o=e.clear();return t&&oe(e,"clear",void 0,void 0,n),o}function Xe(e,t){return function(o,i){const s=this,r=s.__v_raw,a=v(r),f=t?Nt:e?xt:Mt;return!e&&k(a,"iterate",he),r.forEach((u,d)=>o.call(i,f(u),f(d),s))}}function Qe(e,t,n){return function(...o){const i=this.__v_raw,s=v(i),r=l.isMap(s),a=e==="entries"||e===Symbol.iterator&&r,f=e==="keys"&&r,u=i[e](...o),d=n?Nt:t?xt:Mt;return!t&&k(s,"iterate",f?Et:he),{next(){const{value:c,done:p}=u.next();return p?{value:c,done:p}:{value:a?[d(c[0]),d(c[1])]:d(c),done:p}},[Symbol.iterator](){return this}}}}function ie(e){return function(...t){if(process.env.NODE_ENV!=="production"){const n=t[0]?`on key "${t[0]}" `:"";console.warn(`${l.capitalize(e)} operation ${n}failed: target is readonly.`,v(this))}return e==="delete"?!1:e==="clear"?void 0:this}}function Us(){const e={get(s){return qe(this,s)},get size(){return Ge(this)},has:Je,add:fn,set:dn,delete:pn,clear:hn,forEach:Xe(!1,!1)},t={get(s){return qe(this,s,!1,!0)},get size(){return Ge(this)},has:Je,add:fn,set:dn,delete:pn,clear:hn,forEach:Xe(!1,!0)},n={get(s){return qe(this,s,!0)},get size(){return Ge(this,!0)},has(s){return Je.call(this,s,!0)},add:ie("add"),set:ie("set"),delete:ie("delete"),clear:ie("clear"),forEach:Xe(!0,!1)},o={get(s){return qe(this,s,!0,!0)},get size(){return Ge(this,!0)},has(s){return Je.call(this,s,!0)},add:ie("add"),set:ie("set"),delete:ie("delete"),clear:ie("clear"),forEach:Xe(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Qe(s,!1,!1),n[s]=Qe(s,!0,!1),t[s]=Qe(s,!1,!0),o[s]=Qe(s,!0,!0)}),[e,n,t,o]}const[js,Ys,Ws,qs]=Us();function Ct(e,t){const n=t?e?qs:Ws:e?Ys:js;return(o,i,s)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?o:Reflect.get(l.hasOwn(n,i)&&i in o?n:o,i,s)}const Js={get:Ct(!1,!1)},Gs={get:Ct(!0,!1)},Xs={get:Ct(!0,!0)};function gn(e,t,n){const o=v(n);if(o!==n&&t.call(e,o)){const i=l.toRawType(e);console.warn(`Reactive ${i} contains both the raw and reactive versions of the same object${i==="Map"?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}const mn=new WeakMap,Qs=new WeakMap,yn=new WeakMap,wn=new WeakMap;function Zs(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function eo(e){return e.__v_skip||!Object.isExtensible(e)?0:Zs(l.toRawType(e))}function bn(e){return ye(e)?e:Tt(e,!1,zs,Js,mn)}function _n(e){return Tt(e,!0,Hs,Gs,yn)}function Ze(e){return Tt(e,!0,Ks,Xs,wn)}function Tt(e,t,n,o,i){if(!l.isObject(e))return process.env.NODE_ENV!=="production"&&console.warn(`value cannot be made reactive: ${String(e)}`),e;if(e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=i.get(e);if(s)return s;const r=eo(e);if(r===0)return e;const a=new Proxy(e,r===2?o:n);return i.set(e,a),a}function me(e){return ye(e)?me(e.__v_raw):!!(e&&e.__v_isReactive)}function ye(e){return!!(e&&e.__v_isReadonly)}function Ot(e){return!!(e&&e.__v_isShallow)}function Pt(e){return me(e)||ye(e)}function v(e){const t=e&&e.__v_raw;return t?v(t):e}function to(e){return l.def(e,"__v_skip",!0),e}const Mt=e=>l.isObject(e)?bn(e):e,xt=e=>l.isObject(e)?_n(e):e;function A(e){return!!(e&&e.__v_isRef===!0)}function no(e){return A(e)?e.value:e}const so={get:(e,t,n)=>no(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const i=e[t];return A(i)&&!A(n)?(i.value=n,!0):Reflect.set(e,t,n,o)}};function oo(e){return me(e)?e:new Proxy(e,so)}const we=[];function io(e){we.push(e)}function ro(){we.pop()}function S(e,...t){if(process.env.NODE_ENV==="production")return;Dt();const n=we.length?we[we.length-1].component:null,o=n&&n.appContext.config.warnHandler,i=lo();if(o)be(o,n,11,[e+t.join(""),n&&n.proxy,i.map(({vnode:s})=>`at <${ns(n,s.type)}>`).join(`
|
|
2
2
|
`),i]);else{const s=[`[Vue warn]: ${e}`,...t];i.length&&s.push(`
|
|
3
3
|
`,...ao(i)),console.warn(...s)}Vt()}function lo(){let e=we[we.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const o=e.component&&e.component.parent;e=o&&o.vnode}return t}function ao(e){const t=[];return e.forEach((n,o)=>{t.push(...o===0?[]:[`
|
|
4
4
|
`],...uo(n))}),t}function uo({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",o=e.component?e.component.parent==null:!1,i=` at <${ns(e.component,e.type,o)}`,s=">"+n;return e.props?[i,...co(e.props),s]:[i+s]}function co(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(o=>{t.push(...vn(o,e[o]))}),n.length>3&&t.push(" ..."),t}function vn(e,t,n){return l.isString(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?n?t:[`${e}=${t}`]:A(t)?(t=vn(e,v(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):l.isFunction(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=v(t),n?t:[`${e}=`,t])}function fo(e,t){process.env.NODE_ENV!=="production"&&e!==void 0&&(typeof e!="number"?S(`${t} is not a valid number - got ${JSON.stringify(e)}.`):isNaN(e)&&S(`${t} is NaN - the duration expression might be incorrect.`))}const kt={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/core"};function be(e,t,n,o){let i;try{i=o?e(...o):e()}catch(s){Sn(s,t,n)}return i}function Ae(e,t,n,o){if(l.isFunction(e)){const s=be(e,t,n,o);return s&&l.isPromise(s)&&s.catch(r=>{Sn(r,t,n)}),s}const i=[];for(let s=0;s<e.length;s++)i.push(Ae(e[s],t,n,o));return i}function Sn(e,t,n,o=!0){const i=t?t.vnode:null;if(t){let s=t.parent;const r=t.proxy,a=process.env.NODE_ENV!=="production"?kt[n]:n;for(;s;){const u=s.ec;if(u){for(let d=0;d<u.length;d++)if(u[d](e,r,a)===!1)return}s=s.parent}const f=t.appContext.config.errorHandler;if(f){be(f,null,10,[e,r,a]);return}}po(e,n,i,o)}function po(e,t,n,o=!0){if(process.env.NODE_ENV!=="production"){const i=kt[t];if(n&&io(n),S(`Unhandled error${i?` during execution of ${i}`:""}`),n&&ro(),o)throw e;console.error(e)}else console.error(e)}let et=!1,Ft=!1;const U=[];let re=0;const De=[];let G=null,le=0;const En=Promise.resolve();let It=null;const ho=100;function go(e){const t=It||En;return e?t.then(this?e.bind(this):e):t}function mo(e){let t=re+1,n=U.length;for(;t<n;){const o=t+n>>>1,i=U[o],s=$e(i);s<e||s===e&&i.pre?t=o+1:n=o}return t}function At(e){(!U.length||!U.includes(e,et&&e.allowRecurse?re+1:re))&&(e.id==null?U.push(e):U.splice(mo(e.id),0,e),Dn())}function Dn(){!et&&!Ft&&(Ft=!0,It=En.then(Nn))}function Vn(e){l.isArray(e)?De.push(...e):(!G||!G.includes(e,e.allowRecurse?le+1:le))&&De.push(e),Dn()}function yo(e){if(De.length){const t=[...new Set(De)];if(De.length=0,G){G.push(...t);return}for(G=t,process.env.NODE_ENV!=="production"&&(e=e||new Map),G.sort((n,o)=>$e(n)-$e(o)),le=0;le<G.length;le++)process.env.NODE_ENV!=="production"&&Cn(e,G[le])||G[le]();G=null,le=0}}const $e=e=>e.id==null?1/0:e.id,wo=(e,t)=>{const n=$e(e)-$e(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Nn(e){Ft=!1,et=!0,process.env.NODE_ENV!=="production"&&(e=e||new Map),U.sort(wo);const t=process.env.NODE_ENV!=="production"?n=>Cn(e,n):l.NOOP;try{for(re=0;re<U.length;re++){const n=U[re];if(n&&n.active!==!1){if(process.env.NODE_ENV!=="production"&&t(n))continue;be(n,null,14)}}}finally{re=0,U.length=0,yo(e),et=!1,It=null,(U.length||De.length)&&Nn(e)}}function Cn(e,t){if(!e.has(t))e.set(t,1);else{const n=e.get(t);if(n>ho){const o=t.ownerInstance,i=o&&Wt(o.type);return S(`Maximum recursive updates exceeded${i?` in component <${i}>`:""}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`),!0}else e.set(t,n+1)}}const Ve=new Set;process.env.NODE_ENV!=="production"&&(l.getGlobalThis().__VUE_HMR_RUNTIME__={createRecord:$t(bo),rerender:$t(_o),reload:$t(vo)});const tt=new Map;function bo(e,t){return tt.has(e)?!1:(tt.set(e,{initialDef:Re(t),instances:new Set}),!0)}function Re(e){return ss(e)?e.__vccOpts:e}function _o(e,t){const n=tt.get(e);n&&(n.initialDef.render=t,[...n.instances].forEach(o=>{t&&(o.render=t,Re(o.type).render=t),o.renderCache=[],o.update()}))}function vo(e,t){const n=tt.get(e);if(!n)return;t=Re(t),Tn(n.initialDef,t);const o=[...n.instances];for(const i of o){const s=Re(i.type);Ve.has(s)||(s!==n.initialDef&&Tn(s,t),Ve.add(s)),i.appContext.propsCache.delete(i.type),i.appContext.emitsCache.delete(i.type),i.appContext.optionsCache.delete(i.type),i.ceReload?(Ve.add(s),i.ceReload(t.styles),Ve.delete(s)):i.parent?At(i.parent.update):i.appContext.reload?i.appContext.reload():typeof window<"u"?window.location.reload():console.warn("[HMR] Root or manually mounted instance modified. Full reload required.")}Vn(()=>{for(const i of o)Ve.delete(Re(i.type))})}function Tn(e,t){l.extend(e,t);for(const n in e)n!=="__file"&&!(n in t)&&delete e[n]}function $t(e){return(t,n)=>{try{return e(t,n)}catch(o){console.error(o),console.warn("[HMR] Something went wrong during Vue component hot-reload. Full reload required.")}}}function So(e,...t){}const Eo=Do("component:updated");function Do(e){return t=>{So(e,t.appContext.app,t.uid,t.parent?t.parent.uid:void 0,t)}}let O=null,On=null;function Pn(e){const t=O;return O=e,On=e&&e.type.__scopeId||null,t}function L(e,t=O,n){if(!t||e._n)return e;const o=(...i)=>{o._d&&Un(-1);const s=Pn(t);let r;try{r=e(...i)}finally{Pn(s),o._d&&Un(1)}return process.env.NODE_ENV!=="production"&&Eo(t),r};return o._n=!0,o._c=!0,o._d=!0,o}function br(){}const Rt="components";function j(e,t){return No(Rt,e,!0,t)||e}const Vo=Symbol.for("v-ndc");function No(e,t,n=!0,o=!1){const i=O||X;if(i){const s=i.type;if(e===Rt){const a=Wt(s,!1);if(a&&(a===t||a===l.camelize(t)||a===l.capitalize(l.camelize(t))))return s}const r=Mn(i[e]||s[e],t)||Mn(i.appContext[e],t);if(!r&&o)return s;if(process.env.NODE_ENV!=="production"&&n&&!r){const a=e===Rt?`
|
|
5
|
-
If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.`:"";S(`Failed to resolve ${e.slice(0,-1)}: ${t}${a}`)}return r}else process.env.NODE_ENV!=="production"&&S(`resolve${l.capitalize(e.slice(0,-1))} can only be used in render() or setup().`)}function Mn(e,t){return e&&(e[t]||e[l.camelize(t)]||e[l.capitalize(l.camelize(t))])}const Co=e=>e.__isSuspense;function To(e,t){t&&t.pendingBranch?l.isArray(e)?t.effects.push(...e):t.effects.push(e):Vn(e)}const nt={};function Oo(e,t,{immediate:n,deep:o,flush:i,onTrack:s,onTrigger:r}=l.EMPTY_OBJ){var a;process.env.NODE_ENV!=="production"&&!t&&(n!==void 0&&S('watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.'),o!==void 0&&S('watch() "deep" option is only respected when using the watch(source, callback, options?) signature.'));const f=V=>{S("Invalid watch source: ",V,"A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.")},u=xs()===((a=X)==null?void 0:a.scope)?X:null;let d,c=!1,p=!1;if(A(e)?(d=()=>e.value,c=Ot(e)):me(e)?(d=()=>e,o=!0):l.isArray(e)?(p=!0,c=e.some(V=>me(V)||Ot(V)),d=()=>e.map(V=>{if(A(V))return V.value;if(me(V))return _e(V);if(l.isFunction(V))return be(V,u,2);process.env.NODE_ENV!=="production"&&f(V)})):l.isFunction(e)?t?d=()=>be(e,u,2):d=()=>{if(!(u&&u.isUnmounted))return h&&h(),Ae(e,u,3,[w])}:(d=l.NOOP,process.env.NODE_ENV!=="production"&&f(e)),t&&o){const V=d;d=()=>_e(V())}let h,w=V=>{h=T.onStop=()=>{be(V,u,4)}},_=p?new Array(e.length).fill(nt):nt;const C=()=>{if(T.active)if(t){const V=T.run();(o||c||(p?V.some((J,ke)=>l.hasChanged(J,_[ke])):l.hasChanged(V,_)))&&(h&&h(),Ae(t,u,3,[V,_===nt?void 0:p&&_[0]===nt?[]:_,w]),_=V)}else T.run()};C.allowRecurse=!!t;let q;i==="sync"?q=C:i==="post"?q=()=>Kn(C,u&&u.suspense):(C.pre=!0,u&&(C.id=u.uid),q=()=>At(C));const T=new Is(d,q);return process.env.NODE_ENV!=="production"&&(T.onTrack=s,T.onTrigger=r),t?n?C():_=T.run():i==="post"?Kn(T.run.bind(T),u&&u.suspense):T.run(),()=>{T.stop(),u&&u.scope&&l.remove(u.scope.effects,T)}}function Po(e,t,n){const o=this.proxy,i=l.isString(e)?e.includes(".")?Mo(o,e):()=>o[e]:e.bind(o,o);let s;l.isFunction(t)?s=t:(s=t.handler,n=t);const r=X;Yt(this);const a=Oo(i,s.bind(o),n);return r?Yt(r):Zn(),a}function Mo(e,t){const n=t.split(".");return()=>{let o=e;for(let i=0;i<n.length&&o;i++)o=o[n[i]];return o}}function _e(e,t){if(!l.isObject(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),A(e))_e(e.value,t);else if(l.isArray(e))for(let n=0;n<e.length;n++)_e(e[n],t);else if(l.isSet(e)||l.isMap(e))e.forEach(n=>{_e(n,t)});else if(l.isPlainObject(e))for(const n in e)_e(e[n],t);return e}function st(e,t){const n=O;if(n===null)return process.env.NODE_ENV!=="production"&&S("withDirectives can only be used inside render functions."),e;const o=ts(n)||n.proxy,i=e.dirs||(e.dirs=[]);for(let s=0;s<t.length;s++){let[r,a,f,u=l.EMPTY_OBJ]=t[s];r&&(l.isFunction(r)&&(r={mounted:r,updated:r}),r.deep&&_e(a),i.push({dir:r,instance:o,value:a,oldValue:void 0,arg:f,modifiers:u}))}return e}const ae=Symbol("_leaveCb"),ot=Symbol("_enterCb");function xo(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ao(()=>{e.isMounted=!0}),$o(()=>{e.isUnmounting=!0}),e}const z=[Function,Array],xn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:z,onEnter:z,onAfterEnter:z,onEnterCancelled:z,onBeforeLeave:z,onLeave:z,onAfterLeave:z,onLeaveCancelled:z,onBeforeAppear:z,onAppear:z,onAfterAppear:z,onAppearCancelled:z},ko={name:"BaseTransition",props:xn,setup(e,{slots:t}){const n=Xn(),o=xo();let i;return()=>{const s=t.default&&In(t.default(),!0);if(!s||!s.length)return;let r=s[0];if(s.length>1){let _=!1;for(const C of s)if(C.type!==Z){if(process.env.NODE_ENV!=="production"&&_){S("<transition> can only be used on a single element or component. Use <transition-group> for lists.");break}if(r=C,_=!0,process.env.NODE_ENV==="production")break}}const a=v(e),{mode:f}=a;if(process.env.NODE_ENV!=="production"&&f&&f!=="in-out"&&f!=="out-in"&&f!=="default"&&S(`invalid <transition> mode: ${f}`),o.isLeaving)return Lt(r);const u=Fn(r);if(!u)return Lt(r);const d=Bt(u,a,o,n);zt(u,d);const c=n.subTree,p=c&&Fn(c);let h=!1;const{getTransitionKey:w}=u.type;if(w){const _=w();i===void 0?i=_:_!==i&&(i=_,h=!0)}if(p&&p.type!==Z&&(!Yn(u,p)||h)){const _=Bt(p,a,o,n);if(zt(p,_),f==="out-in")return o.isLeaving=!0,_.afterLeave=()=>{o.isLeaving=!1,n.update.active!==!1&&n.update()},Lt(r);f==="in-out"&&u.type!==Z&&(_.delayLeave=(C,q,T)=>{const Ee=kn(o,p);Ee[String(p.key)]=p,C[ae]=()=>{q(),C[ae]=void 0,delete d.delayedLeave},d.delayedLeave=T})}return r}}};function kn(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function Bt(e,t,n,o){const{appear:i,mode:s,persisted:r=!1,onBeforeEnter:a,onEnter:f,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:c,onLeave:p,onAfterLeave:h,onLeaveCancelled:w,onBeforeAppear:_,onAppear:C,onAfterAppear:q,onAppearCancelled:T}=t,Ee=String(e.key),V=kn(n,e),J=(E,M)=>{E&&Ae(E,o,9,M)},ke=(E,M)=>{const F=M[1];J(E,M),l.isArray(E)?E.every(Q=>Q.length<=1)&&F():E.length<=1&&F()},Ue={mode:s,persisted:r,beforeEnter(E){let M=a;if(!n.isMounted)if(i)M=_||a;else return;E[ae]&&E[ae](!0);const F=V[Ee];F&&Yn(e,F)&&F.el[ae]&&F.el[ae](),J(M,[E])},enter(E){let M=f,F=u,Q=d;if(!n.isMounted)if(i)M=C||f,F=q||u,Q=T||d;else return;let g=!1;const x=E[ot]=ne=>{g||(g=!0,ne?J(Q,[E]):J(F,[E]),Ue.delayedLeave&&Ue.delayedLeave(),E[ot]=void 0)};M?ke(M,[E,x]):x()},leave(E,M){const F=String(e.key);if(E[ot]&&E[ot](!0),n.isUnmounting)return M();J(c,[E]);let Q=!1;const g=E[ae]=x=>{Q||(Q=!0,M(),x?J(w,[E]):J(h,[E]),E[ae]=void 0,V[F]===e&&delete V[F])};V[F]=e,p?ke(p,[E,g]):g()},clone(E){return Bt(E,t,n,o)}};return Ue}function Lt(e){if(An(e))return e=Ce(e),e.children=null,e}function Fn(e){return An(e)?e.children?e.children[0]:void 0:e}function zt(e,t){e.shapeFlag&6&&e.component?zt(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function In(e,t=!1,n){let o=[],i=0;for(let s=0;s<e.length;s++){let r=e[s];const a=n==null?r.key:String(n)+String(r.key!=null?r.key:s);r.type===N?(r.patchFlag&128&&i++,o=o.concat(In(r.children,t,a))):(t||r.type!==Z)&&o.push(a!=null?Ce(r,{key:a}):r)}if(i>1)for(let s=0;s<o.length;s++)o[s].patchFlag=-2;return o}const Fo=e=>!!e.type.__asyncLoader,An=e=>e.type.__isKeepAlive;function Io(e,t,n=X,o=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Dt(),Yt(n);const a=Ae(t,n,e,r);return Zn(),Vt(),a});return o?i.unshift(s):i.push(s),s}else if(process.env.NODE_ENV!=="production"){const i=l.toHandlerKey(kt[e].replace(/ hook$/,""));S(`${i} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`)}}const $n=e=>(t,n=X)=>Io(e,(...o)=>t(...o),n),Ao=$n("m"),$o=$n("bum");function ue(e,t,n,o){let i;const s=n&&n[o];if(l.isArray(e)||l.isString(e)){i=new Array(e.length);for(let r=0,a=e.length;r<a;r++)i[r]=t(e[r],r,void 0,s&&s[r])}else if(typeof e=="number"){process.env.NODE_ENV!=="production"&&!Number.isInteger(e)&&S(`The v-for range expect an integer value but got ${e}.`),i=new Array(e);for(let r=0;r<e;r++)i[r]=t(r+1,r,void 0,s&&s[r])}else if(l.isObject(e))if(e[Symbol.iterator])i=Array.from(e,(r,a)=>t(r,a,void 0,s&&s[a]));else{const r=Object.keys(e);i=new Array(r.length);for(let a=0,f=r.length;a<f;a++){const u=r[a];i[a]=t(e[u],u,a,s&&s[a])}}else i=[];return n&&(n[o]=i),i}function P(e,t,n={},o,i){if(O.isCE||O.parent&&Fo(O.parent)&&O.parent.isCE)return t!=="default"&&(n.name=t),I("slot",n,o&&o());let s=e[t];process.env.NODE_ENV!=="production"&&s&&s.length>1&&(S("SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template."),s=()=>[]),s&&s._c&&(s._d=!1),m();const r=s&&Rn(s(n)),a=Ne(N,{key:n.key||r&&r.key||`_${t}`},r||(o?o():[]),r&&e._===1?64:-2);return!i&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function Rn(e){return e.some(t=>lt(t)?!(t.type===Z||t.type===N&&!Rn(t.children)):!0)?e:null}const Ht=e=>e?Xo(e)?ts(e)||e.proxy:Ht(e.parent):null,Be=l.extend(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>process.env.NODE_ENV!=="production"?Ze(e.props):e.props,$attrs:e=>process.env.NODE_ENV!=="production"?Ze(e.attrs):e.attrs,$slots:e=>process.env.NODE_ENV!=="production"?Ze(e.slots):e.slots,$refs:e=>process.env.NODE_ENV!=="production"?Ze(e.refs):e.refs,$parent:e=>Ht(e.parent),$root:e=>Ht(e.root),$emit:e=>e.emit,$options:e=>Ho(e),$forceUpdate:e=>e.f||(e.f=()=>At(e.update)),$nextTick:e=>e.n||(e.n=go.bind(e.proxy)),$watch:e=>Po.bind(e)}),Ro=e=>e==="_"||e==="$",Kt=(e,t)=>e!==l.EMPTY_OBJ&&!e.__isScriptSetup&&l.hasOwn(e,t),Bo={get({_:e},t){const{ctx:n,setupState:o,data:i,props:s,accessCache:r,type:a,appContext:f}=e;if(process.env.NODE_ENV!=="production"&&t==="__isVue")return!0;let u;if(t[0]!=="$"){const h=r[t];if(h!==void 0)switch(h){case 1:return o[t];case 2:return i[t];case 4:return n[t];case 3:return s[t]}else{if(Kt(o,t))return r[t]=1,o[t];if(i!==l.EMPTY_OBJ&&l.hasOwn(i,t))return r[t]=2,i[t];if((u=e.propsOptions[0])&&l.hasOwn(u,t))return r[t]=3,s[t];if(n!==l.EMPTY_OBJ&&l.hasOwn(n,t))return r[t]=4,n[t];r[t]=0}}const d=Be[t];let c,p;if(d)return t==="$attrs"?(k(e,"get",t),process.env.NODE_ENV!=="production"&&void 0):process.env.NODE_ENV!=="production"&&t==="$slots"&&k(e,"get",t),d(e);if((c=a.__cssModules)&&(c=c[t]))return c;if(n!==l.EMPTY_OBJ&&l.hasOwn(n,t))return r[t]=4,n[t];if(p=f.config.globalProperties,l.hasOwn(p,t))return p[t];process.env.NODE_ENV!=="production"&&O&&(!l.isString(t)||t.indexOf("__v")!==0)&&(i!==l.EMPTY_OBJ&&Ro(t[0])&&l.hasOwn(i,t)?S(`Property ${JSON.stringify(t)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`):e===O&&S(`Property ${JSON.stringify(t)} was accessed during render but is not defined on instance.`))},set({_:e},t,n){const{data:o,setupState:i,ctx:s}=e;return Kt(i,t)?(i[t]=n,!0):process.env.NODE_ENV!=="production"&&i.__isScriptSetup&&l.hasOwn(i,t)?(S(`Cannot mutate <script setup> binding "${t}" from Options API.`),!1):o!==l.EMPTY_OBJ&&l.hasOwn(o,t)?(o[t]=n,!0):l.hasOwn(e.props,t)?(process.env.NODE_ENV!=="production"&&S(`Attempting to mutate prop "${t}". Props are readonly.`),!1):t[0]==="$"&&t.slice(1)in e?(process.env.NODE_ENV!=="production"&&S(`Attempting to mutate public property "${t}". Properties starting with $ are reserved and readonly.`),!1):(process.env.NODE_ENV!=="production"&&t in e.appContext.config.globalProperties?Object.defineProperty(s,t,{enumerable:!0,configurable:!0,value:n}):s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:i,propsOptions:s}},r){let a;return!!n[r]||e!==l.EMPTY_OBJ&&l.hasOwn(e,r)||Kt(t,r)||(a=s[0])&&l.hasOwn(a,r)||l.hasOwn(o,r)||l.hasOwn(Be,r)||l.hasOwn(i.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:l.hasOwn(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};process.env.NODE_ENV!=="production"&&(Bo.ownKeys=e=>(S("Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead."),Reflect.ownKeys(e)));function Lo(){return zo().slots}function zo(){const e=Xn();return process.env.NODE_ENV!=="production"&&!e&&S("useContext() called without active instance."),e.setupContext||(e.setupContext=Zo(e))}function Bn(e){return l.isArray(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Ho(e){const t=e.type,{mixins:n,extends:o}=t,{mixins:i,optionsCache:s,config:{optionMergeStrategies:r}}=e.appContext,a=s.get(t);let f;return a?f=a:!i.length&&!n&&!o?f=t:(f={},i.length&&i.forEach(u=>it(f,u,r,!0)),it(f,t,r)),l.isObject(t)&&s.set(t,f),f}function it(e,t,n,o=!1){const{mixins:i,extends:s}=t;s&&it(e,s,n,!0),i&&i.forEach(r=>it(e,r,n,!0));for(const r in t)if(o&&r==="expose")process.env.NODE_ENV!=="production"&&S('"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.');else{const a=Ko[r]||n&&n[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const Ko={data:Ln,props:Hn,emits:Hn,methods:Le,computed:Le,beforeCreate:$,created:$,beforeMount:$,mounted:$,beforeUpdate:$,updated:$,beforeDestroy:$,beforeUnmount:$,destroyed:$,unmounted:$,activated:$,deactivated:$,errorCaptured:$,serverPrefetch:$,components:Le,directives:Le,watch:jo,provide:Ln,inject:Uo};function Ln(e,t){return t?e?function(){return l.extend(l.isFunction(e)?e.call(this,this):e,l.isFunction(t)?t.call(this,this):t)}:t:e}function Uo(e,t){return Le(zn(e),zn(t))}function zn(e){if(l.isArray(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function $(e,t){return e?[...new Set([].concat(e,t))]:t}function Le(e,t){return e?l.extend(Object.create(null),e,t):t}function Hn(e,t){return e?l.isArray(e)&&l.isArray(t)?[...new Set([...e,...t])]:l.extend(Object.create(null),Bn(e),Bn(t??{})):t}function jo(e,t){if(!e)return t;if(!t)return e;const n=l.extend(Object.create(null),e);for(const o in t)n[o]=$(e[o],t[o]);return n}const Kn=To,Yo=e=>e.__isTeleport,N=Symbol.for("v-fgt"),Wo=Symbol.for("v-txt"),Z=Symbol.for("v-cmt"),rt=[];let Y=null;function m(e=!1){rt.push(Y=e?null:[])}function qo(){rt.pop(),Y=rt[rt.length-1]||null}let ze=1;function Un(e){ze+=e}function jn(e){return e.dynamicChildren=ze>0?Y||l.EMPTY_ARR:null,qo(),ze>0&&Y&&Y.push(e),e}function b(e,t,n,o,i,s){return jn(y(e,t,n,o,i,s,!0))}function Ne(e,t,n,o,i){return jn(I(e,t,n,o,i,!0))}function lt(e){return e?e.__v_isVNode===!0:!1}function Yn(e,t){return process.env.NODE_ENV!=="production"&&t.shapeFlag&6&&Ve.has(t.type)?(e.shapeFlag&=-257,t.shapeFlag&=-513,!1):e.type===t.type&&e.key===t.key}const Jo=(...e)=>Jn(...e),Wn="__vInternal",qn=({key:e})=>e??null,at=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?l.isString(e)||A(e)||l.isFunction(e)?{i:O,r:e,k:t,f:!!n}:e:null);function y(e,t=null,n=null,o=0,i=null,s=e===N?0:1,r=!1,a=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&qn(t),ref:t&&at(t),scopeId:On,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:o,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:O};return a?(Ut(f,n),s&128&&e.normalize(f)):n&&(f.shapeFlag|=l.isString(n)?8:16),process.env.NODE_ENV!=="production"&&f.key!==f.key&&S("VNode created with invalid key (NaN). VNode type:",f.type),ze>0&&!r&&Y&&(f.patchFlag>0||s&6)&&f.patchFlag!==32&&Y.push(f),f}const I=process.env.NODE_ENV!=="production"?Jo:Jn;function Jn(e,t=null,n=null,o=0,i=null,s=!1){if((!e||e===Vo)&&(process.env.NODE_ENV!=="production"&&!e&&S(`Invalid vnode type when creating vnode: ${e}.`),e=Z),lt(e)){const a=Ce(e,t,!0);return n&&Ut(a,n),ze>0&&!s&&Y&&(a.shapeFlag&6?Y[Y.indexOf(e)]=a:Y.push(a)),a.patchFlag|=-2,a}if(ss(e)&&(e=e.__vccOpts),t){t=Go(t);let{class:a,style:f}=t;a&&!l.isString(a)&&(t.class=l.normalizeClass(a)),l.isObject(f)&&(Pt(f)&&!l.isArray(f)&&(f=l.extend({},f)),t.style=l.normalizeStyle(f))}const r=l.isString(e)?1:Co(e)?128:Yo(e)?64:l.isObject(e)?4:l.isFunction(e)?2:0;return process.env.NODE_ENV!=="production"&&r&4&&Pt(e)&&(e=v(e),S("Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`.",`
|
|
6
|
-
Component that was made reactive: `,e)),y(e,t,n,o,i,r,s,!0)}function Go(e){return e?Pt(e)||Wn in e?l.extend({},e):e:null}function Ce(e,t,n=!1){const{props:o,ref:i,patchFlag:s,children:r}=e,a=t?W(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&qn(a),ref:t&&t.ref?n&&i?l.isArray(i)?i.concat(at(t)):[i,at(t)]:at(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:process.env.NODE_ENV!=="production"&&s===-1&&l.isArray(r)?r.map(Gn):r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==N?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ce(e.ssContent),ssFallback:e.ssFallback&&Ce(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Gn(e){const t=Ce(e);return l.isArray(e.children)&&(t.children=e.children.map(Gn)),t}function ut(e=" ",t=0){return I(Wo,null,e,t)}function H(e="",t=!1){return t?(m(),Ne(Z,null,e)):I(Z,null,e)}function Ut(e,t){let n=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(l.isArray(t))n=16;else if(typeof t=="object")if(o&65){const i=t.default;i&&(i._c&&(i._d=!1),Ut(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!(Wn in t)?t._ctx=O:i===3&&O&&(O.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else l.isFunction(t)?(t={default:t,_ctx:O},n=32):(t=String(t),o&64?(n=16,t=[ut(t)]):n=8);e.children=t,e.shapeFlag|=n}function W(...e){const t={};for(let n=0;n<e.length;n++){const o=e[n];for(const i in o)if(i==="class")t.class!==o.class&&(t.class=l.normalizeClass([t.class,o.class]));else if(i==="style")t.style=l.normalizeStyle([t.style,o.style]);else if(l.isOn(i)){const s=t[i],r=o[i];r&&s!==r&&!(l.isArray(s)&&s.includes(r))&&(t[i]=s?[].concat(s,r):r)}else i!==""&&(t[i]=o[i])}return t}let X=null;const Xn=()=>X||O;let jt,Te,Qn="__VUE_INSTANCE_SETTERS__";(Te=l.getGlobalThis()[Qn])||(Te=l.getGlobalThis()[Qn]=[]),Te.push(e=>X=e),jt=e=>{Te.length>1?Te.forEach(t=>t(e)):Te[0](e)};const Yt=e=>{jt(e),e.scope.on()},Zn=()=>{X&&X.scope.off(),jt(null)};function Xo(e){return e.vnode.shapeFlag&4}function es(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,process.env.NODE_ENV!=="production"?{get(t,n){return k(e,"get","$attrs"),t[n]},set(){return S("setupContext.attrs is readonly."),!1},deleteProperty(){return S("setupContext.attrs is readonly."),!1}}:{get(t,n){return k(e,"get","$attrs"),t[n]}}))}function Qo(e){return e.slotsProxy||(e.slotsProxy=new Proxy(e.slots,{get(t,n){return k(e,"get","$slots"),t[n]}}))}function Zo(e){const t=n=>{if(process.env.NODE_ENV!=="production"&&(e.exposed&&S("expose() should be called only once per setup()."),n!=null)){let o=typeof n;o==="object"&&(l.isArray(n)?o="array":A(n)&&(o="ref")),o!=="object"&&S(`expose() should be passed a plain object, received ${o}.`)}e.exposed=n||{}};return process.env.NODE_ENV!=="production"?Object.freeze({get attrs(){return es(e)},get slots(){return Qo(e)},get emit(){return(n,...o)=>e.emit(n,...o)},expose:t}):{get attrs(){return es(e)},slots:e.slots,emit:e.emit,expose:t}}function ts(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(oo(to(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Be)return Be[n](e)},has(t,n){return n in t||n in Be}}))}const ei=/(?:^|[-_])(\w)/g,ti=e=>e.replace(ei,t=>t.toUpperCase()).replace(/[-_]/g,"");function Wt(e,t=!0){return l.isFunction(e)?e.displayName||e.name:e.name||t&&e.__name}function ns(e,t,n=!1){let o=Wt(t);if(!o&&t.__file){const i=t.__file.match(/([^/\\]+)\.\w+$/);i&&(o=i[1])}if(!o&&e&&e.parent){const i=s=>{for(const r in s)if(s[r]===t)return r};o=i(e.components||e.parent.type.components)||i(e.appContext.components)}return o?ti(o):n?"App":"Anonymous"}function ss(e){return l.isFunction(e)&&"__vccOpts"in e}function os(e,t,n){const o=arguments.length;return o===2?l.isObject(t)&&!l.isArray(t)?lt(t)?I(e,null,[t]):I(e,t):I(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):o===3&<(n)&&(n=[n]),I(e,t,n))}function qt(e){return!!(e&&e.__v_isShallow)}function ni(){if(process.env.NODE_ENV==="production"||typeof window>"u")return;const e={style:"color:#3ba776"},t={style:"color:#0b1bc9"},n={style:"color:#b62e24"},o={style:"color:#9d288c"},i={header(c){return l.isObject(c)?c.__isVue?["div",e,"VueInstance"]:A(c)?["div",{},["span",e,d(c)],"<",a(c.value),">"]:me(c)?["div",{},["span",e,qt(c)?"ShallowReactive":"Reactive"],"<",a(c),`>${ye(c)?" (readonly)":""}`]:ye(c)?["div",{},["span",e,qt(c)?"ShallowReadonly":"Readonly"],"<",a(c),">"]:null:null},hasBody(c){return c&&c.__isVue},body(c){if(c&&c.__isVue)return["div",{},...s(c.$)]}};function s(c){const p=[];c.type.props&&c.props&&p.push(r("props",v(c.props))),c.setupState!==l.EMPTY_OBJ&&p.push(r("setup",c.setupState)),c.data!==l.EMPTY_OBJ&&p.push(r("data",v(c.data)));const h=f(c,"computed");h&&p.push(r("computed",h));const w=f(c,"inject");return w&&p.push(r("injected",w)),p.push(["div",{},["span",{style:o.style+";opacity:0.66"},"$ (internal): "],["object",{object:c}]]),p}function r(c,p){return p=l.extend({},p),Object.keys(p).length?["div",{style:"line-height:1.25em;margin-bottom:0.6em"},["div",{style:"color:#476582"},c],["div",{style:"padding-left:1.25em"},...Object.keys(p).map(h=>["div",{},["span",o,h+": "],a(p[h],!1)])]]:["span",{}]}function a(c,p=!0){return typeof c=="number"?["span",t,c]:typeof c=="string"?["span",n,JSON.stringify(c)]:typeof c=="boolean"?["span",o,c]:l.isObject(c)?["object",{object:p?v(c):c}]:["span",n,String(c)]}function f(c,p){const h=c.type;if(l.isFunction(h))return;const w={};for(const _ in c.ctx)u(h,_,p)&&(w[_]=c.ctx[_]);return w}function u(c,p,h){const w=c[h];if(l.isArray(w)&&w.includes(p)||l.isObject(w)&&p in w||c.extends&&u(c.extends,p,h)||c.mixins&&c.mixins.some(_=>u(_,p,h)))return!0}function d(c){return qt(c)?"ShallowRef":c.effect?"ComputedRef":"Ref"}window.devtoolsFormatters?window.devtoolsFormatters.push(i):window.devtoolsFormatters=[i]}const ce="transition",He="animation",ct=Symbol("_vtc"),ft=(e,{slots:t})=>os(ko,si(e),t);ft.displayName="Transition";const is={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ft.props=l.extend({},xn,is);const ve=(e,t=[])=>{l.isArray(e)?e.forEach(n=>n(...t)):e&&e(...t)},rs=e=>e?l.isArray(e)?e.some(t=>t.length>1):e.length>1:!1;function si(e){const t={};for(const g in e)g in is||(t[g]=e[g]);if(e.css===!1)return t;const{name:n="v",type:o,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:f=s,appearActiveClass:u=r,appearToClass:d=a,leaveFromClass:c=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,w=oi(i),_=w&&w[0],C=w&&w[1],{onBeforeEnter:q,onEnter:T,onEnterCancelled:Ee,onLeave:V,onLeaveCancelled:J,onBeforeAppear:ke=q,onAppear:Ue=T,onAppearCancelled:E=Ee}=t,M=(g,x,ne)=>{Se(g,x?d:a),Se(g,x?u:r),ne&&ne()},F=(g,x)=>{g._isLeaving=!1,Se(g,c),Se(g,h),Se(g,p),x&&x()},Q=g=>(x,ne)=>{const Ts=g?Ue:T,Os=()=>M(x,g,ne);ve(Ts,[x,Os]),ls(()=>{Se(x,g?f:s),fe(x,g?d:a),rs(Ts)||as(x,o,_,Os)})};return l.extend(t,{onBeforeEnter(g){ve(q,[g]),fe(g,s),fe(g,r)},onBeforeAppear(g){ve(ke,[g]),fe(g,f),fe(g,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(g,x){g._isLeaving=!0;const ne=()=>F(g,x);fe(g,c),li(),fe(g,p),ls(()=>{g._isLeaving&&(Se(g,c),fe(g,h),rs(V)||as(g,o,C,ne))}),ve(V,[g,ne])},onEnterCancelled(g){M(g,!1),ve(Ee,[g])},onAppearCancelled(g){M(g,!0),ve(E,[g])},onLeaveCancelled(g){F(g),ve(J,[g])}})}function oi(e){if(e==null)return null;if(l.isObject(e))return[Jt(e.enter),Jt(e.leave)];{const t=Jt(e);return[t,t]}}function Jt(e){const t=l.toNumber(e);return process.env.NODE_ENV!=="production"&&fo(t,"<transition> explicit duration"),t}function fe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ct]||(e[ct]=new Set)).add(t)}function Se(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const n=e[ct];n&&(n.delete(t),n.size||(e[ct]=void 0))}function ls(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ii=0;function as(e,t,n,o){const i=e._endId=++ii,s=()=>{i===e._endId&&o()};if(n)return setTimeout(s,n);const{type:r,timeout:a,propCount:f}=ri(e,t);if(!r)return o();const u=r+"end";let d=0;const c=()=>{e.removeEventListener(u,p),s()},p=h=>{h.target===e&&++d>=f&&c()};setTimeout(()=>{d<f&&c()},a+1),e.addEventListener(u,p)}function ri(e,t){const n=window.getComputedStyle(e),o=w=>(n[w]||"").split(", "),i=o(`${ce}Delay`),s=o(`${ce}Duration`),r=us(i,s),a=o(`${He}Delay`),f=o(`${He}Duration`),u=us(a,f);let d=null,c=0,p=0;t===ce?r>0&&(d=ce,c=r,p=s.length):t===He?u>0&&(d=He,c=u,p=f.length):(c=Math.max(r,u),d=c>0?r>u?ce:He:null,p=d?d===ce?s.length:f.length:0);const h=d===ce&&/\b(transform|all)(,|$)/.test(o(`${ce}Property`).toString());return{type:d,timeout:c,propCount:p,hasTransform:h}}function us(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,o)=>cs(n)+cs(e[o])))}function cs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function li(){return document.body.offsetHeight}const fs=Symbol("_vod"),ds={beforeMount(e,{value:t},{transition:n}){e[fs]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ke(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),Ke(e,!0),o.enter(e)):o.leave(e,()=>{Ke(e,!1)}):Ke(e,t))},beforeUnmount(e,{value:t}){Ke(e,t)}};function Ke(e,t){e.style.display=t?e[fs]:"none"}function de(e,t,n,o){e.addEventListener(t,n,o)}const pe=e=>{const t=e.props["onUpdate:modelValue"]||!1;return l.isArray(t)?n=>l.invokeArrayFns(t,n):t};function ai(e){e.target.composing=!0}function ps(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const K=Symbol("_assign"),hs={created(e,{modifiers:{lazy:t,trim:n,number:o}},i){e[K]=pe(i);const s=o||i.props&&i.props.type==="number";de(e,t?"change":"input",r=>{if(r.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=l.looseToNumber(a)),e[K](a)}),n&&de(e,"change",()=>{e.value=e.value.trim()}),t||(de(e,"compositionstart",ai),de(e,"compositionend",ps),de(e,"change",ps))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:o,number:i}},s){if(e[K]=pe(s),e.composing||document.activeElement===e&&e.type!=="range"&&(n||o&&e.value.trim()===t||(i||e.type==="number")&&l.looseToNumber(e.value)===t))return;const r=t??"";e.value!==r&&(e.value=r)}},gs={deep:!0,created(e,t,n){e[K]=pe(n),de(e,"change",()=>{const o=e._modelValue,i=Oe(e),s=e.checked,r=e[K];if(l.isArray(o)){const a=l.looseIndexOf(o,i),f=a!==-1;if(s&&!f)r(o.concat(i));else if(!s&&f){const u=[...o];u.splice(a,1),r(u)}}else if(l.isSet(o)){const a=new Set(o);s?a.add(i):a.delete(i),r(a)}else r(ws(e,s))})},mounted:ms,beforeUpdate(e,t,n){e[K]=pe(n),ms(e,t,n)}};function ms(e,{value:t,oldValue:n},o){e._modelValue=t,l.isArray(t)?e.checked=l.looseIndexOf(t,o.props.value)>-1:l.isSet(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=l.looseEqual(t,ws(e,!0)))}const ui={created(e,{value:t},n){e.checked=l.looseEqual(t,n.props.value),e[K]=pe(n),de(e,"change",()=>{e[K](Oe(e))})},beforeUpdate(e,{value:t,oldValue:n},o){e[K]=pe(o),t!==n&&(e.checked=l.looseEqual(t,o.props.value))}},ci={deep:!0,created(e,{value:t,modifiers:{number:n}},o){const i=l.isSet(t);de(e,"change",()=>{const s=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>n?l.looseToNumber(Oe(r)):Oe(r));e[K](e.multiple?i?new Set(s):s:s[0])}),e[K]=pe(o)},mounted(e,{value:t}){ys(e,t)},beforeUpdate(e,t,n){e[K]=pe(n)},updated(e,{value:t}){ys(e,t)}};function ys(e,t){const n=e.multiple;if(n&&!l.isArray(t)&&!l.isSet(t)){process.env.NODE_ENV!=="production"&&S(`<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(t).slice(8,-1)}.`);return}for(let o=0,i=e.options.length;o<i;o++){const s=e.options[o],r=Oe(s);if(n)l.isArray(t)?s.selected=l.looseIndexOf(t,r)>-1:s.selected=t.has(r);else if(l.looseEqual(Oe(s),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}function Oe(e){return"_value"in e?e._value:e.value}function ws(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const fi={created(e,t,n){dt(e,t,n,null,"created")},mounted(e,t,n){dt(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){dt(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){dt(e,t,n,o,"updated")}};function di(e,t){switch(e){case"SELECT":return ci;case"TEXTAREA":return hs;default:switch(t){case"checkbox":return gs;case"radio":return ui;default:return hs}}}function dt(e,t,n,o,i){const r=di(e.tagName,n.props&&n.props.type)[i];r&&r(e,t,n,o)}const pi=["ctrl","shift","alt","meta"],hi={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>pi.some(n=>e[`${n}Key`]&&!t.includes(n))},Pe=(e,t)=>(n,...o)=>{for(let i=0;i<t.length;i++){const s=hi[t[i]];if(s&&s(n,t))return}return e(n,...o)};function gi(){ni()}process.env.NODE_ENV!=="production"&&gi();const mi={class:"dito-calendar"},yi={class:"dito-calendar-popup"},wi={class:"dito-calendar-inner"},bi={class:"dito-calendar-header"},_i={class:"dito-calendar-body"},vi={class:"dito-calendar-weekdays"},Si={class:"dito-calendar-dates"},Ei=["onClick"],Di={class:"dito-calendar-footer"},Vi=["title"],Ni={class:"dito-calendar-header"},Ci={class:"dito-calendar-body"},Ti={class:"dito-calendar-months"},Oi=["onClick"],Pi={class:"dito-calendar-header"},Mi={class:"dito-calendar-body"},xi={class:"dito-calendar-years"},ki=["onClick"];function Fi(e,t,n,o,i,s){return m(),b("div",mi,[y("div",yi,[y("div",wi,[i.currentMode==="day"?(m(),b(N,{key:0},[y("div",bi,[y("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>s.stepYear(-1))}),y("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>s.stepMonth(-1))}),y("span",null,[y("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>s.setMode("year"))},l.toDisplayString(s.dateToString(i.currentValue,{year:!0})),1),y("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>s.setMode("month"))},l.toDisplayString(s.dateToString(i.currentValue,{month:!0})),1)]),y("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>s.stepMonth(1))}),y("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>s.stepYear(1))})]),y("div",_i,[y("div",vi,[(m(!0),b(N,null,ue(i.weekdayNames,r=>(m(),b("span",null,l.toDisplayString(r.short),1))),256))]),y("div",Si,[(m(!0),b(N,null,ue(i.dateRange,r=>(m(),b("span",{class:l.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:a=>r.state!=="disabled"&&s.selectDate(r.date)},l.toDisplayString(r.text),11,Ei))),256))])]),y("div",Di,[y("a",{class:"dito-calendar-select-now",role:"button",title:s.dateToString(new Date),onClick:t[6]||(t[6]=r=>s.selectDate(new Date))},null,8,Vi)])],64)):i.currentMode==="month"?(m(),b(N,{key:1},[y("div",Ni,[y("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>s.stepYear(-1))}),y("span",null,[y("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>s.setMode("year"))},l.toDisplayString(s.dateToString(i.currentValue,{year:!0})),1)]),y("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>s.stepYear(1))})]),y("div",Ci,[y("div",Ti,[(m(!0),b(N,null,ue(i.monthNames,(r,a)=>(m(),b("span",{class:l.normalizeClass(s.getMonthClass(a)),onClick:f=>s.selectMonth(a)},l.toDisplayString(r.short),11,Oi))),256))])])],64)):i.currentMode==="year"?(m(),b(N,{key:2},[y("div",Pi,[y("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>s.stepDecade(-1))}),y("span",null,l.toDisplayString(s.decadeToString(i.currentValue)),1),y("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>s.stepDecade(1))})]),y("div",Mi,[y("div",xi,[(m(!0),b(N,null,ue(i.yearRange,r=>(m(),b("span",{class:l.normalizeClass(s.getYearClass(r)),onClick:a=>s.selectYear(r)},l.toDisplayString(r),11,ki))),256))])])],64)):H("",!0)])])])}const ee=(e,t)=>{const n=e.__vccOpts||e;for(const[o,i]of t)n[o]=i;return n},Ii={emits:["update:modelValue","select"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=Ai(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||Fe(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e,t=!1){this.currentValue=Fe(this.currentValue,e),t&&this.$emit("update:modelValue",this.currentValue)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:n,month:o}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:o,day:Math.min(this.getDaysInMonth(n,o),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e){this.setDate(wt(e),!0),this.$emit("select")},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1},!0)},selectYear(e){this.setMode("month"),this.setDate({year:e},!0)},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:n,day:o}={year:!0,month:!0,day:!0}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:n&&"long",day:o&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({step:e,enter:t,mode:n=this.currentMode,update:o=!1}){const{currentValue:i}=this;if(e){switch(n){case"day":this.setDate({day:i.getDate()+e},o);break;case"month":this.setDate({month:i.getMonth()+e},o);break;case"year":this.setDate({year:i.getFullYear()+e},o);break}return!0}else if(t){switch(this.currentMode){case"day":this.selectDate(i);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),n=e.getMonth(),o=this.getFirstYearOfDecade(t);for(let u=0;u<10;u++)this.yearRange.push(o+u);let s=new Date(t,n,1).getDay()+1;s===0&&(s=7);const r=this.getDaysInMonth(t,n);if(s>1){const u=this.getYearMonth(t,n-1),d=this.getDaysInMonth(u.year,u.month);for(let c=1;c<s;c++){const p=d-s+c+1,h=new Date(u.year,u.month,p);this.dateRange.push({text:p,date:h,state:this.disabledDate(h)?"disabled":"gray"})}}const a=new Date;for(let u=1;u<=r;u++){const d=new Date(t,n,u),c=h=>h&&h.getDate()===u&&h.getFullYear()===t&&h.getMonth()===n,p=c(this.modelValue)?"active":c(a)?"today":this.disabledDate(d)?"disabled":c(e)?"current":null;this.dateRange.push({text:u,date:d,state:p})}const f=42-this.dateRange.length;if(f>0){const u=this.getYearMonth(t,n+1);for(let d=1;d<=f;d++){const c=new Date(u.year,u.month,d),p=this.disabledDate(c)?"disabled":"gray";this.dateRange.push({text:d,date:c,state:p})}}}}},bs={};function Ai(e){let t=bs[e];if(!t){const n=[];for(let i=0;i<7;i++){const s=new Date(0,0,i);n.push({long:s.toLocaleString(e,{weekday:"long"}),short:s.toLocaleString(e,{weekday:"short"})})}const o=[];for(let i=1;i<=12;i++){const s=new Date(0,i,0);o.push({long:s.toLocaleString(e,{month:"long"}),short:s.toLocaleString(e,{month:"short"})})}t=bs[e]={weekdayNames:n,monthNames:o}}return t}const _s=ee(Ii,[["render",Fi]]);function pt(e,t){e=e instanceof NodeList?Array.from(e):R.asArray(e);for(const[n,o]of Object.entries(t))for(const i of e)i.addEventListener(n,o,!1);return{remove(){for(const[n,o]of Object.entries(t))for(const i of e)i.removeEventListener(n,o,!1)}}}function vs(...e){return{remove(){for(const t of e)t.remove()}}}function Ss(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e==null?void 0:e.keyCode]}function ht(e){const t=Ss(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}function Gt(e){const t=R.isString(e.target)?e.$refs[e.target]:e.target;return(t==null?void 0:t.$el)??t}const $i={class:"dito-trigger-container"};function Ri(e,t,n,o,i,s){return m(),b("div",$i,[n.alwaysShow?(m(),b("div",{key:0,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger"},[P(e.$slots,"trigger")],2)):n.trigger==="click"?(m(),b("div",{key:1,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>s.onClick&&s.onClick(...r))},[P(e.$slots,"trigger")],2)):n.trigger==="hover"?(m(),b("div",{key:2,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>s.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>s.onHover(!1))},[P(e.$slots,"trigger")],34)):n.trigger==="focus"||n.trigger==="always"?(m(),b("div",{key:3,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger"},[P(e.$slots,"trigger")],2)):H("",!0),I(ft,{name:`dito-${n.transition}`},{default:L(()=>[n.trigger==="hover"?st((m(),b("div",{key:0,class:l.normalizeClass(["dito-popup",s.popupClass]),ref:"popup",style:l.normalizeStyle(s.popupStyle),onMouseenter:t[3]||(t[3]=r=>s.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>s.onHover(!1))},[i.showPopup?P(e.$slots,"popup",{key:0}):H("",!0)],38)),[[ds,i.showPopup]]):st((m(),b("div",{key:1,class:l.normalizeClass(["dito-popup",s.popupClass]),ref:"popup",style:l.normalizeStyle(s.popupStyle)},[i.showPopup?P(e.$slots,"popup",{key:0}):H("",!0)],6)),[[ds,i.showPopup]])]),_:3},8,["name"])])}const Xt=ee({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement,focusEvents:null,closeEvents:null,popupEvents:null,blurTimer:null,mouseLeaveTimer:null}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${R.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""},triggerTarget(){return Gt(this)}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),this.$nextTick(()=>this.onShowPopup(e)))}},mounted(){const{trigger:e,popup:t}=this.$refs;this.trigger==="focus"&&(this.focusEvents=this.addFocusEvents(this.triggerTarget??e)),this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=pt(window,{mouseup:n=>{var o;this.showPopup&&!t.contains(n.target)&&!e.contains(n.target)&&!((o=this.triggerTarget)!=null&&o.contains(n.target))&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},unmounted(){var e,t,n;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),(n=this.popupEvents)==null||n.remove()},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const n=this.triggerTarget??e,o=this.target==="popup"?e:t.firstElementChild;o&&(o.style.width=getComputedStyle(n).width);const i=n.getBoundingClientRect(),s=i.left+window.scrollX,r=i.top+window.scrollY,a=i.width,f=i.height,u=t.offsetWidth,d=t.offsetHeight;let[c,p]=this.popupPlacement.split("-")||[];if(this.keepInView){const _=window.innerWidth,C=window.innerHeight;c==="top"?r<d&&(c="bottom"):c==="bottom"?C-r-f<d&&(c="top"):c==="left"?s<u&&(c="right"):c==="right"&&_-s-a<u&&(c="left"),p==="top"?C-r<d&&(p="bottom"):p==="bottom"?r+f<d&&(p="top"):p==="left"?_-s<u&&(p="right"):p==="right"&&s+a<u&&(p="left")}let h=0,w=0;switch(c){case"top":w-=d;break;case"left":h-=u;break;case"right":h+=a;break;case"bottom":w+=f;break}switch(p){case"right":h-=u-a;break;case"bottom":w-=d-f;break}if(this.cover&&(c==="top"?w+=f:c==="bottom"&&(w-=f)),n!==e){const _=e.getBoundingClientRect();h+=s-_.left,w+=r-_.top}t.style.left=`${h}px`,t.style.top=`${w}px`},addFocusEvents(e){const t=e.querySelectorAll("input, textarea");let n;return vs(pt(t,{focus:()=>{this.showPopup=!0,clearTimeout(this.blurTimer)},blur:()=>{this.blurTimer=setTimeout(()=>{this.$refs.popup.matches(":focus-within")||(this.showPopup=!1)},0)}}),pt(e,{mousedown:o=>{o.target.matches("input, textarea, button")||(o.preventDefault(),o.stopPropagation()),o.target.matches(".dito-button-clear")||(n=(this.triggerTarget??this.$refs.trigger).querySelector("input, textarea"),n&&!n.hasAttribute("readonly")?n.setAttribute("readonly","true"):n=null)},mouseup:o=>{n&&setTimeout(()=>{n.removeAttribute("readonly"),o.target.matches("input, textarea, button")||n.focus(),n=null},0)}}))},onShowPopup(e){var t;e?(this.trigger==="focus"&&(this.popupEvents=this.addFocusEvents(this.$refs.popup)),this.updatePosition()):((t=this.popupEvents)==null||t.remove(),this.popupEvents=null)},onClick(){this.disabled||(this.showPopup=!0)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",Ri]]),Bi=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Li(e,t,n,o,i,s){return m(),b("div",{class:l.normalizeClass(["dito-input",s.classes])},[P(e.$slots,"before"),st(y("input",W({id:n.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>i.currentValue=r),type:n.type,name:n.name,title:n.title,disabled:n.disabled,readonly:n.readonly,autofocus:n.autofocus,placeholder:n.placeholder,autocomplete:n.autocomplete,"aria-label":n.title},s.attributes),null,16,Bi),[[fi,i.currentValue]]),P(e.$slots,"after")],2)}const gt=ee({emits:["update:modelValue"],inheritAttrs:!1,props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{classes(){return this.$attrs.class},attributes(){const{class:e,...t}=this.$attrs;return t},input(){return this.$refs.input},size(){const{size:e,min:t,max:n}=this.$attrs,o=i=>i!=null?`${i}`.length:0;return e||o(t)||o(n)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Li]]);function zi(e,t,n,o,i,s){return m(),b("i",{class:l.normalizeClass(["dito-icon",{["dito-icon--"+n.name]:!0,"dito-icon--disabled":n.disabled}])},null,2)}const mt=ee({props:{name:{type:String,required:!0},disabled:{type:Boolean,default:!1}}},[["render",zi]]);function te(e,{start:t,end:n}){e!=null&&e.setSelectionRange&&(e.focus(),e.setSelectionRange(t,n))}function Me(e){return e&&"selectionStart"in e?{start:e.selectionStart,end:e.selectionEnd}:null}function Hi(e,t,n,o,i,s){const r=j("Icon"),a=j("InputField"),f=j("Calendar"),u=j("Trigger");return m(),Ne(u,W({class:"dito-date-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[7]||(t[7]=d=>i.showPopup=d),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:L(()=>[e.$slots.trigger?P(e.$slots,"trigger",{key:0}):(m(),Ne(a,W({key:1,class:["dito-date-picker-input",{"dito-focus":s.focused}],ref:"input",modelValue:s.currentText,"onUpdate:modelValue":t[1]||(t[1]=d=>s.currentText=d),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=d=>s.onFocus(!0)),onBlur:t[3]||(t[3]=d=>s.onFocus(!1)),onKeydown:s.onKeyDown,onMousedown:t[4]||(t[4]=Pe(d=>s.onMouseDown(!1),["stop"]))}),{before:L(()=>[P(e.$slots,"before")]),after:L(()=>[I(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Pe(d=>s.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),P(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:L(()=>[I(f,W({class:"dito-date-picker-popup",ref:"calendar",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=d=>i.currentValue=d)},{locale:n.locale,disabledDate:n.disabledDate},{onSelect:t[6]||(t[6]=d=>i.showPopup=!1)}),null,16,["modelValue"])]),_:3},16,["show"])}const Es=ee({components:{Trigger:Xt,Calendar:_s,InputField:gt,Icon:mt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({date:R.defaultFormats.date,time:!1})},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=Gt(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);t&&(this.currentValue=t)}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){var o;const{ver:t,enter:n}=ht(e);if(t||n){e.preventDefault();const i=(o=Me(this.input))==null?void 0:o.start,s=r=>bt(this.currentText,r,this.formatOptions);if(t&&!this.showPopup)this.showPopup=!0;else{const{calendar:r}=this.$refs;if(r){const{name:a,start:f}=s(i)||{};a&&r.navigate({step:t,enter:n,mode:a,update:!0})&&this.$nextTick(()=>te(this.input,s(f)))}}}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Hi]]),Ki={class:"dito-time-picker-popup"},Ui={class:"dito-time-picker-panel"},ji={class:"dito-time-picker-hour",ref:"hour"},Yi=["onClick"],Wi={class:"dito-time-picker-panel"},qi={class:"dito-time-picker-minute",ref:"minute"},Ji=["onClick"],Gi={class:"dito-time-picker-panel"},Xi={class:"dito-time-picker-second",ref:"second"},Qi=["onClick"];function Zi(e,t,n,o,i,s){const r=j("Icon"),a=j("InputField"),f=j("Trigger");return m(),Ne(f,W({class:"dito-time-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[5]||(t[5]=u=>i.showPopup=u),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:L(()=>[e.$slots.trigger?P(e.$slots,"trigger",{key:0}):(m(),Ne(a,W({key:1,class:["dito-time-picker-input",{"dito-focus":s.focused}],ref:"input",modelValue:s.currentText,"onUpdate:modelValue":t[1]||(t[1]=u=>s.currentText=u),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=u=>s.onFocus(!0)),onBlur:t[3]||(t[3]=u=>s.onFocus(!1)),onKeydown:s.onKeyDown,onMousedown:t[4]||(t[4]=Pe(u=>s.onMouseDown(!1),["stop"]))}),{before:L(()=>[P(e.$slots,"before")]),after:L(()=>[I(r,{name:"clock",disabled:n.disabled,onMousedown:t[0]||(t[0]=Pe(u=>s.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),P(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:L(()=>[y("div",Ki,[y("div",Ui,[y("ul",ji,[(m(),b(N,null,ue(24,u=>(m(),b(N,null,[n.disabledHour(u-1)?H("",!0):(m(),b("li",{key:0,class:l.normalizeClass({selected:s.hour===u-1}),onClick:d=>s.hour=u-1},l.toDisplayString(s.leftPad(u-1)),11,Yi))],64))),64))],512)]),y("div",Wi,[y("ul",qi,[(m(),b(N,null,ue(60,u=>(m(),b(N,null,[n.disabledMinute(u-1)?H("",!0):(m(),b("li",{key:0,class:l.normalizeClass({selected:s.minute===u-1}),onClick:d=>s.minute=u-1},l.toDisplayString(s.leftPad(u-1)),11,Ji))],64))),64))],512)]),y("div",Gi,[y("ul",Xi,[(m(),b(N,null,ue(60,u=>(m(),b(N,null,[n.disabledSecond(u-1)?H("",!0):(m(),b("li",{key:0,class:l.normalizeClass({selected:s.second===u-1}),onClick:d=>s.second=u-1},l.toDisplayString(s.leftPad(u-1)),11,Qi))],64))),64))],512)])])]),_:3},16,["show"])}const Ds=ee({components:{Trigger:Xt,InputField:gt,Icon:mt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({time:R.defaultFormats.time,date:!1})},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,ignoreNextChange:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=Gt(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);t&&(this.currentValue=t)}},currentDate(){return this.currentValue||Fe(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e,this.scrollAll(!0))},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e),this.scrollAll(!0))},currentText(){const{input:e}=this,t=Me(e);this.focused&&!this.ignoreNextChange&&t.start===t.end&&this.$nextTick(()=>te(e,t)),this.ignoreNextChange=!1},show(e){this.showPopup=e},showPopup(e,t){e&&this.scrollAll(!1),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=Fe(this.currentDate,{...e,millisecond:0})},scrollAll(e){const t=(n,o)=>{const i=this.$refs[n];if(i){const s=i.scrollHeight/(i.childElementCount+6),r=Math.round(o*s),a=Math.abs(i.scrollTop-r);i.scrollTo({top:r,behavior:e&&a<100?"smooth":"auto"})}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){const{input:t}=this,n=Me(t),{ver:o,enter:i}=ht(e);if(o||i){e.preventDefault();const s=r=>bt(this.currentText,r,this.formatOptions);if(o)if(!this.showPopup)this.showPopup=!0;else{const{name:r,start:a}=s(n.start)||{};if(r){const f=this[r]+o,u=this.$refs[r].childElementCount;this[r]=f<0?f+u:f>=u?f-u:f,this.ignoreNextChange=!0,this.$nextTick(()=>te(t,s(a)))}}else i&&(this.showPopup=!1)}else if(n.start===n.end){const{value:s}=t;let r=n.start;const a=f=>!isNaN(parseInt(f,10));if(e.key.length===1)if(a(e.key)&&r<s.length)s[r]===":"&&a(s[r-1])&&a(s[r-2])&&r++,a(s[r])&&(a(s[r+1])||a(s[r-1]))&&(t.value=s.slice(0,r)+s.slice(r+1),te(t,{start:r,end:r}));else{const f=R.format(this.currentValue,this.formatOptions).length;s.length===f?e.preventDefault():s.length>f&&(t.value=s.slice(0,f),te(t,n),e.preventDefault())}else e.key==="Backspace"&&(r===1||[" ",":"].includes(s[r-2]))&&(r===s.length||s[r]===":"?(r--,t.value=s.slice(0,r)+((s[r-1]??"")+"00")+s.slice(r+1),te(t,{start:r,end:r})):a(s[r])&&!a(+s[r+1])&&(t.value=s.slice(0,r)+"0"+s.slice(r),te(t,{start:r,end:r})))}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Zi]]),er={class:"dito-date-time-picker",ref:"picker"};function tr(e,t,n,o,i,s){const r=j("Icon"),a=j("InputField"),f=j("DatePicker"),u=j("TimePicker");return m(),b("div",er,[y("div",{class:l.normalizeClass(["dito-date-time-picker__inner",{"dito-focus":s.focused}])},[I(a,W({class:["dito-date-time-picker__input",{"dito-focus":s.focused}],ref:"input",modelValue:s.currentText,"onUpdate:modelValue":t[1]||(t[1]=d=>s.currentText=d),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=d=>s.onFocus(!0)),onBlur:t[3]||(t[3]=d=>s.onFocus(!1)),onKeydown:s.onKeyDown,onMousedown:t[4]||(t[4]=Pe(d=>s.onMouseDown(!1),["stop"]))}),{before:L(()=>[P(e.$slots,"before")]),after:L(()=>[I(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Pe(d=>s.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),P(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]),I(f,W({ref:"date",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=d=>i.currentValue=d),show:i.showDate,"onUpdate:show":t[6]||(t[6]=d=>i.showDate=d),placement:"bottom-left",target:e.$refs.picker},s.attributes),{trigger:L(()=>[]),_:1},16,["modelValue","show","target"]),I(u,W({ref:"time",modelValue:i.currentValue,"onUpdate:modelValue":t[7]||(t[7]=d=>i.currentValue=d),show:i.showTime,"onUpdate:show":t[8]||(t[8]=d=>i.showTime=d),placement:"bottom-right",target:e.$refs.picker},s.attributes),{trigger:L(()=>[]),_:1},16,["modelValue","show","target"])],2)],512)}const nr=ee({components:{InputField:gt,DatePicker:Es,TimePicker:Ds,Icon:mt},emits:["update:modelValue","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},disabled:{type:Boolean,default:!1},locale:{type:String,default:"en-US"},format:{type:Object,default:null}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,inputFocused:!1,dateFocused:!1,timeFocused:!1,closedMode:null}},computed:{attributes(){const{transition:e,disabled:t,locale:n,formatOptions:o}=this;return{transition:e,disabled:t,locale:n,format:o}},focused(){return this.inputFocused||this.showDate||this.showTime},input(){return this.$refs.input.input},formatOptions(){return R.assignDeeply({locale:this.locale,time:R.defaultFormats.time,date:R.defaultFormats.date},{date:{month:"short",format:(e,t,n)=>{var o,i,s;return t==="literal"&&/\bat\b/.test(e)?", ":((s=(i=(o=this.format)==null?void 0:o.date)==null?void 0:i.format)==null?void 0:s.call(i,e,t,n))??e}}},this.format)},timeIndex(){var t;const e=this.currentText;if(e){const n=(t=e.match(/([\S]+\s*)$/))==null?void 0:t[1];if(n)return e.length-n.length}return null},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);if(t){const n=Me(this.input);this.currentValue=t,this.$nextTick(()=>te(this.input,n))}}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,e?this.updatePopups():(this.showDate=!1,this.showTime=!1)},onMouseDown(e){e&&(this.showDate||this.showTime)?(this.showDate=!1,this.showTime=!1):this.disabled||(this.focus(),requestAnimationFrame(()=>this.updatePopups()))},onKeyDown(e){const t=this.getMode(e);this.$refs[t].onKeyDown(e),e.defaultPrevented?this.closedMode=t:t!==this.closedMode&&this.updatePopups(t)},getMode(e=null){const{start:t}=Me(this.input),{hor:n}=ht(e);return this.timeIndex===null||t+n<this.timeIndex?"date":"time"},updatePopups(e=this.getMode()){e&&(this.closedMode=null),this.showDate=e==="date",this.showTime=e==="time"},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",tr]]),sr={class:"dito-pagination"},or={key:0,class:"dito-pagination-total"},ir={key:1,class:"dito-buttons dito-buttons-round"},rr=["disabled","onClick"],lr={key:0};function ar(e,t,n,o,i,s){return m(),b("div",sr,[n.showTotal?(m(),b("div",or,[n.total>0?(m(),b(N,{key:0},[ut(l.toDisplayString(s.first)+" – "+l.toDisplayString(s.last)+" / "+l.toDisplayString(n.total),1)],64)):H("",!0)])):H("",!0),s.numPages>1?(m(),b("div",ir,[(m(!0),b(N,null,ue(s.buttons,r=>(m(),b("button",{class:l.normalizeClass(["dito-button",s.getButtonClasses(r)]),disabled:r.disabled,onClick:a=>s.onClickButton(r)},[r.text?(m(),b("span",lr,l.toDisplayString(r.text),1)):H("",!0)],10,rr))),256))])):H("",!0)])}const ur=ee({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{showPrev:!0,showNext:!0,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.pageSize+1},last(){return Math.min(this.first+this.pageSize-1,this.total)},numPages(){return Math.ceil(this.total/this.pageSize)},buttons(){const{showPrev:e,showNext:t,currentPage:n,numPages:o}=this,i=e+t+1;let s=1,r=1;o<=i?r=o:n<=e+1?r=i:n>=o-t?(r=o,s=o-i+1):(s=n-e,r=n+t);const a=[];a.push({index:n-1,type:"prev",disabled:n<=1}),s>=2&&a.push({index:1,text:1}),s>2&&a.push({index:Math.max(1,n-10),type:"ellipsis-prev"});for(let f=s;f<=r;f++)a.push({index:f,text:f,active:f===n});return r<o-1&&a.push({index:Math.min(o,n+10),type:"ellipsis-next"}),r<=o-1&&a.push({index:o,text:o}),a.push({index:n+1,type:"next",disabled:n>=o}),a}},watch:{page(e){this.currentPage=e},pageSize(){this.currentPage>this.numPages&&(this.currentPage=this.numPages)},currentPage(e,t){e!==t&&this.$emit("update:page",e)}},created(){this.currentPage=this.page},methods:{getButtonClasses(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},onClickButton(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)}}},[["render",ar]]),cr={class:"dito-switch-pane"},fr=["id","name","disabled"],dr=y("div",{class:"dito-switch-button"},null,-1),pr={key:0,class:"dito-switch-label"};function hr(e,t,n,o,i,s){return m(),b("div",{class:l.normalizeClass(["dito-switch",s.classes]),style:l.normalizeStyle(s.styles)},[y("div",cr,[st(y("input",W({id:n.id,ref:"input"},s.attributes,{"onUpdate:modelValue":t[0]||(t[0]=r=>i.checked=r),type:"checkbox",name:n.name,disabled:n.disabled}),null,16,fr),[[gs,i.checked]]),dr,n.labels?(m(),b("span",pr,[i.checked?P(e.$slots,"checked",{key:0},()=>[ut(l.toDisplayString(n.labels.checked||"on"),1)]):P(e.$slots,"unchecked",{key:1},()=>[ut(l.toDisplayString(n.labels.unchecked||"off"),1)])])):H("",!0)])],6)}const gr=ee({emits:["update:modelValue","change"],inheritAttrs:!1,props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){return[this.$attrs.class,{"dito-checked":this.checked,"dito-disabled":this.disabled}]},styles(){const{labels:{checked:e,unchecked:t}={}}=this,n=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":n?`${n*1.5}rem`:null}},attributes(){const{class:e,...t}=this.$attrs;return t}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",hr]]);function Vs({enabled:e},{slots:t}){return e?os(ft,yr,t):t.default()}Vs.props={enabled:{type:Boolean,default:!0}};const mr=Vs,xe=(e,t)=>Object.assign(e.style,t),yt=e=>setTimeout(e,0),Ns=e=>getComputedStyle(e).height,yr={name:"dito-height",onAfterEnter(e){yt(()=>xe(e,{height:null}))},onEnter(e){const{width:t}=getComputedStyle(e);xe(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"}),yt(()=>{const{height:n}=getComputedStyle(e);xe(e,{width:null,position:null,visibility:null,height:0}),Ns(e),yt(()=>xe(e,{height:n}))})},onLeave(e){const{height:t}=getComputedStyle(e);xe(e,{height:t}),Ns(e),yt(()=>xe(e,{height:0}))}};function Cs(e){return e&&R.asArray(e).some(t=>t.type!==Z)}function wr(e,t={}){return e=R.isString(e)?Lo()[e]:e,Cs(e==null?void 0:e(t))}D.Calendar=_s,D.DatePicker=Es,D.DateTimePicker=nr,D.Icon=mt,D.InputField=gt,D.Pagination=ur,D.SwitchButton=gr,D.TimePicker=Ds,D.TransitionHeight=mr,D.Trigger=Xt,D.addEvents=pt,D.alterDate=Fe,D.combineEvents=vs,D.describeDate=wt,D.getDatePartAtPosition=bt,D.getKey=Ss,D.getKeyNavigation=ht,D.getSelection=Me,D.hasSlotContent=wr,D.hasVNodeContent=Cs,D.parseDate=je,D.setSelection=te,Object.defineProperty(D,Symbol.toStringTag,{value:"Module"})});
|
|
7
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by11aS51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9kYXRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvcmVhY3Rpdml0eS9kaXN0L3JlYWN0aXZpdHkuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWNvcmUvZGlzdC9ydW50aW1lLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWRvbS9kaXN0L3J1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS9kaXN0L3Z1ZS5ydW50aW1lLmVzbS1idW5kbGVyLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvQ2FsZW5kYXIudnVlIiwiLi4vc3JjL3V0aWxzL2V2ZW50LmpzIiwiLi4vc3JjL3V0aWxzL3RyaWdnZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9UcmlnZ2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0lucHV0RmllbGQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvSWNvbi52dWUiLCIuLi9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGF0ZVBpY2tlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9UaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RhdGVUaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uL3NyYy91dGlscy92dWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRGF0ZShkYXRlKSB7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICAgIG1vbnRoOiBkYXRlPy5nZXRNb250aCgpID8/IDAsXG4gICAgZGF5OiBkYXRlPy5nZXREYXRlKCkgPz8gMCxcbiAgICBob3VyOiBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gICAgbWludXRlOiBkYXRlPy5nZXRNaW51dGVzKCkgPz8gMCxcbiAgICBzZWNvbmQ6IGRhdGU/LmdldFNlY29uZHMoKSA/PyAwLFxuICAgIG1pbGxpc2Vjb25kOiBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsdGVyRGF0ZShkYXRlLCBvdmVycmlkZXMgPSB7fSkge1xuICByZXR1cm4gbmV3IERhdGUoLi4uT2JqZWN0LnZhbHVlcyh7IC4uLmRlc2NyaWJlRGF0ZShkYXRlKSwgLi4ub3ZlcnJpZGVzIH0pKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKHN0cmluZywge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCB0aW1lRGVmYXVsdCA9IHRpbWUgPyBudWxsIDogMFxuICBsZXQgW1xuICAgIGRheSxcbiAgICBzZXAxLFxuICAgIG1vbnRoLFxuICAgIHNlcDIsXG4gICAgeWVhcixcbiAgICAsXG4gICAgaG91ciA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBtaW51dGUgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgc2Vjb25kID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbGxpc2Vjb25kID0gdGltZURlZmF1bHRcbiAgXSA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA+PSA0KSB7XG4gICAgaWYgKGxvY2FsZSA9PT0gJ2VuLVVTJyAmJiBzZXAxID09PSAnLycgJiYgc2VwMiA9PT0gJy8nKSB7XG4gICAgICAvLyBBbWVyaWNhbiBmb3JtYXQ6IE1NL0REL1lZWVlcbiAgICAgIDtbZGF5LCBtb250aF0gPSBbbW9udGgsIGRheV1cbiAgICB9XG4gICAgbW9udGggPSBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSB9KVxuICAgIGNvbnN0IGlzVmFsaWRUaW1lUGFydCA9IHBhcnQgPT4gcGFydCA9PT0gbnVsbCB8fCBwYXJ0Lmxlbmd0aCA9PT0gMlxuICAgIGlmIChcbiAgICAgIG1vbnRoICE9PSBudWxsICYmIChcbiAgICAgICAgIXRpbWUgfHwgKFxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChob3VyKSAmJlxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChtaW51dGUpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KHNlY29uZClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgICAreWVhcixcbiAgICAgICAgK21vbnRoLFxuICAgICAgICArZGF5LFxuICAgICAgICAraG91cixcbiAgICAgICAgK21pbnV0ZSxcbiAgICAgICAgK3NlY29uZCxcbiAgICAgICAgK21pbGxpc2Vjb25kXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUGFydEF0UG9zaXRpb24oc3RyaW5nLCBwb3NpdGlvbiwge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCBwYXJ0cyA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuXG4gIGNvbnN0IGdldFBvc2l0aW9uID0gKHBvc2l0aW9uLCBsZW5ndGggPSBwYXJ0cy5sZW5ndGgpID0+IHtcbiAgICBsZXQgcG9zID0gMFxuICAgIGxldCBpbmRleCA9IDBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5tb2RpZmllZC1sb29wLWNvbmRpdGlvblxuICAgIHdoaWxlICgocG9zaXRpb24gPT09IG51bGwgfHwgcG9zIDw9IHBvc2l0aW9uKSAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcG9zICs9IHBhcnRzW2luZGV4KytdPy5sZW5ndGggPz8gMFxuICAgIH1cbiAgICByZXR1cm4geyBwb3NpdGlvbjogcG9zLCBpbmRleCB9XG4gIH1cblxuICAvLyBUaW1lIHN0YXJ0cyBhdCBpbmRleCA2LCBkdWUgdG8gdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgZGF0ZS5cbiAgY29uc3Qgb2Zmc2V0ID0gIWRhdGUgPyBnZXRQb3NpdGlvbihudWxsLCA2KS5wb3NpdGlvbiA6IDBcbiAgcG9zaXRpb24gKz0gb2Zmc2V0XG5cbiAgbGV0IHsgaW5kZXggfSA9IGdldFBvc2l0aW9uKHBvc2l0aW9uKVxuXG4gIGNvbnN0IGlzVVMgPSBsb2NhbGUgPT09ICdlbi1VUydcbiAgY29uc3QgdmFsdWVzID0gW1xuICAgIGlzVVMgPyAnbW9udGgnIDogJ2RheScsXG4gICAgbnVsbCxcbiAgICBpc1VTID8gJ2RheScgOiAnbW9udGgnLFxuICAgIG51bGwsXG4gICAgJ3llYXInLFxuICAgIG51bGwsXG4gICAgJ2hvdXInLFxuICAgIG51bGwsXG4gICAgJ21pbnV0ZScsXG4gICAgbnVsbCxcbiAgICAnc2Vjb25kJyxcbiAgICBudWxsLFxuICAgICdtaWxsaXNlY29uZCdcbiAgXVxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmICh2YWx1ZXNbaW5kZXhdKSB7XG4gICAgICBjb25zdCBzdGFydCA9IGdldFBvc2l0aW9uKG51bGwsIGluZGV4KS5wb3NpdGlvbiAtIG9mZnNldFxuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBwYXJ0c1tpbmRleF0ubGVuZ3RoXG4gICAgICByZXR1cm4geyBuYW1lOiB2YWx1ZXNbaW5kZXhdLCBzdGFydCwgZW5kIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlID0gdHJ1ZSwgdGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gc3RyaW5nPy5zcGxpdCgvKFtcXHMuLDovXSspLykgfHwgW11cbiAgaWYgKCFkYXRlKSB7XG4gICAgLy8gQWRkIGR1bW15IGRhdGUgcGFydHMgdG8gbWFrZSBzdXJlIHdlIGdldCBhIHRpbWUtb25seSBkYXRlLlxuICAgIHBhcnRzLnVuc2hpZnQoJzEnLCAnLicsICcxJywgJy4nLCAnMjAwMCcsICcgJylcbiAgfVxuICBpZiAoIXRpbWUgJiYgcGFydHMubGVuZ3RoID4gNSkge1xuICAgIHBhcnRzLmxlbmd0aCA9IDVcbiAgfVxuICByZXR1cm4gcGFydHNcbn1cblxuZnVuY3Rpb24gZ2V0TW9udGhJbmRleChtb250aCwgeyBsb2NhbGUgPSAnZW4tVVMnIH0gPSB7fSkge1xuICBjb25zdCB2YWx1ZSA9ICttb250aFxuICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSAtIDFcbiAgfVxuICBjb25zdCBtYXRjaCA9IG1vbnRoLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGlmIChtYXRjaC5sZW5ndGggPCAzKSByZXR1cm4gbnVsbFxuICBjb25zdCBzaG9ydEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICBjb25zdCBsb25nRm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDIwMDAsIGksIDEpXG4gICAgaWYgKFxuICAgICAgc2hvcnRGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaCkgfHxcbiAgICAgIGxvbmdGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaClcbiAgICApIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCJpbXBvcnQgeyBleHRlbmQsIGlzQXJyYXksIGlzU3ltYm9sLCBpc01hcCwgaXNJbnRlZ2VyS2V5LCBoYXNPd24sIGhhc0NoYW5nZWQsIGlzT2JqZWN0LCBtYWtlTWFwLCBjYXBpdGFsaXplLCB0b1Jhd1R5cGUsIGRlZiwgaXNGdW5jdGlvbiwgTk9PUCB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnfWAsIC4uLmFyZ3MpO1xufVxuXG5sZXQgYWN0aXZlRWZmZWN0U2NvcGU7XG5jbGFzcyBFZmZlY3RTY29wZSB7XG4gIGNvbnN0cnVjdG9yKGRldGFjaGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmNsZWFudXBzID0gW107XG4gICAgdGhpcy5wYXJlbnQgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICBpZiAoIWRldGFjaGVkICYmIGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gICAgICB0aGlzLmluZGV4ID0gKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyB8fCAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzID0gW10pKS5wdXNoKFxuICAgICAgICB0aGlzXG4gICAgICApIC0gMTtcbiAgICB9XG4gIH1cbiAgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG4gIHJ1bihmbikge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3RTY29wZSA9IGFjdGl2ZUVmZmVjdFNjb3BlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gY3VycmVudEVmZmVjdFNjb3BlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihgY2Fubm90IHJ1biBhbiBpbmFjdGl2ZSBlZmZlY3Qgc2NvcGUuYCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb24oKSB7XG4gICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb2ZmKCkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcy5wYXJlbnQ7XG4gIH1cbiAgc3RvcChmcm9tUGFyZW50KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgbGV0IGksIGw7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5lZmZlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmVmZmVjdHNbaV0uc3RvcCgpO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuY2xlYW51cHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cHNbaV0oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNjb3Blcykge1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5zY29wZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5zY29wZXNbaV0uc3RvcCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmRldGFjaGVkICYmIHRoaXMucGFyZW50ICYmICFmcm9tUGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnBhcmVudC5zY29wZXMucG9wKCk7XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3QgIT09IHRoaXMpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5zY29wZXNbdGhpcy5pbmRleF0gPSBsYXN0O1xuICAgICAgICAgIGxhc3QuaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmVudCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZWZmZWN0U2NvcGUoZGV0YWNoZWQpIHtcbiAgcmV0dXJuIG5ldyBFZmZlY3RTY29wZShkZXRhY2hlZCk7XG59XG5mdW5jdGlvbiByZWNvcmRFZmZlY3RTY29wZShlZmZlY3QsIHNjb3BlID0gYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgaWYgKHNjb3BlICYmIHNjb3BlLmFjdGl2ZSkge1xuICAgIHNjb3BlLmVmZmVjdHMucHVzaChlZmZlY3QpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50U2NvcGUoKSB7XG4gIHJldHVybiBhY3RpdmVFZmZlY3RTY29wZTtcbn1cbmZ1bmN0aW9uIG9uU2NvcGVEaXNwb3NlKGZuKSB7XG4gIGlmIChhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlLmNsZWFudXBzLnB1c2goZm4pO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuKFxuICAgICAgYG9uU2NvcGVEaXNwb3NlKCkgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGVmZmVjdCBzY29wZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlRGVwID0gKGVmZmVjdHMpID0+IHtcbiAgY29uc3QgZGVwID0gbmV3IFNldChlZmZlY3RzKTtcbiAgZGVwLncgPSAwO1xuICBkZXAubiA9IDA7XG4gIHJldHVybiBkZXA7XG59O1xuY29uc3Qgd2FzVHJhY2tlZCA9IChkZXApID0+IChkZXAudyAmIHRyYWNrT3BCaXQpID4gMDtcbmNvbnN0IG5ld1RyYWNrZWQgPSAoZGVwKSA9PiAoZGVwLm4gJiB0cmFja09wQml0KSA+IDA7XG5jb25zdCBpbml0RGVwTWFya2VycyA9ICh7IGRlcHMgfSkgPT4ge1xuICBpZiAoZGVwcy5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlcHNbaV0udyB8PSB0cmFja09wQml0O1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IGZpbmFsaXplRGVwTWFya2VycyA9IChlZmZlY3QpID0+IHtcbiAgY29uc3QgeyBkZXBzIH0gPSBlZmZlY3Q7XG4gIGlmIChkZXBzLmxlbmd0aCkge1xuICAgIGxldCBwdHIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZGVwID0gZGVwc1tpXTtcbiAgICAgIGlmICh3YXNUcmFja2VkKGRlcCkgJiYgIW5ld1RyYWNrZWQoZGVwKSkge1xuICAgICAgICBkZXAuZGVsZXRlKGVmZmVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXBzW3B0cisrXSA9IGRlcDtcbiAgICAgIH1cbiAgICAgIGRlcC53ICY9IH50cmFja09wQml0O1xuICAgICAgZGVwLm4gJj0gfnRyYWNrT3BCaXQ7XG4gICAgfVxuICAgIGRlcHMubGVuZ3RoID0gcHRyO1xuICB9XG59O1xuXG5jb25zdCB0YXJnZXRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmxldCBlZmZlY3RUcmFja0RlcHRoID0gMDtcbmxldCB0cmFja09wQml0ID0gMTtcbmNvbnN0IG1heE1hcmtlckJpdHMgPSAzMDtcbmxldCBhY3RpdmVFZmZlY3Q7XG5jb25zdCBJVEVSQVRFX0tFWSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gXCJpdGVyYXRlXCIgOiBcIlwiKTtcbmNvbnN0IE1BUF9LRVlfSVRFUkFURV9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiTWFwIGtleSBpdGVyYXRlXCIgOiBcIlwiKTtcbmNsYXNzIFJlYWN0aXZlRWZmZWN0IHtcbiAgY29uc3RydWN0b3IoZm4sIHNjaGVkdWxlciA9IG51bGwsIHNjb3BlKSB7XG4gICAgdGhpcy5mbiA9IGZuO1xuICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLmRlcHMgPSBbXTtcbiAgICB0aGlzLnBhcmVudCA9IHZvaWQgMDtcbiAgICByZWNvcmRFZmZlY3RTY29wZSh0aGlzLCBzY29wZSk7XG4gIH1cbiAgcnVuKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZuKCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQgPSBhY3RpdmVFZmZlY3Q7XG4gICAgbGV0IGxhc3RTaG91bGRUcmFjayA9IHNob3VsZFRyYWNrO1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucGFyZW50ID0gYWN0aXZlRWZmZWN0O1xuICAgICAgYWN0aXZlRWZmZWN0ID0gdGhpcztcbiAgICAgIHNob3VsZFRyYWNrID0gdHJ1ZTtcbiAgICAgIHRyYWNrT3BCaXQgPSAxIDw8ICsrZWZmZWN0VHJhY2tEZXB0aDtcbiAgICAgIGlmIChlZmZlY3RUcmFja0RlcHRoIDw9IG1heE1hcmtlckJpdHMpIHtcbiAgICAgICAgaW5pdERlcE1hcmtlcnModGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGVmZmVjdFRyYWNrRGVwdGggPD0gbWF4TWFya2VyQml0cykge1xuICAgICAgICBmaW5hbGl6ZURlcE1hcmtlcnModGhpcyk7XG4gICAgICB9XG4gICAgICB0cmFja09wQml0ID0gMSA8PCAtLWVmZmVjdFRyYWNrRGVwdGg7XG4gICAgICBhY3RpdmVFZmZlY3QgPSB0aGlzLnBhcmVudDtcbiAgICAgIHNob3VsZFRyYWNrID0gbGFzdFNob3VsZFRyYWNrO1xuICAgICAgdGhpcy5wYXJlbnQgPSB2b2lkIDA7XG4gICAgICBpZiAodGhpcy5kZWZlclN0b3ApIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHN0b3AoKSB7XG4gICAgaWYgKGFjdGl2ZUVmZmVjdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5kZWZlclN0b3AgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgIGNsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICBpZiAodGhpcy5vblN0b3ApIHtcbiAgICAgICAgdGhpcy5vblN0b3AoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjbGVhbnVwRWZmZWN0KGVmZmVjdDIpIHtcbiAgY29uc3QgeyBkZXBzIH0gPSBlZmZlY3QyO1xuICBpZiAoZGVwcy5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlcHNbaV0uZGVsZXRlKGVmZmVjdDIpO1xuICAgIH1cbiAgICBkZXBzLmxlbmd0aCA9IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdChmbiwgb3B0aW9ucykge1xuICBpZiAoZm4uZWZmZWN0IGluc3RhbmNlb2YgUmVhY3RpdmVFZmZlY3QpIHtcbiAgICBmbiA9IGZuLmVmZmVjdC5mbjtcbiAgfVxuICBjb25zdCBfZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KGZuKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBleHRlbmQoX2VmZmVjdCwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuc2NvcGUpXG4gICAgICByZWNvcmRFZmZlY3RTY29wZShfZWZmZWN0LCBvcHRpb25zLnNjb3BlKTtcbiAgfVxuICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF6eSkge1xuICAgIF9lZmZlY3QucnVuKCk7XG4gIH1cbiAgY29uc3QgcnVubmVyID0gX2VmZmVjdC5ydW4uYmluZChfZWZmZWN0KTtcbiAgcnVubmVyLmVmZmVjdCA9IF9lZmZlY3Q7XG4gIHJldHVybiBydW5uZXI7XG59XG5mdW5jdGlvbiBzdG9wKHJ1bm5lcikge1xuICBydW5uZXIuZWZmZWN0LnN0b3AoKTtcbn1cbmxldCBzaG91bGRUcmFjayA9IHRydWU7XG5jb25zdCB0cmFja1N0YWNrID0gW107XG5mdW5jdGlvbiBwYXVzZVRyYWNraW5nKCkge1xuICB0cmFja1N0YWNrLnB1c2goc2hvdWxkVHJhY2spO1xuICBzaG91bGRUcmFjayA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZW5hYmxlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGxhc3QgPSB0cmFja1N0YWNrLnBvcCgpO1xuICBzaG91bGRUcmFjayA9IGxhc3QgPT09IHZvaWQgMCA/IHRydWUgOiBsYXN0O1xufVxuZnVuY3Rpb24gdHJhY2sodGFyZ2V0LCB0eXBlLCBrZXkpIHtcbiAgaWYgKHNob3VsZFRyYWNrICYmIGFjdGl2ZUVmZmVjdCkge1xuICAgIGxldCBkZXBzTWFwID0gdGFyZ2V0TWFwLmdldCh0YXJnZXQpO1xuICAgIGlmICghZGVwc01hcCkge1xuICAgICAgdGFyZ2V0TWFwLnNldCh0YXJnZXQsIGRlcHNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgbGV0IGRlcCA9IGRlcHNNYXAuZ2V0KGtleSk7XG4gICAgaWYgKCFkZXApIHtcbiAgICAgIGRlcHNNYXAuc2V0KGtleSwgZGVwID0gY3JlYXRlRGVwKCkpO1xuICAgIH1cbiAgICBjb25zdCBldmVudEluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8geyBlZmZlY3Q6IGFjdGl2ZUVmZmVjdCwgdGFyZ2V0LCB0eXBlLCBrZXkgfSA6IHZvaWQgMDtcbiAgICB0cmFja0VmZmVjdHMoZGVwLCBldmVudEluZm8pO1xuICB9XG59XG5mdW5jdGlvbiB0cmFja0VmZmVjdHMoZGVwLCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKSB7XG4gIGxldCBzaG91bGRUcmFjazIgPSBmYWxzZTtcbiAgaWYgKGVmZmVjdFRyYWNrRGVwdGggPD0gbWF4TWFya2VyQml0cykge1xuICAgIGlmICghbmV3VHJhY2tlZChkZXApKSB7XG4gICAgICBkZXAubiB8PSB0cmFja09wQml0O1xuICAgICAgc2hvdWxkVHJhY2syID0gIXdhc1RyYWNrZWQoZGVwKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2hvdWxkVHJhY2syID0gIWRlcC5oYXMoYWN0aXZlRWZmZWN0KTtcbiAgfVxuICBpZiAoc2hvdWxkVHJhY2syKSB7XG4gICAgZGVwLmFkZChhY3RpdmVFZmZlY3QpO1xuICAgIGFjdGl2ZUVmZmVjdC5kZXBzLnB1c2goZGVwKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhY3RpdmVFZmZlY3Qub25UcmFjaykge1xuICAgICAgYWN0aXZlRWZmZWN0Lm9uVHJhY2soXG4gICAgICAgIGV4dGVuZChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlZmZlY3Q6IGFjdGl2ZUVmZmVjdFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVidWdnZXJFdmVudEV4dHJhSW5mb1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlcih0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQpIHtcbiAgY29uc3QgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKCFkZXBzTWFwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBkZXBzID0gW107XG4gIGlmICh0eXBlID09PSBcImNsZWFyXCIpIHtcbiAgICBkZXBzID0gWy4uLmRlcHNNYXAudmFsdWVzKCldO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJsZW5ndGhcIiAmJiBpc0FycmF5KHRhcmdldCkpIHtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBOdW1iZXIobmV3VmFsdWUpO1xuICAgIGRlcHNNYXAuZm9yRWFjaCgoZGVwLCBrZXkyKSA9PiB7XG4gICAgICBpZiAoa2V5MiA9PT0gXCJsZW5ndGhcIiB8fCAhaXNTeW1ib2woa2V5MikgJiYga2V5MiA+PSBuZXdMZW5ndGgpIHtcbiAgICAgICAgZGVwcy5wdXNoKGRlcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGtleSAhPT0gdm9pZCAwKSB7XG4gICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoa2V5KSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0ludGVnZXJLZXkoa2V5KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChcImxlbmd0aFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgIGlmICghaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudEluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8geyB0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQgfSA6IHZvaWQgMDtcbiAgaWYgKGRlcHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKGRlcHNbMF0pIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRyaWdnZXJFZmZlY3RzKGRlcHNbMF0sIGV2ZW50SW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRWZmZWN0cyhkZXBzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZWZmZWN0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIGlmIChkZXApIHtcbiAgICAgICAgZWZmZWN0cy5wdXNoKC4uLmRlcCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0cmlnZ2VyRWZmZWN0cyhjcmVhdGVEZXAoZWZmZWN0cyksIGV2ZW50SW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFZmZlY3RzKGNyZWF0ZURlcChlZmZlY3RzKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyRWZmZWN0cyhkZXAsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgY29uc3QgZWZmZWN0cyA9IGlzQXJyYXkoZGVwKSA/IGRlcCA6IFsuLi5kZXBdO1xuICBmb3IgKGNvbnN0IGVmZmVjdDIgb2YgZWZmZWN0cykge1xuICAgIGlmIChlZmZlY3QyLmNvbXB1dGVkKSB7XG4gICAgICB0cmlnZ2VyRWZmZWN0KGVmZmVjdDIsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGVmZmVjdDIgb2YgZWZmZWN0cykge1xuICAgIGlmICghZWZmZWN0Mi5jb21wdXRlZCkge1xuICAgICAgdHJpZ2dlckVmZmVjdChlZmZlY3QyLCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJFZmZlY3QoZWZmZWN0MiwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICBpZiAoZWZmZWN0MiAhPT0gYWN0aXZlRWZmZWN0IHx8IGVmZmVjdDIuYWxsb3dSZWN1cnNlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZWZmZWN0Mi5vblRyaWdnZXIpIHtcbiAgICAgIGVmZmVjdDIub25UcmlnZ2VyKGV4dGVuZCh7IGVmZmVjdDogZWZmZWN0MiB9LCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKSk7XG4gICAgfVxuICAgIGlmIChlZmZlY3QyLnNjaGVkdWxlcikge1xuICAgICAgZWZmZWN0Mi5zY2hlZHVsZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0Mi5ydW4oKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldERlcEZyb21SZWFjdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSB0YXJnZXRNYXAuZ2V0KG9iamVjdCkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5nZXQoa2V5KTtcbn1cblxuY29uc3QgaXNOb25UcmFja2FibGVLZXlzID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApO1xuY29uc3QgYnVpbHRJblN5bWJvbHMgPSBuZXcgU2V0KFxuICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcImFyZ3VtZW50c1wiICYmIGtleSAhPT0gXCJjYWxsZXJcIikubWFwKChrZXkpID0+IFN5bWJvbFtrZXldKS5maWx0ZXIoaXNTeW1ib2wpXG4pO1xuY29uc3QgYXJyYXlJbnN0cnVtZW50YXRpb25zID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpO1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlJbnN0cnVtZW50YXRpb25zKCkge1xuICBjb25zdCBpbnN0cnVtZW50YXRpb25zID0ge307XG4gIFtcImluY2x1ZGVzXCIsIFwiaW5kZXhPZlwiLCBcImxhc3RJbmRleE9mXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGFyciA9IHRvUmF3KHRoaXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0cmFjayhhcnIsIFwiZ2V0XCIsIGkgKyBcIlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGFycltrZXldKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJlcyA9PT0gLTEgfHwgcmVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXJyW2tleV0oLi4uYXJncy5tYXAodG9SYXcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIFtcInB1c2hcIiwgXCJwb3BcIiwgXCJzaGlmdFwiLCBcInVuc2hpZnRcIiwgXCJzcGxpY2VcIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaW5zdHJ1bWVudGF0aW9uc1trZXldID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgY29uc3QgcmVzID0gdG9SYXcodGhpcylba2V5XS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVtZW50YXRpb25zO1xufVxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkoa2V5KSB7XG4gIGNvbnN0IG9iaiA9IHRvUmF3KHRoaXMpO1xuICB0cmFjayhvYmosIFwiaGFzXCIsIGtleSk7XG4gIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbn1cbmNsYXNzIEJhc2VSZWFjdGl2ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihfaXNSZWFkb25seSA9IGZhbHNlLCBfc2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgdGhpcy5faXNSZWFkb25seSA9IF9pc1JlYWRvbmx5O1xuICAgIHRoaXMuX3NoYWxsb3cgPSBfc2hhbGxvdztcbiAgfVxuICBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgY29uc3QgaXNSZWFkb25seTIgPSB0aGlzLl9pc1JlYWRvbmx5LCBzaGFsbG93ID0gdGhpcy5fc2hhbGxvdztcbiAgICBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWN0aXZlXCIpIHtcbiAgICAgIHJldHVybiAhaXNSZWFkb25seTI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzUmVhZG9ubHlcIikge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1NoYWxsb3dcIikge1xuICAgICAgcmV0dXJuIHNoYWxsb3c7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X3Jhd1wiICYmIHJlY2VpdmVyID09PSAoaXNSZWFkb25seTIgPyBzaGFsbG93ID8gc2hhbGxvd1JlYWRvbmx5TWFwIDogcmVhZG9ubHlNYXAgOiBzaGFsbG93ID8gc2hhbGxvd1JlYWN0aXZlTWFwIDogcmVhY3RpdmVNYXApLmdldCh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJc0FycmF5ID0gaXNBcnJheSh0YXJnZXQpO1xuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGhhc093bihhcnJheUluc3RydW1lbnRhdGlvbnMsIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGFycmF5SW5zdHJ1bWVudGF0aW9ucywga2V5LCByZWNlaXZlcik7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcImhhc093blByb3BlcnR5XCIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hhbGxvdykge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGlzUmVmKHJlcykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpID8gcmVzIDogcmVzLnZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QocmVzKSkge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyID8gcmVhZG9ubHkocmVzKSA6IHJlYWN0aXZlKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmNsYXNzIE11dGFibGVSZWFjdGl2ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZmFsc2UsIHNoYWxsb3cpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgbGV0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKGlzUmVhZG9ubHkob2xkVmFsdWUpICYmIGlzUmVmKG9sZFZhbHVlKSAmJiAhaXNSZWYodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc2hhbGxvdykge1xuICAgICAgaWYgKCFpc1NoYWxsb3codmFsdWUpICYmICFpc1JlYWRvbmx5KHZhbHVlKSkge1xuICAgICAgICBvbGRWYWx1ZSA9IHRvUmF3KG9sZFZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSAmJiBpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICBvbGRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaGFkS2V5ID0gaXNBcnJheSh0YXJnZXQpICYmIGlzSW50ZWdlcktleShrZXkpID8gTnVtYmVyKGtleSkgPCB0YXJnZXQubGVuZ3RoIDogaGFzT3duKHRhcmdldCwga2V5KTtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICBpZiAodGFyZ2V0ID09PSB0b1JhdyhyZWNlaXZlcikpIHtcbiAgICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcInNldFwiLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCBoYWRLZXkgPSBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSk7XG4gICAgaWYgKHJlc3VsdCAmJiBoYWRLZXkpIHtcbiAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiLCBrZXksIHZvaWQgMCwgb2xkVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGhhcyh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuaGFzKHRhcmdldCwga2V5KTtcbiAgICBpZiAoIWlzU3ltYm9sKGtleSkgfHwgIWJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpKSB7XG4gICAgICB0cmFjayh0YXJnZXQsIFwiaGFzXCIsIGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgb3duS2V5cyh0YXJnZXQpIHtcbiAgICB0cmFjayhcbiAgICAgIHRhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNBcnJheSh0YXJnZXQpID8gXCJsZW5ndGhcIiA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH1cbn1cbmNsYXNzIFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHNoYWxsb3cgPSBmYWxzZSkge1xuICAgIHN1cGVyKHRydWUsIHNoYWxsb3cpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgU2V0IG9wZXJhdGlvbiBvbiBrZXkgXCIke1N0cmluZyhrZXkpfVwiIGZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYERlbGV0ZSBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5jb25zdCBtdXRhYmxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIoKTtcbmNvbnN0IHJlYWRvbmx5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTXV0YWJsZVJlYWN0aXZlSGFuZGxlcihcbiAgdHJ1ZVxuKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcih0cnVlKTtcblxuY29uc3QgdG9TaGFsbG93ID0gKHZhbHVlKSA9PiB2YWx1ZTtcbmNvbnN0IGdldFByb3RvID0gKHYpID0+IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yodik7XG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIGlzUmVhZG9ubHkgPSBmYWxzZSwgaXNTaGFsbG93ID0gZmFsc2UpIHtcbiAgdGFyZ2V0ID0gdGFyZ2V0W1wiX192X3Jhd1wiXTtcbiAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgaWYgKCFpc1JlYWRvbmx5KSB7XG4gICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICB0cmFjayhyYXdUYXJnZXQsIFwiZ2V0XCIsIGtleSk7XG4gICAgfVxuICAgIHRyYWNrKHJhd1RhcmdldCwgXCJnZXRcIiwgcmF3S2V5KTtcbiAgfVxuICBjb25zdCB7IGhhczogaGFzMiB9ID0gZ2V0UHJvdG8ocmF3VGFyZ2V0KTtcbiAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdyA/IHRvU2hhbGxvdyA6IGlzUmVhZG9ubHkgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgaWYgKGhhczIuY2FsbChyYXdUYXJnZXQsIGtleSkpIHtcbiAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KGtleSkpO1xuICB9IGVsc2UgaWYgKGhhczIuY2FsbChyYXdUYXJnZXQsIHJhd0tleSkpIHtcbiAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KHJhd0tleSkpO1xuICB9IGVsc2UgaWYgKHRhcmdldCAhPT0gcmF3VGFyZ2V0KSB7XG4gICAgdGFyZ2V0LmdldChrZXkpO1xuICB9XG59XG5mdW5jdGlvbiBoYXMoa2V5LCBpc1JlYWRvbmx5ID0gZmFsc2UpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmICghaXNSZWFkb25seSkge1xuICAgIGlmIChoYXNDaGFuZ2VkKGtleSwgcmF3S2V5KSkge1xuICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImhhc1wiLCBrZXkpO1xuICAgIH1cbiAgICB0cmFjayhyYXdUYXJnZXQsIFwiaGFzXCIsIHJhd0tleSk7XG4gIH1cbiAgcmV0dXJuIGtleSA9PT0gcmF3S2V5ID8gdGFyZ2V0LmhhcyhrZXkpIDogdGFyZ2V0LmhhcyhrZXkpIHx8IHRhcmdldC5oYXMocmF3S2V5KTtcbn1cbmZ1bmN0aW9uIHNpemUodGFyZ2V0LCBpc1JlYWRvbmx5ID0gZmFsc2UpIHtcbiAgdGFyZ2V0ID0gdGFyZ2V0W1wiX192X3Jhd1wiXTtcbiAgIWlzUmVhZG9ubHkgJiYgdHJhY2sodG9SYXcodGFyZ2V0KSwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgXCJzaXplXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCBwcm90byA9IGdldFByb3RvKHRhcmdldCk7XG4gIGNvbnN0IGhhZEtleSA9IHByb3RvLmhhcy5jYWxsKHRhcmdldCwgdmFsdWUpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIHRhcmdldC5hZGQodmFsdWUpO1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCB2YWx1ZSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCB7IGhhczogaGFzMiwgZ2V0OiBnZXQyIH0gPSBnZXRQcm90byh0YXJnZXQpO1xuICBsZXQgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBrZXkgPSB0b1JhdyhrZXkpO1xuICAgIGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KTtcbiAgfVxuICBjb25zdCBvbGRWYWx1ZSA9IGdldDIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIHRhcmdldC5zZXQoa2V5LCB2YWx1ZSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiYWRkXCIsIGtleSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKGhhc0NoYW5nZWQodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcInNldFwiLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5mdW5jdGlvbiBkZWxldGVFbnRyeShrZXkpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IHsgaGFzOiBoYXMyLCBnZXQ6IGdldDIgfSA9IGdldFByb3RvKHRhcmdldCk7XG4gIGxldCBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIGtleSA9IHRvUmF3KGtleSk7XG4gICAgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY2hlY2tJZGVudGl0eUtleXModGFyZ2V0LCBoYXMyLCBrZXkpO1xuICB9XG4gIGNvbnN0IG9sZFZhbHVlID0gZ2V0MiA/IGdldDIuY2FsbCh0YXJnZXQsIGtleSkgOiB2b2lkIDA7XG4gIGNvbnN0IHJlc3VsdCA9IHRhcmdldC5kZWxldGUoa2V5KTtcbiAgaWYgKGhhZEtleSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiLCBrZXksIHZvaWQgMCwgb2xkVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjbGVhcigpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IGhhZEl0ZW1zID0gdGFyZ2V0LnNpemUgIT09IDA7XG4gIGNvbnN0IG9sZFRhcmdldCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBpc01hcCh0YXJnZXQpID8gbmV3IE1hcCh0YXJnZXQpIDogbmV3IFNldCh0YXJnZXQpIDogdm9pZCAwO1xuICBjb25zdCByZXN1bHQgPSB0YXJnZXQuY2xlYXIoKTtcbiAgaWYgKGhhZEl0ZW1zKSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiY2xlYXJcIiwgdm9pZCAwLCB2b2lkIDAsIG9sZFRhcmdldCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZvckVhY2goaXNSZWFkb25seSwgaXNTaGFsbG93KSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSB0aGlzO1xuICAgIGNvbnN0IHRhcmdldCA9IG9ic2VydmVkW1wiX192X3Jhd1wiXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgIWlzUmVhZG9ubHkgJiYgdHJhY2socmF3VGFyZ2V0LCBcIml0ZXJhdGVcIiwgSVRFUkFURV9LRVkpO1xuICAgIHJldHVybiB0YXJnZXQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgd3JhcCh2YWx1ZSksIHdyYXAoa2V5KSwgb2JzZXJ2ZWQpO1xuICAgIH0pO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCBpc1JlYWRvbmx5LCBpc1NoYWxsb3cpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzW1wiX192X3Jhd1wiXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHRhcmdldElzTWFwID0gaXNNYXAocmF3VGFyZ2V0KTtcbiAgICBjb25zdCBpc1BhaXIgPSBtZXRob2QgPT09IFwiZW50cmllc1wiIHx8IG1ldGhvZCA9PT0gU3ltYm9sLml0ZXJhdG9yICYmIHRhcmdldElzTWFwO1xuICAgIGNvbnN0IGlzS2V5T25seSA9IG1ldGhvZCA9PT0gXCJrZXlzXCIgJiYgdGFyZ2V0SXNNYXA7XG4gICAgY29uc3QgaW5uZXJJdGVyYXRvciA9IHRhcmdldFttZXRob2RdKC4uLmFyZ3MpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgIWlzUmVhZG9ubHkgJiYgdHJhY2soXG4gICAgICByYXdUYXJnZXQsXG4gICAgICBcIml0ZXJhdGVcIixcbiAgICAgIGlzS2V5T25seSA/IE1BUF9LRVlfSVRFUkFURV9LRVkgOiBJVEVSQVRFX0tFWVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGl0ZXJhdG9yIHByb3RvY29sXG4gICAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBpbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGRvbmUgPyB7IHZhbHVlLCBkb25lIH0gOiB7XG4gICAgICAgICAgdmFsdWU6IGlzUGFpciA/IFt3cmFwKHZhbHVlWzBdKSwgd3JhcCh2YWx1ZVsxXSldIDogd3JhcCh2YWx1ZSksXG4gICAgICAgICAgZG9uZVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIC8vIGl0ZXJhYmxlIHByb3RvY29sXG4gICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlYWRvbmx5TWV0aG9kKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnc1swXSA/IGBvbiBrZXkgXCIke2FyZ3NbMF19XCIgYCA6IGBgO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtjYXBpdGFsaXplKHR5cGUpfSBvcGVyYXRpb24gJHtrZXl9ZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdG9SYXcodGhpcylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlID09PSBcImRlbGV0ZVwiID8gZmFsc2UgOiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgY29uc3QgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkLFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIGNsZWFyLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIGZhbHNlKVxuICB9O1xuICBjb25zdCBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIGZhbHNlLCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkLFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIGNsZWFyLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIHRydWUpXG4gIH07XG4gIGNvbnN0IHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiKSxcbiAgICBzZXQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwic2V0XCIpLFxuICAgIGRlbGV0ZTogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJkZWxldGVcIiksXG4gICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIiksXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaCh0cnVlLCBmYWxzZSlcbiAgfTtcbiAgY29uc3Qgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUsIHRydWUpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiKSxcbiAgICBzZXQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwic2V0XCIpLFxuICAgIGRlbGV0ZTogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJkZWxldGVcIiksXG4gICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIiksXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaCh0cnVlLCB0cnVlKVxuICB9O1xuICBjb25zdCBpdGVyYXRvck1ldGhvZHMgPSBbXCJrZXlzXCIsIFwidmFsdWVzXCIsIFwiZW50cmllc1wiLCBTeW1ib2wuaXRlcmF0b3JdO1xuICBpdGVyYXRvck1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIGZhbHNlLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgdHJ1ZSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgZmFsc2UsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICB0cnVlLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuICByZXR1cm4gW1xuICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zMixcbiAgICByZWFkb25seUluc3RydW1lbnRhdGlvbnMyLFxuICAgIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zMixcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlxuICBdO1xufVxuY29uc3QgW1xuICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9ucyxcbiAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zLFxuICBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyxcbiAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uc1xuXSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25zKCk7XG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoaXNSZWFkb25seSwgc2hhbGxvdykge1xuICBjb25zdCBpbnN0cnVtZW50YXRpb25zID0gc2hhbGxvdyA/IGlzUmVhZG9ubHkgPyBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIDogc2hhbGxvd0luc3RydW1lbnRhdGlvbnMgOiBpc1JlYWRvbmx5ID8gcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIDogbXV0YWJsZUluc3RydW1lbnRhdGlvbnM7XG4gIHJldHVybiAodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzUmVhZG9ubHlcIikge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X3Jhd1wiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICByZXR1cm4gUmVmbGVjdC5nZXQoXG4gICAgICBoYXNPd24oaW5zdHJ1bWVudGF0aW9ucywga2V5KSAmJiBrZXkgaW4gdGFyZ2V0ID8gaW5zdHJ1bWVudGF0aW9ucyA6IHRhcmdldCxcbiAgICAgIGtleSxcbiAgICAgIHJlY2VpdmVyXG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IG11dGFibGVDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcihmYWxzZSwgZmFsc2UpXG59O1xuY29uc3Qgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGZhbHNlLCB0cnVlKVxufTtcbmNvbnN0IHJlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIodHJ1ZSwgZmFsc2UpXG59O1xuY29uc3Qgc2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIodHJ1ZSwgdHJ1ZSlcbn07XG5mdW5jdGlvbiBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSkge1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAocmF3S2V5ICE9PSBrZXkgJiYgaGFzMi5jYWxsKHRhcmdldCwgcmF3S2V5KSkge1xuICAgIGNvbnN0IHR5cGUgPSB0b1Jhd1R5cGUodGFyZ2V0KTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgUmVhY3RpdmUgJHt0eXBlfSBjb250YWlucyBib3RoIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIHRoZSBzYW1lIG9iamVjdCR7dHlwZSA9PT0gYE1hcGAgPyBgIGFzIGtleXNgIDogYGB9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFjdGl2ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gdGFyZ2V0VHlwZU1hcChyYXdUeXBlKSB7XG4gIHN3aXRjaCAocmF3VHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RcIjpcbiAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgIHJldHVybiAxIC8qIENPTU1PTiAqLztcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICAgIHJldHVybiAyIC8qIENPTExFQ1RJT04gKi87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwIC8qIElOVkFMSUQgKi87XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhcmdldFR5cGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlW1wiX192X3NraXBcIl0gfHwgIU9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpID8gMCAvKiBJTlZBTElEICovIDogdGFyZ2V0VHlwZU1hcCh0b1Jhd1R5cGUodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIHJlYWN0aXZlKHRhcmdldCkge1xuICBpZiAoaXNSZWFkb25seSh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIGZhbHNlLFxuICAgIG11dGFibGVIYW5kbGVycyxcbiAgICBtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHJlYWN0aXZlTWFwXG4gICk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVhY3RpdmUodGFyZ2V0KSB7XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgZmFsc2UsXG4gICAgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMsXG4gICAgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhY3RpdmVNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHJlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgcmVhZG9ubHlIYW5kbGVycyxcbiAgICByZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICByZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgc2hhbGxvd1JlYWRvbmx5SGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVPYmplY3QodGFyZ2V0LCBpc1JlYWRvbmx5MiwgYmFzZUhhbmRsZXJzLCBjb2xsZWN0aW9uSGFuZGxlcnMsIHByb3h5TWFwKSB7XG4gIGlmICghaXNPYmplY3QodGFyZ2V0KSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYHZhbHVlIGNhbm5vdCBiZSBtYWRlIHJlYWN0aXZlOiAke1N0cmluZyh0YXJnZXQpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGlmICh0YXJnZXRbXCJfX3ZfcmF3XCJdICYmICEoaXNSZWFkb25seTIgJiYgdGFyZ2V0W1wiX192X2lzUmVhY3RpdmVcIl0pKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBjb25zdCBleGlzdGluZ1Byb3h5ID0gcHJveHlNYXAuZ2V0KHRhcmdldCk7XG4gIGlmIChleGlzdGluZ1Byb3h5KSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nUHJveHk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFRhcmdldFR5cGUodGFyZ2V0KTtcbiAgaWYgKHRhcmdldFR5cGUgPT09IDAgLyogSU5WQUxJRCAqLykge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoXG4gICAgdGFyZ2V0LFxuICAgIHRhcmdldFR5cGUgPT09IDIgLyogQ09MTEVDVElPTiAqLyA/IGNvbGxlY3Rpb25IYW5kbGVycyA6IGJhc2VIYW5kbGVyc1xuICApO1xuICBwcm94eU1hcC5zZXQodGFyZ2V0LCBwcm94eSk7XG4gIHJldHVybiBwcm94eTtcbn1cbmZ1bmN0aW9uIGlzUmVhY3RpdmUodmFsdWUpIHtcbiAgaWYgKGlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGlzUmVhY3RpdmUodmFsdWVbXCJfX3ZfcmF3XCJdKTtcbiAgfVxuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNSZWFjdGl2ZVwiXSk7XG59XG5mdW5jdGlvbiBpc1JlYWRvbmx5KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1JlYWRvbmx5XCJdKTtcbn1cbmZ1bmN0aW9uIGlzU2hhbGxvdyh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNTaGFsbG93XCJdKTtcbn1cbmZ1bmN0aW9uIGlzUHJveHkodmFsdWUpIHtcbiAgcmV0dXJuIGlzUmVhY3RpdmUodmFsdWUpIHx8IGlzUmVhZG9ubHkodmFsdWUpO1xufVxuZnVuY3Rpb24gdG9SYXcob2JzZXJ2ZWQpIHtcbiAgY29uc3QgcmF3ID0gb2JzZXJ2ZWQgJiYgb2JzZXJ2ZWRbXCJfX3ZfcmF3XCJdO1xuICByZXR1cm4gcmF3ID8gdG9SYXcocmF3KSA6IG9ic2VydmVkO1xufVxuZnVuY3Rpb24gbWFya1Jhdyh2YWx1ZSkge1xuICBkZWYodmFsdWUsIFwiX192X3NraXBcIiwgdHJ1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IHRvUmVhY3RpdmUgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSA/IHJlYWN0aXZlKHZhbHVlKSA6IHZhbHVlO1xuY29uc3QgdG9SZWFkb25seSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gcmVhZG9ubHkodmFsdWUpIDogdmFsdWU7XG5cbmZ1bmN0aW9uIHRyYWNrUmVmVmFsdWUocmVmMikge1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0cmFja0VmZmVjdHMocmVmMi5kZXAgfHwgKHJlZjIuZGVwID0gY3JlYXRlRGVwKCkpLCB7XG4gICAgICAgIHRhcmdldDogcmVmMixcbiAgICAgICAgdHlwZTogXCJnZXRcIixcbiAgICAgICAga2V5OiBcInZhbHVlXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFja0VmZmVjdHMocmVmMi5kZXAgfHwgKHJlZjIuZGVwID0gY3JlYXRlRGVwKCkpKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWZWYWx1ZShyZWYyLCBuZXdWYWwpIHtcbiAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICBjb25zdCBkZXAgPSByZWYyLmRlcDtcbiAgaWYgKGRlcCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0cmlnZ2VyRWZmZWN0cyhkZXAsIHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIixcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFZmZlY3RzKGRlcCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc1JlZihyKSB7XG4gIHJldHVybiAhIShyICYmIHIuX192X2lzUmVmID09PSB0cnVlKTtcbn1cbmZ1bmN0aW9uIHJlZih2YWx1ZSkge1xuICByZXR1cm4gY3JlYXRlUmVmKHZhbHVlLCBmYWxzZSk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVmKHZhbHVlKSB7XG4gIHJldHVybiBjcmVhdGVSZWYodmFsdWUsIHRydWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVmKHJhd1ZhbHVlLCBzaGFsbG93KSB7XG4gIGlmIChpc1JlZihyYXdWYWx1ZSkpIHtcbiAgICByZXR1cm4gcmF3VmFsdWU7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZWZJbXBsKHJhd1ZhbHVlLCBzaGFsbG93KTtcbn1cbmNsYXNzIFJlZkltcGwge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgX192X2lzU2hhbGxvdykge1xuICAgIHRoaXMuX192X2lzU2hhbGxvdyA9IF9fdl9pc1NoYWxsb3c7XG4gICAgdGhpcy5kZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXMuX3Jhd1ZhbHVlID0gX192X2lzU2hhbGxvdyA/IHZhbHVlIDogdG9SYXcodmFsdWUpO1xuICAgIHRoaXMuX3ZhbHVlID0gX192X2lzU2hhbGxvdyA/IHZhbHVlIDogdG9SZWFjdGl2ZSh2YWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHRyYWNrUmVmVmFsdWUodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICBjb25zdCB1c2VEaXJlY3RWYWx1ZSA9IHRoaXMuX192X2lzU2hhbGxvdyB8fCBpc1NoYWxsb3cobmV3VmFsKSB8fCBpc1JlYWRvbmx5KG5ld1ZhbCk7XG4gICAgbmV3VmFsID0gdXNlRGlyZWN0VmFsdWUgPyBuZXdWYWwgOiB0b1JhdyhuZXdWYWwpO1xuICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbCwgdGhpcy5fcmF3VmFsdWUpKSB7XG4gICAgICB0aGlzLl9yYXdWYWx1ZSA9IG5ld1ZhbDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdXNlRGlyZWN0VmFsdWUgPyBuZXdWYWwgOiB0b1JlYWN0aXZlKG5ld1ZhbCk7XG4gICAgICB0cmlnZ2VyUmVmVmFsdWUodGhpcywgbmV3VmFsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWYocmVmMikge1xuICB0cmlnZ2VyUmVmVmFsdWUocmVmMiwgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHJlZjIudmFsdWUgOiB2b2lkIDApO1xufVxuZnVuY3Rpb24gdW5yZWYocmVmMikge1xuICByZXR1cm4gaXNSZWYocmVmMikgPyByZWYyLnZhbHVlIDogcmVmMjtcbn1cbmZ1bmN0aW9uIHRvVmFsdWUoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSkgPyBzb3VyY2UoKSA6IHVucmVmKHNvdXJjZSk7XG59XG5jb25zdCBzaGFsbG93VW53cmFwSGFuZGxlcnMgPSB7XG4gIGdldDogKHRhcmdldCwga2V5LCByZWNlaXZlcikgPT4gdW5yZWYoUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSksXG4gIHNldDogKHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmIChpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgb2xkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gcHJveHlSZWZzKG9iamVjdFdpdGhSZWZzKSB7XG4gIHJldHVybiBpc1JlYWN0aXZlKG9iamVjdFdpdGhSZWZzKSA/IG9iamVjdFdpdGhSZWZzIDogbmV3IFByb3h5KG9iamVjdFdpdGhSZWZzLCBzaGFsbG93VW53cmFwSGFuZGxlcnMpO1xufVxuY2xhc3MgQ3VzdG9tUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKGZhY3RvcnkpIHtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgY29uc3QgeyBnZXQsIHNldCB9ID0gZmFjdG9yeShcbiAgICAgICgpID0+IHRyYWNrUmVmVmFsdWUodGhpcyksXG4gICAgICAoKSA9PiB0cmlnZ2VyUmVmVmFsdWUodGhpcylcbiAgICApO1xuICAgIHRoaXMuX2dldCA9IGdldDtcbiAgICB0aGlzLl9zZXQgPSBzZXQ7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoKTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgdGhpcy5fc2V0KG5ld1ZhbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1c3RvbVJlZihmYWN0b3J5KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tUmVmSW1wbChmYWN0b3J5KTtcbn1cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3QpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzUHJveHkob2JqZWN0KSkge1xuICAgIGNvbnNvbGUud2FybihgdG9SZWZzKCkgZXhwZWN0cyBhIHJlYWN0aXZlIG9iamVjdCBidXQgcmVjZWl2ZWQgYSBwbGFpbiBvbmUuYCk7XG4gIH1cbiAgY29uc3QgcmV0ID0gaXNBcnJheShvYmplY3QpID8gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpIDoge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIHJldFtrZXldID0gcHJvcGVydHlUb1JlZihvYmplY3QsIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmNsYXNzIE9iamVjdFJlZkltcGwge1xuICBjb25zdHJ1Y3Rvcihfb2JqZWN0LCBfa2V5LCBfZGVmYXVsdFZhbHVlKSB7XG4gICAgdGhpcy5fb2JqZWN0ID0gX29iamVjdDtcbiAgICB0aGlzLl9rZXkgPSBfa2V5O1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IF9kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XTtcbiAgICByZXR1cm4gdmFsID09PSB2b2lkIDAgPyB0aGlzLl9kZWZhdWx0VmFsdWUgOiB2YWw7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIHRoaXMuX29iamVjdFt0aGlzLl9rZXldID0gbmV3VmFsO1xuICB9XG4gIGdldCBkZXAoKSB7XG4gICAgcmV0dXJuIGdldERlcEZyb21SZWFjdGl2ZSh0b1Jhdyh0aGlzLl9vYmplY3QpLCB0aGlzLl9rZXkpO1xuICB9XG59XG5jbGFzcyBHZXR0ZXJSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX2dldHRlcikge1xuICAgIHRoaXMuX2dldHRlciA9IF9nZXR0ZXI7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXMuX192X2lzUmVhZG9ubHkgPSB0cnVlO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0dGVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGlzUmVmKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gc291cmNlO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIHJldHVybiBuZXcgR2V0dGVyUmVmSW1wbChzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gcHJvcGVydHlUb1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVmKHNvdXJjZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BlcnR5VG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSkge1xuICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgcmV0dXJuIGlzUmVmKHZhbCkgPyB2YWwgOiBuZXcgT2JqZWN0UmVmSW1wbChzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKTtcbn1cblxuY2xhc3MgQ29tcHV0ZWRSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoZ2V0dGVyLCBfc2V0dGVyLCBpc1JlYWRvbmx5LCBpc1NTUikge1xuICAgIHRoaXMuX3NldHRlciA9IF9zZXR0ZXI7XG4gICAgdGhpcy5kZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IGZhbHNlO1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZGlydHkpIHtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB0cmlnZ2VyUmVmVmFsdWUodGhpcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lZmZlY3QuY29tcHV0ZWQgPSB0aGlzO1xuICAgIHRoaXMuZWZmZWN0LmFjdGl2ZSA9IHRoaXMuX2NhY2hlYWJsZSA9ICFpc1NTUjtcbiAgICB0aGlzW1wiX192X2lzUmVhZG9ubHlcIl0gPSBpc1JlYWRvbmx5O1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCBzZWxmID0gdG9SYXcodGhpcyk7XG4gICAgdHJhY2tSZWZWYWx1ZShzZWxmKTtcbiAgICBpZiAoc2VsZi5fZGlydHkgfHwgIXNlbGYuX2NhY2hlYWJsZSkge1xuICAgICAgc2VsZi5fZGlydHkgPSBmYWxzZTtcbiAgICAgIHNlbGYuX3ZhbHVlID0gc2VsZi5lZmZlY3QucnVuKCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsdWUpIHtcbiAgICB0aGlzLl9zZXR0ZXIobmV3VmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBjb21wdXRlZChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNTU1IgPSBmYWxzZSkge1xuICBsZXQgZ2V0dGVyO1xuICBsZXQgc2V0dGVyO1xuICBjb25zdCBvbmx5R2V0dGVyID0gaXNGdW5jdGlvbihnZXR0ZXJPck9wdGlvbnMpO1xuICBpZiAob25seUdldHRlcikge1xuICAgIGdldHRlciA9IGdldHRlck9yT3B0aW9ucztcbiAgICBzZXR0ZXIgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKFwiV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgdmFsdWUgaXMgcmVhZG9ubHlcIik7XG4gICAgfSA6IE5PT1A7XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zLmdldDtcbiAgICBzZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuc2V0O1xuICB9XG4gIGNvbnN0IGNSZWYgPSBuZXcgQ29tcHV0ZWRSZWZJbXBsKGdldHRlciwgc2V0dGVyLCBvbmx5R2V0dGVyIHx8ICFzZXR0ZXIsIGlzU1NSKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVidWdPcHRpb25zICYmICFpc1NTUikge1xuICAgIGNSZWYuZWZmZWN0Lm9uVHJhY2sgPSBkZWJ1Z09wdGlvbnMub25UcmFjaztcbiAgICBjUmVmLmVmZmVjdC5vblRyaWdnZXIgPSBkZWJ1Z09wdGlvbnMub25UcmlnZ2VyO1xuICB9XG4gIHJldHVybiBjUmVmO1xufVxuXG5jb25zdCB0aWNrID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgcXVldWUgPSBbXTtcbmxldCBxdWV1ZWQgPSBmYWxzZTtcbmNvbnN0IHNjaGVkdWxlciA9IChmbikgPT4ge1xuICBxdWV1ZS5wdXNoKGZuKTtcbiAgaWYgKCFxdWV1ZWQpIHtcbiAgICBxdWV1ZWQgPSB0cnVlO1xuICAgIHRpY2sudGhlbihmbHVzaCk7XG4gIH1cbn07XG5jb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHF1ZXVlW2ldKCk7XG4gIH1cbiAgcXVldWUubGVuZ3RoID0gMDtcbiAgcXVldWVkID0gZmFsc2U7XG59O1xuY2xhc3MgRGVmZXJyZWRDb21wdXRlZFJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihnZXR0ZXIpIHtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IHRydWU7XG4gICAgbGV0IGNvbXBhcmVUYXJnZXQ7XG4gICAgbGV0IGhhc0NvbXBhcmVUYXJnZXQgPSBmYWxzZTtcbiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdGhpcy5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZ2V0dGVyLCAoY29tcHV0ZWRUcmlnZ2VyKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXApIHtcbiAgICAgICAgaWYgKGNvbXB1dGVkVHJpZ2dlcikge1xuICAgICAgICAgIGNvbXBhcmVUYXJnZXQgPSB0aGlzLl92YWx1ZTtcbiAgICAgICAgICBoYXNDb21wYXJlVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVUb0NvbXBhcmUgPSBoYXNDb21wYXJlVGFyZ2V0ID8gY29tcGFyZVRhcmdldCA6IHRoaXMuX3ZhbHVlO1xuICAgICAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgICAgaGFzQ29tcGFyZVRhcmdldCA9IGZhbHNlO1xuICAgICAgICAgIHNjaGVkdWxlcigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lZmZlY3QuYWN0aXZlICYmIHRoaXMuX2dldCgpICE9PSB2YWx1ZVRvQ29tcGFyZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyUmVmVmFsdWUodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5kZXApIHtcbiAgICAgICAgICBpZiAoZS5jb21wdXRlZCBpbnN0YW5jZW9mIERlZmVycmVkQ29tcHV0ZWRSZWZJbXBsKSB7XG4gICAgICAgICAgICBlLnNjaGVkdWxlcihcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAvKiBjb21wdXRlZFRyaWdnZXIgKi9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5lZmZlY3QuY29tcHV0ZWQgPSB0aGlzO1xuICB9XG4gIF9nZXQoKSB7XG4gICAgaWYgKHRoaXMuX2RpcnR5KSB7XG4gICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID0gdGhpcy5lZmZlY3QucnVuKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgdHJhY2tSZWZWYWx1ZSh0aGlzKTtcbiAgICByZXR1cm4gdG9SYXcodGhpcykuX2dldCgpO1xuICB9XG59XG5mdW5jdGlvbiBkZWZlcnJlZENvbXB1dGVkKGdldHRlcikge1xuICByZXR1cm4gbmV3IERlZmVycmVkQ29tcHV0ZWRSZWZJbXBsKGdldHRlcik7XG59XG5cbmV4cG9ydCB7IEVmZmVjdFNjb3BlLCBJVEVSQVRFX0tFWSwgUmVhY3RpdmVFZmZlY3QsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmVycmVkQ29tcHV0ZWQsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGVuYWJsZVRyYWNraW5nLCBnZXRDdXJyZW50U2NvcGUsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBwYXVzZVRyYWNraW5nLCBwcm94eVJlZnMsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCByZXNldFRyYWNraW5nLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgc3RvcCwgdG9SYXcsIHRvUmVmLCB0b1JlZnMsIHRvVmFsdWUsIHRyYWNrLCB0cmlnZ2VyLCB0cmlnZ2VyUmVmLCB1bnJlZiB9O1xuIiwiaW1wb3J0IHsgcGF1c2VUcmFja2luZywgcmVzZXRUcmFja2luZywgaXNSZWYsIHRvUmF3LCBnZXRDdXJyZW50U2NvcGUsIGlzU2hhbGxvdyBhcyBpc1NoYWxsb3ckMSwgaXNSZWFjdGl2ZSwgUmVhY3RpdmVFZmZlY3QsIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCB0cmFjaywgcmVhY3RpdmUsIHNoYWxsb3dSZWFjdGl2ZSwgdHJpZ2dlciwgaXNQcm94eSwgcHJveHlSZWZzLCBtYXJrUmF3LCBFZmZlY3RTY29wZSwgY29tcHV0ZWQgYXMgY29tcHV0ZWQkMSwgaXNSZWFkb25seSB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eSc7XG5leHBvcnQgeyBFZmZlY3RTY29wZSwgUmVhY3RpdmVFZmZlY3QsIGN1c3RvbVJlZiwgZWZmZWN0LCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudFNjb3BlLCBpc1Byb3h5LCBpc1JlYWN0aXZlLCBpc1JlYWRvbmx5LCBpc1JlZiwgaXNTaGFsbG93LCBtYXJrUmF3LCBvblNjb3BlRGlzcG9zZSwgcHJveHlSZWZzLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlZiwgdG9SZWZzLCB0b1ZhbHVlLCB0cmlnZ2VyUmVmLCB1bnJlZiB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eSc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNGdW5jdGlvbiwgaXNQcm9taXNlLCBpc0FycmF5LCBOT09QLCBnZXRHbG9iYWxUaGlzLCBleHRlbmQsIEVNUFRZX09CSiwgdG9IYW5kbGVyS2V5LCBsb29zZVRvTnVtYmVyLCBoeXBoZW5hdGUsIGNhbWVsaXplLCBpc09iamVjdCwgaXNPbiwgaGFzT3duLCBpc01vZGVsTGlzdGVuZXIsIGNhcGl0YWxpemUsIHRvTnVtYmVyLCBoYXNDaGFuZ2VkLCByZW1vdmUsIGlzU2V0LCBpc01hcCwgaXNQbGFpbk9iamVjdCwgaXNCdWlsdEluRGlyZWN0aXZlLCBpbnZva2VBcnJheUZucywgaXNSZWdFeHAsIGlzR2xvYmFsbHlBbGxvd2VkLCBOTywgZGVmLCBpc1Jlc2VydmVkUHJvcCwgRU1QVFlfQVJSLCB0b1Jhd1R5cGUsIG1ha2VNYXAsIG5vcm1hbGl6ZUNsYXNzLCBub3JtYWxpemVTdHlsZSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcbmV4cG9ydCB7IGNhbWVsaXplLCBjYXBpdGFsaXplLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCB0b0Rpc3BsYXlTdHJpbmcsIHRvSGFuZGxlcktleSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3RhY2sgPSBbXTtcbmZ1bmN0aW9uIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZSkge1xuICBzdGFjay5wdXNoKHZub2RlKTtcbn1cbmZ1bmN0aW9uIHBvcFdhcm5pbmdDb250ZXh0KCkge1xuICBzdGFjay5wb3AoKTtcbn1cbmZ1bmN0aW9uIHdhcm4obXNnLCAuLi5hcmdzKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSlcbiAgICByZXR1cm47XG4gIHBhdXNlVHJhY2tpbmcoKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBzdGFjay5sZW5ndGggPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5jb21wb25lbnQgOiBudWxsO1xuICBjb25zdCBhcHBXYXJuSGFuZGxlciA9IGluc3RhbmNlICYmIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLndhcm5IYW5kbGVyO1xuICBjb25zdCB0cmFjZSA9IGdldENvbXBvbmVudFRyYWNlKCk7XG4gIGlmIChhcHBXYXJuSGFuZGxlcikge1xuICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIGFwcFdhcm5IYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAxMSxcbiAgICAgIFtcbiAgICAgICAgbXNnICsgYXJncy5qb2luKFwiXCIpLFxuICAgICAgICBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSxcbiAgICAgICAgdHJhY2UubWFwKFxuICAgICAgICAgICh7IHZub2RlIH0pID0+IGBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCB2bm9kZS50eXBlKX0+YFxuICAgICAgICApLmpvaW4oXCJcXG5cIiksXG4gICAgICAgIHRyYWNlXG4gICAgICBdXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3YXJuQXJncyA9IFtgW1Z1ZSB3YXJuXTogJHttc2d9YCwgLi4uYXJnc107XG4gICAgaWYgKHRyYWNlLmxlbmd0aCAmJiAvLyBhdm9pZCBzcGFtbWluZyBjb25zb2xlIGR1cmluZyB0ZXN0c1xuICAgIHRydWUpIHtcbiAgICAgIHdhcm5BcmdzLnB1c2goYFxuYCwgLi4uZm9ybWF0VHJhY2UodHJhY2UpKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKC4uLndhcm5BcmdzKTtcbiAgfVxuICByZXNldFRyYWNraW5nKCk7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRUcmFjZSgpIHtcbiAgbGV0IGN1cnJlbnRWTm9kZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAoIWN1cnJlbnRWTm9kZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkU3RhY2sgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnRWTm9kZSkge1xuICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkU3RhY2tbMF07XG4gICAgaWYgKGxhc3QgJiYgbGFzdC52bm9kZSA9PT0gY3VycmVudFZOb2RlKSB7XG4gICAgICBsYXN0LnJlY3Vyc2VDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkU3RhY2sucHVzaCh7XG4gICAgICAgIHZub2RlOiBjdXJyZW50Vk5vZGUsXG4gICAgICAgIHJlY3Vyc2VDb3VudDogMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudEluc3RhbmNlID0gY3VycmVudFZOb2RlLmNvbXBvbmVudCAmJiBjdXJyZW50Vk5vZGUuY29tcG9uZW50LnBhcmVudDtcbiAgICBjdXJyZW50Vk5vZGUgPSBwYXJlbnRJbnN0YW5jZSAmJiBwYXJlbnRJbnN0YW5jZS52bm9kZTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZFN0YWNrO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2UodHJhY2UpIHtcbiAgY29uc3QgbG9ncyA9IFtdO1xuICB0cmFjZS5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5pID09PSAwID8gW10gOiBbYFxuYF0sIC4uLmZvcm1hdFRyYWNlRW50cnkoZW50cnkpKTtcbiAgfSk7XG4gIHJldHVybiBsb2dzO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2VFbnRyeSh7IHZub2RlLCByZWN1cnNlQ291bnQgfSkge1xuICBjb25zdCBwb3N0Zml4ID0gcmVjdXJzZUNvdW50ID4gMCA/IGAuLi4gKCR7cmVjdXJzZUNvdW50fSByZWN1cnNpdmUgY2FsbHMpYCA6IGBgO1xuICBjb25zdCBpc1Jvb3QgPSB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQucGFyZW50ID09IG51bGwgOiBmYWxzZTtcbiAgY29uc3Qgb3BlbiA9IGAgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICB2bm9kZS5jb21wb25lbnQsXG4gICAgdm5vZGUudHlwZSxcbiAgICBpc1Jvb3RcbiAgKX1gO1xuICBjb25zdCBjbG9zZSA9IGA+YCArIHBvc3RmaXg7XG4gIHJldHVybiB2bm9kZS5wcm9wcyA/IFtvcGVuLCAuLi5mb3JtYXRQcm9wcyh2bm9kZS5wcm9wcyksIGNsb3NlXSA6IFtvcGVuICsgY2xvc2VdO1xufVxuZnVuY3Rpb24gZm9ybWF0UHJvcHMocHJvcHMpIHtcbiAgY29uc3QgcmVzID0gW107XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gIGtleXMuc2xpY2UoMCwgMykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzLnB1c2goLi4uZm9ybWF0UHJvcChrZXksIHByb3BzW2tleV0pKTtcbiAgfSk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDMpIHtcbiAgICByZXMucHVzaChgIC4uLmApO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wKGtleSwgdmFsdWUsIHJhdykge1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IGZvcm1hdFByb3Aoa2V5LCB0b1Jhdyh2YWx1ZS52YWx1ZSksIHRydWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PVJlZjxgLCB2YWx1ZSwgYD5gXTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiBbYCR7a2V5fT1mbiR7dmFsdWUubmFtZSA/IGA8JHt2YWx1ZS5uYW1lfT5gIDogYGB9YF07XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09YCwgdmFsdWVdO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnROdW1iZXIodmFsLCB0eXBlKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSlcbiAgICByZXR1cm47XG4gIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSB7XG4gICAgd2FybihgJHt0eXBlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgLSBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWwpfS5gKTtcbiAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XG4gICAgd2FybihgJHt0eXBlfSBpcyBOYU4gLSB0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuYCk7XG4gIH1cbn1cblxuY29uc3QgRXJyb3JUeXBlU3RyaW5ncyA9IHtcbiAgW1wic3BcIl06IFwic2VydmVyUHJlZmV0Y2ggaG9va1wiLFxuICBbXCJiY1wiXTogXCJiZWZvcmVDcmVhdGUgaG9va1wiLFxuICBbXCJjXCJdOiBcImNyZWF0ZWQgaG9va1wiLFxuICBbXCJibVwiXTogXCJiZWZvcmVNb3VudCBob29rXCIsXG4gIFtcIm1cIl06IFwibW91bnRlZCBob29rXCIsXG4gIFtcImJ1XCJdOiBcImJlZm9yZVVwZGF0ZSBob29rXCIsXG4gIFtcInVcIl06IFwidXBkYXRlZFwiLFxuICBbXCJidW1cIl06IFwiYmVmb3JlVW5tb3VudCBob29rXCIsXG4gIFtcInVtXCJdOiBcInVubW91bnRlZCBob29rXCIsXG4gIFtcImFcIl06IFwiYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZGFcIl06IFwiZGVhY3RpdmF0ZWQgaG9va1wiLFxuICBbXCJlY1wiXTogXCJlcnJvckNhcHR1cmVkIGhvb2tcIixcbiAgW1wicnRjXCJdOiBcInJlbmRlclRyYWNrZWQgaG9va1wiLFxuICBbXCJydGdcIl06IFwicmVuZGVyVHJpZ2dlcmVkIGhvb2tcIixcbiAgWzBdOiBcInNldHVwIGZ1bmN0aW9uXCIsXG4gIFsxXTogXCJyZW5kZXIgZnVuY3Rpb25cIixcbiAgWzJdOiBcIndhdGNoZXIgZ2V0dGVyXCIsXG4gIFszXTogXCJ3YXRjaGVyIGNhbGxiYWNrXCIsXG4gIFs0XTogXCJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb25cIixcbiAgWzVdOiBcIm5hdGl2ZSBldmVudCBoYW5kbGVyXCIsXG4gIFs2XTogXCJjb21wb25lbnQgZXZlbnQgaGFuZGxlclwiLFxuICBbN106IFwidm5vZGUgaG9va1wiLFxuICBbOF06IFwiZGlyZWN0aXZlIGhvb2tcIixcbiAgWzldOiBcInRyYW5zaXRpb24gaG9va1wiLFxuICBbMTBdOiBcImFwcCBlcnJvckhhbmRsZXJcIixcbiAgWzExXTogXCJhcHAgd2FybkhhbmRsZXJcIixcbiAgWzEyXTogXCJyZWYgZnVuY3Rpb25cIixcbiAgWzEzXTogXCJhc3luYyBjb21wb25lbnQgbG9hZGVyXCIsXG4gIFsxNF06IFwic2NoZWR1bGVyIGZsdXNoLiBUaGlzIGlzIGxpa2VseSBhIFZ1ZSBpbnRlcm5hbHMgYnVnLiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL25ldy1pc3N1ZS52dWVqcy5vcmcvP3JlcG89dnVlanMvY29yZVwiXG59O1xuZnVuY3Rpb24gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICBsZXQgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGFyZ3MgPyBmbiguLi5hcmdzKSA6IGZuKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgY29uc3QgcmVzID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncyk7XG4gICAgaWYgKHJlcyAmJiBpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgIHZhbHVlcy5wdXNoKGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGZuW2ldLCBpbnN0YW5jZSwgdHlwZSwgYXJncykpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBjb25zdCBjb250ZXh0Vk5vZGUgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnZub2RlIDogbnVsbDtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgbGV0IGN1ciA9IGluc3RhbmNlLnBhcmVudDtcbiAgICBjb25zdCBleHBvc2VkSW5zdGFuY2UgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBlcnJvckluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gRXJyb3JUeXBlU3RyaW5nc1t0eXBlXSA6IHR5cGU7XG4gICAgd2hpbGUgKGN1cikge1xuICAgICAgY29uc3QgZXJyb3JDYXB0dXJlZEhvb2tzID0gY3VyLmVjO1xuICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yQ2FwdHVyZWRIb29rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlcnJvckNhcHR1cmVkSG9va3NbaV0oZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mbykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXIgPSBjdXIucGFyZW50O1xuICAgIH1cbiAgICBjb25zdCBhcHBFcnJvckhhbmRsZXIgPSBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5lcnJvckhhbmRsZXI7XG4gICAgaWYgKGFwcEVycm9ySGFuZGxlcikge1xuICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgICBhcHBFcnJvckhhbmRsZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDEwLFxuICAgICAgICBbZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mb11cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2KTtcbn1cbmZ1bmN0aW9uIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGluZm8gPSBFcnJvclR5cGVTdHJpbmdzW3R5cGVdO1xuICAgIGlmIChjb250ZXh0Vk5vZGUpIHtcbiAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChjb250ZXh0Vk5vZGUpO1xuICAgIH1cbiAgICB3YXJuKGBVbmhhbmRsZWQgZXJyb3Ike2luZm8gPyBgIGR1cmluZyBleGVjdXRpb24gb2YgJHtpbmZvfWAgOiBgYH1gKTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhyb3dJbkRldikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5sZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xubGV0IGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAwO1xuY29uc3QgcGVuZGluZ1Bvc3RGbHVzaENicyA9IFtdO1xubGV0IGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG5sZXQgcG9zdEZsdXNoSW5kZXggPSAwO1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xubGV0IGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTAwO1xuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgY29uc3QgcCA9IGN1cnJlbnRGbHVzaFByb21pc2UgfHwgcmVzb2x2ZWRQcm9taXNlO1xuICByZXR1cm4gZm4gPyBwLnRoZW4odGhpcyA/IGZuLmJpbmQodGhpcykgOiBmbikgOiBwO1xufVxuZnVuY3Rpb24gZmluZEluc2VydGlvbkluZGV4KGlkKSB7XG4gIGxldCBzdGFydCA9IGZsdXNoSW5kZXggKyAxO1xuICBsZXQgZW5kID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBzdGFydCArIGVuZCA+Pj4gMTtcbiAgICBjb25zdCBtaWRkbGVKb2IgPSBxdWV1ZVttaWRkbGVdO1xuICAgIGNvbnN0IG1pZGRsZUpvYklkID0gZ2V0SWQobWlkZGxlSm9iKTtcbiAgICBpZiAobWlkZGxlSm9iSWQgPCBpZCB8fCBtaWRkbGVKb2JJZCA9PT0gaWQgJiYgbWlkZGxlSm9iLnByZSkge1xuICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSBtaWRkbGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGFydDtcbn1cbmZ1bmN0aW9uIHF1ZXVlSm9iKGpvYikge1xuICBpZiAoIXF1ZXVlLmxlbmd0aCB8fCAhcXVldWUuaW5jbHVkZXMoXG4gICAgam9iLFxuICAgIGlzRmx1c2hpbmcgJiYgam9iLmFsbG93UmVjdXJzZSA/IGZsdXNoSW5kZXggKyAxIDogZmx1c2hJbmRleFxuICApKSB7XG4gICAgaWYgKGpvYi5pZCA9PSBudWxsKSB7XG4gICAgICBxdWV1ZS5wdXNoKGpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnNwbGljZShmaW5kSW5zZXJ0aW9uSW5kZXgoam9iLmlkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgaXNGbHVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSByZXNvbHZlZFByb21pc2UudGhlbihmbHVzaEpvYnMpO1xuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlSm9iKGpvYikge1xuICBjb25zdCBpID0gcXVldWUuaW5kZXhPZihqb2IpO1xuICBpZiAoaSA+IGZsdXNoSW5kZXgpIHtcbiAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHF1ZXVlUG9zdEZsdXNoQ2IoY2IpIHtcbiAgaWYgKCFpc0FycmF5KGNiKSkge1xuICAgIGlmICghYWN0aXZlUG9zdEZsdXNoQ2JzIHx8ICFhY3RpdmVQb3N0Rmx1c2hDYnMuaW5jbHVkZXMoXG4gICAgICBjYixcbiAgICAgIGNiLmFsbG93UmVjdXJzZSA/IHBvc3RGbHVzaEluZGV4ICsgMSA6IHBvc3RGbHVzaEluZGV4XG4gICAgKSkge1xuICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKHNlZW4sIGkgPSBpc0ZsdXNoaW5nID8gZmx1c2hJbmRleCArIDEgOiAwKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2IgPSBxdWV1ZVtpXTtcbiAgICBpZiAoY2IgJiYgY2IucHJlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgY2IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgaS0tO1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXTtcbiAgICBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCA9IDA7XG4gICAgaWYgKGFjdGl2ZVBvc3RGbHVzaENicykge1xuICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzLnB1c2goLi4uZGVkdXBlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IGRlZHVwZWQ7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicy5zb3J0KChhLCBiKSA9PiBnZXRJZChhKSAtIGdldElkKGIpKTtcbiAgICBmb3IgKHBvc3RGbHVzaEluZGV4ID0gMDsgcG9zdEZsdXNoSW5kZXggPCBhY3RpdmVQb3N0Rmx1c2hDYnMubGVuZ3RoOyBwb3N0Rmx1c2hJbmRleCsrKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgYWN0aXZlUG9zdEZsdXNoQ2JzW3Bvc3RGbHVzaEluZGV4XSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnNbcG9zdEZsdXNoSW5kZXhdKCk7XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG4gICAgcG9zdEZsdXNoSW5kZXggPSAwO1xuICB9XG59XG5jb25zdCBnZXRJZCA9IChqb2IpID0+IGpvYi5pZCA9PSBudWxsID8gSW5maW5pdHkgOiBqb2IuaWQ7XG5jb25zdCBjb21wYXJhdG9yID0gKGEsIGIpID0+IHtcbiAgY29uc3QgZGlmZiA9IGdldElkKGEpIC0gZ2V0SWQoYik7XG4gIGlmIChkaWZmID09PSAwKSB7XG4gICAgaWYgKGEucHJlICYmICFiLnByZSlcbiAgICAgIHJldHVybiAtMTtcbiAgICBpZiAoYi5wcmUgJiYgIWEucHJlKVxuICAgICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIGRpZmY7XG59O1xuZnVuY3Rpb24gZmx1c2hKb2JzKHNlZW4pIHtcbiAgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTtcbiAgaXNGbHVzaGluZyA9IHRydWU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBxdWV1ZS5zb3J0KGNvbXBhcmF0b3IpO1xuICBjb25zdCBjaGVjayA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoam9iKSA9PiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2Vlbiwgam9iKSA6IE5PT1A7XG4gIHRyeSB7XG4gICAgZm9yIChmbHVzaEluZGV4ID0gMDsgZmx1c2hJbmRleCA8IHF1ZXVlLmxlbmd0aDsgZmx1c2hJbmRleCsrKSB7XG4gICAgICBjb25zdCBqb2IgPSBxdWV1ZVtmbHVzaEluZGV4XTtcbiAgICAgIGlmIChqb2IgJiYgam9iLmFjdGl2ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2soam9iKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhqb2IsIG51bGwsIDE0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hJbmRleCA9IDA7XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBmbHVzaFBvc3RGbHVzaENicyhzZWVuKTtcbiAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgY3VycmVudEZsdXNoUHJvbWlzZSA9IG51bGw7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCB8fCBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCkge1xuICAgICAgZmx1c2hKb2JzKHNlZW4pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGZuKSB7XG4gIGlmICghc2Vlbi5oYXMoZm4pKSB7XG4gICAgc2Vlbi5zZXQoZm4sIDEpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvdW50ID0gc2Vlbi5nZXQoZm4pO1xuICAgIGlmIChjb3VudCA+IFJFQ1VSU0lPTl9MSU1JVCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBmbi5vd25lckluc3RhbmNlO1xuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGluc3RhbmNlICYmIGdldENvbXBvbmVudE5hbWUoaW5zdGFuY2UudHlwZSk7XG4gICAgICB3YXJuKFxuICAgICAgICBgTWF4aW11bSByZWN1cnNpdmUgdXBkYXRlcyBleGNlZWRlZCR7Y29tcG9uZW50TmFtZSA/IGAgaW4gY29tcG9uZW50IDwke2NvbXBvbmVudE5hbWV9PmAgOiBgYH0uIFRoaXMgbWVhbnMgeW91IGhhdmUgYSByZWFjdGl2ZSBlZmZlY3QgdGhhdCBpcyBtdXRhdGluZyBpdHMgb3duIGRlcGVuZGVuY2llcyBhbmQgdGh1cyByZWN1cnNpdmVseSB0cmlnZ2VyaW5nIGl0c2VsZi4gUG9zc2libGUgc291cmNlcyBpbmNsdWRlIGNvbXBvbmVudCB0ZW1wbGF0ZSwgcmVuZGVyIGZ1bmN0aW9uLCB1cGRhdGVkIGhvb2sgb3Igd2F0Y2hlciBzb3VyY2UgZnVuY3Rpb24uYFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWVuLnNldChmbiwgY291bnQgKyAxKTtcbiAgICB9XG4gIH1cbn1cblxubGV0IGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbmNvbnN0IGhtckRpcnR5Q29tcG9uZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfSE1SX1JVTlRJTUVfXyA9IHtcbiAgICBjcmVhdGVSZWNvcmQ6IHRyeVdyYXAoY3JlYXRlUmVjb3JkKSxcbiAgICByZXJlbmRlcjogdHJ5V3JhcChyZXJlbmRlciksXG4gICAgcmVsb2FkOiB0cnlXcmFwKHJlbG9hZClcbiAgfTtcbn1cbmNvbnN0IG1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiByZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBjb25zdCBpZCA9IGluc3RhbmNlLnR5cGUuX19obXJJZDtcbiAgbGV0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkge1xuICAgIGNyZWF0ZVJlY29yZChpZCwgaW5zdGFuY2UudHlwZSk7XG4gICAgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIH1cbiAgcmVjb3JkLmluc3RhbmNlcy5hZGQoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gdW5yZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBtYXAuZ2V0KGluc3RhbmNlLnR5cGUuX19obXJJZCkuaW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWNvcmQoaWQsIGluaXRpYWxEZWYpIHtcbiAgaWYgKG1hcC5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1hcC5zZXQoaWQsIHtcbiAgICBpbml0aWFsRGVmOiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbml0aWFsRGVmKSxcbiAgICBpbnN0YW5jZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KClcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuX192Y2NPcHRzIDogY29tcG9uZW50O1xufVxuZnVuY3Rpb24gcmVyZW5kZXIoaWQsIG5ld1JlbmRlcikge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVjb3JkLmluaXRpYWxEZWYucmVuZGVyID0gbmV3UmVuZGVyO1xuICBbLi4ucmVjb3JkLmluc3RhbmNlc10uZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICBpZiAobmV3UmVuZGVyKSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgICBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlckNhY2hlID0gW107XG4gICAgaXNIbXJVcGRhdGluZyA9IHRydWU7XG4gICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbG9hZChpZCwgbmV3Q29tcCkge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpXG4gICAgcmV0dXJuO1xuICBuZXdDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQobmV3Q29tcCk7XG4gIHVwZGF0ZUNvbXBvbmVudERlZihyZWNvcmQuaW5pdGlhbERlZiwgbmV3Q29tcCk7XG4gIGNvbnN0IGluc3RhbmNlcyA9IFsuLi5yZWNvcmQuaW5zdGFuY2VzXTtcbiAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcbiAgICBjb25zdCBvbGRDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSk7XG4gICAgaWYgKCFobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG9sZENvbXApKSB7XG4gICAgICBpZiAob2xkQ29tcCAhPT0gcmVjb3JkLmluaXRpYWxEZWYpIHtcbiAgICAgICAgdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApO1xuICAgICAgfVxuICAgICAgaG1yRGlydHlDb21wb25lbnRzLmFkZChvbGRDb21wKTtcbiAgICB9XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5wcm9wc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LmVtaXRzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoaW5zdGFuY2UuY2VSZWxvYWQpIHtcbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5hZGQob2xkQ29tcCk7XG4gICAgICBpbnN0YW5jZS5jZVJlbG9hZChuZXdDb21wLnN0eWxlcyk7XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuZGVsZXRlKG9sZENvbXApO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBxdWV1ZUpvYihpbnN0YW5jZS5wYXJlbnQudXBkYXRlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKSB7XG4gICAgICBpbnN0YW5jZS5hcHBDb250ZXh0LnJlbG9hZCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0hNUl0gUm9vdCBvciBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlIG1vZGlmaWVkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcXVldWVQb3N0Rmx1c2hDYigoKSA9PiB7XG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5kZWxldGUoXG4gICAgICAgIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluc3RhbmNlLnR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb21wb25lbnREZWYob2xkQ29tcCwgbmV3Q29tcCkge1xuICBleHRlbmQob2xkQ29tcCwgbmV3Q29tcCk7XG4gIGZvciAoY29uc3Qga2V5IGluIG9sZENvbXApIHtcbiAgICBpZiAoa2V5ICE9PSBcIl9fZmlsZVwiICYmICEoa2V5IGluIG5ld0NvbXApKSB7XG4gICAgICBkZWxldGUgb2xkQ29tcFtrZXldO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJ5V3JhcChmbikge1xuICByZXR1cm4gKGlkLCBhcmcpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKGlkLCBhcmcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbSE1SXSBTb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgVnVlIGNvbXBvbmVudCBob3QtcmVsb2FkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC5gXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxubGV0IGRldnRvb2xzO1xubGV0IGJ1ZmZlciA9IFtdO1xubGV0IGRldnRvb2xzTm90SW5zdGFsbGVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbWl0JDEoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgaWYgKGRldnRvb2xzKSB7XG4gICAgZGV2dG9vbHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH0gZWxzZSBpZiAoIWRldnRvb2xzTm90SW5zdGFsbGVkKSB7XG4gICAgYnVmZmVyLnB1c2goeyBldmVudCwgYXJncyB9KTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RGV2dG9vbHNIb29rKGhvb2ssIHRhcmdldCkge1xuICB2YXIgX2EsIF9iO1xuICBkZXZ0b29scyA9IGhvb2s7XG4gIGlmIChkZXZ0b29scykge1xuICAgIGRldnRvb2xzLmVuYWJsZWQgPSB0cnVlO1xuICAgIGJ1ZmZlci5mb3JFYWNoKCh7IGV2ZW50LCBhcmdzIH0pID0+IGRldnRvb2xzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpKTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfSBlbHNlIGlmIChcbiAgICAvLyBoYW5kbGUgbGF0ZSBkZXZ0b29scyBpbmplY3Rpb24gLSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGluIGFuIGFjdHVhbFxuICAgIC8vIGJyb3dzZXIgZW52aXJvbm1lbnQgdG8gYXZvaWQgdGhlIHRpbWVyIGhhbmRsZSBzdGFsbGluZyB0ZXN0IHJ1bm5lciBleGl0XG4gICAgLy8gKCM0ODE1KVxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgLy8gc29tZSBlbnZzIG1vY2sgd2luZG93IGJ1dCBub3QgZnVsbHlcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgJiYgLy8gYWxzbyBleGNsdWRlIGpzZG9tXG4gICAgISgoX2IgPSAoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PSBudWxsID8gdm9pZCAwIDogX2EudXNlckFnZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoXCJqc2RvbVwiKSlcbiAgKSB7XG4gICAgY29uc3QgcmVwbGF5ID0gdGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX18gPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyB8fCBbXTtcbiAgICByZXBsYXkucHVzaCgobmV3SG9vaykgPT4ge1xuICAgICAgc2V0RGV2dG9vbHNIb29rKG5ld0hvb2ssIHRhcmdldCk7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIWRldnRvb2xzKSB7XG4gICAgICAgIHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fID0gbnVsbDtcbiAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9LCAzZTMpO1xuICB9IGVsc2Uge1xuICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbikge1xuICBlbWl0JDEoXCJhcHA6aW5pdFwiIC8qIEFQUF9JTklUICovLCBhcHAsIHZlcnNpb24sIHtcbiAgICBGcmFnbWVudCxcbiAgICBUZXh0LFxuICAgIENvbW1lbnQsXG4gICAgU3RhdGljXG4gIH0pO1xufVxuZnVuY3Rpb24gZGV2dG9vbHNVbm1vdW50QXBwKGFwcCkge1xuICBlbWl0JDEoXCJhcHA6dW5tb3VudFwiIC8qIEFQUF9VTk1PVU5UICovLCBhcHApO1xufVxuY29uc3QgZGV2dG9vbHNDb21wb25lbnRBZGRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OmFkZGVkXCIgLyogQ09NUE9ORU5UX0FEREVEICovXG4pO1xuY29uc3QgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayhcImNvbXBvbmVudDp1cGRhdGVkXCIgLyogQ09NUE9ORU5UX1VQREFURUQgKi8pO1xuY29uc3QgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OnJlbW92ZWRcIiAvKiBDT01QT05FTlRfUkVNT1ZFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IChjb21wb25lbnQpID0+IHtcbiAgaWYgKGRldnRvb2xzICYmIHR5cGVvZiBkZXZ0b29scy5jbGVhbnVwQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgLy8gcmVtb3ZlIHRoZSBjb21wb25lbnQgaWYgaXQgd2Fzbid0IGJ1ZmZlcmVkXG4gICFkZXZ0b29scy5jbGVhbnVwQnVmZmVyKGNvbXBvbmVudCkpIHtcbiAgICBfZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGNvbXBvbmVudCk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soaG9vaykge1xuICByZXR1cm4gKGNvbXBvbmVudCkgPT4ge1xuICAgIGVtaXQkMShcbiAgICAgIGhvb2ssXG4gICAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgICBjb21wb25lbnQudWlkLFxuICAgICAgY29tcG9uZW50LnBhcmVudCA/IGNvbXBvbmVudC5wYXJlbnQudWlkIDogdm9pZCAwLFxuICAgICAgY29tcG9uZW50XG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IGRldnRvb2xzUGVyZlN0YXJ0ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKFxuICBcInBlcmY6c3RhcnRcIiAvKiBQRVJGT1JNQU5DRV9TVEFSVCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzUGVyZkVuZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcbiAgXCJwZXJmOmVuZFwiIC8qIFBFUkZPUk1BTkNFX0VORCAqL1xuKTtcbmZ1bmN0aW9uIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQsIHR5cGUsIHRpbWUpID0+IHtcbiAgICBlbWl0JDEoaG9vaywgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLCBjb21wb25lbnQudWlkLCBjb21wb25lbnQsIHR5cGUsIHRpbWUpO1xuICB9O1xufVxuZnVuY3Rpb24gZGV2dG9vbHNDb21wb25lbnRFbWl0KGNvbXBvbmVudCwgZXZlbnQsIHBhcmFtcykge1xuICBlbWl0JDEoXG4gICAgXCJjb21wb25lbnQ6ZW1pdFwiIC8qIENPTVBPTkVOVF9FTUlUICovLFxuICAgIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCxcbiAgICBjb21wb25lbnQsXG4gICAgZXZlbnQsXG4gICAgcGFyYW1zXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVtaXQoaW5zdGFuY2UsIGV2ZW50LCAuLi5yYXdBcmdzKSB7XG4gIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZClcbiAgICByZXR1cm47XG4gIGNvbnN0IHByb3BzID0gaW5zdGFuY2Uudm5vZGUucHJvcHMgfHwgRU1QVFlfT0JKO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVtaXRzT3B0aW9ucyxcbiAgICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc11cbiAgICB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGVtaXRzT3B0aW9ucykge1xuICAgICAgaWYgKCEoZXZlbnQgaW4gZW1pdHNPcHRpb25zKSAmJiB0cnVlKSB7XG4gICAgICAgIGlmICghcHJvcHNPcHRpb25zIHx8ICEodG9IYW5kbGVyS2V5KGV2ZW50KSBpbiBwcm9wc09wdGlvbnMpKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBDb21wb25lbnQgZW1pdHRlZCBldmVudCBcIiR7ZXZlbnR9XCIgYnV0IGl0IGlzIG5laXRoZXIgZGVjbGFyZWQgaW4gdGhlIGVtaXRzIG9wdGlvbiBub3IgYXMgYW4gXCIke3RvSGFuZGxlcktleShldmVudCl9XCIgcHJvcC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gZW1pdHNPcHRpb25zW2V2ZW50XTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdG9yKSkge1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0b3IoLi4ucmF3QXJncyk7XG4gICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBgSW52YWxpZCBldmVudCBhcmd1bWVudHM6IGV2ZW50IHZhbGlkYXRpb24gZmFpbGVkIGZvciBldmVudCBcIiR7ZXZlbnR9XCIuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IGFyZ3MgPSByYXdBcmdzO1xuICBjb25zdCBpc01vZGVsTGlzdGVuZXIgPSBldmVudC5zdGFydHNXaXRoKFwidXBkYXRlOlwiKTtcbiAgY29uc3QgbW9kZWxBcmcgPSBpc01vZGVsTGlzdGVuZXIgJiYgZXZlbnQuc2xpY2UoNyk7XG4gIGlmIChtb2RlbEFyZyAmJiBtb2RlbEFyZyBpbiBwcm9wcykge1xuICAgIGNvbnN0IG1vZGlmaWVyc0tleSA9IGAke21vZGVsQXJnID09PSBcIm1vZGVsVmFsdWVcIiA/IFwibW9kZWxcIiA6IG1vZGVsQXJnfU1vZGlmaWVyc2A7XG4gICAgY29uc3QgeyBudW1iZXIsIHRyaW0gfSA9IHByb3BzW21vZGlmaWVyc0tleV0gfHwgRU1QVFlfT0JKO1xuICAgIGlmICh0cmltKSB7XG4gICAgICBhcmdzID0gcmF3QXJncy5tYXAoKGEpID0+IGlzU3RyaW5nKGEpID8gYS50cmltKCkgOiBhKTtcbiAgICB9XG4gICAgaWYgKG51bWJlcikge1xuICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKGxvb3NlVG9OdW1iZXIpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc0NvbXBvbmVudEVtaXQoaW5zdGFuY2UsIGV2ZW50LCBhcmdzKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHByb3BzW3RvSGFuZGxlcktleShsb3dlckNhc2VFdmVudCldKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRXZlbnQgXCIke2xvd2VyQ2FzZUV2ZW50fVwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBpbnN0YW5jZS50eXBlXG4gICAgICAgICl9IGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciBcIiR7ZXZlbnR9XCIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcIiR7aHlwaGVuYXRlKGV2ZW50KX1cIiBpbnN0ZWFkIG9mIFwiJHtldmVudH1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBsZXQgaGFuZGxlck5hbWU7XG4gIGxldCBoYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoZXZlbnQpXSB8fCAvLyBhbHNvIHRyeSBjYW1lbENhc2UgZXZlbnQgaGFuZGxlciAoIzIyNDkpXG4gIHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGNhbWVsaXplKGV2ZW50KSldO1xuICBpZiAoIWhhbmRsZXIgJiYgaXNNb2RlbExpc3RlbmVyKSB7XG4gICAgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGh5cGhlbmF0ZShldmVudCkpXTtcbiAgfVxuICBpZiAoaGFuZGxlcikge1xuICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgaGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG4gIGNvbnN0IG9uY2VIYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgKyBgT25jZWBdO1xuICBpZiAob25jZUhhbmRsZXIpIHtcbiAgICBpZiAoIWluc3RhbmNlLmVtaXR0ZWQpIHtcbiAgICAgIGluc3RhbmNlLmVtaXR0ZWQgPSB7fTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdID0gdHJ1ZTtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIG9uY2VIYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA2LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBhcHBDb250ZXh0LmVtaXRzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLmVtaXRzO1xuICBsZXQgbm9ybWFsaXplZCA9IHt9O1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZEVtaXRzID0gKHJhdzIpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGcm9tRXh0ZW5kID0gbm9ybWFsaXplRW1pdHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKSB7XG4gICAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgICBleHRlbmQobm9ybWFsaXplZCwgbm9ybWFsaXplZEZyb21FeHRlbmQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZEVtaXRzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICByYXcuZm9yRWFjaCgoa2V5KSA9PiBub3JtYWxpemVkW2tleV0gPSBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBleHRlbmQobm9ybWFsaXplZCwgcmF3KTtcbiAgfVxuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgbm9ybWFsaXplZCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5mdW5jdGlvbiBpc0VtaXRMaXN0ZW5lcihvcHRpb25zLCBrZXkpIHtcbiAgaWYgKCFvcHRpb25zIHx8ICFpc09uKGtleSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAga2V5ID0ga2V5LnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywgXCJcIik7XG4gIHJldHVybiBoYXNPd24ob3B0aW9ucywga2V5WzBdLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSkpIHx8IGhhc093bihvcHRpb25zLCBoeXBoZW5hdGUoa2V5KSkgfHwgaGFzT3duKG9wdGlvbnMsIGtleSk7XG59XG5cbmxldCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xubGV0IGN1cnJlbnRTY29wZUlkID0gbnVsbDtcbmZ1bmN0aW9uIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShpbnN0YW5jZSkge1xuICBjb25zdCBwcmV2ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgY3VycmVudFNjb3BlSWQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS50eXBlLl9fc2NvcGVJZCB8fCBudWxsO1xuICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIHB1c2hTY29wZUlkKGlkKSB7XG4gIGN1cnJlbnRTY29wZUlkID0gaWQ7XG59XG5mdW5jdGlvbiBwb3BTY29wZUlkKCkge1xuICBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG59XG5jb25zdCB3aXRoU2NvcGVJZCA9IChfaWQpID0+IHdpdGhDdHg7XG5mdW5jdGlvbiB3aXRoQ3R4KGZuLCBjdHggPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsIGlzTm9uU2NvcGVkU2xvdCkge1xuICBpZiAoIWN0eClcbiAgICByZXR1cm4gZm47XG4gIGlmIChmbi5fbikge1xuICAgIHJldHVybiBmbjtcbiAgfVxuICBjb25zdCByZW5kZXJGbldpdGhDb250ZXh0ID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAocmVuZGVyRm5XaXRoQ29udGV4dC5fZCkge1xuICAgICAgc2V0QmxvY2tUcmFja2luZygtMSk7XG4gICAgfVxuICAgIGNvbnN0IHByZXZJbnN0YW5jZSA9IHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShjdHgpO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGZuKC4uLmFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UocHJldkluc3RhbmNlKTtcbiAgICAgIGlmIChyZW5kZXJGbldpdGhDb250ZXh0Ll9kKSB7XG4gICAgICAgIHNldEJsb2NrVHJhY2tpbmcoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGN0eCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX24gPSB0cnVlO1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9jID0gdHJ1ZTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fZCA9IHRydWU7XG4gIHJldHVybiByZW5kZXJGbldpdGhDb250ZXh0O1xufVxuXG5sZXQgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuZnVuY3Rpb24gbWFya0F0dHJzQWNjZXNzZWQoKSB7XG4gIGFjY2Vzc2VkQXR0cnMgPSB0cnVlO1xufVxuZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgdHlwZTogQ29tcG9uZW50LFxuICAgIHZub2RlLFxuICAgIHByb3h5LFxuICAgIHdpdGhQcm94eSxcbiAgICBwcm9wcyxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdLFxuICAgIHNsb3RzLFxuICAgIGF0dHJzLFxuICAgIGVtaXQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlckNhY2hlLFxuICAgIGRhdGEsXG4gICAgc2V0dXBTdGF0ZSxcbiAgICBjdHgsXG4gICAgaW5oZXJpdEF0dHJzXG4gIH0gPSBpbnN0YW5jZTtcbiAgbGV0IHJlc3VsdDtcbiAgbGV0IGZhbGx0aHJvdWdoQXR0cnM7XG4gIGNvbnN0IHByZXYgPSBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFjY2Vzc2VkQXR0cnMgPSBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA0KSB7XG4gICAgICBjb25zdCBwcm94eVRvVXNlID0gd2l0aFByb3h5IHx8IHByb3h5O1xuICAgICAgcmVzdWx0ID0gbm9ybWFsaXplVk5vZGUoXG4gICAgICAgIHJlbmRlci5jYWxsKFxuICAgICAgICAgIHByb3h5VG9Vc2UsXG4gICAgICAgICAgcHJveHlUb1VzZSxcbiAgICAgICAgICByZW5kZXJDYWNoZSxcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBzZXR1cFN0YXRlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY3R4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbmRlcjIgPSBDb21wb25lbnQ7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhdHRycyA9PT0gcHJvcHMpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIyLmxlbmd0aCA+IDEgPyByZW5kZXIyKFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgICAgICAgIHJldHVybiBhdHRycztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbG90cyxcbiAgICAgICAgICAgIGVtaXRcbiAgICAgICAgICB9IDogeyBhdHRycywgc2xvdHMsIGVtaXQgfVxuICAgICAgICApIDogcmVuZGVyMihcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICAgLyogd2Uga25vdyBpdCBkb2Vzbid0IG5lZWQgaXQgKi9cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBDb21wb25lbnQucHJvcHMgPyBhdHRycyA6IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaChhdHRycyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBibG9ja1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgMSk7XG4gICAgcmVzdWx0ID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gIH1cbiAgbGV0IHJvb3QgPSByZXN1bHQ7XG4gIGxldCBzZXRSb290ID0gdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByZXN1bHQucGF0Y2hGbGFnID4gMCAmJiByZXN1bHQucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIFtyb290LCBzZXRSb290XSA9IGdldENoaWxkUm9vdChyZXN1bHQpO1xuICB9XG4gIGlmIChmYWxsdGhyb3VnaEF0dHJzICYmIGluaGVyaXRBdHRycyAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmFsbHRocm91Z2hBdHRycyk7XG4gICAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHJvb3Q7XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2KSkge1xuICAgICAgICBpZiAocHJvcHNPcHRpb25zICYmIGtleXMuc29tZShpc01vZGVsTGlzdGVuZXIpKSB7XG4gICAgICAgICAgZmFsbHRocm91Z2hBdHRycyA9IGZpbHRlck1vZGVsTGlzdGVuZXJzKFxuICAgICAgICAgICAgZmFsbHRocm91Z2hBdHRycyxcbiAgICAgICAgICAgIHByb3BzT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdCA9IGNsb25lVk5vZGUocm9vdCwgZmFsbHRocm91Z2hBdHRycyk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWFjY2Vzc2VkQXR0cnMgJiYgcm9vdC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIGNvbnN0IGFsbEF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpO1xuICAgICAgICBjb25zdCBldmVudEF0dHJzID0gW107XG4gICAgICAgIGNvbnN0IGV4dHJhQXR0cnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhbGxBdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBhbGxBdHRyc1tpXTtcbiAgICAgICAgICBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICAgICAgICAgIGV2ZW50QXR0cnMucHVzaChrZXlbMl0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4dHJhQXR0cnMucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmFBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLXByb3BzIGF0dHJpYnV0ZXMgKCR7ZXh0cmFBdHRycy5qb2luKFwiLCBcIil9KSB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLWVtaXRzIGV2ZW50IGxpc3RlbmVycyAoJHtldmVudEF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiBJZiB0aGUgbGlzdGVuZXIgaXMgaW50ZW5kZWQgdG8gYmUgYSBjb21wb25lbnQgY3VzdG9tIGV2ZW50IGxpc3RlbmVyIG9ubHksIGRlY2xhcmUgaXQgdXNpbmcgdGhlIFwiZW1pdHNcIiBvcHRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNFbGVtZW50Um9vdChyb290KSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFJ1bnRpbWUgZGlyZWN0aXZlIHVzZWQgb24gY29tcG9uZW50IHdpdGggbm9uLWVsZW1lbnQgcm9vdCBub2RlLiBUaGUgZGlyZWN0aXZlcyB3aWxsIG5vdCBmdW5jdGlvbiBhcyBpbnRlbmRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290ID0gY2xvbmVWTm9kZShyb290KTtcbiAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgfVxuICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgQ29tcG9uZW50IGluc2lkZSA8VHJhbnNpdGlvbj4gcmVuZGVycyBub24tZWxlbWVudCByb290IG5vZGUgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdC50cmFuc2l0aW9uID0gdm5vZGUudHJhbnNpdGlvbjtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXRSb290KSB7XG4gICAgc2V0Um9vdChyb290KTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSByb290O1xuICB9XG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGdldENoaWxkUm9vdCA9ICh2bm9kZSkgPT4ge1xuICBjb25zdCByYXdDaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICBjb25zdCBkeW5hbWljQ2hpbGRyZW4gPSB2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gIGNvbnN0IGNoaWxkUm9vdCA9IGZpbHRlclNpbmdsZVJvb3QocmF3Q2hpbGRyZW4pO1xuICBpZiAoIWNoaWxkUm9vdCkge1xuICAgIHJldHVybiBbdm5vZGUsIHZvaWQgMF07XG4gIH1cbiAgY29uc3QgaW5kZXggPSByYXdDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCk7XG4gIGNvbnN0IGR5bmFtaWNJbmRleCA9IGR5bmFtaWNDaGlsZHJlbiA/IGR5bmFtaWNDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCkgOiAtMTtcbiAgY29uc3Qgc2V0Um9vdCA9ICh1cGRhdGVkUm9vdCkgPT4ge1xuICAgIHJhd0NoaWxkcmVuW2luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIGlmIChkeW5hbWljSW5kZXggPiAtMSkge1xuICAgICAgICBkeW5hbWljQ2hpbGRyZW5bZHluYW1pY0luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgICAgfSBlbHNlIGlmICh1cGRhdGVkUm9vdC5wYXRjaEZsYWcgPiAwKSB7XG4gICAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IFsuLi5keW5hbWljQ2hpbGRyZW4sIHVwZGF0ZWRSb290XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBbbm9ybWFsaXplVk5vZGUoY2hpbGRSb290KSwgc2V0Um9vdF07XG59O1xuZnVuY3Rpb24gZmlsdGVyU2luZ2xlUm9vdChjaGlsZHJlbikge1xuICBsZXQgc2luZ2xlUm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gQ29tbWVudCB8fCBjaGlsZC5jaGlsZHJlbiA9PT0gXCJ2LWlmXCIpIHtcbiAgICAgICAgaWYgKHNpbmdsZVJvb3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2luZ2xlUm9vdCA9IGNoaWxkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpbmdsZVJvb3Q7XG59XG5jb25zdCBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2ggPSAoYXR0cnMpID0+IHtcbiAgbGV0IHJlcztcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIgfHwga2V5ID09PSBcInN0eWxlXCIgfHwgaXNPbihrZXkpKSB7XG4gICAgICAocmVzIHx8IChyZXMgPSB7fSkpW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGZpbHRlck1vZGVsTGlzdGVuZXJzID0gKGF0dHJzLCBwcm9wcykgPT4ge1xuICBjb25zdCByZXMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpIHx8ICEoa2V5LnNsaWNlKDkpIGluIHByb3BzKSkge1xuICAgICAgcmVzW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGlzRWxlbWVudFJvb3QgPSAodm5vZGUpID0+IHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmICg2IHwgMSkgfHwgdm5vZGUudHlwZSA9PT0gQ29tbWVudDtcbn07XG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldlZOb2RlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkge1xuICBjb25zdCB7IHByb3BzOiBwcmV2UHJvcHMsIGNoaWxkcmVuOiBwcmV2Q2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcHJldlZOb2RlO1xuICBjb25zdCB7IHByb3BzOiBuZXh0UHJvcHMsIGNoaWxkcmVuOiBuZXh0Q2hpbGRyZW4sIHBhdGNoRmxhZyB9ID0gbmV4dFZOb2RlO1xuICBjb25zdCBlbWl0cyA9IGNvbXBvbmVudC5lbWl0c09wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG5leHRWTm9kZS5kaXJzIHx8IG5leHRWTm9kZS50cmFuc2l0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG9wdGltaXplZCAmJiBwYXRjaEZsYWcgPj0gMCkge1xuICAgIGlmIChwYXRjaEZsYWcgJiAxMDI0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0cyk7XG4gICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICBjb25zdCBkeW5hbWljUHJvcHMgPSBuZXh0Vk5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZHluYW1pY1Byb3BzW2ldO1xuICAgICAgICBpZiAobmV4dFByb3BzW2tleV0gIT09IHByZXZQcm9wc1trZXldICYmICFpc0VtaXRMaXN0ZW5lcihlbWl0cywga2V5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiB8fCAhbmV4dENoaWxkcmVuLiRzdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2UHJvcHMgPT09IG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgIH1cbiAgICBpZiAoIW5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzT3B0aW9ucykge1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIGlmIChuZXh0S2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHByZXZQcm9wcykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IG5leHRLZXlzW2ldO1xuICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhPQ0hvc3RFbCh7IHZub2RlLCBwYXJlbnQgfSwgZWwpIHtcbiAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuc3ViVHJlZSA9PT0gdm5vZGUpIHtcbiAgICAodm5vZGUgPSBwYXJlbnQudm5vZGUpLmVsID0gZWw7XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgfVxufVxuXG5jb25zdCBDT01QT05FTlRTID0gXCJjb21wb25lbnRzXCI7XG5jb25zdCBESVJFQ1RJVkVTID0gXCJkaXJlY3RpdmVzXCI7XG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50KG5hbWUsIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIG5hbWUsIHRydWUsIG1heWJlU2VsZlJlZmVyZW5jZSkgfHwgbmFtZTtcbn1cbmNvbnN0IE5VTExfRFlOQU1JQ19DT01QT05FTlQgPSBTeW1ib2wuZm9yKFwidi1uZGNcIik7XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIGNvbXBvbmVudCwgZmFsc2UpIHx8IGNvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tcG9uZW50IHx8IE5VTExfRFlOQU1JQ19DT01QT05FTlQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmUobmFtZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KERJUkVDVElWRVMsIG5hbWUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0KHR5cGUsIG5hbWUsIHdhcm5NaXNzaW5nID0gdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEluc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmICh0eXBlID09PSBDT01QT05FTlRTKSB7XG4gICAgICBjb25zdCBzZWxmTmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgZmFsc2VcbiAgICAgICAgLyogZG8gbm90IGluY2x1ZGUgaW5mZXJyZWQgbmFtZSB0byBhdm9pZCBicmVha2luZyBleGlzdGluZyBjb2RlICovXG4gICAgICApO1xuICAgICAgaWYgKHNlbGZOYW1lICYmIChzZWxmTmFtZSA9PT0gbmFtZSB8fCBzZWxmTmFtZSA9PT0gY2FtZWxpemUobmFtZSkgfHwgc2VsZk5hbWUgPT09IGNhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpKSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSAoXG4gICAgICAvLyBsb2NhbCByZWdpc3RyYXRpb25cbiAgICAgIC8vIGNoZWNrIGluc3RhbmNlW3R5cGVdIGZpcnN0IHdoaWNoIGlzIHJlc29sdmVkIGZvciBvcHRpb25zIEFQSVxuICAgICAgcmVzb2x2ZShpbnN0YW5jZVt0eXBlXSB8fCBDb21wb25lbnRbdHlwZV0sIG5hbWUpIHx8IC8vIGdsb2JhbCByZWdpc3RyYXRpb25cbiAgICAgIHJlc29sdmUoaW5zdGFuY2UuYXBwQ29udGV4dFt0eXBlXSwgbmFtZSlcbiAgICApO1xuICAgIGlmICghcmVzICYmIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykge1xuICAgICAgY29uc3QgZXh0cmEgPSB0eXBlID09PSBDT01QT05FTlRTID8gYFxuSWYgdGhpcyBpcyBhIG5hdGl2ZSBjdXN0b20gZWxlbWVudCwgbWFrZSBzdXJlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBjb21wb25lbnQgcmVzb2x1dGlvbiB2aWEgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudC5gIDogYGA7XG4gICAgICB3YXJuKGBGYWlsZWQgdG8gcmVzb2x2ZSAke3R5cGUuc2xpY2UoMCwgLTEpfTogJHtuYW1lfSR7ZXh0cmF9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oXG4gICAgICBgcmVzb2x2ZSR7Y2FwaXRhbGl6ZSh0eXBlLnNsaWNlKDAsIC0xKSl9IGNhbiBvbmx5IGJlIHVzZWQgaW4gcmVuZGVyKCkgb3Igc2V0dXAoKS5gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZShyZWdpc3RyeSwgbmFtZSkge1xuICByZXR1cm4gcmVnaXN0cnkgJiYgKHJlZ2lzdHJ5W25hbWVdIHx8IHJlZ2lzdHJ5W2NhbWVsaXplKG5hbWUpXSB8fCByZWdpc3RyeVtjYXBpdGFsaXplKGNhbWVsaXplKG5hbWUpKV0pO1xufVxuXG5jb25zdCBpc1N1c3BlbnNlID0gKHR5cGUpID0+IHR5cGUuX19pc1N1c3BlbnNlO1xuY29uc3QgU3VzcGVuc2VJbXBsID0ge1xuICBuYW1lOiBcIlN1c3BlbnNlXCIsXG4gIC8vIEluIG9yZGVyIHRvIG1ha2UgU3VzcGVuc2UgdHJlZS1zaGFrYWJsZSwgd2UgbmVlZCB0byBhdm9pZCBpbXBvcnRpbmcgaXRcbiAgLy8gZGlyZWN0bHkgaW4gdGhlIHJlbmRlcmVyLiBUaGUgcmVuZGVyZXIgY2hlY2tzIGZvciB0aGUgX19pc1N1c3BlbnNlIGZsYWdcbiAgLy8gb24gYSB2bm9kZSdzIHR5cGUgYW5kIGNhbGxzIHRoZSBgcHJvY2Vzc2AgbWV0aG9kLCBwYXNzaW5nIGluIHJlbmRlcmVyXG4gIC8vIGludGVybmFscy5cbiAgX19pc1N1c3BlbnNlOiB0cnVlLFxuICBwcm9jZXNzKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgbW91bnRTdXNwZW5zZShcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHNcbiAgICAgICk7XG4gICAgfVxuICB9LFxuICBoeWRyYXRlOiBoeWRyYXRlU3VzcGVuc2UsXG4gIGNyZWF0ZTogY3JlYXRlU3VzcGVuc2VCb3VuZGFyeSxcbiAgbm9ybWFsaXplOiBub3JtYWxpemVTdXNwZW5zZUNoaWxkcmVuXG59O1xuY29uc3QgU3VzcGVuc2UgPSBTdXNwZW5zZUltcGwgO1xuZnVuY3Rpb24gdHJpZ2dlckV2ZW50KHZub2RlLCBuYW1lKSB7XG4gIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wc1tuYW1lXTtcbiAgaWYgKGlzRnVuY3Rpb24oZXZlbnRMaXN0ZW5lcikpIHtcbiAgICBldmVudExpc3RlbmVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2Uodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGFuY2hvcixcbiAgICBpc1NWRyxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkLFxuICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICk7XG4gIHBhdGNoKFxuICAgIG51bGwsXG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCxcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgbnVsbCxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgc3VzcGVuc2UsXG4gICAgaXNTVkcsXG4gICAgc2xvdFNjb3BlSWRzXG4gICk7XG4gIGlmIChzdXNwZW5zZS5kZXBzID4gMCkge1xuICAgIHRyaWdnZXJFdmVudCh2bm9kZSwgXCJvblBlbmRpbmdcIik7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uRmFsbGJhY2tcIik7XG4gICAgcGF0Y2goXG4gICAgICBudWxsLFxuICAgICAgdm5vZGUuc3NGYWxsYmFjayxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGFuY2hvcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIG51bGwsXG4gICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgaXNTVkcsXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgdm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHsgcDogcGF0Y2gsIHVtOiB1bm1vdW50LCBvOiB7IGNyZWF0ZUVsZW1lbnQgfSB9KSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gbjIuc3VzcGVuc2UgPSBuMS5zdXNwZW5zZTtcbiAgc3VzcGVuc2Uudm5vZGUgPSBuMjtcbiAgbjIuZWwgPSBuMS5lbDtcbiAgY29uc3QgbmV3QnJhbmNoID0gbjIuc3NDb250ZW50O1xuICBjb25zdCBuZXdGYWxsYmFjayA9IG4yLnNzRmFsbGJhY2s7XG4gIGNvbnN0IHsgYWN0aXZlQnJhbmNoLCBwZW5kaW5nQnJhbmNoLCBpc0luRmFsbGJhY2ssIGlzSHlkcmF0aW5nIH0gPSBzdXNwZW5zZTtcbiAgaWYgKHBlbmRpbmdCcmFuY2gpIHtcbiAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbmV3QnJhbmNoO1xuICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBwZW5kaW5nQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdGYWxsYmFjayxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIG5ld0ZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0lkKys7XG4gICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gcGVuZGluZ0JyYW5jaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVubW91bnQocGVuZGluZ0JyYW5jaCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5kZXBzID0gMDtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMubGVuZ3RoID0gMDtcbiAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBpZiAoaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgICAgICBuZXdGYWxsYmFjayxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYWN0aXZlQnJhbmNoICYmIGlzU2FtZVZOb2RlVHlwZShuZXdCcmFuY2gsIGFjdGl2ZUJyYW5jaCkpIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3QnJhbmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckV2ZW50KG4yLCBcIm9uUGVuZGluZ1wiKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nSWQrKztcbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQsIHBlbmRpbmdJZCB9ID0gc3VzcGVuc2U7XG4gICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdJZCA9PT0gcGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIHN1c3BlbnNlLmZhbGxiYWNrKG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aW1lb3V0ID09PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5sZXQgaGFzV2FybmVkID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KHZub2RlLCBwYXJlbnRTdXNwZW5zZSwgcGFyZW50Q29tcG9uZW50LCBjb250YWluZXIsIGhpZGRlbkNvbnRhaW5lciwgYW5jaG9yLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBpc0h5ZHJhdGluZyA9IGZhbHNlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUgJiYgIWhhc1dhcm5lZCkge1xuICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgY29uc29sZVtjb25zb2xlLmluZm8gPyBcImluZm9cIiA6IFwibG9nXCJdKFxuICAgICAgYDxTdXNwZW5zZT4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGl0cyBBUEkgd2lsbCBsaWtlbHkgY2hhbmdlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBtOiBtb3ZlLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG46IG5leHQsXG4gICAgbzogeyBwYXJlbnROb2RlLCByZW1vdmUgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGxldCBwYXJlbnRTdXNwZW5zZUlkO1xuICBjb25zdCBpc1N1c3BlbnNpYmxlID0gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKTtcbiAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgPT0gbnVsbCA/IHZvaWQgMCA6IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlSWQgPSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQ7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzKys7XG4gICAgfVxuICB9XG4gIGNvbnN0IHRpbWVvdXQgPSB2bm9kZS5wcm9wcyA/IHRvTnVtYmVyKHZub2RlLnByb3BzLnRpbWVvdXQpIDogdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcih0aW1lb3V0LCBgU3VzcGVuc2UgdGltZW91dGApO1xuICB9XG4gIGNvbnN0IHN1c3BlbnNlID0ge1xuICAgIHZub2RlLFxuICAgIHBhcmVudDogcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIGlzU1ZHLFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgYW5jaG9yLFxuICAgIGRlcHM6IDAsXG4gICAgcGVuZGluZ0lkOiAwLFxuICAgIHRpbWVvdXQ6IHR5cGVvZiB0aW1lb3V0ID09PSBcIm51bWJlclwiID8gdGltZW91dCA6IC0xLFxuICAgIGFjdGl2ZUJyYW5jaDogbnVsbCxcbiAgICBwZW5kaW5nQnJhbmNoOiBudWxsLFxuICAgIGlzSW5GYWxsYmFjazogdHJ1ZSxcbiAgICBpc0h5ZHJhdGluZyxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgZWZmZWN0czogW10sXG4gICAgcmVzb2x2ZShyZXN1bWUgPSBmYWxzZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAoIXJlc3VtZSAmJiAhc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VzcGVuc2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB2bm9kZTogdm5vZGUyLFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdJZCxcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcjJcbiAgICAgIH0gPSBzdXNwZW5zZTtcbiAgICAgIGxldCBkZWxheUVudGVyID0gZmFsc2U7XG4gICAgICBpZiAoc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3VtZSkge1xuICAgICAgICBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PT0gc3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIG1vdmUocGVuZGluZ0JyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgMCk7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBhbmNob3I6IGFuY2hvcjIgfSA9IHN1c3BlbnNlO1xuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgICAgICB1bm1vdW50KGFjdGl2ZUJyYW5jaCwgcGFyZW50Q29tcG9uZW50Miwgc3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICAgIG1vdmUocGVuZGluZ0JyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgcGVuZGluZ0JyYW5jaCk7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbnVsbDtcbiAgICAgIHN1c3BlbnNlLmlzSW5GYWxsYmFjayA9IGZhbHNlO1xuICAgICAgbGV0IHBhcmVudCA9IHN1c3BlbnNlLnBhcmVudDtcbiAgICAgIGxldCBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgICAgcGFyZW50LmVmZmVjdHMucHVzaCguLi5lZmZlY3RzKTtcbiAgICAgICAgICBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1VucmVzb2x2ZWRBbmNlc3RvciAmJiAhZGVsYXlFbnRlcikge1xuICAgICAgICBxdWV1ZVBvc3RGbHVzaENiKGVmZmVjdHMpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZWZmZWN0cyA9IFtdO1xuICAgICAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgcGFyZW50U3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UuZGVwcy0tO1xuICAgICAgICAgIGlmIChwYXJlbnRTdXNwZW5zZS5kZXBzID09PSAwICYmICFzeW5jKSB7XG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQodm5vZGUyLCBcIm9uUmVzb2x2ZVwiKTtcbiAgICB9LFxuICAgIGZhbGxiYWNrKGZhbGxiYWNrVk5vZGUpIHtcbiAgICAgIGlmICghc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHZub2RlOiB2bm9kZTIsIGFjdGl2ZUJyYW5jaCwgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLCBjb250YWluZXI6IGNvbnRhaW5lcjIsIGlzU1ZHOiBpc1NWRzIgfSA9IHN1c3BlbnNlO1xuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvbkZhbGxiYWNrXCIpO1xuICAgICAgY29uc3QgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgIGNvbnN0IG1vdW50RmFsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZmFsbGJhY2tWTm9kZSxcbiAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgaXNTVkcyLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBmYWxsYmFja1ZOb2RlKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWxheUVudGVyID0gZmFsbGJhY2tWTm9kZS50cmFuc2l0aW9uICYmIGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbi5tb2RlID09PSBcIm91dC1pblwiO1xuICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9IG1vdW50RmFsbGJhY2s7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgdW5tb3VudChcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBudWxsLFxuICAgICAgICAvLyBubyBzdXNwZW5zZSBzbyB1bm1vdW50IGhvb2tzIGZpcmUgbm93XG4gICAgICAgIHRydWVcbiAgICAgICAgLy8gc2hvdWxkUmVtb3ZlXG4gICAgICApO1xuICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgIG1vdW50RmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vdmUoY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSkge1xuICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoICYmIG1vdmUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IyLCB0eXBlKTtcbiAgICAgIHN1c3BlbnNlLmNvbnRhaW5lciA9IGNvbnRhaW5lcjI7XG4gICAgfSxcbiAgICBuZXh0KCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBuZXh0KHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCk7XG4gICAgfSxcbiAgICByZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QpIHtcbiAgICAgIGNvbnN0IGlzSW5QZW5kaW5nU3VzcGVuc2UgPSAhIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2g7XG4gICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSkge1xuICAgICAgICBzdXNwZW5zZS5kZXBzKys7XG4gICAgICB9XG4gICAgICBjb25zdCBoeWRyYXRlZEVsID0gaW5zdGFuY2Uudm5vZGUuZWw7XG4gICAgICBpbnN0YW5jZS5hc3luY0RlcC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDApO1xuICAgICAgfSkudGhlbigoYXN5bmNTZXR1cFJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UucGVuZGluZ0lkICE9PSBpbnN0YW5jZS5zdXNwZW5zZUlkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IHZub2RlOiB2bm9kZTIgfSA9IGluc3RhbmNlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZTIpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBhc3luY1NldHVwUmVzdWx0LCBmYWxzZSk7XG4gICAgICAgIGlmIChoeWRyYXRlZEVsKSB7XG4gICAgICAgICAgdm5vZGUyLmVsID0gaHlkcmF0ZWRFbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICFoeWRyYXRlZEVsICYmIGluc3RhbmNlLnN1YlRyZWUuZWw7XG4gICAgICAgIHNldHVwUmVuZGVyRWZmZWN0KFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHZub2RlMixcbiAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGhhdmUgYmVlbiBtb3ZlZCBiZWZvcmUgcmVzb2x2ZS5cbiAgICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCBhIGh5ZHJhdGlvbiwgaW5zdGFuY2Uuc3ViVHJlZSB3aWxsIGJlIHRoZSBjb21tZW50XG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIuXG4gICAgICAgICAgcGFyZW50Tm9kZShoeWRyYXRlZEVsIHx8IGluc3RhbmNlLnN1YlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoaXMgaXMgaHlkcmF0aW9uLCBzbyBvbmx5IG5lZWQgdG9cbiAgICAgICAgICAvLyBjb25zaWRlciB0aGUgY29tbWVudCBwbGFjZWhvbGRlciBjYXNlLlxuICAgICAgICAgIGh5ZHJhdGVkRWwgPyBudWxsIDogbmV4dChpbnN0YW5jZS5zdWJUcmVlKSxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgcmVtb3ZlKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIT0NIb3N0RWwoaW5zdGFuY2UsIHZub2RlMi5lbCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSAmJiAtLXN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdW5tb3VudChwYXJlbnRTdXNwZW5zZTIsIGRvUmVtb3ZlKSB7XG4gICAgICBzdXNwZW5zZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgICBpZiAoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UyLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3VzcGVuc2U7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2Uobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGh5ZHJhdGVOb2RlKSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICBudWxsLFxuICAgIGlzU1ZHLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWQsXG4gICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgdHJ1ZVxuICAgIC8qIGh5ZHJhdGluZyAqL1xuICApO1xuICBjb25zdCByZXN1bHQgPSBoeWRyYXRlTm9kZShcbiAgICBub2RlLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWRcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICBzdXNwZW5zZS5yZXNvbHZlKGZhbHNlLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VDaGlsZHJlbih2bm9kZSkge1xuICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBpc1Nsb3RDaGlsZHJlbiA9IHNoYXBlRmxhZyAmIDMyO1xuICB2bm9kZS5zc0NvbnRlbnQgPSBub3JtYWxpemVTdXNwZW5zZVNsb3QoXG4gICAgaXNTbG90Q2hpbGRyZW4gPyBjaGlsZHJlbi5kZWZhdWx0IDogY2hpbGRyZW5cbiAgKTtcbiAgdm5vZGUuc3NGYWxsYmFjayA9IGlzU2xvdENoaWxkcmVuID8gbm9ybWFsaXplU3VzcGVuc2VTbG90KGNoaWxkcmVuLmZhbGxiYWNrKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VTbG90KHMpIHtcbiAgbGV0IGJsb2NrO1xuICBpZiAoaXNGdW5jdGlvbihzKSkge1xuICAgIGNvbnN0IHRyYWNrQmxvY2sgPSBpc0Jsb2NrVHJlZUVuYWJsZWQgJiYgcy5fYztcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IGZhbHNlO1xuICAgICAgb3BlbkJsb2NrKCk7XG4gICAgfVxuICAgIHMgPSBzKCk7XG4gICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgIHMuX2QgPSB0cnVlO1xuICAgICAgYmxvY2sgPSBjdXJyZW50QmxvY2s7XG4gICAgICBjbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG4gIGlmIChpc0FycmF5KHMpKSB7XG4gICAgY29uc3Qgc2luZ2xlQ2hpbGQgPSBmaWx0ZXJTaW5nbGVSb290KHMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFzaW5nbGVDaGlsZCAmJiBzLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkICE9PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKS5sZW5ndGggPiAwKSB7XG4gICAgICB3YXJuKGA8U3VzcGVuc2U+IHNsb3RzIGV4cGVjdCBhIHNpbmdsZSByb290IG5vZGUuYCk7XG4gICAgfVxuICAgIHMgPSBzaW5nbGVDaGlsZDtcbiAgfVxuICBzID0gbm9ybWFsaXplVk5vZGUocyk7XG4gIGlmIChibG9jayAmJiAhcy5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICBzLmR5bmFtaWNDaGlsZHJlbiA9IGJsb2NrLmZpbHRlcigoYykgPT4gYyAhPT0gcyk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZShmbiwgc3VzcGVuc2UpIHtcbiAgaWYgKHN1c3BlbnNlICYmIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICBpZiAoaXNBcnJheShmbikpIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaCguLi5mbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaChmbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIGJyYW5jaCkge1xuICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggPSBicmFuY2g7XG4gIGNvbnN0IHsgdm5vZGUsIHBhcmVudENvbXBvbmVudCB9ID0gc3VzcGVuc2U7XG4gIGNvbnN0IGVsID0gdm5vZGUuZWwgPSBicmFuY2guZWw7XG4gIGlmIChwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnN1YlRyZWUgPT09IHZub2RlKSB7XG4gICAgcGFyZW50Q29tcG9uZW50LnZub2RlLmVsID0gZWw7XG4gICAgdXBkYXRlSE9DSG9zdEVsKHBhcmVudENvbXBvbmVudCwgZWwpO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZOb2RlU3VzcGVuc2libGUodm5vZGUpIHtcbiAgdmFyIF9hO1xuICByZXR1cm4gKChfYSA9IHZub2RlLnByb3BzKSA9PSBudWxsID8gdm9pZCAwIDogX2Euc3VzcGVuc2libGUpICE9IG51bGwgJiYgdm5vZGUucHJvcHMuc3VzcGVuc2libGUgIT09IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB3YXRjaEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goZWZmZWN0LCBudWxsLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHdhdGNoUG9zdEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJwb3N0XCIgfSkgOiB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICk7XG59XG5mdW5jdGlvbiB3YXRjaFN5bmNFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKFxuICAgIGVmZmVjdCxcbiAgICBudWxsLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBleHRlbmQoe30sIG9wdGlvbnMsIHsgZmx1c2g6IFwic3luY1wiIH0pIDogeyBmbHVzaDogXCJzeW5jXCIgfVxuICApO1xufVxuY29uc3QgSU5JVElBTF9XQVRDSEVSX1ZBTFVFID0ge307XG5mdW5jdGlvbiB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgIHdhcm4oXG4gICAgICBgXFxgd2F0Y2goZm4sIG9wdGlvbnM/KVxcYCBzaWduYXR1cmUgaGFzIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBBUEkuIFVzZSBcXGB3YXRjaEVmZmVjdChmbiwgb3B0aW9ucz8pXFxgIGluc3RlYWQuIFxcYHdhdGNoXFxgIG5vdyBvbmx5IHN1cHBvcnRzIFxcYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGRvV2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkb1dhdGNoKHNvdXJjZSwgY2IsIHsgaW1tZWRpYXRlLCBkZWVwLCBmbHVzaCwgb25UcmFjaywgb25UcmlnZ2VyIH0gPSBFTVBUWV9PQkopIHtcbiAgdmFyIF9hO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGB3YXRjaCgpIFwiaW1tZWRpYXRlXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlZXAgIT09IHZvaWQgMCkge1xuICAgICAgd2FybihcbiAgICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgd2FybkludmFsaWRTb3VyY2UgPSAocykgPT4ge1xuICAgIHdhcm4oXG4gICAgICBgSW52YWxpZCB3YXRjaCBzb3VyY2U6IGAsXG4gICAgICBzLFxuICAgICAgYEEgd2F0Y2ggc291cmNlIGNhbiBvbmx5IGJlIGEgZ2V0dGVyL2VmZmVjdCBmdW5jdGlvbiwgYSByZWYsIGEgcmVhY3RpdmUgb2JqZWN0LCBvciBhbiBhcnJheSBvZiB0aGVzZSB0eXBlcy5gXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50U2NvcGUoKSA9PT0gKChfYSA9IGN1cnJlbnRJbnN0YW5jZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnNjb3BlKSA/IGN1cnJlbnRJbnN0YW5jZSA6IG51bGw7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBmb3JjZVRyaWdnZXIgPSBmYWxzZTtcbiAgbGV0IGlzTXVsdGlTb3VyY2UgPSBmYWxzZTtcbiAgaWYgKGlzUmVmKHNvdXJjZSkpIHtcbiAgICBnZXR0ZXIgPSAoKSA9PiBzb3VyY2UudmFsdWU7XG4gICAgZm9yY2VUcmlnZ2VyID0gaXNTaGFsbG93JDEoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKHNvdXJjZSkpIHtcbiAgICBnZXR0ZXIgPSAoKSA9PiBzb3VyY2U7XG4gICAgZGVlcCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXNBcnJheShzb3VyY2UpKSB7XG4gICAgaXNNdWx0aVNvdXJjZSA9IHRydWU7XG4gICAgZm9yY2VUcmlnZ2VyID0gc291cmNlLnNvbWUoKHMpID0+IGlzUmVhY3RpdmUocykgfHwgaXNTaGFsbG93JDEocykpO1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAoKHMpID0+IHtcbiAgICAgIGlmIChpc1JlZihzKSkge1xuICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShzKSkge1xuICAgICAgICByZXR1cm4gdHJhdmVyc2Uocyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhzLCBpbnN0YW5jZSwgMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIGlmIChjYikge1xuICAgICAgZ2V0dGVyID0gKCkgPT4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHNvdXJjZSwgaW5zdGFuY2UsIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5pc1VubW91bnRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYW51cCkge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIDMsXG4gICAgICAgICAgW29uQ2xlYW51cF1cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGdldHRlciA9IE5PT1A7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuSW52YWxpZFNvdXJjZShzb3VyY2UpO1xuICB9XG4gIGlmIChjYiAmJiBkZWVwKSB7XG4gICAgY29uc3QgYmFzZUdldHRlciA9IGdldHRlcjtcbiAgICBnZXR0ZXIgPSAoKSA9PiB0cmF2ZXJzZShiYXNlR2V0dGVyKCkpO1xuICB9XG4gIGxldCBjbGVhbnVwO1xuICBsZXQgb25DbGVhbnVwID0gKGZuKSA9PiB7XG4gICAgY2xlYW51cCA9IGVmZmVjdC5vblN0b3AgPSAoKSA9PiB7XG4gICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCA0KTtcbiAgICB9O1xuICB9O1xuICBsZXQgc3NyQ2xlYW51cDtcbiAgaWYgKGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgIG9uQ2xlYW51cCA9IE5PT1A7XG4gICAgaWYgKCFjYikge1xuICAgICAgZ2V0dGVyKCk7XG4gICAgfSBlbHNlIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGNiLCBpbnN0YW5jZSwgMywgW1xuICAgICAgICBnZXR0ZXIoKSxcbiAgICAgICAgaXNNdWx0aVNvdXJjZSA/IFtdIDogdm9pZCAwLFxuICAgICAgICBvbkNsZWFudXBcbiAgICAgIF0pO1xuICAgIH1cbiAgICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgICBjb25zdCBjdHggPSB1c2VTU1JDb250ZXh0KCk7XG4gICAgICBzc3JDbGVhbnVwID0gY3R4Ll9fd2F0Y2hlckhhbmRsZXMgfHwgKGN0eC5fX3dhdGNoZXJIYW5kbGVzID0gW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gTk9PUDtcbiAgICB9XG4gIH1cbiAgbGV0IG9sZFZhbHVlID0gaXNNdWx0aVNvdXJjZSA/IG5ldyBBcnJheShzb3VyY2UubGVuZ3RoKS5maWxsKElOSVRJQUxfV0FUQ0hFUl9WQUxVRSkgOiBJTklUSUFMX1dBVENIRVJfVkFMVUU7XG4gIGNvbnN0IGpvYiA9ICgpID0+IHtcbiAgICBpZiAoIWVmZmVjdC5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNiKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGVmZmVjdC5ydW4oKTtcbiAgICAgIGlmIChkZWVwIHx8IGZvcmNlVHJpZ2dlciB8fCAoaXNNdWx0aVNvdXJjZSA/IG5ld1ZhbHVlLnNvbWUoKHYsIGkpID0+IGhhc0NoYW5nZWQodiwgb2xkVmFsdWVbaV0pKSA6IGhhc0NoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKSkgfHwgZmFsc2UpIHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoY2IsIGluc3RhbmNlLCAzLCBbXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgLy8gcGFzcyB1bmRlZmluZWQgYXMgdGhlIG9sZCB2YWx1ZSB3aGVuIGl0J3MgY2hhbmdlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBvbGRWYWx1ZSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gdm9pZCAwIDogaXNNdWx0aVNvdXJjZSAmJiBvbGRWYWx1ZVswXSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gW10gOiBvbGRWYWx1ZSxcbiAgICAgICAgICBvbkNsZWFudXBcbiAgICAgICAgXSk7XG4gICAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gIH07XG4gIGpvYi5hbGxvd1JlY3Vyc2UgPSAhIWNiO1xuICBsZXQgc2NoZWR1bGVyO1xuICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgc2NoZWR1bGVyID0gam9iO1xuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHNjaGVkdWxlciA9ICgpID0+IHF1ZXVlUG9zdFJlbmRlckVmZmVjdChqb2IsIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlKTtcbiAgfSBlbHNlIHtcbiAgICBqb2IucHJlID0gdHJ1ZTtcbiAgICBpZiAoaW5zdGFuY2UpXG4gICAgICBqb2IuaWQgPSBpbnN0YW5jZS51aWQ7XG4gICAgc2NoZWR1bGVyID0gKCkgPT4gcXVldWVKb2Ioam9iKTtcbiAgfVxuICBjb25zdCBlZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZ2V0dGVyLCBzY2hlZHVsZXIpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGVmZmVjdC5vblRyYWNrID0gb25UcmFjaztcbiAgICBlZmZlY3Qub25UcmlnZ2VyID0gb25UcmlnZ2VyO1xuICB9XG4gIGlmIChjYikge1xuICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIGpvYigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbGRWYWx1ZSA9IGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZmx1c2ggPT09IFwicG9zdFwiKSB7XG4gICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgZWZmZWN0LnJ1bi5iaW5kKGVmZmVjdCksXG4gICAgICBpbnN0YW5jZSAmJiBpbnN0YW5jZS5zdXNwZW5zZVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgZWZmZWN0LnJ1bigpO1xuICB9XG4gIGNvbnN0IHVud2F0Y2ggPSAoKSA9PiB7XG4gICAgZWZmZWN0LnN0b3AoKTtcbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc2NvcGUpIHtcbiAgICAgIHJlbW92ZShpbnN0YW5jZS5zY29wZS5lZmZlY3RzLCBlZmZlY3QpO1xuICAgIH1cbiAgfTtcbiAgaWYgKHNzckNsZWFudXApXG4gICAgc3NyQ2xlYW51cC5wdXNoKHVud2F0Y2gpO1xuICByZXR1cm4gdW53YXRjaDtcbn1cbmZ1bmN0aW9uIGluc3RhbmNlV2F0Y2goc291cmNlLCB2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBwdWJsaWNUaGlzID0gdGhpcy5wcm94eTtcbiAgY29uc3QgZ2V0dGVyID0gaXNTdHJpbmcoc291cmNlKSA/IHNvdXJjZS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIHNvdXJjZSkgOiAoKSA9PiBwdWJsaWNUaGlzW3NvdXJjZV0gOiBzb3VyY2UuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgbGV0IGNiO1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBjYiA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNiID0gdmFsdWUuaGFuZGxlcjtcbiAgICBvcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgY3VyID0gY3VycmVudEluc3RhbmNlO1xuICBzZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7XG4gIGNvbnN0IHJlcyA9IGRvV2F0Y2goZ2V0dGVyLCBjYi5iaW5kKHB1YmxpY1RoaXMpLCBvcHRpb25zKTtcbiAgaWYgKGN1cikge1xuICAgIHNldEN1cnJlbnRJbnN0YW5jZShjdXIpO1xuICB9IGVsc2Uge1xuICAgIHVuc2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhHZXR0ZXIoY3R4LCBwYXRoKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGN1ciA9IGN0eDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAmJiBjdXI7IGkrKykge1xuICAgICAgY3VyID0gY3VyW3NlZ21lbnRzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cjtcbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlKHZhbHVlLCBzZWVuKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlW1wiX192X3NraXBcIl0pIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuLmFkZCh2YWx1ZSk7XG4gIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB0cmF2ZXJzZSh2YWx1ZS52YWx1ZSwgc2Vlbik7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtpXSwgc2Vlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSB8fCBpc01hcCh2YWx1ZSkpIHtcbiAgICB2YWx1ZS5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICB0cmF2ZXJzZSh2LCBzZWVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtrZXldLCBzZWVuKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZURpcmVjdGl2ZU5hbWUobmFtZSkge1xuICBpZiAoaXNCdWlsdEluRGlyZWN0aXZlKG5hbWUpKSB7XG4gICAgd2FybihcIkRvIG5vdCB1c2UgYnVpbHQtaW4gZGlyZWN0aXZlIGlkcyBhcyBjdXN0b20gZGlyZWN0aXZlIGlkOiBcIiArIG5hbWUpO1xuICB9XG59XG5mdW5jdGlvbiB3aXRoRGlyZWN0aXZlcyh2bm9kZSwgZGlyZWN0aXZlcykge1xuICBjb25zdCBpbnRlcm5hbEluc3RhbmNlID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBpZiAoaW50ZXJuYWxJbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2Fybihgd2l0aERpcmVjdGl2ZXMgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgcmVuZGVyIGZ1bmN0aW9ucy5gKTtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRFeHBvc2VQcm94eShpbnRlcm5hbEluc3RhbmNlKSB8fCBpbnRlcm5hbEluc3RhbmNlLnByb3h5O1xuICBjb25zdCBiaW5kaW5ncyA9IHZub2RlLmRpcnMgfHwgKHZub2RlLmRpcnMgPSBbXSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlyZWN0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBbZGlyLCB2YWx1ZSwgYXJnLCBtb2RpZmllcnMgPSBFTVBUWV9PQkpdID0gZGlyZWN0aXZlc1tpXTtcbiAgICBpZiAoZGlyKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihkaXIpKSB7XG4gICAgICAgIGRpciA9IHtcbiAgICAgICAgICBtb3VudGVkOiBkaXIsXG4gICAgICAgICAgdXBkYXRlZDogZGlyXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZGlyLmRlZXApIHtcbiAgICAgICAgdHJhdmVyc2UodmFsdWUpO1xuICAgICAgfVxuICAgICAgYmluZGluZ3MucHVzaCh7XG4gICAgICAgIGRpcixcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBvbGRWYWx1ZTogdm9pZCAwLFxuICAgICAgICBhcmcsXG4gICAgICAgIG1vZGlmaWVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIHByZXZWTm9kZSwgaW5zdGFuY2UsIG5hbWUpIHtcbiAgY29uc3QgYmluZGluZ3MgPSB2bm9kZS5kaXJzO1xuICBjb25zdCBvbGRCaW5kaW5ncyA9IHByZXZWTm9kZSAmJiBwcmV2Vk5vZGUuZGlycztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTtcbiAgICBpZiAob2xkQmluZGluZ3MpIHtcbiAgICAgIGJpbmRpbmcub2xkVmFsdWUgPSBvbGRCaW5kaW5nc1tpXS52YWx1ZTtcbiAgICB9XG4gICAgbGV0IGhvb2sgPSBiaW5kaW5nLmRpcltuYW1lXTtcbiAgICBpZiAoaG9vaykge1xuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgaW5zdGFuY2UsIDgsIFtcbiAgICAgICAgdm5vZGUuZWwsXG4gICAgICAgIGJpbmRpbmcsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBwcmV2Vk5vZGVcbiAgICAgIF0pO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsZWF2ZUNiS2V5ID0gU3ltYm9sKFwiX2xlYXZlQ2JcIik7XG5jb25zdCBlbnRlckNiS2V5ID0gU3ltYm9sKFwiX2VudGVyQ2JcIik7XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uU3RhdGUoKSB7XG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgaXNMZWF2aW5nOiBmYWxzZSxcbiAgICBpc1VubW91bnRpbmc6IGZhbHNlLFxuICAgIGxlYXZpbmdWTm9kZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbiAgfTtcbiAgb25Nb3VudGVkKCgpID0+IHtcbiAgICBzdGF0ZS5pc01vdW50ZWQgPSB0cnVlO1xuICB9KTtcbiAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcbiAgICBzdGF0ZS5pc1VubW91bnRpbmcgPSB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuY29uc3QgVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IgPSBbRnVuY3Rpb24sIEFycmF5XTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBtb2RlOiBTdHJpbmcsXG4gIGFwcGVhcjogQm9vbGVhbixcbiAgcGVyc2lzdGVkOiBCb29sZWFuLFxuICAvLyBlbnRlclxuICBvbkJlZm9yZUVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25FbnRlcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQWZ0ZXJFbnRlcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uRW50ZXJDYW5jZWxsZWQ6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICAvLyBsZWF2ZVxuICBvbkJlZm9yZUxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25MZWF2ZTogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQWZ0ZXJMZWF2ZTogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uTGVhdmVDYW5jZWxsZWQ6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICAvLyBhcHBlYXJcbiAgb25CZWZvcmVBcHBlYXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQWZ0ZXJBcHBlYXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkFwcGVhckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3Jcbn07XG5jb25zdCBCYXNlVHJhbnNpdGlvbkltcGwgPSB7XG4gIG5hbWU6IGBCYXNlVHJhbnNpdGlvbmAsXG4gIHByb3BzOiBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB1c2VUcmFuc2l0aW9uU3RhdGUoKTtcbiAgICBsZXQgcHJldlRyYW5zaXRpb25LZXk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCAmJiBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oc2xvdHMuZGVmYXVsdCgpLCB0cnVlKTtcbiAgICAgIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgY2hpbGQgPSBjaGlsZHJlblswXTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGxldCBoYXNGb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoYy50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBoYXNGb3VuZCkge1xuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwiPHRyYW5zaXRpb24+IGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzaW5nbGUgZWxlbWVudCBvciBjb21wb25lbnQuIFVzZSA8dHJhbnNpdGlvbi1ncm91cD4gZm9yIGxpc3RzLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hpbGQgPSBjO1xuICAgICAgICAgICAgaGFzRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgeyBtb2RlIH0gPSByYXdQcm9wcztcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG1vZGUgJiYgbW9kZSAhPT0gXCJpbi1vdXRcIiAmJiBtb2RlICE9PSBcIm91dC1pblwiICYmIG1vZGUgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIHdhcm4oYGludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICR7bW9kZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5pc0xlYXZpbmcpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXJDaGlsZCA9IGdldEtlZXBBbGl2ZUNoaWxkKGNoaWxkKTtcbiAgICAgIGlmICghaW5uZXJDaGlsZCkge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbnRlckhvb2tzID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgaW5uZXJDaGlsZCxcbiAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBpbnN0YW5jZVxuICAgICAgKTtcbiAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhpbm5lckNoaWxkLCBlbnRlckhvb2tzKTtcbiAgICAgIGNvbnN0IG9sZENoaWxkID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgIGNvbnN0IG9sZElubmVyQ2hpbGQgPSBvbGRDaGlsZCAmJiBnZXRLZWVwQWxpdmVDaGlsZChvbGRDaGlsZCk7XG4gICAgICBsZXQgdHJhbnNpdGlvbktleUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHsgZ2V0VHJhbnNpdGlvbktleSB9ID0gaW5uZXJDaGlsZC50eXBlO1xuICAgICAgaWYgKGdldFRyYW5zaXRpb25LZXkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0VHJhbnNpdGlvbktleSgpO1xuICAgICAgICBpZiAocHJldlRyYW5zaXRpb25LZXkgPT09IHZvaWQgMCkge1xuICAgICAgICAgIHByZXZUcmFuc2l0aW9uS2V5ID0ga2V5O1xuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gcHJldlRyYW5zaXRpb25LZXkpIHtcbiAgICAgICAgICBwcmV2VHJhbnNpdGlvbktleSA9IGtleTtcbiAgICAgICAgICB0cmFuc2l0aW9uS2V5Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvbGRJbm5lckNoaWxkICYmIG9sZElubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCAmJiAoIWlzU2FtZVZOb2RlVHlwZShpbm5lckNoaWxkLCBvbGRJbm5lckNoaWxkKSB8fCB0cmFuc2l0aW9uS2V5Q2hhbmdlZCkpIHtcbiAgICAgICAgY29uc3QgbGVhdmluZ0hvb2tzID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICBvbGRJbm5lckNoaWxkLFxuICAgICAgICAgIHJhd1Byb3BzLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICk7XG4gICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhvbGRJbm5lckNoaWxkLCBsZWF2aW5nSG9va3MpO1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJvdXQtaW5cIikge1xuICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IHRydWU7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmFmdGVyTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS51cGRhdGUuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSBcImluLW91dFwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIGxlYXZpbmdIb29rcy5kZWxheUxlYXZlID0gKGVsLCBlYXJseVJlbW92ZSwgZGVsYXllZExlYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtTdHJpbmcob2xkSW5uZXJDaGlsZC5rZXkpXSA9IG9sZElubmVyQ2hpbGQ7XG4gICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgZWFybHlSZW1vdmUoKTtcbiAgICAgICAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZSA9IGRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uID0gQmFzZVRyYW5zaXRpb25JbXBsO1xuZnVuY3Rpb24gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgdm5vZGUpIHtcbiAgY29uc3QgeyBsZWF2aW5nVk5vZGVzIH0gPSBzdGF0ZTtcbiAgbGV0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGxlYXZpbmdWTm9kZXMuZ2V0KHZub2RlLnR5cGUpO1xuICBpZiAoIWxlYXZpbmdWTm9kZXNDYWNoZSkge1xuICAgIGxlYXZpbmdWTm9kZXNDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxlYXZpbmdWTm9kZXMuc2V0KHZub2RlLnR5cGUsIGxlYXZpbmdWTm9kZXNDYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGxlYXZpbmdWTm9kZXNDYWNoZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uSG9va3Modm5vZGUsIHByb3BzLCBzdGF0ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIGFwcGVhcixcbiAgICBtb2RlLFxuICAgIHBlcnNpc3RlZCA9IGZhbHNlLFxuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkFmdGVyRW50ZXIsXG4gICAgb25FbnRlckNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUxlYXZlLFxuICAgIG9uTGVhdmUsXG4gICAgb25BZnRlckxlYXZlLFxuICAgIG9uTGVhdmVDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVBcHBlYXIsXG4gICAgb25BcHBlYXIsXG4gICAgb25BZnRlckFwcGVhcixcbiAgICBvbkFwcGVhckNhbmNlbGxlZFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGtleSA9IFN0cmluZyh2bm9kZS5rZXkpO1xuICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKHN0YXRlLCB2bm9kZSk7XG4gIGNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MpID0+IHtcbiAgICBob29rICYmIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgaG9vayxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgOSxcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9O1xuICBjb25zdCBjYWxsQXN5bmNIb29rID0gKGhvb2ssIGFyZ3MpID0+IHtcbiAgICBjb25zdCBkb25lID0gYXJnc1sxXTtcbiAgICBjYWxsSG9vayhob29rLCBhcmdzKTtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaWYgKGhvb2suZXZlcnkoKGhvb2syKSA9PiBob29rMi5sZW5ndGggPD0gMSkpXG4gICAgICAgIGRvbmUoKTtcbiAgICB9IGVsc2UgaWYgKGhvb2subGVuZ3RoIDw9IDEpIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhvb2tzID0ge1xuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkLFxuICAgIGJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBsZXQgaG9vayA9IG9uQmVmb3JlRW50ZXI7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQmVmb3JlQXBwZWFyIHx8IG9uQmVmb3JlRW50ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZWxbbGVhdmVDYktleV0pIHtcbiAgICAgICAgZWxbbGVhdmVDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgbGVhdmluZ1ZOb2RlID0gbGVhdmluZ1ZOb2Rlc0NhY2hlW2tleV07XG4gICAgICBpZiAobGVhdmluZ1ZOb2RlICYmIGlzU2FtZVZOb2RlVHlwZSh2bm9kZSwgbGVhdmluZ1ZOb2RlKSAmJiBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0pIHtcbiAgICAgICAgbGVhdmluZ1ZOb2RlLmVsW2xlYXZlQ2JLZXldKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhob29rLCBbZWxdKTtcbiAgICB9LFxuICAgIGVudGVyKGVsKSB7XG4gICAgICBsZXQgaG9vayA9IG9uRW50ZXI7XG4gICAgICBsZXQgYWZ0ZXJIb29rID0gb25BZnRlckVudGVyO1xuICAgICAgbGV0IGNhbmNlbEhvb2sgPSBvbkVudGVyQ2FuY2VsbGVkO1xuICAgICAgaWYgKCFzdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgaWYgKGFwcGVhcikge1xuICAgICAgICAgIGhvb2sgPSBvbkFwcGVhciB8fCBvbkVudGVyO1xuICAgICAgICAgIGFmdGVySG9vayA9IG9uQWZ0ZXJBcHBlYXIgfHwgb25BZnRlckVudGVyO1xuICAgICAgICAgIGNhbmNlbEhvb2sgPSBvbkFwcGVhckNhbmNlbGxlZCB8fCBvbkVudGVyQ2FuY2VsbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IGVsW2VudGVyQ2JLZXldID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKGNhbmNlbEhvb2ssIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKGFmdGVySG9vaywgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvb2tzLmRlbGF5ZWRMZWF2ZSkge1xuICAgICAgICAgIGhvb2tzLmRlbGF5ZWRMZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsW2VudGVyQ2JLZXldID0gdm9pZCAwO1xuICAgICAgfTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2soaG9vaywgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsZWF2ZShlbCwgcmVtb3ZlKSB7XG4gICAgICBjb25zdCBrZXkyID0gU3RyaW5nKHZub2RlLmtleSk7XG4gICAgICBpZiAoZWxbZW50ZXJDYktleV0pIHtcbiAgICAgICAgZWxbZW50ZXJDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzVW5tb3VudGluZykge1xuICAgICAgICByZXR1cm4gcmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUxlYXZlLCBbZWxdKTtcbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSBlbFtsZWF2ZUNiS2V5XSA9IChjYW5jZWxsZWQpID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZClcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIHJlbW92ZSgpO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgY2FsbEhvb2sob25MZWF2ZUNhbmNlbGxlZCwgW2VsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbEhvb2sob25BZnRlckxlYXZlLCBbZWxdKTtcbiAgICAgICAgfVxuICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXSA9PT0gdm5vZGUpIHtcbiAgICAgICAgICBkZWxldGUgbGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdID0gdm5vZGU7XG4gICAgICBpZiAob25MZWF2ZSkge1xuICAgICAgICBjYWxsQXN5bmNIb29rKG9uTGVhdmUsIFtlbCwgZG9uZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xvbmUodm5vZGUyKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyh2bm9kZTIsIHByb3BzLCBzdGF0ZSwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhvb2tzO1xufVxuZnVuY3Rpb24gZW1wdHlQbGFjZWhvbGRlcih2bm9kZSkge1xuICBpZiAoaXNLZWVwQWxpdmUodm5vZGUpKSB7XG4gICAgdm5vZGUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IG51bGw7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG59XG5mdW5jdGlvbiBnZXRLZWVwQWxpdmVDaGlsZCh2bm9kZSkge1xuICByZXR1cm4gaXNLZWVwQWxpdmUodm5vZGUpID8gdm5vZGUuY2hpbGRyZW4gPyB2bm9kZS5jaGlsZHJlblswXSA6IHZvaWQgMCA6IHZub2RlO1xufVxuZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCBob29rcykge1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNiAmJiB2bm9kZS5jb21wb25lbnQpIHtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUuY29tcG9uZW50LnN1YlRyZWUsIGhvb2tzKTtcbiAgfSBlbHNlIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICB2bm9kZS5zc0NvbnRlbnQudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzQ29udGVudCk7XG4gICAgdm5vZGUuc3NGYWxsYmFjay50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGRyZW4sIGtlZXBDb21tZW50ID0gZmFsc2UsIHBhcmVudEtleSkge1xuICBsZXQgcmV0ID0gW107XG4gIGxldCBrZXllZEZyYWdtZW50Q291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgY29uc3Qga2V5ID0gcGFyZW50S2V5ID09IG51bGwgPyBjaGlsZC5rZXkgOiBTdHJpbmcocGFyZW50S2V5KSArIFN0cmluZyhjaGlsZC5rZXkgIT0gbnVsbCA/IGNoaWxkLmtleSA6IGkpO1xuICAgIGlmIChjaGlsZC50eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaWYgKGNoaWxkLnBhdGNoRmxhZyAmIDEyOClcbiAgICAgICAga2V5ZWRGcmFnbWVudENvdW50Kys7XG4gICAgICByZXQgPSByZXQuY29uY2F0KFxuICAgICAgICBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGtlZXBDb21tZW50LCBrZXkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoa2VlcENvbW1lbnQgfHwgY2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgcmV0LnB1c2goa2V5ICE9IG51bGwgPyBjbG9uZVZOb2RlKGNoaWxkLCB7IGtleSB9KSA6IGNoaWxkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGtleWVkRnJhZ21lbnRDb3VudCA+IDEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2ldLnBhdGNoRmxhZyA9IC0yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDb21wb25lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKG9wdGlvbnMpID8gKFxuICAgIC8vICM4MzI2OiBleHRlbmQgY2FsbCBhbmQgb3B0aW9ucy5uYW1lIGFjY2VzcyBhcmUgY29uc2lkZXJlZCBzaWRlLWVmZmVjdHNcbiAgICAvLyBieSBSb2xsdXAsIHNvIHdlIGhhdmUgdG8gd3JhcCBpdCBpbiBhIHB1cmUtYW5ub3RhdGVkIElJRkUuXG4gICAgLyogQF9fUFVSRV9fICovICgoKSA9PiBleHRlbmQoeyBuYW1lOiBvcHRpb25zLm5hbWUgfSwgZXh0cmFPcHRpb25zLCB7IHNldHVwOiBvcHRpb25zIH0pKSgpXG4gICkgOiBvcHRpb25zO1xufVxuXG5jb25zdCBpc0FzeW5jV3JhcHBlciA9IChpKSA9PiAhIWkudHlwZS5fX2FzeW5jTG9hZGVyO1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQXN5bmNDb21wb25lbnQoc291cmNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBzb3VyY2UgPSB7IGxvYWRlcjogc291cmNlIH07XG4gIH1cbiAgY29uc3Qge1xuICAgIGxvYWRlcixcbiAgICBsb2FkaW5nQ29tcG9uZW50LFxuICAgIGVycm9yQ29tcG9uZW50LFxuICAgIGRlbGF5ID0gMjAwLFxuICAgIHRpbWVvdXQsXG4gICAgLy8gdW5kZWZpbmVkID0gbmV2ZXIgdGltZXMgb3V0XG4gICAgc3VzcGVuc2libGUgPSB0cnVlLFxuICAgIG9uRXJyb3I6IHVzZXJPbkVycm9yXG4gIH0gPSBzb3VyY2U7XG4gIGxldCBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gIGxldCByZXNvbHZlZENvbXA7XG4gIGxldCByZXRyaWVzID0gMDtcbiAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgcmV0cmllcysrO1xuICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICByZXR1cm4gbG9hZCgpO1xuICB9O1xuICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgIGxldCB0aGlzUmVxdWVzdDtcbiAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3QgfHwgKHRoaXNSZXF1ZXN0ID0gcGVuZGluZ1JlcXVlc3QgPSBsb2FkZXIoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSk7XG4gICAgICBpZiAodXNlck9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyUmV0cnkgPSAoKSA9PiByZXNvbHZlKHJldHJ5KCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJGYWlsID0gKCkgPT4gcmVqZWN0KGVycik7XG4gICAgICAgICAgdXNlck9uRXJyb3IoZXJyLCB1c2VyUmV0cnksIHVzZXJGYWlsLCByZXRyaWVzICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKGNvbXApID0+IHtcbiAgICAgIGlmICh0aGlzUmVxdWVzdCAhPT0gcGVuZGluZ1JlcXVlc3QgJiYgcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNvbXApIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IGxvYWRlciByZXNvbHZlZCB0byB1bmRlZmluZWQuIElmIHlvdSBhcmUgdXNpbmcgcmV0cnkoKSwgbWFrZSBzdXJlIHRvIHJldHVybiBpdHMgcmV0dXJuIHZhbHVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wICYmIChjb21wLl9fZXNNb2R1bGUgfHwgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSBcIk1vZHVsZVwiKSkge1xuICAgICAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29tcCAmJiAhaXNPYmplY3QoY29tcCkgJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogJHtjb21wfWApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZWRDb21wID0gY29tcDtcbiAgICAgIHJldHVybiBjb21wO1xuICAgIH0pKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmluZUNvbXBvbmVudCh7XG4gICAgbmFtZTogXCJBc3luY0NvbXBvbmVudFdyYXBwZXJcIixcbiAgICBfX2FzeW5jTG9hZGVyOiBsb2FkLFxuICAgIGdldCBfX2FzeW5jUmVzb2x2ZWQoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRDb21wO1xuICAgIH0sXG4gICAgc2V0dXAoKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgICAgIGlmIChyZXNvbHZlZENvbXApIHtcbiAgICAgICAgcmV0dXJuICgpID0+IGNyZWF0ZUlubmVyQ29tcChyZXNvbHZlZENvbXAsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgaGFuZGxlRXJyb3IoXG4gICAgICAgICAgZXJyLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIDEzLFxuICAgICAgICAgICFlcnJvckNvbXBvbmVudFxuICAgICAgICAgIC8qIGRvIG5vdCB0aHJvdyBpbiBkZXYgaWYgdXNlciBwcm92aWRlZCBlcnJvciBjb21wb25lbnQgKi9cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBpZiAoc3VzcGVuc2libGUgJiYgaW5zdGFuY2Uuc3VzcGVuc2UgfHwgaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgICAgIHJldHVybiBsb2FkKCkudGhlbigoY29tcCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAoY29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgIHJldHVybiAoKSA9PiBlcnJvckNvbXBvbmVudCA/IGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgfSkgOiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHJlZigpO1xuICAgICAgY29uc3QgZGVsYXllZCA9IHJlZighIWRlbGF5KTtcbiAgICAgIGlmIChkZWxheSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkZWxheWVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb2FkZWQudmFsdWUgJiYgIWVycm9yLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIGxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9hZGVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGluc3RhbmNlLnBhcmVudCAmJiBpc0tlZXBBbGl2ZShpbnN0YW5jZS5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgICAgcXVldWVKb2IoaW5zdGFuY2UucGFyZW50LnVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZC52YWx1ZSAmJiByZXNvbHZlZENvbXApIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnZhbHVlICYmIGVycm9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nQ29tcG9uZW50ICYmICFkZWxheWVkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGxvYWRpbmdDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVJbm5lckNvbXAoY29tcCwgcGFyZW50KSB7XG4gIGNvbnN0IHsgcmVmOiByZWYyLCBwcm9wcywgY2hpbGRyZW4sIGNlIH0gPSBwYXJlbnQudm5vZGU7XG4gIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUoY29tcCwgcHJvcHMsIGNoaWxkcmVuKTtcbiAgdm5vZGUucmVmID0gcmVmMjtcbiAgdm5vZGUuY2UgPSBjZTtcbiAgZGVsZXRlIHBhcmVudC52bm9kZS5jZTtcbiAgcmV0dXJuIHZub2RlO1xufVxuXG5jb25zdCBpc0tlZXBBbGl2ZSA9ICh2bm9kZSkgPT4gdm5vZGUudHlwZS5fX2lzS2VlcEFsaXZlO1xuY29uc3QgS2VlcEFsaXZlSW1wbCA9IHtcbiAgbmFtZTogYEtlZXBBbGl2ZWAsXG4gIC8vIE1hcmtlciBmb3Igc3BlY2lhbCBoYW5kbGluZyBpbnNpZGUgdGhlIHJlbmRlcmVyLiBXZSBhcmUgbm90IHVzaW5nIGEgPT09XG4gIC8vIGNoZWNrIGRpcmVjdGx5IG9uIEtlZXBBbGl2ZSBpbiB0aGUgcmVuZGVyZXIsIGJlY2F1c2UgaW1wb3J0aW5nIGl0IGRpcmVjdGx5XG4gIC8vIHdvdWxkIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0cmVlLXNoYWtlbi5cbiAgX19pc0tlZXBBbGl2ZTogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBleGNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc2hhcmVkQ29udGV4dCA9IGluc3RhbmNlLmN0eDtcbiAgICBpZiAoIXNoYXJlZENvbnRleHQucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCAmJiBzbG90cy5kZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPT09IDEgPyBjaGlsZHJlblswXSA6IGNoaWxkcmVuO1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGxldCBjdXJyZW50ID0gbnVsbDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLl9fdl9jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRTdXNwZW5zZSA9IGluc3RhbmNlLnN1c3BlbnNlO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcmVyOiB7XG4gICAgICAgIHA6IHBhdGNoLFxuICAgICAgICBtOiBtb3ZlLFxuICAgICAgICB1bTogX3VubW91bnQsXG4gICAgICAgIG86IHsgY3JlYXRlRWxlbWVudCB9XG4gICAgICB9XG4gICAgfSA9IHNoYXJlZENvbnRleHQ7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgc2hhcmVkQ29udGV4dC5hY3RpdmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGlzU1ZHLCBvcHRpbWl6ZWQpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIG1vdmUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCAwLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgaW5zdGFuY2UyLnZub2RlLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGluc3RhbmNlMixcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlMi5pc0RlYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5hKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlTW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNoYXJlZENvbnRleHQuZGVhY3RpdmF0ZSA9ICh2bm9kZSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgbW92ZSh2bm9kZSwgc3RvcmFnZUNvbnRhaW5lciwgbnVsbCwgMSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5kYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5kYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZVVubW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSkge1xuICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgX3VubW91bnQodm5vZGUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGUoZmlsdGVyKSB7XG4gICAgICBjYWNoZS5mb3JFYWNoKCh2bm9kZSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHZub2RlLnR5cGUpO1xuICAgICAgICBpZiAobmFtZSAmJiAoIWZpbHRlciB8fCAhZmlsdGVyKG5hbWUpKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJ1bmVDYWNoZUVudHJ5KGtleSkge1xuICAgICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWN1cnJlbnQgfHwgIWlzU2FtZVZOb2RlVHlwZShjYWNoZWQsIGN1cnJlbnQpKSB7XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCkge1xuICAgICAgICByZXNldFNoYXBlRmxhZyhjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgd2F0Y2goXG4gICAgICAoKSA9PiBbcHJvcHMuaW5jbHVkZSwgcHJvcHMuZXhjbHVkZV0sXG4gICAgICAoW2luY2x1ZGUsIGV4Y2x1ZGVdKSA9PiB7XG4gICAgICAgIGluY2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSk7XG4gICAgICAgIGV4Y2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gIW1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpO1xuICAgICAgfSxcbiAgICAgIC8vIHBydW5lIHBvc3QtcmVuZGVyIGFmdGVyIGBjdXJyZW50YCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiwgZGVlcDogdHJ1ZSB9XG4gICAgKTtcbiAgICBsZXQgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICBjb25zdCBjYWNoZVN1YnRyZWUgPSAoKSA9PiB7XG4gICAgICBpZiAocGVuZGluZ0NhY2hlS2V5ICE9IG51bGwpIHtcbiAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvbk1vdW50ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvblVwZGF0ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgY2FjaGUuZm9yRWFjaCgoY2FjaGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ViVHJlZSwgc3VzcGVuc2UgfSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCB2bm9kZSA9IGdldElubmVyQ2hpbGQoc3ViVHJlZSk7XG4gICAgICAgIGlmIChjYWNoZWQudHlwZSA9PT0gdm5vZGUudHlwZSAmJiBjYWNoZWQua2V5ID09PSB2bm9kZS5rZXkpIHtcbiAgICAgICAgICByZXNldFNoYXBlRmxhZyh2bm9kZSk7XG4gICAgICAgICAgY29uc3QgZGEgPSB2bm9kZS5jb21wb25lbnQuZGE7XG4gICAgICAgICAgZGEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRhLCBzdXNwZW5zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgICAgaWYgKCFzbG90cy5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0KCk7XG4gICAgICBjb25zdCByYXdWTm9kZSA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGBLZWVwQWxpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgY29tcG9uZW50IGNoaWxkLmApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKHJhd1ZOb2RlKSB8fCAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDQpICYmICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSkge1xuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgbGV0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChyYXdWTm9kZSk7XG4gICAgICBjb25zdCBjb21wID0gdm5vZGUudHlwZTtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFxuICAgICAgICBpc0FzeW5jV3JhcHBlcih2bm9kZSkgPyB2bm9kZS50eXBlLl9fYXN5bmNSZXNvbHZlZCB8fCB7fSA6IGNvbXBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGluY2x1ZGUsIGV4Y2x1ZGUsIG1heCB9ID0gcHJvcHM7XG4gICAgICBpZiAoaW5jbHVkZSAmJiAoIW5hbWUgfHwgIW1hdGNoZXMoaW5jbHVkZSwgbmFtZSkpIHx8IGV4Y2x1ZGUgJiYgbmFtZSAmJiBtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKSB7XG4gICAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gdm5vZGUua2V5ID09IG51bGwgPyBjb21wIDogdm5vZGUua2V5O1xuICAgICAgY29uc3QgY2FjaGVkVk5vZGUgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmICh2bm9kZS5lbCkge1xuICAgICAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgICAgICBpZiAocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgcmF3Vk5vZGUuc3NDb250ZW50ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBlbmRpbmdDYWNoZUtleSA9IGtleTtcbiAgICAgIGlmIChjYWNoZWRWTm9kZSkge1xuICAgICAgICB2bm9kZS5lbCA9IGNhY2hlZFZOb2RlLmVsO1xuICAgICAgICB2bm9kZS5jb21wb25lbnQgPSBjYWNoZWRWTm9kZS5jb21wb25lbnQ7XG4gICAgICAgIGlmICh2bm9kZS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCB2bm9kZS50cmFuc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB2bm9kZS5zaGFwZUZsYWcgfD0gNTEyO1xuICAgICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICAgICAgaWYgKG1heCAmJiBrZXlzLnNpemUgPiBwYXJzZUludChtYXgsIDEwKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXlzLnZhbHVlcygpLm5leHQoKS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSAyNTY7XG4gICAgICBjdXJyZW50ID0gdm5vZGU7XG4gICAgICByZXR1cm4gaXNTdXNwZW5zZShyYXdWTm9kZS50eXBlKSA/IHJhd1ZOb2RlIDogdm5vZGU7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEtlZXBBbGl2ZSA9IEtlZXBBbGl2ZUltcGw7XG5mdW5jdGlvbiBtYXRjaGVzKHBhdHRlcm4sIG5hbWUpIHtcbiAgaWYgKGlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zb21lKChwKSA9PiBtYXRjaGVzKHAsIG5hbWUpKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KFwiLFwiKS5pbmNsdWRlcyhuYW1lKTtcbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gb25BY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImFcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIG9uRGVhY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImRhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgdHlwZSwgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dkYyB8fCAoaG9vay5fX3dkYyA9ICgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRhcmdldDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGN1cnJlbnQuaXNEZWFjdGl2YXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBob29rKCk7XG4gIH0pO1xuICBpbmplY3RIb29rKHR5cGUsIHdyYXBwZWRIb29rLCB0YXJnZXQpO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQucGFyZW50O1xuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQucGFyZW50KSB7XG4gICAgICBpZiAoaXNLZWVwQWxpdmUoY3VycmVudC5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgIGluamVjdFRvS2VlcEFsaXZlUm9vdCh3cmFwcGVkSG9vaywgdHlwZSwgdGFyZ2V0LCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdFRvS2VlcEFsaXZlUm9vdChob29rLCB0eXBlLCB0YXJnZXQsIGtlZXBBbGl2ZVJvb3QpIHtcbiAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RIb29rKFxuICAgIHR5cGUsXG4gICAgaG9vayxcbiAgICBrZWVwQWxpdmVSb290LFxuICAgIHRydWVcbiAgICAvKiBwcmVwZW5kICovXG4gICk7XG4gIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICByZW1vdmUoa2VlcEFsaXZlUm9vdFt0eXBlXSwgaW5qZWN0ZWQpO1xuICB9LCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVzZXRTaGFwZUZsYWcodm5vZGUpIHtcbiAgdm5vZGUuc2hhcGVGbGFnICY9IH4yNTY7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSB+NTEyO1xufVxuZnVuY3Rpb24gZ2V0SW5uZXJDaGlsZCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgMTI4ID8gdm5vZGUuc3NDb250ZW50IDogdm5vZGU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEhvb2sodHlwZSwgaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlLCBwcmVwZW5kID0gZmFsc2UpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IGhvb2tzID0gdGFyZ2V0W3R5cGVdIHx8ICh0YXJnZXRbdHlwZV0gPSBbXSk7XG4gICAgY29uc3Qgd3JhcHBlZEhvb2sgPSBob29rLl9fd2VoIHx8IChob29rLl9fd2VoID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICh0YXJnZXQuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgc2V0Q3VycmVudEluc3RhbmNlKHRhcmdldCk7XG4gICAgICBjb25zdCByZXMgPSBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCB0YXJnZXQsIHR5cGUsIGFyZ3MpO1xuICAgICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gICAgaWYgKHByZXBlbmQpIHtcbiAgICAgIGhvb2tzLnVuc2hpZnQod3JhcHBlZEhvb2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rcy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZWRIb29rO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBhcGlOYW1lID0gdG9IYW5kbGVyS2V5KEVycm9yVHlwZVN0cmluZ3NbdHlwZV0ucmVwbGFjZSgvIGhvb2skLywgXCJcIikpO1xuICAgIHdhcm4oXG4gICAgICBgJHthcGlOYW1lfSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC4gTGlmZWN5Y2xlIGluamVjdGlvbiBBUElzIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBzZXR1cCgpLmAgKyAoYCBJZiB5b3UgYXJlIHVzaW5nIGFzeW5jIHNldHVwKCksIG1ha2Ugc3VyZSB0byByZWdpc3RlciBsaWZlY3ljbGUgaG9va3MgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdCBzdGF0ZW1lbnQuYCApXG4gICAgKTtcbiAgfVxufVxuY29uc3QgY3JlYXRlSG9vayA9IChsaWZlY3ljbGUpID0+IChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpID0+IChcbiAgLy8gcG9zdC1jcmVhdGUgbGlmZWN5Y2xlIHJlZ2lzdHJhdGlvbnMgYXJlIG5vb3BzIGR1cmluZyBTU1IgKGV4Y2VwdCBmb3Igc2VydmVyUHJlZmV0Y2gpXG4gICghaXNJblNTUkNvbXBvbmVudFNldHVwIHx8IGxpZmVjeWNsZSA9PT0gXCJzcFwiKSAmJiBpbmplY3RIb29rKGxpZmVjeWNsZSwgKC4uLmFyZ3MpID0+IGhvb2soLi4uYXJncyksIHRhcmdldClcbik7XG5jb25zdCBvbkJlZm9yZU1vdW50ID0gY3JlYXRlSG9vayhcImJtXCIpO1xuY29uc3Qgb25Nb3VudGVkID0gY3JlYXRlSG9vayhcIm1cIik7XG5jb25zdCBvbkJlZm9yZVVwZGF0ZSA9IGNyZWF0ZUhvb2soXCJidVwiKTtcbmNvbnN0IG9uVXBkYXRlZCA9IGNyZWF0ZUhvb2soXCJ1XCIpO1xuY29uc3Qgb25CZWZvcmVVbm1vdW50ID0gY3JlYXRlSG9vayhcImJ1bVwiKTtcbmNvbnN0IG9uVW5tb3VudGVkID0gY3JlYXRlSG9vayhcInVtXCIpO1xuY29uc3Qgb25TZXJ2ZXJQcmVmZXRjaCA9IGNyZWF0ZUhvb2soXCJzcFwiKTtcbmNvbnN0IG9uUmVuZGVyVHJpZ2dlcmVkID0gY3JlYXRlSG9vayhcbiAgXCJydGdcIlxuKTtcbmNvbnN0IG9uUmVuZGVyVHJhY2tlZCA9IGNyZWF0ZUhvb2soXG4gIFwicnRjXCJcbik7XG5mdW5jdGlvbiBvbkVycm9yQ2FwdHVyZWQoaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGluamVjdEhvb2soXCJlY1wiLCBob29rLCB0YXJnZXQpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMaXN0KHNvdXJjZSwgcmVuZGVySXRlbSwgY2FjaGUsIGluZGV4KSB7XG4gIGxldCByZXQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlICYmIGNhY2hlW2luZGV4XTtcbiAgaWYgKGlzQXJyYXkoc291cmNlKSB8fCBpc1N0cmluZyhzb3VyY2UpKSB7XG4gICAgcmV0ID0gbmV3IEFycmF5KHNvdXJjZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc291cmNlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2VbaV0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihzb3VyY2UpKSB7XG4gICAgICB3YXJuKGBUaGUgdi1mb3IgcmFuZ2UgZXhwZWN0IGFuIGludGVnZXIgdmFsdWUgYnV0IGdvdCAke3NvdXJjZX0uYCk7XG4gICAgfVxuICAgIHJldCA9IG5ldyBBcnJheShzb3VyY2UpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHJlbmRlckl0ZW0oaSArIDEsIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBpZiAoc291cmNlW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgICAgIHJldCA9IEFycmF5LmZyb20oXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgKGl0ZW0sIGkpID0+IHJlbmRlckl0ZW0oaXRlbSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICByZXQgPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXRbaV0gPSByZW5kZXJJdGVtKHNvdXJjZVtrZXldLCBrZXksIGksIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXQgPSBbXTtcbiAgfVxuICBpZiAoY2FjaGUpIHtcbiAgICBjYWNoZVtpbmRleF0gPSByZXQ7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2xvdHMoc2xvdHMsIGR5bmFtaWNTbG90cykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGR5bmFtaWNTbG90cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNsb3QgPSBkeW5hbWljU2xvdHNbaV07XG4gICAgaWYgKGlzQXJyYXkoc2xvdCkpIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xvdC5sZW5ndGg7IGorKykge1xuICAgICAgICBzbG90c1tzbG90W2pdLm5hbWVdID0gc2xvdFtqXS5mbjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgIHNsb3RzW3Nsb3QubmFtZV0gPSBzbG90LmtleSA/ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHNsb3QuZm4oLi4uYXJncyk7XG4gICAgICAgIGlmIChyZXMpXG4gICAgICAgICAgcmVzLmtleSA9IHNsb3Qua2V5O1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSA6IHNsb3QuZm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90cztcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2xvdChzbG90cywgbmFtZSwgcHJvcHMgPSB7fSwgZmFsbGJhY2ssIG5vU2xvdHRlZCkge1xuICBpZiAoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLmlzQ0UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudCAmJiBpc0FzeW5jV3JhcHBlcihjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50KSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50LmlzQ0UpIHtcbiAgICBpZiAobmFtZSAhPT0gXCJkZWZhdWx0XCIpXG4gICAgICBwcm9wcy5uYW1lID0gbmFtZTtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoXCJzbG90XCIsIHByb3BzLCBmYWxsYmFjayAmJiBmYWxsYmFjaygpKTtcbiAgfVxuICBsZXQgc2xvdCA9IHNsb3RzW25hbWVdO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzbG90ICYmIHNsb3QubGVuZ3RoID4gMSkge1xuICAgIHdhcm4oXG4gICAgICBgU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS5gXG4gICAgKTtcbiAgICBzbG90ID0gKCkgPT4gW107XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgfVxuICBvcGVuQmxvY2soKTtcbiAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gIGNvbnN0IHJlbmRlcmVkID0gY3JlYXRlQmxvY2soXG4gICAgRnJhZ21lbnQsXG4gICAge1xuICAgICAga2V5OiBwcm9wcy5rZXkgfHwgLy8gc2xvdCBjb250ZW50IGFycmF5IG9mIGEgZHluYW1pYyBjb25kaXRpb25hbCBzbG90IG1heSBoYXZlIGEgYnJhbmNoXG4gICAgICAvLyBrZXkgYXR0YWNoZWQgaW4gdGhlIGBjcmVhdGVTbG90c2AgaGVscGVyLCByZXNwZWN0IHRoYXRcbiAgICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgdmFsaWRTbG90Q29udGVudC5rZXkgfHwgYF8ke25hbWV9YFxuICAgIH0sXG4gICAgdmFsaWRTbG90Q29udGVudCB8fCAoZmFsbGJhY2sgPyBmYWxsYmFjaygpIDogW10pLFxuICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgc2xvdHMuXyA9PT0gMSA/IDY0IDogLTJcbiAgKTtcbiAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgIHJlbmRlcmVkLnNsb3RTY29wZUlkcyA9IFtyZW5kZXJlZC5zY29wZUlkICsgXCItc1wiXTtcbiAgfVxuICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgc2xvdC5fZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlbmRlcmVkO1xufVxuZnVuY3Rpb24gZW5zdXJlVmFsaWRWTm9kZSh2bm9kZXMpIHtcbiAgcmV0dXJuIHZub2Rlcy5zb21lKChjaGlsZCkgPT4ge1xuICAgIGlmICghaXNWTm9kZShjaGlsZCkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gQ29tbWVudClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQgJiYgIWVuc3VyZVZhbGlkVk5vZGUoY2hpbGQuY2hpbGRyZW4pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KSA/IHZub2RlcyA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHRvSGFuZGxlcnMob2JqLCBwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSkge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KG9iaikpIHtcbiAgICB3YXJuKGB2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuYCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICByZXRbcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkgJiYgL1tBLVpdLy50ZXN0KGtleSkgPyBgb246JHtrZXl9YCA6IHRvSGFuZGxlcktleShrZXkpXSA9IG9ialtrZXldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IGdldFB1YmxpY0luc3RhbmNlID0gKGkpID0+IHtcbiAgaWYgKCFpKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoaXNTdGF0ZWZ1bENvbXBvbmVudChpKSlcbiAgICByZXR1cm4gZ2V0RXhwb3NlUHJveHkoaSkgfHwgaS5wcm94eTtcbiAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KTtcbn07XG5jb25zdCBwdWJsaWNQcm9wZXJ0aWVzTWFwID0gKFxuICAvLyBNb3ZlIFBVUkUgbWFya2VyIHRvIG5ldyBsaW5lIHRvIHdvcmthcm91bmQgY29tcGlsZXIgZGlzY2FyZGluZyBpdFxuICAvLyBkdWUgdG8gdHlwZSBhbm5vdGF0aW9uXG4gIC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHtcbiAgICAkOiAoaSkgPT4gaSxcbiAgICAkZWw6IChpKSA9PiBpLnZub2RlLmVsLFxuICAgICRkYXRhOiAoaSkgPT4gaS5kYXRhLFxuICAgICRwcm9wczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5wcm9wcykgOiBpLnByb3BzLFxuICAgICRhdHRyczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5hdHRycykgOiBpLmF0dHJzLFxuICAgICRzbG90czogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5zbG90cykgOiBpLnNsb3RzLFxuICAgICRyZWZzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnJlZnMpIDogaS5yZWZzLFxuICAgICRwYXJlbnQ6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnBhcmVudCksXG4gICAgJHJvb3Q6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnJvb3QpLFxuICAgICRlbWl0OiAoaSkgPT4gaS5lbWl0LFxuICAgICRvcHRpb25zOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlLFxuICAgICRmb3JjZVVwZGF0ZTogKGkpID0+IGkuZiB8fCAoaS5mID0gKCkgPT4gcXVldWVKb2IoaS51cGRhdGUpKSxcbiAgICAkbmV4dFRpY2s6IChpKSA9PiBpLm4gfHwgKGkubiA9IG5leHRUaWNrLmJpbmQoaS5wcm94eSkpLFxuICAgICR3YXRjaDogKGkpID0+IF9fVlVFX09QVElPTlNfQVBJX18gPyBpbnN0YW5jZVdhdGNoLmJpbmQoaSkgOiBOT09QXG4gIH0pXG4pO1xuY29uc3QgaXNSZXNlcnZlZFByZWZpeCA9IChrZXkpID0+IGtleSA9PT0gXCJfXCIgfHwga2V5ID09PSBcIiRcIjtcbmNvbnN0IGhhc1NldHVwQmluZGluZyA9IChzdGF0ZSwga2V5KSA9PiBzdGF0ZSAhPT0gRU1QVFlfT0JKICYmICFzdGF0ZS5fX2lzU2NyaXB0U2V0dXAgJiYgaGFzT3duKHN0YXRlLCBrZXkpO1xuY29uc3QgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzID0ge1xuICBnZXQoeyBfOiBpbnN0YW5jZSB9LCBrZXkpIHtcbiAgICBjb25zdCB7IGN0eCwgc2V0dXBTdGF0ZSwgZGF0YSwgcHJvcHMsIGFjY2Vzc0NhY2hlLCB0eXBlLCBhcHBDb250ZXh0IH0gPSBpbnN0YW5jZTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgPT09IFwiX19pc1Z1ZVwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IG5vcm1hbGl6ZWRQcm9wcztcbiAgICBpZiAoa2V5WzBdICE9PSBcIiRcIikge1xuICAgICAgY29uc3QgbiA9IGFjY2Vzc0NhY2hlW2tleV07XG4gICAgICBpZiAobiAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHN3aXRjaCAobikge1xuICAgICAgICAgIGNhc2UgMSAvKiBTRVRVUCAqLzpcbiAgICAgICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICAgICAgY2FzZSAyIC8qIERBVEEgKi86XG4gICAgICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgICAgIGNhc2UgNCAvKiBDT05URVhUICovOlxuICAgICAgICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgICAgICAgIGNhc2UgMyAvKiBQUk9QUyAqLzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAxIC8qIFNFVFVQICovO1xuICAgICAgICByZXR1cm4gc2V0dXBTdGF0ZVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDIgLyogREFUQSAqLztcbiAgICAgICAgcmV0dXJuIGRhdGFba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIC8vIG9ubHkgY2FjaGUgb3RoZXIgcHJvcGVydGllcyB3aGVuIGluc3RhbmNlIGhhcyBkZWNsYXJlZCAodGh1cyBzdGFibGUpXG4gICAgICAgIC8vIHByb3BzXG4gICAgICAgIChub3JtYWxpemVkUHJvcHMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pICYmIGhhc093bihub3JtYWxpemVkUHJvcHMsIGtleSlcbiAgICAgICkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMyAvKiBQUk9QUyAqLztcbiAgICAgICAgcmV0dXJuIHByb3BzW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGN0eCAhPT0gRU1QVFlfT0JKICYmIGhhc093bihjdHgsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDQgLyogQ09OVEVYVCAqLztcbiAgICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgICAgfSBlbHNlIGlmICghX19WVUVfT1BUSU9OU19BUElfXyB8fCBzaG91bGRDYWNoZUFjY2Vzcykge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMCAvKiBPVEhFUiAqLztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHVibGljR2V0dGVyID0gcHVibGljUHJvcGVydGllc01hcFtrZXldO1xuICAgIGxldCBjc3NNb2R1bGUsIGdsb2JhbFByb3BlcnRpZXM7XG4gICAgaWYgKHB1YmxpY0dldHRlcikge1xuICAgICAgaWYgKGtleSA9PT0gXCIkYXR0cnNcIikge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwga2V5KTtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCIkc2xvdHNcIikge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwga2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNHZXR0ZXIoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBjc3MgbW9kdWxlIChpbmplY3RlZCBieSB2dWUtbG9hZGVyKVxuICAgICAgKGNzc01vZHVsZSA9IHR5cGUuX19jc3NNb2R1bGVzKSAmJiAoY3NzTW9kdWxlID0gY3NzTW9kdWxlW2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3NzTW9kdWxlO1xuICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDQgLyogQ09OVEVYVCAqLztcbiAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgIGdsb2JhbFByb3BlcnRpZXMgPSBhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBoYXNPd24oZ2xvYmFsUHJvcGVydGllcywga2V5KVxuICAgICkge1xuICAgICAge1xuICAgICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydGllc1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgJiYgKCFpc1N0cmluZyhrZXkpIHx8IC8vICMxMDkxIGF2b2lkIGludGVybmFsIGlzUmVmL2lzVk5vZGUgY2hlY2tzIG9uIGNvbXBvbmVudCBpbnN0YW5jZSBsZWFkaW5nXG4gICAgLy8gdG8gaW5maW5pdGUgd2FybmluZyBsb29wXG4gICAga2V5LmluZGV4T2YoXCJfX3ZcIikgIT09IDApKSB7XG4gICAgICBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gbXVzdCBiZSBhY2Nlc3NlZCB2aWEgJGRhdGEgYmVjYXVzZSBpdCBzdGFydHMgd2l0aCBhIHJlc2VydmVkIGNoYXJhY3RlciAoXCIkXCIgb3IgXCJfXCIpIGFuZCBpcyBub3QgcHJveGllZCBvbiB0aGUgcmVuZGVyIGNvbnRleHQuYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZSA9PT0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gd2FzIGFjY2Vzc2VkIGR1cmluZyByZW5kZXIgYnV0IGlzIG5vdCBkZWZpbmVkIG9uIGluc3RhbmNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHNldCh7IF86IGluc3RhbmNlIH0sIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCB7IGRhdGEsIHNldHVwU3RhdGUsIGN0eCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICBzZXR1cFN0YXRlW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgd2FybihgQ2Fubm90IG11dGF0ZSA8c2NyaXB0IHNldHVwPiBiaW5kaW5nIFwiJHtrZXl9XCIgZnJvbSBPcHRpb25zIEFQSS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc093bihpbnN0YW5jZS5wcm9wcywga2V5KSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwcm9wIFwiJHtrZXl9XCIuIFByb3BzIGFyZSByZWFkb25seS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGtleVswXSA9PT0gXCIkXCIgJiYga2V5LnNsaWNlKDEpIGluIGluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwdWJsaWMgcHJvcGVydHkgXCIke2tleX1cIi4gUHJvcGVydGllcyBzdGFydGluZyB3aXRoICQgYXJlIHJlc2VydmVkIGFuZCByZWFkb25seS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgaW4gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBoYXMoe1xuICAgIF86IHsgZGF0YSwgc2V0dXBTdGF0ZSwgYWNjZXNzQ2FjaGUsIGN0eCwgYXBwQ29udGV4dCwgcHJvcHNPcHRpb25zIH1cbiAgfSwga2V5KSB7XG4gICAgbGV0IG5vcm1hbGl6ZWRQcm9wcztcbiAgICByZXR1cm4gISFhY2Nlc3NDYWNoZVtrZXldIHx8IGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSB8fCBoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSB8fCAobm9ybWFsaXplZFByb3BzID0gcHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpIHx8IGhhc093bihjdHgsIGtleSkgfHwgaGFzT3duKHB1YmxpY1Byb3BlcnRpZXNNYXAsIGtleSkgfHwgaGFzT3duKGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGtleSk7XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuZ2V0ICE9IG51bGwpIHtcbiAgICAgIHRhcmdldC5fLmFjY2Vzc0NhY2hlW2tleV0gPSAwO1xuICAgIH0gZWxzZSBpZiAoaGFzT3duKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgIHRoaXMuc2V0KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yLnZhbHVlLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuICB9XG59O1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMub3duS2V5cyA9ICh0YXJnZXQpID0+IHtcbiAgICB3YXJuKFxuICAgICAgYEF2b2lkIGFwcCBsb2dpYyB0aGF0IHJlbGllcyBvbiBlbnVtZXJhdGluZyBrZXlzIG9uIGEgY29tcG9uZW50IGluc3RhbmNlLiBUaGUga2V5cyB3aWxsIGJlIGVtcHR5IGluIHByb2R1Y3Rpb24gbW9kZSB0byBhdm9pZCBwZXJmb3JtYW5jZSBvdmVyaGVhZC5gXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH07XG59XG5jb25zdCBSdW50aW1lQ29tcGlsZWRQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKFxuICB7fSxcbiAgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLFxuICB7XG4gICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSBTeW1ib2wudW5zY29wYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5nZXQodGFyZ2V0LCBrZXksIHRhcmdldCk7XG4gICAgfSxcbiAgICBoYXMoXywga2V5KSB7XG4gICAgICBjb25zdCBoYXMgPSBrZXlbMF0gIT09IFwiX1wiICYmICFpc0dsb2JhbGx5QWxsb3dlZChrZXkpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWhhcyAmJiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuaGFzKF8sIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IHNob3VsZCBub3Qgc3RhcnQgd2l0aCBfIHdoaWNoIGlzIGEgcmVzZXJ2ZWQgcHJlZml4IGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXM7XG4gICAgfVxuICB9XG4pO1xuZnVuY3Rpb24gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYF9gLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogKCkgPT4gaW5zdGFuY2VcbiAgfSk7XG4gIE9iamVjdC5rZXlzKHB1YmxpY1Byb3BlcnRpZXNNYXApLmZvckVhY2goKGtleSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6ICgpID0+IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XShpbnN0YW5jZSksXG4gICAgICAvLyBpbnRlcmNlcHRlZCBieSB0aGUgcHJveHkgc28gbm8gbmVlZCBmb3IgaW1wbGVtZW50YXRpb24sXG4gICAgICAvLyBidXQgbmVlZGVkIHRvIHByZXZlbnQgc2V0IGVycm9yc1xuICAgICAgc2V0OiBOT09QXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIGN0eCxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gIH0gPSBpbnN0YW5jZTtcbiAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgIE9iamVjdC5rZXlzKHByb3BzT3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGluc3RhbmNlLnByb3BzW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUgfSA9IGluc3RhbmNlO1xuICBPYmplY3Qua2V5cyh0b1JhdyhzZXR1cFN0YXRlKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCkge1xuICAgICAgaWYgKGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIFwiJFwiIG9yIFwiX1wiIHdoaWNoIGFyZSByZXNlcnZlZCBwcmVmaXhlcyBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gc2V0dXBTdGF0ZVtrZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHdhcm5SdW50aW1lVXNhZ2UgPSAobWV0aG9kKSA9PiB3YXJuKFxuICBgJHttZXRob2R9KCkgaXMgYSBjb21waWxlci1oaW50IGhlbHBlciB0aGF0IGlzIG9ubHkgdXNhYmxlIGluc2lkZSA8c2NyaXB0IHNldHVwPiBvZiBhIHNpbmdsZSBmaWxlIGNvbXBvbmVudC4gSXRzIGFyZ3VtZW50cyBzaG91bGQgYmUgY29tcGlsZWQgYXdheSBhbmQgcGFzc2luZyBpdCBhdCBydW50aW1lIGhhcyBubyBlZmZlY3QuYFxuKTtcbmZ1bmN0aW9uIGRlZmluZVByb3BzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVByb3BzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVFbWl0cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFbWl0c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lRXhwb3NlKGV4cG9zZWQpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFeHBvc2VgKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVmaW5lT3B0aW9ucyhvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lT3B0aW9uc2ApO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVTbG90cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVTbG90c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lTW9kZWwoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShcImRlZmluZU1vZGVsXCIpO1xuICB9XG59XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocHJvcHMsIGRlZmF1bHRzKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgd2l0aERlZmF1bHRzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTbG90cygpIHtcbiAgcmV0dXJuIGdldENvbnRleHQoKS5zbG90cztcbn1cbmZ1bmN0aW9uIHVzZUF0dHJzKCkge1xuICByZXR1cm4gZ2V0Q29udGV4dCgpLmF0dHJzO1xufVxuZnVuY3Rpb24gdXNlTW9kZWwocHJvcHMsIG5hbWUsIG9wdGlvbnMpIHtcbiAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaSkge1xuICAgIHdhcm4oYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGluc3RhbmNlLmApO1xuICAgIHJldHVybiByZWYoKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaS5wcm9wc09wdGlvbnNbMF1bbmFtZV0pIHtcbiAgICB3YXJuKGB1c2VNb2RlbCgpIGNhbGxlZCB3aXRoIHByb3AgXCIke25hbWV9XCIgd2hpY2ggaXMgbm90IGRlY2xhcmVkLmApO1xuICAgIHJldHVybiByZWYoKTtcbiAgfVxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxvY2FsKSB7XG4gICAgY29uc3QgcHJveHkgPSByZWYocHJvcHNbbmFtZV0pO1xuICAgIHdhdGNoKFxuICAgICAgKCkgPT4gcHJvcHNbbmFtZV0sXG4gICAgICAodikgPT4gcHJveHkudmFsdWUgPSB2XG4gICAgKTtcbiAgICB3YXRjaChwcm94eSwgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09IHByb3BzW25hbWVdKSB7XG4gICAgICAgIGkuZW1pdChgdXBkYXRlOiR7bmFtZX1gLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBfX3ZfaXNSZWY6IHRydWUsXG4gICAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1tuYW1lXTtcbiAgICAgIH0sXG4gICAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpKSB7XG4gICAgd2FybihgdXNlQ29udGV4dCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgfVxuICByZXR1cm4gaS5zZXR1cENvbnRleHQgfHwgKGkuc2V0dXBDb250ZXh0ID0gY3JlYXRlU2V0dXBDb250ZXh0KGkpKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhwcm9wcykge1xuICByZXR1cm4gaXNBcnJheShwcm9wcykgPyBwcm9wcy5yZWR1Y2UoXG4gICAgKG5vcm1hbGl6ZWQsIHApID0+IChub3JtYWxpemVkW3BdID0gbnVsbCwgbm9ybWFsaXplZCksXG4gICAge31cbiAgKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWZhdWx0cyhyYXcsIGRlZmF1bHRzKSB7XG4gIGNvbnN0IHByb3BzID0gbm9ybWFsaXplUHJvcHNPckVtaXRzKHJhdyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiX19za2lwXCIpKVxuICAgICAgY29udGludWU7XG4gICAgbGV0IG9wdCA9IHByb3BzW2tleV07XG4gICAgaWYgKG9wdCkge1xuICAgICAgaWYgKGlzQXJyYXkob3B0KSB8fCBpc0Z1bmN0aW9uKG9wdCkpIHtcbiAgICAgICAgb3B0ID0gcHJvcHNba2V5XSA9IHsgdHlwZTogb3B0LCBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHQuZGVmYXVsdCA9IGRlZmF1bHRzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHQgPT09IG51bGwpIHtcbiAgICAgIG9wdCA9IHByb3BzW2tleV0gPSB7IGRlZmF1bHQ6IGRlZmF1bHRzW2tleV0gfTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oYHByb3BzIGRlZmF1bHQga2V5IFwiJHtrZXl9XCIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24uYCk7XG4gICAgfVxuICAgIGlmIChvcHQgJiYgZGVmYXVsdHNbYF9fc2tpcF8ke2tleX1gXSkge1xuICAgICAgb3B0LnNraXBGYWN0b3J5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VNb2RlbHMoYSwgYikge1xuICBpZiAoIWEgfHwgIWIpXG4gICAgcmV0dXJuIGEgfHwgYjtcbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSlcbiAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gIHJldHVybiBleHRlbmQoe30sIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhhKSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3BzUmVzdFByb3h5KHByb3BzLCBleGNsdWRlZEtleXMpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcHJvcHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB3aXRoQXN5bmNDb250ZXh0KGdldEF3YWl0YWJsZSkge1xuICBjb25zdCBjdHggPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWN0eCkge1xuICAgIHdhcm4oXG4gICAgICBgd2l0aEFzeW5jQ29udGV4dCBjYWxsZWQgd2l0aG91dCBhY3RpdmUgY3VycmVudCBpbnN0YW5jZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcuYFxuICAgICk7XG4gIH1cbiAgbGV0IGF3YWl0YWJsZSA9IGdldEF3YWl0YWJsZSgpO1xuICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoaXNQcm9taXNlKGF3YWl0YWJsZSkpIHtcbiAgICBhd2FpdGFibGUgPSBhd2FpdGFibGUuY2F0Y2goKGUpID0+IHtcbiAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShjdHgpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gW2F3YWl0YWJsZSwgKCkgPT4gc2V0Q3VycmVudEluc3RhbmNlKGN0eCldO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkge1xuICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKHR5cGUsIGtleSkgPT4ge1xuICAgIGlmIChjYWNoZVtrZXldKSB7XG4gICAgICB3YXJuKGAke3R5cGV9IHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluICR7Y2FjaGVba2V5XX0uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlW2tleV0gPSB0eXBlO1xuICAgIH1cbiAgfTtcbn1cbmxldCBzaG91bGRDYWNoZUFjY2VzcyA9IHRydWU7XG5mdW5jdGlvbiBhcHBseU9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVNZXJnZWRPcHRpb25zKGluc3RhbmNlKTtcbiAgY29uc3QgcHVibGljVGhpcyA9IGluc3RhbmNlLnByb3h5O1xuICBjb25zdCBjdHggPSBpbnN0YW5jZS5jdHg7XG4gIHNob3VsZENhY2hlQWNjZXNzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmJlZm9yZUNyZWF0ZSkge1xuICAgIGNhbGxIb29rKG9wdGlvbnMuYmVmb3JlQ3JlYXRlLCBpbnN0YW5jZSwgXCJiY1wiKTtcbiAgfVxuICBjb25zdCB7XG4gICAgLy8gc3RhdGVcbiAgICBkYXRhOiBkYXRhT3B0aW9ucyxcbiAgICBjb21wdXRlZDogY29tcHV0ZWRPcHRpb25zLFxuICAgIG1ldGhvZHMsXG4gICAgd2F0Y2g6IHdhdGNoT3B0aW9ucyxcbiAgICBwcm92aWRlOiBwcm92aWRlT3B0aW9ucyxcbiAgICBpbmplY3Q6IGluamVjdE9wdGlvbnMsXG4gICAgLy8gbGlmZWN5Y2xlXG4gICAgY3JlYXRlZCxcbiAgICBiZWZvcmVNb3VudCxcbiAgICBtb3VudGVkLFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICB1cGRhdGVkLFxuICAgIGFjdGl2YXRlZCxcbiAgICBkZWFjdGl2YXRlZCxcbiAgICBiZWZvcmVEZXN0cm95LFxuICAgIGJlZm9yZVVubW91bnQsXG4gICAgZGVzdHJveWVkLFxuICAgIHVubW91bnRlZCxcbiAgICByZW5kZXIsXG4gICAgcmVuZGVyVHJhY2tlZCxcbiAgICByZW5kZXJUcmlnZ2VyZWQsXG4gICAgZXJyb3JDYXB0dXJlZCxcbiAgICBzZXJ2ZXJQcmVmZXRjaCxcbiAgICAvLyBwdWJsaWMgQVBJXG4gICAgZXhwb3NlLFxuICAgIGluaGVyaXRBdHRycyxcbiAgICAvLyBhc3NldHNcbiAgICBjb21wb25lbnRzLFxuICAgIGRpcmVjdGl2ZXMsXG4gICAgZmlsdGVyc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSA6IG51bGw7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgW3Byb3BzT3B0aW9uc10gPSBpbnN0YW5jZS5wcm9wc09wdGlvbnM7XG4gICAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHNPcHRpb25zKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIlByb3BzXCIgLyogUFJPUFMgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3RPcHRpb25zKSB7XG4gICAgcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMpO1xuICB9XG4gIGlmIChtZXRob2RzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWV0aG9kcykge1xuICAgICAgY29uc3QgbWV0aG9kSGFuZGxlciA9IG1ldGhvZHNba2V5XTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKG1ldGhvZEhhbmRsZXIpKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4W2tleV0gPSBtZXRob2RIYW5kbGVyLmJpbmQocHVibGljVGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJNZXRob2RzXCIgLyogTUVUSE9EUyAqLywga2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYE1ldGhvZCBcIiR7a2V5fVwiIGhhcyB0eXBlIFwiJHt0eXBlb2YgbWV0aG9kSGFuZGxlcn1cIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGF0YU9wdGlvbnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihkYXRhT3B0aW9ucykpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBUaGUgZGF0YSBvcHRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uLiBQbGFpbiBvYmplY3QgdXNhZ2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gZGF0YU9wdGlvbnMuY2FsbChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1Byb21pc2UoZGF0YSkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBkYXRhKCkgcmV0dXJuZWQgYSBQcm9taXNlIC0gbm90ZSBkYXRhKCkgY2Fubm90IGJlIGFzeW5jOyBJZiB5b3UgaW50ZW5kIHRvIHBlcmZvcm0gZGF0YSBmZXRjaGluZyBiZWZvcmUgY29tcG9uZW50IHJlbmRlcnMsIHVzZSBhc3luYyBzZXR1cCgpICsgPFN1c3BlbnNlPi5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYGRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkRhdGFcIiAvKiBEQVRBICovLCBrZXkpO1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHQgPSBjb21wdXRlZE9wdGlvbnNba2V5XTtcbiAgICAgIGNvbnN0IGdldCA9IGlzRnVuY3Rpb24ob3B0KSA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogaXNGdW5jdGlvbihvcHQuZ2V0KSA/IG9wdC5nZXQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IE5PT1A7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBnZXQgPT09IE5PT1ApIHtcbiAgICAgICAgd2FybihgQ29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBoYXMgbm8gZ2V0dGVyLmApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2V0ID0gIWlzRnVuY3Rpb24ob3B0KSAmJiBpc0Z1bmN0aW9uKG9wdC5zZXQpID8gb3B0LnNldC5iaW5kKHB1YmxpY1RoaXMpIDogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/ICgpID0+IHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBpcyByZWFkb25seS5gXG4gICAgICAgICk7XG4gICAgICB9IDogTk9PUDtcbiAgICAgIGNvbnN0IGMgPSBjb21wdXRlZCh7XG4gICAgICAgIGdldCxcbiAgICAgICAgc2V0XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gYy52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gYy52YWx1ZSA9IHZcbiAgICAgIH0pO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiQ29tcHV0ZWRcIiAvKiBDT01QVVRFRCAqLywga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHdhdGNoT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHdhdGNoT3B0aW9ucykge1xuICAgICAgY3JlYXRlV2F0Y2hlcih3YXRjaE9wdGlvbnNba2V5XSwgY3R4LCBwdWJsaWNUaGlzLCBrZXkpO1xuICAgIH1cbiAgfVxuICBpZiAocHJvdmlkZU9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm92aWRlcyA9IGlzRnVuY3Rpb24ocHJvdmlkZU9wdGlvbnMpID8gcHJvdmlkZU9wdGlvbnMuY2FsbChwdWJsaWNUaGlzKSA6IHByb3ZpZGVPcHRpb25zO1xuICAgIFJlZmxlY3Qub3duS2V5cyhwcm92aWRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBwcm92aWRlKGtleSwgcHJvdmlkZXNba2V5XSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGNyZWF0ZWQpIHtcbiAgICBjYWxsSG9vayhjcmVhdGVkLCBpbnN0YW5jZSwgXCJjXCIpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhyZWdpc3RlciwgaG9vaykge1xuICAgIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgICBob29rLmZvckVhY2goKF9ob29rKSA9PiByZWdpc3RlcihfaG9vay5iaW5kKHB1YmxpY1RoaXMpKSk7XG4gICAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgICByZWdpc3Rlcihob29rLmJpbmQocHVibGljVGhpcykpO1xuICAgIH1cbiAgfVxuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVNb3VudCwgYmVmb3JlTW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Nb3VudGVkLCBtb3VudGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlVXBkYXRlLCBiZWZvcmVVcGRhdGUpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25VcGRhdGVkLCB1cGRhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQWN0aXZhdGVkLCBhY3RpdmF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25EZWFjdGl2YXRlZCwgZGVhY3RpdmF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25FcnJvckNhcHR1cmVkLCBlcnJvckNhcHR1cmVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uUmVuZGVyVHJhY2tlZCwgcmVuZGVyVHJhY2tlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyaWdnZXJlZCwgcmVuZGVyVHJpZ2dlcmVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlVW5tb3VudCwgYmVmb3JlVW5tb3VudCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblVubW91bnRlZCwgdW5tb3VudGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uU2VydmVyUHJlZmV0Y2gsIHNlcnZlclByZWZldGNoKTtcbiAgaWYgKGlzQXJyYXkoZXhwb3NlKSkge1xuICAgIGlmIChleHBvc2UubGVuZ3RoKSB7XG4gICAgICBjb25zdCBleHBvc2VkID0gaW5zdGFuY2UuZXhwb3NlZCB8fCAoaW5zdGFuY2UuZXhwb3NlZCA9IHt9KTtcbiAgICAgIGV4cG9zZS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9zZWQsIGtleSwge1xuICAgICAgICAgIGdldDogKCkgPT4gcHVibGljVGhpc1trZXldLFxuICAgICAgICAgIHNldDogKHZhbCkgPT4gcHVibGljVGhpc1trZXldID0gdmFsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgaW5zdGFuY2UuZXhwb3NlZCA9IHt9O1xuICAgIH1cbiAgfVxuICBpZiAocmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCkge1xuICAgIGluc3RhbmNlLnJlbmRlciA9IHJlbmRlcjtcbiAgfVxuICBpZiAoaW5oZXJpdEF0dHJzICE9IG51bGwpIHtcbiAgICBpbnN0YW5jZS5pbmhlcml0QXR0cnMgPSBpbmhlcml0QXR0cnM7XG4gIH1cbiAgaWYgKGNvbXBvbmVudHMpXG4gICAgaW5zdGFuY2UuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIGlmIChkaXJlY3RpdmVzKVxuICAgIGluc3RhbmNlLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSBOT09QKSB7XG4gIGlmIChpc0FycmF5KGluamVjdE9wdGlvbnMpKSB7XG4gICAgaW5qZWN0T3B0aW9ucyA9IG5vcm1hbGl6ZUluamVjdChpbmplY3RPcHRpb25zKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBpbmplY3RPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gaW5qZWN0T3B0aW9uc1trZXldO1xuICAgIGxldCBpbmplY3RlZDtcbiAgICBpZiAoaXNPYmplY3Qob3B0KSkge1xuICAgICAgaWYgKFwiZGVmYXVsdFwiIGluIG9wdCkge1xuICAgICAgICBpbmplY3RlZCA9IGluamVjdChcbiAgICAgICAgICBvcHQuZnJvbSB8fCBrZXksXG4gICAgICAgICAgb3B0LmRlZmF1bHQsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIHRyZWF0IGRlZmF1bHQgZnVuY3Rpb24gYXMgZmFjdG9yeSAqL1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0LmZyb20gfHwga2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVmKGluamVjdGVkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbmplY3RlZC52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gaW5qZWN0ZWQudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4W2tleV0gPSBpbmplY3RlZDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkluamVjdFwiIC8qIElOSkVDVCAqLywga2V5KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxIb29rKGhvb2ssIGluc3RhbmNlLCB0eXBlKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgIGlzQXJyYXkoaG9vaykgPyBob29rLm1hcCgoaCkgPT4gaC5iaW5kKGluc3RhbmNlLnByb3h5KSkgOiBob29rLmJpbmQoaW5zdGFuY2UucHJveHkpLFxuICAgIGluc3RhbmNlLFxuICAgIHR5cGVcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIocmF3LCBjdHgsIHB1YmxpY1RoaXMsIGtleSkge1xuICBjb25zdCBnZXR0ZXIgPSBrZXkuaW5jbHVkZXMoXCIuXCIpID8gY3JlYXRlUGF0aEdldHRlcihwdWJsaWNUaGlzLCBrZXkpIDogKCkgPT4gcHVibGljVGhpc1trZXldO1xuICBpZiAoaXNTdHJpbmcocmF3KSkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBjdHhbcmF3XTtcbiAgICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyKTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXd9XCJgLCBoYW5kbGVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihyYXcpKSB7XG4gICAgd2F0Y2goZ2V0dGVyLCByYXcuYmluZChwdWJsaWNUaGlzKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QocmF3KSkge1xuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgIHJhdy5mb3JFYWNoKChyKSA9PiBjcmVhdGVXYXRjaGVyKHIsIGN0eCwgcHVibGljVGhpcywga2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBpc0Z1bmN0aW9uKHJhdy5oYW5kbGVyKSA/IHJhdy5oYW5kbGVyLmJpbmQocHVibGljVGhpcykgOiBjdHhbcmF3LmhhbmRsZXJdO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyLCByYXcpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4oYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXcuaGFuZGxlcn1cImAsIGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybihgSW52YWxpZCB3YXRjaCBvcHRpb246IFwiJHtrZXl9XCJgLCByYXcpO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkge1xuICBjb25zdCBiYXNlID0gaW5zdGFuY2UudHlwZTtcbiAgY29uc3QgeyBtaXhpbnMsIGV4dGVuZHM6IGV4dGVuZHNPcHRpb25zIH0gPSBiYXNlO1xuICBjb25zdCB7XG4gICAgbWl4aW5zOiBnbG9iYWxNaXhpbnMsXG4gICAgb3B0aW9uc0NhY2hlOiBjYWNoZSxcbiAgICBjb25maWc6IHsgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzIH1cbiAgfSA9IGluc3RhbmNlLmFwcENvbnRleHQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChiYXNlKTtcbiAgbGV0IHJlc29sdmVkO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmVzb2x2ZWQgPSBjYWNoZWQ7XG4gIH0gZWxzZSBpZiAoIWdsb2JhbE1peGlucy5sZW5ndGggJiYgIW1peGlucyAmJiAhZXh0ZW5kc09wdGlvbnMpIHtcbiAgICB7XG4gICAgICByZXNvbHZlZCA9IGJhc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc29sdmVkID0ge307XG4gICAgaWYgKGdsb2JhbE1peGlucy5sZW5ndGgpIHtcbiAgICAgIGdsb2JhbE1peGlucy5mb3JFYWNoKFxuICAgICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBtLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMsIHRydWUpXG4gICAgICApO1xuICAgIH1cbiAgICBtZXJnZU9wdGlvbnMocmVzb2x2ZWQsIGJhc2UsIG9wdGlvbk1lcmdlU3RyYXRlZ2llcyk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGJhc2UpKSB7XG4gICAgY2FjaGUuc2V0KGJhc2UsIHJlc29sdmVkKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5mdW5jdGlvbiBtZXJnZU9wdGlvbnModG8sIGZyb20sIHN0cmF0cywgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gZnJvbTtcbiAgaWYgKGV4dGVuZHNPcHRpb25zKSB7XG4gICAgbWVyZ2VPcHRpb25zKHRvLCBleHRlbmRzT3B0aW9ucywgc3RyYXRzLCB0cnVlKTtcbiAgfVxuICBpZiAobWl4aW5zKSB7XG4gICAgbWl4aW5zLmZvckVhY2goXG4gICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHRvLCBtLCBzdHJhdHMsIHRydWUpXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgaWYgKGFzTWl4aW4gJiYga2V5ID09PSBcImV4cG9zZVwiKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgIGBcImV4cG9zZVwiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIEl0IHNob3VsZCBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBiYXNlIGNvbXBvbmVudCBpdHNlbGYuYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyYXQgPSBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzW2tleV0gfHwgc3RyYXRzICYmIHN0cmF0c1trZXldO1xuICAgICAgdG9ba2V5XSA9IHN0cmF0ID8gc3RyYXQodG9ba2V5XSwgZnJvbVtrZXldKSA6IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuY29uc3QgaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyA9IHtcbiAgZGF0YTogbWVyZ2VEYXRhRm4sXG4gIHByb3BzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIGVtaXRzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIC8vIG9iamVjdHNcbiAgbWV0aG9kczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBjb21wdXRlZDogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyBsaWZlY3ljbGVcbiAgYmVmb3JlQ3JlYXRlOiBtZXJnZUFzQXJyYXksXG4gIGNyZWF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlTW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgbW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVcGRhdGU6IG1lcmdlQXNBcnJheSxcbiAgdXBkYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVEZXN0cm95OiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVubW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgZGVzdHJveWVkOiBtZXJnZUFzQXJyYXksXG4gIHVubW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZGVhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZXJyb3JDYXB0dXJlZDogbWVyZ2VBc0FycmF5LFxuICBzZXJ2ZXJQcmVmZXRjaDogbWVyZ2VBc0FycmF5LFxuICAvLyBhc3NldHNcbiAgY29tcG9uZW50czogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBkaXJlY3RpdmVzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIHdhdGNoXG4gIHdhdGNoOiBtZXJnZVdhdGNoT3B0aW9ucyxcbiAgLy8gcHJvdmlkZSAvIGluamVjdFxuICBwcm92aWRlOiBtZXJnZURhdGFGbixcbiAgaW5qZWN0OiBtZXJnZUluamVjdFxufTtcbmZ1bmN0aW9uIG1lcmdlRGF0YUZuKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkge1xuICAgIHJldHVybiB0bztcbiAgfVxuICBpZiAoIXRvKSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbigpIHtcbiAgICByZXR1cm4gKGV4dGVuZCkoXG4gICAgICBpc0Z1bmN0aW9uKHRvKSA/IHRvLmNhbGwodGhpcywgdGhpcykgOiB0byxcbiAgICAgIGlzRnVuY3Rpb24oZnJvbSkgPyBmcm9tLmNhbGwodGhpcywgdGhpcykgOiBmcm9tXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlSW5qZWN0KHRvLCBmcm9tKSB7XG4gIHJldHVybiBtZXJnZU9iamVjdE9wdGlvbnMobm9ybWFsaXplSW5qZWN0KHRvKSwgbm9ybWFsaXplSW5qZWN0KGZyb20pKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdChyYXcpIHtcbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbcmF3W2ldXSA9IHJhd1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IFsuLi5uZXcgU2V0KFtdLmNvbmNhdCh0bywgZnJvbSkpXSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZU9iamVjdE9wdGlvbnModG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0bywgZnJvbSkgOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICh0bykge1xuICAgIGlmIChpc0FycmF5KHRvKSAmJiBpc0FycmF5KGZyb20pKSB7XG4gICAgICByZXR1cm4gWy4uLi8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi50bywgLi4uZnJvbV0pXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuZChcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKHRvKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhmcm9tICE9IG51bGwgPyBmcm9tIDoge30pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VXYXRjaE9wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKCF0bylcbiAgICByZXR1cm4gZnJvbTtcbiAgaWYgKCFmcm9tKVxuICAgIHJldHVybiB0bztcbiAgY29uc3QgbWVyZ2VkID0gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0byk7XG4gIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICBtZXJnZWRba2V5XSA9IG1lcmdlQXNBcnJheSh0b1trZXldLCBmcm9tW2tleV0pO1xuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFwcENvbnRleHQoKSB7XG4gIHJldHVybiB7XG4gICAgYXBwOiBudWxsLFxuICAgIGNvbmZpZzoge1xuICAgICAgaXNOYXRpdmVUYWc6IE5PLFxuICAgICAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuICAgICAgZ2xvYmFsUHJvcGVydGllczoge30sXG4gICAgICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IHt9LFxuICAgICAgZXJyb3JIYW5kbGVyOiB2b2lkIDAsXG4gICAgICB3YXJuSGFuZGxlcjogdm9pZCAwLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7fVxuICAgIH0sXG4gICAgbWl4aW5zOiBbXSxcbiAgICBjb21wb25lbnRzOiB7fSxcbiAgICBkaXJlY3RpdmVzOiB7fSxcbiAgICBwcm92aWRlczogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgb3B0aW9uc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBwcm9wc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBlbWl0c0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKVxuICB9O1xufVxubGV0IHVpZCQxID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUFwcChyb290Q29tcG9uZW50LCByb290UHJvcHMgPSBudWxsKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKHJvb3RDb21wb25lbnQpKSB7XG4gICAgICByb290Q29tcG9uZW50ID0gZXh0ZW5kKHt9LCByb290Q29tcG9uZW50KTtcbiAgICB9XG4gICAgaWYgKHJvb3RQcm9wcyAhPSBudWxsICYmICFpc09iamVjdChyb290UHJvcHMpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHJvb3QgcHJvcHMgcGFzc2VkIHRvIGFwcC5tb3VudCgpIG11c3QgYmUgYW4gb2JqZWN0LmApO1xuICAgICAgcm9vdFByb3BzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUFwcENvbnRleHQoKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHQuY29uZmlnLCBcInVud3JhcEluamVjdGVkUmVmXCIsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBhcHAuY29uZmlnLnVud3JhcEluamVjdGVkUmVmIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIDMuMyBub3cgYWx3YXlzIHVud3JhcHMgaW5qZWN0ZWQgcmVmcyBpbiBPcHRpb25zIEFQSS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbGxlZFBsdWdpbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICBsZXQgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY29uc3QgYXBwID0gY29udGV4dC5hcHAgPSB7XG4gICAgICBfdWlkOiB1aWQkMSsrLFxuICAgICAgX2NvbXBvbmVudDogcm9vdENvbXBvbmVudCxcbiAgICAgIF9wcm9wczogcm9vdFByb3BzLFxuICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2luc3RhbmNlOiBudWxsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNvbmZpZztcbiAgICAgIH0sXG4gICAgICBzZXQgY29uZmlnKHYpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYGFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2UocGx1Z2luLCAuLi5vcHRpb25zKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmhhcyhwbHVnaW4pKSB7XG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBQbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRhcmdldCBhcHAuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGx1Z2luICYmIGlzRnVuY3Rpb24ocGx1Z2luLmluc3RhbGwpKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5hZGQocGx1Z2luKTtcbiAgICAgICAgICBwbHVnaW4uaW5zdGFsbChhcHAsIC4uLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocGx1Z2luKSkge1xuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMuYWRkKHBsdWdpbik7XG4gICAgICAgICAgcGx1Z2luKGFwcCwgLi4ub3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiBcImluc3RhbGxcIiBmdW5jdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1peGluKG1peGluKSB7XG4gICAgICAgIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fKSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1peGlucy5pbmNsdWRlcyhtaXhpbikpIHtcbiAgICAgICAgICAgIGNvbnRleHQubWl4aW5zLnB1c2gobWl4aW4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgXCJNaXhpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcFwiICsgKG1peGluLm5hbWUgPyBgOiAke21peGluLm5hbWV9YCA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybihcIk1peGlucyBhcmUgb25seSBhdmFpbGFibGUgaW4gYnVpbGRzIHN1cHBvcnRpbmcgT3B0aW9ucyBBUElcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnQobmFtZSwgY29tcG9uZW50KSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUsIGNvbnRleHQuY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5jb21wb25lbnRzW25hbWVdKSB7XG4gICAgICAgICAgd2FybihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSA9IGNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBkaXJlY3RpdmUobmFtZSwgZGlyZWN0aXZlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuKGBEaXJlY3RpdmUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdID0gZGlyZWN0aXZlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1vdW50KHJvb3RDb250YWluZXIsIGlzSHlkcmF0ZSwgaXNTVkcpIHtcbiAgICAgICAgaWYgKCFpc01vdW50ZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBgVGhlcmUgaXMgYWxyZWFkeSBhbiBhcHAgaW5zdGFuY2UgbW91bnRlZCBvbiB0aGUgaG9zdCBjb250YWluZXIuXG4gSWYgeW91IHdhbnQgdG8gbW91bnQgYW5vdGhlciBhcHAgb24gdGhlIHNhbWUgaG9zdCBjb250YWluZXIsIHlvdSBuZWVkIHRvIHVubW91bnQgdGhlIHByZXZpb3VzIGFwcCBieSBjYWxsaW5nIFxcYGFwcC51bm1vdW50KClcXGAgZmlyc3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShyb290Q29tcG9uZW50LCByb290UHJvcHMpO1xuICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlbG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVuZGVyKGNsb25lVk5vZGUodm5vZGUpLCByb290Q29udGFpbmVyLCBpc1NWRyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIeWRyYXRlICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodm5vZGUsIHJvb3RDb250YWluZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIGlzU1ZHKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgICBhcHAuX2NvbnRhaW5lciA9IHJvb3RDb250YWluZXI7XG4gICAgICAgICAgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXyA9IGFwcDtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgIGFwcC5faW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICBkZXZ0b29sc0luaXRBcHAoYXBwLCB2ZXJzaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdldEV4cG9zZVByb3h5KHZub2RlLmNvbXBvbmVudCkgfHwgdm5vZGUuY29tcG9uZW50LnByb3h5O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYEFwcCBoYXMgYWxyZWFkeSBiZWVuIG1vdW50ZWQuXG5JZiB5b3Ugd2FudCB0byByZW1vdW50IHRoZSBzYW1lIGFwcCwgbW92ZSB5b3VyIGFwcCBjcmVhdGlvbiBsb2dpYyBpbnRvIGEgZmFjdG9yeSBmdW5jdGlvbiBhbmQgY3JlYXRlIGZyZXNoIGFwcCBpbnN0YW5jZXMgZm9yIGVhY2ggbW91bnQgLSBlLmcuIFxcYGNvbnN0IGNyZWF0ZU15QXBwID0gKCkgPT4gY3JlYXRlQXBwKEFwcClcXGBgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVubW91bnQoKSB7XG4gICAgICAgIGlmIChpc01vdW50ZWQpIHtcbiAgICAgICAgICByZW5kZXIobnVsbCwgYXBwLl9jb250YWluZXIpO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICBkZXZ0b29sc1VubW91bnRBcHAoYXBwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFwcC5fY29udGFpbmVyLl9fdnVlX2FwcF9fO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGBDYW5ub3QgdW5tb3VudCBhbiBhcHAgdGhhdCBpcyBub3QgbW91bnRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3ZpZGUoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgaW4gY29udGV4dC5wcm92aWRlcykge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBydW5XaXRoQ29udGV4dChmbikge1xuICAgICAgICBjdXJyZW50QXBwID0gYXBwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGN1cnJlbnRBcHAgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBwO1xuICB9O1xufVxubGV0IGN1cnJlbnRBcHAgPSBudWxsO1xuXG5mdW5jdGlvbiBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgaWYgKCFjdXJyZW50SW5zdGFuY2UpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihgcHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcztcbiAgICBjb25zdCBwYXJlbnRQcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQgJiYgY3VycmVudEluc3RhbmNlLnBhcmVudC5wcm92aWRlcztcbiAgICBpZiAocGFyZW50UHJvdmlkZXMgPT09IHByb3ZpZGVzKSB7XG4gICAgICBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdmlkZXMpO1xuICAgIH1cbiAgICBwcm92aWRlc1trZXldID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdChrZXksIGRlZmF1bHRWYWx1ZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5ID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UgfHwgY3VycmVudEFwcCkge1xuICAgIGNvbnN0IHByb3ZpZGVzID0gaW5zdGFuY2UgPyBpbnN0YW5jZS5wYXJlbnQgPT0gbnVsbCA/IGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQgJiYgaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlcyA6IGluc3RhbmNlLnBhcmVudC5wcm92aWRlcyA6IGN1cnJlbnRBcHAuX2NvbnRleHQucHJvdmlkZXM7XG4gICAgaWYgKHByb3ZpZGVzICYmIGtleSBpbiBwcm92aWRlcykge1xuICAgICAgcmV0dXJuIHByb3ZpZGVzW2tleV07XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUuY2FsbChpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKGBpbmplY3Rpb24gXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZC5gKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oYGluamVjdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkgb3IgZnVuY3Rpb25hbCBjb21wb25lbnRzLmApO1xuICB9XG59XG5mdW5jdGlvbiBoYXNJbmplY3Rpb25Db250ZXh0KCkge1xuICByZXR1cm4gISEoY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB8fCBjdXJyZW50QXBwKTtcbn1cblxuZnVuY3Rpb24gaW5pdFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IgPSBmYWxzZSkge1xuICBjb25zdCBwcm9wcyA9IHt9O1xuICBjb25zdCBhdHRycyA9IHt9O1xuICBkZWYoYXR0cnMsIEludGVybmFsT2JqZWN0S2V5LCAxKTtcbiAgaW5zdGFuY2UucHJvcHNEZWZhdWx0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICBwcm9wc1trZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKGlzU3RhdGVmdWwpIHtcbiAgICBpbnN0YW5jZS5wcm9wcyA9IGlzU1NSID8gcHJvcHMgOiBzaGFsbG93UmVhY3RpdmUocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW5zdGFuY2UudHlwZS5wcm9wcykge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBhdHRycztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBwcm9wcztcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYXR0cnMgPSBhdHRycztcbn1cbmZ1bmN0aW9uIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIHdoaWxlIChpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS50eXBlLl9faG1ySWQpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnBhcmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICBjb25zdCB7XG4gICAgcHJvcHMsXG4gICAgYXR0cnMsXG4gICAgdm5vZGU6IHsgcGF0Y2hGbGFnIH1cbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBpZiAoXG4gICAgLy8gYWx3YXlzIGZvcmNlIGZ1bGwgZGlmZiBpbiBkZXZcbiAgICAvLyAtICMxOTQyIGlmIGhtciBpcyBlbmFibGVkIHdpdGggc2ZjIGNvbXBvbmVudFxuICAgIC8vIC0gdml0ZSM4NzIgbm9uLXNmYyBjb21wb25lbnQgdXNlZCBieSBzZmMgY29tcG9uZW50XG4gICAgISghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiYgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJiAhKHBhdGNoRmxhZyAmIDE2KVxuICApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IGluc3RhbmNlLnZub2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgICAgICAgcHJvcHNbY2FtZWxpemVkS2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAgY2FtZWxpemVkS2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgIC8qIGlzQWJzZW50ICovXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQga2ViYWJLZXk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBpZiAoIXJhd1Byb3BzIHx8IC8vIGZvciBjYW1lbENhc2VcbiAgICAgICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAvLyBhbmQgY29udmVydGVkIHRvIGNhbWVsQ2FzZSAoIzk1NSlcbiAgICAgICgoa2ViYWJLZXkgPSBoeXBoZW5hdGUoa2V5KSkgPT09IGtleSB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZWJhYktleSkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHJhd1ByZXZQcm9wcyAmJiAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgKHJhd1ByZXZQcm9wc1trZXldICE9PSB2b2lkIDAgfHwgLy8gZm9yIGtlYmFiLWNhc2VcbiAgICAgICAgICByYXdQcmV2UHJvcHNba2ViYWJLZXldICE9PSB2b2lkIDApKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgLyogaXNBYnNlbnQgKi9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRycyAhPT0gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoIXJhd1Byb3BzIHx8ICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgdHJ1ZSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGhhc0F0dHJzQ2hhbmdlZCkge1xuICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJGF0dHJzXCIpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSB7XG4gIGNvbnN0IFtvcHRpb25zLCBuZWVkQ2FzdEtleXNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCByYXdDYXN0VmFsdWVzO1xuICBpZiAocmF3UHJvcHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgbGV0IGNhbWVsS2V5O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsIGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpIHtcbiAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICBwcm9wc1tjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gYXR0cnMpIHx8IHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRDYXN0S2V5cykge1xuICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBjYXN0VmFsdWVzID0gcmF3Q2FzdFZhbHVlcyB8fCBFTVBUWV9PQko7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWVkQ2FzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG5lZWRDYXN0S2V5c1tpXTtcbiAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2FzdFZhbHVlc1trZXldLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgIWhhc093bihjYXN0VmFsdWVzLCBrZXkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQXR0cnNDaGFuZ2VkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCBwcm9wcywga2V5LCB2YWx1ZSwgaW5zdGFuY2UsIGlzQWJzZW50KSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgaWYgKG9wdCAhPSBudWxsKSB7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsIFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHQuZGVmYXVsdDtcbiAgICAgIGlmIChvcHQudHlwZSAhPT0gRnVuY3Rpb24gJiYgIW9wdC5za2lwRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wc0RlZmF1bHRzIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGtleSBpbiBwcm9wc0RlZmF1bHRzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICB2YWx1ZSA9IHByb3BzRGVmYXVsdHNba2V5XSA9IGRlZmF1bHRWYWx1ZS5jYWxsKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdFswIC8qIHNob3VsZENhc3QgKi9dKSB7XG4gICAgICBpZiAoaXNBYnNlbnQgJiYgIWhhc0RlZmF1bHQpIHtcbiAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0WzEgLyogc2hvdWxkQ2FzdFRydWUgKi9dICYmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpKSB7XG4gICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHNPcHRpb25zKGNvbXAsIGFwcENvbnRleHQsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCBjYWNoZSA9IGFwcENvbnRleHQucHJvcHNDYWNoZTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNvbXApO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLnByb3BzO1xuICBjb25zdCBub3JtYWxpemVkID0ge307XG4gIGNvbnN0IG5lZWRDYXN0S2V5cyA9IFtdO1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZFByb3BzID0gKHJhdzIpID0+IHtcbiAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgY29uc3QgW3Byb3BzLCBrZXlzXSA9IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyhyYXcyLCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgIGV4dGVuZChub3JtYWxpemVkLCBwcm9wcyk7XG4gICAgICBpZiAoa2V5cylcbiAgICAgICAgbmVlZENhc3RLZXlzLnB1c2goLi4ua2V5cyk7XG4gICAgfTtcbiAgICBpZiAoIWFzTWl4aW4gJiYgYXBwQ29udGV4dC5taXhpbnMubGVuZ3RoKSB7XG4gICAgICBhcHBDb250ZXh0Lm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAuZXh0ZW5kcykge1xuICAgICAgZXh0ZW5kUHJvcHMoY29tcC5leHRlbmRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAubWl4aW5zKSB7XG4gICAgICBjb21wLm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyYXcgJiYgIWhhc0V4dGVuZHMpIHtcbiAgICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICAgIGNhY2hlLnNldChjb21wLCBFTVBUWV9BUlIpO1xuICAgIH1cbiAgICByZXR1cm4gRU1QVFlfQVJSO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzU3RyaW5nKHJhd1tpXSkpIHtcbiAgICAgICAgd2FybihgcHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LmAsIHJhd1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUocmF3W2ldKTtcbiAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBFTVBUWV9PQko7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHJhdykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChyYXcpKSB7XG4gICAgICB3YXJuKGBpbnZhbGlkIHByb3BzIG9wdGlvbnNgLCByYXcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXcpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgaWYgKHZhbGlkYXRlUHJvcE5hbWUobm9ybWFsaXplZEtleSkpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gcmF3W2tleV07XG4gICAgICAgIGNvbnN0IHByb3AgPSBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSA/IHsgdHlwZTogb3B0IH0gOiBleHRlbmQoe30sIG9wdCk7XG4gICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgY29uc3QgYm9vbGVhbkluZGV4ID0gZ2V0VHlwZUluZGV4KEJvb2xlYW4sIHByb3AudHlwZSk7XG4gICAgICAgICAgY29uc3Qgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgICAgIHByb3BbMCAvKiBzaG91bGRDYXN0ICovXSA9IGJvb2xlYW5JbmRleCA+IC0xO1xuICAgICAgICAgIHByb3BbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gPSBzdHJpbmdJbmRleCA8IDAgfHwgYm9vbGVhbkluZGV4IDwgc3RyaW5nSW5kZXg7XG4gICAgICAgICAgaWYgKGJvb2xlYW5JbmRleCA+IC0xIHx8IGhhc093bihwcm9wLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICAgIG5lZWRDYXN0S2V5cy5wdXNoKG5vcm1hbGl6ZWRLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXMgPSBbbm9ybWFsaXplZCwgbmVlZENhc3RLZXlzXTtcbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcE5hbWUoa2V5KSB7XG4gIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oYEludmFsaWQgcHJvcCBuYW1lOiBcIiR7a2V5fVwiIGlzIGEgcmVzZXJ2ZWQgcHJvcGVydHkuYCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0VHlwZShjdG9yKSB7XG4gIGNvbnN0IG1hdGNoID0gY3RvciAmJiBjdG9yLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXFx3KykvKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMl0gOiBjdG9yID09PSBudWxsID8gXCJudWxsXCIgOiBcIlwiO1xufVxuZnVuY3Rpb24gaXNTYW1lVHlwZShhLCBiKSB7XG4gIHJldHVybiBnZXRUeXBlKGEpID09PSBnZXRUeXBlKGIpO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4KHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKGlzQXJyYXkoZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlcy5maW5kSW5kZXgoKHQpID0+IGlzU2FtZVR5cGUodCwgdHlwZSkpO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzLCBwcm9wcywgaW5zdGFuY2UpIHtcbiAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF07XG4gIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICBsZXQgb3B0ID0gb3B0aW9uc1trZXldO1xuICAgIGlmIChvcHQgPT0gbnVsbClcbiAgICAgIGNvbnRpbnVlO1xuICAgIHZhbGlkYXRlUHJvcChcbiAgICAgIGtleSxcbiAgICAgIHJlc29sdmVkVmFsdWVzW2tleV0sXG4gICAgICBvcHQsXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmICFoYXNPd24ocmF3UHJvcHMsIGh5cGhlbmF0ZShrZXkpKVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcChuYW1lLCB2YWx1ZSwgcHJvcCwgaXNBYnNlbnQpIHtcbiAgY29uc3QgeyB0eXBlLCByZXF1aXJlZCwgdmFsaWRhdG9yLCBza2lwQ2hlY2sgfSA9IHByb3A7XG4gIGlmIChyZXF1aXJlZCAmJiBpc0Fic2VudCkge1xuICAgIHdhcm4oJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogXCInICsgbmFtZSArICdcIicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcmVxdWlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9PSB0cnVlICYmICFza2lwQ2hlY2spIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGVzID0gaXNBcnJheSh0eXBlKSA/IHR5cGUgOiBbdHlwZV07XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCBcIlwiKTtcbiAgICAgIGlzVmFsaWQgPSB2YWxpZDtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB3YXJuKGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0b3IodmFsdWUpKSB7XG4gICAgd2FybignSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicpO1xuICB9XG59XG5jb25zdCBpc1NpbXBsZVR5cGUgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgXCJTdHJpbmcsTnVtYmVyLEJvb2xlYW4sRnVuY3Rpb24sU3ltYm9sLEJpZ0ludFwiXG4pO1xuZnVuY3Rpb24gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZSkge1xuICBsZXQgdmFsaWQ7XG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChpc1NpbXBsZVR5cGUoZXhwZWN0ZWRUeXBlKSkge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICB2YWxpZCA9IGlzT2JqZWN0KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiQXJyYXlcIikge1xuICAgIHZhbGlkID0gaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm51bGxcIikge1xuICAgIHZhbGlkID0gdmFsdWUgPT09IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICBsZXQgbWVzc2FnZSA9IGBJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJHtuYW1lfVwiLiBFeHBlY3RlZCAke2V4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oXCIgfCBcIil9YDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlc1swXTtcbiAgY29uc3QgcmVjZWl2ZWRUeXBlID0gdG9SYXdUeXBlKHZhbHVlKTtcbiAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIGV4cGVjdGVkVHlwZSk7XG4gIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBzdHlsZVZhbHVlKHZhbHVlLCByZWNlaXZlZFR5cGUpO1xuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDEgJiYgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiYgIWlzQm9vbGVhbihleHBlY3RlZFR5cGUsIHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGAgd2l0aCB2YWx1ZSAke2V4cGVjdGVkVmFsdWV9YDtcbiAgfVxuICBtZXNzYWdlICs9IGAsIGdvdCAke3JlY2VpdmVkVHlwZX0gYDtcbiAgaWYgKGlzRXhwbGljYWJsZShyZWNlaXZlZFR5cGUpKSB7XG4gICAgbWVzc2FnZSArPSBgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9LmA7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5mdW5jdGlvbiBzdHlsZVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSBcIlN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiTnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7TnVtYmVyKHZhbHVlKX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5mdW5jdGlvbiBpc0V4cGxpY2FibGUodHlwZSkge1xuICBjb25zdCBleHBsaWNpdFR5cGVzID0gW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiXTtcbiAgcmV0dXJuIGV4cGxpY2l0VHlwZXMuc29tZSgoZWxlbSkgPT4gdHlwZS50b0xvd2VyQ2FzZSgpID09PSBlbGVtKTtcbn1cbmZ1bmN0aW9uIGlzQm9vbGVhbiguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzLnNvbWUoKGVsZW0pID0+IGVsZW0udG9Mb3dlckNhc2UoKSA9PT0gXCJib29sZWFuXCIpO1xufVxuXG5jb25zdCBpc0ludGVybmFsS2V5ID0gKGtleSkgPT4ga2V5WzBdID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJHN0YWJsZVwiO1xuY29uc3Qgbm9ybWFsaXplU2xvdFZhbHVlID0gKHZhbHVlKSA9PiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWTm9kZSkgOiBbbm9ybWFsaXplVk5vZGUodmFsdWUpXTtcbmNvbnN0IG5vcm1hbGl6ZVNsb3QgPSAoa2V5LCByYXdTbG90LCBjdHgpID0+IHtcbiAgaWYgKHJhd1Nsb3QuX24pIHtcbiAgICByZXR1cm4gcmF3U2xvdDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gd2l0aEN0eCgoLi4uYXJncykgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGN1cnJlbnRJbnN0YW5jZSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFNsb3QgXCIke2tleX1cIiBpbnZva2VkIG91dHNpZGUgb2YgdGhlIHJlbmRlciBmdW5jdGlvbjogdGhpcyB3aWxsIG5vdCB0cmFjayBkZXBlbmRlbmNpZXMgdXNlZCBpbiB0aGUgc2xvdC4gSW52b2tlIHRoZSBzbG90IGZ1bmN0aW9uIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNsb3RWYWx1ZShyYXdTbG90KC4uLmFyZ3MpKTtcbiAgfSwgY3R4KTtcbiAgbm9ybWFsaXplZC5fYyA9IGZhbHNlO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBub3JtYWxpemVPYmplY3RTbG90cyA9IChyYXdTbG90cywgc2xvdHMsIGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IGN0eCA9IHJhd1Nsb3RzLl9jdHg7XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Nsb3RzKSB7XG4gICAgaWYgKGlzSW50ZXJuYWxLZXkoa2V5KSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcmF3U2xvdHNba2V5XTtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHNsb3RzW2tleV0gPSBub3JtYWxpemVTbG90KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYE5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3Igc2xvdCBcIiR7a2V5fVwiLiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKHZhbHVlKTtcbiAgICAgIHNsb3RzW2tleV0gPSAoKSA9PiBub3JtYWxpemVkO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG5vcm1hbGl6ZVZOb2RlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0tlZXBBbGl2ZShpbnN0YW5jZS52bm9kZSkgJiYgdHJ1ZSkge1xuICAgIHdhcm4oXG4gICAgICBgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBkZWZhdWx0IHNsb3QuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUoY2hpbGRyZW4pO1xuICBpbnN0YW5jZS5zbG90cy5kZWZhdWx0ID0gKCkgPT4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBpbml0U2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmIChpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cyA9IHRvUmF3KGNoaWxkcmVuKTtcbiAgICAgIGRlZihjaGlsZHJlbiwgXCJfXCIsIHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVPYmplY3RTbG90cyhcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIGluc3RhbmNlLnNsb3RzID0ge30pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5zbG90cyA9IHt9O1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgfVxuICBkZWYoaW5zdGFuY2Uuc2xvdHMsIEludGVybmFsT2JqZWN0S2V5LCAxKTtcbn07XG5jb25zdCB1cGRhdGVTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBjb25zdCB7IHZub2RlLCBzbG90cyB9ID0gaW5zdGFuY2U7XG4gIGxldCBuZWVkRGVsZXRpb25DaGVjayA9IHRydWU7XG4gIGxldCBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSBFTVBUWV9PQko7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICAgIGV4dGVuZChzbG90cywgY2hpbGRyZW4pO1xuICAgICAgICB0cmlnZ2VyKGluc3RhbmNlLCBcInNldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW1pemVkICYmIHR5cGUgPT09IDEpIHtcbiAgICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4dGVuZChzbG90cywgY2hpbGRyZW4pO1xuICAgICAgICBpZiAoIW9wdGltaXplZCAmJiB0eXBlID09PSAxKSB7XG4gICAgICAgICAgZGVsZXRlIHNsb3RzLl87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSAhY2hpbGRyZW4uJHN0YWJsZTtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKGNoaWxkcmVuLCBzbG90cyk7XG4gICAgfVxuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IHsgZGVmYXVsdDogMSB9O1xuICB9XG4gIGlmIChuZWVkRGVsZXRpb25DaGVjaykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICBpZiAoIWlzSW50ZXJuYWxLZXkoa2V5KSAmJiBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBzbG90c1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gc2V0UmVmKHJhd1JlZiwgb2xkUmF3UmVmLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIGlzVW5tb3VudCA9IGZhbHNlKSB7XG4gIGlmIChpc0FycmF5KHJhd1JlZikpIHtcbiAgICByYXdSZWYuZm9yRWFjaChcbiAgICAgIChyLCBpKSA9PiBzZXRSZWYoXG4gICAgICAgIHIsXG4gICAgICAgIG9sZFJhd1JlZiAmJiAoaXNBcnJheShvbGRSYXdSZWYpID8gb2xkUmF3UmVmW2ldIDogb2xkUmF3UmVmKSxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBpc1VubW91bnRcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpICYmICFpc1VubW91bnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVmVmFsdWUgPSB2bm9kZS5zaGFwZUZsYWcgJiA0ID8gZ2V0RXhwb3NlUHJveHkodm5vZGUuY29tcG9uZW50KSB8fCB2bm9kZS5jb21wb25lbnQucHJveHkgOiB2bm9kZS5lbDtcbiAgY29uc3QgdmFsdWUgPSBpc1VubW91bnQgPyBudWxsIDogcmVmVmFsdWU7XG4gIGNvbnN0IHsgaTogb3duZXIsIHI6IHJlZiB9ID0gcmF3UmVmO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhb3duZXIpIHtcbiAgICB3YXJuKFxuICAgICAgYE1pc3NpbmcgcmVmIG93bmVyIGNvbnRleHQuIHJlZiBjYW5ub3QgYmUgdXNlZCBvbiBob2lzdGVkIHZub2Rlcy4gQSB2bm9kZSB3aXRoIHJlZiBtdXN0IGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24uYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9sZFJlZiA9IG9sZFJhd1JlZiAmJiBvbGRSYXdSZWYucjtcbiAgY29uc3QgcmVmcyA9IG93bmVyLnJlZnMgPT09IEVNUFRZX09CSiA/IG93bmVyLnJlZnMgPSB7fSA6IG93bmVyLnJlZnM7XG4gIGNvbnN0IHNldHVwU3RhdGUgPSBvd25lci5zZXR1cFN0YXRlO1xuICBpZiAob2xkUmVmICE9IG51bGwgJiYgb2xkUmVmICE9PSByZWYpIHtcbiAgICBpZiAoaXNTdHJpbmcob2xkUmVmKSkge1xuICAgICAgcmVmc1tvbGRSZWZdID0gbnVsbDtcbiAgICAgIGlmIChoYXNPd24oc2V0dXBTdGF0ZSwgb2xkUmVmKSkge1xuICAgICAgICBzZXR1cFN0YXRlW29sZFJlZl0gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNSZWYob2xkUmVmKSkge1xuICAgICAgb2xkUmVmLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24ocmVmKSkge1xuICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhyZWYsIG93bmVyLCAxMiwgW3ZhbHVlLCByZWZzXSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgX2lzU3RyaW5nID0gaXNTdHJpbmcocmVmKTtcbiAgICBjb25zdCBfaXNSZWYgPSBpc1JlZihyZWYpO1xuICAgIGlmIChfaXNTdHJpbmcgfHwgX2lzUmVmKSB7XG4gICAgICBjb25zdCBkb1NldCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJhd1JlZi5mKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBfaXNTdHJpbmcgPyBoYXNPd24oc2V0dXBTdGF0ZSwgcmVmKSA/IHNldHVwU3RhdGVbcmVmXSA6IHJlZnNbcmVmXSA6IHJlZi52YWx1ZTtcbiAgICAgICAgICBpZiAoaXNVbm1vdW50KSB7XG4gICAgICAgICAgICBpc0FycmF5KGV4aXN0aW5nKSAmJiByZW1vdmUoZXhpc3RpbmcsIHJlZlZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICBpZiAoX2lzU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgcmVmc1tyZWZdID0gW3JlZlZhbHVlXTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duKHNldHVwU3RhdGUsIHJlZikpIHtcbiAgICAgICAgICAgICAgICAgIHNldHVwU3RhdGVbcmVmXSA9IHJlZnNbcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVmLnZhbHVlID0gW3JlZlZhbHVlXTtcbiAgICAgICAgICAgICAgICBpZiAocmF3UmVmLmspXG4gICAgICAgICAgICAgICAgICByZWZzW3Jhd1JlZi5rXSA9IHJlZi52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghZXhpc3RpbmcuaW5jbHVkZXMocmVmVmFsdWUpKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLnB1c2gocmVmVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfaXNTdHJpbmcpIHtcbiAgICAgICAgICByZWZzW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAoaGFzT3duKHNldHVwU3RhdGUsIHJlZikpIHtcbiAgICAgICAgICAgIHNldHVwU3RhdGVbcmVmXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfaXNSZWYpIHtcbiAgICAgICAgICByZWYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBpZiAocmF3UmVmLmspXG4gICAgICAgICAgICByZWZzW3Jhd1JlZi5rXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFwiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZTpcIiwgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZG9TZXQuaWQgPSAtMTtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRvU2V0LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1NldCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6XCIsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgaGFzTWlzbWF0Y2ggPSBmYWxzZTtcbmNvbnN0IGlzU1ZHQ29udGFpbmVyID0gKGNvbnRhaW5lcikgPT4gL3N2Zy8udGVzdChjb250YWluZXIubmFtZXNwYWNlVVJJKSAmJiBjb250YWluZXIudGFnTmFtZSAhPT0gXCJmb3JlaWduT2JqZWN0XCI7XG5jb25zdCBpc0NvbW1lbnQgPSAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBDT01NRU5UICovO1xuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBtdDogbW91bnRDb21wb25lbnQsXG4gICAgcDogcGF0Y2gsXG4gICAgbzoge1xuICAgICAgcGF0Y2hQcm9wLFxuICAgICAgY3JlYXRlVGV4dCxcbiAgICAgIG5leHRTaWJsaW5nLFxuICAgICAgcGFyZW50Tm9kZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIGluc2VydCxcbiAgICAgIGNyZWF0ZUNvbW1lbnRcbiAgICB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgY29uc3QgaHlkcmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIGh5ZHJhdGUgZXhpc3RpbmcgbWFya3VwIGJ1dCBjb250YWluZXIgaXMgZW1wdHkuIFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhhc01pc21hdGNoID0gZmFsc2U7XG4gICAgaHlkcmF0ZU5vZGUoY29udGFpbmVyLmZpcnN0Q2hpbGQsIHZub2RlLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICBpZiAoaGFzTWlzbWF0Y2ggJiYgdHJ1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSHlkcmF0aW9uIGNvbXBsZXRlZCBidXQgY29udGFpbnMgbWlzbWF0Y2hlcy5gKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVOb2RlID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgaXNGcmFnbWVudFN0YXJ0ID0gaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJbXCI7XG4gICAgY29uc3Qgb25NaXNtYXRjaCA9ICgpID0+IGhhbmRsZU1pc21hdGNoKFxuICAgICAgbm9kZSxcbiAgICAgIHZub2RlLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBpc0ZyYWdtZW50U3RhcnRcbiAgICApO1xuICAgIGNvbnN0IHsgdHlwZSwgcmVmLCBzaGFwZUZsYWcsIHBhdGNoRmxhZyB9ID0gdm5vZGU7XG4gICAgbGV0IGRvbVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgIHZub2RlLmVsID0gbm9kZTtcbiAgICBpZiAocGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBsZXQgbmV4dE5vZGUgPSBudWxsO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUZXh0OlxuICAgICAgICBpZiAoZG9tVHlwZSAhPT0gMyAvKiBURVhUICovKSB7XG4gICAgICAgICAgaWYgKHZub2RlLmNoaWxkcmVuID09PSBcIlwiKSB7XG4gICAgICAgICAgICBpbnNlcnQodm5vZGUuZWwgPSBjcmVhdGVUZXh0KFwiXCIpLCBwYXJlbnROb2RlKG5vZGUpLCBub2RlKTtcbiAgICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChub2RlLmRhdGEgIT09IHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgICAgICAgIGBIeWRyYXRpb24gdGV4dCBtaXNtYXRjaDpcbi0gU2VydmVyIHJlbmRlcmVkOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVxuICAgICAgICAgICAgICApfVxuLSBDbGllbnQgcmVuZGVyZWQ6ICR7SlNPTi5zdHJpbmdpZnkodm5vZGUuY2hpbGRyZW4pfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tbWVudDpcbiAgICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICByZXBsYWNlTm9kZShcbiAgICAgICAgICAgIHZub2RlLmVsID0gbm9kZS5jb250ZW50LmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkb21UeXBlICE9PSA4IC8qIENPTU1FTlQgKi8gfHwgaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIGRvbVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21UeXBlID09PSAxIC8qIEVMRU1FTlQgKi8gfHwgZG9tVHlwZSA9PT0gMyAvKiBURVhUICovKSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgIGNvbnN0IG5lZWRUb0Fkb3B0Q29udGVudCA9ICF2bm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2bm9kZS5zdGF0aWNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobmVlZFRvQWRvcHRDb250ZW50KVxuICAgICAgICAgICAgICB2bm9kZS5jaGlsZHJlbiArPSBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovID8gbmV4dE5vZGUub3V0ZXJIVE1MIDogbmV4dE5vZGUuZGF0YTtcbiAgICAgICAgICAgIGlmIChpID09PSB2bm9kZS5zdGF0aWNDb3VudCAtIDEpIHtcbiAgICAgICAgICAgICAgdm5vZGUuYW5jaG9yID0gbmV4dE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5leHROb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlzRnJhZ21lbnRTdGFydCA/IG5leHRTaWJsaW5nKG5leHROb2RlKSA6IG5leHROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICAgIGlmICghaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBoeWRyYXRlRnJhZ21lbnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMSkge1xuICAgICAgICAgIGlmICgoZG9tVHlwZSAhPT0gMSAvKiBFTEVNRU5UICovIHx8IHZub2RlLnR5cGUudG9Mb3dlckNhc2UoKSAhPT0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpICYmICFpc1RlbXBsYXRlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHZub2RlLnNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcztcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwidGVsZXBvcnQgc3RhcnRcIikge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUsIG5vZGUuZGF0YSwgXCJ0ZWxlcG9ydCBlbmRcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vdW50Q29tcG9uZW50KFxuICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWR0NvbnRhaW5lcihjb250YWluZXIpLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpKSB7XG4gICAgICAgICAgICBsZXQgc3ViVHJlZTtcbiAgICAgICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IGNyZWF0ZVZOb2RlKEZyYWdtZW50KTtcbiAgICAgICAgICAgICAgc3ViVHJlZS5hbmNob3IgPSBuZXh0Tm9kZSA/IG5leHROb2RlLnByZXZpb3VzU2libGluZyA6IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdWJUcmVlID0gbm9kZS5ub2RlVHlwZSA9PT0gMyA/IGNyZWF0ZVRleHRWTm9kZShcIlwiKSA6IGNyZWF0ZVZOb2RlKFwiZGl2XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViVHJlZS5lbCA9IG5vZGU7XG4gICAgICAgICAgICB2bm9kZS5jb21wb25lbnQuc3ViVHJlZSA9IHN1YlRyZWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgaWYgKGRvbVR5cGUgIT09IDggLyogQ09NTUVOVCAqLykge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgICBoeWRyYXRlQ2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWR0NvbnRhaW5lcihwYXJlbnROb2RlKG5vZGUpKSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgaHlkcmF0ZU5vZGVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFwiSW52YWxpZCBIb3N0Vk5vZGUgdHlwZTpcIiwgdHlwZSwgYCgke3R5cGVvZiB0eXBlfSlgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXh0Tm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUVsZW1lbnQgPSAoZWwsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXZub2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCB7IHR5cGUsIHByb3BzLCBwYXRjaEZsYWcsIHNoYXBlRmxhZywgZGlycywgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gICAgY29uc3QgZm9yY2VQYXRjaFZhbHVlID0gdHlwZSA9PT0gXCJpbnB1dFwiICYmIGRpcnMgfHwgdHlwZSA9PT0gXCJvcHRpb25cIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmb3JjZVBhdGNoVmFsdWUgfHwgcGF0Y2hGbGFnICE9PSAtMSkge1xuICAgICAgaWYgKGRpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImNyZWF0ZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgaWYgKGZvcmNlUGF0Y2hWYWx1ZSB8fCAhb3B0aW1pemVkIHx8IHBhdGNoRmxhZyAmICgxNiB8IDMyKSkge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2VQYXRjaFZhbHVlICYmIGtleS5lbmRzV2l0aChcInZhbHVlXCIpIHx8IGlzT24oa2V5KSAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSkge1xuICAgICAgICAgICAgICBwYXRjaFByb3AoXG4gICAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgcHJvcHNba2V5XSxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgICBwYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIFwib25DbGlja1wiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzLm9uQ2xpY2ssXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCB2bm9kZUhvb2tzO1xuICAgICAgaWYgKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlQmVmb3JlTW91bnQpIHtcbiAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgfVxuICAgICAgbGV0IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzID0gZmFsc2U7XG4gICAgICBpZiAoaXNUZW1wbGF0ZU5vZGUoZWwpKSB7XG4gICAgICAgIG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzID0gbmVlZFRyYW5zaXRpb24ocGFyZW50U3VzcGVuc2UsIHRyYW5zaXRpb24pICYmIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnQudm5vZGUucHJvcHMgJiYgcGFyZW50Q29tcG9uZW50LnZub2RlLnByb3BzLmFwcGVhcjtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGVsLmNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXBsYWNlTm9kZShjb250ZW50LCBlbCwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgdm5vZGUuZWwgPSBlbCA9IGNvbnRlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlTW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgZGlycyB8fCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSgoKSA9PiB7XG4gICAgICAgICAgdm5vZGVIb29rcyAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2ICYmIC8vIHNraXAgaWYgZWxlbWVudCBoYXMgaW5uZXJIVE1MIC8gdGV4dENvbnRlbnRcbiAgICAgICEocHJvcHMgJiYgKHByb3BzLmlubmVySFRNTCB8fCBwcm9wcy50ZXh0Q29udGVudCkpKSB7XG4gICAgICAgIGxldCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIGVsLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaGFzV2FybmVkKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIGluIDwke3Zub2RlLnR5cGV9Pjogc2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgbW9yZSBjaGlsZCBub2RlcyB0aGFuIGNsaWVudCB2ZG9tLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjdXIgPSBuZXh0O1xuICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgIHJlbW92ZShjdXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgICAgaWYgKGVsLnRleHRDb250ZW50ICE9PSB2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgY29udGVudCBtaXNtYXRjaCBpbiA8JHt2bm9kZS50eXBlfT46XG4tIFNlcnZlciByZW5kZXJlZDogJHtlbC50ZXh0Q29udGVudH1cbi0gQ2xpZW50IHJlbmRlcmVkOiAke3Zub2RlLmNoaWxkcmVufWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsLm5leHRTaWJsaW5nO1xuICB9O1xuICBjb25zdCBoeWRyYXRlQ2hpbGRyZW4gPSAobm9kZSwgcGFyZW50Vk5vZGUsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBvcHRpbWl6ZWQgPSBvcHRpbWl6ZWQgfHwgISFwYXJlbnRWTm9kZS5keW5hbWljQ2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnRWTm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBsID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3Qgdm5vZGUgPSBvcHRpbWl6ZWQgPyBjaGlsZHJlbltpXSA6IGNoaWxkcmVuW2ldID0gbm9ybWFsaXplVk5vZGUoY2hpbGRyZW5baV0pO1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgbm9kZSA9IGh5ZHJhdGVOb2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gVGV4dCAmJiAhdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFoYXNXYXJuZWQpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBpbiA8JHtjb250YWluZXIudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT46IHNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIGZld2VyIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWR0NvbnRhaW5lcihjb250YWluZXIpLFxuICAgICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUZyYWdtZW50ID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IHsgc2xvdFNjb3BlSWRzOiBmcmFnbWVudFNsb3RTY29wZUlkcyB9ID0gdm5vZGU7XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgIGNvbnN0IG5leHQgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICBuZXh0U2libGluZyhub2RlKSxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBvcHRpbWl6ZWRcbiAgICApO1xuICAgIGlmIChuZXh0ICYmIGlzQ29tbWVudChuZXh0KSAmJiBuZXh0LmRhdGEgPT09IFwiXVwiKSB7XG4gICAgICByZXR1cm4gbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yID0gbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAgIGluc2VydCh2bm9kZS5hbmNob3IgPSBjcmVhdGVDb21tZW50KGBdYCksIGNvbnRhaW5lciwgbmV4dCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZU1pc21hdGNoID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIGlzRnJhZ21lbnQpID0+IHtcbiAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgYEh5ZHJhdGlvbiBub2RlIG1pc21hdGNoOlxuLSBDbGllbnQgdm5vZGU6YCxcbiAgICAgIHZub2RlLnR5cGUsXG4gICAgICBgXG4tIFNlcnZlciByZW5kZXJlZCBET006YCxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlLm5vZGVUeXBlID09PSAzIC8qIFRFWFQgKi8gPyBgKHRleHQpYCA6IGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiID8gYChzdGFydCBvZiBmcmFnbWVudClgIDogYGBcbiAgICApO1xuICAgIHZub2RlLmVsID0gbnVsbDtcbiAgICBpZiAoaXNGcmFnbWVudCkge1xuICAgICAgY29uc3QgZW5kID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlKTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5leHQyID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGlmIChuZXh0MiAmJiBuZXh0MiAhPT0gZW5kKSB7XG4gICAgICAgICAgcmVtb3ZlKG5leHQyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICByZW1vdmUobm9kZSk7XG4gICAgcGF0Y2goXG4gICAgICBudWxsLFxuICAgICAgdm5vZGUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBuZXh0LFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBpc1NWR0NvbnRhaW5lcihjb250YWluZXIpLFxuICAgICAgc2xvdFNjb3BlSWRzXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfTtcbiAgY29uc3QgbG9jYXRlQ2xvc2luZ0FuY2hvciA9IChub2RlLCBvcGVuID0gXCJbXCIsIGNsb3NlID0gXCJdXCIpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSAwO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICBpZiAobm9kZSAmJiBpc0NvbW1lbnQobm9kZSkpIHtcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gb3BlbilcbiAgICAgICAgICBtYXRjaCsrO1xuICAgICAgICBpZiAobm9kZS5kYXRhID09PSBjbG9zZSkge1xuICAgICAgICAgIGlmIChtYXRjaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXRjaC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbiAgfTtcbiAgY29uc3QgcmVwbGFjZU5vZGUgPSAobmV3Tm9kZSwgb2xkTm9kZSwgcGFyZW50Q29tcG9uZW50KSA9PiB7XG4gICAgY29uc3QgcGFyZW50Tm9kZTIgPSBvbGROb2RlLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUyKSB7XG4gICAgICBwYXJlbnROb2RlMi5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgb2xkTm9kZSk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQgPSBwYXJlbnRDb21wb25lbnQ7XG4gICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudC52bm9kZS5lbCA9PT0gb2xkTm9kZSkge1xuICAgICAgICBwYXJlbnQudm5vZGUuZWwgPSBwYXJlbnQuc3ViVHJlZS5lbCA9IG5ld05vZGU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNUZW1wbGF0ZU5vZGUgPSAobm9kZSkgPT4ge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxIC8qIEVMRU1FTlQgKi8gJiYgbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidGVtcGxhdGVcIjtcbiAgfTtcbiAgcmV0dXJuIFtoeWRyYXRlLCBoeWRyYXRlTm9kZV07XG59XG5cbmxldCBzdXBwb3J0ZWQ7XG5sZXQgcGVyZjtcbmZ1bmN0aW9uIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgdHlwZSkge1xuICBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UgJiYgaXNTdXBwb3J0ZWQoKSkge1xuICAgIHBlcmYubWFyayhgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YCk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNQZXJmU3RhcnQoaW5zdGFuY2UsIHR5cGUsIGlzU3VwcG9ydGVkKCkgPyBwZXJmLm5vdygpIDogRGF0ZS5ub3coKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuZE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgaWYgKGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlICYmIGlzU3VwcG9ydGVkKCkpIHtcbiAgICBjb25zdCBzdGFydFRhZyA9IGB2dWUtJHt0eXBlfS0ke2luc3RhbmNlLnVpZH1gO1xuICAgIGNvbnN0IGVuZFRhZyA9IHN0YXJ0VGFnICsgYDplbmRgO1xuICAgIHBlcmYubWFyayhlbmRUYWcpO1xuICAgIHBlcmYubWVhc3VyZShcbiAgICAgIGA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCBpbnN0YW5jZS50eXBlKX0+ICR7dHlwZX1gLFxuICAgICAgc3RhcnRUYWcsXG4gICAgICBlbmRUYWdcbiAgICApO1xuICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7XG4gICAgcGVyZi5jbGVhck1hcmtzKGVuZFRhZyk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNQZXJmRW5kKGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICB9XG59XG5mdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgaWYgKHN1cHBvcnRlZCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRlZDtcbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgIHBlcmYgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIH0gZWxzZSB7XG4gICAgc3VwcG9ydGVkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHN1cHBvcnRlZDtcbn1cblxuZnVuY3Rpb24gaW5pdEZlYXR1cmVGbGFncygpIHtcbiAgY29uc3QgbmVlZFdhcm4gPSBbXTtcbiAgaWYgKHR5cGVvZiBfX1ZVRV9PUFRJT05TX0FQSV9fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfT1BUSU9OU19BUElfX2ApO1xuICAgIGdldEdsb2JhbFRoaXMoKS5fX1ZVRV9PUFRJT05TX0FQSV9fID0gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIF9fVlVFX1BST0RfREVWVE9PTFNfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX1BST0RfREVWVE9PTFNfX2ApO1xuICAgIGdldEdsb2JhbFRoaXMoKS5fX1ZVRV9QUk9EX0RFVlRPT0xTX18gPSBmYWxzZTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5sZW5ndGgpIHtcbiAgICBjb25zdCBtdWx0aSA9IG5lZWRXYXJuLmxlbmd0aCA+IDE7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYEZlYXR1cmUgZmxhZyR7bXVsdGkgPyBgc2AgOiBgYH0gJHtuZWVkV2Fybi5qb2luKFwiLCBcIil9ICR7bXVsdGkgPyBgYXJlYCA6IGBpc2B9IG5vdCBleHBsaWNpdGx5IGRlZmluZWQuIFlvdSBhcmUgcnVubmluZyB0aGUgZXNtLWJ1bmRsZXIgYnVpbGQgb2YgVnVlLCB3aGljaCBleHBlY3RzIHRoZXNlIGNvbXBpbGUtdGltZSBmZWF0dXJlIGZsYWdzIHRvIGJlIGdsb2JhbGx5IGluamVjdGVkIHZpYSB0aGUgYnVuZGxlciBjb25maWcgaW4gb3JkZXIgdG8gZ2V0IGJldHRlciB0cmVlLXNoYWtpbmcgaW4gdGhlIHByb2R1Y3Rpb24gYnVuZGxlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9saW5rLnZ1ZWpzLm9yZy9mZWF0dXJlLWZsYWdzLmBcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IHF1ZXVlUG9zdFJlbmRlckVmZmVjdCA9IHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlIDtcbmZ1bmN0aW9uIGNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GdW5jdGlvbnMpO1xufVxuZnVuY3Rpb24gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMsIGNyZWF0ZUh5ZHJhdGlvbkZucykge1xuICB7XG4gICAgaW5pdEZlYXR1cmVGbGFncygpO1xuICB9XG4gIGNvbnN0IHRhcmdldCA9IGdldEdsb2JhbFRoaXMoKTtcbiAgdGFyZ2V0Ll9fVlVFX18gPSB0cnVlO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBzZXREZXZ0b29sc0hvb2sodGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sIHRhcmdldCk7XG4gIH1cbiAgY29uc3Qge1xuICAgIGluc2VydDogaG9zdEluc2VydCxcbiAgICByZW1vdmU6IGhvc3RSZW1vdmUsXG4gICAgcGF0Y2hQcm9wOiBob3N0UGF0Y2hQcm9wLFxuICAgIGNyZWF0ZUVsZW1lbnQ6IGhvc3RDcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZVRleHQ6IGhvc3RDcmVhdGVUZXh0LFxuICAgIGNyZWF0ZUNvbW1lbnQ6IGhvc3RDcmVhdGVDb21tZW50LFxuICAgIHNldFRleHQ6IGhvc3RTZXRUZXh0LFxuICAgIHNldEVsZW1lbnRUZXh0OiBob3N0U2V0RWxlbWVudFRleHQsXG4gICAgcGFyZW50Tm9kZTogaG9zdFBhcmVudE5vZGUsXG4gICAgbmV4dFNpYmxpbmc6IGhvc3ROZXh0U2libGluZyxcbiAgICBzZXRTY29wZUlkOiBob3N0U2V0U2NvcGVJZCA9IE5PT1AsXG4gICAgaW5zZXJ0U3RhdGljQ29udGVudDogaG9zdEluc2VydFN0YXRpY0NvbnRlbnRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBhdGNoID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IgPSBudWxsLCBwYXJlbnRDb21wb25lbnQgPSBudWxsLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwsIGlzU1ZHID0gZmFsc2UsIHNsb3RTY29wZUlkcyA9IG51bGwsIG9wdGltaXplZCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZyA/IGZhbHNlIDogISFuMi5keW5hbWljQ2hpbGRyZW4pID0+IHtcbiAgICBpZiAobjEgPT09IG4yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuMSAmJiAhaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgIGFuY2hvciA9IGdldE5leHRIb3N0Tm9kZShuMSk7XG4gICAgICB1bm1vdW50KG4xLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgIG4xID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG4yLnBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgbjIuZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyB0eXBlLCByZWYsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRleHQ6XG4gICAgICAgIHByb2Nlc3NUZXh0KG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tbWVudDpcbiAgICAgICAgcHJvY2Vzc0NvbW1lbnROb2RlKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgICAgIG1vdW50U3RhdGljTm9kZShuMiwgY29udGFpbmVyLCBhbmNob3IsIGlzU1ZHKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcGF0Y2hTdGF0aWNOb2RlKG4xLCBuMiwgY29udGFpbmVyLCBpc1NWRyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgICBwcm9jZXNzRnJhZ21lbnQoXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxKSB7XG4gICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHByb2Nlc3NDb21wb25lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgICB0eXBlLnByb2Nlc3MoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIGludGVybmFsc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICBpbnRlcm5hbHNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFwiSW52YWxpZCBWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCAmJiBwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIHNldFJlZihyZWYsIG4xICYmIG4xLnJlZiwgcGFyZW50U3VzcGVuc2UsIG4yIHx8IG4xLCAhbjIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc1RleHQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcikgPT4ge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KFxuICAgICAgICBuMi5lbCA9IGhvc3RDcmVhdGVUZXh0KG4yLmNoaWxkcmVuKSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICAgIGlmIChuMi5jaGlsZHJlbiAhPT0gbjEuY2hpbGRyZW4pIHtcbiAgICAgICAgaG9zdFNldFRleHQoZWwsIG4yLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NDb21tZW50Tm9kZSA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKSA9PiB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoXG4gICAgICAgIG4yLmVsID0gaG9zdENyZWF0ZUNvbW1lbnQobjIuY2hpbGRyZW4gfHwgXCJcIiksXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRTdGF0aWNOb2RlID0gKG4yLCBjb250YWluZXIsIGFuY2hvciwgaXNTVkcpID0+IHtcbiAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgaXNTVkcsXG4gICAgICBuMi5lbCxcbiAgICAgIG4yLmFuY2hvclxuICAgICk7XG4gIH07XG4gIGNvbnN0IHBhdGNoU3RhdGljTm9kZSA9IChuMSwgbjIsIGNvbnRhaW5lciwgaXNTVkcpID0+IHtcbiAgICBpZiAobjIuY2hpbGRyZW4gIT09IG4xLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBhbmNob3IgPSBob3N0TmV4dFNpYmxpbmcobjEuYW5jaG9yKTtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUobjEpO1xuICAgICAgW24yLmVsLCBuMi5hbmNob3JdID0gaG9zdEluc2VydFN0YXRpY0NvbnRlbnQoXG4gICAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgaXNTVkdcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlU3RhdGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSwgY29udGFpbmVyLCBuZXh0U2libGluZykgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gYW5jaG9yKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGVsKTtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICAgICAgZWwgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0pID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShhbmNob3IpO1xuICB9O1xuICBjb25zdCBwcm9jZXNzRWxlbWVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBpc1NWRyA9IGlzU1ZHIHx8IG4yLnR5cGUgPT09IFwic3ZnXCI7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50RWxlbWVudChcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoRWxlbWVudChcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudEVsZW1lbnQgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgZWw7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBjb25zdCB7IHR5cGUsIHByb3BzLCBzaGFwZUZsYWcsIHRyYW5zaXRpb24sIGRpcnMgfSA9IHZub2RlO1xuICAgIGVsID0gdm5vZGUuZWwgPSBob3N0Q3JlYXRlRWxlbWVudChcbiAgICAgIHZub2RlLnR5cGUsXG4gICAgICBpc1NWRyxcbiAgICAgIHByb3BzICYmIHByb3BzLmlzLFxuICAgICAgcHJvcHNcbiAgICApO1xuICAgIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICBob3N0U2V0RWxlbWVudFRleHQoZWwsIHZub2RlLmNoaWxkcmVuKTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHICYmIHR5cGUgIT09IFwiZm9yZWlnbk9iamVjdFwiLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJjcmVhdGVkXCIpO1xuICAgIH1cbiAgICBzZXRTY29wZUlkKGVsLCB2bm9kZSwgdm5vZGUuc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpO1xuICAgIGlmIChwcm9wcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gXCJ2YWx1ZVwiICYmICFpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzW2tleV0sXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIHByb3BzKSB7XG4gICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwidmFsdWVcIiwgbnVsbCwgcHJvcHMudmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlSG9vayA9IHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsIFwiX192bm9kZVwiLCB7XG4gICAgICAgIHZhbHVlOiB2bm9kZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCBcIl9fdnVlUGFyZW50Q29tcG9uZW50XCIsIHtcbiAgICAgICAgdmFsdWU6IHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZU1vdW50XCIpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKTtcbiAgICBpZiAobmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyAmJiB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldFNjb3BlSWQgPSAoZWwsIHZub2RlLCBzY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGlmIChzY29wZUlkKSB7XG4gICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2NvcGVJZCk7XG4gICAgfVxuICAgIGlmIChzbG90U2NvcGVJZHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdFNjb3BlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhvc3RTZXRTY29wZUlkKGVsLCBzbG90U2NvcGVJZHNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBsZXQgc3ViVHJlZSA9IHBhcmVudENvbXBvbmVudC5zdWJUcmVlO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc3ViVHJlZS5wYXRjaEZsYWcgPiAwICYmIHN1YlRyZWUucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgICAgICBzdWJUcmVlID0gZmlsdGVyU2luZ2xlUm9vdChzdWJUcmVlLmNoaWxkcmVuKSB8fCBzdWJUcmVlO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlID09PSBzdWJUcmVlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFZOb2RlID0gcGFyZW50Q29tcG9uZW50LnZub2RlO1xuICAgICAgICBzZXRTY29wZUlkKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudFZOb2RlLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNjb3BlSWQsXG4gICAgICAgICAgcGFyZW50Vk5vZGUuc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHN0YXJ0ID0gMCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoY2hpbGRyZW5baV0pIDogbm9ybWFsaXplVk5vZGUoY2hpbGRyZW5baV0pO1xuICAgICAgcGF0Y2goXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNoaWxkLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hFbGVtZW50ID0gKG4xLCBuMiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBkaXJzIH0gPSBuMjtcbiAgICBwYXRjaEZsYWcgfD0gbjEucGF0Y2hGbGFnICYgMTY7XG4gICAgY29uc3Qgb2xkUHJvcHMgPSBuMS5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgY29uc3QgbmV3UHJvcHMgPSBuMi5wcm9wcyB8fCBFTVBUWV9PQko7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIGZhbHNlKTtcbiAgICBpZiAodm5vZGVIb29rID0gbmV3UHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayhuMiwgbjEsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVcGRhdGVcIik7XG4gICAgfVxuICAgIHBhcmVudENvbXBvbmVudCAmJiB0b2dnbGVSZWN1cnNlKHBhcmVudENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYXJlQ2hpbGRyZW5TVkcgPSBpc1NWRyAmJiBuMi50eXBlICE9PSBcImZvcmVpZ25PYmplY3RcIjtcbiAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICBlbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgYXJlQ2hpbGRyZW5TVkcsXG4gICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGFyZUNoaWxkcmVuU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocGF0Y2hGbGFnID4gMCkge1xuICAgICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICAgIHBhdGNoUHJvcHMoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgb2xkUHJvcHMsXG4gICAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGF0Y2hGbGFnICYgMikge1xuICAgICAgICAgIGlmIChvbGRQcm9wcy5jbGFzcyAhPT0gbmV3UHJvcHMuY2xhc3MpIHtcbiAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwiY2xhc3NcIiwgbnVsbCwgbmV3UHJvcHMuY2xhc3MsIGlzU1ZHKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDQpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInN0eWxlXCIsIG9sZFByb3BzLnN0eWxlLCBuZXdQcm9wcy5zdHlsZSwgaXNTVkcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IG4yLmR5bmFtaWNQcm9wcztcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICAgICAgaWYgKG5leHQgIT09IHByZXYgfHwga2V5ID09PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgcHJldixcbiAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgICAgIG4xLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW5cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxKSB7XG4gICAgICAgIGlmIChuMS5jaGlsZHJlbiAhPT0gbjIuY2hpbGRyZW4pIHtcbiAgICAgICAgICBob3N0U2V0RWxlbWVudFRleHQoZWwsIG4yLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIW9wdGltaXplZCAmJiBkeW5hbWljQ2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgcGF0Y2hQcm9wcyhcbiAgICAgICAgZWwsXG4gICAgICAgIG4yLFxuICAgICAgICBvbGRQcm9wcyxcbiAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoKHZub2RlSG9vayA9IG5ld1Byb3BzLm9uVm5vZGVVcGRhdGVkKSB8fCBkaXJzKSB7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICB2bm9kZUhvb2sgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgICAgICBkaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sobjIsIG4xLCBwYXJlbnRDb21wb25lbnQsIFwidXBkYXRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoQmxvY2tDaGlsZHJlbiA9IChvbGRDaGlsZHJlbiwgbmV3Q2hpbGRyZW4sIGZhbGxiYWNrQ29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcbiAgICAgIGNvbnN0IG5ld1ZOb2RlID0gbmV3Q2hpbGRyZW5baV07XG4gICAgICBjb25zdCBjb250YWluZXIgPSAoXG4gICAgICAgIC8vIG9sZFZOb2RlIG1heSBiZSBhbiBlcnJvcmVkIGFzeW5jIHNldHVwKCkgY29tcG9uZW50IGluc2lkZSBTdXNwZW5zZVxuICAgICAgICAvLyB3aGljaCB3aWxsIG5vdCBoYXZlIGEgbW91bnRlZCBlbGVtZW50XG4gICAgICAgIG9sZFZOb2RlLmVsICYmIC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSBGcmFnbWVudCwgd2UgbmVlZCB0byBwcm92aWRlIHRoZSBhY3R1YWwgcGFyZW50XG4gICAgICAgIC8vIG9mIHRoZSBGcmFnbWVudCBpdHNlbGYgc28gaXQgY2FuIG1vdmUgaXRzIGNoaWxkcmVuLlxuICAgICAgICAob2xkVk5vZGUudHlwZSA9PT0gRnJhZ21lbnQgfHwgLy8gLSBJbiB0aGUgY2FzZSBvZiBkaWZmZXJlbnQgbm9kZXMsIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gd2hpY2ggYWxzbyByZXF1aXJlcyB0aGUgY29ycmVjdCBwYXJlbnQgY29udGFpbmVyXG4gICAgICAgICFpc1NhbWVWTm9kZVR5cGUob2xkVk5vZGUsIG5ld1ZOb2RlKSB8fCAvLyAtIEluIHRoZSBjYXNlIG9mIGEgY29tcG9uZW50LCBpdCBjb3VsZCBjb250YWluIGFueXRoaW5nLlxuICAgICAgICBvbGRWTm9kZS5zaGFwZUZsYWcgJiAoNiB8IDY0KSkgPyBob3N0UGFyZW50Tm9kZShvbGRWTm9kZS5lbCkgOiAoXG4gICAgICAgICAgLy8gSW4gb3RoZXIgY2FzZXMsIHRoZSBwYXJlbnQgY29udGFpbmVyIGlzIG5vdCBhY3R1YWxseSB1c2VkIHNvIHdlXG4gICAgICAgICAgLy8ganVzdCBwYXNzIHRoZSBibG9jayBlbGVtZW50IGhlcmUgdG8gYXZvaWQgYSBET00gcGFyZW50Tm9kZSBjYWxsLlxuICAgICAgICAgIGZhbGxiYWNrQ29udGFpbmVyXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwYXRjaChcbiAgICAgICAgb2xkVk5vZGUsXG4gICAgICAgIG5ld1ZOb2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFByb3BzID0gKGVsLCB2bm9kZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRykgPT4ge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMpIHtcbiAgICAgIGlmIChvbGRQcm9wcyAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9sZFByb3BzKSB7XG4gICAgICAgICAgaWYgKCFpc1Jlc2VydmVkUHJvcChrZXkpICYmICEoa2V5IGluIG5ld1Byb3BzKSkge1xuICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgb2xkUHJvcHNba2V5XSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdQcm9wcykge1xuICAgICAgICBpZiAoaXNSZXNlcnZlZFByb3Aoa2V5KSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICBpZiAobmV4dCAhPT0gcHJldiAmJiBrZXkgIT09IFwidmFsdWVcIikge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHByZXYsXG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBuZXdQcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG9sZFByb3BzLnZhbHVlLCBuZXdQcm9wcy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzRnJhZ21lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgZnJhZ21lbnRTdGFydEFuY2hvciA9IG4yLmVsID0gbjEgPyBuMS5lbCA6IGhvc3RDcmVhdGVUZXh0KFwiXCIpO1xuICAgIGNvbnN0IGZyYWdtZW50RW5kQW5jaG9yID0gbjIuYW5jaG9yID0gbjEgPyBuMS5hbmNob3IgOiBob3N0Q3JlYXRlVGV4dChcIlwiKTtcbiAgICBsZXQgeyBwYXRjaEZsYWcsIGR5bmFtaWNDaGlsZHJlbiwgc2xvdFNjb3BlSWRzOiBmcmFnbWVudFNsb3RTY29wZUlkcyB9ID0gbjI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgLy8gIzU1MjMgZGV2IHJvb3QgZnJhZ21lbnQgbWF5IGluaGVyaXQgZGlyZWN0aXZlc1xuICAgIChpc0htclVwZGF0aW5nIHx8IHBhdGNoRmxhZyAmIDIwNDgpKSB7XG4gICAgICBwYXRjaEZsYWcgPSAwO1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoZnJhZ21lbnRTbG90U2NvcGVJZHMpIHtcbiAgICAgIHNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcyA/IHNsb3RTY29wZUlkcy5jb25jYXQoZnJhZ21lbnRTbG90U2NvcGVJZHMpIDogZnJhZ21lbnRTbG90U2NvcGVJZHM7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KGZyYWdtZW50U3RhcnRBbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGhvc3RJbnNlcnQoZnJhZ21lbnRFbmRBbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0ICYmIGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjMjcxNSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgY291bGQndmUgYmVlbiBhIEJBSUxlZCBvbmUgYXMgYSByZXN1bHRcbiAgICAgIC8vIG9mIHJlbmRlclNsb3QoKSB3aXRoIG5vIHZhbGlkIGNoaWxkcmVuXG4gICAgICBuMS5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMik7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gIzIwODAgaWYgdGhlIHN0YWJsZSBmcmFnbWVudCBoYXMgYSBrZXksIGl0J3MgYSA8dGVtcGxhdGUgdi1mb3I+IHRoYXQgbWF5XG4gICAgICAgICAgLy8gIGdldCBtb3ZlZCBhcm91bmQuIE1ha2Ugc3VyZSBhbGwgcm9vdCBsZXZlbCB2bm9kZXMgaW5oZXJpdCBlbC5cbiAgICAgICAgICAvLyAjMjEzNCBvciBpZiBpdCdzIGEgY29tcG9uZW50IHJvb3QsIGl0IG1heSBhbHNvIGdldCBtb3ZlZCBhcm91bmRcbiAgICAgICAgICAvLyBhcyB0aGUgY29tcG9uZW50IGlzIGJlaW5nIG1vdmVkLlxuICAgICAgICAgIG4yLmtleSAhPSBudWxsIHx8IHBhcmVudENvbXBvbmVudCAmJiBuMiA9PT0gcGFyZW50Q29tcG9uZW50LnN1YlRyZWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAvKiBzaGFsbG93ICovXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2hDaGlsZHJlbihcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NDb21wb25lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbjIuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBpZiAobjIuc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC5jdHguYWN0aXZhdGUoXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdW50Q29tcG9uZW50KFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVDb21wb25lbnQobjEsIG4yLCBvcHRpbWl6ZWQpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRDb21wb25lbnQgPSAoaW5pdGlhbFZOb2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGluaXRpYWxWTm9kZS5jb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgKSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICByZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoaW5pdGlhbFZOb2RlKTtcbiAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICAgIGlmIChpc0tlZXBBbGl2ZShpbml0aWFsVk5vZGUpKSB7XG4gICAgICBpbnN0YW5jZS5jdHgucmVuZGVyZXIgPSBpbnRlcm5hbHM7XG4gICAgfVxuICAgIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICAgIHNldHVwQ29tcG9uZW50KGluc3RhbmNlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCkge1xuICAgICAgcGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0KTtcbiAgICAgIGlmICghaW5pdGlhbFZOb2RlLmVsKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gaW5zdGFuY2Uuc3ViVHJlZSA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobnVsbCwgcGxhY2Vob2xkZXIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0dXBSZW5kZXJFZmZlY3QoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGFuY2hvcixcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgaXNTVkcsXG4gICAgICBvcHRpbWl6ZWRcbiAgICApO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICB9O1xuICBjb25zdCB1cGRhdGVDb21wb25lbnQgPSAobjEsIG4yLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG4yLmNvbXBvbmVudCA9IG4xLmNvbXBvbmVudDtcbiAgICBpZiAoc2hvdWxkVXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKSkge1xuICAgICAgaWYgKGluc3RhbmNlLmFzeW5jRGVwICYmICFpbnN0YW5jZS5hc3luY1Jlc29sdmVkKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KG4yKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIoaW5zdGFuY2UsIG4yLCBvcHRpbWl6ZWQpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2UubmV4dCA9IG4yO1xuICAgICAgICBpbnZhbGlkYXRlSm9iKGluc3RhbmNlLnVwZGF0ZSk7XG4gICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgaW5zdGFuY2Uudm5vZGUgPSBuMjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldHVwUmVuZGVyRWZmZWN0ID0gKGluc3RhbmNlLCBpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFVwZGF0ZUZuID0gKCkgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZS5pc01vdW50ZWQpIHtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgY29uc3QgeyBlbCwgcHJvcHMgfSA9IGluaXRpYWxWTm9kZTtcbiAgICAgICAgY29uc3QgeyBibSwgbSwgcGFyZW50IH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgaXNBc3luY1dyYXBwZXJWTm9kZSA9IGlzQXN5bmNXcmFwcGVyKGluaXRpYWxWTm9kZSk7XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKGJtKSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYm0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKGVsICYmIGh5ZHJhdGVOb2RlKSB7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZVN1YlRyZWUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYGh5ZHJhdGVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlclZOb2RlKSB7XG4gICAgICAgICAgICBpbml0aWFsVk5vZGUudHlwZS5fX2FzeW5jTG9hZGVyKCkudGhlbihcbiAgICAgICAgICAgICAgLy8gbm90ZTogd2UgYXJlIG1vdmluZyB0aGUgcmVuZGVyIGNhbGwgaW50byBhbiBhc3luYyBjYWxsYmFjayxcbiAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQgd29uJ3QgdHJhY2sgZGVwZW5kZW5jaWVzIC0gYnV0IGl0J3Mgb2sgYmVjYXVzZVxuICAgICAgICAgICAgICAvLyBhIHNlcnZlci1yZW5kZXJlZCBhc3luYyB3cmFwcGVyIGlzIGFscmVhZHkgaW4gcmVzb2x2ZWQgc3RhdGVcbiAgICAgICAgICAgICAgLy8gYW5kIGl0IHdpbGwgbmV2ZXIgbmVlZCB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICgpID0+ICFpbnN0YW5jZS5pc1VubW91bnRlZCAmJiBoeWRyYXRlU3ViVHJlZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoeWRyYXRlU3ViVHJlZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN1YlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHN1YlRyZWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5pdGlhbFZOb2RlLmVsID0gc3ViVHJlZS5lbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobSkge1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChtLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FzeW5jV3JhcHBlclZOb2RlICYmICh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkpIHtcbiAgICAgICAgICBjb25zdCBzY29wZWRJbml0aWFsVk5vZGUgPSBpbml0aWFsVk5vZGU7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBzY29wZWRJbml0aWFsVk5vZGUpLFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbml0aWFsVk5vZGUuc2hhcGVGbGFnICYgMjU2IHx8IHBhcmVudCAmJiBpc0FzeW5jV3JhcHBlcihwYXJlbnQudm5vZGUpICYmIHBhcmVudC52bm9kZS5zaGFwZUZsYWcgJiAyNTYpIHtcbiAgICAgICAgICBpbnN0YW5jZS5hICYmIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChpbnN0YW5jZS5hLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UuaXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbFZOb2RlID0gY29udGFpbmVyID0gYW5jaG9yID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB7IG5leHQsIGJ1LCB1LCBwYXJlbnQsIHZub2RlIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgbGV0IG9yaWdpbk5leHQgPSBuZXh0O1xuICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuZXh0IHx8IGluc3RhbmNlLnZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbmV4dCwgb3B0aW1pemVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1KSB7XG4gICAgICAgICAgaW52b2tlQXJyYXlGbnMoYnUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZUJlZm9yZVVwZGF0ZSkge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IG5leHRUcmVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgcHJldlRyZWUsXG4gICAgICAgICAgbmV4dFRyZWUsXG4gICAgICAgICAgLy8gcGFyZW50IG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIHRlbGVwb3J0XG4gICAgICAgICAgaG9zdFBhcmVudE5vZGUocHJldlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSBmcmFnbWVudFxuICAgICAgICAgIGdldE5leHRIb3N0Tm9kZShwcmV2VHJlZSksXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0LmVsID0gbmV4dFRyZWUuZWw7XG4gICAgICAgIGlmIChvcmlnaW5OZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSE9DSG9zdEVsKGluc3RhbmNlLCBuZXh0VHJlZS5lbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHUpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QodSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZVVwZGF0ZWQpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIG5leHQsIHZub2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZWZmZWN0ID0gaW5zdGFuY2UuZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KFxuICAgICAgY29tcG9uZW50VXBkYXRlRm4sXG4gICAgICAoKSA9PiBxdWV1ZUpvYih1cGRhdGUpLFxuICAgICAgaW5zdGFuY2Uuc2NvcGVcbiAgICAgIC8vIHRyYWNrIGl0IGluIGNvbXBvbmVudCdzIGVmZmVjdCBzY29wZVxuICAgICk7XG4gICAgY29uc3QgdXBkYXRlID0gaW5zdGFuY2UudXBkYXRlID0gKCkgPT4gZWZmZWN0LnJ1bigpO1xuICAgIHVwZGF0ZS5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZWZmZWN0Lm9uVHJhY2sgPSBpbnN0YW5jZS5ydGMgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRjLCBlKSA6IHZvaWQgMDtcbiAgICAgIGVmZmVjdC5vblRyaWdnZXIgPSBpbnN0YW5jZS5ydGcgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRnLCBlKSA6IHZvaWQgMDtcbiAgICAgIHVwZGF0ZS5vd25lckluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIHVwZGF0ZSgpO1xuICB9O1xuICBjb25zdCB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIgPSAoaW5zdGFuY2UsIG5leHRWTm9kZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgbmV4dFZOb2RlLmNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIGNvbnN0IHByZXZQcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzO1xuICAgIGluc3RhbmNlLnZub2RlID0gbmV4dFZOb2RlO1xuICAgIGluc3RhbmNlLm5leHQgPSBudWxsO1xuICAgIHVwZGF0ZVByb3BzKGluc3RhbmNlLCBuZXh0Vk5vZGUucHJvcHMsIHByZXZQcm9wcywgb3B0aW1pemVkKTtcbiAgICB1cGRhdGVTbG90cyhpbnN0YW5jZSwgbmV4dFZOb2RlLmNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBmbHVzaFByZUZsdXNoQ2JzKCk7XG4gICAgcmVzZXRUcmFja2luZygpO1xuICB9O1xuICBjb25zdCBwYXRjaENoaWxkcmVuID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgYzEgPSBuMSAmJiBuMS5jaGlsZHJlbjtcbiAgICBjb25zdCBwcmV2U2hhcGVGbGFnID0gbjEgPyBuMS5zaGFwZUZsYWcgOiAwO1xuICAgIGNvbnN0IGMyID0gbjIuY2hpbGRyZW47XG4gICAgY29uc3QgeyBwYXRjaEZsYWcsIHNoYXBlRmxhZyB9ID0gbjI7XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxMjgpIHtcbiAgICAgICAgcGF0Y2hLZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiAyNTYpIHtcbiAgICAgICAgcGF0Y2hVbmtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgYzEsXG4gICAgICAgICAgYzIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBpZiAoYzIgIT09IGMxKSB7XG4gICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIGMyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiAxNikge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBwYXRjaEtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgICBjMSxcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5tb3VudENoaWxkcmVuKGMxLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGNvbnRhaW5lciwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoVW5rZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGMxID0gYzEgfHwgRU1QVFlfQVJSO1xuICAgIGMyID0gYzIgfHwgRU1QVFlfQVJSO1xuICAgIGNvbnN0IG9sZExlbmd0aCA9IGMxLmxlbmd0aDtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBjMi5sZW5ndGg7XG4gICAgY29uc3QgY29tbW9uTGVuZ3RoID0gTWF0aC5taW4ob2xkTGVuZ3RoLCBuZXdMZW5ndGgpO1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb21tb25MZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgYzFbaV0sXG4gICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvbGRMZW5ndGggPiBuZXdMZW5ndGgpIHtcbiAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgYzEsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjb21tb25MZW5ndGhcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMyLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICBjb21tb25MZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEtleWVkQ2hpbGRyZW4gPSAoYzEsIGMyLCBjb250YWluZXIsIHBhcmVudEFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IGwyID0gYzIubGVuZ3RoO1xuICAgIGxldCBlMSA9IGMxLmxlbmd0aCAtIDE7XG4gICAgbGV0IGUyID0gbDIgLSAxO1xuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbaV07XG4gICAgICBjb25zdCBuMiA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgd2hpbGUgKGkgPD0gZTEgJiYgaSA8PSBlMikge1xuICAgICAgY29uc3QgbjEgPSBjMVtlMV07XG4gICAgICBjb25zdCBuMiA9IGMyW2UyXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2UyXSkgOiBub3JtYWxpemVWTm9kZShjMltlMl0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGUxLS07XG4gICAgICBlMi0tO1xuICAgIH1cbiAgICBpZiAoaSA+IGUxKSB7XG4gICAgICBpZiAoaSA8PSBlMikge1xuICAgICAgICBjb25zdCBuZXh0UG9zID0gZTIgKyAxO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0UG9zIDwgbDIgPyBjMltuZXh0UG9zXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgd2hpbGUgKGkgPD0gZTIpIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaSA+IGUyKSB7XG4gICAgICB3aGlsZSAoaSA8PSBlMSkge1xuICAgICAgICB1bm1vdW50KGMxW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzMSA9IGk7XG4gICAgICBjb25zdCBzMiA9IGk7XG4gICAgICBjb25zdCBrZXlUb05ld0luZGV4TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGZvciAoaSA9IHMyOyBpIDw9IGUyOyBpKyspIHtcbiAgICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICAgIGlmIChuZXh0Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXlUb05ld0luZGV4TWFwLmhhcyhuZXh0Q2hpbGQua2V5KSkge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgYER1cGxpY2F0ZSBrZXlzIGZvdW5kIGR1cmluZyB1cGRhdGU6YCxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmV4dENoaWxkLmtleSksXG4gICAgICAgICAgICAgIGBNYWtlIHN1cmUga2V5cyBhcmUgdW5pcXVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleVRvTmV3SW5kZXhNYXAuc2V0KG5leHRDaGlsZC5rZXksIGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgajtcbiAgICAgIGxldCBwYXRjaGVkID0gMDtcbiAgICAgIGNvbnN0IHRvQmVQYXRjaGVkID0gZTIgLSBzMiArIDE7XG4gICAgICBsZXQgbW92ZWQgPSBmYWxzZTtcbiAgICAgIGxldCBtYXhOZXdJbmRleFNvRmFyID0gMDtcbiAgICAgIGNvbnN0IG5ld0luZGV4VG9PbGRJbmRleE1hcCA9IG5ldyBBcnJheSh0b0JlUGF0Y2hlZCk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdG9CZVBhdGNoZWQ7IGkrKylcbiAgICAgICAgbmV3SW5kZXhUb09sZEluZGV4TWFwW2ldID0gMDtcbiAgICAgIGZvciAoaSA9IHMxOyBpIDw9IGUxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJldkNoaWxkID0gYzFbaV07XG4gICAgICAgIGlmIChwYXRjaGVkID49IHRvQmVQYXRjaGVkKSB7XG4gICAgICAgICAgdW5tb3VudChwcmV2Q2hpbGQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdJbmRleDtcbiAgICAgICAgaWYgKHByZXZDaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld0luZGV4ID0ga2V5VG9OZXdJbmRleE1hcC5nZXQocHJldkNoaWxkLmtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChqID0gczI7IGogPD0gZTI7IGorKykge1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtqIC0gczJdID09PSAwICYmIGlzU2FtZVZOb2RlVHlwZShwcmV2Q2hpbGQsIGMyW2pdKSkge1xuICAgICAgICAgICAgICBuZXdJbmRleCA9IGo7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3SW5kZXggPT09IHZvaWQgMCkge1xuICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdJbmRleFRvT2xkSW5kZXhNYXBbbmV3SW5kZXggLSBzMl0gPSBpICsgMTtcbiAgICAgICAgICBpZiAobmV3SW5kZXggPj0gbWF4TmV3SW5kZXhTb0Zhcikge1xuICAgICAgICAgICAgbWF4TmV3SW5kZXhTb0ZhciA9IG5ld0luZGV4O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgcHJldkNoaWxkLFxuICAgICAgICAgICAgYzJbbmV3SW5kZXhdLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoZWQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UgPSBtb3ZlZCA/IGdldFNlcXVlbmNlKG5ld0luZGV4VG9PbGRJbmRleE1hcCkgOiBFTVBUWV9BUlI7XG4gICAgICBqID0gaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UubGVuZ3RoIC0gMTtcbiAgICAgIGZvciAoaSA9IHRvQmVQYXRjaGVkIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gczIgKyBpO1xuICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltuZXh0SW5kZXhdO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0SW5kZXggKyAxIDwgbDIgPyBjMltuZXh0SW5kZXggKyAxXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9PT0gMCkge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdmVkKSB7XG4gICAgICAgICAgaWYgKGogPCAwIHx8IGkgIT09IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlW2pdKSB7XG4gICAgICAgICAgICBtb3ZlKG5leHRDaGlsZCwgY29udGFpbmVyLCBhbmNob3IsIDIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUsIHBhcmVudFN1c3BlbnNlID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHsgZWwsIHR5cGUsIHRyYW5zaXRpb24sIGNoaWxkcmVuLCBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICBtb3ZlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICB2bm9kZS5zdXNwZW5zZS5tb3ZlKGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZS5tb3ZlKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgaW50ZXJuYWxzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoY2hpbGRyZW5baV0sIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICB9XG4gICAgICBob3N0SW5zZXJ0KHZub2RlLmFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gU3RhdGljKSB7XG4gICAgICBtb3ZlU3RhdGljTm9kZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZWVkVHJhbnNpdGlvbjIgPSBtb3ZlVHlwZSAhPT0gMiAmJiBzaGFwZUZsYWcgJiAxICYmIHRyYW5zaXRpb247XG4gICAgaWYgKG5lZWRUcmFuc2l0aW9uMikge1xuICAgICAgaWYgKG1vdmVUeXBlID09PSAwKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB0cmFuc2l0aW9uLmVudGVyKGVsKSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsZWF2ZSwgZGVsYXlMZWF2ZSwgYWZ0ZXJMZWF2ZSB9ID0gdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgcmVtb3ZlMiA9ICgpID0+IGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgY29uc3QgcGVyZm9ybUxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgIGxlYXZlKGVsLCAoKSA9PiB7XG4gICAgICAgICAgICByZW1vdmUyKCk7XG4gICAgICAgICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICAgICAgICBkZWxheUxlYXZlKGVsLCByZW1vdmUyLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnQgPSAodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgcmVmLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkaXJzXG4gICAgfSA9IHZub2RlO1xuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlLCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDI1Nikge1xuICAgICAgcGFyZW50Q29tcG9uZW50LmN0eC5kZWFjdGl2YXRlKHZub2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlRGlycyA9IHNoYXBlRmxhZyAmIDEgJiYgZGlycztcbiAgICBjb25zdCBzaG91bGRJbnZva2VWbm9kZUhvb2sgPSAhaXNBc3luY1dyYXBwZXIodm5vZGUpO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgaWYgKHNob3VsZEludm9rZVZub2RlSG9vayAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZVVubW91bnQpKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHVubW91bnRDb21wb25lbnQodm5vZGUuY29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgIHZub2RlLnN1c3BlbnNlLnVubW91bnQocGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVubW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgdm5vZGUudHlwZS5yZW1vdmUoXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY0NoaWxkcmVuICYmIC8vICMxMTUzOiBmYXN0IHBhdGggc2hvdWxkIG5vdCBiZSB0YWtlbiBmb3Igbm9uLXN0YWJsZSAodi1mb3IpIGZyYWdtZW50c1xuICAgICAgKHR5cGUgIT09IEZyYWdtZW50IHx8IHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQpKSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRnJhZ21lbnQgJiYgcGF0Y2hGbGFnICYgKDEyOCB8IDI1NikgfHwgIW9wdGltaXplZCAmJiBzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGRvUmVtb3ZlKSB7XG4gICAgICAgIHJlbW92ZSh2bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVVbm1vdW50ZWQpIHx8IHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgc2hvdWxkSW52b2tlRGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwidW5tb3VudGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlID0gKHZub2RlKSA9PiB7XG4gICAgY29uc3QgeyB0eXBlLCBlbCwgYW5jaG9yLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLnBhdGNoRmxhZyA+IDAgJiYgdm5vZGUucGF0Y2hGbGFnICYgMjA0OCAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSB7XG4gICAgICAgICAgICBob3N0UmVtb3ZlKGNoaWxkLmVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJhZ21lbnQoZWwsIGFuY2hvcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUodm5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZXJmb3JtUmVtb3ZlID0gKCkgPT4ge1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBpZiAodHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQgJiYgdHJhbnNpdGlvbi5hZnRlckxlYXZlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiBsZWF2ZShlbCwgcGVyZm9ybVJlbW92ZSk7XG4gICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICBkZWxheUxlYXZlKHZub2RlLmVsLCBwZXJmb3JtUmVtb3ZlLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVyZm9ybUxlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlcmZvcm1SZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlbW92ZUZyYWdtZW50ID0gKGN1ciwgZW5kKSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGN1ciAhPT0gZW5kKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGN1cik7XG4gICAgICBob3N0UmVtb3ZlKGN1cik7XG4gICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0UmVtb3ZlKGVuZCk7XG4gIH07XG4gIGNvbnN0IHVubW91bnRDb21wb25lbnQgPSAoaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGluc3RhbmNlLnR5cGUuX19obXJJZCkge1xuICAgICAgdW5yZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgYnVtLCBzY29wZSwgdXBkYXRlLCBzdWJUcmVlLCB1bSB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGJ1bSkge1xuICAgICAgaW52b2tlQXJyYXlGbnMoYnVtKTtcbiAgICB9XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIGlmICh1cGRhdGUpIHtcbiAgICAgIHVwZGF0ZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHVubW91bnQoc3ViVHJlZSwgaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgfVxuICAgIGlmICh1bSkge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHVtLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICBpbnN0YW5jZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIGlmIChwYXJlbnRTdXNwZW5zZSAmJiBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFwYXJlbnRTdXNwZW5zZS5pc1VubW91bnRlZCAmJiBpbnN0YW5jZS5hc3luY0RlcCAmJiAhaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCAmJiBpbnN0YW5jZS5zdXNwZW5zZUlkID09PSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQpIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlLmRlcHMtLTtcbiAgICAgIGlmIChwYXJlbnRTdXNwZW5zZS5kZXBzID09PSAwKSB7XG4gICAgICAgIHBhcmVudFN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdW5tb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSwgc3RhcnQgPSAwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHVubW91bnQoY2hpbGRyZW5baV0sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlLCBvcHRpbWl6ZWQpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0TmV4dEhvc3ROb2RlID0gKHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIHJldHVybiBnZXROZXh0SG9zdE5vZGUodm5vZGUuY29tcG9uZW50LnN1YlRyZWUpO1xuICAgIH1cbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICByZXR1cm4gdm5vZGUuc3VzcGVuc2UubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gaG9zdE5leHRTaWJsaW5nKHZub2RlLmFuY2hvciB8fCB2bm9kZS5lbCk7XG4gIH07XG4gIGNvbnN0IHJlbmRlciA9ICh2bm9kZSwgY29udGFpbmVyLCBpc1NWRykgPT4ge1xuICAgIGlmICh2bm9kZSA9PSBudWxsKSB7XG4gICAgICBpZiAoY29udGFpbmVyLl92bm9kZSkge1xuICAgICAgICB1bm1vdW50KGNvbnRhaW5lci5fdm5vZGUsIG51bGwsIG51bGwsIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaChjb250YWluZXIuX3Zub2RlIHx8IG51bGwsIHZub2RlLCBjb250YWluZXIsIG51bGwsIG51bGwsIG51bGwsIGlzU1ZHKTtcbiAgICB9XG4gICAgZmx1c2hQcmVGbHVzaENicygpO1xuICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgY29udGFpbmVyLl92bm9kZSA9IHZub2RlO1xuICB9O1xuICBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgcDogcGF0Y2gsXG4gICAgdW06IHVubW91bnQsXG4gICAgbTogbW92ZSxcbiAgICByOiByZW1vdmUsXG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIG1jOiBtb3VudENoaWxkcmVuLFxuICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgIG46IGdldE5leHRIb3N0Tm9kZSxcbiAgICBvOiBvcHRpb25zXG4gIH07XG4gIGxldCBoeWRyYXRlO1xuICBsZXQgaHlkcmF0ZU5vZGU7XG4gIGlmIChjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAgICBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdID0gY3JlYXRlSHlkcmF0aW9uRm5zKFxuICAgICAgaW50ZXJuYWxzXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbmRlcixcbiAgICBoeWRyYXRlLFxuICAgIGNyZWF0ZUFwcDogY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVJlY3Vyc2UoeyBlZmZlY3QsIHVwZGF0ZSB9LCBhbGxvd2VkKSB7XG4gIGVmZmVjdC5hbGxvd1JlY3Vyc2UgPSB1cGRhdGUuYWxsb3dSZWN1cnNlID0gYWxsb3dlZDtcbn1cbmZ1bmN0aW9uIG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSB7XG4gIHJldHVybiAoIXBhcmVudFN1c3BlbnNlIHx8IHBhcmVudFN1c3BlbnNlICYmICFwYXJlbnRTdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZDtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yLCBzaGFsbG93ID0gZmFsc2UpIHtcbiAgY29uc3QgY2gxID0gbjEuY2hpbGRyZW47XG4gIGNvbnN0IGNoMiA9IG4yLmNoaWxkcmVuO1xuICBpZiAoaXNBcnJheShjaDEpICYmIGlzQXJyYXkoY2gyKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2gxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjMSA9IGNoMVtpXTtcbiAgICAgIGxldCBjMiA9IGNoMltpXTtcbiAgICAgIGlmIChjMi5zaGFwZUZsYWcgJiAxICYmICFjMi5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGMyLnBhdGNoRmxhZyA8PSAwIHx8IGMyLnBhdGNoRmxhZyA9PT0gMzIpIHtcbiAgICAgICAgICBjMiA9IGNoMltpXSA9IGNsb25lSWZNb3VudGVkKGNoMltpXSk7XG4gICAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNoYWxsb3cpXG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihjMSwgYzIpO1xuICAgICAgfVxuICAgICAgaWYgKGMyLnR5cGUgPT09IFRleHQpIHtcbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGMyLnR5cGUgPT09IENvbW1lbnQgJiYgIWMyLmVsKSB7XG4gICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRTZXF1ZW5jZShhcnIpIHtcbiAgY29uc3QgcCA9IGFyci5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbMF07XG4gIGxldCBpLCBqLCB1LCB2LCBjO1xuICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcnJJID0gYXJyW2ldO1xuICAgIGlmIChhcnJJICE9PSAwKSB7XG4gICAgICBqID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChhcnJbal0gPCBhcnJJKSB7XG4gICAgICAgIHBbaV0gPSBqO1xuICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1ID0gMDtcbiAgICAgIHYgPSByZXN1bHQubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICh1IDwgdikge1xuICAgICAgICBjID0gdSArIHYgPj4gMTtcbiAgICAgICAgaWYgKGFycltyZXN1bHRbY11dIDwgYXJySSkge1xuICAgICAgICAgIHUgPSBjICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFyckkgPCBhcnJbcmVzdWx0W3VdXSkge1xuICAgICAgICBpZiAodSA+IDApIHtcbiAgICAgICAgICBwW2ldID0gcmVzdWx0W3UgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbdV0gPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1ID0gcmVzdWx0Lmxlbmd0aDtcbiAgdiA9IHJlc3VsdFt1IC0gMV07XG4gIHdoaWxlICh1LS0gPiAwKSB7XG4gICAgcmVzdWx0W3VdID0gdjtcbiAgICB2ID0gcFt2XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCBpc1RlbGVwb3J0ID0gKHR5cGUpID0+IHR5cGUuX19pc1RlbGVwb3J0O1xuY29uc3QgaXNUZWxlcG9ydERpc2FibGVkID0gKHByb3BzKSA9PiBwcm9wcyAmJiAocHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuZGlzYWJsZWQgPT09IFwiXCIpO1xuY29uc3QgaXNUYXJnZXRTVkcgPSAodGFyZ2V0KSA9PiB0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuY29uc3QgcmVzb2x2ZVRhcmdldCA9IChwcm9wcywgc2VsZWN0KSA9PiB7XG4gIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gcHJvcHMgJiYgcHJvcHMudG87XG4gIGlmIChpc1N0cmluZyh0YXJnZXRTZWxlY3RvcikpIHtcbiAgICBpZiAoIXNlbGVjdCkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgICBgQ3VycmVudCByZW5kZXJlciBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyB0YXJnZXQgZm9yIFRlbGVwb3J0cy4gKG1pc3NpbmcgcXVlcnlTZWxlY3RvciByZW5kZXJlciBvcHRpb24pYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBzZWxlY3QodGFyZ2V0U2VsZWN0b3IpO1xuICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9jYXRlIFRlbGVwb3J0IHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiJHt0YXJnZXRTZWxlY3Rvcn1cIi4gTm90ZSB0aGUgdGFyZ2V0IGVsZW1lbnQgbXVzdCBleGlzdCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkIC0gaS5lLiB0aGUgdGFyZ2V0IGNhbm5vdCBiZSByZW5kZXJlZCBieSB0aGUgY29tcG9uZW50IGl0c2VsZiwgYW5kIGlkZWFsbHkgc2hvdWxkIGJlIG91dHNpZGUgb2YgdGhlIGVudGlyZSBWdWUgY29tcG9uZW50IHRyZWUuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXRhcmdldFNlbGVjdG9yICYmICFpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgICB3YXJuKGBJbnZhbGlkIFRlbGVwb3J0IHRhcmdldDogJHt0YXJnZXRTZWxlY3Rvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFNlbGVjdG9yO1xuICB9XG59O1xuY29uc3QgVGVsZXBvcnRJbXBsID0ge1xuICBfX2lzVGVsZXBvcnQ6IHRydWUsXG4gIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgICAgcGJjOiBwYXRjaEJsb2NrQ2hpbGRyZW4sXG4gICAgICBvOiB7IGluc2VydCwgcXVlcnlTZWxlY3RvciwgY3JlYXRlVGV4dCwgY3JlYXRlQ29tbWVudCB9XG4gICAgfSA9IGludGVybmFscztcbiAgICBjb25zdCBkaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMi5wcm9wcyk7XG4gICAgbGV0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IG4yLmVsID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBzdGFydFwiKSA6IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBjb25zdCBtYWluQW5jaG9yID0gbjIuYW5jaG9yID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBlbmRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgaW5zZXJ0KHBsYWNlaG9sZGVyLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBpbnNlcnQobWFpbkFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gbjIudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChuMi5wcm9wcywgcXVlcnlTZWxlY3Rvcik7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpbnNlcnQodGFyZ2V0QW5jaG9yLCB0YXJnZXQpO1xuICAgICAgICBpc1NWRyA9IGlzU1ZHIHx8IGlzVGFyZ2V0U1ZHKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIHdhcm4oXCJJbnZhbGlkIFRlbGVwb3J0IHRhcmdldCBvbiBtb3VudDpcIiwgdGFyZ2V0LCBgKCR7dHlwZW9mIHRhcmdldH0pYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBtb3VudCA9IChjb250YWluZXIyLCBhbmNob3IyKSA9PiB7XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIGNvbnRhaW5lcjIsXG4gICAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgbW91bnQoY29udGFpbmVyLCBtYWluQW5jaG9yKTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgIG1vdW50KHRhcmdldCwgdGFyZ2V0QW5jaG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIGNvbnN0IG1haW5BbmNob3IgPSBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSBuMS50YXJnZXQ7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBuMS50YXJnZXRBbmNob3I7XG4gICAgICBjb25zdCB3YXNEaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMS5wcm9wcyk7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gd2FzRGlzYWJsZWQgPyBjb250YWluZXIgOiB0YXJnZXQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gd2FzRGlzYWJsZWQgPyBtYWluQW5jaG9yIDogdGFyZ2V0QW5jaG9yO1xuICAgICAgaXNTVkcgPSBpc1NWRyB8fCBpc1RhcmdldFNWRyh0YXJnZXQpO1xuICAgICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBjdXJyZW50QW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBpZiAoIXdhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBtYWluQW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG4yLnByb3BzICYmIG4xLnByb3BzICYmIG4yLnByb3BzLnRvICE9PSBuMS5wcm9wcy50bykge1xuICAgICAgICAgICAgbjIucHJvcHMudG8gPSBuMS5wcm9wcy50bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgobjIucHJvcHMgJiYgbjIucHJvcHMudG8pICE9PSAobjEucHJvcHMgJiYgbjEucHJvcHMudG8pKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhcmdldCA9IG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICBuMi5wcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChuZXh0VGFyZ2V0KSB7XG4gICAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgICBuZXh0VGFyZ2V0LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZTpcIixcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnMobjIpO1xuICB9LFxuICByZW1vdmUodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG9wdGltaXplZCwgeyB1bTogdW5tb3VudCwgbzogeyByZW1vdmU6IGhvc3RSZW1vdmUgfSB9LCBkb1JlbW92ZSkge1xuICAgIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgYW5jaG9yLCB0YXJnZXRBbmNob3IsIHRhcmdldCwgcHJvcHMgfSA9IHZub2RlO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGhvc3RSZW1vdmUodGFyZ2V0QW5jaG9yKTtcbiAgICB9XG4gICAgZG9SZW1vdmUgJiYgaG9zdFJlbW92ZShhbmNob3IpO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlID0gZG9SZW1vdmUgfHwgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNob3VsZFJlbW92ZSxcbiAgICAgICAgICAhIWNoaWxkLmR5bmFtaWNDaGlsZHJlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbW92ZTogbW92ZVRlbGVwb3J0LFxuICBoeWRyYXRlOiBoeWRyYXRlVGVsZXBvcnRcbn07XG5mdW5jdGlvbiBtb3ZlVGVsZXBvcnQodm5vZGUsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCB7IG86IHsgaW5zZXJ0IH0sIG06IG1vdmUgfSwgbW92ZVR5cGUgPSAyKSB7XG4gIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgIGluc2VydCh2bm9kZS50YXJnZXRBbmNob3IsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBjb25zdCB7IGVsLCBhbmNob3IsIHNoYXBlRmxhZywgY2hpbGRyZW4sIHByb3BzIH0gPSB2bm9kZTtcbiAgY29uc3QgaXNSZW9yZGVyID0gbW92ZVR5cGUgPT09IDI7XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoZWwsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBpZiAoIWlzUmVvcmRlciB8fCBpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoXG4gICAgICAgICAgY2hpbGRyZW5baV0sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudEFuY2hvcixcbiAgICAgICAgICAyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZWxlcG9ydChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHtcbiAgbzogeyBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcXVlcnlTZWxlY3RvciB9XG59LCBoeWRyYXRlQ2hpbGRyZW4pIHtcbiAgY29uc3QgdGFyZ2V0ID0gdm5vZGUudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChcbiAgICB2bm9kZS5wcm9wcyxcbiAgICBxdWVyeVNlbGVjdG9yXG4gICk7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGFyZ2V0Ll9scGEgfHwgdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoaXNUZWxlcG9ydERpc2FibGVkKHZub2RlLnByb3BzKSkge1xuICAgICAgICB2bm9kZS5hbmNob3IgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgbmV4dFNpYmxpbmcobm9kZSksXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Tm9kZShub2RlKSxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICB2bm9kZS50YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuYW5jaG9yID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGxldCB0YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlO1xuICAgICAgICB3aGlsZSAodGFyZ2V0QW5jaG9yKSB7XG4gICAgICAgICAgdGFyZ2V0QW5jaG9yID0gbmV4dFNpYmxpbmcodGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICBpZiAodGFyZ2V0QW5jaG9yICYmIHRhcmdldEFuY2hvci5ub2RlVHlwZSA9PT0gOCAmJiB0YXJnZXRBbmNob3IuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBhbmNob3JcIikge1xuICAgICAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0QW5jaG9yO1xuICAgICAgICAgICAgdGFyZ2V0Ll9scGEgPSB2bm9kZS50YXJnZXRBbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUudGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgdGFyZ2V0Tm9kZSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ3NzVmFycyh2bm9kZSk7XG4gIH1cbiAgcmV0dXJuIHZub2RlLmFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS5hbmNob3IpO1xufVxuY29uc3QgVGVsZXBvcnQgPSBUZWxlcG9ydEltcGw7XG5mdW5jdGlvbiB1cGRhdGVDc3NWYXJzKHZub2RlKSB7XG4gIGNvbnN0IGN0eCA9IHZub2RlLmN0eDtcbiAgaWYgKGN0eCAmJiBjdHgudXQpIHtcbiAgICBsZXQgbm9kZSA9IHZub2RlLmNoaWxkcmVuWzBdLmVsO1xuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IHZub2RlLnRhcmdldEFuY2hvcikge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZGF0YS12LW93bmVyXCIsIGN0eC51aWQpO1xuICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIGN0eC51dCgpO1xuICB9XG59XG5cbmNvbnN0IEZyYWdtZW50ID0gU3ltYm9sLmZvcihcInYtZmd0XCIpO1xuY29uc3QgVGV4dCA9IFN5bWJvbC5mb3IoXCJ2LXR4dFwiKTtcbmNvbnN0IENvbW1lbnQgPSBTeW1ib2wuZm9yKFwidi1jbXRcIik7XG5jb25zdCBTdGF0aWMgPSBTeW1ib2wuZm9yKFwidi1zdGNcIik7XG5jb25zdCBibG9ja1N0YWNrID0gW107XG5sZXQgY3VycmVudEJsb2NrID0gbnVsbDtcbmZ1bmN0aW9uIG9wZW5CbG9jayhkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSkge1xuICBibG9ja1N0YWNrLnB1c2goY3VycmVudEJsb2NrID0gZGlzYWJsZVRyYWNraW5nID8gbnVsbCA6IFtdKTtcbn1cbmZ1bmN0aW9uIGNsb3NlQmxvY2soKSB7XG4gIGJsb2NrU3RhY2sucG9wKCk7XG4gIGN1cnJlbnRCbG9jayA9IGJsb2NrU3RhY2tbYmxvY2tTdGFjay5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxubGV0IGlzQmxvY2tUcmVlRW5hYmxlZCA9IDE7XG5mdW5jdGlvbiBzZXRCbG9ja1RyYWNraW5nKHZhbHVlKSB7XG4gIGlzQmxvY2tUcmVlRW5hYmxlZCArPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldHVwQmxvY2sodm5vZGUpIHtcbiAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gaXNCbG9ja1RyZWVFbmFibGVkID4gMCA/IGN1cnJlbnRCbG9jayB8fCBFTVBUWV9BUlIgOiBudWxsO1xuICBjbG9zZUJsb2NrKCk7XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50QmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgc2hhcGVGbGFnKSB7XG4gIHJldHVybiBzZXR1cEJsb2NrKFxuICAgIGNyZWF0ZUJhc2VWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgdHJ1ZVxuICAgICAgLyogaXNCbG9jayAqL1xuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGR5bmFtaWNQcm9wcyxcbiAgICAgIHRydWVcbiAgICAgIC8qIGlzQmxvY2s6IHByZXZlbnQgYSBibG9jayBmcm9tIHRyYWNraW5nIGl0c2VsZiAqL1xuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVk5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuX192X2lzVk5vZGUgPT09IHRydWUgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbjIuc2hhcGVGbGFnICYgNiAmJiBobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG4yLnR5cGUpKSB7XG4gICAgbjEuc2hhcGVGbGFnICY9IH4yNTY7XG4gICAgbjIuc2hhcGVGbGFnICY9IH41MTI7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuMS50eXBlID09PSBuMi50eXBlICYmIG4xLmtleSA9PT0gbjIua2V5O1xufVxubGV0IHZub2RlQXJnc1RyYW5zZm9ybWVyO1xuZnVuY3Rpb24gdHJhbnNmb3JtVk5vZGVBcmdzKHRyYW5zZm9ybWVyKSB7XG4gIHZub2RlQXJnc1RyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7XG59XG5jb25zdCBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtID0gKC4uLmFyZ3MpID0+IHtcbiAgcmV0dXJuIF9jcmVhdGVWTm9kZShcbiAgICAuLi52bm9kZUFyZ3NUcmFuc2Zvcm1lciA/IHZub2RlQXJnc1RyYW5zZm9ybWVyKGFyZ3MsIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkgOiBhcmdzXG4gICk7XG59O1xuY29uc3QgSW50ZXJuYWxPYmplY3RLZXkgPSBgX192SW50ZXJuYWxgO1xuY29uc3Qgbm9ybWFsaXplS2V5ID0gKHsga2V5IH0pID0+IGtleSAhPSBudWxsID8ga2V5IDogbnVsbDtcbmNvbnN0IG5vcm1hbGl6ZVJlZiA9ICh7XG4gIHJlZixcbiAgcmVmX2tleSxcbiAgcmVmX2ZvclxufSkgPT4ge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gXCJudW1iZXJcIikge1xuICAgIHJlZiA9IFwiXCIgKyByZWY7XG4gIH1cbiAgcmV0dXJuIHJlZiAhPSBudWxsID8gaXNTdHJpbmcocmVmKSB8fCBpc1JlZihyZWYpIHx8IGlzRnVuY3Rpb24ocmVmKSA/IHsgaTogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCByOiByZWYsIGs6IHJlZl9rZXksIGY6ICEhcmVmX2ZvciB9IDogcmVmIDogbnVsbDtcbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlVk5vZGUodHlwZSwgcHJvcHMgPSBudWxsLCBjaGlsZHJlbiA9IG51bGwsIHBhdGNoRmxhZyA9IDAsIGR5bmFtaWNQcm9wcyA9IG51bGwsIHNoYXBlRmxhZyA9IHR5cGUgPT09IEZyYWdtZW50ID8gMCA6IDEsIGlzQmxvY2tOb2RlID0gZmFsc2UsIG5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uID0gZmFsc2UpIHtcbiAgY29uc3Qgdm5vZGUgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZSxcbiAgICBwcm9wcyxcbiAgICBrZXk6IHByb3BzICYmIG5vcm1hbGl6ZUtleShwcm9wcyksXG4gICAgcmVmOiBwcm9wcyAmJiBub3JtYWxpemVSZWYocHJvcHMpLFxuICAgIHNjb3BlSWQ6IGN1cnJlbnRTY29wZUlkLFxuICAgIHNsb3RTY29wZUlkczogbnVsbCxcbiAgICBjaGlsZHJlbixcbiAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgc3VzcGVuc2U6IG51bGwsXG4gICAgc3NDb250ZW50OiBudWxsLFxuICAgIHNzRmFsbGJhY2s6IG51bGwsXG4gICAgZGlyczogbnVsbCxcbiAgICB0cmFuc2l0aW9uOiBudWxsLFxuICAgIGVsOiBudWxsLFxuICAgIGFuY2hvcjogbnVsbCxcbiAgICB0YXJnZXQ6IG51bGwsXG4gICAgdGFyZ2V0QW5jaG9yOiBudWxsLFxuICAgIHN0YXRpY0NvdW50OiAwLFxuICAgIHNoYXBlRmxhZyxcbiAgICBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzLFxuICAgIGR5bmFtaWNDaGlsZHJlbjogbnVsbCxcbiAgICBhcHBDb250ZXh0OiBudWxsLFxuICAgIGN0eDogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlXG4gIH07XG4gIGlmIChuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbikge1xuICAgIG5vcm1hbGl6ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdHlwZS5ub3JtYWxpemUodm5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIHZub2RlLnNoYXBlRmxhZyB8PSBpc1N0cmluZyhjaGlsZHJlbikgPyA4IDogMTY7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUua2V5ICE9PSB2bm9kZS5rZXkpIHtcbiAgICB3YXJuKGBWTm9kZSBjcmVhdGVkIHdpdGggaW52YWxpZCBrZXkgKE5hTikuIFZOb2RlIHR5cGU6YCwgdm5vZGUudHlwZSk7XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgLy8gYXZvaWQgYSBibG9jayBub2RlIGZyb20gdHJhY2tpbmcgaXRzZWxmXG4gICFpc0Jsb2NrTm9kZSAmJiAvLyBoYXMgY3VycmVudCBwYXJlbnQgYmxvY2tcbiAgY3VycmVudEJsb2NrICYmIC8vIHByZXNlbmNlIG9mIGEgcGF0Y2ggZmxhZyBpbmRpY2F0ZXMgdGhpcyBub2RlIG5lZWRzIHBhdGNoaW5nIG9uIHVwZGF0ZXMuXG4gIC8vIGNvbXBvbmVudCBub2RlcyBhbHNvIHNob3VsZCBhbHdheXMgYmUgcGF0Y2hlZCwgYmVjYXVzZSBldmVuIGlmIHRoZVxuICAvLyBjb21wb25lbnQgZG9lc24ndCBuZWVkIHRvIHVwZGF0ZSwgaXQgbmVlZHMgdG8gcGVyc2lzdCB0aGUgaW5zdGFuY2Ugb24gdG9cbiAgLy8gdGhlIG5leHQgdm5vZGUgc28gdGhhdCBpdCBjYW4gYmUgcHJvcGVybHkgdW5tb3VudGVkIGxhdGVyLlxuICAodm5vZGUucGF0Y2hGbGFnID4gMCB8fCBzaGFwZUZsYWcgJiA2KSAmJiAvLyB0aGUgRVZFTlRTIGZsYWcgaXMgb25seSBmb3IgaHlkcmF0aW9uIGFuZCBpZiBpdCBpcyB0aGUgb25seSBmbGFnLCB0aGVcbiAgLy8gdm5vZGUgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGR5bmFtaWMgZHVlIHRvIGhhbmRsZXIgY2FjaGluZy5cbiAgdm5vZGUucGF0Y2hGbGFnICE9PSAzMikge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5jb25zdCBjcmVhdGVWTm9kZSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIDogX2NyZWF0ZVZOb2RlO1xuZnVuY3Rpb24gX2NyZWF0ZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBpc0Jsb2NrTm9kZSA9IGZhbHNlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlID09PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXR5cGUpIHtcbiAgICAgIHdhcm4oYEludmFsaWQgdm5vZGUgdHlwZSB3aGVuIGNyZWF0aW5nIHZub2RlOiAke3R5cGV9LmApO1xuICAgIH1cbiAgICB0eXBlID0gQ29tbWVudDtcbiAgfVxuICBpZiAoaXNWTm9kZSh0eXBlKSkge1xuICAgIGNvbnN0IGNsb25lZCA9IGNsb25lVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICB0cnVlXG4gICAgICAvKiBtZXJnZVJlZjogdHJ1ZSAqL1xuICAgICk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBub3JtYWxpemVDaGlsZHJlbihjbG9uZWQsIGNoaWxkcmVuKTtcbiAgICB9XG4gICAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgIWlzQmxvY2tOb2RlICYmIGN1cnJlbnRCbG9jaykge1xuICAgICAgaWYgKGNsb25lZC5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgIGN1cnJlbnRCbG9ja1tjdXJyZW50QmxvY2suaW5kZXhPZih0eXBlKV0gPSBjbG9uZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50QmxvY2sucHVzaChjbG9uZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBjbG9uZWQucGF0Y2hGbGFnIHw9IC0yO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbiAgaWYgKGlzQ2xhc3NDb21wb25lbnQodHlwZSkpIHtcbiAgICB0eXBlID0gdHlwZS5fX3ZjY09wdHM7XG4gIH1cbiAgaWYgKHByb3BzKSB7XG4gICAgcHJvcHMgPSBndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpO1xuICAgIGxldCB7IGNsYXNzOiBrbGFzcywgc3R5bGUgfSA9IHByb3BzO1xuICAgIGlmIChrbGFzcyAmJiAhaXNTdHJpbmcoa2xhc3MpKSB7XG4gICAgICBwcm9wcy5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKGtsYXNzKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHN0eWxlKSkge1xuICAgICAgaWYgKGlzUHJveHkoc3R5bGUpICYmICFpc0FycmF5KHN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IGV4dGVuZCh7fSwgc3R5bGUpO1xuICAgICAgfVxuICAgICAgcHJvcHMuc3R5bGUgPSBub3JtYWxpemVTdHlsZShzdHlsZSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNoYXBlRmxhZyA9IGlzU3RyaW5nKHR5cGUpID8gMSA6IGlzU3VzcGVuc2UodHlwZSkgPyAxMjggOiBpc1RlbGVwb3J0KHR5cGUpID8gNjQgOiBpc09iamVjdCh0eXBlKSA/IDQgOiBpc0Z1bmN0aW9uKHR5cGUpID8gMiA6IDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNoYXBlRmxhZyAmIDQgJiYgaXNQcm94eSh0eXBlKSkge1xuICAgIHR5cGUgPSB0b1Jhdyh0eXBlKTtcbiAgICB3YXJuKFxuICAgICAgYFZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlIG9iamVjdC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCwgYW5kIHNob3VsZCBiZSBhdm9pZGVkIGJ5IG1hcmtpbmcgdGhlIGNvbXBvbmVudCB3aXRoIFxcYG1hcmtSYXdcXGAgb3IgdXNpbmcgXFxgc2hhbGxvd1JlZlxcYCBpbnN0ZWFkIG9mIFxcYHJlZlxcYC5gLFxuICAgICAgYFxuQ29tcG9uZW50IHRoYXQgd2FzIG1hZGUgcmVhY3RpdmU6IGAsXG4gICAgICB0eXBlXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQmFzZVZOb2RlKFxuICAgIHR5cGUsXG4gICAgcHJvcHMsXG4gICAgY2hpbGRyZW4sXG4gICAgcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wcyxcbiAgICBzaGFwZUZsYWcsXG4gICAgaXNCbG9ja05vZGUsXG4gICAgdHJ1ZVxuICApO1xufVxuZnVuY3Rpb24gZ3VhcmRSZWFjdGl2ZVByb3BzKHByb3BzKSB7XG4gIGlmICghcHJvcHMpXG4gICAgcmV0dXJuIG51bGw7XG4gIHJldHVybiBpc1Byb3h5KHByb3BzKSB8fCBJbnRlcm5hbE9iamVjdEtleSBpbiBwcm9wcyA/IGV4dGVuZCh7fSwgcHJvcHMpIDogcHJvcHM7XG59XG5mdW5jdGlvbiBjbG9uZVZOb2RlKHZub2RlLCBleHRyYVByb3BzLCBtZXJnZVJlZiA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgcHJvcHMsIHJlZiwgcGF0Y2hGbGFnLCBjaGlsZHJlbiB9ID0gdm5vZGU7XG4gIGNvbnN0IG1lcmdlZFByb3BzID0gZXh0cmFQcm9wcyA/IG1lcmdlUHJvcHMocHJvcHMgfHwge30sIGV4dHJhUHJvcHMpIDogcHJvcHM7XG4gIGNvbnN0IGNsb25lZCA9IHtcbiAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICBfX3Zfc2tpcDogdHJ1ZSxcbiAgICB0eXBlOiB2bm9kZS50eXBlLFxuICAgIHByb3BzOiBtZXJnZWRQcm9wcyxcbiAgICBrZXk6IG1lcmdlZFByb3BzICYmIG5vcm1hbGl6ZUtleShtZXJnZWRQcm9wcyksXG4gICAgcmVmOiBleHRyYVByb3BzICYmIGV4dHJhUHJvcHMucmVmID8gKFxuICAgICAgLy8gIzIwNzggaW4gdGhlIGNhc2Ugb2YgPGNvbXBvbmVudCA6aXM9XCJ2bm9kZVwiIHJlZj1cImV4dHJhXCIvPlxuICAgICAgLy8gaWYgdGhlIHZub2RlIGl0c2VsZiBhbHJlYWR5IGhhcyBhIHJlZiwgY2xvbmVWTm9kZSB3aWxsIG5lZWQgdG8gbWVyZ2VcbiAgICAgIC8vIHRoZSByZWZzIHNvIHRoZSBzaW5nbGUgdm5vZGUgY2FuIGJlIHNldCBvbiBtdWx0aXBsZSByZWZzXG4gICAgICBtZXJnZVJlZiAmJiByZWYgPyBpc0FycmF5KHJlZikgPyByZWYuY29uY2F0KG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKSkgOiBbcmVmLCBub3JtYWxpemVSZWYoZXh0cmFQcm9wcyldIDogbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXG4gICAgKSA6IHJlZixcbiAgICBzY29wZUlkOiB2bm9kZS5zY29wZUlkLFxuICAgIHNsb3RTY29wZUlkczogdm5vZGUuc2xvdFNjb3BlSWRzLFxuICAgIGNoaWxkcmVuOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHBhdGNoRmxhZyA9PT0gLTEgJiYgaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbi5tYXAoZGVlcENsb25lVk5vZGUpIDogY2hpbGRyZW4sXG4gICAgdGFyZ2V0OiB2bm9kZS50YXJnZXQsXG4gICAgdGFyZ2V0QW5jaG9yOiB2bm9kZS50YXJnZXRBbmNob3IsXG4gICAgc3RhdGljQ291bnQ6IHZub2RlLnN0YXRpY0NvdW50LFxuICAgIHNoYXBlRmxhZzogdm5vZGUuc2hhcGVGbGFnLFxuICAgIC8vIGlmIHRoZSB2bm9kZSBpcyBjbG9uZWQgd2l0aCBleHRyYSBwcm9wcywgd2UgY2FuIG5vIGxvbmdlciBhc3N1bWUgaXRzXG4gICAgLy8gZXhpc3RpbmcgcGF0Y2ggZmxhZyB0byBiZSByZWxpYWJsZSBhbmQgbmVlZCB0byBhZGQgdGhlIEZVTExfUFJPUFMgZmxhZy5cbiAgICAvLyBub3RlOiBwcmVzZXJ2ZSBmbGFnIGZvciBmcmFnbWVudHMgc2luY2UgdGhleSB1c2UgdGhlIGZsYWcgZm9yIGNoaWxkcmVuXG4gICAgLy8gZmFzdCBwYXRocyBvbmx5LlxuICAgIHBhdGNoRmxhZzogZXh0cmFQcm9wcyAmJiB2bm9kZS50eXBlICE9PSBGcmFnbWVudCA/IHBhdGNoRmxhZyA9PT0gLTEgPyAxNiA6IHBhdGNoRmxhZyB8IDE2IDogcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wczogdm5vZGUuZHluYW1pY1Byb3BzLFxuICAgIGR5bmFtaWNDaGlsZHJlbjogdm5vZGUuZHluYW1pY0NoaWxkcmVuLFxuICAgIGFwcENvbnRleHQ6IHZub2RlLmFwcENvbnRleHQsXG4gICAgZGlyczogdm5vZGUuZGlycyxcbiAgICB0cmFuc2l0aW9uOiB2bm9kZS50cmFuc2l0aW9uLFxuICAgIC8vIFRoZXNlIHNob3VsZCB0ZWNobmljYWxseSBvbmx5IGJlIG5vbi1udWxsIG9uIG1vdW50ZWQgVk5vZGVzLiBIb3dldmVyLFxuICAgIC8vIHRoZXkgKnNob3VsZCogYmUgY29waWVkIGZvciBrZXB0LWFsaXZlIHZub2Rlcy4gU28gd2UganVzdCBhbHdheXMgY29weVxuICAgIC8vIHRoZW0gc2luY2UgdGhlbSBiZWluZyBub24tbnVsbCBkdXJpbmcgYSBtb3VudCBkb2Vzbid0IGFmZmVjdCB0aGUgbG9naWMgYXNcbiAgICAvLyB0aGV5IHdpbGwgc2ltcGx5IGJlIG92ZXJ3cml0dGVuLlxuICAgIGNvbXBvbmVudDogdm5vZGUuY29tcG9uZW50LFxuICAgIHN1c3BlbnNlOiB2bm9kZS5zdXNwZW5zZSxcbiAgICBzc0NvbnRlbnQ6IHZub2RlLnNzQ29udGVudCAmJiBjbG9uZVZOb2RlKHZub2RlLnNzQ29udGVudCksXG4gICAgc3NGYWxsYmFjazogdm5vZGUuc3NGYWxsYmFjayAmJiBjbG9uZVZOb2RlKHZub2RlLnNzRmFsbGJhY2spLFxuICAgIGVsOiB2bm9kZS5lbCxcbiAgICBhbmNob3I6IHZub2RlLmFuY2hvcixcbiAgICBjdHg6IHZub2RlLmN0eCxcbiAgICBjZTogdm5vZGUuY2VcbiAgfTtcbiAgcmV0dXJuIGNsb25lZDtcbn1cbmZ1bmN0aW9uIGRlZXBDbG9uZVZOb2RlKHZub2RlKSB7XG4gIGNvbnN0IGNsb25lZCA9IGNsb25lVk5vZGUodm5vZGUpO1xuICBpZiAoaXNBcnJheSh2bm9kZS5jaGlsZHJlbikpIHtcbiAgICBjbG9uZWQuY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbi5tYXAoZGVlcENsb25lVk5vZGUpO1xuICB9XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUodGV4dCA9IFwiIFwiLCBmbGFnID0gMCkge1xuICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgdGV4dCwgZmxhZyk7XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0aWNWTm9kZShjb250ZW50LCBudW1iZXJPZk5vZGVzKSB7XG4gIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUoU3RhdGljLCBudWxsLCBjb250ZW50KTtcbiAgdm5vZGUuc3RhdGljQ291bnQgPSBudW1iZXJPZk5vZGVzO1xuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21tZW50Vk5vZGUodGV4dCA9IFwiXCIsIGFzQmxvY2sgPSBmYWxzZSkge1xuICByZXR1cm4gYXNCbG9jayA/IChvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2soQ29tbWVudCwgbnVsbCwgdGV4dCkpIDogY3JlYXRlVk5vZGUoQ29tbWVudCwgbnVsbCwgdGV4dCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVWTm9kZShjaGlsZCkge1xuICBpZiAoY2hpbGQgPT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGQpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKFxuICAgICAgRnJhZ21lbnQsXG4gICAgICBudWxsLFxuICAgICAgLy8gIzM2NjYsIGF2b2lkIHJlZmVyZW5jZSBwb2xsdXRpb24gd2hlbiByZXVzaW5nIHZub2RlXG4gICAgICBjaGlsZC5zbGljZSgpXG4gICAgKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gY2xvbmVJZk1vdW50ZWQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShUZXh0LCBudWxsLCBTdHJpbmcoY2hpbGQpKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xvbmVJZk1vdW50ZWQoY2hpbGQpIHtcbiAgcmV0dXJuIGNoaWxkLmVsID09PSBudWxsICYmIGNoaWxkLnBhdGNoRmxhZyAhPT0gLTEgfHwgY2hpbGQubWVtbyA/IGNoaWxkIDogY2xvbmVWTm9kZShjaGlsZCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4pIHtcbiAgbGV0IHR5cGUgPSAwO1xuICBjb25zdCB7IHNoYXBlRmxhZyB9ID0gdm5vZGU7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgdHlwZSA9IDE2O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChzaGFwZUZsYWcgJiAoMSB8IDY0KSkge1xuICAgICAgY29uc3Qgc2xvdCA9IGNoaWxkcmVuLmRlZmF1bHQ7XG4gICAgICBpZiAoc2xvdCkge1xuICAgICAgICBzbG90Ll9jICYmIChzbG90Ll9kID0gZmFsc2UpO1xuICAgICAgICBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgc2xvdCgpKTtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gMzI7XG4gICAgICBjb25zdCBzbG90RmxhZyA9IGNoaWxkcmVuLl87XG4gICAgICBpZiAoIXNsb3RGbGFnICYmICEoSW50ZXJuYWxPYmplY3RLZXkgaW4gY2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuLl9jdHggPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gICAgICB9IGVsc2UgaWYgKHNsb3RGbGFnID09PSAzICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkge1xuICAgICAgICBpZiAoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnNsb3RzLl8gPT09IDEpIHtcbiAgICAgICAgICBjaGlsZHJlbi5fID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZHJlbi5fID0gMjtcbiAgICAgICAgICB2bm9kZS5wYXRjaEZsYWcgfD0gMTAyNDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGNoaWxkcmVuKSkge1xuICAgIGNoaWxkcmVuID0geyBkZWZhdWx0OiBjaGlsZHJlbiwgX2N0eDogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIH07XG4gICAgdHlwZSA9IDMyO1xuICB9IGVsc2Uge1xuICAgIGNoaWxkcmVuID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgIHR5cGUgPSAxNjtcbiAgICAgIGNoaWxkcmVuID0gW2NyZWF0ZVRleHRWTm9kZShjaGlsZHJlbildO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gODtcbiAgICB9XG4gIH1cbiAgdm5vZGUuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdm5vZGUuc2hhcGVGbGFnIHw9IHR5cGU7XG59XG5mdW5jdGlvbiBtZXJnZVByb3BzKC4uLmFyZ3MpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRvTWVyZ2UgPSBhcmdzW2ldO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRvTWVyZ2UpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgICBpZiAocmV0LmNsYXNzICE9PSB0b01lcmdlLmNsYXNzKSB7XG4gICAgICAgICAgcmV0LmNsYXNzID0gbm9ybWFsaXplQ2xhc3MoW3JldC5jbGFzcywgdG9NZXJnZS5jbGFzc10pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgIHJldC5zdHlsZSA9IG5vcm1hbGl6ZVN0eWxlKFtyZXQuc3R5bGUsIHRvTWVyZ2Uuc3R5bGVdKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmV0W2tleV07XG4gICAgICAgIGNvbnN0IGluY29taW5nID0gdG9NZXJnZVtrZXldO1xuICAgICAgICBpZiAoaW5jb21pbmcgJiYgZXhpc3RpbmcgIT09IGluY29taW5nICYmICEoaXNBcnJheShleGlzdGluZykgJiYgZXhpc3RpbmcuaW5jbHVkZXMoaW5jb21pbmcpKSkge1xuICAgICAgICAgIHJldFtrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGluY29taW5nKSA6IGluY29taW5nO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleSAhPT0gXCJcIikge1xuICAgICAgICByZXRba2V5XSA9IHRvTWVyZ2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIGludm9rZVZOb2RlSG9vayhob29rLCBpbnN0YW5jZSwgdm5vZGUsIHByZXZWTm9kZSA9IG51bGwpIHtcbiAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoaG9vaywgaW5zdGFuY2UsIDcsIFtcbiAgICB2bm9kZSxcbiAgICBwcmV2Vk5vZGVcbiAgXSk7XG59XG5cbmNvbnN0IGVtcHR5QXBwQ29udGV4dCA9IGNyZWF0ZUFwcENvbnRleHQoKTtcbmxldCB1aWQgPSAwO1xuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2Uodm5vZGUsIHBhcmVudCwgc3VzcGVuc2UpIHtcbiAgY29uc3QgdHlwZSA9IHZub2RlLnR5cGU7XG4gIGNvbnN0IGFwcENvbnRleHQgPSAocGFyZW50ID8gcGFyZW50LmFwcENvbnRleHQgOiB2bm9kZS5hcHBDb250ZXh0KSB8fCBlbXB0eUFwcENvbnRleHQ7XG4gIGNvbnN0IGluc3RhbmNlID0ge1xuICAgIHVpZDogdWlkKyssXG4gICAgdm5vZGUsXG4gICAgdHlwZSxcbiAgICBwYXJlbnQsXG4gICAgYXBwQ29udGV4dCxcbiAgICByb290OiBudWxsLFxuICAgIC8vIHRvIGJlIGltbWVkaWF0ZWx5IHNldFxuICAgIG5leHQ6IG51bGwsXG4gICAgc3ViVHJlZTogbnVsbCxcbiAgICAvLyB3aWxsIGJlIHNldCBzeW5jaHJvbm91c2x5IHJpZ2h0IGFmdGVyIGNyZWF0aW9uXG4gICAgZWZmZWN0OiBudWxsLFxuICAgIHVwZGF0ZTogbnVsbCxcbiAgICAvLyB3aWxsIGJlIHNldCBzeW5jaHJvbm91c2x5IHJpZ2h0IGFmdGVyIGNyZWF0aW9uXG4gICAgc2NvcGU6IG5ldyBFZmZlY3RTY29wZShcbiAgICAgIHRydWVcbiAgICAgIC8qIGRldGFjaGVkICovXG4gICAgKSxcbiAgICByZW5kZXI6IG51bGwsXG4gICAgcHJveHk6IG51bGwsXG4gICAgZXhwb3NlZDogbnVsbCxcbiAgICBleHBvc2VQcm94eTogbnVsbCxcbiAgICB3aXRoUHJveHk6IG51bGwsXG4gICAgcHJvdmlkZXM6IHBhcmVudCA/IHBhcmVudC5wcm92aWRlcyA6IE9iamVjdC5jcmVhdGUoYXBwQ29udGV4dC5wcm92aWRlcyksXG4gICAgYWNjZXNzQ2FjaGU6IG51bGwsXG4gICAgcmVuZGVyQ2FjaGU6IFtdLFxuICAgIC8vIGxvY2FsIHJlc29sdmVkIGFzc2V0c1xuICAgIGNvbXBvbmVudHM6IG51bGwsXG4gICAgZGlyZWN0aXZlczogbnVsbCxcbiAgICAvLyByZXNvbHZlZCBwcm9wcyBhbmQgZW1pdHMgb3B0aW9uc1xuICAgIHByb3BzT3B0aW9uczogbm9ybWFsaXplUHJvcHNPcHRpb25zKHR5cGUsIGFwcENvbnRleHQpLFxuICAgIGVtaXRzT3B0aW9uczogbm9ybWFsaXplRW1pdHNPcHRpb25zKHR5cGUsIGFwcENvbnRleHQpLFxuICAgIC8vIGVtaXRcbiAgICBlbWl0OiBudWxsLFxuICAgIC8vIHRvIGJlIHNldCBpbW1lZGlhdGVseVxuICAgIGVtaXR0ZWQ6IG51bGwsXG4gICAgLy8gcHJvcHMgZGVmYXVsdCB2YWx1ZVxuICAgIHByb3BzRGVmYXVsdHM6IEVNUFRZX09CSixcbiAgICAvLyBpbmhlcml0QXR0cnNcbiAgICBpbmhlcml0QXR0cnM6IHR5cGUuaW5oZXJpdEF0dHJzLFxuICAgIC8vIHN0YXRlXG4gICAgY3R4OiBFTVBUWV9PQkosXG4gICAgZGF0YTogRU1QVFlfT0JKLFxuICAgIHByb3BzOiBFTVBUWV9PQkosXG4gICAgYXR0cnM6IEVNUFRZX09CSixcbiAgICBzbG90czogRU1QVFlfT0JKLFxuICAgIHJlZnM6IEVNUFRZX09CSixcbiAgICBzZXR1cFN0YXRlOiBFTVBUWV9PQkosXG4gICAgc2V0dXBDb250ZXh0OiBudWxsLFxuICAgIGF0dHJzUHJveHk6IG51bGwsXG4gICAgc2xvdHNQcm94eTogbnVsbCxcbiAgICAvLyBzdXNwZW5zZSByZWxhdGVkXG4gICAgc3VzcGVuc2UsXG4gICAgc3VzcGVuc2VJZDogc3VzcGVuc2UgPyBzdXNwZW5zZS5wZW5kaW5nSWQgOiAwLFxuICAgIGFzeW5jRGVwOiBudWxsLFxuICAgIGFzeW5jUmVzb2x2ZWQ6IGZhbHNlLFxuICAgIC8vIGxpZmVjeWNsZSBob29rc1xuICAgIC8vIG5vdCB1c2luZyBlbnVtcyBoZXJlIGJlY2F1c2UgaXQgcmVzdWx0cyBpbiBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgaXNEZWFjdGl2YXRlZDogZmFsc2UsXG4gICAgYmM6IG51bGwsXG4gICAgYzogbnVsbCxcbiAgICBibTogbnVsbCxcbiAgICBtOiBudWxsLFxuICAgIGJ1OiBudWxsLFxuICAgIHU6IG51bGwsXG4gICAgdW06IG51bGwsXG4gICAgYnVtOiBudWxsLFxuICAgIGRhOiBudWxsLFxuICAgIGE6IG51bGwsXG4gICAgcnRnOiBudWxsLFxuICAgIHJ0YzogbnVsbCxcbiAgICBlYzogbnVsbCxcbiAgICBzcDogbnVsbFxuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluc3RhbmNlLmN0eCA9IGNyZWF0ZURldlJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICB9IGVsc2Uge1xuICAgIGluc3RhbmNlLmN0eCA9IHsgXzogaW5zdGFuY2UgfTtcbiAgfVxuICBpbnN0YW5jZS5yb290ID0gcGFyZW50ID8gcGFyZW50LnJvb3QgOiBpbnN0YW5jZTtcbiAgaW5zdGFuY2UuZW1pdCA9IGVtaXQuYmluZChudWxsLCBpbnN0YW5jZSk7XG4gIGlmICh2bm9kZS5jZSkge1xuICAgIHZub2RlLmNlKGluc3RhbmNlKTtcbiAgfVxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5sZXQgY3VycmVudEluc3RhbmNlID0gbnVsbDtcbmNvbnN0IGdldEN1cnJlbnRJbnN0YW5jZSA9ICgpID0+IGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG5sZXQgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2U7XG5sZXQgZ2xvYmFsQ3VycmVudEluc3RhbmNlU2V0dGVycztcbmxldCBzZXR0ZXJzS2V5ID0gXCJfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX19cIjtcbntcbiAgaWYgKCEoZ2xvYmFsQ3VycmVudEluc3RhbmNlU2V0dGVycyA9IGdldEdsb2JhbFRoaXMoKVtzZXR0ZXJzS2V5XSkpIHtcbiAgICBnbG9iYWxDdXJyZW50SW5zdGFuY2VTZXR0ZXJzID0gZ2V0R2xvYmFsVGhpcygpW3NldHRlcnNLZXldID0gW107XG4gIH1cbiAgZ2xvYmFsQ3VycmVudEluc3RhbmNlU2V0dGVycy5wdXNoKChpKSA9PiBjdXJyZW50SW5zdGFuY2UgPSBpKTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UgPSAoaW5zdGFuY2UpID0+IHtcbiAgICBpZiAoZ2xvYmFsQ3VycmVudEluc3RhbmNlU2V0dGVycy5sZW5ndGggPiAxKSB7XG4gICAgICBnbG9iYWxDdXJyZW50SW5zdGFuY2VTZXR0ZXJzLmZvckVhY2goKHMpID0+IHMoaW5zdGFuY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYmFsQ3VycmVudEluc3RhbmNlU2V0dGVyc1swXShpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xufVxuY29uc3Qgc2V0Q3VycmVudEluc3RhbmNlID0gKGluc3RhbmNlKSA9PiB7XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgaW5zdGFuY2Uuc2NvcGUub24oKTtcbn07XG5jb25zdCB1bnNldEN1cnJlbnRJbnN0YW5jZSA9ICgpID0+IHtcbiAgY3VycmVudEluc3RhbmNlICYmIGN1cnJlbnRJbnN0YW5jZS5zY29wZS5vZmYoKTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UobnVsbCk7XG59O1xuY29uc3QgaXNCdWlsdEluVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXCJzbG90LGNvbXBvbmVudFwiKTtcbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lLCBjb25maWcpIHtcbiAgY29uc3QgYXBwSXNOYXRpdmVUYWcgPSBjb25maWcuaXNOYXRpdmVUYWcgfHwgTk87XG4gIGlmIChpc0J1aWx0SW5UYWcobmFtZSkgfHwgYXBwSXNOYXRpdmVUYWcobmFtZSkpIHtcbiAgICB3YXJuKFxuICAgICAgXCJEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50IGlkOiBcIiArIG5hbWVcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBpc1N0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiA0O1xufVxubGV0IGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0dXBDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSID0gZmFsc2UpIHtcbiAgaXNJblNTUkNvbXBvbmVudFNldHVwID0gaXNTU1I7XG4gIGNvbnN0IHsgcHJvcHMsIGNoaWxkcmVuIH0gPSBpbnN0YW5jZS52bm9kZTtcbiAgY29uc3QgaXNTdGF0ZWZ1bCA9IGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpO1xuICBpbml0UHJvcHMoaW5zdGFuY2UsIHByb3BzLCBpc1N0YXRlZnVsLCBpc1NTUik7XG4gIGluaXRTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICBjb25zdCBzZXR1cFJlc3VsdCA9IGlzU3RhdGVmdWwgPyBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikgOiB2b2lkIDA7XG4gIGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IGZhbHNlO1xuICByZXR1cm4gc2V0dXBSZXN1bHQ7XG59XG5mdW5jdGlvbiBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikge1xuICB2YXIgX2E7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKENvbXBvbmVudC5uYW1lKSB7XG4gICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUoQ29tcG9uZW50Lm5hbWUsIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5jb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5jb21wb25lbnRzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWVzW2ldLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuZGlyZWN0aXZlcykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuZGlyZWN0aXZlcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcGlsZXJPcHRpb25zICYmIGlzUnVudGltZU9ubHkoKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFwiY29tcGlsZXJPcHRpb25zXCIgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBhIGJ1aWxkIG9mIFZ1ZSB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyLiBTaW5jZSB5b3UgYXJlIHVzaW5nIGEgcnVudGltZS1vbmx5IGJ1aWxkLCB0aGUgb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIHZpYSB5b3VyIGJ1aWxkIHRvb2wgY29uZmlnIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYWNjZXNzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgaW5zdGFuY2UucHJveHkgPSBtYXJrUmF3KG5ldyBQcm94eShpbnN0YW5jZS5jdHgsIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycykpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfVxuICBjb25zdCB7IHNldHVwIH0gPSBDb21wb25lbnQ7XG4gIGlmIChzZXR1cCkge1xuICAgIGNvbnN0IHNldHVwQ29udGV4dCA9IGluc3RhbmNlLnNldHVwQ29udGV4dCA9IHNldHVwLmxlbmd0aCA+IDEgPyBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIDogbnVsbDtcbiAgICBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICBjb25zdCBzZXR1cFJlc3VsdCA9IGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIHNldHVwLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAwLFxuICAgICAgWyEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaW5zdGFuY2UucHJvcHMpIDogaW5zdGFuY2UucHJvcHMsIHNldHVwQ29udGV4dF1cbiAgICApO1xuICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGlmIChpc1Byb21pc2Uoc2V0dXBSZXN1bHQpKSB7XG4gICAgICBzZXR1cFJlc3VsdC50aGVuKHVuc2V0Q3VycmVudEluc3RhbmNlLCB1bnNldEN1cnJlbnRJbnN0YW5jZSk7XG4gICAgICBpZiAoaXNTU1IpIHtcbiAgICAgICAgcmV0dXJuIHNldHVwUmVzdWx0LnRoZW4oKHJlc29sdmVkUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHJlc29sdmVkUmVzdWx0LCBpc1NTUik7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgaW5zdGFuY2UsIDApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLmFzeW5jRGVwID0gc2V0dXBSZXN1bHQ7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpbnN0YW5jZS5zdXNwZW5zZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSAoX2EgPSBDb21wb25lbnQubmFtZSkgIT0gbnVsbCA/IF9hIDogXCJBbm9ueW1vdXNcIjtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYENvbXBvbmVudCA8JHtuYW1lfT46IHNldHVwIGZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSwgYnV0IG5vIDxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBzZXR1cFJlc3VsdCwgaXNTU1IpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKGluc3RhbmNlLnR5cGUuX19zc3JJbmxpbmVSZW5kZXIpIHtcbiAgICAgIGluc3RhbmNlLnNzclJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNWTm9kZShzZXR1cFJlc3VsdCkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBzZXR1cCgpIHNob3VsZCBub3QgcmV0dXJuIFZOb2RlcyBkaXJlY3RseSAtIHJldHVybiBhIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgaW5zdGFuY2UuZGV2dG9vbHNSYXdTZXR1cFN0YXRlID0gc2V0dXBSZXN1bHQ7XG4gICAgfVxuICAgIGluc3RhbmNlLnNldHVwU3RhdGUgPSBwcm94eVJlZnMoc2V0dXBSZXN1bHQpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBleHBvc2VTZXR1cFN0YXRlT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgd2FybihcbiAgICAgIGBzZXR1cCgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiBSZWNlaXZlZDogJHtzZXR1cFJlc3VsdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHNldHVwUmVzdWx0fWBcbiAgICApO1xuICB9XG4gIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG59XG5sZXQgY29tcGlsZTtcbmxldCBpbnN0YWxsV2l0aFByb3h5O1xuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIoX2NvbXBpbGUpIHtcbiAgY29tcGlsZSA9IF9jb21waWxlO1xuICBpbnN0YWxsV2l0aFByb3h5ID0gKGkpID0+IHtcbiAgICBpZiAoaS5yZW5kZXIuX3JjKSB7XG4gICAgICBpLndpdGhQcm94eSA9IG5ldyBQcm94eShpLmN0eCwgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzKTtcbiAgICB9XG4gIH07XG59XG5jb25zdCBpc1J1bnRpbWVPbmx5ID0gKCkgPT4gIWNvbXBpbGU7XG5mdW5jdGlvbiBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IsIHNraXBPcHRpb25zKSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghaW5zdGFuY2UucmVuZGVyKSB7XG4gICAgaWYgKCFpc1NTUiAmJiBjb21waWxlICYmICFDb21wb25lbnQucmVuZGVyKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IENvbXBvbmVudC50ZW1wbGF0ZSB8fCByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkudGVtcGxhdGU7XG4gICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpc0N1c3RvbUVsZW1lbnQsIGNvbXBpbGVyT3B0aW9ucyB9ID0gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWc7XG4gICAgICAgIGNvbnN0IHsgZGVsaW1pdGVycywgY29tcGlsZXJPcHRpb25zOiBjb21wb25lbnRDb21waWxlck9wdGlvbnMgfSA9IENvbXBvbmVudDtcbiAgICAgICAgY29uc3QgZmluYWxDb21waWxlck9wdGlvbnMgPSBleHRlbmQoXG4gICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQsXG4gICAgICAgICAgICAgIGRlbGltaXRlcnNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21waWxlck9wdGlvbnNcbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbXBvbmVudENvbXBpbGVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBDb21wb25lbnQucmVuZGVyID0gY29tcGlsZSh0ZW1wbGF0ZSwgZmluYWxDb21waWxlck9wdGlvbnMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UucmVuZGVyID0gQ29tcG9uZW50LnJlbmRlciB8fCBOT09QO1xuICAgIGlmIChpbnN0YWxsV2l0aFByb3h5KSB7XG4gICAgICBpbnN0YWxsV2l0aFByb3h5KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgdHJ1ZSkge1xuICAgIHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIHRyeSB7XG4gICAgICBhcHBseU9wdGlvbnMoaW5zdGFuY2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhQ29tcG9uZW50LnJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1AgJiYgIWlzU1NSKSB7XG4gICAgaWYgKCFjb21waWxlICYmIENvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgd2FybihcbiAgICAgICAgYENvbXBvbmVudCBwcm92aWRlZCB0ZW1wbGF0ZSBvcHRpb24gYnV0IHJ1bnRpbWUgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIG9mIFZ1ZS5gICsgKGAgQ29uZmlndXJlIHlvdXIgYnVuZGxlciB0byBhbGlhcyBcInZ1ZVwiIHRvIFwidnVlL2Rpc3QvdnVlLmVzbS1idW5kbGVyLmpzXCIuYCApXG4gICAgICAgIC8qIHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuKGBDb21wb25lbnQgaXMgbWlzc2luZyB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24uYCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRBdHRyc1Byb3h5KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5hdHRyc1Byb3h5IHx8IChpbnN0YW5jZS5hdHRyc1Byb3h5ID0gbmV3IFByb3h5KFxuICAgIGluc3RhbmNlLmF0dHJzLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJGF0dHJzXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eSgpIHtcbiAgICAgICAgd2Fybihgc2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LmApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwgXCIkYXR0cnNcIik7XG4gICAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICkpO1xufVxuZnVuY3Rpb24gZ2V0U2xvdHNQcm94eShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2Uuc2xvdHNQcm94eSB8fCAoaW5zdGFuY2Uuc2xvdHNQcm94eSA9IG5ldyBQcm94eShpbnN0YW5jZS5zbG90cywge1xuICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJHNsb3RzXCIpO1xuICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgIH1cbiAgfSkpO1xufVxuZnVuY3Rpb24gY3JlYXRlU2V0dXBDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IGV4cG9zZSA9IChleHBvc2VkKSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5leHBvc2VkKSB7XG4gICAgICAgIHdhcm4oYGV4cG9zZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZXR1cCgpLmApO1xuICAgICAgfVxuICAgICAgaWYgKGV4cG9zZWQgIT0gbnVsbCkge1xuICAgICAgICBsZXQgZXhwb3NlZFR5cGUgPSB0eXBlb2YgZXhwb3NlZDtcbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJhcnJheVwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZWYoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJyZWZcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBleHBvc2UoKSBzaG91bGQgYmUgcGFzc2VkIGEgcGxhaW4gb2JqZWN0LCByZWNlaXZlZCAke2V4cG9zZWRUeXBlfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnN0YW5jZS5leHBvc2VkID0gZXhwb3NlZCB8fCB7fTtcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgIHJldHVybiBnZXRBdHRyc1Byb3h5KGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgICBnZXQgc2xvdHMoKSB7XG4gICAgICAgIHJldHVybiBnZXRTbG90c1Byb3h5KGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgICBnZXQgZW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIChldmVudCwgLi4uYXJncykgPT4gaW5zdGFuY2UuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgICB9LFxuICAgICAgZXhwb3NlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgcmV0dXJuIGdldEF0dHJzUHJveHkoaW5zdGFuY2UpO1xuICAgICAgfSxcbiAgICAgIHNsb3RzOiBpbnN0YW5jZS5zbG90cyxcbiAgICAgIGVtaXQ6IGluc3RhbmNlLmVtaXQsXG4gICAgICBleHBvc2VcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRFeHBvc2VQcm94eShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgIHJldHVybiBpbnN0YW5jZS5leHBvc2VQcm94eSB8fCAoaW5zdGFuY2UuZXhwb3NlUHJveHkgPSBuZXcgUHJveHkocHJveHlSZWZzKG1hcmtSYXcoaW5zdGFuY2UuZXhwb3NlZCkpLCB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXApIHtcbiAgICAgICAgICByZXR1cm4gcHVibGljUHJvcGVydGllc01hcFtrZXldKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhcyh0YXJnZXQsIGtleSkge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRhcmdldCB8fCBrZXkgaW4gcHVibGljUHJvcGVydGllc01hcDtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cbn1cbmNvbnN0IGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG5jb25zdCBjbGFzc2lmeSA9IChzdHIpID0+IHN0ci5yZXBsYWNlKGNsYXNzaWZ5UkUsIChjKSA9PiBjLnRvVXBwZXJDYXNlKCkpLnJlcGxhY2UoL1stX10vZywgXCJcIik7XG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCwgaW5jbHVkZUluZmVycmVkID0gdHJ1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbihDb21wb25lbnQpID8gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIDogQ29tcG9uZW50Lm5hbWUgfHwgaW5jbHVkZUluZmVycmVkICYmIENvbXBvbmVudC5fX25hbWU7XG59XG5mdW5jdGlvbiBmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCBDb21wb25lbnQsIGlzUm9vdCA9IGZhbHNlKSB7XG4gIGxldCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpO1xuICBpZiAoIW5hbWUgJiYgQ29tcG9uZW50Ll9fZmlsZSkge1xuICAgIGNvbnN0IG1hdGNoID0gQ29tcG9uZW50Ll9fZmlsZS5tYXRjaCgvKFteL1xcXFxdKylcXC5cXHcrJC8pO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbmFtZSA9IG1hdGNoWzFdO1xuICAgIH1cbiAgfVxuICBpZiAoIW5hbWUgJiYgaW5zdGFuY2UgJiYgaW5zdGFuY2UucGFyZW50KSB7XG4gICAgY29uc3QgaW5mZXJGcm9tUmVnaXN0cnkgPSAocmVnaXN0cnkpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgIGlmIChyZWdpc3RyeVtrZXldID09PSBDb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBuYW1lID0gaW5mZXJGcm9tUmVnaXN0cnkoXG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRzIHx8IGluc3RhbmNlLnBhcmVudC50eXBlLmNvbXBvbmVudHNcbiAgICApIHx8IGluZmVyRnJvbVJlZ2lzdHJ5KGluc3RhbmNlLmFwcENvbnRleHQuY29tcG9uZW50cyk7XG4gIH1cbiAgcmV0dXJuIG5hbWUgPyBjbGFzc2lmeShuYW1lKSA6IGlzUm9vdCA/IGBBcHBgIDogYEFub255bW91c2A7XG59XG5mdW5jdGlvbiBpc0NsYXNzQ29tcG9uZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlKSAmJiBcIl9fdmNjT3B0c1wiIGluIHZhbHVlO1xufVxuXG5jb25zdCBjb21wdXRlZCA9IChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcHV0ZWQkMShnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNJblNTUkNvbXBvbmVudFNldHVwKTtcbn07XG5cbmZ1bmN0aW9uIGgodHlwZSwgcHJvcHNPckNoaWxkcmVuLCBjaGlsZHJlbikge1xuICBjb25zdCBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgaWYgKGwgPT09IDIpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvcHNPckNoaWxkcmVuKSAmJiAhaXNBcnJheShwcm9wc09yQ2hpbGRyZW4pKSB7XG4gICAgICBpZiAoaXNWTm9kZShwcm9wc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBbcHJvcHNPckNoaWxkcmVuXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG51bGwsIHByb3BzT3JDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChsID4gMykge1xuICAgICAgY2hpbGRyZW4gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIH0gZWxzZSBpZiAobCA9PT0gMyAmJiBpc1ZOb2RlKGNoaWxkcmVuKSkge1xuICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuLCBjaGlsZHJlbik7XG4gIH1cbn1cblxuY29uc3Qgc3NyQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoXCJ2LXNjeFwiKTtcbmNvbnN0IHVzZVNTUkNvbnRleHQgPSAoKSA9PiB7XG4gIHtcbiAgICBjb25zdCBjdHggPSBpbmplY3Qoc3NyQ29udGV4dEtleSk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihcbiAgICAgICAgYFNlcnZlciByZW5kZXJpbmcgY29udGV4dCBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byBvbmx5IGNhbGwgdXNlU1NSQ29udGV4dCgpIGNvbmRpdGlvbmFsbHkgaW4gdGhlIHNlcnZlciBidWlsZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY3R4O1xuICB9XG59O1xuXG5mdW5jdGlvbiBpc1NoYWxsb3codmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzU2hhbGxvd1wiXSk7XG59XG5cbmZ1bmN0aW9uIGluaXRDdXN0b21Gb3JtYXR0ZXIoKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHZ1ZVN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojM2JhNzc2XCIgfTtcbiAgY29uc3QgbnVtYmVyU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiMwYjFiYzlcIiB9O1xuICBjb25zdCBzdHJpbmdTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6I2I2MmUyNFwiIH07XG4gIGNvbnN0IGtleXdvcmRTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6IzlkMjg4Y1wiIH07XG4gIGNvbnN0IGZvcm1hdHRlciA9IHtcbiAgICBoZWFkZXIob2JqKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAob2JqLl9faXNWdWUpIHtcbiAgICAgICAgcmV0dXJuIFtcImRpdlwiLCB2dWVTdHlsZSwgYFZ1ZUluc3RhbmNlYF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVmKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGdlblJlZkZsYWcob2JqKV0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqLnZhbHVlKSxcbiAgICAgICAgICBgPmBcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBpc1NoYWxsb3cob2JqKSA/IFwiU2hhbGxvd1JlYWN0aXZlXCIgOiBcIlJlYWN0aXZlXCJdLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgYD4ke2lzUmVhZG9ubHkob2JqKSA/IGAgKHJlYWRvbmx5KWAgOiBgYH1gXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVhZG9ubHkob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgaXNTaGFsbG93KG9iaikgPyBcIlNoYWxsb3dSZWFkb25seVwiIDogXCJSZWFkb25seVwiXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmopLFxuICAgICAgICAgIFwiPlwiXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGhhc0JvZHkob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIG9iai5fX2lzVnVlO1xuICAgIH0sXG4gICAgYm9keShvYmopIHtcbiAgICAgIGlmIChvYmogJiYgb2JqLl9faXNWdWUpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIC4uLmZvcm1hdEluc3RhbmNlKG9iai4kKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZm9ybWF0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBibG9ja3MgPSBbXTtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5wcm9wcyAmJiBpbnN0YW5jZS5wcm9wcykge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcInByb3BzXCIsIHRvUmF3KGluc3RhbmNlLnByb3BzKSkpO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2Uuc2V0dXBTdGF0ZSAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwic2V0dXBcIiwgaW5zdGFuY2Uuc2V0dXBTdGF0ZSkpO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UuZGF0YSAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiZGF0YVwiLCB0b1JhdyhpbnN0YW5jZS5kYXRhKSkpO1xuICAgIH1cbiAgICBjb25zdCBjb21wdXRlZCA9IGV4dHJhY3RLZXlzKGluc3RhbmNlLCBcImNvbXB1dGVkXCIpO1xuICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImNvbXB1dGVkXCIsIGNvbXB1dGVkKSk7XG4gICAgfVxuICAgIGNvbnN0IGluamVjdGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsIFwiaW5qZWN0XCIpO1xuICAgIGlmIChpbmplY3RlZCkge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImluamVjdGVkXCIsIGluamVjdGVkKSk7XG4gICAgfVxuICAgIGJsb2Nrcy5wdXNoKFtcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7fSxcbiAgICAgIFtcbiAgICAgICAgXCJzcGFuXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZToga2V5d29yZFN0eWxlLnN0eWxlICsgXCI7b3BhY2l0eTowLjY2XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCIkIChpbnRlcm5hbCk6IFwiXG4gICAgICBdLFxuICAgICAgW1wib2JqZWN0XCIsIHsgb2JqZWN0OiBpbnN0YW5jZSB9XVxuICAgIF0pO1xuICAgIHJldHVybiBibG9ja3M7XG4gIH1cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VCbG9jayh0eXBlLCB0YXJnZXQpIHtcbiAgICB0YXJnZXQgPSBleHRlbmQoe30sIHRhcmdldCk7XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0YXJnZXQpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwge31dO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHsgc3R5bGU6IFwibGluZS1oZWlnaHQ6MS4yNWVtO21hcmdpbi1ib3R0b206MC42ZW1cIiB9LFxuICAgICAgW1xuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IFwiY29sb3I6IzQ3NjU4MlwiXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogXCJwYWRkaW5nLWxlZnQ6MS4yNWVtXCJcbiAgICAgICAgfSxcbiAgICAgICAgLi4uT2JqZWN0LmtleXModGFyZ2V0KS5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBbXCJzcGFuXCIsIGtleXdvcmRTdHlsZSwga2V5ICsgXCI6IFwiXSxcbiAgICAgICAgICAgIGZvcm1hdFZhbHVlKHRhcmdldFtrZXldLCBmYWxzZSlcbiAgICAgICAgICBdO1xuICAgICAgICB9KVxuICAgICAgXVxuICAgIF07XG4gIH1cbiAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodiwgYXNSYXcgPSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBudW1iZXJTdHlsZSwgdl07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgc3RyaW5nU3R5bGUsIEpTT04uc3RyaW5naWZ5KHYpXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwga2V5d29yZFN0eWxlLCB2XTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHYpKSB7XG4gICAgICByZXR1cm4gW1wib2JqZWN0XCIsIHsgb2JqZWN0OiBhc1JhdyA/IHRvUmF3KHYpIDogdiB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgc3RyaW5nU3R5bGUsIFN0cmluZyh2KV07XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGV4dHJhY3RLZXlzKGluc3RhbmNlLCB0eXBlKSB7XG4gICAgY29uc3QgQ29tcCA9IGluc3RhbmNlLnR5cGU7XG4gICAgaWYgKGlzRnVuY3Rpb24oQ29tcCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0cmFjdGVkID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UuY3R4KSB7XG4gICAgICBpZiAoaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSkge1xuICAgICAgICBleHRyYWN0ZWRba2V5XSA9IGluc3RhbmNlLmN0eFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0cmFjdGVkO1xuICB9XG4gIGZ1bmN0aW9uIGlzS2V5T2ZUeXBlKENvbXAsIGtleSwgdHlwZSkge1xuICAgIGNvbnN0IG9wdHMgPSBDb21wW3R5cGVdO1xuICAgIGlmIChpc0FycmF5KG9wdHMpICYmIG9wdHMuaW5jbHVkZXMoa2V5KSB8fCBpc09iamVjdChvcHRzKSAmJiBrZXkgaW4gb3B0cykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDb21wLmV4dGVuZHMgJiYgaXNLZXlPZlR5cGUoQ29tcC5leHRlbmRzLCBrZXksIHR5cGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENvbXAubWl4aW5zICYmIENvbXAubWl4aW5zLnNvbWUoKG0pID0+IGlzS2V5T2ZUeXBlKG0sIGtleSwgdHlwZSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2VuUmVmRmxhZyh2KSB7XG4gICAgaWYgKGlzU2hhbGxvdyh2KSkge1xuICAgICAgcmV0dXJuIGBTaGFsbG93UmVmYDtcbiAgICB9XG4gICAgaWYgKHYuZWZmZWN0KSB7XG4gICAgICByZXR1cm4gYENvbXB1dGVkUmVmYDtcbiAgICB9XG4gICAgcmV0dXJuIGBSZWZgO1xuICB9XG4gIGlmICh3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzKSB7XG4gICAgd2luZG93LmRldnRvb2xzRm9ybWF0dGVycy5wdXNoKGZvcm1hdHRlcik7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmRldnRvb2xzRm9ybWF0dGVycyA9IFtmb3JtYXR0ZXJdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdpdGhNZW1vKG1lbW8sIHJlbmRlciwgY2FjaGUsIGluZGV4KSB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlW2luZGV4XTtcbiAgaWYgKGNhY2hlZCAmJiBpc01lbW9TYW1lKGNhY2hlZCwgbWVtbykpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJldCA9IHJlbmRlcigpO1xuICByZXQubWVtbyA9IG1lbW8uc2xpY2UoKTtcbiAgcmV0dXJuIGNhY2hlW2luZGV4XSA9IHJldDtcbn1cbmZ1bmN0aW9uIGlzTWVtb1NhbWUoY2FjaGVkLCBtZW1vKSB7XG4gIGNvbnN0IHByZXYgPSBjYWNoZWQubWVtbztcbiAgaWYgKHByZXYubGVuZ3RoICE9IG1lbW8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykge1xuICAgIGlmIChoYXNDaGFuZ2VkKHByZXZbaV0sIG1lbW9baV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKGNhY2hlZCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmNvbnN0IHZlcnNpb24gPSBcIjMuMy44XCI7XG5jb25zdCBfc3NyVXRpbHMgPSB7XG4gIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlLFxuICBzZXR1cENvbXBvbmVudCxcbiAgcmVuZGVyQ29tcG9uZW50Um9vdCxcbiAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlLFxuICBpc1ZOb2RlOiBpc1ZOb2RlLFxuICBub3JtYWxpemVWTm9kZVxufTtcbmNvbnN0IHNzclV0aWxzID0gX3NzclV0aWxzIDtcbmNvbnN0IHJlc29sdmVGaWx0ZXIgPSBudWxsO1xuY29uc3QgY29tcGF0VXRpbHMgPSBudWxsO1xuXG5leHBvcnQgeyBCYXNlVHJhbnNpdGlvbiwgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIENvbW1lbnQsIEZyYWdtZW50LCBLZWVwQWxpdmUsIFN0YXRpYywgU3VzcGVuc2UsIFRlbGVwb3J0LCBUZXh0LCBhc3NlcnROdW1iZXIsIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nLCBjYWxsV2l0aEVycm9ySGFuZGxpbmcsIGNsb25lVk5vZGUsIGNvbXBhdFV0aWxzLCBjb21wdXRlZCwgY3JlYXRlQmxvY2ssIGNyZWF0ZUNvbW1lbnRWTm9kZSwgY3JlYXRlRWxlbWVudEJsb2NrLCBjcmVhdGVCYXNlVk5vZGUgYXMgY3JlYXRlRWxlbWVudFZOb2RlLCBjcmVhdGVIeWRyYXRpb25SZW5kZXJlciwgY3JlYXRlUHJvcHNSZXN0UHJveHksIGNyZWF0ZVJlbmRlcmVyLCBjcmVhdGVTbG90cywgY3JlYXRlU3RhdGljVk5vZGUsIGNyZWF0ZVRleHRWTm9kZSwgY3JlYXRlVk5vZGUsIGRlZmluZUFzeW5jQ29tcG9uZW50LCBkZWZpbmVDb21wb25lbnQsIGRlZmluZUVtaXRzLCBkZWZpbmVFeHBvc2UsIGRlZmluZU1vZGVsLCBkZWZpbmVPcHRpb25zLCBkZWZpbmVQcm9wcywgZGVmaW5lU2xvdHMsIGRldnRvb2xzLCBnZXRDdXJyZW50SW5zdGFuY2UsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgZ3VhcmRSZWFjdGl2ZVByb3BzLCBoLCBoYW5kbGVFcnJvciwgaGFzSW5qZWN0aW9uQ29udGV4dCwgaW5pdEN1c3RvbUZvcm1hdHRlciwgaW5qZWN0LCBpc01lbW9TYW1lLCBpc1J1bnRpbWVPbmx5LCBpc1ZOb2RlLCBtZXJnZURlZmF1bHRzLCBtZXJnZU1vZGVscywgbWVyZ2VQcm9wcywgbmV4dFRpY2ssIG9uQWN0aXZhdGVkLCBvbkJlZm9yZU1vdW50LCBvbkJlZm9yZVVubW91bnQsIG9uQmVmb3JlVXBkYXRlLCBvbkRlYWN0aXZhdGVkLCBvbkVycm9yQ2FwdHVyZWQsIG9uTW91bnRlZCwgb25SZW5kZXJUcmFja2VkLCBvblJlbmRlclRyaWdnZXJlZCwgb25TZXJ2ZXJQcmVmZXRjaCwgb25Vbm1vdW50ZWQsIG9uVXBkYXRlZCwgb3BlbkJsb2NrLCBwb3BTY29wZUlkLCBwcm92aWRlLCBwdXNoU2NvcGVJZCwgcXVldWVQb3N0Rmx1c2hDYiwgcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIsIHJlbmRlckxpc3QsIHJlbmRlclNsb3QsIHJlc29sdmVDb21wb25lbnQsIHJlc29sdmVEaXJlY3RpdmUsIHJlc29sdmVEeW5hbWljQ29tcG9uZW50LCByZXNvbHZlRmlsdGVyLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBzZXRCbG9ja1RyYWNraW5nLCBzZXREZXZ0b29sc0hvb2ssIHNldFRyYW5zaXRpb25Ib29rcywgc3NyQ29udGV4dEtleSwgc3NyVXRpbHMsIHRvSGFuZGxlcnMsIHRyYW5zZm9ybVZOb2RlQXJncywgdXNlQXR0cnMsIHVzZU1vZGVsLCB1c2VTU1JDb250ZXh0LCB1c2VTbG90cywgdXNlVHJhbnNpdGlvblN0YXRlLCB2ZXJzaW9uLCB3YXJuLCB3YXRjaCwgd2F0Y2hFZmZlY3QsIHdhdGNoUG9zdEVmZmVjdCwgd2F0Y2hTeW5jRWZmZWN0LCB3aXRoQXN5bmNDb250ZXh0LCB3aXRoQ3R4LCB3aXRoRGVmYXVsdHMsIHdpdGhEaXJlY3RpdmVzLCB3aXRoTWVtbywgd2l0aFNjb3BlSWQgfTtcbiIsImltcG9ydCB7IGgsIEJhc2VUcmFuc2l0aW9uLCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywgYXNzZXJ0TnVtYmVyLCB3YXJuLCBjYW1lbGl6ZSwgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcsIGRlZmluZUNvbXBvbmVudCwgbmV4dFRpY2ssIGNyZWF0ZVZOb2RlLCBnZXRDdXJyZW50SW5zdGFuY2UsIHdhdGNoUG9zdEVmZmVjdCwgb25Nb3VudGVkLCBvblVubW91bnRlZCwgRnJhZ21lbnQsIFN0YXRpYywgdXNlVHJhbnNpdGlvblN0YXRlLCBvblVwZGF0ZWQsIHRvUmF3LCBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4sIHNldFRyYW5zaXRpb25Ib29rcywgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcywgaXNSdW50aW1lT25seSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuZXhwb3J0ICogZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpc09iamVjdCwgdG9OdW1iZXIsIGlzQXJyYXksIGlzU3RyaW5nLCBoeXBoZW5hdGUsIGNhcGl0YWxpemUsIGlzU3BlY2lhbEJvb2xlYW5BdHRyLCBpbmNsdWRlQm9vbGVhbkF0dHIsIGlzT24sIGlzTW9kZWxMaXN0ZW5lciwgaXNGdW5jdGlvbiwgY2FtZWxpemUgYXMgY2FtZWxpemUkMSwgRU1QVFlfT0JKLCBsb29zZVRvTnVtYmVyLCBsb29zZUluZGV4T2YsIGlzU2V0LCBsb29zZUVxdWFsLCBpbnZva2VBcnJheUZucywgaXNIVE1MVGFnLCBpc1NWR1RhZyB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3ZnTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG5jb25zdCBkb2MgPSB0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgPyBkb2N1bWVudCA6IG51bGw7XG5jb25zdCB0ZW1wbGF0ZUNvbnRhaW5lciA9IGRvYyAmJiAvKiBAX19QVVJFX18gKi8gZG9jLmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbmNvbnN0IG5vZGVPcHMgPSB7XG4gIGluc2VydDogKGNoaWxkLCBwYXJlbnQsIGFuY2hvcikgPT4ge1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIGFuY2hvciB8fCBudWxsKTtcbiAgfSxcbiAgcmVtb3ZlOiAoY2hpbGQpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBjaGlsZC5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgfVxuICB9LFxuICBjcmVhdGVFbGVtZW50OiAodGFnLCBpc1NWRywgaXMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgZWwgPSBpc1NWRyA/IGRvYy5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsIHRhZykgOiBkb2MuY3JlYXRlRWxlbWVudCh0YWcsIGlzID8geyBpcyB9IDogdm9pZCAwKTtcbiAgICBpZiAodGFnID09PSBcInNlbGVjdFwiICYmIHByb3BzICYmIHByb3BzLm11bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIHByb3BzLm11bHRpcGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xuICB9LFxuICBjcmVhdGVUZXh0OiAodGV4dCkgPT4gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpLFxuICBjcmVhdGVDb21tZW50OiAodGV4dCkgPT4gZG9jLmNyZWF0ZUNvbW1lbnQodGV4dCksXG4gIHNldFRleHQ6IChub2RlLCB0ZXh0KSA9PiB7XG4gICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICB9LFxuICBzZXRFbGVtZW50VGV4dDogKGVsLCB0ZXh0KSA9PiB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9LFxuICBwYXJlbnROb2RlOiAobm9kZSkgPT4gbm9kZS5wYXJlbnROb2RlLFxuICBuZXh0U2libGluZzogKG5vZGUpID0+IG5vZGUubmV4dFNpYmxpbmcsXG4gIHF1ZXJ5U2VsZWN0b3I6IChzZWxlY3RvcikgPT4gZG9jLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICBzZXRTY29wZUlkKGVsLCBpZCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gIH0sXG4gIC8vIF9fVU5TQUZFX19cbiAgLy8gUmVhc29uOiBpbm5lckhUTUwuXG4gIC8vIFN0YXRpYyBjb250ZW50IGhlcmUgY2FuIG9ubHkgY29tZSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgLy8gQXMgbG9uZyBhcyB0aGUgdXNlciBvbmx5IHVzZXMgdHJ1c3RlZCB0ZW1wbGF0ZXMsIHRoaXMgaXMgc2FmZS5cbiAgaW5zZXJ0U3RhdGljQ29udGVudChjb250ZW50LCBwYXJlbnQsIGFuY2hvciwgaXNTVkcsIHN0YXJ0LCBlbmQpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBhbmNob3IgPyBhbmNob3IucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZDtcbiAgICBpZiAoc3RhcnQgJiYgKHN0YXJ0ID09PSBlbmQgfHwgc3RhcnQubmV4dFNpYmxpbmcpKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHN0YXJ0LmNsb25lTm9kZSh0cnVlKSwgYW5jaG9yKTtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQgfHwgIShzdGFydCA9IHN0YXJ0Lm5leHRTaWJsaW5nKSlcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcGxhdGVDb250YWluZXIuaW5uZXJIVE1MID0gaXNTVkcgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IGNvbnRlbnQ7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRlbXBsYXRlQ29udGFpbmVyLmNvbnRlbnQ7XG4gICAgICBpZiAoaXNTVkcpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IFN5bWJvbChcIl92dGNcIik7XG5jb25zdCBUcmFuc2l0aW9uID0gKHByb3BzLCB7IHNsb3RzIH0pID0+IGgoQmFzZVRyYW5zaXRpb24sIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocHJvcHMpLCBzbG90cyk7XG5UcmFuc2l0aW9uLmRpc3BsYXlOYW1lID0gXCJUcmFuc2l0aW9uXCI7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgY3NzOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiB0cnVlXG4gIH0sXG4gIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gIGVudGVyRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckZyb21DbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gVHJhbnNpdGlvbi5wcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoXG4gIHt9LFxuICBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9yc1xuKTtcbmNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MgPSBbXSkgPT4ge1xuICBpZiAoaXNBcnJheShob29rKSkge1xuICAgIGhvb2suZm9yRWFjaCgoaDIpID0+IGgyKC4uLmFyZ3MpKTtcbiAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgaG9vayguLi5hcmdzKTtcbiAgfVxufTtcbmNvbnN0IGhhc0V4cGxpY2l0Q2FsbGJhY2sgPSAoaG9vaykgPT4ge1xuICByZXR1cm4gaG9vayA/IGlzQXJyYXkoaG9vaykgPyBob29rLnNvbWUoKGgyKSA9PiBoMi5sZW5ndGggPiAxKSA6IGhvb2subGVuZ3RoID4gMSA6IGZhbHNlO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpIHtcbiAgY29uc3QgYmFzZVByb3BzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Byb3BzKSB7XG4gICAgaWYgKCEoa2V5IGluIERPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMpKSB7XG4gICAgICBiYXNlUHJvcHNba2V5XSA9IHJhd1Byb3BzW2tleV07XG4gICAgfVxuICB9XG4gIGlmIChyYXdQcm9wcy5jc3MgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGJhc2VQcm9wcztcbiAgfVxuICBjb25zdCB7XG4gICAgbmFtZSA9IFwidlwiLFxuICAgIHR5cGUsXG4gICAgZHVyYXRpb24sXG4gICAgZW50ZXJGcm9tQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci1mcm9tYCxcbiAgICBlbnRlckFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tZW50ZXItYWN0aXZlYCxcbiAgICBlbnRlclRvQ2xhc3MgPSBgJHtuYW1lfS1lbnRlci10b2AsXG4gICAgYXBwZWFyRnJvbUNsYXNzID0gZW50ZXJGcm9tQ2xhc3MsXG4gICAgYXBwZWFyQWN0aXZlQ2xhc3MgPSBlbnRlckFjdGl2ZUNsYXNzLFxuICAgIGFwcGVhclRvQ2xhc3MgPSBlbnRlclRvQ2xhc3MsXG4gICAgbGVhdmVGcm9tQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS1mcm9tYCxcbiAgICBsZWF2ZUFjdGl2ZUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtYWN0aXZlYCxcbiAgICBsZWF2ZVRvQ2xhc3MgPSBgJHtuYW1lfS1sZWF2ZS10b2BcbiAgfSA9IHJhd1Byb3BzO1xuICBjb25zdCBkdXJhdGlvbnMgPSBub3JtYWxpemVEdXJhdGlvbihkdXJhdGlvbik7XG4gIGNvbnN0IGVudGVyRHVyYXRpb24gPSBkdXJhdGlvbnMgJiYgZHVyYXRpb25zWzBdO1xuICBjb25zdCBsZWF2ZUR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1sxXTtcbiAgY29uc3Qge1xuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhciA9IG9uQmVmb3JlRW50ZXIsXG4gICAgb25BcHBlYXIgPSBvbkVudGVyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkID0gb25FbnRlckNhbmNlbGxlZFxuICB9ID0gYmFzZVByb3BzO1xuICBjb25zdCBmaW5pc2hFbnRlciA9IChlbCwgaXNBcHBlYXIsIGRvbmUpID0+IHtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhckFjdGl2ZUNsYXNzIDogZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgZG9uZSAmJiBkb25lKCk7XG4gIH07XG4gIGNvbnN0IGZpbmlzaExlYXZlID0gKGVsLCBkb25lKSA9PiB7XG4gICAgZWwuX2lzTGVhdmluZyA9IGZhbHNlO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBtYWtlRW50ZXJIb29rID0gKGlzQXBwZWFyKSA9PiB7XG4gICAgcmV0dXJuIChlbCwgZG9uZSkgPT4ge1xuICAgICAgY29uc3QgaG9vayA9IGlzQXBwZWFyID8gb25BcHBlYXIgOiBvbkVudGVyO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaEVudGVyKGVsLCBpc0FwcGVhciwgZG9uZSk7XG4gICAgICBjYWxsSG9vayhob29rLCBbZWwsIHJlc29sdmVdKTtcbiAgICAgIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJGcm9tQ2xhc3MgOiBlbnRlckZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJUb0NsYXNzIDogZW50ZXJUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKGhvb2spKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBlbnRlckR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGV4dGVuZChiYXNlUHJvcHMsIHtcbiAgICBvbkJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUVudGVyLCBbZWxdKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBlbnRlckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uQmVmb3JlQXBwZWFyKGVsKSB7XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUFwcGVhciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckZyb21DbGFzcyk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGFwcGVhckFjdGl2ZUNsYXNzKTtcbiAgICB9LFxuICAgIG9uRW50ZXI6IG1ha2VFbnRlckhvb2soZmFsc2UpLFxuICAgIG9uQXBwZWFyOiBtYWtlRW50ZXJIb29rKHRydWUpLFxuICAgIG9uTGVhdmUoZWwsIGRvbmUpIHtcbiAgICAgIGVsLl9pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IGZpbmlzaExlYXZlKGVsLCBkb25lKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgZm9yY2VSZWZsb3coKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAoIWVsLl9pc0xlYXZpbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUZyb21DbGFzcyk7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVUb0NsYXNzKTtcbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdENhbGxiYWNrKG9uTGVhdmUpKSB7XG4gICAgICAgICAgd2hlblRyYW5zaXRpb25FbmRzKGVsLCB0eXBlLCBsZWF2ZUR1cmF0aW9uLCByZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlLCBbZWwsIHJlc29sdmVdKTtcbiAgICB9LFxuICAgIG9uRW50ZXJDYW5jZWxsZWQoZWwpIHtcbiAgICAgIGZpbmlzaEVudGVyKGVsLCBmYWxzZSk7XG4gICAgICBjYWxsSG9vayhvbkVudGVyQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9LFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgdHJ1ZSk7XG4gICAgICBjYWxsSG9vayhvbkFwcGVhckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkxlYXZlQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hMZWF2ZShlbCk7XG4gICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChpc09iamVjdChkdXJhdGlvbikpIHtcbiAgICByZXR1cm4gW051bWJlck9mKGR1cmF0aW9uLmVudGVyKSwgTnVtYmVyT2YoZHVyYXRpb24ubGVhdmUpXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBuID0gTnVtYmVyT2YoZHVyYXRpb24pO1xuICAgIHJldHVybiBbbiwgbl07XG4gIH1cbn1cbmZ1bmN0aW9uIE51bWJlck9mKHZhbCkge1xuICBjb25zdCByZXMgPSB0b051bWJlcih2YWwpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcihyZXMsIFwiPHRyYW5zaXRpb24+IGV4cGxpY2l0IGR1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICAoZWxbdnRjS2V5XSB8fCAoZWxbdnRjS2V5XSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5hZGQoY2xzKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgY2xzKSB7XG4gIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgZWwuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZGVsZXRlKGNscyk7XG4gICAgaWYgKCFfdnRjLnNpemUpIHtcbiAgICAgIGVsW3Z0Y0tleV0gPSB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBuZXh0RnJhbWUoY2IpIHtcbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2IpO1xuICB9KTtcbn1cbmxldCBlbmRJZCA9IDA7XG5mdW5jdGlvbiB3aGVuVHJhbnNpdGlvbkVuZHMoZWwsIGV4cGVjdGVkVHlwZSwgZXhwbGljaXRUaW1lb3V0LCByZXNvbHZlKSB7XG4gIGNvbnN0IGlkID0gZWwuX2VuZElkID0gKytlbmRJZDtcbiAgY29uc3QgcmVzb2x2ZUlmTm90U3RhbGUgPSAoKSA9PiB7XG4gICAgaWYgKGlkID09PSBlbC5fZW5kSWQpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9XG4gIH07XG4gIGlmIChleHBsaWNpdFRpbWVvdXQpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChyZXNvbHZlSWZOb3RTdGFsZSwgZXhwbGljaXRUaW1lb3V0KTtcbiAgfVxuICBjb25zdCB7IHR5cGUsIHRpbWVvdXQsIHByb3BDb3VudCB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSk7XG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiByZXNvbHZlKCk7XG4gIH1cbiAgY29uc3QgZW5kRXZlbnQgPSB0eXBlICsgXCJlbmRcIjtcbiAgbGV0IGVuZGVkID0gMDtcbiAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZW5kRXZlbnQsIG9uRW5kKTtcbiAgICByZXNvbHZlSWZOb3RTdGFsZSgpO1xuICB9O1xuICBjb25zdCBvbkVuZCA9IChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBlbCAmJiArK2VuZGVkID49IHByb3BDb3VudCkge1xuICAgICAgZW5kKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoZW5kZWQgPCBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfSwgdGltZW91dCArIDEpO1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uSW5mbyhlbCwgZXhwZWN0ZWRUeXBlKSB7XG4gIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgY29uc3QgZ2V0U3R5bGVQcm9wZXJ0aWVzID0gKGtleSkgPT4gKHN0eWxlc1trZXldIHx8IFwiXCIpLnNwbGl0KFwiLCBcIik7XG4gIGNvbnN0IHRyYW5zaXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7VFJBTlNJVElPTn1EZWxheWApO1xuICBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb25zID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgdHJhbnNpdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KHRyYW5zaXRpb25EZWxheXMsIHRyYW5zaXRpb25EdXJhdGlvbnMpO1xuICBjb25zdCBhbmltYXRpb25EZWxheXMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfURlbGF5YCk7XG4gIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtBTklNQVRJT059RHVyYXRpb25gKTtcbiAgY29uc3QgYW5pbWF0aW9uVGltZW91dCA9IGdldFRpbWVvdXQoYW5pbWF0aW9uRGVsYXlzLCBhbmltYXRpb25EdXJhdGlvbnMpO1xuICBsZXQgdHlwZSA9IG51bGw7XG4gIGxldCB0aW1lb3V0ID0gMDtcbiAgbGV0IHByb3BDb3VudCA9IDA7XG4gIGlmIChleHBlY3RlZFR5cGUgPT09IFRSQU5TSVRJT04pIHtcbiAgICBpZiAodHJhbnNpdGlvblRpbWVvdXQgPiAwKSB7XG4gICAgICB0eXBlID0gVFJBTlNJVElPTjtcbiAgICAgIHRpbWVvdXQgPSB0cmFuc2l0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IEFOSU1BVElPTikge1xuICAgIGlmIChhbmltYXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IEFOSU1BVElPTjtcbiAgICAgIHRpbWVvdXQgPSBhbmltYXRpb25UaW1lb3V0O1xuICAgICAgcHJvcENvdW50ID0gYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGltZW91dCA9IE1hdGgubWF4KHRyYW5zaXRpb25UaW1lb3V0LCBhbmltYXRpb25UaW1lb3V0KTtcbiAgICB0eXBlID0gdGltZW91dCA+IDAgPyB0cmFuc2l0aW9uVGltZW91dCA+IGFuaW1hdGlvblRpbWVvdXQgPyBUUkFOU0lUSU9OIDogQU5JTUFUSU9OIDogbnVsbDtcbiAgICBwcm9wQ291bnQgPSB0eXBlID8gdHlwZSA9PT0gVFJBTlNJVElPTiA/IHRyYW5zaXRpb25EdXJhdGlvbnMubGVuZ3RoIDogYW5pbWF0aW9uRHVyYXRpb25zLmxlbmd0aCA6IDA7XG4gIH1cbiAgY29uc3QgaGFzVHJhbnNmb3JtID0gdHlwZSA9PT0gVFJBTlNJVElPTiAmJiAvXFxiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLnRlc3QoXG4gICAgZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059UHJvcGVydHlgKS50b1N0cmluZygpXG4gICk7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICB0aW1lb3V0LFxuICAgIHByb3BDb3VudCxcbiAgICBoYXNUcmFuc2Zvcm1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdldFRpbWVvdXQoZGVsYXlzLCBkdXJhdGlvbnMpIHtcbiAgd2hpbGUgKGRlbGF5cy5sZW5ndGggPCBkdXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgZGVsYXlzID0gZGVsYXlzLmNvbmNhdChkZWxheXMpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heCguLi5kdXJhdGlvbnMubWFwKChkLCBpKSA9PiB0b01zKGQpICsgdG9NcyhkZWxheXNbaV0pKSk7XG59XG5mdW5jdGlvbiB0b01zKHMpIHtcbiAgaWYgKHMgPT09IFwiYXV0b1wiKVxuICAgIHJldHVybiAwO1xuICByZXR1cm4gTnVtYmVyKHMuc2xpY2UoMCwgLTEpLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSkgKiAxZTM7XG59XG5mdW5jdGlvbiBmb3JjZVJlZmxvdygpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBwYXRjaENsYXNzKGVsLCB2YWx1ZSwgaXNTVkcpIHtcbiAgY29uc3QgdHJhbnNpdGlvbkNsYXNzZXMgPSBlbFt2dGNLZXldO1xuICBpZiAodHJhbnNpdGlvbkNsYXNzZXMpIHtcbiAgICB2YWx1ZSA9ICh2YWx1ZSA/IFt2YWx1ZSwgLi4udHJhbnNpdGlvbkNsYXNzZXNdIDogWy4uLnRyYW5zaXRpb25DbGFzc2VzXSkuam9pbihcIiBcIik7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcbiAgfSBlbHNlIGlmIChpc1NWRykge1xuICAgIGVsLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5jbGFzc05hbWUgPSB2YWx1ZTtcbiAgfVxufVxuXG5jb25zdCB2U2hvd09sZEtleSA9IFN5bWJvbChcIl92b2RcIik7XG5jb25zdCB2U2hvdyA9IHtcbiAgYmVmb3JlTW91bnQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBlbFt2U2hvd09sZEtleV0gPSBlbC5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBlbC5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICh0cmFuc2l0aW9uICYmIHZhbHVlKSB7XG4gICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgaWYgKCF2YWx1ZSA9PT0gIW9sZFZhbHVlKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgIHNldERpc3BsYXkoZWwsIHRydWUpO1xuICAgICAgICB0cmFuc2l0aW9uLmVudGVyKGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24ubGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICBzZXREaXNwbGF5KGVsLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9LFxuICBiZWZvcmVVbm1vdW50KGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gIH1cbn07XG5mdW5jdGlvbiBzZXREaXNwbGF5KGVsLCB2YWx1ZSkge1xuICBlbC5zdHlsZS5kaXNwbGF5ID0gdmFsdWUgPyBlbFt2U2hvd09sZEtleV0gOiBcIm5vbmVcIjtcbn1cbmZ1bmN0aW9uIGluaXRWU2hvd0ZvclNTUigpIHtcbiAgdlNob3cuZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgc3R5bGU6IHsgZGlzcGxheTogXCJub25lXCIgfSB9O1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gcGF0Y2hTdHlsZShlbCwgcHJldiwgbmV4dCkge1xuICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICBjb25zdCBpc0Nzc1N0cmluZyA9IGlzU3RyaW5nKG5leHQpO1xuICBpZiAobmV4dCAmJiAhaXNDc3NTdHJpbmcpIHtcbiAgICBpZiAocHJldiAmJiAhaXNTdHJpbmcocHJldikpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByZXYpIHtcbiAgICAgICAgaWYgKG5leHRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV4dCkge1xuICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgbmV4dFtrZXldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY3VycmVudERpc3BsYXkgPSBzdHlsZS5kaXNwbGF5O1xuICAgIGlmIChpc0Nzc1N0cmluZykge1xuICAgICAgaWYgKHByZXYgIT09IG5leHQpIHtcbiAgICAgICAgc3R5bGUuY3NzVGV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcmV2KSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICB9XG4gICAgaWYgKHZTaG93T2xkS2V5IGluIGVsKSB7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gY3VycmVudERpc3BsYXk7XG4gICAgfVxuICB9XG59XG5jb25zdCBzZW1pY29sb25SRSA9IC9bXlxcXFxdO1xccyokLztcbmNvbnN0IGltcG9ydGFudFJFID0gL1xccyohaW1wb3J0YW50JC87XG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdmFsKSB7XG4gIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICB2YWwuZm9yRWFjaCgodikgPT4gc2V0U3R5bGUoc3R5bGUsIG5hbWUsIHYpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsID09IG51bGwpXG4gICAgICB2YWwgPSBcIlwiO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoc2VtaWNvbG9uUkUudGVzdCh2YWwpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgc2VtaWNvbG9uIGF0IHRoZSBlbmQgb2YgJyR7bmFtZX0nIHN0eWxlIHZhbHVlOiAnJHt2YWx9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICBzdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmVmaXhlZCA9IGF1dG9QcmVmaXgoc3R5bGUsIG5hbWUpO1xuICAgICAgaWYgKGltcG9ydGFudFJFLnRlc3QodmFsKSkge1xuICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgICBoeXBoZW5hdGUocHJlZml4ZWQpLFxuICAgICAgICAgIHZhbC5yZXBsYWNlKGltcG9ydGFudFJFLCBcIlwiKSxcbiAgICAgICAgICBcImltcG9ydGFudFwiXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHlsZVtwcmVmaXhlZF0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jb25zdCBwcmVmaXhlcyA9IFtcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCJdO1xuY29uc3QgcHJlZml4Q2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGF1dG9QcmVmaXgoc3R5bGUsIHJhd05hbWUpIHtcbiAgY29uc3QgY2FjaGVkID0gcHJlZml4Q2FjaGVbcmF3TmFtZV07XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGxldCBuYW1lID0gY2FtZWxpemUocmF3TmFtZSk7XG4gIGlmIChuYW1lICE9PSBcImZpbHRlclwiICYmIG5hbWUgaW4gc3R5bGUpIHtcbiAgICByZXR1cm4gcHJlZml4Q2FjaGVbcmF3TmFtZV0gPSBuYW1lO1xuICB9XG4gIG5hbWUgPSBjYXBpdGFsaXplKG5hbWUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJlZml4ZWQgPSBwcmVmaXhlc1tpXSArIG5hbWU7XG4gICAgaWYgKHByZWZpeGVkIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4Q2FjaGVbcmF3TmFtZV0gPSBwcmVmaXhlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJhd05hbWU7XG59XG5cbmNvbnN0IHhsaW5rTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIjtcbmZ1bmN0aW9uIHBhdGNoQXR0cihlbCwga2V5LCB2YWx1ZSwgaXNTVkcsIGluc3RhbmNlKSB7XG4gIGlmIChpc1NWRyAmJiBrZXkuc3RhcnRzV2l0aChcInhsaW5rOlwiKSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXkuc2xpY2UoNiwga2V5Lmxlbmd0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGVOUyh4bGlua05TLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNCb29sZWFuID0gaXNTcGVjaWFsQm9vbGVhbkF0dHIoa2V5KTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBpc0Jvb2xlYW4gJiYgIWluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSkpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCBpc0Jvb2xlYW4gPyBcIlwiIDogdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRjaERPTVByb3AoZWwsIGtleSwgdmFsdWUsIHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdW5tb3VudENoaWxkcmVuKSB7XG4gIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICBpZiAocHJldkNoaWxkcmVuKSB7XG4gICAgICB1bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gICAgZWxba2V5XSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGVsLl92YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgOiBlbC52YWx1ZTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG5lZWRSZW1vdmUgPSBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGVsW2tleV07XG4gICAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICB2YWx1ZSA9IGluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsICYmIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdmFsdWUgPSAwO1xuICAgICAgbmVlZFJlbW92ZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgZWxba2V5XSA9IHZhbHVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIW5lZWRSZW1vdmUpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgc2V0dGluZyBwcm9wIFwiJHtrZXl9XCIgb24gPCR7dGFnLnRvTG93ZXJDYXNlKCl9PjogdmFsdWUgJHt2YWx1ZX0gaXMgaW52YWxpZC5gLFxuICAgICAgICBlXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBuZWVkUmVtb3ZlICYmIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xufVxuY29uc3QgdmVpS2V5ID0gU3ltYm9sKFwiX3ZlaVwiKTtcbmZ1bmN0aW9uIHBhdGNoRXZlbnQoZWwsIHJhd05hbWUsIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBpbnN0YW5jZSA9IG51bGwpIHtcbiAgY29uc3QgaW52b2tlcnMgPSBlbFt2ZWlLZXldIHx8IChlbFt2ZWlLZXldID0ge30pO1xuICBjb25zdCBleGlzdGluZ0ludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXTtcbiAgaWYgKG5leHRWYWx1ZSAmJiBleGlzdGluZ0ludm9rZXIpIHtcbiAgICBleGlzdGluZ0ludm9rZXIudmFsdWUgPSBuZXh0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW25hbWUsIG9wdGlvbnNdID0gcGFyc2VOYW1lKHJhd05hbWUpO1xuICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgIGNvbnN0IGludm9rZXIgPSBpbnZva2Vyc1tyYXdOYW1lXSA9IGNyZWF0ZUludm9rZXIobmV4dFZhbHVlLCBpbnN0YW5jZSk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBuYW1lLCBpbnZva2VyLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nSW52b2tlcikge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgZXhpc3RpbmdJbnZva2VyLCBvcHRpb25zKTtcbiAgICAgIGludm9rZXJzW3Jhd05hbWVdID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuY29uc3Qgb3B0aW9uc01vZGlmaWVyUkUgPSAvKD86T25jZXxQYXNzaXZlfENhcHR1cmUpJC87XG5mdW5jdGlvbiBwYXJzZU5hbWUobmFtZSkge1xuICBsZXQgb3B0aW9ucztcbiAgaWYgKG9wdGlvbnNNb2RpZmllclJFLnRlc3QobmFtZSkpIHtcbiAgICBvcHRpb25zID0ge307XG4gICAgbGV0IG07XG4gICAgd2hpbGUgKG0gPSBuYW1lLm1hdGNoKG9wdGlvbnNNb2RpZmllclJFKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sZW5ndGggLSBtWzBdLmxlbmd0aCk7XG4gICAgICBvcHRpb25zW21bMF0udG9Mb3dlckNhc2UoKV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudCA9IG5hbWVbMl0gPT09IFwiOlwiID8gbmFtZS5zbGljZSgzKSA6IGh5cGhlbmF0ZShuYW1lLnNsaWNlKDIpKTtcbiAgcmV0dXJuIFtldmVudCwgb3B0aW9uc107XG59XG5sZXQgY2FjaGVkTm93ID0gMDtcbmNvbnN0IHAgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5jb25zdCBnZXROb3cgPSAoKSA9PiBjYWNoZWROb3cgfHwgKHAudGhlbigoKSA9PiBjYWNoZWROb3cgPSAwKSwgY2FjaGVkTm93ID0gRGF0ZS5ub3coKSk7XG5mdW5jdGlvbiBjcmVhdGVJbnZva2VyKGluaXRpYWxWYWx1ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3QgaW52b2tlciA9IChlKSA9PiB7XG4gICAgaWYgKCFlLl92dHMpIHtcbiAgICAgIGUuX3Z0cyA9IERhdGUubm93KCk7XG4gICAgfSBlbHNlIGlmIChlLl92dHMgPD0gaW52b2tlci5hdHRhY2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIGludm9rZXIudmFsdWUpLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA1LFxuICAgICAgW2VdXG4gICAgKTtcbiAgfTtcbiAgaW52b2tlci52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgaW52b2tlci5hdHRhY2hlZCA9IGdldE5vdygpO1xuICByZXR1cm4gaW52b2tlcjtcbn1cbmZ1bmN0aW9uIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG9yaWdpbmFsU3RvcCA9IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgb3JpZ2luYWxTdG9wLmNhbGwoZSk7XG4gICAgICBlLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGZuKSA9PiAoZTIpID0+ICFlMi5fc3RvcHBlZCAmJiBmbiAmJiBmbihlMikpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5jb25zdCBuYXRpdmVPblJFID0gL15vblthLXpdLztcbmNvbnN0IHBhdGNoUHJvcCA9IChlbCwga2V5LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaXNTVkcgPSBmYWxzZSwgcHJldkNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB1bm1vdW50Q2hpbGRyZW4pID0+IHtcbiAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgcGF0Y2hDbGFzcyhlbCwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICBwYXRjaFN0eWxlKGVsLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSk7XG4gIH0gZWxzZSBpZiAoaXNPbihrZXkpKSB7XG4gICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSkge1xuICAgICAgcGF0Y2hFdmVudChlbCwga2V5LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoa2V5WzBdID09PSBcIi5cIiA/IChrZXkgPSBrZXkuc2xpY2UoMSksIHRydWUpIDoga2V5WzBdID09PSBcIl5cIiA/IChrZXkgPSBrZXkuc2xpY2UoMSksIGZhbHNlKSA6IHNob3VsZFNldEFzUHJvcChlbCwga2V5LCBuZXh0VmFsdWUsIGlzU1ZHKSkge1xuICAgIHBhdGNoRE9NUHJvcChcbiAgICAgIGVsLFxuICAgICAga2V5LFxuICAgICAgbmV4dFZhbHVlLFxuICAgICAgcHJldkNoaWxkcmVuLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICB1bm1vdW50Q2hpbGRyZW5cbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGlmIChrZXkgPT09IFwidHJ1ZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fdHJ1ZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImZhbHNlLXZhbHVlXCIpIHtcbiAgICAgIGVsLl9mYWxzZVZhbHVlID0gbmV4dFZhbHVlO1xuICAgIH1cbiAgICBwYXRjaEF0dHIoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRyk7XG4gIH1cbn07XG5mdW5jdGlvbiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgdmFsdWUsIGlzU1ZHKSB7XG4gIGlmIChpc1NWRykge1xuICAgIGlmIChrZXkgPT09IFwiaW5uZXJIVE1MXCIgfHwga2V5ID09PSBcInRleHRDb250ZW50XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoa2V5IGluIGVsICYmIG5hdGl2ZU9uUkUudGVzdChrZXkpICYmIGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwic3BlbGxjaGVja1wiIHx8IGtleSA9PT0gXCJkcmFnZ2FibGVcIiB8fCBrZXkgPT09IFwidHJhbnNsYXRlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJmb3JtXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJsaXN0XCIgJiYgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwidHlwZVwiICYmIGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobmF0aXZlT25SRS50ZXN0KGtleSkgJiYgaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBrZXkgaW4gZWw7XG59XG5cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgaHlkcmF0ZTIpIHtcbiAgY29uc3QgQ29tcCA9IGRlZmluZUNvbXBvbmVudChvcHRpb25zKTtcbiAgY2xhc3MgVnVlQ3VzdG9tRWxlbWVudCBleHRlbmRzIFZ1ZUVsZW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKGluaXRpYWxQcm9wcykge1xuICAgICAgc3VwZXIoQ29tcCwgaW5pdGlhbFByb3BzLCBoeWRyYXRlMik7XG4gICAgfVxuICB9XG4gIFZ1ZUN1c3RvbUVsZW1lbnQuZGVmID0gQ29tcDtcbiAgcmV0dXJuIFZ1ZUN1c3RvbUVsZW1lbnQ7XG59XG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmNvbnN0IGRlZmluZVNTUkN1c3RvbUVsZW1lbnQgPSAvKiBAX19OT19TSURFX0VGRkVDVFNfXyAqLyAob3B0aW9ucykgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGRlZmluZUN1c3RvbUVsZW1lbnQob3B0aW9ucywgaHlkcmF0ZSk7XG59O1xuY29uc3QgQmFzZUNsYXNzID0gdHlwZW9mIEhUTUxFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gSFRNTEVsZW1lbnQgOiBjbGFzcyB7XG59O1xuY2xhc3MgVnVlRWxlbWVudCBleHRlbmRzIEJhc2VDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKF9kZWYsIF9wcm9wcyA9IHt9LCBoeWRyYXRlMikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZGVmID0gX2RlZjtcbiAgICB0aGlzLl9wcm9wcyA9IF9wcm9wcztcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bGw7XG4gICAgdGhpcy5fb2IgPSBudWxsO1xuICAgIGlmICh0aGlzLnNoYWRvd1Jvb3QgJiYgaHlkcmF0ZTIpIHtcbiAgICAgIGh5ZHJhdGUyKHRoaXMuX2NyZWF0ZVZOb2RlKCksIHRoaXMuc2hhZG93Um9vdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRoaXMuc2hhZG93Um9vdCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBDdXN0b20gZWxlbWVudCBoYXMgcHJlLXJlbmRlcmVkIGRlY2xhcmF0aXZlIHNoYWRvdyByb290IGJ1dCBpcyBub3QgZGVmaW5lZCBhcyBoeWRyYXRhYmxlLiBVc2UgXFxgZGVmaW5lU1NSQ3VzdG9tRWxlbWVudFxcYC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiIH0pO1xuICAgICAgaWYgKCF0aGlzLl9kZWYuX19hc3luY0xvYWRlcikge1xuICAgICAgICB0aGlzLl9yZXNvbHZlUHJvcHModGhpcy5fZGVmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICBpZiAodGhpcy5fcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNvbHZlRGVmKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9vYikge1xuICAgICAgdGhpcy5fb2IuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5fb2IgPSBudWxsO1xuICAgIH1cbiAgICBuZXh0VGljaygoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkge1xuICAgICAgICByZW5kZXIobnVsbCwgdGhpcy5zaGFkb3dSb290KTtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiByZXNvbHZlIGlubmVyIGNvbXBvbmVudCBkZWZpbml0aW9uIChoYW5kbGUgcG9zc2libGUgYXN5bmMgY29tcG9uZW50KVxuICAgKi9cbiAgX3Jlc29sdmVEZWYoKSB7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyKHRoaXMuYXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5fb2IgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldEF0dHIobS5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9vYi5vYnNlcnZlKHRoaXMsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICBjb25zdCByZXNvbHZlID0gKGRlZiwgaXNBc3luYyA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCB7IHByb3BzLCBzdHlsZXMgfSA9IGRlZjtcbiAgICAgIGxldCBudW1iZXJQcm9wcztcbiAgICAgIGlmIChwcm9wcyAmJiAhaXNBcnJheShwcm9wcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICBjb25zdCBvcHQgPSBwcm9wc1trZXldO1xuICAgICAgICAgIGlmIChvcHQgPT09IE51bWJlciB8fCBvcHQgJiYgb3B0LnR5cGUgPT09IE51bWJlcikge1xuICAgICAgICAgICAgaWYgKGtleSBpbiB0aGlzLl9wcm9wcykge1xuICAgICAgICAgICAgICB0aGlzLl9wcm9wc1trZXldID0gdG9OdW1iZXIodGhpcy5fcHJvcHNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAobnVtYmVyUHJvcHMgfHwgKG51bWJlclByb3BzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCkpKVtjYW1lbGl6ZSQxKGtleSldID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX251bWJlclByb3BzID0gbnVtYmVyUHJvcHM7XG4gICAgICBpZiAoaXNBc3luYykge1xuICAgICAgICB0aGlzLl9yZXNvbHZlUHJvcHMoZGVmKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKHN0eWxlcyk7XG4gICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9O1xuICAgIGNvbnN0IGFzeW5jRGVmID0gdGhpcy5fZGVmLl9fYXN5bmNMb2FkZXI7XG4gICAgaWYgKGFzeW5jRGVmKSB7XG4gICAgICBhc3luY0RlZigpLnRoZW4oKGRlZikgPT4gcmVzb2x2ZShkZWYsIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSh0aGlzLl9kZWYpO1xuICAgIH1cbiAgfVxuICBfcmVzb2x2ZVByb3BzKGRlZikge1xuICAgIGNvbnN0IHsgcHJvcHMgfSA9IGRlZjtcbiAgICBjb25zdCBkZWNsYXJlZFByb3BLZXlzID0gaXNBcnJheShwcm9wcykgPyBwcm9wcyA6IE9iamVjdC5rZXlzKHByb3BzIHx8IHt9KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzKSkge1xuICAgICAgaWYgKGtleVswXSAhPT0gXCJfXCIgJiYgZGVjbGFyZWRQcm9wS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuX3NldFByb3Aoa2V5LCB0aGlzW2tleV0sIHRydWUsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZGVjbGFyZWRQcm9wS2V5cy5tYXAoY2FtZWxpemUkMSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm9wKGtleSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWwpIHtcbiAgICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9zZXRBdHRyKGtleSkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgY29uc3QgY2FtZWxLZXkgPSBjYW1lbGl6ZSQxKGtleSk7XG4gICAgaWYgKHRoaXMuX251bWJlclByb3BzICYmIHRoaXMuX251bWJlclByb3BzW2NhbWVsS2V5XSkge1xuICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuX3NldFByb3AoY2FtZWxLZXksIHZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2dldFByb3Aoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BzW2tleV07XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NldFByb3Aoa2V5LCB2YWwsIHNob3VsZFJlZmxlY3QgPSB0cnVlLCBzaG91bGRVcGRhdGUgPSB0cnVlKSB7XG4gICAgaWYgKHZhbCAhPT0gdGhpcy5fcHJvcHNba2V5XSkge1xuICAgICAgdGhpcy5fcHJvcHNba2V5XSA9IHZhbDtcbiAgICAgIGlmIChzaG91bGRVcGRhdGUgJiYgdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmVmbGVjdCkge1xuICAgICAgICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSksIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCB2YWwgKyBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghdmFsKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF91cGRhdGUoKSB7XG4gICAgcmVuZGVyKHRoaXMuX2NyZWF0ZVZOb2RlKCksIHRoaXMuc2hhZG93Um9vdCk7XG4gIH1cbiAgX2NyZWF0ZVZOb2RlKCkge1xuICAgIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUodGhpcy5fZGVmLCBleHRlbmQoe30sIHRoaXMuX3Byb3BzKSk7XG4gICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgdm5vZGUuY2UgPSAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgaW5zdGFuY2UuaXNDRSA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgaW5zdGFuY2UuY2VSZWxvYWQgPSAobmV3U3R5bGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3R5bGVzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3N0eWxlcy5mb3JFYWNoKChzKSA9PiB0aGlzLnNoYWRvd1Jvb3QucmVtb3ZlQ2hpbGQocykpO1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKG5ld1N0eWxlcyk7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoID0gKGV2ZW50LCBhcmdzKSA9PiB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGV2ZW50LCB7XG4gICAgICAgICAgICAgIGRldGFpbDogYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICBpbnN0YW5jZS5lbWl0ID0gKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgZGlzcGF0Y2goZXZlbnQsIGFyZ3MpO1xuICAgICAgICAgIGlmIChoeXBoZW5hdGUoZXZlbnQpICE9PSBldmVudCkge1xuICAgICAgICAgICAgZGlzcGF0Y2goaHlwaGVuYXRlKGV2ZW50KSwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudCAmJiAocGFyZW50LnBhcmVudE5vZGUgfHwgcGFyZW50Lmhvc3QpKSB7XG4gICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZ1ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLnBhcmVudCA9IHBhcmVudC5faW5zdGFuY2U7XG4gICAgICAgICAgICBpbnN0YW5jZS5wcm92aWRlcyA9IHBhcmVudC5faW5zdGFuY2UucHJvdmlkZXM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBfYXBwbHlTdHlsZXMoc3R5bGVzKSB7XG4gICAgaWYgKHN0eWxlcykge1xuICAgICAgc3R5bGVzLmZvckVhY2goKGNzcykgPT4ge1xuICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICAgICAgICBzLnRleHRDb250ZW50ID0gY3NzO1xuICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQocyk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgKHRoaXMuX3N0eWxlcyB8fCAodGhpcy5fc3R5bGVzID0gW10pKS5wdXNoKHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlQ3NzTW9kdWxlKG5hbWUgPSBcIiRzdHlsZVwiKSB7XG4gIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihgdXNlQ3NzTW9kdWxlIG11c3QgYmUgY2FsbGVkIGluc2lkZSBzZXR1cCgpYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2R1bGVzID0gaW5zdGFuY2UudHlwZS5fX2Nzc01vZHVsZXM7XG4gICAgaWYgKCFtb2R1bGVzKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlcyBpbmplY3RlZC5gKTtcbiAgICAgIHJldHVybiBFTVBUWV9PQko7XG4gICAgfVxuICAgIGNvbnN0IG1vZCA9IG1vZHVsZXNbbmFtZV07XG4gICAgaWYgKCFtb2QpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihgQ3VycmVudCBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIENTUyBtb2R1bGUgbmFtZWQgXCIke25hbWV9XCIuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICByZXR1cm4gbW9kO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUNzc1ZhcnMoZ2V0dGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc1ZhcnMgaXMgY2FsbGVkIHdpdGhvdXQgY3VycmVudCBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB1cGRhdGVUZWxlcG9ydHMgPSBpbnN0YW5jZS51dCA9ICh2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KSkgPT4ge1xuICAgIEFycmF5LmZyb20oXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS12LW93bmVyPVwiJHtpbnN0YW5jZS51aWR9XCJdYClcbiAgICApLmZvckVhY2goKG5vZGUpID0+IHNldFZhcnNPbk5vZGUobm9kZSwgdmFycykpO1xuICB9O1xuICBjb25zdCBzZXRWYXJzID0gKCkgPT4ge1xuICAgIGNvbnN0IHZhcnMgPSBnZXR0ZXIoaW5zdGFuY2UucHJveHkpO1xuICAgIHNldFZhcnNPblZOb2RlKGluc3RhbmNlLnN1YlRyZWUsIHZhcnMpO1xuICAgIHVwZGF0ZVRlbGVwb3J0cyh2YXJzKTtcbiAgfTtcbiAgd2F0Y2hQb3N0RWZmZWN0KHNldFZhcnMpO1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG9iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoc2V0VmFycyk7XG4gICAgb2Iub2JzZXJ2ZShpbnN0YW5jZS5zdWJUcmVlLmVsLnBhcmVudE5vZGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIG9uVW5tb3VudGVkKCgpID0+IG9iLmRpc2Nvbm5lY3QoKSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gc2V0VmFyc09uVk5vZGUodm5vZGUsIHZhcnMpIHtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2U7XG4gICAgdm5vZGUgPSBzdXNwZW5zZS5hY3RpdmVCcmFuY2g7XG4gICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgIXN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goKCkgPT4ge1xuICAgICAgICBzZXRWYXJzT25WTm9kZShzdXNwZW5zZS5hY3RpdmVCcmFuY2gsIHZhcnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHdoaWxlICh2bm9kZS5jb21wb25lbnQpIHtcbiAgICB2bm9kZSA9IHZub2RlLmNvbXBvbmVudC5zdWJUcmVlO1xuICB9XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxICYmIHZub2RlLmVsKSB7XG4gICAgc2V0VmFyc09uTm9kZSh2bm9kZS5lbCwgdmFycyk7XG4gIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjKSA9PiBzZXRWYXJzT25WTm9kZShjLCB2YXJzKSk7XG4gIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gU3RhdGljKSB7XG4gICAgbGV0IHsgZWwsIGFuY2hvciB9ID0gdm5vZGU7XG4gICAgd2hpbGUgKGVsKSB7XG4gICAgICBzZXRWYXJzT25Ob2RlKGVsLCB2YXJzKTtcbiAgICAgIGlmIChlbCA9PT0gYW5jaG9yKVxuICAgICAgICBicmVhaztcbiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRWYXJzT25Ob2RlKGVsLCB2YXJzKSB7XG4gIGlmIChlbC5ub2RlVHlwZSA9PT0gMSkge1xuICAgIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFycykge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0tJHtrZXl9YCwgdmFyc1trZXldKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG5ld1Bvc2l0aW9uTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBtb3ZlQ2JLZXkgPSBTeW1ib2woXCJfbW92ZUNiXCIpO1xuY29uc3QgZW50ZXJDYktleSA9IFN5bWJvbChcIl9lbnRlckNiXCIpO1xuY29uc3QgVHJhbnNpdGlvbkdyb3VwSW1wbCA9IHtcbiAgbmFtZTogXCJUcmFuc2l0aW9uR3JvdXBcIixcbiAgcHJvcHM6IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoe30sIFRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIHtcbiAgICB0YWc6IFN0cmluZyxcbiAgICBtb3ZlQ2xhc3M6IFN0cmluZ1xuICB9KSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB1c2VUcmFuc2l0aW9uU3RhdGUoKTtcbiAgICBsZXQgcHJldkNoaWxkcmVuO1xuICAgIGxldCBjaGlsZHJlbjtcbiAgICBvblVwZGF0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFwcmV2Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmVDbGFzcyA9IHByb3BzLm1vdmVDbGFzcyB8fCBgJHtwcm9wcy5uYW1lIHx8IFwidlwifS1tb3ZlYDtcbiAgICAgIGlmICghaGFzQ1NTVHJhbnNmb3JtKFxuICAgICAgICBwcmV2Q2hpbGRyZW5bMF0uZWwsXG4gICAgICAgIGluc3RhbmNlLnZub2RlLmVsLFxuICAgICAgICBtb3ZlQ2xhc3NcbiAgICAgICkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2goY2FsbFBlbmRpbmdDYnMpO1xuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2gocmVjb3JkUG9zaXRpb24pO1xuICAgICAgY29uc3QgbW92ZWRDaGlsZHJlbiA9IHByZXZDaGlsZHJlbi5maWx0ZXIoYXBwbHlUcmFuc2xhdGlvbik7XG4gICAgICBmb3JjZVJlZmxvdygpO1xuICAgICAgbW92ZWRDaGlsZHJlbi5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsID0gYy5lbDtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBzdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBcIlwiO1xuICAgICAgICBjb25zdCBjYiA9IGVsW21vdmVDYktleV0gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCBjYik7XG4gICAgICAgICAgICBlbFttb3ZlQ2JLZXldID0gbnVsbDtcbiAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCByYXdQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgIGNvbnN0IGNzc1RyYW5zaXRpb25Qcm9wcyA9IHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpO1xuICAgICAgbGV0IHRhZyA9IHJhd1Byb3BzLnRhZyB8fCBGcmFnbWVudDtcbiAgICAgIHByZXZDaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ID8gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSkgOiBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGA8VHJhbnNpdGlvbkdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJldkNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldkNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBwcmV2Q2hpbGRyZW5baV07XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChjaGlsZCwgY2hpbGQuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodGFnLCBudWxsLCBjaGlsZHJlbik7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IHJlbW92ZU1vZGUgPSAocHJvcHMpID0+IGRlbGV0ZSBwcm9wcy5tb2RlO1xuLyogQF9fUFVSRV9fICovIHJlbW92ZU1vZGUoVHJhbnNpdGlvbkdyb3VwSW1wbC5wcm9wcyk7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXAgPSBUcmFuc2l0aW9uR3JvdXBJbXBsO1xuZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMoYykge1xuICBjb25zdCBlbCA9IGMuZWw7XG4gIGlmIChlbFttb3ZlQ2JLZXldKSB7XG4gICAgZWxbbW92ZUNiS2V5XSgpO1xuICB9XG4gIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgIGVsW2VudGVyQ2JLZXldKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlY29yZFBvc2l0aW9uKGMpIHtcbiAgbmV3UG9zaXRpb25NYXAuc2V0KGMsIGMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xufVxuZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbihjKSB7XG4gIGNvbnN0IG9sZFBvcyA9IHBvc2l0aW9uTWFwLmdldChjKTtcbiAgY29uc3QgbmV3UG9zID0gbmV3UG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7XG4gIGNvbnN0IGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7XG4gIGlmIChkeCB8fCBkeSkge1xuICAgIGNvbnN0IHMgPSBjLmVsLnN0eWxlO1xuICAgIHMudHJhbnNmb3JtID0gcy53ZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7ZHh9cHgsJHtkeX1weClgO1xuICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gXCIwc1wiO1xuICAgIHJldHVybiBjO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDU1NUcmFuc2Zvcm0oZWwsIHJvb3QsIG1vdmVDbGFzcykge1xuICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSgpO1xuICBjb25zdCBfdnRjID0gZWxbdnRjS2V5XTtcbiAgaWYgKF92dGMpIHtcbiAgICBfdnRjLmZvckVhY2goKGNscykgPT4ge1xuICAgICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBjbG9uZS5jbGFzc0xpc3QucmVtb3ZlKGMpKTtcbiAgICB9KTtcbiAgfVxuICBtb3ZlQ2xhc3Muc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5hZGQoYykpO1xuICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIGNvbnN0IGNvbnRhaW5lciA9IHJvb3Qubm9kZVR5cGUgPT09IDEgPyByb290IDogcm9vdC5wYXJlbnROb2RlO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICBjb25zdCB7IGhhc1RyYW5zZm9ybSB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpO1xuICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICByZXR1cm4gaGFzVHJhbnNmb3JtO1xufVxuXG5jb25zdCBnZXRNb2RlbEFzc2lnbmVyID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IGZuID0gdm5vZGUucHJvcHNbXCJvblVwZGF0ZTptb2RlbFZhbHVlXCJdIHx8IGZhbHNlO1xuICByZXR1cm4gaXNBcnJheShmbikgPyAodmFsdWUpID0+IGludm9rZUFycmF5Rm5zKGZuLCB2YWx1ZSkgOiBmbjtcbn07XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uU3RhcnQoZSkge1xuICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZChlKSB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICBpZiAodGFyZ2V0LmNvbXBvc2luZykge1xuICAgIHRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gIH1cbn1cbmNvbnN0IGFzc2lnbktleSA9IFN5bWJvbChcIl9hc3NpZ25cIik7XG5jb25zdCB2TW9kZWxUZXh0ID0ge1xuICBjcmVhdGVkKGVsLCB7IG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBjb25zdCBjYXN0VG9OdW1iZXIgPSBudW1iZXIgfHwgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZSA9PT0gXCJudW1iZXJcIjtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBsYXp5ID8gXCJjaGFuZ2VcIiA6IFwiaW5wdXRcIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC5jb21wb3NpbmcpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGxldCBkb21WYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgaWYgKHRyaW0pIHtcbiAgICAgICAgZG9tVmFsdWUgPSBkb21WYWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoY2FzdFRvTnVtYmVyKSB7XG4gICAgICAgIGRvbVZhbHVlID0gbG9vc2VUb051bWJlcihkb21WYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbFthc3NpZ25LZXldKGRvbVZhbHVlKTtcbiAgICB9KTtcbiAgICBpZiAodHJpbSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICBlbC52YWx1ZSA9IGVsLnZhbHVlLnRyaW0oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWxhenkpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgIH1cbiAgfSxcbiAgLy8gc2V0IHZhbHVlIG9uIG1vdW50ZWQgc28gaXQncyBhZnRlciBtaW4vbWF4IGZvciB0eXBlPVwicmFuZ2VcIlxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBlbC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmIChlbC5jb21wb3NpbmcpXG4gICAgICByZXR1cm47XG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsICYmIGVsLnR5cGUgIT09IFwicmFuZ2VcIikge1xuICAgICAgaWYgKGxhenkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRyaW0gJiYgZWwudmFsdWUudHJpbSgpID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoKG51bWJlciB8fCBlbC50eXBlID09PSBcIm51bWJlclwiKSAmJiBsb29zZVRvTnVtYmVyKGVsLnZhbHVlKSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgaWYgKGVsLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCB2TW9kZWxDaGVja2JveCA9IHtcbiAgLy8gIzQwOTYgYXJyYXkgY2hlY2tib3hlcyBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIF8sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSBlbC5fbW9kZWxWYWx1ZTtcbiAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IGdldFZhbHVlKGVsKTtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBlbC5jaGVja2VkO1xuICAgICAgY29uc3QgYXNzaWduID0gZWxbYXNzaWduS2V5XTtcbiAgICAgIGlmIChpc0FycmF5KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbG9vc2VJbmRleE9mKG1vZGVsVmFsdWUsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gaW5kZXggIT09IC0xO1xuICAgICAgICBpZiAoY2hlY2tlZCAmJiAhZm91bmQpIHtcbiAgICAgICAgICBhc3NpZ24obW9kZWxWYWx1ZS5jb25jYXQoZWxlbWVudFZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQgJiYgZm91bmQpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IFsuLi5tb2RlbFZhbHVlXTtcbiAgICAgICAgICBmaWx0ZXJlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIGFzc2lnbihmaWx0ZXJlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNTZXQobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgY2xvbmVkID0gbmV3IFNldChtb2RlbFZhbHVlKTtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjbG9uZWQuYWRkKGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xvbmVkLmRlbGV0ZShlbGVtZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbihjbG9uZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduKGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgLy8gc2V0IGluaXRpYWwgY2hlY2tlZCBvbiBtb3VudCB0byB3YWl0IGZvciB0cnVlLXZhbHVlL2ZhbHNlLXZhbHVlXG4gIG1vdW50ZWQ6IHNldENoZWNrZWQsXG4gIGJlZm9yZVVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgc2V0Q2hlY2tlZChlbCwgYmluZGluZywgdm5vZGUpO1xuICB9XG59O1xuZnVuY3Rpb24gc2V0Q2hlY2tlZChlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgZWwuX21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTE7XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgZWwuY2hlY2tlZCA9IHZhbHVlLmhhcyh2bm9kZS5wcm9wcy52YWx1ZSk7XG4gIH0gZWxzZSBpZiAodmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIGdldENoZWNrYm94VmFsdWUoZWwsIHRydWUpKTtcbiAgfVxufVxuY29uc3Qgdk1vZGVsUmFkaW8gPSB7XG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbC5jaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpO1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBlbFthc3NpZ25LZXldKGdldFZhbHVlKGVsKSk7XG4gICAgfSk7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCB2TW9kZWxTZWxlY3QgPSB7XG4gIC8vIDxzZWxlY3QgbXVsdGlwbGU+IHZhbHVlIG5lZWQgdG8gYmUgZGVlcCB0cmF2ZXJzZWRcbiAgZGVlcDogdHJ1ZSxcbiAgY3JlYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgY29uc3QgaXNTZXRNb2RlbCA9IGlzU2V0KHZhbHVlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlbC5vcHRpb25zLCAobykgPT4gby5zZWxlY3RlZCkubWFwKFxuICAgICAgICAobykgPT4gbnVtYmVyID8gbG9vc2VUb051bWJlcihnZXRWYWx1ZShvKSkgOiBnZXRWYWx1ZShvKVxuICAgICAgKTtcbiAgICAgIGVsW2Fzc2lnbktleV0oXG4gICAgICAgIGVsLm11bHRpcGxlID8gaXNTZXRNb2RlbCA/IG5ldyBTZXQoc2VsZWN0ZWRWYWwpIDogc2VsZWN0ZWRWYWwgOiBzZWxlY3RlZFZhbFswXVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gIH0sXG4gIC8vIHNldCB2YWx1ZSBpbiBtb3VudGVkICYgdXBkYXRlZCBiZWNhdXNlIDxzZWxlY3Q+IHJlbGllcyBvbiBpdHMgY2hpbGRyZW5cbiAgLy8gPG9wdGlvbj5zLlxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXRTZWxlY3RlZChlbCwgdmFsdWUpO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIF9iaW5kaW5nLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgfSxcbiAgdXBkYXRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSkge1xuICBjb25zdCBpc011bHRpcGxlID0gZWwubXVsdGlwbGU7XG4gIGlmIChpc011bHRpcGxlICYmICFpc0FycmF5KHZhbHVlKSAmJiAhaXNTZXQodmFsdWUpKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgYDxzZWxlY3QgbXVsdGlwbGUgdi1tb2RlbD4gZXhwZWN0cyBhbiBBcnJheSBvciBTZXQgdmFsdWUgZm9yIGl0cyBiaW5kaW5nLCBidXQgZ290ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSl9LmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGxldCBpID0gMCwgbCA9IGVsLm9wdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gZWwub3B0aW9uc1tpXTtcbiAgICBjb25zdCBvcHRpb25WYWx1ZSA9IGdldFZhbHVlKG9wdGlvbik7XG4gICAgaWYgKGlzTXVsdGlwbGUpIHtcbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIG9wdGlvblZhbHVlKSA+IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWUuaGFzKG9wdGlvblZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxvb3NlRXF1YWwoZ2V0VmFsdWUob3B0aW9uKSwgdmFsdWUpKSB7XG4gICAgICAgIGlmIChlbC5zZWxlY3RlZEluZGV4ICE9PSBpKVxuICAgICAgICAgIGVsLnNlbGVjdGVkSW5kZXggPSBpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNNdWx0aXBsZSAmJiBlbC5zZWxlY3RlZEluZGV4ICE9PSAtMSkge1xuICAgIGVsLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VmFsdWUoZWwpIHtcbiAgcmV0dXJuIFwiX3ZhbHVlXCIgaW4gZWwgPyBlbC5fdmFsdWUgOiBlbC52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpIHtcbiAgY29uc3Qga2V5ID0gY2hlY2tlZCA/IFwiX3RydWVWYWx1ZVwiIDogXCJfZmFsc2VWYWx1ZVwiO1xuICByZXR1cm4ga2V5IGluIGVsID8gZWxba2V5XSA6IGNoZWNrZWQ7XG59XG5jb25zdCB2TW9kZWxEeW5hbWljID0ge1xuICBjcmVhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcImNyZWF0ZWRcIik7XG4gIH0sXG4gIG1vdW50ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwibW91bnRlZFwiKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJiZWZvcmVVcGRhdGVcIik7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcInVwZGF0ZWRcIik7XG4gIH1cbn07XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY01vZGVsKHRhZ05hbWUsIHR5cGUpIHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcIlNFTEVDVFwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFNlbGVjdDtcbiAgICBjYXNlIFwiVEVYVEFSRUFcIjpcbiAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgIGRlZmF1bHQ6XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbENoZWNrYm94O1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsUmFkaW87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIGhvb2spIHtcbiAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgZWwudGFnTmFtZSxcbiAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICk7XG4gIGNvbnN0IGZuID0gbW9kZWxUb1VzZVtob29rXTtcbiAgZm4gJiYgZm4oZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpO1xufVxuZnVuY3Rpb24gaW5pdFZNb2RlbEZvclNTUigpIHtcbiAgdk1vZGVsVGV4dC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0pID0+ICh7IHZhbHVlIH0pO1xuICB2TW9kZWxSYWRpby5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlRXF1YWwodm5vZGUucHJvcHMudmFsdWUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsQ2hlY2tib3guZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIGxvb3NlSW5kZXhPZih2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgIH1cbiAgfTtcbiAgdk1vZGVsRHluYW1pYy5nZXRTU1JQcm9wcyA9IChiaW5kaW5nLCB2bm9kZSkgPT4ge1xuICAgIGlmICh0eXBlb2Ygdm5vZGUudHlwZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICAgIC8vIHJlc29sdmVEeW5hbWljTW9kZWwgZXhwZWN0cyBhbiB1cHBlcmNhc2UgdGFnIG5hbWUsIGJ1dCB2bm9kZS50eXBlIGlzIGxvd2VyY2FzZVxuICAgICAgdm5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICAgICk7XG4gICAgaWYgKG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMpIHtcbiAgICAgIHJldHVybiBtb2RlbFRvVXNlLmdldFNTUlByb3BzKGJpbmRpbmcsIHZub2RlKTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IHN5c3RlbU1vZGlmaWVycyA9IFtcImN0cmxcIiwgXCJzaGlmdFwiLCBcImFsdFwiLCBcIm1ldGFcIl07XG5jb25zdCBtb2RpZmllckd1YXJkcyA9IHtcbiAgc3RvcDogKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCksXG4gIHByZXZlbnQ6IChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCksXG4gIHNlbGY6IChlKSA9PiBlLnRhcmdldCAhPT0gZS5jdXJyZW50VGFyZ2V0LFxuICBjdHJsOiAoZSkgPT4gIWUuY3RybEtleSxcbiAgc2hpZnQ6IChlKSA9PiAhZS5zaGlmdEtleSxcbiAgYWx0OiAoZSkgPT4gIWUuYWx0S2V5LFxuICBtZXRhOiAoZSkgPT4gIWUubWV0YUtleSxcbiAgbGVmdDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMCxcbiAgbWlkZGxlOiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAxLFxuICByaWdodDogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMixcbiAgZXhhY3Q6IChlLCBtb2RpZmllcnMpID0+IHN5c3RlbU1vZGlmaWVycy5zb21lKChtKSA9PiBlW2Ake219S2V5YF0gJiYgIW1vZGlmaWVycy5pbmNsdWRlcyhtKSlcbn07XG5jb25zdCB3aXRoTW9kaWZpZXJzID0gKGZuLCBtb2RpZmllcnMpID0+IHtcbiAgcmV0dXJuIChldmVudCwgLi4uYXJncykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBndWFyZCA9IG1vZGlmaWVyR3VhcmRzW21vZGlmaWVyc1tpXV07XG4gICAgICBpZiAoZ3VhcmQgJiYgZ3VhcmQoZXZlbnQsIG1vZGlmaWVycykpXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGZuKGV2ZW50LCAuLi5hcmdzKTtcbiAgfTtcbn07XG5jb25zdCBrZXlOYW1lcyA9IHtcbiAgZXNjOiBcImVzY2FwZVwiLFxuICBzcGFjZTogXCIgXCIsXG4gIHVwOiBcImFycm93LXVwXCIsXG4gIGxlZnQ6IFwiYXJyb3ctbGVmdFwiLFxuICByaWdodDogXCJhcnJvdy1yaWdodFwiLFxuICBkb3duOiBcImFycm93LWRvd25cIixcbiAgZGVsZXRlOiBcImJhY2tzcGFjZVwiXG59O1xuY29uc3Qgd2l0aEtleXMgPSAoZm4sIG1vZGlmaWVycykgPT4ge1xuICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCEoXCJrZXlcIiBpbiBldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRLZXkgPSBoeXBoZW5hdGUoZXZlbnQua2V5KTtcbiAgICBpZiAobW9kaWZpZXJzLnNvbWUoKGspID0+IGsgPT09IGV2ZW50S2V5IHx8IGtleU5hbWVzW2tdID09PSBldmVudEtleSkpIHtcbiAgICAgIHJldHVybiBmbihldmVudCk7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgcmVuZGVyZXJPcHRpb25zID0gLyogQF9fUFVSRV9fICovIGV4dGVuZCh7IHBhdGNoUHJvcCB9LCBub2RlT3BzKTtcbmxldCByZW5kZXJlcjtcbmxldCBlbmFibGVkSHlkcmF0aW9uID0gZmFsc2U7XG5mdW5jdGlvbiBlbnN1cmVSZW5kZXJlcigpIHtcbiAgcmV0dXJuIHJlbmRlcmVyIHx8IChyZW5kZXJlciA9IGNyZWF0ZVJlbmRlcmVyKHJlbmRlcmVyT3B0aW9ucykpO1xufVxuZnVuY3Rpb24gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKSB7XG4gIHJlbmRlcmVyID0gZW5hYmxlZEh5ZHJhdGlvbiA/IHJlbmRlcmVyIDogY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKTtcbiAgZW5hYmxlZEh5ZHJhdGlvbiA9IHRydWU7XG4gIHJldHVybiByZW5kZXJlcjtcbn1cbmNvbnN0IHJlbmRlciA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZVJlbmRlcmVyKCkucmVuZGVyKC4uLmFyZ3MpO1xufTtcbmNvbnN0IGh5ZHJhdGUgPSAoLi4uYXJncykgPT4ge1xuICBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpLmh5ZHJhdGUoLi4uYXJncyk7XG59O1xuY29uc3QgY3JlYXRlQXBwID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKCFjb250YWluZXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgY29tcG9uZW50ID0gYXBwLl9jb21wb25lbnQ7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNvbXBvbmVudCkgJiYgIWNvbXBvbmVudC5yZW5kZXIgJiYgIWNvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgY29tcG9uZW50LnRlbXBsYXRlID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICB9XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgY29uc3QgcHJveHkgPSBtb3VudChjb250YWluZXIsIGZhbHNlLCBjb250YWluZXIgaW5zdGFuY2VvZiBTVkdFbGVtZW50KTtcbiAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShcInYtY2xvYWtcIik7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS12LWFwcFwiLCBcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xuICByZXR1cm4gYXBwO1xufTtcbmNvbnN0IGNyZWF0ZVNTUkFwcCA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuY3JlYXRlQXBwKC4uLmFyZ3MpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCk7XG4gICAgaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKTtcbiAgfVxuICBjb25zdCB7IG1vdW50IH0gPSBhcHA7XG4gIGFwcC5tb3VudCA9IChjb250YWluZXJPclNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lck9yU2VsZWN0b3IpO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHJldHVybiBtb3VudChjb250YWluZXIsIHRydWUsIGNvbnRhaW5lciBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwcDtcbn07XG5mdW5jdGlvbiBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiaXNOYXRpdmVUYWdcIiwge1xuICAgIHZhbHVlOiAodGFnKSA9PiBpc0hUTUxUYWcodGFnKSB8fCBpc1NWR1RhZyh0YWcpLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCkge1xuICBpZiAoaXNSdW50aW1lT25seSgpKSB7XG4gICAgY29uc3QgaXNDdXN0b21FbGVtZW50ID0gYXBwLmNvbmZpZy5pc0N1c3RvbUVsZW1lbnQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiaXNDdXN0b21FbGVtZW50XCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGlzQ3VzdG9tRWxlbWVudDtcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFRoZSBcXGBpc0N1c3RvbUVsZW1lbnRcXGAgY29uZmlnIG9wdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgXFxgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudFxcYCBpbnN0ZWFkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBhcHAuY29uZmlnLmNvbXBpbGVyT3B0aW9ucztcbiAgICBjb25zdCBtc2cgPSBgVGhlIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBjb25maWcgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUuanMgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlciAoYWthIFwiZnVsbCBidWlsZFwiKS4gU2luY2UgeW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkLCBcXGBjb21waWxlck9wdGlvbnNcXGAgbXVzdCBiZSBwYXNzZWQgdG8gXFxgQHZ1ZS9jb21waWxlci1kb21cXGAgaW4gdGhlIGJ1aWxkIHNldHVwIGluc3RlYWQuXG4tIEZvciB2dWUtbG9hZGVyOiBwYXNzIGl0IHZpYSB2dWUtbG9hZGVyJ3MgXFxgY29tcGlsZXJPcHRpb25zXFxgIGxvYWRlciBvcHRpb24uXG4tIEZvciB2dWUtY2xpOiBzZWUgaHR0cHM6Ly9jbGkudnVlanMub3JnL2d1aWRlL3dlYnBhY2suaHRtbCNtb2RpZnlpbmctb3B0aW9ucy1vZi1hLWxvYWRlclxuLSBGb3Igdml0ZTogcGFzcyBpdCB2aWEgQHZpdGVqcy9wbHVnaW4tdnVlIG9wdGlvbnMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUtcGx1Z2luLXZ1ZS90cmVlL21haW4vcGFja2FnZXMvcGx1Z2luLXZ1ZSNleGFtcGxlLWZvci1wYXNzaW5nLW9wdGlvbnMtdG8tdnVlY29tcGlsZXItc2ZjYDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJjb21waWxlck9wdGlvbnNcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICAgIHJldHVybiBjb21waWxlck9wdGlvbnM7XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCByZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXJlcykge1xuICAgICAgd2FybihcbiAgICAgICAgYEZhaWxlZCB0byBtb3VudCBhcHA6IG1vdW50IHRhcmdldCBzZWxlY3RvciBcIiR7Y29udGFpbmVyfVwiIHJldHVybmVkIG51bGwuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIubW9kZSA9PT0gXCJjbG9zZWRcIikge1xuICAgIHdhcm4oXG4gICAgICBgbW91bnRpbmcgb24gYSBTaGFkb3dSb290IHdpdGggXFxge21vZGU6IFwiY2xvc2VkXCJ9XFxgIG1heSBsZWFkIHRvIHVucHJlZGljdGFibGUgYnVnc2BcbiAgICApO1xuICB9XG4gIHJldHVybiBjb250YWluZXI7XG59XG5sZXQgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmNvbnN0IGluaXREaXJlY3RpdmVzRm9yU1NSID0gKCkgPT4ge1xuICBpZiAoIXNzckRpcmVjdGl2ZUluaXRpYWxpemVkKSB7XG4gICAgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIGluaXRWTW9kZWxGb3JTU1IoKTtcbiAgICBpbml0VlNob3dGb3JTU1IoKTtcbiAgfVxufSA7XG5cbmV4cG9ydCB7IFRyYW5zaXRpb24sIFRyYW5zaXRpb25Hcm91cCwgVnVlRWxlbWVudCwgY3JlYXRlQXBwLCBjcmVhdGVTU1JBcHAsIGRlZmluZUN1c3RvbUVsZW1lbnQsIGRlZmluZVNTUkN1c3RvbUVsZW1lbnQsIGh5ZHJhdGUsIGluaXREaXJlY3RpdmVzRm9yU1NSLCByZW5kZXIsIHVzZUNzc01vZHVsZSwgdXNlQ3NzVmFycywgdk1vZGVsQ2hlY2tib3gsIHZNb2RlbER5bmFtaWMsIHZNb2RlbFJhZGlvLCB2TW9kZWxTZWxlY3QsIHZNb2RlbFRleHQsIHZTaG93LCB3aXRoS2V5cywgd2l0aE1vZGlmaWVycyB9O1xuIiwiaW1wb3J0IHsgaW5pdEN1c3RvbUZvcm1hdHRlciwgd2FybiB9IGZyb20gJ0B2dWUvcnVudGltZS1kb20nO1xuZXhwb3J0ICogZnJvbSAnQHZ1ZS9ydW50aW1lLWRvbSc7XG5cbmZ1bmN0aW9uIGluaXREZXYoKSB7XG4gIHtcbiAgICBpbml0Q3VzdG9tRm9ybWF0dGVyKCk7XG4gIH1cbn1cblxuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgaW5pdERldigpO1xufVxuY29uc3QgY29tcGlsZSA9ICgpID0+IHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuKFxuICAgICAgYFJ1bnRpbWUgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIG9mIFZ1ZS5gICsgKGAgQ29uZmlndXJlIHlvdXIgYnVuZGxlciB0byBhbGlhcyBcInZ1ZVwiIHRvIFwidnVlL2Rpc3QvdnVlLmVzbS1idW5kbGVyLmpzXCIuYCApXG4gICAgICAvKiBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IGNvbXBpbGUgfTtcbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY2FsZW5kYXJcbiAgLmRpdG8tY2FsZW5kYXItcG9wdXBcbiAgICAuZGl0by1jYWxlbmRhci1pbm5lclxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ2RheSdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IHRydWUgfSkgfX1cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QtbW9udGgoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ21vbnRoJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IG1vbnRoOiB0cnVlIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIndlZWtkYXkgaW4gd2Vla2RheU5hbWVzXCJcbiAgICAgICAgICAgICkge3sgd2Vla2RheS5zaG9ydCB9fVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLWRhdGVzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cImRhdGUgaW4gZGF0ZVJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZGF0ZS5zdGF0ZSAmJiBgZGl0by1jYWxlbmRhci1pdGVtLSR7ZGF0ZS5zdGF0ZX1gXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiZGF0ZS5zdGF0ZSAhPT0gJ2Rpc2FibGVkJyAmJiBzZWxlY3REYXRlKGRhdGUuZGF0ZSlcIlxuICAgICAgICAgICAgKSB7eyBkYXRlLnRleHQgfX1cbiAgICAgICAgLmRpdG8tY2FsZW5kYXItZm9vdGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1ub3coXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIDp0aXRsZT1cImRhdGVUb1N0cmluZyhuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3REYXRlKG5ldyBEYXRlKCkpXCJcbiAgICAgICAgICApXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICdtb250aCdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IHRydWUgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLW1vbnRoc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCIobW9udGgsIGluZGV4KSBpbiBtb250aE5hbWVzXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0TW9udGhDbGFzcyhpbmRleClcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RNb250aChpbmRleClcIlxuICAgICAgICAgICAgKSB7eyBtb250aC5zaG9ydCB9fVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAneWVhcidcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcERlY2FkZSgtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuIHt7IGRlY2FkZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcERlY2FkZSgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXIteWVhcnNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwieWVhciBpbiB5ZWFyUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRZZWFyQ2xhc3MoeWVhcilcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICkge3sgeWVhciB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGRlc2NyaWJlRGF0ZSwgYWx0ZXJEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdzZWxlY3QnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgbW9kZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkYXknIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIGNvbnN0IHsgd2Vla2RheU5hbWVzLCBtb250aE5hbWVzIH0gPSBnZXRMb2NhbGVOYW1lcyh0aGlzLmxvY2FsZSlcbiAgICByZXR1cm4ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lcyxcbiAgICAgIGRhdGVSYW5nZTogW10sXG4gICAgICB5ZWFyUmFuZ2U6IFtdLFxuICAgICAgY3VycmVudFZhbHVlOiAoXG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSB8fFxuICAgICAgICAvLyBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdXNlIGN1cnJlbnQgZGF0ZSBidXQgY2xlYXIgdGltZSBmaWVsZHM6XG4gICAgICAgIGFsdGVyRGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKSxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLm1vZGVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvIHx8IG5ldyBEYXRlKClcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzYWJsZWREYXRlOiAndXBkYXRlRGF0ZVJhbmdlJyxcblxuICAgIG1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE1vbnRoQ2xhc3MobW9udGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJlxuICAgICAgICAgIG1vbnRoID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0TW9udGgoKSAmJlxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IG1vbnRoID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFllYXJDbGFzcyh5ZWFyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiYgeWVhciA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogeWVhciA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXREYXRlKG92ZXJyaWRlcywgdXBkYXRlID0gZmFsc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gYWx0ZXJEYXRlKHRoaXMuY3VycmVudFZhbHVlLCBvdmVycmlkZXMpXG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0ZXBEZWNhZGUoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiAxMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2V0TW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH0sXG5cbiAgICBzdGVwTW9udGgoc3RlcCkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHsgeWVhciwgbW9udGggfSA9IHRoaXMuZ2V0WWVhck1vbnRoKFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBzdGVwXG4gICAgICApXG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICBtb250aCxcbiAgICAgICAgZGF5OiBNYXRoLm1pbihcbiAgICAgICAgICB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXREYXRlKClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc3RlcFllYXIoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdERhdGUoZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlKGRlc2NyaWJlRGF0ZShkYXRlKSwgdHJ1ZSlcbiAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdCcpXG4gICAgfSxcblxuICAgIHNlbGVjdE1vbnRoKG1vbnRoKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAvLyBTZXQgZGF5IHRvIDEgdG8gYXZvaWQgc2VsZWN0aW5nIGEgZGF0ZSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlXG4gICAgICAvLyBuZXcgbW9udGgsIGUuZy4gRmViIDMxIC0+IE1hciAzLlxuICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGgsIGRheTogMSB9LCB0cnVlKVxuICAgIH0sXG5cbiAgICBzZWxlY3RZZWFyKHllYXIpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgdGhpcy5zZXREYXRlKHsgeWVhciB9LCB0cnVlKVxuICAgIH0sXG5cbiAgICBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgIHllYXIrK1xuICAgICAgICBtb250aCA9IDBcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG4gICAgICAgIHllYXItLVxuICAgICAgICBtb250aCA9IDExXG4gICAgICB9XG4gICAgICByZXR1cm4geyB5ZWFyLCBtb250aCB9XG4gICAgfSxcblxuICAgIGRhdGVUb1N0cmluZyhcbiAgICAgIGRhdGUsXG4gICAgICB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IHsgeWVhcjogdHJ1ZSwgbW9udGg6IHRydWUsIGRheTogdHJ1ZSB9XG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICB5ZWFyOiB5ZWFyICYmICdudW1lcmljJyxcbiAgICAgICAgbW9udGg6IG1vbnRoICYmICdsb25nJyxcbiAgICAgICAgZGF5OiBkYXkgJiYgJ251bWVyaWMnXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBkZWNhZGVUb1N0cmluZyhkYXRlKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZShkYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gYCR7eWVhcn0g4oCTICR7eWVhciArIDl9YFxuICAgIH0sXG5cbiAgICBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpXG4gICAgfSxcblxuICAgIGdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpIHtcbiAgICAgIGNvbnN0IHllYXJTdHIgPSB5ZWFyLnRvU3RyaW5nKClcbiAgICAgIHJldHVybiArYCR7eWVhclN0ci5zbGljZSgwLCAtMSl9MGBcbiAgICB9LFxuXG4gICAgbmF2aWdhdGUoeyBzdGVwLCBlbnRlciwgbW9kZSA9IHRoaXMuY3VycmVudE1vZGUsIHVwZGF0ZSA9IGZhbHNlIH0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBpZiAoc3RlcCkge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgZGF5OiBjdXJyZW50VmFsdWUuZ2V0RGF0ZSgpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IG1vbnRoOiBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXAgfSwgdXBkYXRlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IHllYXI6IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGVsc2UgaWYgKGVudGVyKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50TW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGUoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZURhdGVSYW5nZSgpIHtcbiAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW11cbiAgICAgIHRoaXMueWVhclJhbmdlID0gW11cblxuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHllYXIgPSBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgY29uc3QgbW9udGggPSBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKVxuICAgICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZSh5ZWFyKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIHRoaXMueWVhclJhbmdlLnB1c2goc3RhcnRZZWFyICsgaSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICBsZXQgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG4gICAgICAgIGZpcnN0RGF5V2VlayA9IDdcbiAgICAgIH1cbiAgICAgIGNvbnN0IG51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggLSAxKVxuICAgICAgICBjb25zdCBwcmV2TW9udGhOdW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aChcbiAgICAgICAgICBwcmV2TW9udGgueWVhcixcbiAgICAgICAgICBwcmV2TW9udGgubW9udGhcbiAgICAgICAgKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpcnN0RGF5V2VlazsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gcHJldk1vbnRoTnVtRGF5cyAtIGZpcnN0RGF5V2VlayArIGkgKyAxXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZXZNb250aC55ZWFyLCBwcmV2TW9udGgubW9udGgsIGRheSlcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGRheSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1EYXlzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKVxuICAgICAgICBjb25zdCBpc0RheSA9IGRhdGUgPT4gKFxuICAgICAgICAgIGRhdGUgJiZcbiAgICAgICAgICBkYXRlLmdldERhdGUoKSA9PT0gaSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJlxuICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGhcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzRGF5KHRoaXMubW9kZWxWYWx1ZSlcbiAgICAgICAgICA/ICdhY3RpdmUnXG4gICAgICAgICAgOiBpc0RheShub3cpXG4gICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgIDogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSlcbiAgICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICAgIDogaXNEYXkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgICAgID8gJ2N1cnJlbnQnXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcbiAgICAgIGlmIChuZXh0TW9udGhOZWVkID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCArIDEpXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG5leHRNb250aE5lZWQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBpKVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2NhbGVOYW1lcyA9IHt9XG5cbi8vIENhbGxpbmcgYHRvTG9jYWxlU3RyaW5nKClgIHRoaXMgbXVjaCBhcHBlYXJzIHRvIGJlIGV4cGVuc2l2ZSwgc28gY2FjaGUgaXQ6XG5mdW5jdGlvbiBnZXRMb2NhbGVOYW1lcyhsb2NhbGUpIHtcbiAgbGV0IG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXVxuICBpZiAoIW5hbWVzKSB7XG4gICAgY29uc3Qgd2Vla2RheU5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIDAsIGkpXG4gICAgICB3ZWVrZGF5TmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCBpLCAwKVxuICAgICAgbW9udGhOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV0gPSB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lc1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2FsZW5kYXIge1xuICBtaW4td2lkdGg6IDI0MHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uZGl0by1jYWxlbmRhci1wb3B1cCB7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xufVxuXG4uZGl0by1jYWxlbmRhci1ib2R5IHtcbiAgcGFkZGluZzogMCAwLjVlbTtcblxuICBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAvIDcpO1xuICAgIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgICBsaW5lLWhlaWdodDogY2FsYygjeyRpbnB1dC1oZWlnaHR9IC0gMnB4KTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLXRvZGF5IHtcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWFjdGl2ZTtcbiAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlIHtcbiAgICAmLFxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICB9XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWRpc2FibGVkIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWRpc2FibGVkLFxuICAuZGl0by1jYWxlbmRhci1pdGVtLWdyYXkge1xuICAgIGNvbG9yOiAjOTk5OTk5O1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLW1vbnRocyxcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHtcbiAgc3BhbiB7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAvIDQpO1xuICAgIG1hcmdpbjogMC41ZW0gMDtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDUpO1xufVxuXG4uZGl0by1jYWxlbmRhciBhLFxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHNwYW4ge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgYSB7XG4gICAgcGFkZGluZzogMCAwLjJlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXI6bm90KDpob3ZlcikgLmRpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50IHtcbiAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcbn1cblxuLmRpdG8tY2FsZW5kYXItd2Vla2RheXMgc3BhbiB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyLFxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIGJvcmRlci10b3A6ICRib3JkZXItc3R5bGU7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gID4gc3BhbiB7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG4gIH1cblxuICBhIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcblxuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldixcbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDUlO1xuICBtaW4td2lkdGg6IDJlbTtcbiAgbWF4LXdpZHRoOiAzZW07XG5cbiAgJjo6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGZvbnQtc2l6ZTogMS4yNWVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldiB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC5JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwqsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC6JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwrsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXNlbGVjdC1ub3cge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ05vdyc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEV2ZW50cyh0YXJnZXRzLCBldmVudHMpIHtcbiAgdGFyZ2V0cyA9XG4gICAgdGFyZ2V0cyBpbnN0YW5jZW9mIE5vZGVMaXN0XG4gICAgICA/IEFycmF5LmZyb20odGFyZ2V0cylcbiAgICAgIDogYXNBcnJheSh0YXJnZXRzKVxuXG4gIGZvciAoY29uc3QgW3R5cGUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIGZvciAoY29uc3QgW3R5cGUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lRXZlbnRzKC4uLmV2ZW50cykge1xuICByZXR1cm4ge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGV2ZW50LnJlbW92ZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXkoZXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAzNzogJ2xlZnQnLFxuICAgIDM4OiAndXAnLFxuICAgIDM5OiAncmlnaHQnLFxuICAgIDQwOiAnZG93bicsXG4gICAgMTM6ICdlbnRlcidcbiAgfVtldmVudD8ua2V5Q29kZV1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleU5hdmlnYXRpb24oZXZlbnQpIHtcbiAgY29uc3Qga2V5ID0gZ2V0S2V5KGV2ZW50KVxuICByZXR1cm4ge1xuICAgIGhvcjogeyBsZWZ0OiAtMSwgcmlnaHQ6IDEgfVtrZXldIHx8IDAsXG4gICAgdmVyOiB7IHVwOiAtMSwgZG93bjogMSB9W2tleV0gfHwgMCxcbiAgICBlbnRlcjoga2V5ID09PSAnZW50ZXInXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldChjb21wb25lbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gaXNTdHJpbmcoY29tcG9uZW50LnRhcmdldClcbiAgICA/IGNvbXBvbmVudC4kcmVmc1tjb21wb25lbnQudGFyZ2V0XVxuICAgIDogY29tcG9uZW50LnRhcmdldFxuICByZXR1cm4gdGFyZ2V0Py4kZWwgPz8gdGFyZ2V0XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1pZj1cImFsd2F5c1Nob3dcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2NsaWNrJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2ZvY3VzJyB8fCB0cmlnZ2VyID09PSAnYWx3YXlzJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgVHJhbnNpdGlvbig6bmFtZT1cImBkaXRvLSR7dHJhbnNpdGlvbn1gXCIpXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtZWxzZVxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cywgY29tYmluZUV2ZW50cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvdHJpZ2dlcidcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6c2hvdyddLFxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20nIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGN1c3RvbUNsYXNzOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHpJbmRleDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBrZWVwSW5WaWV3OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoaWRlV2hlbkNsaWNrT3V0c2lkZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgYWx3YXlzU2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvdmVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaGlkZURlbGF5OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBwb3B1cFBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQsXG4gICAgICBmb2N1c0V2ZW50czogbnVsbCxcbiAgICAgIGNsb3NlRXZlbnRzOiBudWxsLFxuICAgICAgcG9wdXBFdmVudHM6IG51bGwsXG4gICAgICBibHVyVGltZXI6IG51bGwsXG4gICAgICBtb3VzZUxlYXZlVGltZXI6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmlnZ2VyQ2xhc3MoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by10cmlnZ2VyLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3B1cENsYXNzKCkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgW2BkaXRvLXBvcHVwLSR7aHlwaGVuYXRlKHRoaXMucGxhY2VtZW50KX1gXTogdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VzdG9tQ2xhc3MpIHtcbiAgICAgICAgY2xhc3Nlc1t0aGlzLmN1c3RvbUNsYXNzXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHBvcHVwU3R5bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy56SW5kZXggPyBgei1pbmRleDogJHt0aGlzLnpJbmRleH1gIDogJydcbiAgICB9LFxuXG4gICAgdHJpZ2dlclRhcmdldCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcylcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvdyB8fCB0aGlzLmFsd2F5c1Nob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMub25TaG93UG9wdXAodG8pKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICB0aGlzLmZvY3VzRXZlbnRzID0gdGhpcy5hZGRGb2N1c0V2ZW50cyh0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdHJpZ2dlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRlV2hlbkNsaWNrT3V0c2lkZSAmJiAhdGhpcy5hbHdheXNTaG93KSB7XG4gICAgICAvLyBVc2UgJ21vdXNldXAnIGluc3RlYWQgb2YgJ2NsaWNrJywgc2luY2UgY2xpY2sgYXBwZWFycyB0byBoYXBwZW4gYWZ0ZXJcbiAgICAgIC8vIHRoZSBET00gaW5zaWRlIG9mIHBvcHVwcyBjb3VsZCBjaGFuZ2UgaW4gYSB3YXkgc28gdGhhdCB0aGUgY2hlY2tcbiAgICAgIC8vIGBwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpYCB3b3VsZCBmYWlsOlxuICAgICAgdGhpcy5jbG9zZUV2ZW50cyA9IGFkZEV2ZW50cyh3aW5kb3csIHtcbiAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwICYmXG4gICAgICAgICAgICAhcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRyaWdnZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRoaXMudHJpZ2dlclRhcmdldD8uY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuc2hvd1BvcHVwID0gdGhpcy5zaG93XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuZm9jdXNFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5jbG9zZUV2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLnBvcHVwRXZlbnRzPy5yZW1vdmUoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB1cGRhdGVQb3NpdGlvbigpIHtcbiAgICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICAgIGlmICh0aGlzLnNob3cgJiYgcG9wdXAub2Zmc2V0V2lkdGggPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCksIDApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdHJpZ2dlclxuICAgICAgLy8gQWN0dWFsbHkgcmVzaXplIHRoZSBwb3B1cCdzIGZpcnN0IGNoaWxkLCBzbyB0aGV5IGNhbiBzZXQgc2l6ZSBsaW1pdHMuXG4gICAgICBjb25zdCBlbCA9IHRoaXMudGFyZ2V0ID09PSAncG9wdXAnID8gdHJpZ2dlciA6IHBvcHVwLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc3R5bGUud2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCkud2lkdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm91bmRzID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCB0cmlnZ2VyTGVmdCA9IGJvdW5kcy5sZWZ0ICsgd2luZG93LnNjcm9sbFhcbiAgICAgIGNvbnN0IHRyaWdnZXJUb3AgPSBib3VuZHMudG9wICsgd2luZG93LnNjcm9sbFlcbiAgICAgIGNvbnN0IHRyaWdnZXJXaWR0aCA9IGJvdW5kcy53aWR0aFxuICAgICAgY29uc3QgdHJpZ2dlckhlaWdodCA9IGJvdW5kcy5oZWlnaHRcbiAgICAgIGNvbnN0IHBvcHVwV2lkdGggPSBwb3B1cC5vZmZzZXRXaWR0aFxuICAgICAgY29uc3QgcG9wdXBIZWlnaHQgPSBwb3B1cC5vZmZzZXRIZWlnaHRcblxuICAgICAgbGV0IFtwYXJ0MSwgcGFydDJdID0gdGhpcy5wb3B1cFBsYWNlbWVudC5zcGxpdCgnLScpIHx8IFtdXG4gICAgICBpZiAodGhpcy5rZWVwSW5WaWV3KSB7XG4gICAgICAgIGNvbnN0IHdpbldpZHRoID0gd2luZG93LmlubmVyV2lkdGhcbiAgICAgICAgY29uc3Qgd2luSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlckxlZnQgPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdyaWdodCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQyID09PSAndG9wJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2JvdHRvbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgKyB0cmlnZ2VySGVpZ2h0IDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3RvcCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmICh3aW5XaWR0aCAtIHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0ICsgdHJpZ2dlcldpZHRoIDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAnbGVmdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGxlZnQgPSAwXG4gICAgICBsZXQgdG9wID0gMFxuICAgICAgc3dpdGNoIChwYXJ0MSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHRvcCAtPSBwb3B1cEhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0ICs9IHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwYXJ0Mikge1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCAtPSBwb3B1cFdpZHRoIC0gdHJpZ2dlcldpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHQgLSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvdmVyKSB7XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICB0b3AgKz0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIHRvcCAtPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQgIT09IHRyaWdnZXIpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlckJvdW5kcyA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgbGVmdCArPSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJCb3VuZHMubGVmdFxuICAgICAgICB0b3AgKz0gdHJpZ2dlclRvcCAtIHRyaWdnZXJCb3VuZHMudG9wXG4gICAgICB9XG4gICAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGBcbiAgICAgIHBvcHVwLnN0eWxlLnRvcCA9IGAke3RvcH1weGBcbiAgICB9LFxuXG4gICAgYWRkRm9jdXNFdmVudHMocGFyZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXRzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICBsZXQgaW5wdXRcblxuICAgICAgcmV0dXJuIGNvbWJpbmVFdmVudHMoXG4gICAgICAgIGFkZEV2ZW50cyh0YXJnZXRzLCB7XG4gICAgICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYmx1clRpbWVyKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgdGltZW91dCB0byBhbGxvdyBjbGlja2VkIGlucHV0cyB0byBncmFiIGZvY3VzXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuJHJlZnMucG9wdXAubWF0Y2hlcygnOmZvY3VzLXdpdGhpbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG5cbiAgICAgICAgYWRkRXZlbnRzKHBhcmVudCwge1xuICAgICAgICAgIG1vdXNlZG93bjogZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnaW5wdXQsIHRleHRhcmVhLCBidXR0b24nKSkge1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKCcuZGl0by1idXR0b24tY2xlYXInKSkge1xuICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRoaXMuJHJlZnMudHJpZ2dlclxuICAgICAgICAgICAgICAvLyBNYXJrIHRyaWdnZXIgaW5wdXQgYXMgcmVhZG9ubHkgc28gaXQgY2FuJ3QgbG9vc2UgZm9jdXMgd2hpbGVcbiAgICAgICAgICAgICAgLy8gdXNlciBkb2VzIG90aGVyIG1vdXNlLWFjdGl2aXRpZXMgaW4gcG9wdXAuXG4gICAgICAgICAgICAgIGlucHV0ID0gdHJpZ2dlci5xdWVyeVNlbGVjdG9yKCdpbnB1dCwgdGV4dGFyZWEnKVxuICAgICAgICAgICAgICBpZiAoaW5wdXQgJiYgIWlucHV0Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSkge1xuICAgICAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAndHJ1ZScpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0aW1lIGZvciBvdGhlciBldmVudHMgdG8gdXBkYXRlIGlucHV0IGJlZm9yZSBpdFxuICAgICAgICAgICAgICAvLyBiZWNvbWVzIGVkaXRhYmxlIGFuZCBzdGlsbCBmb2N1c2VkIGFnYWluLlxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5JylcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbicpKSB7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5mb2N1cygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbFxuICAgICAgICAgICAgICB9LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgb25TaG93UG9wdXAoc2hvdykge1xuICAgICAgaWYgKHNob3cpIHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgICAgIHRoaXMucG9wdXBFdmVudHMgPSB0aGlzLmFkZEZvY3VzRXZlbnRzKHRoaXMuJHJlZnMucG9wdXApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvcHVwRXZlbnRzPy5yZW1vdmUoKVxuICAgICAgICB0aGlzLnBvcHVwRXZlbnRzID0gbnVsbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkhvdmVyKGVudGVyKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VMZWF2ZVRpbWVyKVxuICAgICAgICBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5oaWRlRGVsYXkpIHtcbiAgICAgICAgICAgIHRoaXMubW91c2VMZWF2ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICAgIH0sIHRoaXMuaGlkZURlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuQGltcG9ydCAnLi4vc3R5bGVzL3RyYW5zaXRpb25zL2luZGV4LnNjc3MnO1xuXG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmRpdG8tdHJpZ2dlci1kaXNhYmxlZCB7XG4gIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gICoge1xuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgJjpmb2N1cyB7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1wb3B1cCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkei1pbmRleC1wb3B1cDtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8taW5wdXQoOmNsYXNzPVwiY2xhc3Nlc1wiKVxuICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgaW5wdXQoXG4gICAgOmlkPVwiaWRcIlxuICAgIHJlZj1cImlucHV0XCJcbiAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICA6dHlwZT1cInR5cGVcIlxuICAgIDpuYW1lPVwibmFtZVwiXG4gICAgOnRpdGxlPVwidGl0bGVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICA6cmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgOmF1dG9mb2N1cz1cImF1dG9mb2N1c1wiXG4gICAgOnBsYWNlaG9sZGVyPVwicGxhY2Vob2xkZXJcIlxuICAgIDphdXRvY29tcGxldGU9XCJhdXRvY29tcGxldGVcIlxuICAgIDphcmlhLWxhYmVsPVwidGl0bGVcIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICApXG4gIHNsb3QobmFtZT1cImFmdGVyXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGF1dG9mb2N1czogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGF1dG9jb21wbGV0ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdvZmYnIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIGhvdmVyaW5nOiBmYWxzZSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRhdHRycy5jbGFzc1xuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBjbGFzczogXywgLi4uYXR0cmlidXRlcyB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXRcbiAgICB9LFxuXG4gICAgc2l6ZSgpIHtcbiAgICAgIC8vIERldGVybWluZSBzaXplIGJhc2VkIG9uIG1pbiAmIG1heCBzZXR0aW5ncywgaWYgdGhleSdyZSBwcm92aWRlZC5cbiAgICAgIGNvbnN0IHsgc2l6ZSwgbWluLCBtYXggfSA9IHRoaXMuJGF0dHJzXG4gICAgICBjb25zdCBnZXRMZW5ndGggPSB2YWx1ZSA9PiAodmFsdWUgIT0gbnVsbCA/IGAke3ZhbHVlfWAubGVuZ3RoIDogMClcbiAgICAgIHJldHVybiBzaXplIHx8IGdldExlbmd0aChtaW4pIHx8IGdldExlbmd0aChtYXgpIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShjdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgaW5wdXQge1xuICAgIC8vIEluaGVyaXQgYWxsIHN0eWxpbmcgZnJvbSAuZGl0by1pbnB1dFxuICAgIGFsbDogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmkuZGl0by1pY29uKFxuICA6Y2xhc3M9YHtcbiAgICBbJ2RpdG8taWNvbi0tJyArIG5hbWVdOiB0cnVlLFxuICAgICdkaXRvLWljb24tLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgfWBcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIGB5YXJuIGJ1aWxkOmljb25zYCBjb252ZXJ0cyB0aGUgaWNvbiBTVkcgZmlsZXMgdG8gc2lsZW50IGNsYXNzZXMgaW5zaWRlXG4vLyBgc3JjL3N0eWxlcy9taXhpbnMvX2ljb25zLnNjc3NgLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIHNhc3Ncbi8vIGNvZGUgdGhyb3VnaCBgX2ltcG9ydHNgLlxuLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSBhcyBub3JtYWwgQ1NTIGNsYXNzZXMsIGNvbnZlcnQgdGhlbSBoZXJlOlxuQGVhY2ggJG5hbWUgaW4gJGljb25zIHtcbiAgLmRpdG8taWNvbi0tI3skbmFtZX0ge1xuICAgICY6OmFmdGVyIHtcbiAgICAgIEBleHRlbmQgJWljb24tI3skbmFtZX07XG5cbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8taWNvbiB7XG4gIEBhdC1yb290IC5kaXRvLWlucHV0ICYge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogJGJvcmRlci13aWR0aDtcbiAgICBsZWZ0OiB1bnNldDtcbiAgICB3aWR0aDogMmVtO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBjb2xvcjogJGNvbG9yLWdyZXk7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuXG4gICAgJi0tZGlzYWJsZWQge1xuICAgICAgY29sb3I6ICRjb2xvci1saWdodDtcbiAgICB9XG4gIH1cblxuICBAYXQtcm9vdCAuZGl0by1pbnB1dDpmb2N1cy13aXRoaW4gJiB7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0LCBlbmQgfSkge1xuICBpZiAoaW5wdXQ/LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgaW5wdXQuZm9jdXMoKVxuICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvbihpbnB1dCkge1xuICByZXR1cm4gaW5wdXQgJiYgJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dFxuICAgID8geyBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kIH1cbiAgICA6IG51bGxcbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLWRhdGUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBJbnB1dEZpZWxkLmRpdG8tZGF0ZS1waWNrZXItaW5wdXQoXG4gICAgICB2LWVsc2VcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYmVmb3JlKVxuICAgICAgICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgICAgIHRlbXBsYXRlKCNhZnRlcilcbiAgICAgICAgSWNvbihcbiAgICAgICAgICBuYW1lPVwiY2FsZW5kYXJcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnByZXZlbnQ9XCJvbk1vdXNlRG93bih0cnVlKVwiXG4gICAgICAgIClcbiAgICAgICAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIENhbGVuZGFyLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAoXG4gICAgICByZWY9XCJjYWxlbmRhclwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtYmluZD1cInsgbG9jYWxlLCBkaXNhYmxlZERhdGUgfVwiXG4gICAgICBAc2VsZWN0PVwic2hvd1BvcHVwID0gZmFsc2VcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4vVHJpZ2dlci52dWUnXG5pbXBvcnQgQ2FsZW5kYXIgZnJvbSAnLi9DYWxlbmRhci52dWUnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uLnZ1ZSdcbmltcG9ydCB7IHBhcnNlRGF0ZSwgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IGdldFNlbGVjdGlvbiwgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvdHJpZ2dlci5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIENhbGVuZGFyLCBJbnB1dEZpZWxkLCBJY29uIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3VwZGF0ZTpzaG93JywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZm9ybWF0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgICBkYXRlOiBkZWZhdWx0Rm9ybWF0cy5kYXRlLFxuICAgICAgICB0aW1lOiBmYWxzZVxuICAgICAgfSlcbiAgICB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcyk/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgIC4uLnRoaXMuZm9ybWF0XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgfHwgJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICB0aGlzLnNob3dQb3B1cCA9IGZvY3VzXG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3QgeyB2ZXI6IHN0ZXAsIGVudGVyIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgaWYgKHN0ZXAgfHwgZW50ZXIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQpPy5zdGFydFxuICAgICAgICBjb25zdCBnZXREYXRlUGFydCA9IHBvc2l0aW9uID0+XG4gICAgICAgICAgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uKHRoaXMuY3VycmVudFRleHQsIHBvc2l0aW9uLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG5cbiAgICAgICAgaWYgKHN0ZXAgJiYgIXRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBjYWxlbmRhciB9ID0gdGhpcy4kcmVmc1xuICAgICAgICAgIGlmIChjYWxlbmRhcikge1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lOiBtb2RlLCBzdGFydCB9ID0gZ2V0RGF0ZVBhcnQocG9zaXRpb24pIHx8IHt9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1vZGUgJiZcbiAgICAgICAgICAgICAgY2FsZW5kYXIubmF2aWdhdGUoeyBzdGVwLCBlbnRlciwgbW9kZSwgdXBkYXRlOiB0cnVlIH0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQsIGdldERhdGVQYXJ0KHN0YXJ0KSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKHRvZ2dsZSkge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSAhdGhpcy5kaXNhYmxlZCAmJiAoIXRvZ2dsZSB8fCAhdGhpcy5zaG93UG9wdXApXG4gICAgICBpZiAodGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDhlbTtcbiAgfVxufVxuXG4uZGl0by1kYXRlLXBpY2tlci1wb3B1cCB7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cbjwvc3R5bGU+XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by10aW1lLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJmb2N1c1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBzbG90KFxuICAgICAgdi1pZj1cIiRzbG90cy50cmlnZ2VyXCJcbiAgICAgIG5hbWU9XCJ0cmlnZ2VyXCJcbiAgICApXG4gICAgSW5wdXRGaWVsZC5kaXRvLXRpbWUtcGlja2VyLWlucHV0KFxuICAgICAgdi1lbHNlXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgLi4uJGF0dHJzIH1cIlxuICAgICAgQGZvY3VzPVwib25Gb2N1cyh0cnVlKVwiXG4gICAgICBAYmx1cj1cIm9uRm9jdXMoZmFsc2UpXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uTW91c2VEb3duKGZhbHNlKVwiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgICAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gICAgICB0ZW1wbGF0ZSgjYWZ0ZXIpXG4gICAgICAgIEljb24oXG4gICAgICAgICAgbmFtZT1cImNsb2NrXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgQG1vdXNlZG93bi5wcmV2ZW50PVwib25Nb3VzZURvd24odHJ1ZSlcIlxuICAgICAgICApXG4gICAgICAgIHNsb3QobmFtZT1cImFmdGVyXCIpXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICAuZGl0by10aW1lLXBpY2tlci1wb3B1cFxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1ob3VyKHJlZj1cImhvdXJcIilcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gMjRcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkSG91cihpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogaG91ciA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJob3VyID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLW1pbnV0ZShyZWY9XCJtaW51dGVcIilcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkTWludXRlKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBtaW51dGUgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwibWludXRlID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLXNlY29uZChyZWY9XCJzZWNvbmRcIilcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkU2Vjb25kKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuL1RyaWdnZXIudnVlJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCBJY29uIGZyb20gJy4vSWNvbi52dWUnXG5pbXBvcnQgeyBhbHRlckRhdGUsIHBhcnNlRGF0ZSwgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IGdldFNlbGVjdGlvbiwgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvdHJpZ2dlci5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIElucHV0RmllbGQsIEljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHRpbWU6IGRlZmF1bHRGb3JtYXRzLnRpbWUsXG4gICAgICAgIGRhdGU6IGZhbHNlXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGlzYWJsZWRIb3VyOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkTWludXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkU2Vjb25kOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBpZ25vcmVOZXh0Q2hhbmdlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnREYXRlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgfHxcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERhdGUoKSBvYmplY3Qgd2l0aCB0aGUgdGltZSBzZXQgdG8gMCwgdG8gYmUgdXNlZCB3aGVuXG4gICAgICAgIC8vIGZpcnN0IHNldHRpbmcgYW55IG9mIHRoZSB0aW1lcywgZm9yIG1lYW5pbmdmdWwgZGF0ZXMgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gb2JqZWN0IGlzIHNoYXJlZCB3aXRoIGEgRGF0ZVBpY2tlciwgZS5nLiB0aHJvdWdoIERhdGVUaW1lUGlja2VyLlxuICAgICAgICBhbHRlckRhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgICB0aGlzLnNjcm9sbEFsbCh0cnVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKHRydWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmZvY3VzZWQgJiZcbiAgICAgICAgIXRoaXMuaWdub3JlTmV4dENoYW5nZSAmJlxuICAgICAgICBzZWxlY3Rpb24uc3RhcnQgPT09IHNlbGVjdGlvbi5lbmRcbiAgICAgICkge1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbikpXG4gICAgICB9XG4gICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSBmYWxzZVxuICAgIH0sXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnNjcm9sbEFsbChmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxlZnRQYWQodmFsdWUpIHtcbiAgICAgIHJldHVybiAoJzAnICsgdmFsdWUpLnNsaWNlKC0yKVxuICAgIH0sXG5cbiAgICBzZXRUaW1lKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50RGF0ZSwge1xuICAgICAgICAuLi5vdmVycmlkZXMsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzY3JvbGxBbGwoc21vb3RoKSB7XG4gICAgICBjb25zdCBzY3JvbGwgPSAocmVmLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRyZWZzW3JlZl1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAoXG4gICAgICAgICAgICB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC9cbiAgICAgICAgICAgIC8vIEZpcnN0IGFuZCBsYXN0IG9uZSBhZGQgMyB0aW1lcyB0aGUgbWFyZ2luLlxuICAgICAgICAgICAgKHRhcmdldC5jaGlsZEVsZW1lbnRDb3VudCArIDYpXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IHRvcCA9IE1hdGgucm91bmQodmFsdWUgKiBsaW5lSGVpZ2h0KVxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0LnNjcm9sbFRvcCAtIHRvcClcbiAgICAgICAgICB0YXJnZXQuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHNtb290aCAmJiBkaXN0YW5jZSA8IDEwMCA/ICdzbW9vdGgnIDogJ2F1dG8nXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICB0aGlzLnNob3dQb3B1cCA9IGZvY3VzXG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgY29uc3QgeyB2ZXI6IHN0ZXAsIGVudGVyIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgaWYgKHN0ZXAgfHwgZW50ZXIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICAgIGNvbnN0IGdldERhdGVQYXJ0ID0gcG9zaXRpb24gPT5cbiAgICAgICAgICBnZXREYXRlUGFydEF0UG9zaXRpb24odGhpcy5jdXJyZW50VGV4dCwgcG9zaXRpb24sIHRoaXMuZm9ybWF0T3B0aW9ucylcblxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIGlmICghdGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHN0YXJ0IH0gPSBnZXREYXRlUGFydChzZWxlY3Rpb24uc3RhcnQpIHx8IHt9XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV0gKyBzdGVwXG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy4kcmVmc1tuYW1lXS5jaGlsZEVsZW1lbnRDb3VudFxuICAgICAgICAgICAgICB0aGlzW25hbWVdID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA8IDBcbiAgICAgICAgICAgICAgICAgID8gdmFsdWUgKyBjb3VudFxuICAgICAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBjb3VudFxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlIC0gY291bnRcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbihpbnB1dCwgZ2V0RGF0ZVBhcnQoc3RhcnQpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLnN0YXJ0ID09PSBzZWxlY3Rpb24uZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGlucHV0XG4gICAgICAgIGxldCBwb3MgPSBzZWxlY3Rpb24uc3RhcnRcblxuICAgICAgICBjb25zdCBpc0RpZ2l0ID0gY2hhciA9PiAhaXNOYU4ocGFyc2VJbnQoY2hhciwgMTApKVxuXG4gICAgICAgIGlmIChldmVudC5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGlzRGlnaXQoZXZlbnQua2V5KSAmJiBwb3MgPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsdWVbcG9zXSA9PT0gJzonICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMV0pICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMl0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcG9zKytcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSBuZXh0IGRpZ2l0IHNvIHRoZSBldmVudCBvdmVycmlkZXMgaXQgaW5zdGVhZCBvZiBpbnNlcnRpbmdcbiAgICAgICAgICAgIC8vIG5ldyBjaGFycy5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJiAoXG4gICAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgKyAxXSkgfHxcbiAgICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDFdKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAoXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UocG9zICsgMSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpLmxlbmd0aFxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgbGVuZ3RoKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG9zID09PSAxIHx8XG4gICAgICAgICAgICBbJyAnLCAnOiddLmluY2x1ZGVzKHZhbHVlW3BvcyAtIDJdKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwb3MgPT09IHZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICB2YWx1ZVtwb3NdID09PSAnOidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBwb3MtLVxuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IChcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgICAgICAoKHZhbHVlW3BvcyAtIDFdID8/ICcnKSArICcwMCcpICtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZShwb3MgKyAxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJlxuICAgICAgICAgICAgICAhaXNEaWdpdCgrdmFsdWVbcG9zICsgMV0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gV2hlbiByZW1vdmluZyB0aGUgZmlyc3Qgb2YgdHdvIGRpZ2l0cywgcmVwbGFjZSB3aXRoIDBcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBwb3MpICsgJzAnICsgdmFsdWUuc2xpY2UocG9zKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9ICF0aGlzLmRpc2FibGVkICYmICghdG9nZ2xlIHx8ICF0aGlzLnNob3dQb3B1cClcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDZlbTtcbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIG1heC13aWR0aDogMTYwcHg7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cblxuJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0OiAyNHB4O1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAgLmRpdG8tdGltZS1waWNrZXItcGFuZWwge1xuICBmbG9hdDogbGVmdDtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItd2lkdGg6IDAgMXB4IDA7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogY2FsYygxMDAlIC8gMyArIDFweCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gIH1cblxuICB1bCB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW46IDA7XG4gICAgLy8gSGlkZSBzY3JvbGxiYXI6XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgcGFkZGluZzogMCAxN3B4IDAgMDtcbiAgICBoZWlnaHQ6IDcgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG5cbiAgICAmID4gbGkge1xuICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG4gICAgICB9XG5cbiAgICAgICYuc2VsZWN0ZWQsXG4gICAgICAmLnNlbGVjdGVkOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIocmVmPVwicGlja2VyXCIpXG4gIC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lubmVyKDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIilcbiAgICBJbnB1dEZpZWxkLmRpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgLi4uJGF0dHJzIH1cIlxuICAgICAgQGZvY3VzPVwib25Gb2N1cyh0cnVlKVwiXG4gICAgICBAYmx1cj1cIm9uRm9jdXMoZmFsc2UpXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uTW91c2VEb3duKGZhbHNlKVwiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgICAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gICAgICB0ZW1wbGF0ZSgjYWZ0ZXIpXG4gICAgICAgIEljb24oXG4gICAgICAgICAgbmFtZT1cImNhbGVuZGFyXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgQG1vdXNlZG93bi5wcmV2ZW50PVwib25Nb3VzZURvd24odHJ1ZSlcIlxuICAgICAgICApXG4gICAgICAgIHNsb3QobmFtZT1cImFmdGVyXCIpXG4gICAgRGF0ZVBpY2tlcihcbiAgICAgIHJlZj1cImRhdGVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93RGF0ZVwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIFRpbWVQaWNrZXIoXG4gICAgICByZWY9XCJ0aW1lXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1tb2RlbDpzaG93PVwic2hvd1RpbWVcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLXJpZ2h0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgICAgIC8vLSBJbnRlbnRpb25hbGx5IGVtcHR5XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cywgYXNzaWduRGVlcGx5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tICcuL0RhdGVQaWNrZXIudnVlJ1xuaW1wb3J0IFRpbWVQaWNrZXIgZnJvbSAnLi9UaW1lUGlja2VyLnZ1ZSdcbmltcG9ydCBJY29uIGZyb20gJy4vSWNvbi52dWUnXG5pbXBvcnQgeyBwYXJzZURhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkLCBEYXRlUGlja2VyLCBUaW1lUGlja2VyLCBJY29uIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd0RhdGU6IGZhbHNlLFxuICAgICAgc2hvd1RpbWU6IGZhbHNlLFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGRhdGVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHRpbWVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNsb3NlZE1vZGU6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyB0cmFuc2l0aW9uLCBkaXNhYmxlZCwgbG9jYWxlLCBmb3JtYXRPcHRpb25zOiBmb3JtYXQgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7IHRyYW5zaXRpb24sIGRpc2FibGVkLCBsb2NhbGUsIGZvcm1hdCB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93RGF0ZSB8fCB0aGlzLnNob3dUaW1lXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQuaW5wdXRcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBhc3NpZ25EZWVwbHkoXG4gICAgICAgIHtcbiAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgIHRpbWU6IGRlZmF1bHRGb3JtYXRzLnRpbWUsXG4gICAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgICBmb3JtYXQ6ICh2YWx1ZSwgdHlwZSwgb3B0aW9ucykgPT5cbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ2xpdGVyYWwnICYmIC9cXGJhdFxcYi8udGVzdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/ICcsICdcbiAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybWF0Py5kYXRlPy5mb3JtYXQ/Lih2YWx1ZSwgdHlwZSwgb3B0aW9ucykgPz8gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuZm9ybWF0XG4gICAgICApXG4gICAgfSxcblxuICAgIHRpbWVJbmRleCgpIHtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmN1cnJlbnRUZXh0XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBjb25zdCB0aW1lID0gdGV4dC5tYXRjaCgvKFtcXFNdK1xccyopJC8pPy5bMV1cbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggLSB0aW1lLmxlbmd0aFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KVxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBzZWxlY3Rpb24pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3B1cHMoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93RGF0ZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2hvd1RpbWUgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIGlmICh0b2dnbGUgJiYgKHRoaXMuc2hvd0RhdGUgfHwgdGhpcy5zaG93VGltZSkpIHtcbiAgICAgICAgdGhpcy5zaG93RGF0ZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2hvd1RpbWUgPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMudXBkYXRlUG9wdXBzKCkpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0TW9kZShldmVudClcbiAgICAgIHRoaXMuJHJlZnNbbW9kZV0ub25LZXlEb3duKGV2ZW50KVxuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgdGhpcy5jbG9zZWRNb2RlID0gbW9kZVxuICAgICAgfSBlbHNlIGlmIChtb2RlICE9PSB0aGlzLmNsb3NlZE1vZGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3B1cHMobW9kZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0TW9kZShldmVudCA9IG51bGwpIHtcbiAgICAgIGNvbnN0IHsgc3RhcnQgfSA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KVxuICAgICAgY29uc3QgeyBob3I6IHN0ZXAgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICByZXR1cm4gdGhpcy50aW1lSW5kZXggPT09IG51bGwgfHwgc3RhcnQgKyBzdGVwIDwgdGhpcy50aW1lSW5kZXhcbiAgICAgICAgPyAnZGF0ZSdcbiAgICAgICAgOiAndGltZSdcbiAgICB9LFxuXG4gICAgdXBkYXRlUG9wdXBzKG1vZGUgPSB0aGlzLmdldE1vZGUoKSkge1xuICAgICAgaWYgKG1vZGUpIHtcbiAgICAgICAgdGhpcy5jbG9zZWRNb2RlID0gbnVsbFxuICAgICAgfVxuICAgICAgdGhpcy5zaG93RGF0ZSA9IG1vZGUgPT09ICdkYXRlJ1xuICAgICAgdGhpcy5zaG93VGltZSA9IG1vZGUgPT09ICd0aW1lJ1xuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIge1xuICAmX19pbm5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gICZfX2lucHV0IHtcbiAgICBmbGV4OiAxO1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgbWluLXdpZHRoOiAxMmVtO1xuICB9XG5cbiAgLmRpdG8tZGF0ZS1waWNrZXIsXG4gIC5kaXRvLXRpbWUtcGlja2VyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZS9uby10ZW1wbGF0ZS1zaGFkb3cgLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFnaW5hdGlvblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsKFxuICAgIHYtaWY9XCJzaG93VG90YWxcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwidG90YWwgPiAwXCJcbiAgICApIHt7IGZpcnN0IH19IOKAkyB7eyBsYXN0IH19IC8ge3sgdG90YWwgfX1cbiAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmQoXG4gICAgdi1pZj1cIm51bVBhZ2VzID4gMVwiXG4gIClcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB2LWZvcj1cImJ1dHRvbiBpbiBidXR0b25zXCJcbiAgICAgIDpjbGFzcz1cImdldEJ1dHRvbkNsYXNzZXMoYnV0dG9uKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJidXR0b24uZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrPVwib25DbGlja0J1dHRvbihidXR0b24pXCJcbiAgICApXG4gICAgICBzcGFuKFxuICAgICAgICB2LWlmPVwiYnV0dG9uLnRleHRcIlxuICAgICAgKSB7eyBidXR0b24udGV4dCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnBhZ2UnXSxcblxuICBwcm9wczoge1xuICAgIHRvdGFsOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgIHBhZ2U6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxIH0sXG4gICAgcGFnZVNpemU6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMCB9LFxuICAgIHNob3dUb3RhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93UHJldjogdHJ1ZSxcbiAgICAgIHNob3dOZXh0OiB0cnVlLFxuICAgICAgY3VycmVudFBhZ2U6IHRoaXMucGFnZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZpcnN0KCkge1xuICAgICAgcmV0dXJuICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplICsgMVxuICAgIH0sXG5cbiAgICBsYXN0KCkge1xuICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZmlyc3QgKyB0aGlzLnBhZ2VTaXplIC0gMSwgdGhpcy50b3RhbClcbiAgICB9LFxuXG4gICAgbnVtUGFnZXMoKSB7XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnBhZ2VTaXplKVxuICAgIH0sXG5cbiAgICBidXR0b25zKCkge1xuICAgICAgY29uc3QgeyBzaG93UHJldiwgc2hvd05leHQsIGN1cnJlbnRQYWdlLCBudW1QYWdlcyB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2hvd0xlbmd0aCA9IHNob3dQcmV2ICsgc2hvd05leHQgKyAxXG5cbiAgICAgIGxldCBzdGFydCA9IDFcbiAgICAgIGxldCBlbmQgPSAxXG4gICAgICBpZiAobnVtUGFnZXMgPD0gc2hvd0xlbmd0aCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA8PSBzaG93UHJldiArIDEpIHtcbiAgICAgICAgZW5kID0gc2hvd0xlbmd0aFxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA+PSBudW1QYWdlcyAtIHNob3dOZXh0KSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICAgIHN0YXJ0ID0gbnVtUGFnZXMgLSBzaG93TGVuZ3RoICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBjdXJyZW50UGFnZSAtIHNob3dQcmV2XG4gICAgICAgIGVuZCA9IGN1cnJlbnRQYWdlICsgc2hvd05leHRcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9ucyA9IFtdXG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IDEsIHRleHQ6IDEgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA+IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5tYXgoMSwgY3VycmVudFBhZ2UgLSAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLXByZXYnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5taW4obnVtUGFnZXMsIGN1cnJlbnRQYWdlICsgMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1uZXh0J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8PSBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IG51bVBhZ2VzLCB0ZXh0OiBudW1QYWdlcyB9KVxuICAgICAgfVxuICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBidXR0b25zXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcGFnZShwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZVxuICAgIH0sXG5cbiAgICBwYWdlU2l6ZSgpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy5udW1QYWdlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5udW1QYWdlc1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50UGFnZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpwYWdlJywgdG8pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRCdXR0b25DbGFzc2VzKGJ1dHRvbikge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgJ2RpdG8tc2VsZWN0ZWQnOiBidXR0b24uYWN0aXZlXG4gICAgICB9XG4gICAgICBpZiAoYnV0dG9uLnR5cGUpIHtcbiAgICAgICAgY2xhc3Nlc1tgZGl0by1idXR0b24tJHtidXR0b24udHlwZX1gXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIG9uQ2xpY2tCdXR0b24oYnV0dG9uKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGJ1dHRvbi5pbmRleCAmJlxuICAgICAgICAhYnV0dG9uLmRpc2FibGVkICYmXG4gICAgICAgIGJ1dHRvbi5pbmRleCAhPT0gdGhpcy5jdXJyZW50UGFnZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBidXR0b24uaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhZ2luYXRpb24ge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwge1xuICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuXG4gICAgbWFyZ2luOiAwIDAuNWVtO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICB9XG5cbiAgLmRpdG8tYnV0dG9uIHtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgYWxsIDAuM3MgZWFzZSxcbiAgICAgIGNvbG9yIDBzLFxuICAgICAgYmFja2dyb3VuZCAwcyxcbiAgICAgIGJvcmRlciAwcztcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgICAmLXByZXYsXG4gICAgJi1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldixcbiAgICAmLWVsbGlwc2lzLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1lbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jaGV2cm9ucztcbiAgICAgIH1cblxuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoLXBhbmVcbiAgICBpbnB1dChcbiAgICAgIDppZD1cImlkXCJcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgdi1tb2RlbD1cImNoZWNrZWRcIlxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIDpuYW1lPVwibmFtZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgKVxuICAgIC5kaXRvLXN3aXRjaC1idXR0b25cbiAgICBzcGFuLmRpdG8tc3dpdGNoLWxhYmVsKFxuICAgICAgdi1pZj1cImxhYmVsc1wiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cImNoZWNrZWRcIlxuICAgICAgICBuYW1lPVwiY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy5jaGVja2VkIHx8ICdvbicgfX1cbiAgICAgIHNsb3QoXG4gICAgICAgIHYtZWxzZVxuICAgICAgICBuYW1lPVwidW5jaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLnVuY2hlY2tlZCB8fCAnb2ZmJyB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxhYmVsczogeyB0eXBlOiBbT2JqZWN0LCBCb29sZWFuXSwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrZWQ6IHRoaXMubW9kZWxWYWx1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAge1xuICAgICAgICAgICdkaXRvLWNoZWNrZWQnOiB0aGlzLmNoZWNrZWQsXG4gICAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiB0aGlzLmRpc2FibGVkXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuXG4gICAgc3R5bGVzKCkge1xuICAgICAgY29uc3QgeyBsYWJlbHM6IHsgY2hlY2tlZCwgdW5jaGVja2VkIH0gPSB7fSB9ID0gdGhpc1xuICAgICAgLy8gQ2FsY3VsYXRlIGAtLXN3aXRjaC13aWR0aGAgaW4gYHJlbWAsIGJhc2VkIG9uIGxhYmVsIGxlbmd0aC5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KDAsIGNoZWNrZWQ/Lmxlbmd0aCwgdW5jaGVja2VkPy5sZW5ndGgpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAnLS1zd2l0Y2gtd2lkdGgnOiBsZW5ndGggPyBgJHtsZW5ndGggKiAxLjV9cmVtYCA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IF8sIC4uLmF0dHJpYnV0ZXMgfSA9IHRoaXMuJGF0dHJzXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUobW9kZWxWYWx1ZSkge1xuICAgICAgdGhpcy5jaGVja2VkID0gbW9kZWxWYWx1ZVxuICAgIH0sXG5cbiAgICBjaGVja2VkKGNoZWNrZWQpIHtcbiAgICAgIGlmIChjaGVja2VkICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjaGVja2VkKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBjaGVja2VkKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gIC8vIFVzZSB3aG9sZSBtdWx0aXBsZXMgb2YgYHJlbWAgZm9yIHNpemVzIGFuZCBgcHhgIG1hcmdpbnMvcGFkZGluZyBhbG9uZ1xuICAvLyB3aXRoIGBjYWxjKClgIHRvIGVuZCB1cCB3aXRoIGV2ZW4gcGl4ZWwgc2l6ZXMuXG4gIC0tc3dpdGNoLXdpZHRoOiA0ZW07XG4gIC0tc3dpdGNoLWhlaWdodDogMmVtO1xuICAtLXN3aXRjaC1tYXJnaW46IDJweDtcbiAgLS1zd2l0Y2gtcGFkZGluZzogM3B4O1xuICAtLXN3aXRjaC1zcGVlZDogMzAwbXM7XG4gIC0tbGFiZWwtbWFyZ2luOiAwLjVlbTtcbiAgLS13aWR0aDogY2FsYyh2YXIoLS1zd2l0Y2gtd2lkdGgpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1oZWlnaHQ6IGNhbGModmFyKC0tc3dpdGNoLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLW1hcmdpbikpO1xuICAtLW9mZnNldDogY2FsYyh2YXIoLS13aWR0aCkgLSB2YXIoLS1oZWlnaHQpKTtcblxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiB2YXIoLS1zd2l0Y2gtaGVpZ2h0KTtcbiAgLy8gVG8gbWFrZSBpbmxpbmUgbGFiZWxzIGFwcGVhciBvbiBjb25zaXN0ZW50IGJhc2VsaW5lOlxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAuZGl0by1zd2l0Y2gtcGFuZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiB2YXIoLS13aWR0aCk7XG4gICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQpO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUsXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgdG9wOiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB9XG5cbiAgaW5wdXQge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0O1xuICAgIHRyYW5zaXRpb246XG4gICAgICBib3JkZXItY29sb3IgMC4zcyxcbiAgICAgIGJhY2tncm91bmQtY29sb3IgMC4zcztcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgIC0tc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiB2YXIoLS1zaXplKTtcbiAgICBoZWlnaHQ6IHZhcigtLXNpemUpO1xuICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tc2l6ZSkgLyAyKTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tc3dpdGNoLXNwZWVkKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtYnV0dG9uLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgJi5kaXRvLWNoZWNrZWQge1xuICAgIGlucHV0IHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgodmFyKC0tb2Zmc2V0KSk7XG4gICAgfVxuXG4gICAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICAgIGxlZnQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgICByaWdodDogdW5zZXQ7XG4gICAgfVxuICB9XG5cbiAgJi5kaXRvLWRpc2FibGVkIHtcbiAgICBAZXh0ZW5kICVidXR0b24tZGlzYWJsZWQ7XG4gIH1cblxuICAmOmZvY3VzLXdpdGhpbjpub3QoOmhvdmVyKSB7XG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgICBib3gtc2hhZG93OiAkc2hhZG93LWZvY3VzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgeyBoIGFzIGNyZWF0ZUVsZW1lbnQsIFRyYW5zaXRpb24gfSBmcm9tICd2dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5mdW5jdGlvbiBUcmFuc2l0aW9uSGVpZ2h0KHsgZW5hYmxlZCB9LCB7IHNsb3RzIH0pIHtcbiAgcmV0dXJuIGVuYWJsZWRcbiAgICA/IGNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwgcHJvcHMsIHNsb3RzKVxuICAgIDogc2xvdHMuZGVmYXVsdCgpXG59XG5cblRyYW5zaXRpb25IZWlnaHQucHJvcHMgPSB7XG4gIGVuYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25IZWlnaHRcblxuY29uc3Qgc2V0U3R5bGUgPSAoZWxlbWVudCwgc3R5bGUpID0+IE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpXG5cbmNvbnN0IG5leHRUaW1lb3V0ID0gY2FsbGJhY2sgPT4gc2V0VGltZW91dChjYWxsYmFjaywgMClcblxuLy8gRm9yY2UgcmVwYWludCB0byBtYWtlIHN1cmUgdGhlIGFuaW1hdGlvbiBpcyB0cmlnZ2VyZWQgY29ycmVjdGx5LlxuY29uc3QgZm9yY2VSZXBhaW50ID0gZWxlbWVudCA9PiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodFxuXG5jb25zdCBwcm9wcyA9IHtcbiAgbmFtZTogJ2RpdG8taGVpZ2h0JyxcblxuICBvbkFmdGVyRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEEgdGltZW91dCBiZWZvcmUgc2V0dGluZyBzdHlsZSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgYWZ0ZXIgY2FsbHMgdG9cbiAgICAvLyBgZm9yY2VSZXBhaW50KClgLCBidXQgdXNpbmcgb25lIGhlcmUgdG9vIHByZXNlcnZlcyBleGVjdXRpb24gc2VxdWVuY2Ugc29cbiAgICAvLyB0aGF0IHRoZSBjYWxsIGZyb20gYGVudGVyKClgIGNhbiBuZXZlciBvdXRydW4gdGhlIG9uZSBmcm9tIGBhZnRlckVudGVyKClgXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQ6IG51bGwgfSkpXG4gIH0sXG5cbiAgb25FbnRlcihlbGVtZW50KSB7XG4gICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlJ3JlIGdldHRpbmcgdHdvIGBvbkVudGVyKClgIGNhbGxzIHBlciB0cmFuc2l0aW9uLFxuICAgIC8vIHNvIHdlIG5lZWQgdG8gaWdub3JlIHRoZSBzZWNvbmQgb25lLiBUaGlzIG1pZ2h0IGJlIGxpbmtlZCB0byB0aGUgdXNlXG4gICAgLy8gb2YgYG5leHRUaW1lb3V0KClgLCB3aGljaCBpcyByZXF1aXJlZCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUgZm9yXG4gICAgLy8gYGhlaWdodGAsIGJhc2VkIG9uIGAmLS1sYWJlbC12ZXJ0aWNhbGAgY2FsY3VsYXRpb25zLlxuICAgIGNvbnN0IHsgd2lkdGggfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0pXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICAgIHNldFN0eWxlKGVsZW1lbnQsIHtcbiAgICAgICAgd2lkdGg6IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgICB2aXNpYmlsaXR5OiBudWxsLFxuICAgICAgICBoZWlnaHQ6IDBcbiAgICAgIH0pXG4gICAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pKVxuICAgIH0pXG4gIH0sXG5cbiAgb25MZWF2ZShlbGVtZW50KSB7XG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KVxuICAgIGZvcmNlUmVwYWludChlbGVtZW50KVxuICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiAwIH0pKVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kZHVyYXRpb246IDAuMTVzO1xuXG4uZGl0by1oZWlnaHQtZW50ZXItYWN0aXZlLFxuLmRpdG8taGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IGhlaWdodCAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGl0by1oZWlnaHQtZW50ZXItYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBkaXRvLXNsaWRlLWVudGVyICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5kaXRvLWhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICBhbmltYXRpb246IGRpdG8tc2xpZGUtbGVhdmUgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmRpdG8taGVpZ2h0LWVudGVyLWZyb20sXG4uZGl0by1oZWlnaHQtbGVhdmUtdG8ge1xuICBoZWlnaHQ6IDA7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgdXNlU2xvdHMsIENvbW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc1N0cmluZywgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNWTm9kZUNvbnRlbnQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlICYmIGFzQXJyYXkodm5vZGUpLnNvbWUodm5vZGUgPT4gdm5vZGUudHlwZSAhPT0gQ29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Nsb3RDb250ZW50KHNsb3QsIHByb3BzID0ge30pIHtcbiAgc2xvdCA9IGlzU3RyaW5nKHNsb3QpID8gdXNlU2xvdHMoKVtzbG90XSA6IHNsb3RcbiAgcmV0dXJuIGhhc1ZOb2RlQ29udGVudChzbG90Py4ocHJvcHMpKVxufVxuIl0sIm5hbWVzIjpbImRlc2NyaWJlRGF0ZSIsImRhdGUiLCJhbHRlckRhdGUiLCJvdmVycmlkZXMiLCJwYXJzZURhdGUiLCJzdHJpbmciLCJsb2NhbGUiLCJ0aW1lIiwidGltZURlZmF1bHQiLCJkYXkiLCJzZXAxIiwibW9udGgiLCJzZXAyIiwieWVhciIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldERhdGVQYXJ0cyIsImdldE1vbnRoSW5kZXgiLCJpc1ZhbGlkVGltZVBhcnQiLCJwYXJ0IiwiZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uIiwicG9zaXRpb24iLCJwYXJ0cyIsImdldFBvc2l0aW9uIiwibGVuZ3RoIiwicG9zIiwiaW5kZXgiLCJfYSIsIm9mZnNldCIsImlzVVMiLCJ2YWx1ZXMiLCJzdGFydCIsImVuZCIsInZhbHVlIiwibWF0Y2giLCJzaG9ydEZvcm1hdCIsImxvbmdGb3JtYXQiLCJpIiwid2FybiIsIm1zZyIsImFyZ3MiLCJhY3RpdmVFZmZlY3RTY29wZSIsInJlY29yZEVmZmVjdFNjb3BlIiwiZWZmZWN0Iiwic2NvcGUiLCJnZXRDdXJyZW50U2NvcGUiLCJjcmVhdGVEZXAiLCJlZmZlY3RzIiwiZGVwIiwid2FzVHJhY2tlZCIsInRyYWNrT3BCaXQiLCJuZXdUcmFja2VkIiwiaW5pdERlcE1hcmtlcnMiLCJkZXBzIiwiZmluYWxpemVEZXBNYXJrZXJzIiwicHRyIiwidGFyZ2V0TWFwIiwiZWZmZWN0VHJhY2tEZXB0aCIsIm1heE1hcmtlckJpdHMiLCJhY3RpdmVFZmZlY3QiLCJJVEVSQVRFX0tFWSIsIk1BUF9LRVlfSVRFUkFURV9LRVkiLCJSZWFjdGl2ZUVmZmVjdCIsImZuIiwic2NoZWR1bGVyIiwicGFyZW50IiwibGFzdFNob3VsZFRyYWNrIiwic2hvdWxkVHJhY2siLCJjbGVhbnVwRWZmZWN0IiwiZWZmZWN0MiIsInRyYWNrU3RhY2siLCJwYXVzZVRyYWNraW5nIiwicmVzZXRUcmFja2luZyIsImxhc3QiLCJ0cmFjayIsInRhcmdldCIsInR5cGUiLCJrZXkiLCJkZXBzTWFwIiwiZXZlbnRJbmZvIiwidHJhY2tFZmZlY3RzIiwiZGVidWdnZXJFdmVudEV4dHJhSW5mbyIsInNob3VsZFRyYWNrMiIsImV4dGVuZCIsInRyaWdnZXIiLCJuZXdWYWx1ZSIsIm9sZFZhbHVlIiwib2xkVGFyZ2V0IiwiaXNBcnJheSIsIm5ld0xlbmd0aCIsImtleTIiLCJpc1N5bWJvbCIsImlzSW50ZWdlcktleSIsImlzTWFwIiwidHJpZ2dlckVmZmVjdHMiLCJ0cmlnZ2VyRWZmZWN0IiwiaXNOb25UcmFja2FibGVLZXlzIiwibWFrZU1hcCIsImJ1aWx0SW5TeW1ib2xzIiwiYXJyYXlJbnN0cnVtZW50YXRpb25zIiwiY3JlYXRlQXJyYXlJbnN0cnVtZW50YXRpb25zIiwiaW5zdHJ1bWVudGF0aW9ucyIsImFyciIsInRvUmF3IiwibCIsInJlcyIsImhhc093blByb3BlcnR5Iiwib2JqIiwiQmFzZVJlYWN0aXZlSGFuZGxlciIsIl9pc1JlYWRvbmx5IiwiX3NoYWxsb3ciLCJyZWNlaXZlciIsImlzUmVhZG9ubHkyIiwic2hhbGxvdyIsInNoYWxsb3dSZWFkb25seU1hcCIsInJlYWRvbmx5TWFwIiwic2hhbGxvd1JlYWN0aXZlTWFwIiwicmVhY3RpdmVNYXAiLCJ0YXJnZXRJc0FycmF5IiwiaGFzT3duIiwiaXNSZWYiLCJpc09iamVjdCIsInJlYWRvbmx5IiwicmVhY3RpdmUiLCJNdXRhYmxlUmVhY3RpdmVIYW5kbGVyIiwiaXNSZWFkb25seSIsImlzU2hhbGxvdyIsImhhZEtleSIsInJlc3VsdCIsImhhc0NoYW5nZWQiLCJSZWFkb25seVJlYWN0aXZlSGFuZGxlciIsIm11dGFibGVIYW5kbGVycyIsInJlYWRvbmx5SGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlIYW5kbGVycyIsInRvU2hhbGxvdyIsImdldFByb3RvIiwidiIsImdldCIsInJhd1RhcmdldCIsInJhd0tleSIsImhhczIiLCJ3cmFwIiwidG9SZWFkb25seSIsInRvUmVhY3RpdmUiLCJoYXMiLCJzaXplIiwiYWRkIiwic2V0IiwiZ2V0MiIsImNoZWNrSWRlbnRpdHlLZXlzIiwiZGVsZXRlRW50cnkiLCJjbGVhciIsImhhZEl0ZW1zIiwiY3JlYXRlRm9yRWFjaCIsImNhbGxiYWNrIiwidGhpc0FyZyIsIm9ic2VydmVkIiwiY3JlYXRlSXRlcmFibGVNZXRob2QiLCJtZXRob2QiLCJ0YXJnZXRJc01hcCIsImlzUGFpciIsImlzS2V5T25seSIsImlubmVySXRlcmF0b3IiLCJkb25lIiwiY3JlYXRlUmVhZG9ubHlNZXRob2QiLCJjYXBpdGFsaXplIiwiY3JlYXRlSW5zdHJ1bWVudGF0aW9ucyIsIm11dGFibGVJbnN0cnVtZW50YXRpb25zMiIsInNoYWxsb3dJbnN0cnVtZW50YXRpb25zMiIsInJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIiLCJzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiIsIm11dGFibGVJbnN0cnVtZW50YXRpb25zIiwicmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIiwic2hhbGxvd0luc3RydW1lbnRhdGlvbnMiLCJzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIiwiY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyIiwibXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyIsInJlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzIiwic2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzIiwidG9SYXdUeXBlIiwidGFyZ2V0VHlwZU1hcCIsInJhd1R5cGUiLCJnZXRUYXJnZXRUeXBlIiwiY3JlYXRlUmVhY3RpdmVPYmplY3QiLCJzaGFsbG93UmVhZG9ubHkiLCJiYXNlSGFuZGxlcnMiLCJjb2xsZWN0aW9uSGFuZGxlcnMiLCJwcm94eU1hcCIsImV4aXN0aW5nUHJveHkiLCJ0YXJnZXRUeXBlIiwicHJveHkiLCJpc1JlYWN0aXZlIiwiaXNQcm94eSIsInJhdyIsIm1hcmtSYXciLCJkZWYiLCJyIiwidW5yZWYiLCJyZWYyIiwic2hhbGxvd1Vud3JhcEhhbmRsZXJzIiwicHJveHlSZWZzIiwib2JqZWN0V2l0aFJlZnMiLCJzdGFjayIsInB1c2hXYXJuaW5nQ29udGV4dCIsInZub2RlIiwicG9wV2FybmluZ0NvbnRleHQiLCJpbnN0YW5jZSIsImFwcFdhcm5IYW5kbGVyIiwidHJhY2UiLCJnZXRDb21wb25lbnRUcmFjZSIsImNhbGxXaXRoRXJyb3JIYW5kbGluZyIsImZvcm1hdENvbXBvbmVudE5hbWUiLCJ3YXJuQXJncyIsImZvcm1hdFRyYWNlIiwiY3VycmVudFZOb2RlIiwibm9ybWFsaXplZFN0YWNrIiwicGFyZW50SW5zdGFuY2UiLCJsb2dzIiwiZW50cnkiLCJmb3JtYXRUcmFjZUVudHJ5IiwicmVjdXJzZUNvdW50IiwicG9zdGZpeCIsImlzUm9vdCIsIm9wZW4iLCJjbG9zZSIsImZvcm1hdFByb3BzIiwicHJvcHMiLCJrZXlzIiwiZm9ybWF0UHJvcCIsImlzU3RyaW5nIiwiaXNGdW5jdGlvbiIsImFzc2VydE51bWJlciIsInZhbCIsIkVycm9yVHlwZVN0cmluZ3MiLCJlcnIiLCJoYW5kbGVFcnJvciIsImNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nIiwiaXNQcm9taXNlIiwidGhyb3dJbkRldiIsImNvbnRleHRWTm9kZSIsImN1ciIsImV4cG9zZWRJbnN0YW5jZSIsImVycm9ySW5mbyIsImVycm9yQ2FwdHVyZWRIb29rcyIsImFwcEVycm9ySGFuZGxlciIsImxvZ0Vycm9yIiwiaW5mbyIsImlzRmx1c2hpbmciLCJpc0ZsdXNoUGVuZGluZyIsInF1ZXVlIiwiZmx1c2hJbmRleCIsInBlbmRpbmdQb3N0Rmx1c2hDYnMiLCJhY3RpdmVQb3N0Rmx1c2hDYnMiLCJwb3N0Rmx1c2hJbmRleCIsInJlc29sdmVkUHJvbWlzZSIsImN1cnJlbnRGbHVzaFByb21pc2UiLCJSRUNVUlNJT05fTElNSVQiLCJuZXh0VGljayIsInAiLCJmaW5kSW5zZXJ0aW9uSW5kZXgiLCJpZCIsIm1pZGRsZSIsIm1pZGRsZUpvYiIsIm1pZGRsZUpvYklkIiwiZ2V0SWQiLCJxdWV1ZUpvYiIsImpvYiIsInF1ZXVlRmx1c2giLCJmbHVzaEpvYnMiLCJxdWV1ZVBvc3RGbHVzaENiIiwiY2IiLCJmbHVzaFBvc3RGbHVzaENicyIsInNlZW4iLCJkZWR1cGVkIiwiYSIsImIiLCJjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMiLCJjb21wYXJhdG9yIiwiZGlmZiIsImNoZWNrIiwiTk9PUCIsImNvdW50IiwiY29tcG9uZW50TmFtZSIsImdldENvbXBvbmVudE5hbWUiLCJobXJEaXJ0eUNvbXBvbmVudHMiLCJnZXRHbG9iYWxUaGlzIiwidHJ5V3JhcCIsImNyZWF0ZVJlY29yZCIsInJlcmVuZGVyIiwicmVsb2FkIiwibWFwIiwiaW5pdGlhbERlZiIsIm5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50IiwiY29tcG9uZW50IiwiaXNDbGFzc0NvbXBvbmVudCIsIm5ld1JlbmRlciIsInJlY29yZCIsIm5ld0NvbXAiLCJ1cGRhdGVDb21wb25lbnREZWYiLCJpbnN0YW5jZXMiLCJvbGRDb21wIiwiYXJnIiwiZSIsImVtaXQkMSIsImV2ZW50IiwiZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkIiwiY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rIiwiaG9vayIsImN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSIsImN1cnJlbnRTY29wZUlkIiwic2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlIiwicHJldiIsIndpdGhDdHgiLCJjdHgiLCJpc05vblNjb3BlZFNsb3QiLCJyZW5kZXJGbldpdGhDb250ZXh0Iiwic2V0QmxvY2tUcmFja2luZyIsInByZXZJbnN0YW5jZSIsIm1hcmtBdHRyc0FjY2Vzc2VkIiwiQ09NUE9ORU5UUyIsInJlc29sdmVDb21wb25lbnQiLCJuYW1lIiwibWF5YmVTZWxmUmVmZXJlbmNlIiwicmVzb2x2ZUFzc2V0IiwiTlVMTF9EWU5BTUlDX0NPTVBPTkVOVCIsIndhcm5NaXNzaW5nIiwiY3VycmVudEluc3RhbmNlIiwiQ29tcG9uZW50Iiwic2VsZk5hbWUiLCJjYW1lbGl6ZSIsInJlc29sdmUiLCJleHRyYSIsInJlZ2lzdHJ5IiwiaXNTdXNwZW5zZSIsInF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlIiwic3VzcGVuc2UiLCJJTklUSUFMX1dBVENIRVJfVkFMVUUiLCJkb1dhdGNoIiwic291cmNlIiwiaW1tZWRpYXRlIiwiZGVlcCIsImZsdXNoIiwib25UcmFjayIsIm9uVHJpZ2dlciIsIkVNUFRZX09CSiIsIndhcm5JbnZhbGlkU291cmNlIiwicyIsImdldHRlciIsImZvcmNlVHJpZ2dlciIsImlzTXVsdGlTb3VyY2UiLCJpc1NoYWxsb3ckMSIsInRyYXZlcnNlIiwiY2xlYW51cCIsIm9uQ2xlYW51cCIsImJhc2VHZXR0ZXIiLCJxdWV1ZVBvc3RSZW5kZXJFZmZlY3QiLCJyZW1vdmUiLCJpbnN0YW5jZVdhdGNoIiwib3B0aW9ucyIsInB1YmxpY1RoaXMiLCJjcmVhdGVQYXRoR2V0dGVyIiwic2V0Q3VycmVudEluc3RhbmNlIiwidW5zZXRDdXJyZW50SW5zdGFuY2UiLCJwYXRoIiwic2VnbWVudHMiLCJpc1NldCIsImlzUGxhaW5PYmplY3QiLCJ3aXRoRGlyZWN0aXZlcyIsImRpcmVjdGl2ZXMiLCJpbnRlcm5hbEluc3RhbmNlIiwiZ2V0RXhwb3NlUHJveHkiLCJiaW5kaW5ncyIsImRpciIsIm1vZGlmaWVycyIsImxlYXZlQ2JLZXkiLCJlbnRlckNiS2V5IiwidXNlVHJhbnNpdGlvblN0YXRlIiwic3RhdGUiLCJvbk1vdW50ZWQiLCJvbkJlZm9yZVVubW91bnQiLCJUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciIsIkJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzIiwiQmFzZVRyYW5zaXRpb24iLCJzbG90cyIsImdldEN1cnJlbnRJbnN0YW5jZSIsInByZXZUcmFuc2l0aW9uS2V5IiwiY2hpbGRyZW4iLCJnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4iLCJjaGlsZCIsImhhc0ZvdW5kIiwiYyIsIkNvbW1lbnQiLCJyYXdQcm9wcyIsIm1vZGUiLCJlbXB0eVBsYWNlaG9sZGVyIiwiaW5uZXJDaGlsZCIsImdldEtlZXBBbGl2ZUNoaWxkIiwiZW50ZXJIb29rcyIsInJlc29sdmVUcmFuc2l0aW9uSG9va3MiLCJzZXRUcmFuc2l0aW9uSG9va3MiLCJvbGRDaGlsZCIsIm9sZElubmVyQ2hpbGQiLCJ0cmFuc2l0aW9uS2V5Q2hhbmdlZCIsImdldFRyYW5zaXRpb25LZXkiLCJpc1NhbWVWTm9kZVR5cGUiLCJsZWF2aW5nSG9va3MiLCJlbCIsImVhcmx5UmVtb3ZlIiwiZGVsYXllZExlYXZlIiwibGVhdmluZ1ZOb2Rlc0NhY2hlIiwiZ2V0TGVhdmluZ05vZGVzRm9yVHlwZSIsImxlYXZpbmdWTm9kZXMiLCJhcHBlYXIiLCJwZXJzaXN0ZWQiLCJvbkJlZm9yZUVudGVyIiwib25FbnRlciIsIm9uQWZ0ZXJFbnRlciIsIm9uRW50ZXJDYW5jZWxsZWQiLCJvbkJlZm9yZUxlYXZlIiwib25MZWF2ZSIsIm9uQWZ0ZXJMZWF2ZSIsIm9uTGVhdmVDYW5jZWxsZWQiLCJvbkJlZm9yZUFwcGVhciIsIm9uQXBwZWFyIiwib25BZnRlckFwcGVhciIsIm9uQXBwZWFyQ2FuY2VsbGVkIiwiY2FsbEhvb2siLCJjYWxsQXN5bmNIb29rIiwiaG9vazIiLCJob29rcyIsImxlYXZpbmdWTm9kZSIsImFmdGVySG9vayIsImNhbmNlbEhvb2siLCJjYWxsZWQiLCJjYW5jZWxsZWQiLCJ2bm9kZTIiLCJpc0tlZXBBbGl2ZSIsImNsb25lVk5vZGUiLCJrZWVwQ29tbWVudCIsInBhcmVudEtleSIsInJldCIsImtleWVkRnJhZ21lbnRDb3VudCIsIkZyYWdtZW50IiwiaXNBc3luY1dyYXBwZXIiLCJpbmplY3RIb29rIiwicHJlcGVuZCIsIndyYXBwZWRIb29rIiwiYXBpTmFtZSIsInRvSGFuZGxlcktleSIsImNyZWF0ZUhvb2siLCJsaWZlY3ljbGUiLCJyZW5kZXJMaXN0IiwicmVuZGVySXRlbSIsImNhY2hlIiwiY2FjaGVkIiwiaXRlbSIsInJlbmRlclNsb3QiLCJmYWxsYmFjayIsIm5vU2xvdHRlZCIsImNyZWF0ZVZOb2RlIiwic2xvdCIsIm9wZW5CbG9jayIsInZhbGlkU2xvdENvbnRlbnQiLCJlbnN1cmVWYWxpZFZOb2RlIiwicmVuZGVyZWQiLCJjcmVhdGVCbG9jayIsInZub2RlcyIsImlzVk5vZGUiLCJnZXRQdWJsaWNJbnN0YW5jZSIsImlzU3RhdGVmdWxDb21wb25lbnQiLCJwdWJsaWNQcm9wZXJ0aWVzTWFwIiwicmVzb2x2ZU1lcmdlZE9wdGlvbnMiLCJpc1Jlc2VydmVkUHJlZml4IiwiaGFzU2V0dXBCaW5kaW5nIiwiUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzIiwic2V0dXBTdGF0ZSIsImRhdGEiLCJhY2Nlc3NDYWNoZSIsImFwcENvbnRleHQiLCJub3JtYWxpemVkUHJvcHMiLCJuIiwicHVibGljR2V0dGVyIiwiY3NzTW9kdWxlIiwiZ2xvYmFsUHJvcGVydGllcyIsInByb3BzT3B0aW9ucyIsImRlc2NyaXB0b3IiLCJ1c2VTbG90cyIsImdldENvbnRleHQiLCJjcmVhdGVTZXR1cENvbnRleHQiLCJub3JtYWxpemVQcm9wc09yRW1pdHMiLCJub3JtYWxpemVkIiwiYmFzZSIsIm1peGlucyIsImV4dGVuZHNPcHRpb25zIiwiZ2xvYmFsTWl4aW5zIiwib3B0aW9uTWVyZ2VTdHJhdGVnaWVzIiwicmVzb2x2ZWQiLCJtIiwibWVyZ2VPcHRpb25zIiwidG8iLCJmcm9tIiwic3RyYXRzIiwiYXNNaXhpbiIsInN0cmF0IiwiaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyIsIm1lcmdlRGF0YUZuIiwibWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zIiwibWVyZ2VPYmplY3RPcHRpb25zIiwibWVyZ2VBc0FycmF5IiwibWVyZ2VXYXRjaE9wdGlvbnMiLCJtZXJnZUluamVjdCIsIm5vcm1hbGl6ZUluamVjdCIsIm1lcmdlZCIsImlzVGVsZXBvcnQiLCJUZXh0IiwiYmxvY2tTdGFjayIsImN1cnJlbnRCbG9jayIsImRpc2FibGVUcmFja2luZyIsImNsb3NlQmxvY2siLCJpc0Jsb2NrVHJlZUVuYWJsZWQiLCJzZXR1cEJsb2NrIiwiRU1QVFlfQVJSIiwiY3JlYXRlRWxlbWVudEJsb2NrIiwicGF0Y2hGbGFnIiwiZHluYW1pY1Byb3BzIiwic2hhcGVGbGFnIiwiY3JlYXRlQmFzZVZOb2RlIiwibjEiLCJuMiIsImNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0iLCJfY3JlYXRlVk5vZGUiLCJJbnRlcm5hbE9iamVjdEtleSIsIm5vcm1hbGl6ZUtleSIsIm5vcm1hbGl6ZVJlZiIsInJlZiIsInJlZl9rZXkiLCJyZWZfZm9yIiwiaXNCbG9ja05vZGUiLCJuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbiIsIm5vcm1hbGl6ZUNoaWxkcmVuIiwiY2xvbmVkIiwiZ3VhcmRSZWFjdGl2ZVByb3BzIiwia2xhc3MiLCJzdHlsZSIsIm5vcm1hbGl6ZUNsYXNzIiwibm9ybWFsaXplU3R5bGUiLCJleHRyYVByb3BzIiwibWVyZ2VSZWYiLCJtZXJnZWRQcm9wcyIsIm1lcmdlUHJvcHMiLCJkZWVwQ2xvbmVWTm9kZSIsImNyZWF0ZVRleHRWTm9kZSIsInRleHQiLCJmbGFnIiwiY3JlYXRlQ29tbWVudFZOb2RlIiwiYXNCbG9jayIsInNsb3RGbGFnIiwidG9NZXJnZSIsImlzT24iLCJleGlzdGluZyIsImluY29taW5nIiwiaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UiLCJnbG9iYWxDdXJyZW50SW5zdGFuY2VTZXR0ZXJzIiwic2V0dGVyc0tleSIsImdldEF0dHJzUHJveHkiLCJnZXRTbG90c1Byb3h5IiwiZXhwb3NlIiwiZXhwb3NlZCIsImV4cG9zZWRUeXBlIiwiY2xhc3NpZnlSRSIsImNsYXNzaWZ5Iiwic3RyIiwiaW5jbHVkZUluZmVycmVkIiwiaW5mZXJGcm9tUmVnaXN0cnkiLCJoIiwicHJvcHNPckNoaWxkcmVuIiwiaW5pdEN1c3RvbUZvcm1hdHRlciIsInZ1ZVN0eWxlIiwibnVtYmVyU3R5bGUiLCJzdHJpbmdTdHlsZSIsImtleXdvcmRTdHlsZSIsImZvcm1hdHRlciIsImdlblJlZkZsYWciLCJmb3JtYXRWYWx1ZSIsImZvcm1hdEluc3RhbmNlIiwiYmxvY2tzIiwiY3JlYXRlSW5zdGFuY2VCbG9jayIsImNvbXB1dGVkIiwiZXh0cmFjdEtleXMiLCJpbmplY3RlZCIsImFzUmF3IiwiQ29tcCIsImV4dHJhY3RlZCIsImlzS2V5T2ZUeXBlIiwib3B0cyIsIlRSQU5TSVRJT04iLCJBTklNQVRJT04iLCJ2dGNLZXkiLCJUcmFuc2l0aW9uIiwicmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyIsIkRPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMiLCJoMiIsImhhc0V4cGxpY2l0Q2FsbGJhY2siLCJiYXNlUHJvcHMiLCJkdXJhdGlvbiIsImVudGVyRnJvbUNsYXNzIiwiZW50ZXJBY3RpdmVDbGFzcyIsImVudGVyVG9DbGFzcyIsImFwcGVhckZyb21DbGFzcyIsImFwcGVhckFjdGl2ZUNsYXNzIiwiYXBwZWFyVG9DbGFzcyIsImxlYXZlRnJvbUNsYXNzIiwibGVhdmVBY3RpdmVDbGFzcyIsImxlYXZlVG9DbGFzcyIsImR1cmF0aW9ucyIsIm5vcm1hbGl6ZUR1cmF0aW9uIiwiZW50ZXJEdXJhdGlvbiIsImxlYXZlRHVyYXRpb24iLCJmaW5pc2hFbnRlciIsImlzQXBwZWFyIiwicmVtb3ZlVHJhbnNpdGlvbkNsYXNzIiwiZmluaXNoTGVhdmUiLCJtYWtlRW50ZXJIb29rIiwibmV4dEZyYW1lIiwiYWRkVHJhbnNpdGlvbkNsYXNzIiwid2hlblRyYW5zaXRpb25FbmRzIiwiZm9yY2VSZWZsb3ciLCJOdW1iZXJPZiIsInRvTnVtYmVyIiwiY2xzIiwiX3Z0YyIsImVuZElkIiwiZXhwZWN0ZWRUeXBlIiwiZXhwbGljaXRUaW1lb3V0IiwicmVzb2x2ZUlmTm90U3RhbGUiLCJ0aW1lb3V0IiwicHJvcENvdW50IiwiZ2V0VHJhbnNpdGlvbkluZm8iLCJlbmRFdmVudCIsImVuZGVkIiwib25FbmQiLCJzdHlsZXMiLCJnZXRTdHlsZVByb3BlcnRpZXMiLCJ0cmFuc2l0aW9uRGVsYXlzIiwidHJhbnNpdGlvbkR1cmF0aW9ucyIsInRyYW5zaXRpb25UaW1lb3V0IiwiZ2V0VGltZW91dCIsImFuaW1hdGlvbkRlbGF5cyIsImFuaW1hdGlvbkR1cmF0aW9ucyIsImFuaW1hdGlvblRpbWVvdXQiLCJoYXNUcmFuc2Zvcm0iLCJkZWxheXMiLCJkIiwidG9NcyIsInZTaG93T2xkS2V5IiwidlNob3ciLCJ0cmFuc2l0aW9uIiwic2V0RGlzcGxheSIsImFkZEV2ZW50TGlzdGVuZXIiLCJoYW5kbGVyIiwiZ2V0TW9kZWxBc3NpZ25lciIsImludm9rZUFycmF5Rm5zIiwib25Db21wb3NpdGlvblN0YXJ0Iiwib25Db21wb3NpdGlvbkVuZCIsImFzc2lnbktleSIsInZNb2RlbFRleHQiLCJsYXp5IiwidHJpbSIsIm51bWJlciIsImNhc3RUb051bWJlciIsImRvbVZhbHVlIiwibG9vc2VUb051bWJlciIsInZNb2RlbENoZWNrYm94IiwiXyIsIm1vZGVsVmFsdWUiLCJlbGVtZW50VmFsdWUiLCJnZXRWYWx1ZSIsImNoZWNrZWQiLCJhc3NpZ24iLCJsb29zZUluZGV4T2YiLCJmb3VuZCIsImZpbHRlcmVkIiwiZ2V0Q2hlY2tib3hWYWx1ZSIsInNldENoZWNrZWQiLCJiaW5kaW5nIiwibG9vc2VFcXVhbCIsInZNb2RlbFJhZGlvIiwidk1vZGVsU2VsZWN0IiwiaXNTZXRNb2RlbCIsInNlbGVjdGVkVmFsIiwibyIsInNldFNlbGVjdGVkIiwiX2JpbmRpbmciLCJpc011bHRpcGxlIiwib3B0aW9uIiwib3B0aW9uVmFsdWUiLCJ2TW9kZWxEeW5hbWljIiwiY2FsbE1vZGVsSG9vayIsInByZXZWTm9kZSIsInJlc29sdmVEeW5hbWljTW9kZWwiLCJ0YWdOYW1lIiwic3lzdGVtTW9kaWZpZXJzIiwibW9kaWZpZXJHdWFyZHMiLCJ3aXRoTW9kaWZpZXJzIiwiZ3VhcmQiLCJpbml0RGV2IiwiX3NmY19tYWluIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsImdldExvY2FsZU5hbWVzIiwidXBkYXRlIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsImVudGVyIiwic3RhcnRZZWFyIiwiZmlyc3REYXlXZWVrIiwibnVtRGF5cyIsInByZXZNb250aCIsInByZXZNb250aE51bURheXMiLCJub3ciLCJpc0RheSIsIm5leHRNb250aE5lZWQiLCJuZXh0TW9udGgiLCJsb2NhbGVOYW1lcyIsIm5hbWVzIiwiYWRkRXZlbnRzIiwidGFyZ2V0cyIsImV2ZW50cyIsImFzQXJyYXkiLCJjb21iaW5lRXZlbnRzIiwiZ2V0S2V5IiwiZ2V0S2V5TmF2aWdhdGlvbiIsImdldFRhcmdldCIsImNsYXNzZXMiLCJoeXBoZW5hdGUiLCJzaG93IiwicG9wdXAiLCJfYiIsIl9jIiwiYm91bmRzIiwidHJpZ2dlckxlZnQiLCJ0cmlnZ2VyVG9wIiwidHJpZ2dlcldpZHRoIiwidHJpZ2dlckhlaWdodCIsInBvcHVwV2lkdGgiLCJwb3B1cEhlaWdodCIsInBhcnQxIiwicGFydDIiLCJ3aW5XaWR0aCIsIndpbkhlaWdodCIsImxlZnQiLCJ0b3AiLCJ0cmlnZ2VyQm91bmRzIiwiaW5wdXQiLCJhdHRyaWJ1dGVzIiwibWluIiwibWF4IiwiZ2V0TGVuZ3RoIiwiX29wZW5CbG9jayIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJzZXRTZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb24iLCJUcmlnZ2VyIiwiQ2FsZW5kYXIiLCJJbnB1dEZpZWxkIiwiSWNvbiIsImRlZmF1bHRGb3JtYXRzIiwiZm9ybWF0IiwiZm9jdXMiLCJnZXREYXRlUGFydCIsImNhbGVuZGFyIiwidG9nZ2xlIiwic2VsZWN0aW9uIiwic21vb3RoIiwic2Nyb2xsIiwibGluZUhlaWdodCIsImRpc3RhbmNlIiwiaXNEaWdpdCIsImNoYXIiLCJEYXRlUGlja2VyIiwiVGltZVBpY2tlciIsImRpc2FibGVkIiwiYXNzaWduRGVlcGx5Iiwic2hvd1ByZXYiLCJzaG93TmV4dCIsImN1cnJlbnRQYWdlIiwibnVtUGFnZXMiLCJzaG93TGVuZ3RoIiwiYnV0dG9ucyIsInBhZ2UiLCJidXR0b24iLCJ1bmNoZWNrZWQiLCJUcmFuc2l0aW9uSGVpZ2h0IiwiZW5hYmxlZCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRTdHlsZSIsImVsZW1lbnQiLCJuZXh0VGltZW91dCIsImZvcmNlUmVwYWludCIsIndpZHRoIiwiaGVpZ2h0IiwiaGFzVk5vZGVDb250ZW50IiwiaGFzU2xvdENvbnRlbnQiXSwibWFwcGluZ3MiOiJ3VkFBTyxTQUFTQSxHQUFhQyxFQUFNLENBQ2pDLE1BQU8sQ0FDTCxN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
|
|
5
|
+
If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.`:"";S(`Failed to resolve ${e.slice(0,-1)}: ${t}${a}`)}return r}else process.env.NODE_ENV!=="production"&&S(`resolve${l.capitalize(e.slice(0,-1))} can only be used in render() or setup().`)}function Mn(e,t){return e&&(e[t]||e[l.camelize(t)]||e[l.capitalize(l.camelize(t))])}const Co=e=>e.__isSuspense;function To(e,t){t&&t.pendingBranch?l.isArray(e)?t.effects.push(...e):t.effects.push(e):Vn(e)}const nt={};function Oo(e,t,{immediate:n,deep:o,flush:i,onTrack:s,onTrigger:r}=l.EMPTY_OBJ){var a;process.env.NODE_ENV!=="production"&&!t&&(n!==void 0&&S('watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.'),o!==void 0&&S('watch() "deep" option is only respected when using the watch(source, callback, options?) signature.'));const f=V=>{S("Invalid watch source: ",V,"A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.")},u=xs()===((a=X)==null?void 0:a.scope)?X:null;let d,c=!1,p=!1;if(A(e)?(d=()=>e.value,c=Ot(e)):me(e)?(d=()=>e,o=!0):l.isArray(e)?(p=!0,c=e.some(V=>me(V)||Ot(V)),d=()=>e.map(V=>{if(A(V))return V.value;if(me(V))return _e(V);if(l.isFunction(V))return be(V,u,2);process.env.NODE_ENV!=="production"&&f(V)})):l.isFunction(e)?t?d=()=>be(e,u,2):d=()=>{if(!(u&&u.isUnmounted))return h&&h(),Ae(e,u,3,[w])}:(d=l.NOOP,process.env.NODE_ENV!=="production"&&f(e)),t&&o){const V=d;d=()=>_e(V())}let h,w=V=>{h=T.onStop=()=>{be(V,u,4),h=T.onStop=void 0}},_=p?new Array(e.length).fill(nt):nt;const C=()=>{if(T.active)if(t){const V=T.run();(o||c||(p?V.some((J,ke)=>l.hasChanged(J,_[ke])):l.hasChanged(V,_)))&&(h&&h(),Ae(t,u,3,[V,_===nt?void 0:p&&_[0]===nt?[]:_,w]),_=V)}else T.run()};C.allowRecurse=!!t;let q;i==="sync"?q=C:i==="post"?q=()=>Kn(C,u&&u.suspense):(C.pre=!0,u&&(C.id=u.uid),q=()=>At(C));const T=new Is(d,q);return process.env.NODE_ENV!=="production"&&(T.onTrack=s,T.onTrigger=r),t?n?C():_=T.run():i==="post"?Kn(T.run.bind(T),u&&u.suspense):T.run(),()=>{T.stop(),u&&u.scope&&l.remove(u.scope.effects,T)}}function Po(e,t,n){const o=this.proxy,i=l.isString(e)?e.includes(".")?Mo(o,e):()=>o[e]:e.bind(o,o);let s;l.isFunction(t)?s=t:(s=t.handler,n=t);const r=X;Yt(this);const a=Oo(i,s.bind(o),n);return r?Yt(r):Zn(),a}function Mo(e,t){const n=t.split(".");return()=>{let o=e;for(let i=0;i<n.length&&o;i++)o=o[n[i]];return o}}function _e(e,t){if(!l.isObject(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),A(e))_e(e.value,t);else if(l.isArray(e))for(let n=0;n<e.length;n++)_e(e[n],t);else if(l.isSet(e)||l.isMap(e))e.forEach(n=>{_e(n,t)});else if(l.isPlainObject(e))for(const n in e)_e(e[n],t);return e}function st(e,t){const n=O;if(n===null)return process.env.NODE_ENV!=="production"&&S("withDirectives can only be used inside render functions."),e;const o=ts(n)||n.proxy,i=e.dirs||(e.dirs=[]);for(let s=0;s<t.length;s++){let[r,a,f,u=l.EMPTY_OBJ]=t[s];r&&(l.isFunction(r)&&(r={mounted:r,updated:r}),r.deep&&_e(a),i.push({dir:r,instance:o,value:a,oldValue:void 0,arg:f,modifiers:u}))}return e}const ae=Symbol("_leaveCb"),ot=Symbol("_enterCb");function xo(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ao(()=>{e.isMounted=!0}),$o(()=>{e.isUnmounting=!0}),e}const z=[Function,Array],xn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:z,onEnter:z,onAfterEnter:z,onEnterCancelled:z,onBeforeLeave:z,onLeave:z,onAfterLeave:z,onLeaveCancelled:z,onBeforeAppear:z,onAppear:z,onAfterAppear:z,onAppearCancelled:z},ko={name:"BaseTransition",props:xn,setup(e,{slots:t}){const n=Xn(),o=xo();let i;return()=>{const s=t.default&&In(t.default(),!0);if(!s||!s.length)return;let r=s[0];if(s.length>1){let _=!1;for(const C of s)if(C.type!==Z){if(process.env.NODE_ENV!=="production"&&_){S("<transition> can only be used on a single element or component. Use <transition-group> for lists.");break}if(r=C,_=!0,process.env.NODE_ENV==="production")break}}const a=v(e),{mode:f}=a;if(process.env.NODE_ENV!=="production"&&f&&f!=="in-out"&&f!=="out-in"&&f!=="default"&&S(`invalid <transition> mode: ${f}`),o.isLeaving)return Lt(r);const u=Fn(r);if(!u)return Lt(r);const d=Bt(u,a,o,n);zt(u,d);const c=n.subTree,p=c&&Fn(c);let h=!1;const{getTransitionKey:w}=u.type;if(w){const _=w();i===void 0?i=_:_!==i&&(i=_,h=!0)}if(p&&p.type!==Z&&(!Yn(u,p)||h)){const _=Bt(p,a,o,n);if(zt(p,_),f==="out-in")return o.isLeaving=!0,_.afterLeave=()=>{o.isLeaving=!1,n.update.active!==!1&&n.update()},Lt(r);f==="in-out"&&u.type!==Z&&(_.delayLeave=(C,q,T)=>{const Ee=kn(o,p);Ee[String(p.key)]=p,C[ae]=()=>{q(),C[ae]=void 0,delete d.delayedLeave},d.delayedLeave=T})}return r}}};function kn(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function Bt(e,t,n,o){const{appear:i,mode:s,persisted:r=!1,onBeforeEnter:a,onEnter:f,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:c,onLeave:p,onAfterLeave:h,onLeaveCancelled:w,onBeforeAppear:_,onAppear:C,onAfterAppear:q,onAppearCancelled:T}=t,Ee=String(e.key),V=kn(n,e),J=(E,M)=>{E&&Ae(E,o,9,M)},ke=(E,M)=>{const F=M[1];J(E,M),l.isArray(E)?E.every(Q=>Q.length<=1)&&F():E.length<=1&&F()},Ue={mode:s,persisted:r,beforeEnter(E){let M=a;if(!n.isMounted)if(i)M=_||a;else return;E[ae]&&E[ae](!0);const F=V[Ee];F&&Yn(e,F)&&F.el[ae]&&F.el[ae](),J(M,[E])},enter(E){let M=f,F=u,Q=d;if(!n.isMounted)if(i)M=C||f,F=q||u,Q=T||d;else return;let g=!1;const x=E[ot]=ne=>{g||(g=!0,ne?J(Q,[E]):J(F,[E]),Ue.delayedLeave&&Ue.delayedLeave(),E[ot]=void 0)};M?ke(M,[E,x]):x()},leave(E,M){const F=String(e.key);if(E[ot]&&E[ot](!0),n.isUnmounting)return M();J(c,[E]);let Q=!1;const g=E[ae]=x=>{Q||(Q=!0,M(),x?J(w,[E]):J(h,[E]),E[ae]=void 0,V[F]===e&&delete V[F])};V[F]=e,p?ke(p,[E,g]):g()},clone(E){return Bt(E,t,n,o)}};return Ue}function Lt(e){if(An(e))return e=Ce(e),e.children=null,e}function Fn(e){return An(e)?process.env.NODE_ENV!=="production"&&e.component?e.component.subTree:e.children?e.children[0]:void 0:e}function zt(e,t){e.shapeFlag&6&&e.component?zt(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function In(e,t=!1,n){let o=[],i=0;for(let s=0;s<e.length;s++){let r=e[s];const a=n==null?r.key:String(n)+String(r.key!=null?r.key:s);r.type===N?(r.patchFlag&128&&i++,o=o.concat(In(r.children,t,a))):(t||r.type!==Z)&&o.push(a!=null?Ce(r,{key:a}):r)}if(i>1)for(let s=0;s<o.length;s++)o[s].patchFlag=-2;return o}const Fo=e=>!!e.type.__asyncLoader,An=e=>e.type.__isKeepAlive;function Io(e,t,n=X,o=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Dt(),Yt(n);const a=Ae(t,n,e,r);return Zn(),Vt(),a});return o?i.unshift(s):i.push(s),s}else if(process.env.NODE_ENV!=="production"){const i=l.toHandlerKey(kt[e].replace(/ hook$/,""));S(`${i} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`)}}const $n=e=>(t,n=X)=>Io(e,(...o)=>t(...o),n),Ao=$n("m"),$o=$n("bum");function ue(e,t,n,o){let i;const s=n&&n[o];if(l.isArray(e)||l.isString(e)){i=new Array(e.length);for(let r=0,a=e.length;r<a;r++)i[r]=t(e[r],r,void 0,s&&s[r])}else if(typeof e=="number"){process.env.NODE_ENV!=="production"&&!Number.isInteger(e)&&S(`The v-for range expect an integer value but got ${e}.`),i=new Array(e);for(let r=0;r<e;r++)i[r]=t(r+1,r,void 0,s&&s[r])}else if(l.isObject(e))if(e[Symbol.iterator])i=Array.from(e,(r,a)=>t(r,a,void 0,s&&s[a]));else{const r=Object.keys(e);i=new Array(r.length);for(let a=0,f=r.length;a<f;a++){const u=r[a];i[a]=t(e[u],u,a,s&&s[a])}}else i=[];return n&&(n[o]=i),i}function P(e,t,n={},o,i){if(O.isCE||O.parent&&Fo(O.parent)&&O.parent.isCE)return t!=="default"&&(n.name=t),I("slot",n,o&&o());let s=e[t];process.env.NODE_ENV!=="production"&&s&&s.length>1&&(S("SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template."),s=()=>[]),s&&s._c&&(s._d=!1),m();const r=s&&Rn(s(n)),a=Ne(N,{key:n.key||r&&r.key||`_${t}`},r||(o?o():[]),r&&e._===1?64:-2);return!i&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function Rn(e){return e.some(t=>lt(t)?!(t.type===Z||t.type===N&&!Rn(t.children)):!0)?e:null}const Ht=e=>e?Xo(e)?ts(e)||e.proxy:Ht(e.parent):null,Be=l.extend(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>process.env.NODE_ENV!=="production"?Ze(e.props):e.props,$attrs:e=>process.env.NODE_ENV!=="production"?Ze(e.attrs):e.attrs,$slots:e=>process.env.NODE_ENV!=="production"?Ze(e.slots):e.slots,$refs:e=>process.env.NODE_ENV!=="production"?Ze(e.refs):e.refs,$parent:e=>Ht(e.parent),$root:e=>Ht(e.root),$emit:e=>e.emit,$options:e=>Ho(e),$forceUpdate:e=>e.f||(e.f=()=>At(e.update)),$nextTick:e=>e.n||(e.n=go.bind(e.proxy)),$watch:e=>Po.bind(e)}),Ro=e=>e==="_"||e==="$",Kt=(e,t)=>e!==l.EMPTY_OBJ&&!e.__isScriptSetup&&l.hasOwn(e,t),Bo={get({_:e},t){const{ctx:n,setupState:o,data:i,props:s,accessCache:r,type:a,appContext:f}=e;if(process.env.NODE_ENV!=="production"&&t==="__isVue")return!0;let u;if(t[0]!=="$"){const h=r[t];if(h!==void 0)switch(h){case 1:return o[t];case 2:return i[t];case 4:return n[t];case 3:return s[t]}else{if(Kt(o,t))return r[t]=1,o[t];if(i!==l.EMPTY_OBJ&&l.hasOwn(i,t))return r[t]=2,i[t];if((u=e.propsOptions[0])&&l.hasOwn(u,t))return r[t]=3,s[t];if(n!==l.EMPTY_OBJ&&l.hasOwn(n,t))return r[t]=4,n[t];r[t]=0}}const d=Be[t];let c,p;if(d)return t==="$attrs"?(k(e,"get",t),process.env.NODE_ENV!=="production"&&void 0):process.env.NODE_ENV!=="production"&&t==="$slots"&&k(e,"get",t),d(e);if((c=a.__cssModules)&&(c=c[t]))return c;if(n!==l.EMPTY_OBJ&&l.hasOwn(n,t))return r[t]=4,n[t];if(p=f.config.globalProperties,l.hasOwn(p,t))return p[t];process.env.NODE_ENV!=="production"&&O&&(!l.isString(t)||t.indexOf("__v")!==0)&&(i!==l.EMPTY_OBJ&&Ro(t[0])&&l.hasOwn(i,t)?S(`Property ${JSON.stringify(t)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`):e===O&&S(`Property ${JSON.stringify(t)} was accessed during render but is not defined on instance.`))},set({_:e},t,n){const{data:o,setupState:i,ctx:s}=e;return Kt(i,t)?(i[t]=n,!0):process.env.NODE_ENV!=="production"&&i.__isScriptSetup&&l.hasOwn(i,t)?(S(`Cannot mutate <script setup> binding "${t}" from Options API.`),!1):o!==l.EMPTY_OBJ&&l.hasOwn(o,t)?(o[t]=n,!0):l.hasOwn(e.props,t)?(process.env.NODE_ENV!=="production"&&S(`Attempting to mutate prop "${t}". Props are readonly.`),!1):t[0]==="$"&&t.slice(1)in e?(process.env.NODE_ENV!=="production"&&S(`Attempting to mutate public property "${t}". Properties starting with $ are reserved and readonly.`),!1):(process.env.NODE_ENV!=="production"&&t in e.appContext.config.globalProperties?Object.defineProperty(s,t,{enumerable:!0,configurable:!0,value:n}):s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:i,propsOptions:s}},r){let a;return!!n[r]||e!==l.EMPTY_OBJ&&l.hasOwn(e,r)||Kt(t,r)||(a=s[0])&&l.hasOwn(a,r)||l.hasOwn(o,r)||l.hasOwn(Be,r)||l.hasOwn(i.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:l.hasOwn(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};process.env.NODE_ENV!=="production"&&(Bo.ownKeys=e=>(S("Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead."),Reflect.ownKeys(e)));function Lo(){return zo().slots}function zo(){const e=Xn();return process.env.NODE_ENV!=="production"&&!e&&S("useContext() called without active instance."),e.setupContext||(e.setupContext=Zo(e))}function Bn(e){return l.isArray(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Ho(e){const t=e.type,{mixins:n,extends:o}=t,{mixins:i,optionsCache:s,config:{optionMergeStrategies:r}}=e.appContext,a=s.get(t);let f;return a?f=a:!i.length&&!n&&!o?f=t:(f={},i.length&&i.forEach(u=>it(f,u,r,!0)),it(f,t,r)),l.isObject(t)&&s.set(t,f),f}function it(e,t,n,o=!1){const{mixins:i,extends:s}=t;s&&it(e,s,n,!0),i&&i.forEach(r=>it(e,r,n,!0));for(const r in t)if(o&&r==="expose")process.env.NODE_ENV!=="production"&&S('"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.');else{const a=Ko[r]||n&&n[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const Ko={data:Ln,props:Hn,emits:Hn,methods:Le,computed:Le,beforeCreate:$,created:$,beforeMount:$,mounted:$,beforeUpdate:$,updated:$,beforeDestroy:$,beforeUnmount:$,destroyed:$,unmounted:$,activated:$,deactivated:$,errorCaptured:$,serverPrefetch:$,components:Le,directives:Le,watch:jo,provide:Ln,inject:Uo};function Ln(e,t){return t?e?function(){return l.extend(l.isFunction(e)?e.call(this,this):e,l.isFunction(t)?t.call(this,this):t)}:t:e}function Uo(e,t){return Le(zn(e),zn(t))}function zn(e){if(l.isArray(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function $(e,t){return e?[...new Set([].concat(e,t))]:t}function Le(e,t){return e?l.extend(Object.create(null),e,t):t}function Hn(e,t){return e?l.isArray(e)&&l.isArray(t)?[...new Set([...e,...t])]:l.extend(Object.create(null),Bn(e),Bn(t??{})):t}function jo(e,t){if(!e)return t;if(!t)return e;const n=l.extend(Object.create(null),e);for(const o in t)n[o]=$(e[o],t[o]);return n}const Kn=To,Yo=e=>e.__isTeleport,N=Symbol.for("v-fgt"),Wo=Symbol.for("v-txt"),Z=Symbol.for("v-cmt"),rt=[];let Y=null;function m(e=!1){rt.push(Y=e?null:[])}function qo(){rt.pop(),Y=rt[rt.length-1]||null}let ze=1;function Un(e){ze+=e}function jn(e){return e.dynamicChildren=ze>0?Y||l.EMPTY_ARR:null,qo(),ze>0&&Y&&Y.push(e),e}function b(e,t,n,o,i,s){return jn(y(e,t,n,o,i,s,!0))}function Ne(e,t,n,o,i){return jn(I(e,t,n,o,i,!0))}function lt(e){return e?e.__v_isVNode===!0:!1}function Yn(e,t){return process.env.NODE_ENV!=="production"&&t.shapeFlag&6&&Ve.has(t.type)?(e.shapeFlag&=-257,t.shapeFlag&=-513,!1):e.type===t.type&&e.key===t.key}const Jo=(...e)=>Jn(...e),Wn="__vInternal",qn=({key:e})=>e??null,at=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?l.isString(e)||A(e)||l.isFunction(e)?{i:O,r:e,k:t,f:!!n}:e:null);function y(e,t=null,n=null,o=0,i=null,s=e===N?0:1,r=!1,a=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&qn(t),ref:t&&at(t),scopeId:On,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:o,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:O};return a?(Ut(f,n),s&128&&e.normalize(f)):n&&(f.shapeFlag|=l.isString(n)?8:16),process.env.NODE_ENV!=="production"&&f.key!==f.key&&S("VNode created with invalid key (NaN). VNode type:",f.type),ze>0&&!r&&Y&&(f.patchFlag>0||s&6)&&f.patchFlag!==32&&Y.push(f),f}const I=process.env.NODE_ENV!=="production"?Jo:Jn;function Jn(e,t=null,n=null,o=0,i=null,s=!1){if((!e||e===Vo)&&(process.env.NODE_ENV!=="production"&&!e&&S(`Invalid vnode type when creating vnode: ${e}.`),e=Z),lt(e)){const a=Ce(e,t,!0);return n&&Ut(a,n),ze>0&&!s&&Y&&(a.shapeFlag&6?Y[Y.indexOf(e)]=a:Y.push(a)),a.patchFlag|=-2,a}if(ss(e)&&(e=e.__vccOpts),t){t=Go(t);let{class:a,style:f}=t;a&&!l.isString(a)&&(t.class=l.normalizeClass(a)),l.isObject(f)&&(Pt(f)&&!l.isArray(f)&&(f=l.extend({},f)),t.style=l.normalizeStyle(f))}const r=l.isString(e)?1:Co(e)?128:Yo(e)?64:l.isObject(e)?4:l.isFunction(e)?2:0;return process.env.NODE_ENV!=="production"&&r&4&&Pt(e)&&(e=v(e),S("Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`.",`
|
|
6
|
+
Component that was made reactive: `,e)),y(e,t,n,o,i,r,s,!0)}function Go(e){return e?Pt(e)||Wn in e?l.extend({},e):e:null}function Ce(e,t,n=!1){const{props:o,ref:i,patchFlag:s,children:r}=e,a=t?W(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&qn(a),ref:t&&t.ref?n&&i?l.isArray(i)?i.concat(at(t)):[i,at(t)]:at(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:process.env.NODE_ENV!=="production"&&s===-1&&l.isArray(r)?r.map(Gn):r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==N?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ce(e.ssContent),ssFallback:e.ssFallback&&Ce(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Gn(e){const t=Ce(e);return l.isArray(e.children)&&(t.children=e.children.map(Gn)),t}function ut(e=" ",t=0){return I(Wo,null,e,t)}function H(e="",t=!1){return t?(m(),Ne(Z,null,e)):I(Z,null,e)}function Ut(e,t){let n=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(l.isArray(t))n=16;else if(typeof t=="object")if(o&65){const i=t.default;i&&(i._c&&(i._d=!1),Ut(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!(Wn in t)?t._ctx=O:i===3&&O&&(O.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else l.isFunction(t)?(t={default:t,_ctx:O},n=32):(t=String(t),o&64?(n=16,t=[ut(t)]):n=8);e.children=t,e.shapeFlag|=n}function W(...e){const t={};for(let n=0;n<e.length;n++){const o=e[n];for(const i in o)if(i==="class")t.class!==o.class&&(t.class=l.normalizeClass([t.class,o.class]));else if(i==="style")t.style=l.normalizeStyle([t.style,o.style]);else if(l.isOn(i)){const s=t[i],r=o[i];r&&s!==r&&!(l.isArray(s)&&s.includes(r))&&(t[i]=s?[].concat(s,r):r)}else i!==""&&(t[i]=o[i])}return t}let X=null;const Xn=()=>X||O;let jt,Te,Qn="__VUE_INSTANCE_SETTERS__";(Te=l.getGlobalThis()[Qn])||(Te=l.getGlobalThis()[Qn]=[]),Te.push(e=>X=e),jt=e=>{Te.length>1?Te.forEach(t=>t(e)):Te[0](e)};const Yt=e=>{jt(e),e.scope.on()},Zn=()=>{X&&X.scope.off(),jt(null)};function Xo(e){return e.vnode.shapeFlag&4}function es(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,process.env.NODE_ENV!=="production"?{get(t,n){return k(e,"get","$attrs"),t[n]},set(){return S("setupContext.attrs is readonly."),!1},deleteProperty(){return S("setupContext.attrs is readonly."),!1}}:{get(t,n){return k(e,"get","$attrs"),t[n]}}))}function Qo(e){return e.slotsProxy||(e.slotsProxy=new Proxy(e.slots,{get(t,n){return k(e,"get","$slots"),t[n]}}))}function Zo(e){const t=n=>{if(process.env.NODE_ENV!=="production"&&(e.exposed&&S("expose() should be called only once per setup()."),n!=null)){let o=typeof n;o==="object"&&(l.isArray(n)?o="array":A(n)&&(o="ref")),o!=="object"&&S(`expose() should be passed a plain object, received ${o}.`)}e.exposed=n||{}};return process.env.NODE_ENV!=="production"?Object.freeze({get attrs(){return es(e)},get slots(){return Qo(e)},get emit(){return(n,...o)=>e.emit(n,...o)},expose:t}):{get attrs(){return es(e)},slots:e.slots,emit:e.emit,expose:t}}function ts(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(oo(to(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Be)return Be[n](e)},has(t,n){return n in t||n in Be}}))}const ei=/(?:^|[-_])(\w)/g,ti=e=>e.replace(ei,t=>t.toUpperCase()).replace(/[-_]/g,"");function Wt(e,t=!0){return l.isFunction(e)?e.displayName||e.name:e.name||t&&e.__name}function ns(e,t,n=!1){let o=Wt(t);if(!o&&t.__file){const i=t.__file.match(/([^/\\]+)\.\w+$/);i&&(o=i[1])}if(!o&&e&&e.parent){const i=s=>{for(const r in s)if(s[r]===t)return r};o=i(e.components||e.parent.type.components)||i(e.appContext.components)}return o?ti(o):n?"App":"Anonymous"}function ss(e){return l.isFunction(e)&&"__vccOpts"in e}function os(e,t,n){const o=arguments.length;return o===2?l.isObject(t)&&!l.isArray(t)?lt(t)?I(e,null,[t]):I(e,t):I(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):o===3&<(n)&&(n=[n]),I(e,t,n))}function qt(e){return!!(e&&e.__v_isShallow)}function ni(){if(process.env.NODE_ENV==="production"||typeof window>"u")return;const e={style:"color:#3ba776"},t={style:"color:#0b1bc9"},n={style:"color:#b62e24"},o={style:"color:#9d288c"},i={header(c){return l.isObject(c)?c.__isVue?["div",e,"VueInstance"]:A(c)?["div",{},["span",e,d(c)],"<",a(c.value),">"]:me(c)?["div",{},["span",e,qt(c)?"ShallowReactive":"Reactive"],"<",a(c),`>${ye(c)?" (readonly)":""}`]:ye(c)?["div",{},["span",e,qt(c)?"ShallowReadonly":"Readonly"],"<",a(c),">"]:null:null},hasBody(c){return c&&c.__isVue},body(c){if(c&&c.__isVue)return["div",{},...s(c.$)]}};function s(c){const p=[];c.type.props&&c.props&&p.push(r("props",v(c.props))),c.setupState!==l.EMPTY_OBJ&&p.push(r("setup",c.setupState)),c.data!==l.EMPTY_OBJ&&p.push(r("data",v(c.data)));const h=f(c,"computed");h&&p.push(r("computed",h));const w=f(c,"inject");return w&&p.push(r("injected",w)),p.push(["div",{},["span",{style:o.style+";opacity:0.66"},"$ (internal): "],["object",{object:c}]]),p}function r(c,p){return p=l.extend({},p),Object.keys(p).length?["div",{style:"line-height:1.25em;margin-bottom:0.6em"},["div",{style:"color:#476582"},c],["div",{style:"padding-left:1.25em"},...Object.keys(p).map(h=>["div",{},["span",o,h+": "],a(p[h],!1)])]]:["span",{}]}function a(c,p=!0){return typeof c=="number"?["span",t,c]:typeof c=="string"?["span",n,JSON.stringify(c)]:typeof c=="boolean"?["span",o,c]:l.isObject(c)?["object",{object:p?v(c):c}]:["span",n,String(c)]}function f(c,p){const h=c.type;if(l.isFunction(h))return;const w={};for(const _ in c.ctx)u(h,_,p)&&(w[_]=c.ctx[_]);return w}function u(c,p,h){const w=c[h];if(l.isArray(w)&&w.includes(p)||l.isObject(w)&&p in w||c.extends&&u(c.extends,p,h)||c.mixins&&c.mixins.some(_=>u(_,p,h)))return!0}function d(c){return qt(c)?"ShallowRef":c.effect?"ComputedRef":"Ref"}window.devtoolsFormatters?window.devtoolsFormatters.push(i):window.devtoolsFormatters=[i]}const ce="transition",He="animation",ct=Symbol("_vtc"),ft=(e,{slots:t})=>os(ko,si(e),t);ft.displayName="Transition";const is={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ft.props=l.extend({},xn,is);const ve=(e,t=[])=>{l.isArray(e)?e.forEach(n=>n(...t)):e&&e(...t)},rs=e=>e?l.isArray(e)?e.some(t=>t.length>1):e.length>1:!1;function si(e){const t={};for(const g in e)g in is||(t[g]=e[g]);if(e.css===!1)return t;const{name:n="v",type:o,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:f=s,appearActiveClass:u=r,appearToClass:d=a,leaveFromClass:c=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,w=oi(i),_=w&&w[0],C=w&&w[1],{onBeforeEnter:q,onEnter:T,onEnterCancelled:Ee,onLeave:V,onLeaveCancelled:J,onBeforeAppear:ke=q,onAppear:Ue=T,onAppearCancelled:E=Ee}=t,M=(g,x,ne)=>{Se(g,x?d:a),Se(g,x?u:r),ne&&ne()},F=(g,x)=>{g._isLeaving=!1,Se(g,c),Se(g,h),Se(g,p),x&&x()},Q=g=>(x,ne)=>{const Ts=g?Ue:T,Os=()=>M(x,g,ne);ve(Ts,[x,Os]),ls(()=>{Se(x,g?f:s),fe(x,g?d:a),rs(Ts)||as(x,o,_,Os)})};return l.extend(t,{onBeforeEnter(g){ve(q,[g]),fe(g,s),fe(g,r)},onBeforeAppear(g){ve(ke,[g]),fe(g,f),fe(g,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(g,x){g._isLeaving=!0;const ne=()=>F(g,x);fe(g,c),li(),fe(g,p),ls(()=>{g._isLeaving&&(Se(g,c),fe(g,h),rs(V)||as(g,o,C,ne))}),ve(V,[g,ne])},onEnterCancelled(g){M(g,!1),ve(Ee,[g])},onAppearCancelled(g){M(g,!0),ve(E,[g])},onLeaveCancelled(g){F(g),ve(J,[g])}})}function oi(e){if(e==null)return null;if(l.isObject(e))return[Jt(e.enter),Jt(e.leave)];{const t=Jt(e);return[t,t]}}function Jt(e){const t=l.toNumber(e);return process.env.NODE_ENV!=="production"&&fo(t,"<transition> explicit duration"),t}function fe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ct]||(e[ct]=new Set)).add(t)}function Se(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const n=e[ct];n&&(n.delete(t),n.size||(e[ct]=void 0))}function ls(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ii=0;function as(e,t,n,o){const i=e._endId=++ii,s=()=>{i===e._endId&&o()};if(n)return setTimeout(s,n);const{type:r,timeout:a,propCount:f}=ri(e,t);if(!r)return o();const u=r+"end";let d=0;const c=()=>{e.removeEventListener(u,p),s()},p=h=>{h.target===e&&++d>=f&&c()};setTimeout(()=>{d<f&&c()},a+1),e.addEventListener(u,p)}function ri(e,t){const n=window.getComputedStyle(e),o=w=>(n[w]||"").split(", "),i=o(`${ce}Delay`),s=o(`${ce}Duration`),r=us(i,s),a=o(`${He}Delay`),f=o(`${He}Duration`),u=us(a,f);let d=null,c=0,p=0;t===ce?r>0&&(d=ce,c=r,p=s.length):t===He?u>0&&(d=He,c=u,p=f.length):(c=Math.max(r,u),d=c>0?r>u?ce:He:null,p=d?d===ce?s.length:f.length:0);const h=d===ce&&/\b(transform|all)(,|$)/.test(o(`${ce}Property`).toString());return{type:d,timeout:c,propCount:p,hasTransform:h}}function us(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,o)=>cs(n)+cs(e[o])))}function cs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function li(){return document.body.offsetHeight}const fs=Symbol("_vod"),ds={beforeMount(e,{value:t},{transition:n}){e[fs]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ke(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),Ke(e,!0),o.enter(e)):o.leave(e,()=>{Ke(e,!1)}):Ke(e,t))},beforeUnmount(e,{value:t}){Ke(e,t)}};function Ke(e,t){e.style.display=t?e[fs]:"none"}function de(e,t,n,o){e.addEventListener(t,n,o)}const pe=e=>{const t=e.props["onUpdate:modelValue"]||!1;return l.isArray(t)?n=>l.invokeArrayFns(t,n):t};function ai(e){e.target.composing=!0}function ps(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const K=Symbol("_assign"),hs={created(e,{modifiers:{lazy:t,trim:n,number:o}},i){e[K]=pe(i);const s=o||i.props&&i.props.type==="number";de(e,t?"change":"input",r=>{if(r.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=l.looseToNumber(a)),e[K](a)}),n&&de(e,"change",()=>{e.value=e.value.trim()}),t||(de(e,"compositionstart",ai),de(e,"compositionend",ps),de(e,"change",ps))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:o,number:i}},s){if(e[K]=pe(s),e.composing)return;const r=i||e.type==="number"?l.looseToNumber(e.value):e.value,a=t??"";r!==a&&(document.activeElement===e&&e.type!=="range"&&(n||o&&e.value.trim()===a)||(e.value=a))}},gs={deep:!0,created(e,t,n){e[K]=pe(n),de(e,"change",()=>{const o=e._modelValue,i=Oe(e),s=e.checked,r=e[K];if(l.isArray(o)){const a=l.looseIndexOf(o,i),f=a!==-1;if(s&&!f)r(o.concat(i));else if(!s&&f){const u=[...o];u.splice(a,1),r(u)}}else if(l.isSet(o)){const a=new Set(o);s?a.add(i):a.delete(i),r(a)}else r(ws(e,s))})},mounted:ms,beforeUpdate(e,t,n){e[K]=pe(n),ms(e,t,n)}};function ms(e,{value:t,oldValue:n},o){e._modelValue=t,l.isArray(t)?e.checked=l.looseIndexOf(t,o.props.value)>-1:l.isSet(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=l.looseEqual(t,ws(e,!0)))}const ui={created(e,{value:t},n){e.checked=l.looseEqual(t,n.props.value),e[K]=pe(n),de(e,"change",()=>{e[K](Oe(e))})},beforeUpdate(e,{value:t,oldValue:n},o){e[K]=pe(o),t!==n&&(e.checked=l.looseEqual(t,o.props.value))}},ci={deep:!0,created(e,{value:t,modifiers:{number:n}},o){const i=l.isSet(t);de(e,"change",()=>{const s=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>n?l.looseToNumber(Oe(r)):Oe(r));e[K](e.multiple?i?new Set(s):s:s[0])}),e[K]=pe(o)},mounted(e,{value:t}){ys(e,t)},beforeUpdate(e,t,n){e[K]=pe(n)},updated(e,{value:t}){ys(e,t)}};function ys(e,t){const n=e.multiple;if(n&&!l.isArray(t)&&!l.isSet(t)){process.env.NODE_ENV!=="production"&&S(`<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(t).slice(8,-1)}.`);return}for(let o=0,i=e.options.length;o<i;o++){const s=e.options[o],r=Oe(s);if(n)l.isArray(t)?s.selected=l.looseIndexOf(t,r)>-1:s.selected=t.has(r);else if(l.looseEqual(Oe(s),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}function Oe(e){return"_value"in e?e._value:e.value}function ws(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const fi={created(e,t,n){dt(e,t,n,null,"created")},mounted(e,t,n){dt(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){dt(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){dt(e,t,n,o,"updated")}};function di(e,t){switch(e){case"SELECT":return ci;case"TEXTAREA":return hs;default:switch(t){case"checkbox":return gs;case"radio":return ui;default:return hs}}}function dt(e,t,n,o,i){const r=di(e.tagName,n.props&&n.props.type)[i];r&&r(e,t,n,o)}const pi=["ctrl","shift","alt","meta"],hi={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>pi.some(n=>e[`${n}Key`]&&!t.includes(n))},Pe=(e,t)=>(n,...o)=>{for(let i=0;i<t.length;i++){const s=hi[t[i]];if(s&&s(n,t))return}return e(n,...o)};function gi(){ni()}process.env.NODE_ENV!=="production"&&gi();const mi={class:"dito-calendar"},yi={class:"dito-calendar-popup"},wi={class:"dito-calendar-inner"},bi={class:"dito-calendar-header"},_i={class:"dito-calendar-body"},vi={class:"dito-calendar-weekdays"},Si={class:"dito-calendar-dates"},Ei=["onClick"],Di={class:"dito-calendar-footer"},Vi=["title"],Ni={class:"dito-calendar-header"},Ci={class:"dito-calendar-body"},Ti={class:"dito-calendar-months"},Oi=["onClick"],Pi={class:"dito-calendar-header"},Mi={class:"dito-calendar-body"},xi={class:"dito-calendar-years"},ki=["onClick"];function Fi(e,t,n,o,i,s){return m(),b("div",mi,[y("div",yi,[y("div",wi,[i.currentMode==="day"?(m(),b(N,{key:0},[y("div",bi,[y("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>s.stepYear(-1))}),y("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>s.stepMonth(-1))}),y("span",null,[y("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>s.setMode("year"))},l.toDisplayString(s.dateToString(i.currentValue,{year:!0})),1),y("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>s.setMode("month"))},l.toDisplayString(s.dateToString(i.currentValue,{month:!0})),1)]),y("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>s.stepMonth(1))}),y("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>s.stepYear(1))})]),y("div",_i,[y("div",vi,[(m(!0),b(N,null,ue(i.weekdayNames,r=>(m(),b("span",null,l.toDisplayString(r.short),1))),256))]),y("div",Si,[(m(!0),b(N,null,ue(i.dateRange,r=>(m(),b("span",{class:l.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:a=>r.state!=="disabled"&&s.selectDate(r.date)},l.toDisplayString(r.text),11,Ei))),256))])]),y("div",Di,[y("a",{class:"dito-calendar-select-now",role:"button",title:s.dateToString(new Date),onClick:t[6]||(t[6]=r=>s.selectDate(new Date))},null,8,Vi)])],64)):i.currentMode==="month"?(m(),b(N,{key:1},[y("div",Ni,[y("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>s.stepYear(-1))}),y("span",null,[y("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>s.setMode("year"))},l.toDisplayString(s.dateToString(i.currentValue,{year:!0})),1)]),y("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>s.stepYear(1))})]),y("div",Ci,[y("div",Ti,[(m(!0),b(N,null,ue(i.monthNames,(r,a)=>(m(),b("span",{class:l.normalizeClass(s.getMonthClass(a)),onClick:f=>s.selectMonth(a)},l.toDisplayString(r.short),11,Oi))),256))])])],64)):i.currentMode==="year"?(m(),b(N,{key:2},[y("div",Pi,[y("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>s.stepDecade(-1))}),y("span",null,l.toDisplayString(s.decadeToString(i.currentValue)),1),y("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>s.stepDecade(1))})]),y("div",Mi,[y("div",xi,[(m(!0),b(N,null,ue(i.yearRange,r=>(m(),b("span",{class:l.normalizeClass(s.getYearClass(r)),onClick:a=>s.selectYear(r)},l.toDisplayString(r),11,ki))),256))])])],64)):H("",!0)])])])}const ee=(e,t)=>{const n=e.__vccOpts||e;for(const[o,i]of t)n[o]=i;return n},Ii={emits:["update:modelValue","select"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=Ai(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||Fe(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e,t=!1){this.currentValue=Fe(this.currentValue,e),t&&this.$emit("update:modelValue",this.currentValue)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:n,month:o}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:o,day:Math.min(this.getDaysInMonth(n,o),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e){this.setDate(wt(e),!0),this.$emit("select")},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1},!0)},selectYear(e){this.setMode("month"),this.setDate({year:e},!0)},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:n,day:o}={year:!0,month:!0,day:!0}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:n&&"long",day:o&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({step:e,enter:t,mode:n=this.currentMode,update:o=!1}){const{currentValue:i}=this;if(e){switch(n){case"day":this.setDate({day:i.getDate()+e},o);break;case"month":this.setDate({month:i.getMonth()+e},o);break;case"year":this.setDate({year:i.getFullYear()+e},o);break}return!0}else if(t){switch(this.currentMode){case"day":this.selectDate(i);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),n=e.getMonth(),o=this.getFirstYearOfDecade(t);for(let u=0;u<10;u++)this.yearRange.push(o+u);let s=new Date(t,n,1).getDay()+1;s===0&&(s=7);const r=this.getDaysInMonth(t,n);if(s>1){const u=this.getYearMonth(t,n-1),d=this.getDaysInMonth(u.year,u.month);for(let c=1;c<s;c++){const p=d-s+c+1,h=new Date(u.year,u.month,p);this.dateRange.push({text:p,date:h,state:this.disabledDate(h)?"disabled":"gray"})}}const a=new Date;for(let u=1;u<=r;u++){const d=new Date(t,n,u),c=h=>h&&h.getDate()===u&&h.getFullYear()===t&&h.getMonth()===n,p=c(this.modelValue)?"active":c(a)?"today":this.disabledDate(d)?"disabled":c(e)?"current":null;this.dateRange.push({text:u,date:d,state:p})}const f=42-this.dateRange.length;if(f>0){const u=this.getYearMonth(t,n+1);for(let d=1;d<=f;d++){const c=new Date(u.year,u.month,d),p=this.disabledDate(c)?"disabled":"gray";this.dateRange.push({text:d,date:c,state:p})}}}}},bs={};function Ai(e){let t=bs[e];if(!t){const n=[];for(let i=0;i<7;i++){const s=new Date(0,0,i);n.push({long:s.toLocaleString(e,{weekday:"long"}),short:s.toLocaleString(e,{weekday:"short"})})}const o=[];for(let i=1;i<=12;i++){const s=new Date(0,i,0);o.push({long:s.toLocaleString(e,{month:"long"}),short:s.toLocaleString(e,{month:"short"})})}t=bs[e]={weekdayNames:n,monthNames:o}}return t}const _s=ee(Ii,[["render",Fi]]);function pt(e,t){e=e instanceof NodeList?Array.from(e):R.asArray(e);for(const[n,o]of Object.entries(t))for(const i of e)i.addEventListener(n,o,!1);return{remove(){for(const[n,o]of Object.entries(t))for(const i of e)i.removeEventListener(n,o,!1)}}}function vs(...e){return{remove(){for(const t of e)t.remove()}}}function Ss(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e==null?void 0:e.keyCode]}function ht(e){const t=Ss(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}function Gt(e){const t=R.isString(e.target)?e.$refs[e.target]:e.target;return(t==null?void 0:t.$el)??t}const $i={class:"dito-trigger-container"};function Ri(e,t,n,o,i,s){return m(),b("div",$i,[n.alwaysShow?(m(),b("div",{key:0,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger"},[P(e.$slots,"trigger")],2)):n.trigger==="click"?(m(),b("div",{key:1,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>s.onClick&&s.onClick(...r))},[P(e.$slots,"trigger")],2)):n.trigger==="hover"?(m(),b("div",{key:2,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>s.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>s.onHover(!1))},[P(e.$slots,"trigger")],34)):n.trigger==="focus"||n.trigger==="always"?(m(),b("div",{key:3,class:l.normalizeClass(["dito-trigger",s.triggerClass]),ref:"trigger"},[P(e.$slots,"trigger")],2)):H("",!0),I(ft,{name:`dito-${n.transition}`},{default:L(()=>[n.trigger==="hover"?st((m(),b("div",{key:0,class:l.normalizeClass(["dito-popup",s.popupClass]),ref:"popup",style:l.normalizeStyle(s.popupStyle),onMouseenter:t[3]||(t[3]=r=>s.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>s.onHover(!1))},[i.showPopup?P(e.$slots,"popup",{key:0}):H("",!0)],38)),[[ds,i.showPopup]]):st((m(),b("div",{key:1,class:l.normalizeClass(["dito-popup",s.popupClass]),ref:"popup",style:l.normalizeStyle(s.popupStyle)},[i.showPopup?P(e.$slots,"popup",{key:0}):H("",!0)],6)),[[ds,i.showPopup]])]),_:3},8,["name"])])}const Xt=ee({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement,focusEvents:null,closeEvents:null,popupEvents:null,blurTimer:null,mouseLeaveTimer:null}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${R.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""},triggerTarget(){return Gt(this)}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),this.$nextTick(()=>this.onShowPopup(e)))}},mounted(){const{trigger:e,popup:t}=this.$refs;this.trigger==="focus"&&(this.focusEvents=this.addFocusEvents(this.triggerTarget??e)),this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=pt(window,{mouseup:n=>{var o;this.showPopup&&!t.contains(n.target)&&!e.contains(n.target)&&!((o=this.triggerTarget)!=null&&o.contains(n.target))&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},unmounted(){var e,t,n;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),(n=this.popupEvents)==null||n.remove()},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const n=this.triggerTarget??e,o=this.target==="popup"?e:t.firstElementChild;o&&(o.style.width=getComputedStyle(n).width);const i=n.getBoundingClientRect(),s=i.left+window.scrollX,r=i.top+window.scrollY,a=i.width,f=i.height,u=t.offsetWidth,d=t.offsetHeight;let[c,p]=this.popupPlacement.split("-")||[];if(this.keepInView){const _=window.innerWidth,C=window.innerHeight;c==="top"?r<d&&(c="bottom"):c==="bottom"?C-r-f<d&&(c="top"):c==="left"?s<u&&(c="right"):c==="right"&&_-s-a<u&&(c="left"),p==="top"?C-r<d&&(p="bottom"):p==="bottom"?r+f<d&&(p="top"):p==="left"?_-s<u&&(p="right"):p==="right"&&s+a<u&&(p="left")}let h=0,w=0;switch(c){case"top":w-=d;break;case"left":h-=u;break;case"right":h+=a;break;case"bottom":w+=f;break}switch(p){case"right":h-=u-a;break;case"bottom":w-=d-f;break}if(this.cover&&(c==="top"?w+=f:c==="bottom"&&(w-=f)),n!==e){const _=e.getBoundingClientRect();h+=s-_.left,w+=r-_.top}t.style.left=`${h}px`,t.style.top=`${w}px`},addFocusEvents(e){const t=e.querySelectorAll("input, textarea");let n;return vs(pt(t,{focus:()=>{this.showPopup=!0,clearTimeout(this.blurTimer)},blur:()=>{this.blurTimer=setTimeout(()=>{this.$refs.popup.matches(":focus-within")||(this.showPopup=!1)},0)}}),pt(e,{mousedown:o=>{o.target.matches("input, textarea, button")||(o.preventDefault(),o.stopPropagation()),o.target.matches(".dito-button-clear")||(n=(this.triggerTarget??this.$refs.trigger).querySelector("input, textarea"),n&&!n.hasAttribute("readonly")?n.setAttribute("readonly","true"):n=null)},mouseup:o=>{n&&setTimeout(()=>{n.removeAttribute("readonly"),o.target.matches("input, textarea, button")||n.focus(),n=null},0)}}))},onShowPopup(e){var t;e?(this.trigger==="focus"&&(this.popupEvents=this.addFocusEvents(this.$refs.popup)),this.updatePosition()):((t=this.popupEvents)==null||t.remove(),this.popupEvents=null)},onClick(){this.disabled||(this.showPopup=!0)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",Ri]]),Bi=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Li(e,t,n,o,i,s){return m(),b("div",{class:l.normalizeClass(["dito-input",s.classes])},[P(e.$slots,"before"),st(y("input",W({id:n.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>i.currentValue=r),type:n.type,name:n.name,title:n.title,disabled:n.disabled,readonly:n.readonly,autofocus:n.autofocus,placeholder:n.placeholder,autocomplete:n.autocomplete,"aria-label":n.title},s.attributes),null,16,Bi),[[fi,i.currentValue]]),P(e.$slots,"after")],2)}const gt=ee({emits:["update:modelValue"],inheritAttrs:!1,props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{classes(){return this.$attrs.class},attributes(){const{class:e,...t}=this.$attrs;return t},input(){return this.$refs.input},size(){const{size:e,min:t,max:n}=this.$attrs,o=i=>i!=null?`${i}`.length:0;return e||o(t)||o(n)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Li]]);function zi(e,t,n,o,i,s){return m(),b("i",{class:l.normalizeClass(["dito-icon",{["dito-icon--"+n.name]:!0,"dito-icon--disabled":n.disabled}])},null,2)}const mt=ee({props:{name:{type:String,required:!0},disabled:{type:Boolean,default:!1}}},[["render",zi]]);function te(e,{start:t,end:n}){e!=null&&e.setSelectionRange&&(e.focus(),e.setSelectionRange(t,n))}function Me(e){return e&&"selectionStart"in e?{start:e.selectionStart,end:e.selectionEnd}:null}function Hi(e,t,n,o,i,s){const r=j("Icon"),a=j("InputField"),f=j("Calendar"),u=j("Trigger");return m(),Ne(u,W({class:"dito-date-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[7]||(t[7]=d=>i.showPopup=d),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:L(()=>[e.$slots.trigger?P(e.$slots,"trigger",{key:0}):(m(),Ne(a,W({key:1,class:["dito-date-picker-input",{"dito-focus":s.focused}],ref:"input",modelValue:s.currentText,"onUpdate:modelValue":t[1]||(t[1]=d=>s.currentText=d),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=d=>s.onFocus(!0)),onBlur:t[3]||(t[3]=d=>s.onFocus(!1)),onKeydown:s.onKeyDown,onMousedown:t[4]||(t[4]=Pe(d=>s.onMouseDown(!1),["stop"]))}),{before:L(()=>[P(e.$slots,"before")]),after:L(()=>[I(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Pe(d=>s.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),P(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:L(()=>[I(f,W({class:"dito-date-picker-popup",ref:"calendar",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=d=>i.currentValue=d)},{locale:n.locale,disabledDate:n.disabledDate},{onSelect:t[6]||(t[6]=d=>i.showPopup=!1)}),null,16,["modelValue"])]),_:3},16,["show"])}const Es=ee({components:{Trigger:Xt,Calendar:_s,InputField:gt,Icon:mt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({date:R.defaultFormats.date,time:!1})},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=Gt(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);t&&(this.currentValue=t)}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){var o;const{ver:t,enter:n}=ht(e);if(t||n){e.preventDefault();const i=(o=Me(this.input))==null?void 0:o.start,s=r=>bt(this.currentText,r,this.formatOptions);if(t&&!this.showPopup)this.showPopup=!0;else{const{calendar:r}=this.$refs;if(r){const{name:a,start:f}=s(i)||{};a&&r.navigate({step:t,enter:n,mode:a,update:!0})&&this.$nextTick(()=>te(this.input,s(f)))}}}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Hi]]),Ki={class:"dito-time-picker-popup"},Ui={class:"dito-time-picker-panel"},ji={class:"dito-time-picker-hour",ref:"hour"},Yi=["onClick"],Wi={class:"dito-time-picker-panel"},qi={class:"dito-time-picker-minute",ref:"minute"},Ji=["onClick"],Gi={class:"dito-time-picker-panel"},Xi={class:"dito-time-picker-second",ref:"second"},Qi=["onClick"];function Zi(e,t,n,o,i,s){const r=j("Icon"),a=j("InputField"),f=j("Trigger");return m(),Ne(f,W({class:"dito-time-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[5]||(t[5]=u=>i.showPopup=u),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:L(()=>[e.$slots.trigger?P(e.$slots,"trigger",{key:0}):(m(),Ne(a,W({key:1,class:["dito-time-picker-input",{"dito-focus":s.focused}],ref:"input",modelValue:s.currentText,"onUpdate:modelValue":t[1]||(t[1]=u=>s.currentText=u),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=u=>s.onFocus(!0)),onBlur:t[3]||(t[3]=u=>s.onFocus(!1)),onKeydown:s.onKeyDown,onMousedown:t[4]||(t[4]=Pe(u=>s.onMouseDown(!1),["stop"]))}),{before:L(()=>[P(e.$slots,"before")]),after:L(()=>[I(r,{name:"clock",disabled:n.disabled,onMousedown:t[0]||(t[0]=Pe(u=>s.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),P(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:L(()=>[y("div",Ki,[y("div",Ui,[y("ul",ji,[(m(),b(N,null,ue(24,u=>(m(),b(N,null,[n.disabledHour(u-1)?H("",!0):(m(),b("li",{key:0,class:l.normalizeClass({selected:s.hour===u-1}),onClick:d=>s.hour=u-1},l.toDisplayString(s.leftPad(u-1)),11,Yi))],64))),64))],512)]),y("div",Wi,[y("ul",qi,[(m(),b(N,null,ue(60,u=>(m(),b(N,null,[n.disabledMinute(u-1)?H("",!0):(m(),b("li",{key:0,class:l.normalizeClass({selected:s.minute===u-1}),onClick:d=>s.minute=u-1},l.toDisplayString(s.leftPad(u-1)),11,Ji))],64))),64))],512)]),y("div",Gi,[y("ul",Xi,[(m(),b(N,null,ue(60,u=>(m(),b(N,null,[n.disabledSecond(u-1)?H("",!0):(m(),b("li",{key:0,class:l.normalizeClass({selected:s.second===u-1}),onClick:d=>s.second=u-1},l.toDisplayString(s.leftPad(u-1)),11,Qi))],64))),64))],512)])])]),_:3},16,["show"])}const Ds=ee({components:{Trigger:Xt,InputField:gt,Icon:mt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({time:R.defaultFormats.time,date:!1})},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,ignoreNextChange:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=Gt(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);t&&(this.currentValue=t)}},currentDate(){return this.currentValue||Fe(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e,this.scrollAll(!0))},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e),this.scrollAll(!0))},currentText(){const{input:e}=this,t=Me(e);this.focused&&!this.ignoreNextChange&&t.start===t.end&&this.$nextTick(()=>te(e,t)),this.ignoreNextChange=!1},show(e){this.showPopup=e},showPopup(e,t){e&&this.scrollAll(!1),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=Fe(this.currentDate,{...e,millisecond:0})},scrollAll(e){const t=(n,o)=>{const i=this.$refs[n];if(i){const s=i.scrollHeight/(i.childElementCount+6),r=Math.round(o*s),a=Math.abs(i.scrollTop-r);i.scrollTo({top:r,behavior:e&&a<100?"smooth":"auto"})}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){const{input:t}=this,n=Me(t),{ver:o,enter:i}=ht(e);if(o||i){e.preventDefault();const s=r=>bt(this.currentText,r,this.formatOptions);if(o)if(!this.showPopup)this.showPopup=!0;else{const{name:r,start:a}=s(n.start)||{};if(r){const f=this[r]+o,u=this.$refs[r].childElementCount;this[r]=f<0?f+u:f>=u?f-u:f,this.ignoreNextChange=!0,this.$nextTick(()=>te(t,s(a)))}}else i&&(this.showPopup=!1)}else if(n.start===n.end){const{value:s}=t;let r=n.start;const a=f=>!isNaN(parseInt(f,10));if(e.key.length===1)if(a(e.key)&&r<s.length)s[r]===":"&&a(s[r-1])&&a(s[r-2])&&r++,a(s[r])&&(a(s[r+1])||a(s[r-1]))&&(t.value=s.slice(0,r)+s.slice(r+1),te(t,{start:r,end:r}));else{const f=R.format(this.currentValue,this.formatOptions).length;s.length===f?e.preventDefault():s.length>f&&(t.value=s.slice(0,f),te(t,n),e.preventDefault())}else e.key==="Backspace"&&(r===1||[" ",":"].includes(s[r-2]))&&(r===s.length||s[r]===":"?(r--,t.value=s.slice(0,r)+((s[r-1]??"")+"00")+s.slice(r+1),te(t,{start:r,end:r})):a(s[r])&&!a(+s[r+1])&&(t.value=s.slice(0,r)+"0"+s.slice(r),te(t,{start:r,end:r})))}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Zi]]),er={class:"dito-date-time-picker",ref:"picker"};function tr(e,t,n,o,i,s){const r=j("Icon"),a=j("InputField"),f=j("DatePicker"),u=j("TimePicker");return m(),b("div",er,[y("div",{class:l.normalizeClass(["dito-date-time-picker__inner",{"dito-focus":s.focused}])},[I(a,W({class:["dito-date-time-picker__input",{"dito-focus":s.focused}],ref:"input",modelValue:s.currentText,"onUpdate:modelValue":t[1]||(t[1]=d=>s.currentText=d),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=d=>s.onFocus(!0)),onBlur:t[3]||(t[3]=d=>s.onFocus(!1)),onKeydown:s.onKeyDown,onMousedown:t[4]||(t[4]=Pe(d=>s.onMouseDown(!1),["stop"]))}),{before:L(()=>[P(e.$slots,"before")]),after:L(()=>[I(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Pe(d=>s.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),P(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]),I(f,W({ref:"date",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=d=>i.currentValue=d),show:i.showDate,"onUpdate:show":t[6]||(t[6]=d=>i.showDate=d),placement:"bottom-left",target:e.$refs.picker},s.attributes),{trigger:L(()=>[]),_:1},16,["modelValue","show","target"]),I(u,W({ref:"time",modelValue:i.currentValue,"onUpdate:modelValue":t[7]||(t[7]=d=>i.currentValue=d),show:i.showTime,"onUpdate:show":t[8]||(t[8]=d=>i.showTime=d),placement:"bottom-right",target:e.$refs.picker},s.attributes),{trigger:L(()=>[]),_:1},16,["modelValue","show","target"])],2)],512)}const nr=ee({components:{InputField:gt,DatePicker:Es,TimePicker:Ds,Icon:mt},emits:["update:modelValue","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},disabled:{type:Boolean,default:!1},locale:{type:String,default:"en-US"},format:{type:Object,default:null}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,inputFocused:!1,dateFocused:!1,timeFocused:!1,closedMode:null}},computed:{attributes(){const{transition:e,disabled:t,locale:n,formatOptions:o}=this;return{transition:e,disabled:t,locale:n,format:o}},focused(){return this.inputFocused||this.showDate||this.showTime},input(){return this.$refs.input.input},formatOptions(){return R.assignDeeply({locale:this.locale,time:R.defaultFormats.time,date:R.defaultFormats.date},{date:{month:"short",format:(e,t,n)=>{var o,i,s;return t==="literal"&&/\bat\b/.test(e)?", ":((s=(i=(o=this.format)==null?void 0:o.date)==null?void 0:i.format)==null?void 0:s.call(i,e,t,n))??e}}},this.format)},timeIndex(){var t;const e=this.currentText;if(e){const n=(t=e.match(/([\S]+\s*)$/))==null?void 0:t[1];if(n)return e.length-n.length}return null},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);if(t){const n=Me(this.input);this.currentValue=t,this.$nextTick(()=>te(this.input,n))}}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,e?this.updatePopups():(this.showDate=!1,this.showTime=!1)},onMouseDown(e){e&&(this.showDate||this.showTime)?(this.showDate=!1,this.showTime=!1):this.disabled||(this.focus(),requestAnimationFrame(()=>this.updatePopups()))},onKeyDown(e){const t=this.getMode(e);this.$refs[t].onKeyDown(e),e.defaultPrevented?this.closedMode=t:t!==this.closedMode&&this.updatePopups(t)},getMode(e=null){const{start:t}=Me(this.input),{hor:n}=ht(e);return this.timeIndex===null||t+n<this.timeIndex?"date":"time"},updatePopups(e=this.getMode()){e&&(this.closedMode=null),this.showDate=e==="date",this.showTime=e==="time"},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",tr]]),sr={class:"dito-pagination"},or={key:0,class:"dito-pagination-total"},ir={key:1,class:"dito-buttons dito-buttons-round"},rr=["disabled","onClick"],lr={key:0};function ar(e,t,n,o,i,s){return m(),b("div",sr,[n.showTotal?(m(),b("div",or,[n.total>0?(m(),b(N,{key:0},[ut(l.toDisplayString(s.first)+" – "+l.toDisplayString(s.last)+" / "+l.toDisplayString(n.total),1)],64)):H("",!0)])):H("",!0),s.numPages>1?(m(),b("div",ir,[(m(!0),b(N,null,ue(s.buttons,r=>(m(),b("button",{class:l.normalizeClass(["dito-button",s.getButtonClasses(r)]),disabled:r.disabled,onClick:a=>s.onClickButton(r)},[r.text?(m(),b("span",lr,l.toDisplayString(r.text),1)):H("",!0)],10,rr))),256))])):H("",!0)])}const ur=ee({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{showPrev:!0,showNext:!0,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.pageSize+1},last(){return Math.min(this.first+this.pageSize-1,this.total)},numPages(){return Math.ceil(this.total/this.pageSize)},buttons(){const{showPrev:e,showNext:t,currentPage:n,numPages:o}=this,i=e+t+1;let s=1,r=1;o<=i?r=o:n<=e+1?r=i:n>=o-t?(r=o,s=o-i+1):(s=n-e,r=n+t);const a=[];a.push({index:n-1,type:"prev",disabled:n<=1}),s>=2&&a.push({index:1,text:1}),s>2&&a.push({index:Math.max(1,n-10),type:"ellipsis-prev"});for(let f=s;f<=r;f++)a.push({index:f,text:f,active:f===n});return r<o-1&&a.push({index:Math.min(o,n+10),type:"ellipsis-next"}),r<=o-1&&a.push({index:o,text:o}),a.push({index:n+1,type:"next",disabled:n>=o}),a}},watch:{page(e){this.currentPage=e},pageSize(){this.currentPage>this.numPages&&(this.currentPage=this.numPages)},currentPage(e,t){e!==t&&this.$emit("update:page",e)}},created(){this.currentPage=this.page},methods:{getButtonClasses(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},onClickButton(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)}}},[["render",ar]]),cr={class:"dito-switch-pane"},fr=["id","name","disabled"],dr=y("div",{class:"dito-switch-button"},null,-1),pr={key:0,class:"dito-switch-label"};function hr(e,t,n,o,i,s){return m(),b("div",{class:l.normalizeClass(["dito-switch",s.classes]),style:l.normalizeStyle(s.styles)},[y("div",cr,[st(y("input",W({id:n.id,ref:"input"},s.attributes,{"onUpdate:modelValue":t[0]||(t[0]=r=>i.checked=r),type:"checkbox",name:n.name,disabled:n.disabled}),null,16,fr),[[gs,i.checked]]),dr,n.labels?(m(),b("span",pr,[i.checked?P(e.$slots,"checked",{key:0},()=>[ut(l.toDisplayString(n.labels.checked||"on"),1)]):P(e.$slots,"unchecked",{key:1},()=>[ut(l.toDisplayString(n.labels.unchecked||"off"),1)])])):H("",!0)])],6)}const gr=ee({emits:["update:modelValue","change"],inheritAttrs:!1,props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){return[this.$attrs.class,{"dito-checked":this.checked,"dito-disabled":this.disabled}]},styles(){const{labels:{checked:e,unchecked:t}={}}=this,n=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":n?`${n*1.5}rem`:null}},attributes(){const{class:e,...t}=this.$attrs;return t}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",hr]]);function Vs({enabled:e},{slots:t}){return e?os(ft,yr,t):t.default()}Vs.props={enabled:{type:Boolean,default:!0}};const mr=Vs,xe=(e,t)=>Object.assign(e.style,t),yt=e=>setTimeout(e,0),Ns=e=>getComputedStyle(e).height,yr={name:"dito-height",onAfterEnter(e){yt(()=>xe(e,{height:null}))},onEnter(e){const{width:t}=getComputedStyle(e);xe(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"}),yt(()=>{const{height:n}=getComputedStyle(e);xe(e,{width:null,position:null,visibility:null,height:0}),Ns(e),yt(()=>xe(e,{height:n}))})},onLeave(e){const{height:t}=getComputedStyle(e);xe(e,{height:t}),Ns(e),yt(()=>xe(e,{height:0}))}};function Cs(e){return e&&R.asArray(e).some(t=>t.type!==Z)}function wr(e,t={}){return e=R.isString(e)?Lo()[e]:e,Cs(e==null?void 0:e(t))}D.Calendar=_s,D.DatePicker=Es,D.DateTimePicker=nr,D.Icon=mt,D.InputField=gt,D.Pagination=ur,D.SwitchButton=gr,D.TimePicker=Ds,D.TransitionHeight=mr,D.Trigger=Xt,D.addEvents=pt,D.alterDate=Fe,D.combineEvents=vs,D.describeDate=wt,D.getDatePartAtPosition=bt,D.getKey=Ss,D.getKeyNavigation=ht,D.getSelection=Me,D.hasSlotContent=wr,D.hasVNodeContent=Cs,D.parseDate=je,D.setSelection=te,Object.defineProperty(D,Symbol.toStringTag,{value:"Module"})});
|
|
7
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by11aS51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9kYXRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvcmVhY3Rpdml0eS9kaXN0L3JlYWN0aXZpdHkuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWNvcmUvZGlzdC9ydW50aW1lLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWRvbS9kaXN0L3J1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS9kaXN0L3Z1ZS5ydW50aW1lLmVzbS1idW5kbGVyLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvQ2FsZW5kYXIudnVlIiwiLi4vc3JjL3V0aWxzL2V2ZW50LmpzIiwiLi4vc3JjL3V0aWxzL3RyaWdnZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9UcmlnZ2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0lucHV0RmllbGQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvSWNvbi52dWUiLCIuLi9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGF0ZVBpY2tlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9UaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RhdGVUaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uL3NyYy91dGlscy92dWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRGF0ZShkYXRlKSB7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICAgIG1vbnRoOiBkYXRlPy5nZXRNb250aCgpID8/IDAsXG4gICAgZGF5OiBkYXRlPy5nZXREYXRlKCkgPz8gMCxcbiAgICBob3VyOiBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gICAgbWludXRlOiBkYXRlPy5nZXRNaW51dGVzKCkgPz8gMCxcbiAgICBzZWNvbmQ6IGRhdGU/LmdldFNlY29uZHMoKSA/PyAwLFxuICAgIG1pbGxpc2Vjb25kOiBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsdGVyRGF0ZShkYXRlLCBvdmVycmlkZXMgPSB7fSkge1xuICByZXR1cm4gbmV3IERhdGUoLi4uT2JqZWN0LnZhbHVlcyh7IC4uLmRlc2NyaWJlRGF0ZShkYXRlKSwgLi4ub3ZlcnJpZGVzIH0pKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKHN0cmluZywge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCB0aW1lRGVmYXVsdCA9IHRpbWUgPyBudWxsIDogMFxuICBsZXQgW1xuICAgIGRheSxcbiAgICBzZXAxLFxuICAgIG1vbnRoLFxuICAgIHNlcDIsXG4gICAgeWVhcixcbiAgICAsXG4gICAgaG91ciA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBtaW51dGUgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgc2Vjb25kID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbGxpc2Vjb25kID0gdGltZURlZmF1bHRcbiAgXSA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA+PSA0KSB7XG4gICAgaWYgKGxvY2FsZSA9PT0gJ2VuLVVTJyAmJiBzZXAxID09PSAnLycgJiYgc2VwMiA9PT0gJy8nKSB7XG4gICAgICAvLyBBbWVyaWNhbiBmb3JtYXQ6IE1NL0REL1lZWVlcbiAgICAgIDtbZGF5LCBtb250aF0gPSBbbW9udGgsIGRheV1cbiAgICB9XG4gICAgbW9udGggPSBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSB9KVxuICAgIGNvbnN0IGlzVmFsaWRUaW1lUGFydCA9IHBhcnQgPT4gcGFydCA9PT0gbnVsbCB8fCBwYXJ0Lmxlbmd0aCA9PT0gMlxuICAgIGlmIChcbiAgICAgIG1vbnRoICE9PSBudWxsICYmIChcbiAgICAgICAgIXRpbWUgfHwgKFxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChob3VyKSAmJlxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChtaW51dGUpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KHNlY29uZClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgICAreWVhcixcbiAgICAgICAgK21vbnRoLFxuICAgICAgICArZGF5LFxuICAgICAgICAraG91cixcbiAgICAgICAgK21pbnV0ZSxcbiAgICAgICAgK3NlY29uZCxcbiAgICAgICAgK21pbGxpc2Vjb25kXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUGFydEF0UG9zaXRpb24oc3RyaW5nLCBwb3NpdGlvbiwge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCBwYXJ0cyA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuXG4gIGNvbnN0IGdldFBvc2l0aW9uID0gKHBvc2l0aW9uLCBsZW5ndGggPSBwYXJ0cy5sZW5ndGgpID0+IHtcbiAgICBsZXQgcG9zID0gMFxuICAgIGxldCBpbmRleCA9IDBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5tb2RpZmllZC1sb29wLWNvbmRpdGlvblxuICAgIHdoaWxlICgocG9zaXRpb24gPT09IG51bGwgfHwgcG9zIDw9IHBvc2l0aW9uKSAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcG9zICs9IHBhcnRzW2luZGV4KytdPy5sZW5ndGggPz8gMFxuICAgIH1cbiAgICByZXR1cm4geyBwb3NpdGlvbjogcG9zLCBpbmRleCB9XG4gIH1cblxuICAvLyBUaW1lIHN0YXJ0cyBhdCBpbmRleCA2LCBkdWUgdG8gdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgZGF0ZS5cbiAgY29uc3Qgb2Zmc2V0ID0gIWRhdGUgPyBnZXRQb3NpdGlvbihudWxsLCA2KS5wb3NpdGlvbiA6IDBcbiAgcG9zaXRpb24gKz0gb2Zmc2V0XG5cbiAgbGV0IHsgaW5kZXggfSA9IGdldFBvc2l0aW9uKHBvc2l0aW9uKVxuXG4gIGNvbnN0IGlzVVMgPSBsb2NhbGUgPT09ICdlbi1VUydcbiAgY29uc3QgdmFsdWVzID0gW1xuICAgIGlzVVMgPyAnbW9udGgnIDogJ2RheScsXG4gICAgbnVsbCxcbiAgICBpc1VTID8gJ2RheScgOiAnbW9udGgnLFxuICAgIG51bGwsXG4gICAgJ3llYXInLFxuICAgIG51bGwsXG4gICAgJ2hvdXInLFxuICAgIG51bGwsXG4gICAgJ21pbnV0ZScsXG4gICAgbnVsbCxcbiAgICAnc2Vjb25kJyxcbiAgICBudWxsLFxuICAgICdtaWxsaXNlY29uZCdcbiAgXVxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmICh2YWx1ZXNbaW5kZXhdKSB7XG4gICAgICBjb25zdCBzdGFydCA9IGdldFBvc2l0aW9uKG51bGwsIGluZGV4KS5wb3NpdGlvbiAtIG9mZnNldFxuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBwYXJ0c1tpbmRleF0ubGVuZ3RoXG4gICAgICByZXR1cm4geyBuYW1lOiB2YWx1ZXNbaW5kZXhdLCBzdGFydCwgZW5kIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlID0gdHJ1ZSwgdGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gc3RyaW5nPy5zcGxpdCgvKFtcXHMuLDovXSspLykgfHwgW11cbiAgaWYgKCFkYXRlKSB7XG4gICAgLy8gQWRkIGR1bW15IGRhdGUgcGFydHMgdG8gbWFrZSBzdXJlIHdlIGdldCBhIHRpbWUtb25seSBkYXRlLlxuICAgIHBhcnRzLnVuc2hpZnQoJzEnLCAnLicsICcxJywgJy4nLCAnMjAwMCcsICcgJylcbiAgfVxuICBpZiAoIXRpbWUgJiYgcGFydHMubGVuZ3RoID4gNSkge1xuICAgIHBhcnRzLmxlbmd0aCA9IDVcbiAgfVxuICByZXR1cm4gcGFydHNcbn1cblxuZnVuY3Rpb24gZ2V0TW9udGhJbmRleChtb250aCwgeyBsb2NhbGUgPSAnZW4tVVMnIH0gPSB7fSkge1xuICBjb25zdCB2YWx1ZSA9ICttb250aFxuICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSAtIDFcbiAgfVxuICBjb25zdCBtYXRjaCA9IG1vbnRoLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGlmIChtYXRjaC5sZW5ndGggPCAzKSByZXR1cm4gbnVsbFxuICBjb25zdCBzaG9ydEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICBjb25zdCBsb25nRm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDIwMDAsIGksIDEpXG4gICAgaWYgKFxuICAgICAgc2hvcnRGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaCkgfHxcbiAgICAgIGxvbmdGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaClcbiAgICApIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCJpbXBvcnQgeyBleHRlbmQsIGlzQXJyYXksIGlzU3ltYm9sLCBpc01hcCwgaXNJbnRlZ2VyS2V5LCBoYXNPd24sIGhhc0NoYW5nZWQsIGlzT2JqZWN0LCBtYWtlTWFwLCBjYXBpdGFsaXplLCB0b1Jhd1R5cGUsIGRlZiwgaXNGdW5jdGlvbiwgTk9PUCB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnfWAsIC4uLmFyZ3MpO1xufVxuXG5sZXQgYWN0aXZlRWZmZWN0U2NvcGU7XG5jbGFzcyBFZmZlY3RTY29wZSB7XG4gIGNvbnN0cnVjdG9yKGRldGFjaGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmNsZWFudXBzID0gW107XG4gICAgdGhpcy5wYXJlbnQgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICBpZiAoIWRldGFjaGVkICYmIGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gICAgICB0aGlzLmluZGV4ID0gKGFjdGl2ZUVmZmVjdFNjb3BlLnNjb3BlcyB8fCAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzID0gW10pKS5wdXNoKFxuICAgICAgICB0aGlzXG4gICAgICApIC0gMTtcbiAgICB9XG4gIH1cbiAgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG4gIHJ1bihmbikge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRFZmZlY3RTY29wZSA9IGFjdGl2ZUVmZmVjdFNjb3BlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gY3VycmVudEVmZmVjdFNjb3BlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihgY2Fubm90IHJ1biBhbiBpbmFjdGl2ZSBlZmZlY3Qgc2NvcGUuYCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb24oKSB7XG4gICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBub24tZGV0YWNoZWQgc2NvcGVzXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb2ZmKCkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcy5wYXJlbnQ7XG4gIH1cbiAgc3RvcChmcm9tUGFyZW50KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgbGV0IGksIGw7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5lZmZlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmVmZmVjdHNbaV0uc3RvcCgpO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuY2xlYW51cHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cHNbaV0oKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNjb3Blcykge1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5zY29wZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5zY29wZXNbaV0uc3RvcCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmRldGFjaGVkICYmIHRoaXMucGFyZW50ICYmICFmcm9tUGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnBhcmVudC5zY29wZXMucG9wKCk7XG4gICAgICAgIGlmIChsYXN0ICYmIGxhc3QgIT09IHRoaXMpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5zY29wZXNbdGhpcy5pbmRleF0gPSBsYXN0O1xuICAgICAgICAgIGxhc3QuaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmVudCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZWZmZWN0U2NvcGUoZGV0YWNoZWQpIHtcbiAgcmV0dXJuIG5ldyBFZmZlY3RTY29wZShkZXRhY2hlZCk7XG59XG5mdW5jdGlvbiByZWNvcmRFZmZlY3RTY29wZShlZmZlY3QsIHNjb3BlID0gYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgaWYgKHNjb3BlICYmIHNjb3BlLmFjdGl2ZSkge1xuICAgIHNjb3BlLmVmZmVjdHMucHVzaChlZmZlY3QpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50U2NvcGUoKSB7XG4gIHJldHVybiBhY3RpdmVFZmZlY3RTY29wZTtcbn1cbmZ1bmN0aW9uIG9uU2NvcGVEaXNwb3NlKGZuKSB7XG4gIGlmIChhY3RpdmVFZmZlY3RTY29wZSkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlLmNsZWFudXBzLnB1c2goZm4pO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuKFxuICAgICAgYG9uU2NvcGVEaXNwb3NlKCkgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGVmZmVjdCBzY29wZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgY3JlYXRlRGVwID0gKGVmZmVjdHMpID0+IHtcbiAgY29uc3QgZGVwID0gbmV3IFNldChlZmZlY3RzKTtcbiAgZGVwLncgPSAwO1xuICBkZXAubiA9IDA7XG4gIHJldHVybiBkZXA7XG59O1xuY29uc3Qgd2FzVHJhY2tlZCA9IChkZXApID0+IChkZXAudyAmIHRyYWNrT3BCaXQpID4gMDtcbmNvbnN0IG5ld1RyYWNrZWQgPSAoZGVwKSA9PiAoZGVwLm4gJiB0cmFja09wQml0KSA+IDA7XG5jb25zdCBpbml0RGVwTWFya2VycyA9ICh7IGRlcHMgfSkgPT4ge1xuICBpZiAoZGVwcy5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlcHNbaV0udyB8PSB0cmFja09wQml0O1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IGZpbmFsaXplRGVwTWFya2VycyA9IChlZmZlY3QpID0+IHtcbiAgY29uc3QgeyBkZXBzIH0gPSBlZmZlY3Q7XG4gIGlmIChkZXBzLmxlbmd0aCkge1xuICAgIGxldCBwdHIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZGVwID0gZGVwc1tpXTtcbiAgICAgIGlmICh3YXNUcmFja2VkKGRlcCkgJiYgIW5ld1RyYWNrZWQoZGVwKSkge1xuICAgICAgICBkZXAuZGVsZXRlKGVmZmVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXBzW3B0cisrXSA9IGRlcDtcbiAgICAgIH1cbiAgICAgIGRlcC53ICY9IH50cmFja09wQml0O1xuICAgICAgZGVwLm4gJj0gfnRyYWNrT3BCaXQ7XG4gICAgfVxuICAgIGRlcHMubGVuZ3RoID0gcHRyO1xuICB9XG59O1xuXG5jb25zdCB0YXJnZXRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmxldCBlZmZlY3RUcmFja0RlcHRoID0gMDtcbmxldCB0cmFja09wQml0ID0gMTtcbmNvbnN0IG1heE1hcmtlckJpdHMgPSAzMDtcbmxldCBhY3RpdmVFZmZlY3Q7XG5jb25zdCBJVEVSQVRFX0tFWSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gXCJpdGVyYXRlXCIgOiBcIlwiKTtcbmNvbnN0IE1BUF9LRVlfSVRFUkFURV9LRVkgPSBTeW1ib2woISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiTWFwIGtleSBpdGVyYXRlXCIgOiBcIlwiKTtcbmNsYXNzIFJlYWN0aXZlRWZmZWN0IHtcbiAgY29uc3RydWN0b3IoZm4sIHNjaGVkdWxlciA9IG51bGwsIHNjb3BlKSB7XG4gICAgdGhpcy5mbiA9IGZuO1xuICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLmRlcHMgPSBbXTtcbiAgICB0aGlzLnBhcmVudCA9IHZvaWQgMDtcbiAgICByZWNvcmRFZmZlY3RTY29wZSh0aGlzLCBzY29wZSk7XG4gIH1cbiAgcnVuKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZuKCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQgPSBhY3RpdmVFZmZlY3Q7XG4gICAgbGV0IGxhc3RTaG91bGRUcmFjayA9IHNob3VsZFRyYWNrO1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQgPT09IHRoaXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucGFyZW50ID0gYWN0aXZlRWZmZWN0O1xuICAgICAgYWN0aXZlRWZmZWN0ID0gdGhpcztcbiAgICAgIHNob3VsZFRyYWNrID0gdHJ1ZTtcbiAgICAgIHRyYWNrT3BCaXQgPSAxIDw8ICsrZWZmZWN0VHJhY2tEZXB0aDtcbiAgICAgIGlmIChlZmZlY3RUcmFja0RlcHRoIDw9IG1heE1hcmtlckJpdHMpIHtcbiAgICAgICAgaW5pdERlcE1hcmtlcnModGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGVmZmVjdFRyYWNrRGVwdGggPD0gbWF4TWFya2VyQml0cykge1xuICAgICAgICBmaW5hbGl6ZURlcE1hcmtlcnModGhpcyk7XG4gICAgICB9XG4gICAgICB0cmFja09wQml0ID0gMSA8PCAtLWVmZmVjdFRyYWNrRGVwdGg7XG4gICAgICBhY3RpdmVFZmZlY3QgPSB0aGlzLnBhcmVudDtcbiAgICAgIHNob3VsZFRyYWNrID0gbGFzdFNob3VsZFRyYWNrO1xuICAgICAgdGhpcy5wYXJlbnQgPSB2b2lkIDA7XG4gICAgICBpZiAodGhpcy5kZWZlclN0b3ApIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHN0b3AoKSB7XG4gICAgaWYgKGFjdGl2ZUVmZmVjdCA9PT0gdGhpcykge1xuICAgICAgdGhpcy5kZWZlclN0b3AgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgIGNsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICBpZiAodGhpcy5vblN0b3ApIHtcbiAgICAgICAgdGhpcy5vblN0b3AoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjbGVhbnVwRWZmZWN0KGVmZmVjdDIpIHtcbiAgY29uc3QgeyBkZXBzIH0gPSBlZmZlY3QyO1xuICBpZiAoZGVwcy5sZW5ndGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlcHNbaV0uZGVsZXRlKGVmZmVjdDIpO1xuICAgIH1cbiAgICBkZXBzLmxlbmd0aCA9IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdChmbiwgb3B0aW9ucykge1xuICBpZiAoZm4uZWZmZWN0IGluc3RhbmNlb2YgUmVhY3RpdmVFZmZlY3QpIHtcbiAgICBmbiA9IGZuLmVmZmVjdC5mbjtcbiAgfVxuICBjb25zdCBfZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KGZuKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBleHRlbmQoX2VmZmVjdCwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuc2NvcGUpXG4gICAgICByZWNvcmRFZmZlY3RTY29wZShfZWZmZWN0LCBvcHRpb25zLnNjb3BlKTtcbiAgfVxuICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubGF6eSkge1xuICAgIF9lZmZlY3QucnVuKCk7XG4gIH1cbiAgY29uc3QgcnVubmVyID0gX2VmZmVjdC5ydW4uYmluZChfZWZmZWN0KTtcbiAgcnVubmVyLmVmZmVjdCA9IF9lZmZlY3Q7XG4gIHJldHVybiBydW5uZXI7XG59XG5mdW5jdGlvbiBzdG9wKHJ1bm5lcikge1xuICBydW5uZXIuZWZmZWN0LnN0b3AoKTtcbn1cbmxldCBzaG91bGRUcmFjayA9IHRydWU7XG5jb25zdCB0cmFja1N0YWNrID0gW107XG5mdW5jdGlvbiBwYXVzZVRyYWNraW5nKCkge1xuICB0cmFja1N0YWNrLnB1c2goc2hvdWxkVHJhY2spO1xuICBzaG91bGRUcmFjayA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZW5hYmxlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGxhc3QgPSB0cmFja1N0YWNrLnBvcCgpO1xuICBzaG91bGRUcmFjayA9IGxhc3QgPT09IHZvaWQgMCA/IHRydWUgOiBsYXN0O1xufVxuZnVuY3Rpb24gdHJhY2sodGFyZ2V0LCB0eXBlLCBrZXkpIHtcbiAgaWYgKHNob3VsZFRyYWNrICYmIGFjdGl2ZUVmZmVjdCkge1xuICAgIGxldCBkZXBzTWFwID0gdGFyZ2V0TWFwLmdldCh0YXJnZXQpO1xuICAgIGlmICghZGVwc01hcCkge1xuICAgICAgdGFyZ2V0TWFwLnNldCh0YXJnZXQsIGRlcHNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgbGV0IGRlcCA9IGRlcHNNYXAuZ2V0KGtleSk7XG4gICAgaWYgKCFkZXApIHtcbiAgICAgIGRlcHNNYXAuc2V0KGtleSwgZGVwID0gY3JlYXRlRGVwKCkpO1xuICAgIH1cbiAgICBjb25zdCBldmVudEluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8geyBlZmZlY3Q6IGFjdGl2ZUVmZmVjdCwgdGFyZ2V0LCB0eXBlLCBrZXkgfSA6IHZvaWQgMDtcbiAgICB0cmFja0VmZmVjdHMoZGVwLCBldmVudEluZm8pO1xuICB9XG59XG5mdW5jdGlvbiB0cmFja0VmZmVjdHMoZGVwLCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKSB7XG4gIGxldCBzaG91bGRUcmFjazIgPSBmYWxzZTtcbiAgaWYgKGVmZmVjdFRyYWNrRGVwdGggPD0gbWF4TWFya2VyQml0cykge1xuICAgIGlmICghbmV3VHJhY2tlZChkZXApKSB7XG4gICAgICBkZXAubiB8PSB0cmFja09wQml0O1xuICAgICAgc2hvdWxkVHJhY2syID0gIXdhc1RyYWNrZWQoZGVwKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2hvdWxkVHJhY2syID0gIWRlcC5oYXMoYWN0aXZlRWZmZWN0KTtcbiAgfVxuICBpZiAoc2hvdWxkVHJhY2syKSB7XG4gICAgZGVwLmFkZChhY3RpdmVFZmZlY3QpO1xuICAgIGFjdGl2ZUVmZmVjdC5kZXBzLnB1c2goZGVwKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhY3RpdmVFZmZlY3Qub25UcmFjaykge1xuICAgICAgYWN0aXZlRWZmZWN0Lm9uVHJhY2soXG4gICAgICAgIGV4dGVuZChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlZmZlY3Q6IGFjdGl2ZUVmZmVjdFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGVidWdnZXJFdmVudEV4dHJhSW5mb1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlcih0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQpIHtcbiAgY29uc3QgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKCFkZXBzTWFwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBkZXBzID0gW107XG4gIGlmICh0eXBlID09PSBcImNsZWFyXCIpIHtcbiAgICBkZXBzID0gWy4uLmRlcHNNYXAudmFsdWVzKCldO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJsZW5ndGhcIiAmJiBpc0FycmF5KHRhcmdldCkpIHtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBOdW1iZXIobmV3VmFsdWUpO1xuICAgIGRlcHNNYXAuZm9yRWFjaCgoZGVwLCBrZXkyKSA9PiB7XG4gICAgICBpZiAoa2V5MiA9PT0gXCJsZW5ndGhcIiB8fCAhaXNTeW1ib2woa2V5MikgJiYga2V5MiA+PSBuZXdMZW5ndGgpIHtcbiAgICAgICAgZGVwcy5wdXNoKGRlcCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGtleSAhPT0gdm9pZCAwKSB7XG4gICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoa2V5KSk7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0ludGVnZXJLZXkoa2V5KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChcImxlbmd0aFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgIGlmICghaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChNQVBfS0VZX0lURVJBVEVfS0VZKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb25zdCBldmVudEluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8geyB0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQgfSA6IHZvaWQgMDtcbiAgaWYgKGRlcHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKGRlcHNbMF0pIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRyaWdnZXJFZmZlY3RzKGRlcHNbMF0sIGV2ZW50SW5mbyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRWZmZWN0cyhkZXBzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZWZmZWN0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICAgIGlmIChkZXApIHtcbiAgICAgICAgZWZmZWN0cy5wdXNoKC4uLmRlcCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0cmlnZ2VyRWZmZWN0cyhjcmVhdGVEZXAoZWZmZWN0cyksIGV2ZW50SW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFZmZlY3RzKGNyZWF0ZURlcChlZmZlY3RzKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyRWZmZWN0cyhkZXAsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgY29uc3QgZWZmZWN0cyA9IGlzQXJyYXkoZGVwKSA/IGRlcCA6IFsuLi5kZXBdO1xuICBmb3IgKGNvbnN0IGVmZmVjdDIgb2YgZWZmZWN0cykge1xuICAgIGlmIChlZmZlY3QyLmNvbXB1dGVkKSB7XG4gICAgICB0cmlnZ2VyRWZmZWN0KGVmZmVjdDIsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGVmZmVjdDIgb2YgZWZmZWN0cykge1xuICAgIGlmICghZWZmZWN0Mi5jb21wdXRlZCkge1xuICAgICAgdHJpZ2dlckVmZmVjdChlZmZlY3QyLCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJFZmZlY3QoZWZmZWN0MiwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykge1xuICBpZiAoZWZmZWN0MiAhPT0gYWN0aXZlRWZmZWN0IHx8IGVmZmVjdDIuYWxsb3dSZWN1cnNlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZWZmZWN0Mi5vblRyaWdnZXIpIHtcbiAgICAgIGVmZmVjdDIub25UcmlnZ2VyKGV4dGVuZCh7IGVmZmVjdDogZWZmZWN0MiB9LCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKSk7XG4gICAgfVxuICAgIGlmIChlZmZlY3QyLnNjaGVkdWxlcikge1xuICAgICAgZWZmZWN0Mi5zY2hlZHVsZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0Mi5ydW4oKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldERlcEZyb21SZWFjdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSB0YXJnZXRNYXAuZ2V0KG9iamVjdCkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5nZXQoa2V5KTtcbn1cblxuY29uc3QgaXNOb25UcmFja2FibGVLZXlzID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApO1xuY29uc3QgYnVpbHRJblN5bWJvbHMgPSBuZXcgU2V0KFxuICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcImFyZ3VtZW50c1wiICYmIGtleSAhPT0gXCJjYWxsZXJcIikubWFwKChrZXkpID0+IFN5bWJvbFtrZXldKS5maWx0ZXIoaXNTeW1ib2wpXG4pO1xuY29uc3QgYXJyYXlJbnN0cnVtZW50YXRpb25zID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpO1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlJbnN0cnVtZW50YXRpb25zKCkge1xuICBjb25zdCBpbnN0cnVtZW50YXRpb25zID0ge307XG4gIFtcImluY2x1ZGVzXCIsIFwiaW5kZXhPZlwiLCBcImxhc3RJbmRleE9mXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGFyciA9IHRvUmF3KHRoaXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0cmFjayhhcnIsIFwiZ2V0XCIsIGkgKyBcIlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcyA9IGFycltrZXldKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJlcyA9PT0gLTEgfHwgcmVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYXJyW2tleV0oLi4uYXJncy5tYXAodG9SYXcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG4gIFtcInB1c2hcIiwgXCJwb3BcIiwgXCJzaGlmdFwiLCBcInVuc2hpZnRcIiwgXCJzcGxpY2VcIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaW5zdHJ1bWVudGF0aW9uc1trZXldID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgY29uc3QgcmVzID0gdG9SYXcodGhpcylba2V5XS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBpbnN0cnVtZW50YXRpb25zO1xufVxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkoa2V5KSB7XG4gIGNvbnN0IG9iaiA9IHRvUmF3KHRoaXMpO1xuICB0cmFjayhvYmosIFwiaGFzXCIsIGtleSk7XG4gIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbn1cbmNsYXNzIEJhc2VSZWFjdGl2ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihfaXNSZWFkb25seSA9IGZhbHNlLCBfc2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgdGhpcy5faXNSZWFkb25seSA9IF9pc1JlYWRvbmx5O1xuICAgIHRoaXMuX3NoYWxsb3cgPSBfc2hhbGxvdztcbiAgfVxuICBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgY29uc3QgaXNSZWFkb25seTIgPSB0aGlzLl9pc1JlYWRvbmx5LCBzaGFsbG93ID0gdGhpcy5fc2hhbGxvdztcbiAgICBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWN0aXZlXCIpIHtcbiAgICAgIHJldHVybiAhaXNSZWFkb25seTI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzUmVhZG9ubHlcIikge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIl9fdl9pc1NoYWxsb3dcIikge1xuICAgICAgcmV0dXJuIHNoYWxsb3c7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X3Jhd1wiICYmIHJlY2VpdmVyID09PSAoaXNSZWFkb25seTIgPyBzaGFsbG93ID8gc2hhbGxvd1JlYWRvbmx5TWFwIDogcmVhZG9ubHlNYXAgOiBzaGFsbG93ID8gc2hhbGxvd1JlYWN0aXZlTWFwIDogcmVhY3RpdmVNYXApLmdldCh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRJc0FycmF5ID0gaXNBcnJheSh0YXJnZXQpO1xuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGhhc093bihhcnJheUluc3RydW1lbnRhdGlvbnMsIGtleSkpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KGFycmF5SW5zdHJ1bWVudGF0aW9ucywga2V5LCByZWNlaXZlcik7XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSBcImhhc093blByb3BlcnR5XCIpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgIGlmIChpc1N5bWJvbChrZXkpID8gYnVpbHRJblN5bWJvbHMuaGFzKGtleSkgOiBpc05vblRyYWNrYWJsZUtleXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hhbGxvdykge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKGlzUmVmKHJlcykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpID8gcmVzIDogcmVzLnZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3QocmVzKSkge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHkyID8gcmVhZG9ubHkocmVzKSA6IHJlYWN0aXZlKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmNsYXNzIE11dGFibGVSZWFjdGl2ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgc3VwZXIoZmFsc2UsIHNoYWxsb3cpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgbGV0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKGlzUmVhZG9ubHkob2xkVmFsdWUpICYmIGlzUmVmKG9sZFZhbHVlKSAmJiAhaXNSZWYodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc2hhbGxvdykge1xuICAgICAgaWYgKCFpc1NoYWxsb3codmFsdWUpICYmICFpc1JlYWRvbmx5KHZhbHVlKSkge1xuICAgICAgICBvbGRWYWx1ZSA9IHRvUmF3KG9sZFZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSAmJiBpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgICBvbGRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaGFkS2V5ID0gaXNBcnJheSh0YXJnZXQpICYmIGlzSW50ZWdlcktleShrZXkpID8gTnVtYmVyKGtleSkgPCB0YXJnZXQubGVuZ3RoIDogaGFzT3duKHRhcmdldCwga2V5KTtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICBpZiAodGFyZ2V0ID09PSB0b1JhdyhyZWNlaXZlcikpIHtcbiAgICAgIGlmICghaGFkS2V5KSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCBrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgICAgIHRyaWdnZXIodGFyZ2V0LCBcInNldFwiLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCBoYWRLZXkgPSBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSk7XG4gICAgaWYgKHJlc3VsdCAmJiBoYWRLZXkpIHtcbiAgICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiLCBrZXksIHZvaWQgMCwgb2xkVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGhhcyh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuaGFzKHRhcmdldCwga2V5KTtcbiAgICBpZiAoIWlzU3ltYm9sKGtleSkgfHwgIWJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpKSB7XG4gICAgICB0cmFjayh0YXJnZXQsIFwiaGFzXCIsIGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgb3duS2V5cyh0YXJnZXQpIHtcbiAgICB0cmFjayhcbiAgICAgIHRhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNBcnJheSh0YXJnZXQpID8gXCJsZW5ndGhcIiA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH1cbn1cbmNsYXNzIFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHNoYWxsb3cgPSBmYWxzZSkge1xuICAgIHN1cGVyKHRydWUsIHNoYWxsb3cpO1xuICB9XG4gIHNldCh0YXJnZXQsIGtleSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgU2V0IG9wZXJhdGlvbiBvbiBrZXkgXCIke1N0cmluZyhrZXkpfVwiIGZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYERlbGV0ZSBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5jb25zdCBtdXRhYmxlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIoKTtcbmNvbnN0IHJlYWRvbmx5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTXV0YWJsZVJlYWN0aXZlSGFuZGxlcihcbiAgdHJ1ZVxuKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcih0cnVlKTtcblxuY29uc3QgdG9TaGFsbG93ID0gKHZhbHVlKSA9PiB2YWx1ZTtcbmNvbnN0IGdldFByb3RvID0gKHYpID0+IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yodik7XG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIGlzUmVhZG9ubHkgPSBmYWxzZSwgaXNTaGFsbG93ID0gZmFsc2UpIHtcbiAgdGFyZ2V0ID0gdGFyZ2V0W1wiX192X3Jhd1wiXTtcbiAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgaWYgKCFpc1JlYWRvbmx5KSB7XG4gICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICB0cmFjayhyYXdUYXJnZXQsIFwiZ2V0XCIsIGtleSk7XG4gICAgfVxuICAgIHRyYWNrKHJhd1RhcmdldCwgXCJnZXRcIiwgcmF3S2V5KTtcbiAgfVxuICBjb25zdCB7IGhhczogaGFzMiB9ID0gZ2V0UHJvdG8ocmF3VGFyZ2V0KTtcbiAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdyA/IHRvU2hhbGxvdyA6IGlzUmVhZG9ubHkgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgaWYgKGhhczIuY2FsbChyYXdUYXJnZXQsIGtleSkpIHtcbiAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KGtleSkpO1xuICB9IGVsc2UgaWYgKGhhczIuY2FsbChyYXdUYXJnZXQsIHJhd0tleSkpIHtcbiAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KHJhd0tleSkpO1xuICB9IGVsc2UgaWYgKHRhcmdldCAhPT0gcmF3VGFyZ2V0KSB7XG4gICAgdGFyZ2V0LmdldChrZXkpO1xuICB9XG59XG5mdW5jdGlvbiBoYXMoa2V5LCBpc1JlYWRvbmx5ID0gZmFsc2UpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdGhpc1tcIl9fdl9yYXdcIl07XG4gIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmICghaXNSZWFkb25seSkge1xuICAgIGlmIChoYXNDaGFuZ2VkKGtleSwgcmF3S2V5KSkge1xuICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImhhc1wiLCBrZXkpO1xuICAgIH1cbiAgICB0cmFjayhyYXdUYXJnZXQsIFwiaGFzXCIsIHJhd0tleSk7XG4gIH1cbiAgcmV0dXJuIGtleSA9PT0gcmF3S2V5ID8gdGFyZ2V0LmhhcyhrZXkpIDogdGFyZ2V0LmhhcyhrZXkpIHx8IHRhcmdldC5oYXMocmF3S2V5KTtcbn1cbmZ1bmN0aW9uIHNpemUodGFyZ2V0LCBpc1JlYWRvbmx5ID0gZmFsc2UpIHtcbiAgdGFyZ2V0ID0gdGFyZ2V0W1wiX192X3Jhd1wiXTtcbiAgIWlzUmVhZG9ubHkgJiYgdHJhY2sodG9SYXcodGFyZ2V0KSwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgXCJzaXplXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCBwcm90byA9IGdldFByb3RvKHRhcmdldCk7XG4gIGNvbnN0IGhhZEtleSA9IHByb3RvLmhhcy5jYWxsKHRhcmdldCwgdmFsdWUpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIHRhcmdldC5hZGQodmFsdWUpO1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCB2YWx1ZSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCB7IGhhczogaGFzMiwgZ2V0OiBnZXQyIH0gPSBnZXRQcm90byh0YXJnZXQpO1xuICBsZXQgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICBrZXkgPSB0b1JhdyhrZXkpO1xuICAgIGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KTtcbiAgfVxuICBjb25zdCBvbGRWYWx1ZSA9IGdldDIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIHRhcmdldC5zZXQoa2V5LCB2YWx1ZSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiYWRkXCIsIGtleSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKGhhc0NoYW5nZWQodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcInNldFwiLCBrZXksIHZhbHVlLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5mdW5jdGlvbiBkZWxldGVFbnRyeShrZXkpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IHsgaGFzOiBoYXMyLCBnZXQ6IGdldDIgfSA9IGdldFByb3RvKHRhcmdldCk7XG4gIGxldCBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIGtleSA9IHRvUmF3KGtleSk7XG4gICAgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY2hlY2tJZGVudGl0eUtleXModGFyZ2V0LCBoYXMyLCBrZXkpO1xuICB9XG4gIGNvbnN0IG9sZFZhbHVlID0gZ2V0MiA/IGdldDIuY2FsbCh0YXJnZXQsIGtleSkgOiB2b2lkIDA7XG4gIGNvbnN0IHJlc3VsdCA9IHRhcmdldC5kZWxldGUoa2V5KTtcbiAgaWYgKGhhZEtleSkge1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImRlbGV0ZVwiLCBrZXksIHZvaWQgMCwgb2xkVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjbGVhcigpIHtcbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IGhhZEl0ZW1zID0gdGFyZ2V0LnNpemUgIT09IDA7XG4gIGNvbnN0IG9sZFRhcmdldCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBpc01hcCh0YXJnZXQpID8gbmV3IE1hcCh0YXJnZXQpIDogbmV3IFNldCh0YXJnZXQpIDogdm9pZCAwO1xuICBjb25zdCByZXN1bHQgPSB0YXJnZXQuY2xlYXIoKTtcbiAgaWYgKGhhZEl0ZW1zKSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiY2xlYXJcIiwgdm9pZCAwLCB2b2lkIDAsIG9sZFRhcmdldCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZvckVhY2goaXNSZWFkb25seSwgaXNTaGFsbG93KSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSB0aGlzO1xuICAgIGNvbnN0IHRhcmdldCA9IG9ic2VydmVkW1wiX192X3Jhd1wiXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgIWlzUmVhZG9ubHkgJiYgdHJhY2socmF3VGFyZ2V0LCBcIml0ZXJhdGVcIiwgSVRFUkFURV9LRVkpO1xuICAgIHJldHVybiB0YXJnZXQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgd3JhcCh2YWx1ZSksIHdyYXAoa2V5KSwgb2JzZXJ2ZWQpO1xuICAgIH0pO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCBpc1JlYWRvbmx5LCBpc1NoYWxsb3cpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzW1wiX192X3Jhd1wiXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHRhcmdldElzTWFwID0gaXNNYXAocmF3VGFyZ2V0KTtcbiAgICBjb25zdCBpc1BhaXIgPSBtZXRob2QgPT09IFwiZW50cmllc1wiIHx8IG1ldGhvZCA9PT0gU3ltYm9sLml0ZXJhdG9yICYmIHRhcmdldElzTWFwO1xuICAgIGNvbnN0IGlzS2V5T25seSA9IG1ldGhvZCA9PT0gXCJrZXlzXCIgJiYgdGFyZ2V0SXNNYXA7XG4gICAgY29uc3QgaW5uZXJJdGVyYXRvciA9IHRhcmdldFttZXRob2RdKC4uLmFyZ3MpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cgPyB0b1NoYWxsb3cgOiBpc1JlYWRvbmx5ID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgIWlzUmVhZG9ubHkgJiYgdHJhY2soXG4gICAgICByYXdUYXJnZXQsXG4gICAgICBcIml0ZXJhdGVcIixcbiAgICAgIGlzS2V5T25seSA/IE1BUF9LRVlfSVRFUkFURV9LRVkgOiBJVEVSQVRFX0tFWVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGl0ZXJhdG9yIHByb3RvY29sXG4gICAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBpbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGRvbmUgPyB7IHZhbHVlLCBkb25lIH0gOiB7XG4gICAgICAgICAgdmFsdWU6IGlzUGFpciA/IFt3cmFwKHZhbHVlWzBdKSwgd3JhcCh2YWx1ZVsxXSldIDogd3JhcCh2YWx1ZSksXG4gICAgICAgICAgZG9uZVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIC8vIGl0ZXJhYmxlIHByb3RvY29sXG4gICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlYWRvbmx5TWV0aG9kKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnc1swXSA/IGBvbiBrZXkgXCIke2FyZ3NbMF19XCIgYCA6IGBgO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtjYXBpdGFsaXplKHR5cGUpfSBvcGVyYXRpb24gJHtrZXl9ZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdG9SYXcodGhpcylcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlID09PSBcImRlbGV0ZVwiID8gZmFsc2UgOiB0eXBlID09PSBcImNsZWFyXCIgPyB2b2lkIDAgOiB0aGlzO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgY29uc3QgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkLFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIGNsZWFyLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIGZhbHNlKVxuICB9O1xuICBjb25zdCBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIGZhbHNlLCB0cnVlKTtcbiAgICB9LFxuICAgIGdldCBzaXplKCkge1xuICAgICAgcmV0dXJuIHNpemUodGhpcyk7XG4gICAgfSxcbiAgICBoYXMsXG4gICAgYWRkLFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIGNsZWFyLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIHRydWUpXG4gIH07XG4gIGNvbnN0IHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiKSxcbiAgICBzZXQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwic2V0XCIpLFxuICAgIGRlbGV0ZTogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJkZWxldGVcIiksXG4gICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIiksXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaCh0cnVlLCBmYWxzZSlcbiAgfTtcbiAgY29uc3Qgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUsIHRydWUpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiKSxcbiAgICBzZXQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwic2V0XCIpLFxuICAgIGRlbGV0ZTogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJkZWxldGVcIiksXG4gICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIiksXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaCh0cnVlLCB0cnVlKVxuICB9O1xuICBjb25zdCBpdGVyYXRvck1ldGhvZHMgPSBbXCJrZXlzXCIsIFwidmFsdWVzXCIsIFwiZW50cmllc1wiLCBTeW1ib2wuaXRlcmF0b3JdO1xuICBpdGVyYXRvck1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIGZhbHNlLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgdHJ1ZSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgZmFsc2UsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICB0cnVlLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH0pO1xuICByZXR1cm4gW1xuICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zMixcbiAgICByZWFkb25seUluc3RydW1lbnRhdGlvbnMyLFxuICAgIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zMixcbiAgICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlxuICBdO1xufVxuY29uc3QgW1xuICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9ucyxcbiAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zLFxuICBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyxcbiAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uc1xuXSA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25zKCk7XG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoaXNSZWFkb25seSwgc2hhbGxvdykge1xuICBjb25zdCBpbnN0cnVtZW50YXRpb25zID0gc2hhbGxvdyA/IGlzUmVhZG9ubHkgPyBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIDogc2hhbGxvd0luc3RydW1lbnRhdGlvbnMgOiBpc1JlYWRvbmx5ID8gcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIDogbXV0YWJsZUluc3RydW1lbnRhdGlvbnM7XG4gIHJldHVybiAodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFjdGl2ZVwiKSB7XG4gICAgICByZXR1cm4gIWlzUmVhZG9ubHk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzUmVhZG9ubHlcIikge1xuICAgICAgcmV0dXJuIGlzUmVhZG9ubHk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X3Jhd1wiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICByZXR1cm4gUmVmbGVjdC5nZXQoXG4gICAgICBoYXNPd24oaW5zdHJ1bWVudGF0aW9ucywga2V5KSAmJiBrZXkgaW4gdGFyZ2V0ID8gaW5zdHJ1bWVudGF0aW9ucyA6IHRhcmdldCxcbiAgICAgIGtleSxcbiAgICAgIHJlY2VpdmVyXG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IG11dGFibGVDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcihmYWxzZSwgZmFsc2UpXG59O1xuY29uc3Qgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGZhbHNlLCB0cnVlKVxufTtcbmNvbnN0IHJlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIodHJ1ZSwgZmFsc2UpXG59O1xuY29uc3Qgc2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIodHJ1ZSwgdHJ1ZSlcbn07XG5mdW5jdGlvbiBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSkge1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAocmF3S2V5ICE9PSBrZXkgJiYgaGFzMi5jYWxsKHRhcmdldCwgcmF3S2V5KSkge1xuICAgIGNvbnN0IHR5cGUgPSB0b1Jhd1R5cGUodGFyZ2V0KTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgUmVhY3RpdmUgJHt0eXBlfSBjb250YWlucyBib3RoIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIHRoZSBzYW1lIG9iamVjdCR7dHlwZSA9PT0gYE1hcGAgPyBgIGFzIGtleXNgIDogYGB9LCB3aGljaCBjYW4gbGVhZCB0byBpbmNvbnNpc3RlbmNpZXMuIEF2b2lkIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHRoZSByYXcgYW5kIHJlYWN0aXZlIHZlcnNpb25zIG9mIGFuIG9iamVjdCBhbmQgb25seSB1c2UgdGhlIHJlYWN0aXZlIHZlcnNpb24gaWYgcG9zc2libGUuYFxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgcmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFjdGl2ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHNoYWxsb3dSZWFkb25seU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gdGFyZ2V0VHlwZU1hcChyYXdUeXBlKSB7XG4gIHN3aXRjaCAocmF3VHlwZSkge1xuICAgIGNhc2UgXCJPYmplY3RcIjpcbiAgICBjYXNlIFwiQXJyYXlcIjpcbiAgICAgIHJldHVybiAxIC8qIENPTU1PTiAqLztcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgY2FzZSBcIlNldFwiOlxuICAgIGNhc2UgXCJXZWFrTWFwXCI6XG4gICAgY2FzZSBcIldlYWtTZXRcIjpcbiAgICAgIHJldHVybiAyIC8qIENPTExFQ1RJT04gKi87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAwIC8qIElOVkFMSUQgKi87XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRhcmdldFR5cGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlW1wiX192X3NraXBcIl0gfHwgIU9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpID8gMCAvKiBJTlZBTElEICovIDogdGFyZ2V0VHlwZU1hcCh0b1Jhd1R5cGUodmFsdWUpKTtcbn1cbmZ1bmN0aW9uIHJlYWN0aXZlKHRhcmdldCkge1xuICBpZiAoaXNSZWFkb25seSh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIGZhbHNlLFxuICAgIG11dGFibGVIYW5kbGVycyxcbiAgICBtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHJlYWN0aXZlTWFwXG4gICk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVhY3RpdmUodGFyZ2V0KSB7XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgZmFsc2UsXG4gICAgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMsXG4gICAgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhY3RpdmVNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHJlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgcmVhZG9ubHlIYW5kbGVycyxcbiAgICByZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICByZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWRvbmx5KHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIHRydWUsXG4gICAgc2hhbGxvd1JlYWRvbmx5SGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFkb25seU1hcFxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVPYmplY3QodGFyZ2V0LCBpc1JlYWRvbmx5MiwgYmFzZUhhbmRsZXJzLCBjb2xsZWN0aW9uSGFuZGxlcnMsIHByb3h5TWFwKSB7XG4gIGlmICghaXNPYmplY3QodGFyZ2V0KSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYHZhbHVlIGNhbm5vdCBiZSBtYWRlIHJlYWN0aXZlOiAke1N0cmluZyh0YXJnZXQpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGlmICh0YXJnZXRbXCJfX3ZfcmF3XCJdICYmICEoaXNSZWFkb25seTIgJiYgdGFyZ2V0W1wiX192X2lzUmVhY3RpdmVcIl0pKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBjb25zdCBleGlzdGluZ1Byb3h5ID0gcHJveHlNYXAuZ2V0KHRhcmdldCk7XG4gIGlmIChleGlzdGluZ1Byb3h5KSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nUHJveHk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFRhcmdldFR5cGUodGFyZ2V0KTtcbiAgaWYgKHRhcmdldFR5cGUgPT09IDAgLyogSU5WQUxJRCAqLykge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoXG4gICAgdGFyZ2V0LFxuICAgIHRhcmdldFR5cGUgPT09IDIgLyogQ09MTEVDVElPTiAqLyA/IGNvbGxlY3Rpb25IYW5kbGVycyA6IGJhc2VIYW5kbGVyc1xuICApO1xuICBwcm94eU1hcC5zZXQodGFyZ2V0LCBwcm94eSk7XG4gIHJldHVybiBwcm94eTtcbn1cbmZ1bmN0aW9uIGlzUmVhY3RpdmUodmFsdWUpIHtcbiAgaWYgKGlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGlzUmVhY3RpdmUodmFsdWVbXCJfX3ZfcmF3XCJdKTtcbiAgfVxuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNSZWFjdGl2ZVwiXSk7XG59XG5mdW5jdGlvbiBpc1JlYWRvbmx5KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1JlYWRvbmx5XCJdKTtcbn1cbmZ1bmN0aW9uIGlzU2hhbGxvdyh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNTaGFsbG93XCJdKTtcbn1cbmZ1bmN0aW9uIGlzUHJveHkodmFsdWUpIHtcbiAgcmV0dXJuIGlzUmVhY3RpdmUodmFsdWUpIHx8IGlzUmVhZG9ubHkodmFsdWUpO1xufVxuZnVuY3Rpb24gdG9SYXcob2JzZXJ2ZWQpIHtcbiAgY29uc3QgcmF3ID0gb2JzZXJ2ZWQgJiYgb2JzZXJ2ZWRbXCJfX3ZfcmF3XCJdO1xuICByZXR1cm4gcmF3ID8gdG9SYXcocmF3KSA6IG9ic2VydmVkO1xufVxuZnVuY3Rpb24gbWFya1Jhdyh2YWx1ZSkge1xuICBkZWYodmFsdWUsIFwiX192X3NraXBcIiwgdHJ1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IHRvUmVhY3RpdmUgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSA/IHJlYWN0aXZlKHZhbHVlKSA6IHZhbHVlO1xuY29uc3QgdG9SZWFkb25seSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gcmVhZG9ubHkodmFsdWUpIDogdmFsdWU7XG5cbmZ1bmN0aW9uIHRyYWNrUmVmVmFsdWUocmVmMikge1xuICBpZiAoc2hvdWxkVHJhY2sgJiYgYWN0aXZlRWZmZWN0KSB7XG4gICAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0cmFja0VmZmVjdHMocmVmMi5kZXAgfHwgKHJlZjIuZGVwID0gY3JlYXRlRGVwKCkpLCB7XG4gICAgICAgIHRhcmdldDogcmVmMixcbiAgICAgICAgdHlwZTogXCJnZXRcIixcbiAgICAgICAga2V5OiBcInZhbHVlXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFja0VmZmVjdHMocmVmMi5kZXAgfHwgKHJlZjIuZGVwID0gY3JlYXRlRGVwKCkpKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWZWYWx1ZShyZWYyLCBuZXdWYWwpIHtcbiAgcmVmMiA9IHRvUmF3KHJlZjIpO1xuICBjb25zdCBkZXAgPSByZWYyLmRlcDtcbiAgaWYgKGRlcCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0cmlnZ2VyRWZmZWN0cyhkZXAsIHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIixcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFZmZlY3RzKGRlcCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc1JlZihyKSB7XG4gIHJldHVybiAhIShyICYmIHIuX192X2lzUmVmID09PSB0cnVlKTtcbn1cbmZ1bmN0aW9uIHJlZih2YWx1ZSkge1xuICByZXR1cm4gY3JlYXRlUmVmKHZhbHVlLCBmYWxzZSk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVmKHZhbHVlKSB7XG4gIHJldHVybiBjcmVhdGVSZWYodmFsdWUsIHRydWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVmKHJhd1ZhbHVlLCBzaGFsbG93KSB7XG4gIGlmIChpc1JlZihyYXdWYWx1ZSkpIHtcbiAgICByZXR1cm4gcmF3VmFsdWU7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZWZJbXBsKHJhd1ZhbHVlLCBzaGFsbG93KTtcbn1cbmNsYXNzIFJlZkltcGwge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgX192X2lzU2hhbGxvdykge1xuICAgIHRoaXMuX192X2lzU2hhbGxvdyA9IF9fdl9pc1NoYWxsb3c7XG4gICAgdGhpcy5kZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXMuX3Jhd1ZhbHVlID0gX192X2lzU2hhbGxvdyA/IHZhbHVlIDogdG9SYXcodmFsdWUpO1xuICAgIHRoaXMuX3ZhbHVlID0gX192X2lzU2hhbGxvdyA/IHZhbHVlIDogdG9SZWFjdGl2ZSh2YWx1ZSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHRyYWNrUmVmVmFsdWUodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICBjb25zdCB1c2VEaXJlY3RWYWx1ZSA9IHRoaXMuX192X2lzU2hhbGxvdyB8fCBpc1NoYWxsb3cobmV3VmFsKSB8fCBpc1JlYWRvbmx5KG5ld1ZhbCk7XG4gICAgbmV3VmFsID0gdXNlRGlyZWN0VmFsdWUgPyBuZXdWYWwgOiB0b1JhdyhuZXdWYWwpO1xuICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbCwgdGhpcy5fcmF3VmFsdWUpKSB7XG4gICAgICB0aGlzLl9yYXdWYWx1ZSA9IG5ld1ZhbDtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdXNlRGlyZWN0VmFsdWUgPyBuZXdWYWwgOiB0b1JlYWN0aXZlKG5ld1ZhbCk7XG4gICAgICB0cmlnZ2VyUmVmVmFsdWUodGhpcywgbmV3VmFsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJSZWYocmVmMikge1xuICB0cmlnZ2VyUmVmVmFsdWUocmVmMiwgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHJlZjIudmFsdWUgOiB2b2lkIDApO1xufVxuZnVuY3Rpb24gdW5yZWYocmVmMikge1xuICByZXR1cm4gaXNSZWYocmVmMikgPyByZWYyLnZhbHVlIDogcmVmMjtcbn1cbmZ1bmN0aW9uIHRvVmFsdWUoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSkgPyBzb3VyY2UoKSA6IHVucmVmKHNvdXJjZSk7XG59XG5jb25zdCBzaGFsbG93VW53cmFwSGFuZGxlcnMgPSB7XG4gIGdldDogKHRhcmdldCwga2V5LCByZWNlaXZlcikgPT4gdW5yZWYoUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSksXG4gIHNldDogKHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmIChpc1JlZihvbGRWYWx1ZSkgJiYgIWlzUmVmKHZhbHVlKSkge1xuICAgICAgb2xkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gcHJveHlSZWZzKG9iamVjdFdpdGhSZWZzKSB7XG4gIHJldHVybiBpc1JlYWN0aXZlKG9iamVjdFdpdGhSZWZzKSA/IG9iamVjdFdpdGhSZWZzIDogbmV3IFByb3h5KG9iamVjdFdpdGhSZWZzLCBzaGFsbG93VW53cmFwSGFuZGxlcnMpO1xufVxuY2xhc3MgQ3VzdG9tUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKGZhY3RvcnkpIHtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgY29uc3QgeyBnZXQsIHNldCB9ID0gZmFjdG9yeShcbiAgICAgICgpID0+IHRyYWNrUmVmVmFsdWUodGhpcyksXG4gICAgICAoKSA9PiB0cmlnZ2VyUmVmVmFsdWUodGhpcylcbiAgICApO1xuICAgIHRoaXMuX2dldCA9IGdldDtcbiAgICB0aGlzLl9zZXQgPSBzZXQ7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoKTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgdGhpcy5fc2V0KG5ld1ZhbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1c3RvbVJlZihmYWN0b3J5KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tUmVmSW1wbChmYWN0b3J5KTtcbn1cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3QpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzUHJveHkob2JqZWN0KSkge1xuICAgIGNvbnNvbGUud2FybihgdG9SZWZzKCkgZXhwZWN0cyBhIHJlYWN0aXZlIG9iamVjdCBidXQgcmVjZWl2ZWQgYSBwbGFpbiBvbmUuYCk7XG4gIH1cbiAgY29uc3QgcmV0ID0gaXNBcnJheShvYmplY3QpID8gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpIDoge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIHJldFtrZXldID0gcHJvcGVydHlUb1JlZihvYmplY3QsIGtleSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmNsYXNzIE9iamVjdFJlZkltcGwge1xuICBjb25zdHJ1Y3Rvcihfb2JqZWN0LCBfa2V5LCBfZGVmYXVsdFZhbHVlKSB7XG4gICAgdGhpcy5fb2JqZWN0ID0gX29iamVjdDtcbiAgICB0aGlzLl9rZXkgPSBfa2V5O1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IF9kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XTtcbiAgICByZXR1cm4gdmFsID09PSB2b2lkIDAgPyB0aGlzLl9kZWZhdWx0VmFsdWUgOiB2YWw7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIHRoaXMuX29iamVjdFt0aGlzLl9rZXldID0gbmV3VmFsO1xuICB9XG4gIGdldCBkZXAoKSB7XG4gICAgcmV0dXJuIGdldERlcEZyb21SZWFjdGl2ZSh0b1Jhdyh0aGlzLl9vYmplY3QpLCB0aGlzLl9rZXkpO1xuICB9XG59XG5jbGFzcyBHZXR0ZXJSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX2dldHRlcikge1xuICAgIHRoaXMuX2dldHRlciA9IF9nZXR0ZXI7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXMuX192X2lzUmVhZG9ubHkgPSB0cnVlO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0dGVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGlzUmVmKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gc291cmNlO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIHJldHVybiBuZXcgR2V0dGVyUmVmSW1wbChzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gcHJvcGVydHlUb1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVmKHNvdXJjZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BlcnR5VG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSkge1xuICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcbiAgcmV0dXJuIGlzUmVmKHZhbCkgPyB2YWwgOiBuZXcgT2JqZWN0UmVmSW1wbChzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKTtcbn1cblxuY2xhc3MgQ29tcHV0ZWRSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoZ2V0dGVyLCBfc2V0dGVyLCBpc1JlYWRvbmx5LCBpc1NTUikge1xuICAgIHRoaXMuX3NldHRlciA9IF9zZXR0ZXI7XG4gICAgdGhpcy5kZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IGZhbHNlO1xuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fZGlydHkpIHtcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB0cmlnZ2VyUmVmVmFsdWUodGhpcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5lZmZlY3QuY29tcHV0ZWQgPSB0aGlzO1xuICAgIHRoaXMuZWZmZWN0LmFjdGl2ZSA9IHRoaXMuX2NhY2hlYWJsZSA9ICFpc1NTUjtcbiAgICB0aGlzW1wiX192X2lzUmVhZG9ubHlcIl0gPSBpc1JlYWRvbmx5O1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCBzZWxmID0gdG9SYXcodGhpcyk7XG4gICAgdHJhY2tSZWZWYWx1ZShzZWxmKTtcbiAgICBpZiAoc2VsZi5fZGlydHkgfHwgIXNlbGYuX2NhY2hlYWJsZSkge1xuICAgICAgc2VsZi5fZGlydHkgPSBmYWxzZTtcbiAgICAgIHNlbGYuX3ZhbHVlID0gc2VsZi5lZmZlY3QucnVuKCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsdWUpIHtcbiAgICB0aGlzLl9zZXR0ZXIobmV3VmFsdWUpO1xuICB9XG59XG5mdW5jdGlvbiBjb21wdXRlZChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNTU1IgPSBmYWxzZSkge1xuICBsZXQgZ2V0dGVyO1xuICBsZXQgc2V0dGVyO1xuICBjb25zdCBvbmx5R2V0dGVyID0gaXNGdW5jdGlvbihnZXR0ZXJPck9wdGlvbnMpO1xuICBpZiAob25seUdldHRlcikge1xuICAgIGdldHRlciA9IGdldHRlck9yT3B0aW9ucztcbiAgICBzZXR0ZXIgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKFwiV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgdmFsdWUgaXMgcmVhZG9ubHlcIik7XG4gICAgfSA6IE5PT1A7XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zLmdldDtcbiAgICBzZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuc2V0O1xuICB9XG4gIGNvbnN0IGNSZWYgPSBuZXcgQ29tcHV0ZWRSZWZJbXBsKGdldHRlciwgc2V0dGVyLCBvbmx5R2V0dGVyIHx8ICFzZXR0ZXIsIGlzU1NSKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVidWdPcHRpb25zICYmICFpc1NTUikge1xuICAgIGNSZWYuZWZmZWN0Lm9uVHJhY2sgPSBkZWJ1Z09wdGlvbnMub25UcmFjaztcbiAgICBjUmVmLmVmZmVjdC5vblRyaWdnZXIgPSBkZWJ1Z09wdGlvbnMub25UcmlnZ2VyO1xuICB9XG4gIHJldHVybiBjUmVmO1xufVxuXG5jb25zdCB0aWNrID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgcXVldWUgPSBbXTtcbmxldCBxdWV1ZWQgPSBmYWxzZTtcbmNvbnN0IHNjaGVkdWxlciA9IChmbikgPT4ge1xuICBxdWV1ZS5wdXNoKGZuKTtcbiAgaWYgKCFxdWV1ZWQpIHtcbiAgICBxdWV1ZWQgPSB0cnVlO1xuICAgIHRpY2sudGhlbihmbHVzaCk7XG4gIH1cbn07XG5jb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgIHF1ZXVlW2ldKCk7XG4gIH1cbiAgcXVldWUubGVuZ3RoID0gMDtcbiAgcXVldWVkID0gZmFsc2U7XG59O1xuY2xhc3MgRGVmZXJyZWRDb21wdXRlZFJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihnZXR0ZXIpIHtcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IHRydWU7XG4gICAgbGV0IGNvbXBhcmVUYXJnZXQ7XG4gICAgbGV0IGhhc0NvbXBhcmVUYXJnZXQgPSBmYWxzZTtcbiAgICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdGhpcy5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZ2V0dGVyLCAoY29tcHV0ZWRUcmlnZ2VyKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXApIHtcbiAgICAgICAgaWYgKGNvbXB1dGVkVHJpZ2dlcikge1xuICAgICAgICAgIGNvbXBhcmVUYXJnZXQgPSB0aGlzLl92YWx1ZTtcbiAgICAgICAgICBoYXNDb21wYXJlVGFyZ2V0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVUb0NvbXBhcmUgPSBoYXNDb21wYXJlVGFyZ2V0ID8gY29tcGFyZVRhcmdldCA6IHRoaXMuX3ZhbHVlO1xuICAgICAgICAgIHNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgICAgaGFzQ29tcGFyZVRhcmdldCA9IGZhbHNlO1xuICAgICAgICAgIHNjaGVkdWxlcigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lZmZlY3QuYWN0aXZlICYmIHRoaXMuX2dldCgpICE9PSB2YWx1ZVRvQ29tcGFyZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyUmVmVmFsdWUodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5kZXApIHtcbiAgICAgICAgICBpZiAoZS5jb21wdXRlZCBpbnN0YW5jZW9mIERlZmVycmVkQ29tcHV0ZWRSZWZJbXBsKSB7XG4gICAgICAgICAgICBlLnNjaGVkdWxlcihcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAvKiBjb21wdXRlZFRyaWdnZXIgKi9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy5lZmZlY3QuY29tcHV0ZWQgPSB0aGlzO1xuICB9XG4gIF9nZXQoKSB7XG4gICAgaWYgKHRoaXMuX2RpcnR5KSB7XG4gICAgICB0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID0gdGhpcy5lZmZlY3QucnVuKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgdHJhY2tSZWZWYWx1ZSh0aGlzKTtcbiAgICByZXR1cm4gdG9SYXcodGhpcykuX2dldCgpO1xuICB9XG59XG5mdW5jdGlvbiBkZWZlcnJlZENvbXB1dGVkKGdldHRlcikge1xuICByZXR1cm4gbmV3IERlZmVycmVkQ29tcHV0ZWRSZWZJbXBsKGdldHRlcik7XG59XG5cbmV4cG9ydCB7IEVmZmVjdFNjb3BlLCBJVEVSQVRFX0tFWSwgUmVhY3RpdmVFZmZlY3QsIGNvbXB1dGVkLCBjdXN0b21SZWYsIGRlZmVycmVkQ29tcHV0ZWQsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGVuYWJsZVRyYWNraW5nLCBnZXRDdXJyZW50U2NvcGUsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBwYXVzZVRyYWNraW5nLCBwcm94eVJlZnMsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCByZXNldFRyYWNraW5nLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgc3RvcCwgdG9SYXcsIHRvUmVmLCB0b1JlZnMsIHRvVmFsdWUsIHRyYWNrLCB0cmlnZ2VyLCB0cmlnZ2VyUmVmLCB1bnJlZiB9O1xuIiwiaW1wb3J0IHsgcGF1c2VUcmFja2luZywgcmVzZXRUcmFja2luZywgaXNSZWYsIHRvUmF3LCBnZXRDdXJyZW50U2NvcGUsIGlzU2hhbGxvdyBhcyBpc1NoYWxsb3ckMSwgaXNSZWFjdGl2ZSwgUmVhY3RpdmVFZmZlY3QsIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCB0cmFjaywgcmVhY3RpdmUsIHNoYWxsb3dSZWFjdGl2ZSwgdHJpZ2dlciwgaXNQcm94eSwgcHJveHlSZWZzLCBtYXJrUmF3LCBFZmZlY3RTY29wZSwgY29tcHV0ZWQgYXMgY29tcHV0ZWQkMSwgaXNSZWFkb25seSB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eSc7XG5leHBvcnQgeyBFZmZlY3RTY29wZSwgUmVhY3RpdmVFZmZlY3QsIGN1c3RvbVJlZiwgZWZmZWN0LCBlZmZlY3RTY29wZSwgZ2V0Q3VycmVudFNjb3BlLCBpc1Byb3h5LCBpc1JlYWN0aXZlLCBpc1JlYWRvbmx5LCBpc1JlZiwgaXNTaGFsbG93LCBtYXJrUmF3LCBvblNjb3BlRGlzcG9zZSwgcHJveHlSZWZzLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHN0b3AsIHRvUmF3LCB0b1JlZiwgdG9SZWZzLCB0b1ZhbHVlLCB0cmlnZ2VyUmVmLCB1bnJlZiB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eSc7XG5pbXBvcnQgeyBpc1N0cmluZywgaXNGdW5jdGlvbiwgaXNQcm9taXNlLCBpc0FycmF5LCBOT09QLCBnZXRHbG9iYWxUaGlzLCBleHRlbmQsIEVNUFRZX09CSiwgdG9IYW5kbGVyS2V5LCBsb29zZVRvTnVtYmVyLCBoeXBoZW5hdGUsIGNhbWVsaXplLCBpc09iamVjdCwgaXNPbiwgaGFzT3duLCBpc01vZGVsTGlzdGVuZXIsIGNhcGl0YWxpemUsIHRvTnVtYmVyLCBoYXNDaGFuZ2VkLCByZW1vdmUsIGlzU2V0LCBpc01hcCwgaXNQbGFpbk9iamVjdCwgaXNCdWlsdEluRGlyZWN0aXZlLCBpbnZva2VBcnJheUZucywgaXNSZWdFeHAsIGlzR2xvYmFsbHlBbGxvd2VkLCBOTywgZGVmLCBpc1Jlc2VydmVkUHJvcCwgRU1QVFlfQVJSLCB0b1Jhd1R5cGUsIG1ha2VNYXAsIG5vcm1hbGl6ZUNsYXNzLCBub3JtYWxpemVTdHlsZSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcbmV4cG9ydCB7IGNhbWVsaXplLCBjYXBpdGFsaXplLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCB0b0Rpc3BsYXlTdHJpbmcsIHRvSGFuZGxlcktleSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3RhY2sgPSBbXTtcbmZ1bmN0aW9uIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZSkge1xuICBzdGFjay5wdXNoKHZub2RlKTtcbn1cbmZ1bmN0aW9uIHBvcFdhcm5pbmdDb250ZXh0KCkge1xuICBzdGFjay5wb3AoKTtcbn1cbmZ1bmN0aW9uIHdhcm4obXNnLCAuLi5hcmdzKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSlcbiAgICByZXR1cm47XG4gIHBhdXNlVHJhY2tpbmcoKTtcbiAgY29uc3QgaW5zdGFuY2UgPSBzdGFjay5sZW5ndGggPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5jb21wb25lbnQgOiBudWxsO1xuICBjb25zdCBhcHBXYXJuSGFuZGxlciA9IGluc3RhbmNlICYmIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLndhcm5IYW5kbGVyO1xuICBjb25zdCB0cmFjZSA9IGdldENvbXBvbmVudFRyYWNlKCk7XG4gIGlmIChhcHBXYXJuSGFuZGxlcikge1xuICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhcbiAgICAgIGFwcFdhcm5IYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICAxMSxcbiAgICAgIFtcbiAgICAgICAgbXNnICsgYXJncy5qb2luKFwiXCIpLFxuICAgICAgICBpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSxcbiAgICAgICAgdHJhY2UubWFwKFxuICAgICAgICAgICh7IHZub2RlIH0pID0+IGBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCB2bm9kZS50eXBlKX0+YFxuICAgICAgICApLmpvaW4oXCJcXG5cIiksXG4gICAgICAgIHRyYWNlXG4gICAgICBdXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3YXJuQXJncyA9IFtgW1Z1ZSB3YXJuXTogJHttc2d9YCwgLi4uYXJnc107XG4gICAgaWYgKHRyYWNlLmxlbmd0aCAmJiAvLyBhdm9pZCBzcGFtbWluZyBjb25zb2xlIGR1cmluZyB0ZXN0c1xuICAgIHRydWUpIHtcbiAgICAgIHdhcm5BcmdzLnB1c2goYFxuYCwgLi4uZm9ybWF0VHJhY2UodHJhY2UpKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKC4uLndhcm5BcmdzKTtcbiAgfVxuICByZXNldFRyYWNraW5nKCk7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRUcmFjZSgpIHtcbiAgbGV0IGN1cnJlbnRWTm9kZSA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICBpZiAoIWN1cnJlbnRWTm9kZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkU3RhY2sgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnRWTm9kZSkge1xuICAgIGNvbnN0IGxhc3QgPSBub3JtYWxpemVkU3RhY2tbMF07XG4gICAgaWYgKGxhc3QgJiYgbGFzdC52bm9kZSA9PT0gY3VycmVudFZOb2RlKSB7XG4gICAgICBsYXN0LnJlY3Vyc2VDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkU3RhY2sucHVzaCh7XG4gICAgICAgIHZub2RlOiBjdXJyZW50Vk5vZGUsXG4gICAgICAgIHJlY3Vyc2VDb3VudDogMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudEluc3RhbmNlID0gY3VycmVudFZOb2RlLmNvbXBvbmVudCAmJiBjdXJyZW50Vk5vZGUuY29tcG9uZW50LnBhcmVudDtcbiAgICBjdXJyZW50Vk5vZGUgPSBwYXJlbnRJbnN0YW5jZSAmJiBwYXJlbnRJbnN0YW5jZS52bm9kZTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZFN0YWNrO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2UodHJhY2UpIHtcbiAgY29uc3QgbG9ncyA9IFtdO1xuICB0cmFjZS5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGxvZ3MucHVzaCguLi5pID09PSAwID8gW10gOiBbYFxuYF0sIC4uLmZvcm1hdFRyYWNlRW50cnkoZW50cnkpKTtcbiAgfSk7XG4gIHJldHVybiBsb2dzO1xufVxuZnVuY3Rpb24gZm9ybWF0VHJhY2VFbnRyeSh7IHZub2RlLCByZWN1cnNlQ291bnQgfSkge1xuICBjb25zdCBwb3N0Zml4ID0gcmVjdXJzZUNvdW50ID4gMCA/IGAuLi4gKCR7cmVjdXJzZUNvdW50fSByZWN1cnNpdmUgY2FsbHMpYCA6IGBgO1xuICBjb25zdCBpc1Jvb3QgPSB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQucGFyZW50ID09IG51bGwgOiBmYWxzZTtcbiAgY29uc3Qgb3BlbiA9IGAgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICB2bm9kZS5jb21wb25lbnQsXG4gICAgdm5vZGUudHlwZSxcbiAgICBpc1Jvb3RcbiAgKX1gO1xuICBjb25zdCBjbG9zZSA9IGA+YCArIHBvc3RmaXg7XG4gIHJldHVybiB2bm9kZS5wcm9wcyA/IFtvcGVuLCAuLi5mb3JtYXRQcm9wcyh2bm9kZS5wcm9wcyksIGNsb3NlXSA6IFtvcGVuICsgY2xvc2VdO1xufVxuZnVuY3Rpb24gZm9ybWF0UHJvcHMocHJvcHMpIHtcbiAgY29uc3QgcmVzID0gW107XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XG4gIGtleXMuc2xpY2UoMCwgMykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVzLnB1c2goLi4uZm9ybWF0UHJvcChrZXksIHByb3BzW2tleV0pKTtcbiAgfSk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDMpIHtcbiAgICByZXMucHVzaChgIC4uLmApO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wKGtleSwgdmFsdWUsIHJhdykge1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09JHt2YWx1ZX1gXTtcbiAgfSBlbHNlIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IGZvcm1hdFByb3Aoa2V5LCB0b1Jhdyh2YWx1ZS52YWx1ZSksIHRydWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PVJlZjxgLCB2YWx1ZSwgYD5gXTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiBbYCR7a2V5fT1mbiR7dmFsdWUubmFtZSA/IGA8JHt2YWx1ZS5uYW1lfT5gIDogYGB9YF07XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09YCwgdmFsdWVdO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnROdW1iZXIodmFsLCB0eXBlKSB7XG4gIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSlcbiAgICByZXR1cm47XG4gIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSB7XG4gICAgd2FybihgJHt0eXBlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgLSBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWwpfS5gKTtcbiAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XG4gICAgd2FybihgJHt0eXBlfSBpcyBOYU4gLSB0aGUgZHVyYXRpb24gZXhwcmVzc2lvbiBtaWdodCBiZSBpbmNvcnJlY3QuYCk7XG4gIH1cbn1cblxuY29uc3QgRXJyb3JUeXBlU3RyaW5ncyA9IHtcbiAgW1wic3BcIl06IFwic2VydmVyUHJlZmV0Y2ggaG9va1wiLFxuICBbXCJiY1wiXTogXCJiZWZvcmVDcmVhdGUgaG9va1wiLFxuICBbXCJjXCJdOiBcImNyZWF0ZWQgaG9va1wiLFxuICBbXCJibVwiXTogXCJiZWZvcmVNb3VudCBob29rXCIsXG4gIFtcIm1cIl06IFwibW91bnRlZCBob29rXCIsXG4gIFtcImJ1XCJdOiBcImJlZm9yZVVwZGF0ZSBob29rXCIsXG4gIFtcInVcIl06IFwidXBkYXRlZFwiLFxuICBbXCJidW1cIl06IFwiYmVmb3JlVW5tb3VudCBob29rXCIsXG4gIFtcInVtXCJdOiBcInVubW91bnRlZCBob29rXCIsXG4gIFtcImFcIl06IFwiYWN0aXZhdGVkIGhvb2tcIixcbiAgW1wiZGFcIl06IFwiZGVhY3RpdmF0ZWQgaG9va1wiLFxuICBbXCJlY1wiXTogXCJlcnJvckNhcHR1cmVkIGhvb2tcIixcbiAgW1wicnRjXCJdOiBcInJlbmRlclRyYWNrZWQgaG9va1wiLFxuICBbXCJydGdcIl06IFwicmVuZGVyVHJpZ2dlcmVkIGhvb2tcIixcbiAgWzBdOiBcInNldHVwIGZ1bmN0aW9uXCIsXG4gIFsxXTogXCJyZW5kZXIgZnVuY3Rpb25cIixcbiAgWzJdOiBcIndhdGNoZXIgZ2V0dGVyXCIsXG4gIFszXTogXCJ3YXRjaGVyIGNhbGxiYWNrXCIsXG4gIFs0XTogXCJ3YXRjaGVyIGNsZWFudXAgZnVuY3Rpb25cIixcbiAgWzVdOiBcIm5hdGl2ZSBldmVudCBoYW5kbGVyXCIsXG4gIFs2XTogXCJjb21wb25lbnQgZXZlbnQgaGFuZGxlclwiLFxuICBbN106IFwidm5vZGUgaG9va1wiLFxuICBbOF06IFwiZGlyZWN0aXZlIGhvb2tcIixcbiAgWzldOiBcInRyYW5zaXRpb24gaG9va1wiLFxuICBbMTBdOiBcImFwcCBlcnJvckhhbmRsZXJcIixcbiAgWzExXTogXCJhcHAgd2FybkhhbmRsZXJcIixcbiAgWzEyXTogXCJyZWYgZnVuY3Rpb25cIixcbiAgWzEzXTogXCJhc3luYyBjb21wb25lbnQgbG9hZGVyXCIsXG4gIFsxNF06IFwic2NoZWR1bGVyIGZsdXNoLiBUaGlzIGlzIGxpa2VseSBhIFZ1ZSBpbnRlcm5hbHMgYnVnLiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBhdCBodHRwczovL25ldy1pc3N1ZS52dWVqcy5vcmcvP3JlcG89dnVlanMvY29yZVwiXG59O1xuZnVuY3Rpb24gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICBsZXQgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGFyZ3MgPyBmbiguLi5hcmdzKSA6IGZuKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgaWYgKGlzRnVuY3Rpb24oZm4pKSB7XG4gICAgY29uc3QgcmVzID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncyk7XG4gICAgaWYgKHJlcyAmJiBpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgIHZhbHVlcy5wdXNoKGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGZuW2ldLCBpbnN0YW5jZSwgdHlwZSwgYXJncykpO1xuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBjb25zdCBjb250ZXh0Vk5vZGUgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnZub2RlIDogbnVsbDtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgbGV0IGN1ciA9IGluc3RhbmNlLnBhcmVudDtcbiAgICBjb25zdCBleHBvc2VkSW5zdGFuY2UgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBlcnJvckluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gRXJyb3JUeXBlU3RyaW5nc1t0eXBlXSA6IHR5cGU7XG4gICAgd2hpbGUgKGN1cikge1xuICAgICAgY29uc3QgZXJyb3JDYXB0dXJlZEhvb2tzID0gY3VyLmVjO1xuICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yQ2FwdHVyZWRIb29rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlcnJvckNhcHR1cmVkSG9va3NbaV0oZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mbykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXIgPSBjdXIucGFyZW50O1xuICAgIH1cbiAgICBjb25zdCBhcHBFcnJvckhhbmRsZXIgPSBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5lcnJvckhhbmRsZXI7XG4gICAgaWYgKGFwcEVycm9ySGFuZGxlcikge1xuICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgICBhcHBFcnJvckhhbmRsZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDEwLFxuICAgICAgICBbZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mb11cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2KTtcbn1cbmZ1bmN0aW9uIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGluZm8gPSBFcnJvclR5cGVTdHJpbmdzW3R5cGVdO1xuICAgIGlmIChjb250ZXh0Vk5vZGUpIHtcbiAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChjb250ZXh0Vk5vZGUpO1xuICAgIH1cbiAgICB3YXJuKGBVbmhhbmRsZWQgZXJyb3Ike2luZm8gPyBgIGR1cmluZyBleGVjdXRpb24gb2YgJHtpbmZvfWAgOiBgYH1gKTtcbiAgICBpZiAoY29udGV4dFZOb2RlKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICBpZiAodGhyb3dJbkRldikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5sZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xubGV0IGlzRmx1c2hQZW5kaW5nID0gZmFsc2U7XG5jb25zdCBxdWV1ZSA9IFtdO1xubGV0IGZsdXNoSW5kZXggPSAwO1xuY29uc3QgcGVuZGluZ1Bvc3RGbHVzaENicyA9IFtdO1xubGV0IGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG5sZXQgcG9zdEZsdXNoSW5kZXggPSAwO1xuY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xubGV0IGN1cnJlbnRGbHVzaFByb21pc2UgPSBudWxsO1xuY29uc3QgUkVDVVJTSU9OX0xJTUlUID0gMTAwO1xuZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgY29uc3QgcCA9IGN1cnJlbnRGbHVzaFByb21pc2UgfHwgcmVzb2x2ZWRQcm9taXNlO1xuICByZXR1cm4gZm4gPyBwLnRoZW4odGhpcyA/IGZuLmJpbmQodGhpcykgOiBmbikgOiBwO1xufVxuZnVuY3Rpb24gZmluZEluc2VydGlvbkluZGV4KGlkKSB7XG4gIGxldCBzdGFydCA9IGZsdXNoSW5kZXggKyAxO1xuICBsZXQgZW5kID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICBjb25zdCBtaWRkbGUgPSBzdGFydCArIGVuZCA+Pj4gMTtcbiAgICBjb25zdCBtaWRkbGVKb2IgPSBxdWV1ZVttaWRkbGVdO1xuICAgIGNvbnN0IG1pZGRsZUpvYklkID0gZ2V0SWQobWlkZGxlSm9iKTtcbiAgICBpZiAobWlkZGxlSm9iSWQgPCBpZCB8fCBtaWRkbGVKb2JJZCA9PT0gaWQgJiYgbWlkZGxlSm9iLnByZSkge1xuICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSBtaWRkbGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGFydDtcbn1cbmZ1bmN0aW9uIHF1ZXVlSm9iKGpvYikge1xuICBpZiAoIXF1ZXVlLmxlbmd0aCB8fCAhcXVldWUuaW5jbHVkZXMoXG4gICAgam9iLFxuICAgIGlzRmx1c2hpbmcgJiYgam9iLmFsbG93UmVjdXJzZSA/IGZsdXNoSW5kZXggKyAxIDogZmx1c2hJbmRleFxuICApKSB7XG4gICAgaWYgKGpvYi5pZCA9PSBudWxsKSB7XG4gICAgICBxdWV1ZS5wdXNoKGpvYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnNwbGljZShmaW5kSW5zZXJ0aW9uSW5kZXgoam9iLmlkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgaXNGbHVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSByZXNvbHZlZFByb21pc2UudGhlbihmbHVzaEpvYnMpO1xuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlSm9iKGpvYikge1xuICBjb25zdCBpID0gcXVldWUuaW5kZXhPZihqb2IpO1xuICBpZiAoaSA+IGZsdXNoSW5kZXgpIHtcbiAgICBxdWV1ZS5zcGxpY2UoaSwgMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHF1ZXVlUG9zdEZsdXNoQ2IoY2IpIHtcbiAgaWYgKCFpc0FycmF5KGNiKSkge1xuICAgIGlmICghYWN0aXZlUG9zdEZsdXNoQ2JzIHx8ICFhY3RpdmVQb3N0Rmx1c2hDYnMuaW5jbHVkZXMoXG4gICAgICBjYixcbiAgICAgIGNiLmFsbG93UmVjdXJzZSA/IHBvc3RGbHVzaEluZGV4ICsgMSA6IHBvc3RGbHVzaEluZGV4XG4gICAgKSkge1xuICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKC4uLmNiKTtcbiAgfVxuICBxdWV1ZUZsdXNoKCk7XG59XG5mdW5jdGlvbiBmbHVzaFByZUZsdXNoQ2JzKHNlZW4sIGkgPSBpc0ZsdXNoaW5nID8gZmx1c2hJbmRleCArIDEgOiAwKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2IgPSBxdWV1ZVtpXTtcbiAgICBpZiAoY2IgJiYgY2IucHJlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgY2IpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICAgICAgaS0tO1xuICAgICAgY2IoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pIHtcbiAgaWYgKHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgY29uc3QgZGVkdXBlZCA9IFsuLi5uZXcgU2V0KHBlbmRpbmdQb3N0Rmx1c2hDYnMpXTtcbiAgICBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCA9IDA7XG4gICAgaWYgKGFjdGl2ZVBvc3RGbHVzaENicykge1xuICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzLnB1c2goLi4uZGVkdXBlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IGRlZHVwZWQ7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicy5zb3J0KChhLCBiKSA9PiBnZXRJZChhKSAtIGdldElkKGIpKTtcbiAgICBmb3IgKHBvc3RGbHVzaEluZGV4ID0gMDsgcG9zdEZsdXNoSW5kZXggPCBhY3RpdmVQb3N0Rmx1c2hDYnMubGVuZ3RoOyBwb3N0Rmx1c2hJbmRleCsrKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgYWN0aXZlUG9zdEZsdXNoQ2JzW3Bvc3RGbHVzaEluZGV4XSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY3RpdmVQb3N0Rmx1c2hDYnNbcG9zdEZsdXNoSW5kZXhdKCk7XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IG51bGw7XG4gICAgcG9zdEZsdXNoSW5kZXggPSAwO1xuICB9XG59XG5jb25zdCBnZXRJZCA9IChqb2IpID0+IGpvYi5pZCA9PSBudWxsID8gSW5maW5pdHkgOiBqb2IuaWQ7XG5jb25zdCBjb21wYXJhdG9yID0gKGEsIGIpID0+IHtcbiAgY29uc3QgZGlmZiA9IGdldElkKGEpIC0gZ2V0SWQoYik7XG4gIGlmIChkaWZmID09PSAwKSB7XG4gICAgaWYgKGEucHJlICYmICFiLnByZSlcbiAgICAgIHJldHVybiAtMTtcbiAgICBpZiAoYi5wcmUgJiYgIWEucHJlKVxuICAgICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIGRpZmY7XG59O1xuZnVuY3Rpb24gZmx1c2hKb2JzKHNlZW4pIHtcbiAgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTtcbiAgaXNGbHVzaGluZyA9IHRydWU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBxdWV1ZS5zb3J0KGNvbXBhcmF0b3IpO1xuICBjb25zdCBjaGVjayA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoam9iKSA9PiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2Vlbiwgam9iKSA6IE5PT1A7XG4gIHRyeSB7XG4gICAgZm9yIChmbHVzaEluZGV4ID0gMDsgZmx1c2hJbmRleCA8IHF1ZXVlLmxlbmd0aDsgZmx1c2hJbmRleCsrKSB7XG4gICAgICBjb25zdCBqb2IgPSBxdWV1ZVtmbHVzaEluZGV4XTtcbiAgICAgIGlmIChqb2IgJiYgam9iLmFjdGl2ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2soam9iKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhqb2IsIG51bGwsIDE0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hJbmRleCA9IDA7XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBmbHVzaFBvc3RGbHVzaENicyhzZWVuKTtcbiAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgY3VycmVudEZsdXNoUHJvbWlzZSA9IG51bGw7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCB8fCBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCkge1xuICAgICAgZmx1c2hKb2JzKHNlZW4pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGZuKSB7XG4gIGlmICghc2Vlbi5oYXMoZm4pKSB7XG4gICAgc2Vlbi5zZXQoZm4sIDEpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvdW50ID0gc2Vlbi5nZXQoZm4pO1xuICAgIGlmIChjb3VudCA+IFJFQ1VSU0lPTl9MSU1JVCkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBmbi5vd25lckluc3RhbmNlO1xuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGluc3RhbmNlICYmIGdldENvbXBvbmVudE5hbWUoaW5zdGFuY2UudHlwZSk7XG4gICAgICB3YXJuKFxuICAgICAgICBgTWF4aW11bSByZWN1cnNpdmUgdXBkYXRlcyBleGNlZWRlZCR7Y29tcG9uZW50TmFtZSA/IGAgaW4gY29tcG9uZW50IDwke2NvbXBvbmVudE5hbWV9PmAgOiBgYH0uIFRoaXMgbWVhbnMgeW91IGhhdmUgYSByZWFjdGl2ZSBlZmZlY3QgdGhhdCBpcyBtdXRhdGluZyBpdHMgb3duIGRlcGVuZGVuY2llcyBhbmQgdGh1cyByZWN1cnNpdmVseSB0cmlnZ2VyaW5nIGl0c2VsZi4gUG9zc2libGUgc291cmNlcyBpbmNsdWRlIGNvbXBvbmVudCB0ZW1wbGF0ZSwgcmVuZGVyIGZ1bmN0aW9uLCB1cGRhdGVkIGhvb2sgb3Igd2F0Y2hlciBzb3VyY2UgZnVuY3Rpb24uYFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWVuLnNldChmbiwgY291bnQgKyAxKTtcbiAgICB9XG4gIH1cbn1cblxubGV0IGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbmNvbnN0IGhtckRpcnR5Q29tcG9uZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfSE1SX1JVTlRJTUVfXyA9IHtcbiAgICBjcmVhdGVSZWNvcmQ6IHRyeVdyYXAoY3JlYXRlUmVjb3JkKSxcbiAgICByZXJlbmRlcjogdHJ5V3JhcChyZXJlbmRlciksXG4gICAgcmVsb2FkOiB0cnlXcmFwKHJlbG9hZClcbiAgfTtcbn1cbmNvbnN0IG1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5mdW5jdGlvbiByZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBjb25zdCBpZCA9IGluc3RhbmNlLnR5cGUuX19obXJJZDtcbiAgbGV0IHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICBpZiAoIXJlY29yZCkge1xuICAgIGNyZWF0ZVJlY29yZChpZCwgaW5zdGFuY2UudHlwZSk7XG4gICAgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIH1cbiAgcmVjb3JkLmluc3RhbmNlcy5hZGQoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gdW5yZWdpc3RlckhNUihpbnN0YW5jZSkge1xuICBtYXAuZ2V0KGluc3RhbmNlLnR5cGUuX19obXJJZCkuaW5zdGFuY2VzLmRlbGV0ZShpbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWNvcmQoaWQsIGluaXRpYWxEZWYpIHtcbiAgaWYgKG1hcC5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1hcC5zZXQoaWQsIHtcbiAgICBpbml0aWFsRGVmOiBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbml0aWFsRGVmKSxcbiAgICBpbnN0YW5jZXM6IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KClcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkgPyBjb21wb25lbnQuX192Y2NPcHRzIDogY29tcG9uZW50O1xufVxuZnVuY3Rpb24gcmVyZW5kZXIoaWQsIG5ld1JlbmRlcikge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVjb3JkLmluaXRpYWxEZWYucmVuZGVyID0gbmV3UmVuZGVyO1xuICBbLi4ucmVjb3JkLmluc3RhbmNlc10uZm9yRWFjaCgoaW5zdGFuY2UpID0+IHtcbiAgICBpZiAobmV3UmVuZGVyKSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgICBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKS5yZW5kZXIgPSBuZXdSZW5kZXI7XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlckNhY2hlID0gW107XG4gICAgaXNIbXJVcGRhdGluZyA9IHRydWU7XG4gICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbG9hZChpZCwgbmV3Q29tcCkge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpXG4gICAgcmV0dXJuO1xuICBuZXdDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQobmV3Q29tcCk7XG4gIHVwZGF0ZUNvbXBvbmVudERlZihyZWNvcmQuaW5pdGlhbERlZiwgbmV3Q29tcCk7XG4gIGNvbnN0IGluc3RhbmNlcyA9IFsuLi5yZWNvcmQuaW5zdGFuY2VzXTtcbiAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcbiAgICBjb25zdCBvbGRDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSk7XG4gICAgaWYgKCFobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG9sZENvbXApKSB7XG4gICAgICBpZiAob2xkQ29tcCAhPT0gcmVjb3JkLmluaXRpYWxEZWYpIHtcbiAgICAgICAgdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApO1xuICAgICAgfVxuICAgICAgaG1yRGlydHlDb21wb25lbnRzLmFkZChvbGRDb21wKTtcbiAgICB9XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5wcm9wc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LmVtaXRzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoaW5zdGFuY2UuY2VSZWxvYWQpIHtcbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5hZGQob2xkQ29tcCk7XG4gICAgICBpbnN0YW5jZS5jZVJlbG9hZChuZXdDb21wLnN0eWxlcyk7XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuZGVsZXRlKG9sZENvbXApO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBxdWV1ZUpvYihpbnN0YW5jZS5wYXJlbnQudXBkYXRlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKSB7XG4gICAgICBpbnN0YW5jZS5hcHBDb250ZXh0LnJlbG9hZCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0hNUl0gUm9vdCBvciBtYW51YWxseSBtb3VudGVkIGluc3RhbmNlIG1vZGlmaWVkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcXVldWVQb3N0Rmx1c2hDYigoKSA9PiB7XG4gICAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5kZWxldGUoXG4gICAgICAgIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGluc3RhbmNlLnR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb21wb25lbnREZWYob2xkQ29tcCwgbmV3Q29tcCkge1xuICBleHRlbmQob2xkQ29tcCwgbmV3Q29tcCk7XG4gIGZvciAoY29uc3Qga2V5IGluIG9sZENvbXApIHtcbiAgICBpZiAoa2V5ICE9PSBcIl9fZmlsZVwiICYmICEoa2V5IGluIG5ld0NvbXApKSB7XG4gICAgICBkZWxldGUgb2xkQ29tcFtrZXldO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJ5V3JhcChmbikge1xuICByZXR1cm4gKGlkLCBhcmcpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGZuKGlkLCBhcmcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbSE1SXSBTb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgVnVlIGNvbXBvbmVudCBob3QtcmVsb2FkLiBGdWxsIHJlbG9hZCByZXF1aXJlZC5gXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxubGV0IGRldnRvb2xzO1xubGV0IGJ1ZmZlciA9IFtdO1xubGV0IGRldnRvb2xzTm90SW5zdGFsbGVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbWl0JDEoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgaWYgKGRldnRvb2xzKSB7XG4gICAgZGV2dG9vbHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH0gZWxzZSBpZiAoIWRldnRvb2xzTm90SW5zdGFsbGVkKSB7XG4gICAgYnVmZmVyLnB1c2goeyBldmVudCwgYXJncyB9KTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RGV2dG9vbHNIb29rKGhvb2ssIHRhcmdldCkge1xuICB2YXIgX2EsIF9iO1xuICBkZXZ0b29scyA9IGhvb2s7XG4gIGlmIChkZXZ0b29scykge1xuICAgIGRldnRvb2xzLmVuYWJsZWQgPSB0cnVlO1xuICAgIGJ1ZmZlci5mb3JFYWNoKCh7IGV2ZW50LCBhcmdzIH0pID0+IGRldnRvb2xzLmVtaXQoZXZlbnQsIC4uLmFyZ3MpKTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfSBlbHNlIGlmIChcbiAgICAvLyBoYW5kbGUgbGF0ZSBkZXZ0b29scyBpbmplY3Rpb24gLSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGluIGFuIGFjdHVhbFxuICAgIC8vIGJyb3dzZXIgZW52aXJvbm1lbnQgdG8gYXZvaWQgdGhlIHRpbWVyIGhhbmRsZSBzdGFsbGluZyB0ZXN0IHJ1bm5lciBleGl0XG4gICAgLy8gKCM0ODE1KVxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgLy8gc29tZSBlbnZzIG1vY2sgd2luZG93IGJ1dCBub3QgZnVsbHlcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgJiYgLy8gYWxzbyBleGNsdWRlIGpzZG9tXG4gICAgISgoX2IgPSAoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PSBudWxsID8gdm9pZCAwIDogX2EudXNlckFnZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoXCJqc2RvbVwiKSlcbiAgKSB7XG4gICAgY29uc3QgcmVwbGF5ID0gdGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX18gPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyB8fCBbXTtcbiAgICByZXBsYXkucHVzaCgobmV3SG9vaykgPT4ge1xuICAgICAgc2V0RGV2dG9vbHNIb29rKG5ld0hvb2ssIHRhcmdldCk7XG4gICAgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIWRldnRvb2xzKSB7XG4gICAgICAgIHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fID0gbnVsbDtcbiAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9LCAzZTMpO1xuICB9IGVsc2Uge1xuICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbikge1xuICBlbWl0JDEoXCJhcHA6aW5pdFwiIC8qIEFQUF9JTklUICovLCBhcHAsIHZlcnNpb24sIHtcbiAgICBGcmFnbWVudCxcbiAgICBUZXh0LFxuICAgIENvbW1lbnQsXG4gICAgU3RhdGljXG4gIH0pO1xufVxuZnVuY3Rpb24gZGV2dG9vbHNVbm1vdW50QXBwKGFwcCkge1xuICBlbWl0JDEoXCJhcHA6dW5tb3VudFwiIC8qIEFQUF9VTk1PVU5UICovLCBhcHApO1xufVxuY29uc3QgZGV2dG9vbHNDb21wb25lbnRBZGRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OmFkZGVkXCIgLyogQ09NUE9ORU5UX0FEREVEICovXG4pO1xuY29uc3QgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayhcImNvbXBvbmVudDp1cGRhdGVkXCIgLyogQ09NUE9ORU5UX1VQREFURUQgKi8pO1xuY29uc3QgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OnJlbW92ZWRcIiAvKiBDT01QT05FTlRfUkVNT1ZFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IChjb21wb25lbnQpID0+IHtcbiAgaWYgKGRldnRvb2xzICYmIHR5cGVvZiBkZXZ0b29scy5jbGVhbnVwQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgLy8gcmVtb3ZlIHRoZSBjb21wb25lbnQgaWYgaXQgd2Fzbid0IGJ1ZmZlcmVkXG4gICFkZXZ0b29scy5jbGVhbnVwQnVmZmVyKGNvbXBvbmVudCkpIHtcbiAgICBfZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGNvbXBvbmVudCk7XG4gIH1cbn07XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soaG9vaykge1xuICByZXR1cm4gKGNvbXBvbmVudCkgPT4ge1xuICAgIGVtaXQkMShcbiAgICAgIGhvb2ssXG4gICAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgICBjb21wb25lbnQudWlkLFxuICAgICAgY29tcG9uZW50LnBhcmVudCA/IGNvbXBvbmVudC5wYXJlbnQudWlkIDogdm9pZCAwLFxuICAgICAgY29tcG9uZW50XG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IGRldnRvb2xzUGVyZlN0YXJ0ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKFxuICBcInBlcmY6c3RhcnRcIiAvKiBQRVJGT1JNQU5DRV9TVEFSVCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzUGVyZkVuZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcbiAgXCJwZXJmOmVuZFwiIC8qIFBFUkZPUk1BTkNFX0VORCAqL1xuKTtcbmZ1bmN0aW9uIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQsIHR5cGUsIHRpbWUpID0+IHtcbiAgICBlbWl0JDEoaG9vaywgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLCBjb21wb25lbnQudWlkLCBjb21wb25lbnQsIHR5cGUsIHRpbWUpO1xuICB9O1xufVxuZnVuY3Rpb24gZGV2dG9vbHNDb21wb25lbnRFbWl0KGNvbXBvbmVudCwgZXZlbnQsIHBhcmFtcykge1xuICBlbWl0JDEoXG4gICAgXCJjb21wb25lbnQ6ZW1pdFwiIC8qIENPTVBPTkVOVF9FTUlUICovLFxuICAgIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCxcbiAgICBjb21wb25lbnQsXG4gICAgZXZlbnQsXG4gICAgcGFyYW1zXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVtaXQoaW5zdGFuY2UsIGV2ZW50LCAuLi5yYXdBcmdzKSB7XG4gIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZClcbiAgICByZXR1cm47XG4gIGNvbnN0IHByb3BzID0gaW5zdGFuY2Uudm5vZGUucHJvcHMgfHwgRU1QVFlfT0JKO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVtaXRzT3B0aW9ucyxcbiAgICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc11cbiAgICB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGVtaXRzT3B0aW9ucykge1xuICAgICAgaWYgKCEoZXZlbnQgaW4gZW1pdHNPcHRpb25zKSAmJiB0cnVlKSB7XG4gICAgICAgIGlmICghcHJvcHNPcHRpb25zIHx8ICEodG9IYW5kbGVyS2V5KGV2ZW50KSBpbiBwcm9wc09wdGlvbnMpKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBDb21wb25lbnQgZW1pdHRlZCBldmVudCBcIiR7ZXZlbnR9XCIgYnV0IGl0IGlzIG5laXRoZXIgZGVjbGFyZWQgaW4gdGhlIGVtaXRzIG9wdGlvbiBub3IgYXMgYW4gXCIke3RvSGFuZGxlcktleShldmVudCl9XCIgcHJvcC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gZW1pdHNPcHRpb25zW2V2ZW50XTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdG9yKSkge1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0b3IoLi4ucmF3QXJncyk7XG4gICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBgSW52YWxpZCBldmVudCBhcmd1bWVudHM6IGV2ZW50IHZhbGlkYXRpb24gZmFpbGVkIGZvciBldmVudCBcIiR7ZXZlbnR9XCIuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IGFyZ3MgPSByYXdBcmdzO1xuICBjb25zdCBpc01vZGVsTGlzdGVuZXIgPSBldmVudC5zdGFydHNXaXRoKFwidXBkYXRlOlwiKTtcbiAgY29uc3QgbW9kZWxBcmcgPSBpc01vZGVsTGlzdGVuZXIgJiYgZXZlbnQuc2xpY2UoNyk7XG4gIGlmIChtb2RlbEFyZyAmJiBtb2RlbEFyZyBpbiBwcm9wcykge1xuICAgIGNvbnN0IG1vZGlmaWVyc0tleSA9IGAke21vZGVsQXJnID09PSBcIm1vZGVsVmFsdWVcIiA/IFwibW9kZWxcIiA6IG1vZGVsQXJnfU1vZGlmaWVyc2A7XG4gICAgY29uc3QgeyBudW1iZXIsIHRyaW0gfSA9IHByb3BzW21vZGlmaWVyc0tleV0gfHwgRU1QVFlfT0JKO1xuICAgIGlmICh0cmltKSB7XG4gICAgICBhcmdzID0gcmF3QXJncy5tYXAoKGEpID0+IGlzU3RyaW5nKGEpID8gYS50cmltKCkgOiBhKTtcbiAgICB9XG4gICAgaWYgKG51bWJlcikge1xuICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKGxvb3NlVG9OdW1iZXIpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBkZXZ0b29sc0NvbXBvbmVudEVtaXQoaW5zdGFuY2UsIGV2ZW50LCBhcmdzKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHByb3BzW3RvSGFuZGxlcktleShsb3dlckNhc2VFdmVudCldKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRXZlbnQgXCIke2xvd2VyQ2FzZUV2ZW50fVwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50ICR7Zm9ybWF0Q29tcG9uZW50TmFtZShcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBpbnN0YW5jZS50eXBlXG4gICAgICAgICl9IGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciBcIiR7ZXZlbnR9XCIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcIiR7aHlwaGVuYXRlKGV2ZW50KX1cIiBpbnN0ZWFkIG9mIFwiJHtldmVudH1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBsZXQgaGFuZGxlck5hbWU7XG4gIGxldCBoYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoZXZlbnQpXSB8fCAvLyBhbHNvIHRyeSBjYW1lbENhc2UgZXZlbnQgaGFuZGxlciAoIzIyNDkpXG4gIHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGNhbWVsaXplKGV2ZW50KSldO1xuICBpZiAoIWhhbmRsZXIgJiYgaXNNb2RlbExpc3RlbmVyKSB7XG4gICAgaGFuZGxlciA9IHByb3BzW2hhbmRsZXJOYW1lID0gdG9IYW5kbGVyS2V5KGh5cGhlbmF0ZShldmVudCkpXTtcbiAgfVxuICBpZiAoaGFuZGxlcikge1xuICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgaGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNixcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9XG4gIGNvbnN0IG9uY2VIYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgKyBgT25jZWBdO1xuICBpZiAob25jZUhhbmRsZXIpIHtcbiAgICBpZiAoIWluc3RhbmNlLmVtaXR0ZWQpIHtcbiAgICAgIGluc3RhbmNlLmVtaXR0ZWQgPSB7fTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RhbmNlLmVtaXR0ZWRbaGFuZGxlck5hbWVdID0gdHJ1ZTtcbiAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgIG9uY2VIYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA2LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyhjb21wLCBhcHBDb250ZXh0LCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgY2FjaGUgPSBhcHBDb250ZXh0LmVtaXRzQ2FjaGU7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChjb21wKTtcbiAgaWYgKGNhY2hlZCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLmVtaXRzO1xuICBsZXQgbm9ybWFsaXplZCA9IHt9O1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZEVtaXRzID0gKHJhdzIpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGcm9tRXh0ZW5kID0gbm9ybWFsaXplRW1pdHNPcHRpb25zKHJhdzIsIGFwcENvbnRleHQsIHRydWUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGcm9tRXh0ZW5kKSB7XG4gICAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgICBleHRlbmQobm9ybWFsaXplZCwgbm9ybWFsaXplZEZyb21FeHRlbmQpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKCFhc01peGluICYmIGFwcENvbnRleHQubWl4aW5zLmxlbmd0aCkge1xuICAgICAgYXBwQ29udGV4dC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICAgIGlmIChjb21wLmV4dGVuZHMpIHtcbiAgICAgIGV4dGVuZEVtaXRzKGNvbXAuZXh0ZW5kcyk7XG4gICAgfVxuICAgIGlmIChjb21wLm1peGlucykge1xuICAgICAgY29tcC5taXhpbnMuZm9yRWFjaChleHRlbmRFbWl0cyk7XG4gICAgfVxuICB9XG4gIGlmICghcmF3ICYmICFoYXNFeHRlbmRzKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgICBjYWNoZS5zZXQoY29tcCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICByYXcuZm9yRWFjaCgoa2V5KSA9PiBub3JtYWxpemVkW2tleV0gPSBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBleHRlbmQobm9ybWFsaXplZCwgcmF3KTtcbiAgfVxuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgbm9ybWFsaXplZCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5mdW5jdGlvbiBpc0VtaXRMaXN0ZW5lcihvcHRpb25zLCBrZXkpIHtcbiAgaWYgKCFvcHRpb25zIHx8ICFpc09uKGtleSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAga2V5ID0ga2V5LnNsaWNlKDIpLnJlcGxhY2UoL09uY2UkLywgXCJcIik7XG4gIHJldHVybiBoYXNPd24ob3B0aW9ucywga2V5WzBdLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSkpIHx8IGhhc093bihvcHRpb25zLCBoeXBoZW5hdGUoa2V5KSkgfHwgaGFzT3duKG9wdGlvbnMsIGtleSk7XG59XG5cbmxldCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xubGV0IGN1cnJlbnRTY29wZUlkID0gbnVsbDtcbmZ1bmN0aW9uIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShpbnN0YW5jZSkge1xuICBjb25zdCBwcmV2ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgY3VycmVudFNjb3BlSWQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS50eXBlLl9fc2NvcGVJZCB8fCBudWxsO1xuICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIHB1c2hTY29wZUlkKGlkKSB7XG4gIGN1cnJlbnRTY29wZUlkID0gaWQ7XG59XG5mdW5jdGlvbiBwb3BTY29wZUlkKCkge1xuICBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG59XG5jb25zdCB3aXRoU2NvcGVJZCA9IChfaWQpID0+IHdpdGhDdHg7XG5mdW5jdGlvbiB3aXRoQ3R4KGZuLCBjdHggPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsIGlzTm9uU2NvcGVkU2xvdCkge1xuICBpZiAoIWN0eClcbiAgICByZXR1cm4gZm47XG4gIGlmIChmbi5fbikge1xuICAgIHJldHVybiBmbjtcbiAgfVxuICBjb25zdCByZW5kZXJGbldpdGhDb250ZXh0ID0gKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAocmVuZGVyRm5XaXRoQ29udGV4dC5fZCkge1xuICAgICAgc2V0QmxvY2tUcmFja2luZygtMSk7XG4gICAgfVxuICAgIGNvbnN0IHByZXZJbnN0YW5jZSA9IHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShjdHgpO1xuICAgIGxldCByZXM7XG4gICAgdHJ5IHtcbiAgICAgIHJlcyA9IGZuKC4uLmFyZ3MpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UocHJldkluc3RhbmNlKTtcbiAgICAgIGlmIChyZW5kZXJGbldpdGhDb250ZXh0Ll9kKSB7XG4gICAgICAgIHNldEJsb2NrVHJhY2tpbmcoMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGN0eCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX24gPSB0cnVlO1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9jID0gdHJ1ZTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fZCA9IHRydWU7XG4gIHJldHVybiByZW5kZXJGbldpdGhDb250ZXh0O1xufVxuXG5sZXQgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuZnVuY3Rpb24gbWFya0F0dHJzQWNjZXNzZWQoKSB7XG4gIGFjY2Vzc2VkQXR0cnMgPSB0cnVlO1xufVxuZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgdHlwZTogQ29tcG9uZW50LFxuICAgIHZub2RlLFxuICAgIHByb3h5LFxuICAgIHdpdGhQcm94eSxcbiAgICBwcm9wcyxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdLFxuICAgIHNsb3RzLFxuICAgIGF0dHJzLFxuICAgIGVtaXQsXG4gICAgcmVuZGVyLFxuICAgIHJlbmRlckNhY2hlLFxuICAgIGRhdGEsXG4gICAgc2V0dXBTdGF0ZSxcbiAgICBjdHgsXG4gICAgaW5oZXJpdEF0dHJzXG4gIH0gPSBpbnN0YW5jZTtcbiAgbGV0IHJlc3VsdDtcbiAgbGV0IGZhbGx0aHJvdWdoQXR0cnM7XG4gIGNvbnN0IHByZXYgPSBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFjY2Vzc2VkQXR0cnMgPSBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA0KSB7XG4gICAgICBjb25zdCBwcm94eVRvVXNlID0gd2l0aFByb3h5IHx8IHByb3h5O1xuICAgICAgY29uc3QgdGhpc1Byb3h5ID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCA/IG5ldyBQcm94eShwcm94eVRvVXNlLCB7XG4gICAgICAgIGdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYFByb3BlcnR5ICcke1N0cmluZyhcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApfScgd2FzIGFjY2Vzc2VkIHZpYSAndGhpcycuIEF2b2lkIHVzaW5nICd0aGlzJyBpbiB0ZW1wbGF0ZXMuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG4gICAgICAgIH1cbiAgICAgIH0pIDogcHJveHlUb1VzZTtcbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIuY2FsbChcbiAgICAgICAgICB0aGlzUHJveHksXG4gICAgICAgICAgcHJveHlUb1VzZSxcbiAgICAgICAgICByZW5kZXJDYWNoZSxcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBzZXR1cFN0YXRlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY3R4XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlbmRlcjIgPSBDb21wb25lbnQ7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBhdHRycyA9PT0gcHJvcHMpIHtcbiAgICAgICAgbWFya0F0dHJzQWNjZXNzZWQoKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIyLmxlbmd0aCA+IDEgPyByZW5kZXIyKFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgICAgICAgIHJldHVybiBhdHRycztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbG90cyxcbiAgICAgICAgICAgIGVtaXRcbiAgICAgICAgICB9IDogeyBhdHRycywgc2xvdHMsIGVtaXQgfVxuICAgICAgICApIDogcmVuZGVyMihcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBudWxsXG4gICAgICAgICAgLyogd2Uga25vdyBpdCBkb2Vzbid0IG5lZWQgaXQgKi9cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBDb21wb25lbnQucHJvcHMgPyBhdHRycyA6IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaChhdHRycyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBibG9ja1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgMSk7XG4gICAgcmVzdWx0ID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gIH1cbiAgbGV0IHJvb3QgPSByZXN1bHQ7XG4gIGxldCBzZXRSb290ID0gdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByZXN1bHQucGF0Y2hGbGFnID4gMCAmJiByZXN1bHQucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIFtyb290LCBzZXRSb290XSA9IGdldENoaWxkUm9vdChyZXN1bHQpO1xuICB9XG4gIGlmIChmYWxsdGhyb3VnaEF0dHJzICYmIGluaGVyaXRBdHRycyAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmFsbHRocm91Z2hBdHRycyk7XG4gICAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHJvb3Q7XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2KSkge1xuICAgICAgICBpZiAocHJvcHNPcHRpb25zICYmIGtleXMuc29tZShpc01vZGVsTGlzdGVuZXIpKSB7XG4gICAgICAgICAgZmFsbHRocm91Z2hBdHRycyA9IGZpbHRlck1vZGVsTGlzdGVuZXJzKFxuICAgICAgICAgICAgZmFsbHRocm91Z2hBdHRycyxcbiAgICAgICAgICAgIHByb3BzT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdCA9IGNsb25lVk5vZGUocm9vdCwgZmFsbHRocm91Z2hBdHRycyk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWFjY2Vzc2VkQXR0cnMgJiYgcm9vdC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIGNvbnN0IGFsbEF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpO1xuICAgICAgICBjb25zdCBldmVudEF0dHJzID0gW107XG4gICAgICAgIGNvbnN0IGV4dHJhQXR0cnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBhbGxBdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBhbGxBdHRyc1tpXTtcbiAgICAgICAgICBpZiAoaXNPbihrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICAgICAgICAgIGV2ZW50QXR0cnMucHVzaChrZXlbMl0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV4dHJhQXR0cnMucHVzaChrZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmFBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLXByb3BzIGF0dHJpYnV0ZXMgKCR7ZXh0cmFBdHRycy5qb2luKFwiLCBcIil9KSB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLWVtaXRzIGV2ZW50IGxpc3RlbmVycyAoJHtldmVudEF0dHJzLmpvaW4oXCIsIFwiKX0pIHdlcmUgcGFzc2VkIHRvIGNvbXBvbmVudCBidXQgY291bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgaW5oZXJpdGVkIGJlY2F1c2UgY29tcG9uZW50IHJlbmRlcnMgZnJhZ21lbnQgb3IgdGV4dCByb290IG5vZGVzLiBJZiB0aGUgbGlzdGVuZXIgaXMgaW50ZW5kZWQgdG8gYmUgYSBjb21wb25lbnQgY3VzdG9tIGV2ZW50IGxpc3RlbmVyIG9ubHksIGRlY2xhcmUgaXQgdXNpbmcgdGhlIFwiZW1pdHNcIiBvcHRpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNFbGVtZW50Um9vdChyb290KSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFJ1bnRpbWUgZGlyZWN0aXZlIHVzZWQgb24gY29tcG9uZW50IHdpdGggbm9uLWVsZW1lbnQgcm9vdCBub2RlLiBUaGUgZGlyZWN0aXZlcyB3aWxsIG5vdCBmdW5jdGlvbiBhcyBpbnRlbmRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByb290ID0gY2xvbmVWTm9kZShyb290KTtcbiAgICByb290LmRpcnMgPSByb290LmRpcnMgPyByb290LmRpcnMuY29uY2F0KHZub2RlLmRpcnMpIDogdm5vZGUuZGlycztcbiAgfVxuICBpZiAodm5vZGUudHJhbnNpdGlvbikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgQ29tcG9uZW50IGluc2lkZSA8VHJhbnNpdGlvbj4gcmVuZGVycyBub24tZWxlbWVudCByb290IG5vZGUgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdC50cmFuc2l0aW9uID0gdm5vZGUudHJhbnNpdGlvbjtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXRSb290KSB7XG4gICAgc2V0Um9vdChyb290KTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSByb290O1xuICB9XG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGdldENoaWxkUm9vdCA9ICh2bm9kZSkgPT4ge1xuICBjb25zdCByYXdDaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICBjb25zdCBkeW5hbWljQ2hpbGRyZW4gPSB2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gIGNvbnN0IGNoaWxkUm9vdCA9IGZpbHRlclNpbmdsZVJvb3QocmF3Q2hpbGRyZW4pO1xuICBpZiAoIWNoaWxkUm9vdCkge1xuICAgIHJldHVybiBbdm5vZGUsIHZvaWQgMF07XG4gIH1cbiAgY29uc3QgaW5kZXggPSByYXdDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCk7XG4gIGNvbnN0IGR5bmFtaWNJbmRleCA9IGR5bmFtaWNDaGlsZHJlbiA/IGR5bmFtaWNDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCkgOiAtMTtcbiAgY29uc3Qgc2V0Um9vdCA9ICh1cGRhdGVkUm9vdCkgPT4ge1xuICAgIHJhd0NoaWxkcmVuW2luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIGlmIChkeW5hbWljSW5kZXggPiAtMSkge1xuICAgICAgICBkeW5hbWljQ2hpbGRyZW5bZHluYW1pY0luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgICAgfSBlbHNlIGlmICh1cGRhdGVkUm9vdC5wYXRjaEZsYWcgPiAwKSB7XG4gICAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IFsuLi5keW5hbWljQ2hpbGRyZW4sIHVwZGF0ZWRSb290XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBbbm9ybWFsaXplVk5vZGUoY2hpbGRSb290KSwgc2V0Um9vdF07XG59O1xuZnVuY3Rpb24gZmlsdGVyU2luZ2xlUm9vdChjaGlsZHJlbikge1xuICBsZXQgc2luZ2xlUm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gQ29tbWVudCB8fCBjaGlsZC5jaGlsZHJlbiA9PT0gXCJ2LWlmXCIpIHtcbiAgICAgICAgaWYgKHNpbmdsZVJvb3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2luZ2xlUm9vdCA9IGNoaWxkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpbmdsZVJvb3Q7XG59XG5jb25zdCBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2ggPSAoYXR0cnMpID0+IHtcbiAgbGV0IHJlcztcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIgfHwga2V5ID09PSBcInN0eWxlXCIgfHwgaXNPbihrZXkpKSB7XG4gICAgICAocmVzIHx8IChyZXMgPSB7fSkpW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGZpbHRlck1vZGVsTGlzdGVuZXJzID0gKGF0dHJzLCBwcm9wcykgPT4ge1xuICBjb25zdCByZXMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpIHx8ICEoa2V5LnNsaWNlKDkpIGluIHByb3BzKSkge1xuICAgICAgcmVzW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGlzRWxlbWVudFJvb3QgPSAodm5vZGUpID0+IHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmICg2IHwgMSkgfHwgdm5vZGUudHlwZSA9PT0gQ29tbWVudDtcbn07XG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldlZOb2RlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkge1xuICBjb25zdCB7IHByb3BzOiBwcmV2UHJvcHMsIGNoaWxkcmVuOiBwcmV2Q2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcHJldlZOb2RlO1xuICBjb25zdCB7IHByb3BzOiBuZXh0UHJvcHMsIGNoaWxkcmVuOiBuZXh0Q2hpbGRyZW4sIHBhdGNoRmxhZyB9ID0gbmV4dFZOb2RlO1xuICBjb25zdCBlbWl0cyA9IGNvbXBvbmVudC5lbWl0c09wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG5leHRWTm9kZS5kaXJzIHx8IG5leHRWTm9kZS50cmFuc2l0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG9wdGltaXplZCAmJiBwYXRjaEZsYWcgPj0gMCkge1xuICAgIGlmIChwYXRjaEZsYWcgJiAxMDI0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0cyk7XG4gICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICBjb25zdCBkeW5hbWljUHJvcHMgPSBuZXh0Vk5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZHluYW1pY1Byb3BzW2ldO1xuICAgICAgICBpZiAobmV4dFByb3BzW2tleV0gIT09IHByZXZQcm9wc1trZXldICYmICFpc0VtaXRMaXN0ZW5lcihlbWl0cywga2V5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiB8fCAhbmV4dENoaWxkcmVuLiRzdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2UHJvcHMgPT09IG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgIH1cbiAgICBpZiAoIW5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzT3B0aW9ucykge1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIGlmIChuZXh0S2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHByZXZQcm9wcykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IG5leHRLZXlzW2ldO1xuICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhPQ0hvc3RFbCh7IHZub2RlLCBwYXJlbnQgfSwgZWwpIHtcbiAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuc3ViVHJlZSA9PT0gdm5vZGUpIHtcbiAgICAodm5vZGUgPSBwYXJlbnQudm5vZGUpLmVsID0gZWw7XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgfVxufVxuXG5jb25zdCBDT01QT05FTlRTID0gXCJjb21wb25lbnRzXCI7XG5jb25zdCBESVJFQ1RJVkVTID0gXCJkaXJlY3RpdmVzXCI7XG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50KG5hbWUsIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIG5hbWUsIHRydWUsIG1heWJlU2VsZlJlZmVyZW5jZSkgfHwgbmFtZTtcbn1cbmNvbnN0IE5VTExfRFlOQU1JQ19DT01QT05FTlQgPSBTeW1ib2wuZm9yKFwidi1uZGNcIik7XG5mdW5jdGlvbiByZXNvbHZlRHluYW1pY0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbXBvbmVudCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUFzc2V0KENPTVBPTkVOVFMsIGNvbXBvbmVudCwgZmFsc2UpIHx8IGNvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29tcG9uZW50IHx8IE5VTExfRFlOQU1JQ19DT01QT05FTlQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmUobmFtZSkge1xuICByZXR1cm4gcmVzb2x2ZUFzc2V0KERJUkVDVElWRVMsIG5hbWUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUFzc2V0KHR5cGUsIG5hbWUsIHdhcm5NaXNzaW5nID0gdHJ1ZSwgbWF5YmVTZWxmUmVmZXJlbmNlID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEluc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UpIHtcbiAgICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmICh0eXBlID09PSBDT01QT05FTlRTKSB7XG4gICAgICBjb25zdCBzZWxmTmFtZSA9IGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgZmFsc2VcbiAgICAgICAgLyogZG8gbm90IGluY2x1ZGUgaW5mZXJyZWQgbmFtZSB0byBhdm9pZCBicmVha2luZyBleGlzdGluZyBjb2RlICovXG4gICAgICApO1xuICAgICAgaWYgKHNlbGZOYW1lICYmIChzZWxmTmFtZSA9PT0gbmFtZSB8fCBzZWxmTmFtZSA9PT0gY2FtZWxpemUobmFtZSkgfHwgc2VsZk5hbWUgPT09IGNhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpKSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSAoXG4gICAgICAvLyBsb2NhbCByZWdpc3RyYXRpb25cbiAgICAgIC8vIGNoZWNrIGluc3RhbmNlW3R5cGVdIGZpcnN0IHdoaWNoIGlzIHJlc29sdmVkIGZvciBvcHRpb25zIEFQSVxuICAgICAgcmVzb2x2ZShpbnN0YW5jZVt0eXBlXSB8fCBDb21wb25lbnRbdHlwZV0sIG5hbWUpIHx8IC8vIGdsb2JhbCByZWdpc3RyYXRpb25cbiAgICAgIHJlc29sdmUoaW5zdGFuY2UuYXBwQ29udGV4dFt0eXBlXSwgbmFtZSlcbiAgICApO1xuICAgIGlmICghcmVzICYmIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykge1xuICAgICAgY29uc3QgZXh0cmEgPSB0eXBlID09PSBDT01QT05FTlRTID8gYFxuSWYgdGhpcyBpcyBhIG5hdGl2ZSBjdXN0b20gZWxlbWVudCwgbWFrZSBzdXJlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBjb21wb25lbnQgcmVzb2x1dGlvbiB2aWEgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudC5gIDogYGA7XG4gICAgICB3YXJuKGBGYWlsZWQgdG8gcmVzb2x2ZSAke3R5cGUuc2xpY2UoMCwgLTEpfTogJHtuYW1lfSR7ZXh0cmF9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oXG4gICAgICBgcmVzb2x2ZSR7Y2FwaXRhbGl6ZSh0eXBlLnNsaWNlKDAsIC0xKSl9IGNhbiBvbmx5IGJlIHVzZWQgaW4gcmVuZGVyKCkgb3Igc2V0dXAoKS5gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZShyZWdpc3RyeSwgbmFtZSkge1xuICByZXR1cm4gcmVnaXN0cnkgJiYgKHJlZ2lzdHJ5W25hbWVdIHx8IHJlZ2lzdHJ5W2NhbWVsaXplKG5hbWUpXSB8fCByZWdpc3RyeVtjYXBpdGFsaXplKGNhbWVsaXplKG5hbWUpKV0pO1xufVxuXG5jb25zdCBpc1N1c3BlbnNlID0gKHR5cGUpID0+IHR5cGUuX19pc1N1c3BlbnNlO1xuY29uc3QgU3VzcGVuc2VJbXBsID0ge1xuICBuYW1lOiBcIlN1c3BlbnNlXCIsXG4gIC8vIEluIG9yZGVyIHRvIG1ha2UgU3VzcGVuc2UgdHJlZS1zaGFrYWJsZSwgd2UgbmVlZCB0byBhdm9pZCBpbXBvcnRpbmcgaXRcbiAgLy8gZGlyZWN0bHkgaW4gdGhlIHJlbmRlcmVyLiBUaGUgcmVuZGVyZXIgY2hlY2tzIGZvciB0aGUgX19pc1N1c3BlbnNlIGZsYWdcbiAgLy8gb24gYSB2bm9kZSdzIHR5cGUgYW5kIGNhbGxzIHRoZSBgcHJvY2Vzc2AgbWV0aG9kLCBwYXNzaW5nIGluIHJlbmRlcmVyXG4gIC8vIGludGVybmFscy5cbiAgX19pc1N1c3BlbnNlOiB0cnVlLFxuICBwcm9jZXNzKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgbW91bnRTdXNwZW5zZShcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaFN1c3BlbnNlKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHNcbiAgICAgICk7XG4gICAgfVxuICB9LFxuICBoeWRyYXRlOiBoeWRyYXRlU3VzcGVuc2UsXG4gIGNyZWF0ZTogY3JlYXRlU3VzcGVuc2VCb3VuZGFyeSxcbiAgbm9ybWFsaXplOiBub3JtYWxpemVTdXNwZW5zZUNoaWxkcmVuXG59O1xuY29uc3QgU3VzcGVuc2UgPSBTdXNwZW5zZUltcGwgO1xuZnVuY3Rpb24gdHJpZ2dlckV2ZW50KHZub2RlLCBuYW1lKSB7XG4gIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wc1tuYW1lXTtcbiAgaWYgKGlzRnVuY3Rpb24oZXZlbnRMaXN0ZW5lcikpIHtcbiAgICBldmVudExpc3RlbmVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2Uodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGFuY2hvcixcbiAgICBpc1NWRyxcbiAgICBzbG90U2NvcGVJZHMsXG4gICAgb3B0aW1pemVkLFxuICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICk7XG4gIHBhdGNoKFxuICAgIG51bGwsXG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCxcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgbnVsbCxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgc3VzcGVuc2UsXG4gICAgaXNTVkcsXG4gICAgc2xvdFNjb3BlSWRzXG4gICk7XG4gIGlmIChzdXNwZW5zZS5kZXBzID4gMCkge1xuICAgIHRyaWdnZXJFdmVudCh2bm9kZSwgXCJvblBlbmRpbmdcIik7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uRmFsbGJhY2tcIik7XG4gICAgcGF0Y2goXG4gICAgICBudWxsLFxuICAgICAgdm5vZGUuc3NGYWxsYmFjayxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGFuY2hvcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIG51bGwsXG4gICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgaXNTVkcsXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgdm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHsgcDogcGF0Y2gsIHVtOiB1bm1vdW50LCBvOiB7IGNyZWF0ZUVsZW1lbnQgfSB9KSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gbjIuc3VzcGVuc2UgPSBuMS5zdXNwZW5zZTtcbiAgc3VzcGVuc2Uudm5vZGUgPSBuMjtcbiAgbjIuZWwgPSBuMS5lbDtcbiAgY29uc3QgbmV3QnJhbmNoID0gbjIuc3NDb250ZW50O1xuICBjb25zdCBuZXdGYWxsYmFjayA9IG4yLnNzRmFsbGJhY2s7XG4gIGNvbnN0IHsgYWN0aXZlQnJhbmNoLCBwZW5kaW5nQnJhbmNoLCBpc0luRmFsbGJhY2ssIGlzSHlkcmF0aW5nIH0gPSBzdXNwZW5zZTtcbiAgaWYgKHBlbmRpbmdCcmFuY2gpIHtcbiAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbmV3QnJhbmNoO1xuICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBwZW5kaW5nQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdGYWxsYmFjayxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIG5ld0ZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0lkKys7XG4gICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gcGVuZGluZ0JyYW5jaDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVubW91bnQocGVuZGluZ0JyYW5jaCwgcGFyZW50Q29tcG9uZW50LCBzdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5kZXBzID0gMDtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMubGVuZ3RoID0gMDtcbiAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBpZiAoaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgICAgICBuZXdGYWxsYmFjayxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYWN0aXZlQnJhbmNoICYmIGlzU2FtZVZOb2RlVHlwZShuZXdCcmFuY2gsIGFjdGl2ZUJyYW5jaCkpIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3QnJhbmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckV2ZW50KG4yLCBcIm9uUGVuZGluZ1wiKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nSWQrKztcbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQsIHBlbmRpbmdJZCB9ID0gc3VzcGVuc2U7XG4gICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdJZCA9PT0gcGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIHN1c3BlbnNlLmZhbGxiYWNrKG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aW1lb3V0ID09PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5sZXQgaGFzV2FybmVkID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KHZub2RlLCBwYXJlbnRTdXNwZW5zZSwgcGFyZW50Q29tcG9uZW50LCBjb250YWluZXIsIGhpZGRlbkNvbnRhaW5lciwgYW5jaG9yLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBpc0h5ZHJhdGluZyA9IGZhbHNlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUgJiYgIWhhc1dhcm5lZCkge1xuICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgY29uc29sZVtjb25zb2xlLmluZm8gPyBcImluZm9cIiA6IFwibG9nXCJdKFxuICAgICAgYDxTdXNwZW5zZT4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGl0cyBBUEkgd2lsbCBsaWtlbHkgY2hhbmdlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBtOiBtb3ZlLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG46IG5leHQsXG4gICAgbzogeyBwYXJlbnROb2RlLCByZW1vdmUgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGxldCBwYXJlbnRTdXNwZW5zZUlkO1xuICBjb25zdCBpc1N1c3BlbnNpYmxlID0gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKTtcbiAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgPT0gbnVsbCA/IHZvaWQgMCA6IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlSWQgPSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQ7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzKys7XG4gICAgfVxuICB9XG4gIGNvbnN0IHRpbWVvdXQgPSB2bm9kZS5wcm9wcyA/IHRvTnVtYmVyKHZub2RlLnByb3BzLnRpbWVvdXQpIDogdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcih0aW1lb3V0LCBgU3VzcGVuc2UgdGltZW91dGApO1xuICB9XG4gIGNvbnN0IHN1c3BlbnNlID0ge1xuICAgIHZub2RlLFxuICAgIHBhcmVudDogcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIGlzU1ZHLFxuICAgIGNvbnRhaW5lcixcbiAgICBoaWRkZW5Db250YWluZXIsXG4gICAgYW5jaG9yLFxuICAgIGRlcHM6IDAsXG4gICAgcGVuZGluZ0lkOiAwLFxuICAgIHRpbWVvdXQ6IHR5cGVvZiB0aW1lb3V0ID09PSBcIm51bWJlclwiID8gdGltZW91dCA6IC0xLFxuICAgIGFjdGl2ZUJyYW5jaDogbnVsbCxcbiAgICBwZW5kaW5nQnJhbmNoOiBudWxsLFxuICAgIGlzSW5GYWxsYmFjazogdHJ1ZSxcbiAgICBpc0h5ZHJhdGluZyxcbiAgICBpc1VubW91bnRlZDogZmFsc2UsXG4gICAgZWZmZWN0czogW10sXG4gICAgcmVzb2x2ZShyZXN1bWUgPSBmYWxzZSwgc3luYyA9IGZhbHNlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAoIXJlc3VtZSAmJiAhc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBzdXNwZW5zZS5yZXNvbHZlKCkgaXMgY2FsbGVkIHdpdGhvdXQgYSBwZW5kaW5nIGJyYW5jaC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VzcGVuc2UuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCBvbiBhbiBhbHJlYWR5IHVubW91bnRlZCBzdXNwZW5zZSBib3VuZGFyeS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICB2bm9kZTogdm5vZGUyLFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgIHBlbmRpbmdJZCxcbiAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcjJcbiAgICAgIH0gPSBzdXNwZW5zZTtcbiAgICAgIGxldCBkZWxheUVudGVyID0gZmFsc2U7XG4gICAgICBpZiAoc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgc3VzcGVuc2UuaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIXJlc3VtZSkge1xuICAgICAgICBkZWxheUVudGVyID0gYWN0aXZlQnJhbmNoICYmIHBlbmRpbmdCcmFuY2gudHJhbnNpdGlvbiAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24ubW9kZSA9PT0gXCJvdXQtaW5cIjtcbiAgICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdJZCA9PT0gc3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIG1vdmUocGVuZGluZ0JyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgMCk7XG4gICAgICAgICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBhbmNob3I6IGFuY2hvcjIgfSA9IHN1c3BlbnNlO1xuICAgICAgICBpZiAoYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgICAgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgICAgICB1bm1vdW50KGFjdGl2ZUJyYW5jaCwgcGFyZW50Q29tcG9uZW50Miwgc3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICAgIG1vdmUocGVuZGluZ0JyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yMiwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgcGVuZGluZ0JyYW5jaCk7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbnVsbDtcbiAgICAgIHN1c3BlbnNlLmlzSW5GYWxsYmFjayA9IGZhbHNlO1xuICAgICAgbGV0IHBhcmVudCA9IHN1c3BlbnNlLnBhcmVudDtcbiAgICAgIGxldCBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgICAgcGFyZW50LmVmZmVjdHMucHVzaCguLi5lZmZlY3RzKTtcbiAgICAgICAgICBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1VucmVzb2x2ZWRBbmNlc3RvciAmJiAhZGVsYXlFbnRlcikge1xuICAgICAgICBxdWV1ZVBvc3RGbHVzaENiKGVmZmVjdHMpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZWZmZWN0cyA9IFtdO1xuICAgICAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgcGFyZW50U3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UuZGVwcy0tO1xuICAgICAgICAgIGlmIChwYXJlbnRTdXNwZW5zZS5kZXBzID09PSAwICYmICFzeW5jKSB7XG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQodm5vZGUyLCBcIm9uUmVzb2x2ZVwiKTtcbiAgICB9LFxuICAgIGZhbGxiYWNrKGZhbGxiYWNrVk5vZGUpIHtcbiAgICAgIGlmICghc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHZub2RlOiB2bm9kZTIsIGFjdGl2ZUJyYW5jaCwgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLCBjb250YWluZXI6IGNvbnRhaW5lcjIsIGlzU1ZHOiBpc1NWRzIgfSA9IHN1c3BlbnNlO1xuICAgICAgdHJpZ2dlckV2ZW50KHZub2RlMiwgXCJvbkZhbGxiYWNrXCIpO1xuICAgICAgY29uc3QgYW5jaG9yMiA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgIGNvbnN0IG1vdW50RmFsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc3VzcGVuc2UuaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZmFsbGJhY2tWTm9kZSxcbiAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgaXNTVkcyLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBmYWxsYmFja1ZOb2RlKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWxheUVudGVyID0gZmFsbGJhY2tWTm9kZS50cmFuc2l0aW9uICYmIGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbi5tb2RlID09PSBcIm91dC1pblwiO1xuICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9IG1vdW50RmFsbGJhY2s7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgdW5tb3VudChcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBudWxsLFxuICAgICAgICAvLyBubyBzdXNwZW5zZSBzbyB1bm1vdW50IGhvb2tzIGZpcmUgbm93XG4gICAgICAgIHRydWVcbiAgICAgICAgLy8gc2hvdWxkUmVtb3ZlXG4gICAgICApO1xuICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgIG1vdW50RmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vdmUoY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSkge1xuICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoICYmIG1vdmUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IyLCB0eXBlKTtcbiAgICAgIHN1c3BlbnNlLmNvbnRhaW5lciA9IGNvbnRhaW5lcjI7XG4gICAgfSxcbiAgICBuZXh0KCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBuZXh0KHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCk7XG4gICAgfSxcbiAgICByZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QpIHtcbiAgICAgIGNvbnN0IGlzSW5QZW5kaW5nU3VzcGVuc2UgPSAhIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2g7XG4gICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSkge1xuICAgICAgICBzdXNwZW5zZS5kZXBzKys7XG4gICAgICB9XG4gICAgICBjb25zdCBoeWRyYXRlZEVsID0gaW5zdGFuY2Uudm5vZGUuZWw7XG4gICAgICBpbnN0YW5jZS5hc3luY0RlcC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDApO1xuICAgICAgfSkudGhlbigoYXN5bmNTZXR1cFJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UucGVuZGluZ0lkICE9PSBpbnN0YW5jZS5zdXNwZW5zZUlkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IHZub2RlOiB2bm9kZTIgfSA9IGluc3RhbmNlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZTIpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBhc3luY1NldHVwUmVzdWx0LCBmYWxzZSk7XG4gICAgICAgIGlmIChoeWRyYXRlZEVsKSB7XG4gICAgICAgICAgdm5vZGUyLmVsID0gaHlkcmF0ZWRFbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICFoeWRyYXRlZEVsICYmIGluc3RhbmNlLnN1YlRyZWUuZWw7XG4gICAgICAgIHNldHVwUmVuZGVyRWZmZWN0KFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHZub2RlMixcbiAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGhhdmUgYmVlbiBtb3ZlZCBiZWZvcmUgcmVzb2x2ZS5cbiAgICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCBhIGh5ZHJhdGlvbiwgaW5zdGFuY2Uuc3ViVHJlZSB3aWxsIGJlIHRoZSBjb21tZW50XG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIuXG4gICAgICAgICAgcGFyZW50Tm9kZShoeWRyYXRlZEVsIHx8IGluc3RhbmNlLnN1YlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoaXMgaXMgaHlkcmF0aW9uLCBzbyBvbmx5IG5lZWQgdG9cbiAgICAgICAgICAvLyBjb25zaWRlciB0aGUgY29tbWVudCBwbGFjZWhvbGRlciBjYXNlLlxuICAgICAgICAgIGh5ZHJhdGVkRWwgPyBudWxsIDogbmV4dChpbnN0YW5jZS5zdWJUcmVlKSxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgcmVtb3ZlKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIT0NIb3N0RWwoaW5zdGFuY2UsIHZub2RlMi5lbCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSAmJiAtLXN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdW5tb3VudChwYXJlbnRTdXNwZW5zZTIsIGRvUmVtb3ZlKSB7XG4gICAgICBzdXNwZW5zZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgICBpZiAoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UyLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3VzcGVuc2U7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2Uobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGh5ZHJhdGVOb2RlKSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICBudWxsLFxuICAgIGlzU1ZHLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWQsXG4gICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgdHJ1ZVxuICAgIC8qIGh5ZHJhdGluZyAqL1xuICApO1xuICBjb25zdCByZXN1bHQgPSBoeWRyYXRlTm9kZShcbiAgICBub2RlLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWRcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICBzdXNwZW5zZS5yZXNvbHZlKGZhbHNlLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VDaGlsZHJlbih2bm9kZSkge1xuICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBpc1Nsb3RDaGlsZHJlbiA9IHNoYXBlRmxhZyAmIDMyO1xuICB2bm9kZS5zc0NvbnRlbnQgPSBub3JtYWxpemVTdXNwZW5zZVNsb3QoXG4gICAgaXNTbG90Q2hpbGRyZW4gPyBjaGlsZHJlbi5kZWZhdWx0IDogY2hpbGRyZW5cbiAgKTtcbiAgdm5vZGUuc3NGYWxsYmFjayA9IGlzU2xvdENoaWxkcmVuID8gbm9ybWFsaXplU3VzcGVuc2VTbG90KGNoaWxkcmVuLmZhbGxiYWNrKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VTbG90KHMpIHtcbiAgbGV0IGJsb2NrO1xuICBpZiAoaXNGdW5jdGlvbihzKSkge1xuICAgIGNvbnN0IHRyYWNrQmxvY2sgPSBpc0Jsb2NrVHJlZUVuYWJsZWQgJiYgcy5fYztcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IGZhbHNlO1xuICAgICAgb3BlbkJsb2NrKCk7XG4gICAgfVxuICAgIHMgPSBzKCk7XG4gICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgIHMuX2QgPSB0cnVlO1xuICAgICAgYmxvY2sgPSBjdXJyZW50QmxvY2s7XG4gICAgICBjbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG4gIGlmIChpc0FycmF5KHMpKSB7XG4gICAgY29uc3Qgc2luZ2xlQ2hpbGQgPSBmaWx0ZXJTaW5nbGVSb290KHMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFzaW5nbGVDaGlsZCAmJiBzLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkICE9PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKS5sZW5ndGggPiAwKSB7XG4gICAgICB3YXJuKGA8U3VzcGVuc2U+IHNsb3RzIGV4cGVjdCBhIHNpbmdsZSByb290IG5vZGUuYCk7XG4gICAgfVxuICAgIHMgPSBzaW5nbGVDaGlsZDtcbiAgfVxuICBzID0gbm9ybWFsaXplVk5vZGUocyk7XG4gIGlmIChibG9jayAmJiAhcy5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICBzLmR5bmFtaWNDaGlsZHJlbiA9IGJsb2NrLmZpbHRlcigoYykgPT4gYyAhPT0gcyk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZShmbiwgc3VzcGVuc2UpIHtcbiAgaWYgKHN1c3BlbnNlICYmIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICBpZiAoaXNBcnJheShmbikpIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaCguLi5mbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaChmbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIGJyYW5jaCkge1xuICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggPSBicmFuY2g7XG4gIGNvbnN0IHsgdm5vZGUsIHBhcmVudENvbXBvbmVudCB9ID0gc3VzcGVuc2U7XG4gIGNvbnN0IGVsID0gdm5vZGUuZWwgPSBicmFuY2guZWw7XG4gIGlmIChwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnN1YlRyZWUgPT09IHZub2RlKSB7XG4gICAgcGFyZW50Q29tcG9uZW50LnZub2RlLmVsID0gZWw7XG4gICAgdXBkYXRlSE9DSG9zdEVsKHBhcmVudENvbXBvbmVudCwgZWwpO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZOb2RlU3VzcGVuc2libGUodm5vZGUpIHtcbiAgdmFyIF9hO1xuICByZXR1cm4gKChfYSA9IHZub2RlLnByb3BzKSA9PSBudWxsID8gdm9pZCAwIDogX2Euc3VzcGVuc2libGUpICE9IG51bGwgJiYgdm5vZGUucHJvcHMuc3VzcGVuc2libGUgIT09IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB3YXRjaEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goZWZmZWN0LCBudWxsLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHdhdGNoUG9zdEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJwb3N0XCIgfSkgOiB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICk7XG59XG5mdW5jdGlvbiB3YXRjaFN5bmNFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKFxuICAgIGVmZmVjdCxcbiAgICBudWxsLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBleHRlbmQoe30sIG9wdGlvbnMsIHsgZmx1c2g6IFwic3luY1wiIH0pIDogeyBmbHVzaDogXCJzeW5jXCIgfVxuICApO1xufVxuY29uc3QgSU5JVElBTF9XQVRDSEVSX1ZBTFVFID0ge307XG5mdW5jdGlvbiB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgIHdhcm4oXG4gICAgICBgXFxgd2F0Y2goZm4sIG9wdGlvbnM/KVxcYCBzaWduYXR1cmUgaGFzIGJlZW4gbW92ZWQgdG8gYSBzZXBhcmF0ZSBBUEkuIFVzZSBcXGB3YXRjaEVmZmVjdChmbiwgb3B0aW9ucz8pXFxgIGluc3RlYWQuIFxcYHdhdGNoXFxgIG5vdyBvbmx5IHN1cHBvcnRzIFxcYHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGRvV2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkb1dhdGNoKHNvdXJjZSwgY2IsIHsgaW1tZWRpYXRlLCBkZWVwLCBmbHVzaCwgb25UcmFjaywgb25UcmlnZ2VyIH0gPSBFTVBUWV9PQkopIHtcbiAgdmFyIF9hO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY2IpIHtcbiAgICBpZiAoaW1tZWRpYXRlICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGB3YXRjaCgpIFwiaW1tZWRpYXRlXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlZXAgIT09IHZvaWQgMCkge1xuICAgICAgd2FybihcbiAgICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgd2FybkludmFsaWRTb3VyY2UgPSAocykgPT4ge1xuICAgIHdhcm4oXG4gICAgICBgSW52YWxpZCB3YXRjaCBzb3VyY2U6IGAsXG4gICAgICBzLFxuICAgICAgYEEgd2F0Y2ggc291cmNlIGNhbiBvbmx5IGJlIGEgZ2V0dGVyL2VmZmVjdCBmdW5jdGlvbiwgYSByZWYsIGEgcmVhY3RpdmUgb2JqZWN0LCBvciBhbiBhcnJheSBvZiB0aGVzZSB0eXBlcy5gXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50U2NvcGUoKSA9PT0gKChfYSA9IGN1cnJlbnRJbnN0YW5jZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnNjb3BlKSA/IGN1cnJlbnRJbnN0YW5jZSA6IG51bGw7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBmb3JjZVRyaWdnZXIgPSBmYWxzZTtcbiAgbGV0IGlzTXVsdGlTb3VyY2UgPSBmYWxzZTtcbiAgaWYgKGlzUmVmKHNvdXJjZSkpIHtcbiAgICBnZXR0ZXIgPSAoKSA9PiBzb3VyY2UudmFsdWU7XG4gICAgZm9yY2VUcmlnZ2VyID0gaXNTaGFsbG93JDEoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKHNvdXJjZSkpIHtcbiAgICBnZXR0ZXIgPSAoKSA9PiBzb3VyY2U7XG4gICAgZGVlcCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXNBcnJheShzb3VyY2UpKSB7XG4gICAgaXNNdWx0aVNvdXJjZSA9IHRydWU7XG4gICAgZm9yY2VUcmlnZ2VyID0gc291cmNlLnNvbWUoKHMpID0+IGlzUmVhY3RpdmUocykgfHwgaXNTaGFsbG93JDEocykpO1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAoKHMpID0+IHtcbiAgICAgIGlmIChpc1JlZihzKSkge1xuICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShzKSkge1xuICAgICAgICByZXR1cm4gdHJhdmVyc2Uocyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhzLCBpbnN0YW5jZSwgMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIGlmIChjYikge1xuICAgICAgZ2V0dGVyID0gKCkgPT4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHNvdXJjZSwgaW5zdGFuY2UsIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5pc1VubW91bnRlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYW51cCkge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIDMsXG4gICAgICAgICAgW29uQ2xlYW51cF1cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGdldHRlciA9IE5PT1A7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuSW52YWxpZFNvdXJjZShzb3VyY2UpO1xuICB9XG4gIGlmIChjYiAmJiBkZWVwKSB7XG4gICAgY29uc3QgYmFzZUdldHRlciA9IGdldHRlcjtcbiAgICBnZXR0ZXIgPSAoKSA9PiB0cmF2ZXJzZShiYXNlR2V0dGVyKCkpO1xuICB9XG4gIGxldCBjbGVhbnVwO1xuICBsZXQgb25DbGVhbnVwID0gKGZuKSA9PiB7XG4gICAgY2xlYW51cCA9IGVmZmVjdC5vblN0b3AgPSAoKSA9PiB7XG4gICAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCA0KTtcbiAgICAgIGNsZWFudXAgPSBlZmZlY3Qub25TdG9wID0gdm9pZCAwO1xuICAgIH07XG4gIH07XG4gIGxldCBzc3JDbGVhbnVwO1xuICBpZiAoaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgb25DbGVhbnVwID0gTk9PUDtcbiAgICBpZiAoIWNiKSB7XG4gICAgICBnZXR0ZXIoKTtcbiAgICB9IGVsc2UgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoY2IsIGluc3RhbmNlLCAzLCBbXG4gICAgICAgIGdldHRlcigpLFxuICAgICAgICBpc011bHRpU291cmNlID8gW10gOiB2b2lkIDAsXG4gICAgICAgIG9uQ2xlYW51cFxuICAgICAgXSk7XG4gICAgfVxuICAgIGlmIChmbHVzaCA9PT0gXCJzeW5jXCIpIHtcbiAgICAgIGNvbnN0IGN0eCA9IHVzZVNTUkNvbnRleHQoKTtcbiAgICAgIHNzckNsZWFudXAgPSBjdHguX193YXRjaGVySGFuZGxlcyB8fCAoY3R4Ll9fd2F0Y2hlckhhbmRsZXMgPSBbXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBOT09QO1xuICAgIH1cbiAgfVxuICBsZXQgb2xkVmFsdWUgPSBpc011bHRpU291cmNlID8gbmV3IEFycmF5KHNvdXJjZS5sZW5ndGgpLmZpbGwoSU5JVElBTF9XQVRDSEVSX1ZBTFVFKSA6IElOSVRJQUxfV0FUQ0hFUl9WQUxVRTtcbiAgY29uc3Qgam9iID0gKCkgPT4ge1xuICAgIGlmICghZWZmZWN0LmFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2IpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gZWZmZWN0LnJ1bigpO1xuICAgICAgaWYgKGRlZXAgfHwgZm9yY2VUcmlnZ2VyIHx8IChpc011bHRpU291cmNlID8gbmV3VmFsdWUuc29tZSgodiwgaSkgPT4gaGFzQ2hhbmdlZCh2LCBvbGRWYWx1ZVtpXSkpIDogaGFzQ2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUpKSB8fCBmYWxzZSkge1xuICAgICAgICBpZiAoY2xlYW51cCkge1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhjYiwgaW5zdGFuY2UsIDMsIFtcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICAvLyBwYXNzIHVuZGVmaW5lZCBhcyB0aGUgb2xkIHZhbHVlIHdoZW4gaXQncyBjaGFuZ2VkIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgIG9sZFZhbHVlID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyB2b2lkIDAgOiBpc011bHRpU291cmNlICYmIG9sZFZhbHVlWzBdID09PSBJTklUSUFMX1dBVENIRVJfVkFMVUUgPyBbXSA6IG9sZFZhbHVlLFxuICAgICAgICAgIG9uQ2xlYW51cFxuICAgICAgICBdKTtcbiAgICAgICAgb2xkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfTtcbiAgam9iLmFsbG93UmVjdXJzZSA9ICEhY2I7XG4gIGxldCBzY2hlZHVsZXI7XG4gIGlmIChmbHVzaCA9PT0gXCJzeW5jXCIpIHtcbiAgICBzY2hlZHVsZXIgPSBqb2I7XG4gIH0gZWxzZSBpZiAoZmx1c2ggPT09IFwicG9zdFwiKSB7XG4gICAgc2NoZWR1bGVyID0gKCkgPT4gcXVldWVQb3N0UmVuZGVyRWZmZWN0KGpvYiwgaW5zdGFuY2UgJiYgaW5zdGFuY2Uuc3VzcGVuc2UpO1xuICB9IGVsc2Uge1xuICAgIGpvYi5wcmUgPSB0cnVlO1xuICAgIGlmIChpbnN0YW5jZSlcbiAgICAgIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICBzY2hlZHVsZXIgPSAoKSA9PiBxdWV1ZUpvYihqb2IpO1xuICB9XG4gIGNvbnN0IGVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIsIHNjaGVkdWxlcik7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgZWZmZWN0Lm9uVHJhY2sgPSBvblRyYWNrO1xuICAgIGVmZmVjdC5vblRyaWdnZXIgPSBvblRyaWdnZXI7XG4gIH1cbiAgaWYgKGNiKSB7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgam9iKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9sZFZhbHVlID0gZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmbHVzaCA9PT0gXCJwb3N0XCIpIHtcbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoXG4gICAgICBlZmZlY3QucnVuLmJpbmQoZWZmZWN0KSxcbiAgICAgIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBlZmZlY3QucnVuKCk7XG4gIH1cbiAgY29uc3QgdW53YXRjaCA9ICgpID0+IHtcbiAgICBlZmZlY3Quc3RvcCgpO1xuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5zY29wZSkge1xuICAgICAgcmVtb3ZlKGluc3RhbmNlLnNjb3BlLmVmZmVjdHMsIGVmZmVjdCk7XG4gICAgfVxuICB9O1xuICBpZiAoc3NyQ2xlYW51cClcbiAgICBzc3JDbGVhbnVwLnB1c2godW53YXRjaCk7XG4gIHJldHVybiB1bndhdGNoO1xufVxuZnVuY3Rpb24gaW5zdGFuY2VXYXRjaChzb3VyY2UsIHZhbHVlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHB1YmxpY1RoaXMgPSB0aGlzLnByb3h5O1xuICBjb25zdCBnZXR0ZXIgPSBpc1N0cmluZyhzb3VyY2UpID8gc291cmNlLmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywgc291cmNlKSA6ICgpID0+IHB1YmxpY1RoaXNbc291cmNlXSA6IHNvdXJjZS5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpO1xuICBsZXQgY2I7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIGNiID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgY2IgPSB2YWx1ZS5oYW5kbGVyO1xuICAgIG9wdGlvbnMgPSB2YWx1ZTtcbiAgfVxuICBjb25zdCBjdXIgPSBjdXJyZW50SW5zdGFuY2U7XG4gIHNldEN1cnJlbnRJbnN0YW5jZSh0aGlzKTtcbiAgY29uc3QgcmVzID0gZG9XYXRjaChnZXR0ZXIsIGNiLmJpbmQocHVibGljVGhpcyksIG9wdGlvbnMpO1xuICBpZiAoY3VyKSB7XG4gICAgc2V0Q3VycmVudEluc3RhbmNlKGN1cik7XG4gIH0gZWxzZSB7XG4gICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0aEdldHRlcihjdHgsIHBhdGgpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsZXQgY3VyID0gY3R4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoICYmIGN1cjsgaSsrKSB7XG4gICAgICBjdXIgPSBjdXJbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gY3VyO1xuICB9O1xufVxuZnVuY3Rpb24gdHJhdmVyc2UodmFsdWUsIHNlZW4pIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWVbXCJfX3Zfc2tpcFwiXSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBpZiAoc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHNlZW4uYWRkKHZhbHVlKTtcbiAgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIHRyYXZlcnNlKHZhbHVlLnZhbHVlLCBzZWVuKTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyYXZlcnNlKHZhbHVlW2ldLCBzZWVuKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpIHx8IGlzTWFwKHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goKHYpID0+IHtcbiAgICAgIHRyYXZlcnNlKHYsIHNlZW4pO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHRyYXZlcnNlKHZhbHVlW2tleV0sIHNlZW4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKSB7XG4gIGlmIChpc0J1aWx0SW5EaXJlY3RpdmUobmFtZSkpIHtcbiAgICB3YXJuKFwiRG8gbm90IHVzZSBidWlsdC1pbiBkaXJlY3RpdmUgaWRzIGFzIGN1c3RvbSBkaXJlY3RpdmUgaWQ6IFwiICsgbmFtZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdpdGhEaXJlY3RpdmVzKHZub2RlLCBkaXJlY3RpdmVzKSB7XG4gIGNvbnN0IGludGVybmFsSW5zdGFuY2UgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChpbnRlcm5hbEluc3RhbmNlID09PSBudWxsKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGB3aXRoRGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluc2lkZSByZW5kZXIgZnVuY3Rpb25zLmApO1xuICAgIHJldHVybiB2bm9kZTtcbiAgfVxuICBjb25zdCBpbnN0YW5jZSA9IGdldEV4cG9zZVByb3h5KGludGVybmFsSW5zdGFuY2UpIHx8IGludGVybmFsSW5zdGFuY2UucHJveHk7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycyB8fCAodm5vZGUuZGlycyA9IFtdKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IFtkaXIsIHZhbHVlLCBhcmcsIG1vZGlmaWVycyA9IEVNUFRZX09CSl0gPSBkaXJlY3RpdmVzW2ldO1xuICAgIGlmIChkaXIpIHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGRpcikpIHtcbiAgICAgICAgZGlyID0ge1xuICAgICAgICAgIG1vdW50ZWQ6IGRpcixcbiAgICAgICAgICB1cGRhdGVkOiBkaXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXIuZGVlcCkge1xuICAgICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgZGlyLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9sZFZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGFyZyxcbiAgICAgICAgbW9kaWZpZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgcHJldlZOb2RlLCBpbnN0YW5jZSwgbmFtZSkge1xuICBjb25zdCBiaW5kaW5ncyA9IHZub2RlLmRpcnM7XG4gIGNvbnN0IG9sZEJpbmRpbmdzID0gcHJldlZOb2RlICYmIHByZXZWTm9kZS5kaXJzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgIGlmIChvbGRCaW5kaW5ncykge1xuICAgICAgYmluZGluZy5vbGRWYWx1ZSA9IG9sZEJpbmRpbmdzW2ldLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgaG9vayA9IGJpbmRpbmcuZGlyW25hbWVdO1xuICAgIGlmIChob29rKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgOCwgW1xuICAgICAgICB2bm9kZS5lbCxcbiAgICAgICAgYmluZGluZyxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIHByZXZWTm9kZVxuICAgICAgXSk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxlYXZlQ2JLZXkgPSBTeW1ib2woXCJfbGVhdmVDYlwiKTtcbmNvbnN0IGVudGVyQ2JLZXkgPSBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0ZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc0xlYXZpbmc6IGZhbHNlLFxuICAgIGlzVW5tb3VudGluZzogZmFsc2UsXG4gICAgbGVhdmluZ1ZOb2RlczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHN0YXRlLmlzTW91bnRlZCA9IHRydWU7XG4gIH0pO1xuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgIHN0YXRlLmlzVW5tb3VudGluZyA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gc3RhdGU7XG59XG5jb25zdCBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciA9IFtGdW5jdGlvbiwgQXJyYXldO1xuY29uc3QgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMgPSB7XG4gIG1vZGU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBwZXJzaXN0ZWQ6IEJvb2xlYW4sXG4gIC8vIGVudGVyXG4gIG9uQmVmb3JlRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25FbnRlckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGxlYXZlXG4gIG9uQmVmb3JlTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25MZWF2ZUNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGFwcGVhclxuICBvbkJlZm9yZUFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvclxufTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uSW1wbCA9IHtcbiAgbmFtZTogYEJhc2VUcmFuc2l0aW9uYCxcbiAgcHJvcHM6IEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2VHJhbnNpdGlvbktleTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCksIHRydWUpO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IGhhc0ZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIGlmIChjLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGhhc0ZvdW5kKSB7XG4gICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgXCI8dHJhbnNpdGlvbj4gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBlbGVtZW50IG9yIGNvbXBvbmVudC4gVXNlIDx0cmFuc2l0aW9uLWdyb3VwPiBmb3IgbGlzdHMuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGlsZCA9IGM7XG4gICAgICAgICAgICBoYXNGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoISEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmF3UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gICAgICBjb25zdCB7IG1vZGUgfSA9IHJhd1Byb3BzO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbW9kZSAmJiBtb2RlICE9PSBcImluLW91dFwiICYmIG1vZGUgIT09IFwib3V0LWluXCIgJiYgbW9kZSAhPT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgICAgd2FybihgaW52YWxpZCA8dHJhbnNpdGlvbj4gbW9kZTogJHttb2RlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzTGVhdmluZykge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbm5lckNoaWxkID0gZ2V0S2VlcEFsaXZlQ2hpbGQoY2hpbGQpO1xuICAgICAgaWYgKCFpbm5lckNoaWxkKSB7XG4gICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudGVySG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICBpbm5lckNoaWxkLFxuICAgICAgICByYXdQcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlXG4gICAgICApO1xuICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKGlubmVyQ2hpbGQsIGVudGVySG9va3MpO1xuICAgICAgY29uc3Qgb2xkQ2hpbGQgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICAgICAgY29uc3Qgb2xkSW5uZXJDaGlsZCA9IG9sZENoaWxkICYmIGdldEtlZXBBbGl2ZUNoaWxkKG9sZENoaWxkKTtcbiAgICAgIGxldCB0cmFuc2l0aW9uS2V5Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgeyBnZXRUcmFuc2l0aW9uS2V5IH0gPSBpbm5lckNoaWxkLnR5cGU7XG4gICAgICBpZiAoZ2V0VHJhbnNpdGlvbktleSkge1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRUcmFuc2l0aW9uS2V5KCk7XG4gICAgICAgIGlmIChwcmV2VHJhbnNpdGlvbktleSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgcHJldlRyYW5zaXRpb25LZXkgPSBrZXk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBwcmV2VHJhbnNpdGlvbktleSkge1xuICAgICAgICAgIHByZXZUcmFuc2l0aW9uS2V5ID0ga2V5O1xuICAgICAgICAgIHRyYW5zaXRpb25LZXlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9sZElubmVyQ2hpbGQgJiYgb2xkSW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50ICYmICghaXNTYW1lVk5vZGVUeXBlKGlubmVyQ2hpbGQsIG9sZElubmVyQ2hpbGQpIHx8IHRyYW5zaXRpb25LZXlDaGFuZ2VkKSkge1xuICAgICAgICBjb25zdCBsZWF2aW5nSG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgIG9sZElubmVyQ2hpbGQsXG4gICAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgKTtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKG9sZElubmVyQ2hpbGQsIGxlYXZpbmdIb29rcyk7XG4gICAgICAgIGlmIChtb2RlID09PSBcIm91dC1pblwiKSB7XG4gICAgICAgICAgc3RhdGUuaXNMZWF2aW5nID0gdHJ1ZTtcbiAgICAgICAgICBsZWF2aW5nSG9va3MuYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlLnVwZGF0ZS5hY3RpdmUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiaW4tb3V0XCIgJiYgaW5uZXJDaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmRlbGF5TGVhdmUgPSAoZWwsIGVhcmx5UmVtb3ZlLCBkZWxheWVkTGVhdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoXG4gICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICBvbGRJbm5lckNoaWxkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGVhdmluZ1ZOb2Rlc0NhY2hlW1N0cmluZyhvbGRJbm5lckNoaWxkLmtleSldID0gb2xkSW5uZXJDaGlsZDtcbiAgICAgICAgICAgIGVsW2xlYXZlQ2JLZXldID0gKCkgPT4ge1xuICAgICAgICAgICAgICBlYXJseVJlbW92ZSgpO1xuICAgICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGVySG9va3MuZGVsYXllZExlYXZlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGVudGVySG9va3MuZGVsYXllZExlYXZlID0gZGVsYXllZExlYXZlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgQmFzZVRyYW5zaXRpb24gPSBCYXNlVHJhbnNpdGlvbkltcGw7XG5mdW5jdGlvbiBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKHN0YXRlLCB2bm9kZSkge1xuICBjb25zdCB7IGxlYXZpbmdWTm9kZXMgfSA9IHN0YXRlO1xuICBsZXQgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gbGVhdmluZ1ZOb2Rlcy5nZXQodm5vZGUudHlwZSk7XG4gIGlmICghbGVhdmluZ1ZOb2Rlc0NhY2hlKSB7XG4gICAgbGVhdmluZ1ZOb2Rlc0NhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGVhdmluZ1ZOb2Rlcy5zZXQodm5vZGUudHlwZSwgbGVhdmluZ1ZOb2Rlc0NhY2hlKTtcbiAgfVxuICByZXR1cm4gbGVhdmluZ1ZOb2Rlc0NhY2hlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyh2bm9kZSwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSkge1xuICBjb25zdCB7XG4gICAgYXBwZWFyLFxuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkID0gZmFsc2UsXG4gICAgb25CZWZvcmVFbnRlcixcbiAgICBvbkVudGVyLFxuICAgIG9uQWZ0ZXJFbnRlcixcbiAgICBvbkVudGVyQ2FuY2VsbGVkLFxuICAgIG9uQmVmb3JlTGVhdmUsXG4gICAgb25MZWF2ZSxcbiAgICBvbkFmdGVyTGVhdmUsXG4gICAgb25MZWF2ZUNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUFwcGVhcixcbiAgICBvbkFwcGVhcixcbiAgICBvbkFmdGVyQXBwZWFyLFxuICAgIG9uQXBwZWFyQ2FuY2VsbGVkXG4gIH0gPSBwcm9wcztcbiAgY29uc3Qga2V5ID0gU3RyaW5nKHZub2RlLmtleSk7XG4gIGNvbnN0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKTtcbiAgY29uc3QgY2FsbEhvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGhvb2sgJiYgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBob29rLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA5LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IGNhbGxBc3luY0hvb2sgPSAoaG9vaywgYXJncykgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBhcmdzWzFdO1xuICAgIGNhbGxIb29rKGhvb2ssIGFyZ3MpO1xuICAgIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgICBpZiAoaG9vay5ldmVyeSgoaG9vazIpID0+IGhvb2syLmxlbmd0aCA8PSAxKSlcbiAgICAgICAgZG9uZSgpO1xuICAgIH0gZWxzZSBpZiAoaG9vay5sZW5ndGggPD0gMSkge1xuICAgICAgZG9uZSgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaG9va3MgPSB7XG4gICAgbW9kZSxcbiAgICBwZXJzaXN0ZWQsXG4gICAgYmVmb3JlRW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25CZWZvcmVFbnRlcjtcbiAgICAgIGlmICghc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICAgIGlmIChhcHBlYXIpIHtcbiAgICAgICAgICBob29rID0gb25CZWZvcmVBcHBlYXIgfHwgb25CZWZvcmVFbnRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBlbFtsZWF2ZUNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBsZWF2aW5nVk5vZGUgPSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChsZWF2aW5nVk5vZGUgJiYgaXNTYW1lVk5vZGVUeXBlKHZub2RlLCBsZWF2aW5nVk5vZGUpICYmIGxlYXZpbmdWTm9kZS5lbFtsZWF2ZUNiS2V5XSkge1xuICAgICAgICBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0oKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKGhvb2ssIFtlbF0pO1xuICAgIH0sXG4gICAgZW50ZXIoZWwpIHtcbiAgICAgIGxldCBob29rID0gb25FbnRlcjtcbiAgICAgIGxldCBhZnRlckhvb2sgPSBvbkFmdGVyRW50ZXI7XG4gICAgICBsZXQgY2FuY2VsSG9vayA9IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQXBwZWFyIHx8IG9uRW50ZXI7XG4gICAgICAgICAgYWZ0ZXJIb29rID0gb25BZnRlckFwcGVhciB8fCBvbkFmdGVyRW50ZXI7XG4gICAgICAgICAgY2FuY2VsSG9vayA9IG9uQXBwZWFyQ2FuY2VsbGVkIHx8IG9uRW50ZXJDYW5jZWxsZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkb25lID0gZWxbZW50ZXJDYktleV0gPSAoY2FuY2VsbGVkKSA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgY2FsbEhvb2soY2FuY2VsSG9vaywgW2VsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbEhvb2soYWZ0ZXJIb29rLCBbZWxdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9va3MuZGVsYXllZExlYXZlKSB7XG4gICAgICAgICAgaG9va3MuZGVsYXllZExlYXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxbZW50ZXJDYktleV0gPSB2b2lkIDA7XG4gICAgICB9O1xuICAgICAgaWYgKGhvb2spIHtcbiAgICAgICAgY2FsbEFzeW5jSG9vayhob29rLCBbZWwsIGRvbmVdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGxlYXZlKGVsLCByZW1vdmUpIHtcbiAgICAgIGNvbnN0IGtleTIgPSBTdHJpbmcodm5vZGUua2V5KTtcbiAgICAgIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgICAgICBlbFtlbnRlckNiS2V5XShcbiAgICAgICAgICB0cnVlXG4gICAgICAgICAgLyogY2FuY2VsbGVkICovXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaXNVbm1vdW50aW5nKSB7XG4gICAgICAgIHJldHVybiByZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIGNhbGxIb29rKG9uQmVmb3JlTGVhdmUsIFtlbF0pO1xuICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IGVsW2xlYXZlQ2JLZXldID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkFmdGVyTGVhdmUsIFtlbF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsW2xlYXZlQ2JLZXldID0gdm9pZCAwO1xuICAgICAgICBpZiAobGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdID09PSB2bm9kZSkge1xuICAgICAgICAgIGRlbGV0ZSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPSB2bm9kZTtcbiAgICAgIGlmIChvbkxlYXZlKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2sob25MZWF2ZSwgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbG9uZSh2bm9kZTIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKHZub2RlMiwgcHJvcHMsIHN0YXRlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBlbXB0eVBsYWNlaG9sZGVyKHZub2RlKSB7XG4gIGlmIChpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgIHZub2RlLmNoaWxkcmVuID0gbnVsbDtcbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEtlZXBBbGl2ZUNoaWxkKHZub2RlKSB7XG4gIHJldHVybiBpc0tlZXBBbGl2ZSh2bm9kZSkgPyAoXG4gICAgLy8gIzcxMjEgZW5zdXJlIGdldCB0aGUgY2hpbGQgY29tcG9uZW50IHN1YnRyZWUgaW4gY2FzZVxuICAgIC8vIGl0J3MgYmVlbiByZXBsYWNlZCBkdXJpbmcgSE1SXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5jb21wb25lbnQgPyB2bm9kZS5jb21wb25lbnQuc3ViVHJlZSA6IHZub2RlLmNoaWxkcmVuID8gdm5vZGUuY2hpbGRyZW5bMF0gOiB2b2lkIDBcbiAgKSA6IHZub2RlO1xufVxuZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCBob29rcykge1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNiAmJiB2bm9kZS5jb21wb25lbnQpIHtcbiAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUuY29tcG9uZW50LnN1YlRyZWUsIGhvb2tzKTtcbiAgfSBlbHNlIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICB2bm9kZS5zc0NvbnRlbnQudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzQ29udGVudCk7XG4gICAgdm5vZGUuc3NGYWxsYmFjay50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGRyZW4sIGtlZXBDb21tZW50ID0gZmFsc2UsIHBhcmVudEtleSkge1xuICBsZXQgcmV0ID0gW107XG4gIGxldCBrZXllZEZyYWdtZW50Q291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgY29uc3Qga2V5ID0gcGFyZW50S2V5ID09IG51bGwgPyBjaGlsZC5rZXkgOiBTdHJpbmcocGFyZW50S2V5KSArIFN0cmluZyhjaGlsZC5rZXkgIT0gbnVsbCA/IGNoaWxkLmtleSA6IGkpO1xuICAgIGlmIChjaGlsZC50eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaWYgKGNoaWxkLnBhdGNoRmxhZyAmIDEyOClcbiAgICAgICAga2V5ZWRGcmFnbWVudENvdW50Kys7XG4gICAgICByZXQgPSByZXQuY29uY2F0KFxuICAgICAgICBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4oY2hpbGQuY2hpbGRyZW4sIGtlZXBDb21tZW50LCBrZXkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoa2VlcENvbW1lbnQgfHwgY2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgcmV0LnB1c2goa2V5ICE9IG51bGwgPyBjbG9uZVZOb2RlKGNoaWxkLCB7IGtleSB9KSA6IGNoaWxkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGtleWVkRnJhZ21lbnRDb3VudCA+IDEpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2ldLnBhdGNoRmxhZyA9IC0yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDb21wb25lbnQob3B0aW9ucywgZXh0cmFPcHRpb25zKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKG9wdGlvbnMpID8gKFxuICAgIC8vICM4MzI2OiBleHRlbmQgY2FsbCBhbmQgb3B0aW9ucy5uYW1lIGFjY2VzcyBhcmUgY29uc2lkZXJlZCBzaWRlLWVmZmVjdHNcbiAgICAvLyBieSBSb2xsdXAsIHNvIHdlIGhhdmUgdG8gd3JhcCBpdCBpbiBhIHB1cmUtYW5ub3RhdGVkIElJRkUuXG4gICAgLyogQF9fUFVSRV9fICovICgoKSA9PiBleHRlbmQoeyBuYW1lOiBvcHRpb25zLm5hbWUgfSwgZXh0cmFPcHRpb25zLCB7IHNldHVwOiBvcHRpb25zIH0pKSgpXG4gICkgOiBvcHRpb25zO1xufVxuXG5jb25zdCBpc0FzeW5jV3JhcHBlciA9IChpKSA9PiAhIWkudHlwZS5fX2FzeW5jTG9hZGVyO1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQXN5bmNDb21wb25lbnQoc291cmNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBzb3VyY2UgPSB7IGxvYWRlcjogc291cmNlIH07XG4gIH1cbiAgY29uc3Qge1xuICAgIGxvYWRlcixcbiAgICBsb2FkaW5nQ29tcG9uZW50LFxuICAgIGVycm9yQ29tcG9uZW50LFxuICAgIGRlbGF5ID0gMjAwLFxuICAgIHRpbWVvdXQsXG4gICAgLy8gdW5kZWZpbmVkID0gbmV2ZXIgdGltZXMgb3V0XG4gICAgc3VzcGVuc2libGUgPSB0cnVlLFxuICAgIG9uRXJyb3I6IHVzZXJPbkVycm9yXG4gIH0gPSBzb3VyY2U7XG4gIGxldCBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gIGxldCByZXNvbHZlZENvbXA7XG4gIGxldCByZXRyaWVzID0gMDtcbiAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgcmV0cmllcysrO1xuICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICByZXR1cm4gbG9hZCgpO1xuICB9O1xuICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgIGxldCB0aGlzUmVxdWVzdDtcbiAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3QgfHwgKHRoaXNSZXF1ZXN0ID0gcGVuZGluZ1JlcXVlc3QgPSBsb2FkZXIoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSk7XG4gICAgICBpZiAodXNlck9uRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyUmV0cnkgPSAoKSA9PiByZXNvbHZlKHJldHJ5KCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJGYWlsID0gKCkgPT4gcmVqZWN0KGVycik7XG4gICAgICAgICAgdXNlck9uRXJyb3IoZXJyLCB1c2VyUmV0cnksIHVzZXJGYWlsLCByZXRyaWVzICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKGNvbXApID0+IHtcbiAgICAgIGlmICh0aGlzUmVxdWVzdCAhPT0gcGVuZGluZ1JlcXVlc3QgJiYgcGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNvbXApIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IGxvYWRlciByZXNvbHZlZCB0byB1bmRlZmluZWQuIElmIHlvdSBhcmUgdXNpbmcgcmV0cnkoKSwgbWFrZSBzdXJlIHRvIHJldHVybiBpdHMgcmV0dXJuIHZhbHVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wICYmIChjb21wLl9fZXNNb2R1bGUgfHwgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSBcIk1vZHVsZVwiKSkge1xuICAgICAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29tcCAmJiAhaXNPYmplY3QoY29tcCkgJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogJHtjb21wfWApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZWRDb21wID0gY29tcDtcbiAgICAgIHJldHVybiBjb21wO1xuICAgIH0pKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmluZUNvbXBvbmVudCh7XG4gICAgbmFtZTogXCJBc3luY0NvbXBvbmVudFdyYXBwZXJcIixcbiAgICBfX2FzeW5jTG9hZGVyOiBsb2FkLFxuICAgIGdldCBfX2FzeW5jUmVzb2x2ZWQoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRDb21wO1xuICAgIH0sXG4gICAgc2V0dXAoKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgICAgIGlmIChyZXNvbHZlZENvbXApIHtcbiAgICAgICAgcmV0dXJuICgpID0+IGNyZWF0ZUlubmVyQ29tcChyZXNvbHZlZENvbXAsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgaGFuZGxlRXJyb3IoXG4gICAgICAgICAgZXJyLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIDEzLFxuICAgICAgICAgICFlcnJvckNvbXBvbmVudFxuICAgICAgICAgIC8qIGRvIG5vdCB0aHJvdyBpbiBkZXYgaWYgdXNlciBwcm92aWRlZCBlcnJvciBjb21wb25lbnQgKi9cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBpZiAoc3VzcGVuc2libGUgJiYgaW5zdGFuY2Uuc3VzcGVuc2UgfHwgaXNJblNTUkNvbXBvbmVudFNldHVwKSB7XG4gICAgICAgIHJldHVybiBsb2FkKCkudGhlbigoY29tcCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBjcmVhdGVJbm5lckNvbXAoY29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgIHJldHVybiAoKSA9PiBlcnJvckNvbXBvbmVudCA/IGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgfSkgOiBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCBlcnJvciA9IHJlZigpO1xuICAgICAgY29uc3QgZGVsYXllZCA9IHJlZighIWRlbGF5KTtcbiAgICAgIGlmIChkZWxheSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBkZWxheWVkLnZhbHVlID0gZmFsc2U7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFsb2FkZWQudmFsdWUgJiYgIWVycm9yLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBBc3luYyBjb21wb25lbnQgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICAgICAgZXJyb3IudmFsdWUgPSBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIGxvYWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9hZGVkLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGluc3RhbmNlLnBhcmVudCAmJiBpc0tlZXBBbGl2ZShpbnN0YW5jZS5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgICAgcXVldWVKb2IoaW5zdGFuY2UucGFyZW50LnVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgb25FcnJvcihlcnIpO1xuICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZC52YWx1ZSAmJiByZXNvbHZlZENvbXApIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnZhbHVlICYmIGVycm9yQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGVycm9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IudmFsdWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2FkaW5nQ29tcG9uZW50ICYmICFkZWxheWVkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKGxvYWRpbmdDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVJbm5lckNvbXAoY29tcCwgcGFyZW50KSB7XG4gIGNvbnN0IHsgcmVmOiByZWYyLCBwcm9wcywgY2hpbGRyZW4sIGNlIH0gPSBwYXJlbnQudm5vZGU7XG4gIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUoY29tcCwgcHJvcHMsIGNoaWxkcmVuKTtcbiAgdm5vZGUucmVmID0gcmVmMjtcbiAgdm5vZGUuY2UgPSBjZTtcbiAgZGVsZXRlIHBhcmVudC52bm9kZS5jZTtcbiAgcmV0dXJuIHZub2RlO1xufVxuXG5jb25zdCBpc0tlZXBBbGl2ZSA9ICh2bm9kZSkgPT4gdm5vZGUudHlwZS5fX2lzS2VlcEFsaXZlO1xuY29uc3QgS2VlcEFsaXZlSW1wbCA9IHtcbiAgbmFtZTogYEtlZXBBbGl2ZWAsXG4gIC8vIE1hcmtlciBmb3Igc3BlY2lhbCBoYW5kbGluZyBpbnNpZGUgdGhlIHJlbmRlcmVyLiBXZSBhcmUgbm90IHVzaW5nIGEgPT09XG4gIC8vIGNoZWNrIGRpcmVjdGx5IG9uIEtlZXBBbGl2ZSBpbiB0aGUgcmVuZGVyZXIsIGJlY2F1c2UgaW1wb3J0aW5nIGl0IGRpcmVjdGx5XG4gIC8vIHdvdWxkIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0cmVlLXNoYWtlbi5cbiAgX19pc0tlZXBBbGl2ZTogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICBpbmNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBleGNsdWRlOiBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XSxcbiAgICBtYXg6IFtTdHJpbmcsIE51bWJlcl1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc2hhcmVkQ29udGV4dCA9IGluc3RhbmNlLmN0eDtcbiAgICBpZiAoIXNoYXJlZENvbnRleHQucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCAmJiBzbG90cy5kZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPT09IDEgPyBjaGlsZHJlblswXSA6IGNoaWxkcmVuO1xuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGxldCBjdXJyZW50ID0gbnVsbDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLl9fdl9jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRTdXNwZW5zZSA9IGluc3RhbmNlLnN1c3BlbnNlO1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlcmVyOiB7XG4gICAgICAgIHA6IHBhdGNoLFxuICAgICAgICBtOiBtb3ZlLFxuICAgICAgICB1bTogX3VubW91bnQsXG4gICAgICAgIG86IHsgY3JlYXRlRWxlbWVudCB9XG4gICAgICB9XG4gICAgfSA9IHNoYXJlZENvbnRleHQ7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgc2hhcmVkQ29udGV4dC5hY3RpdmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGlzU1ZHLCBvcHRpbWl6ZWQpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIG1vdmUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCAwLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgaW5zdGFuY2UyLnZub2RlLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGluc3RhbmNlMixcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGluc3RhbmNlMi5pc0RlYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5hKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2bm9kZUhvb2sgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy5vblZub2RlTW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNoYXJlZENvbnRleHQuZGVhY3RpdmF0ZSA9ICh2bm9kZSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2UyID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgbW92ZSh2bm9kZSwgc3RvcmFnZUNvbnRhaW5lciwgbnVsbCwgMSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5kYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5kYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZVVubW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSkge1xuICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgX3VubW91bnQodm5vZGUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGUoZmlsdGVyKSB7XG4gICAgICBjYWNoZS5mb3JFYWNoKCh2bm9kZSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHZub2RlLnR5cGUpO1xuICAgICAgICBpZiAobmFtZSAmJiAoIWZpbHRlciB8fCAhZmlsdGVyKG5hbWUpKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJ1bmVDYWNoZUVudHJ5KGtleSkge1xuICAgICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGtleSk7XG4gICAgICBpZiAoIWN1cnJlbnQgfHwgIWlzU2FtZVZOb2RlVHlwZShjYWNoZWQsIGN1cnJlbnQpKSB7XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCkge1xuICAgICAgICByZXNldFNoYXBlRmxhZyhjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgd2F0Y2goXG4gICAgICAoKSA9PiBbcHJvcHMuaW5jbHVkZSwgcHJvcHMuZXhjbHVkZV0sXG4gICAgICAoW2luY2x1ZGUsIGV4Y2x1ZGVdKSA9PiB7XG4gICAgICAgIGluY2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gbWF0Y2hlcyhpbmNsdWRlLCBuYW1lKSk7XG4gICAgICAgIGV4Y2x1ZGUgJiYgcHJ1bmVDYWNoZSgobmFtZSkgPT4gIW1hdGNoZXMoZXhjbHVkZSwgbmFtZSkpO1xuICAgICAgfSxcbiAgICAgIC8vIHBydW5lIHBvc3QtcmVuZGVyIGFmdGVyIGBjdXJyZW50YCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiwgZGVlcDogdHJ1ZSB9XG4gICAgKTtcbiAgICBsZXQgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICBjb25zdCBjYWNoZVN1YnRyZWUgPSAoKSA9PiB7XG4gICAgICBpZiAocGVuZGluZ0NhY2hlS2V5ICE9IG51bGwpIHtcbiAgICAgICAgY2FjaGUuc2V0KHBlbmRpbmdDYWNoZUtleSwgZ2V0SW5uZXJDaGlsZChpbnN0YW5jZS5zdWJUcmVlKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBvbk1vdW50ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvblVwZGF0ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgY2FjaGUuZm9yRWFjaCgoY2FjaGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ViVHJlZSwgc3VzcGVuc2UgfSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCB2bm9kZSA9IGdldElubmVyQ2hpbGQoc3ViVHJlZSk7XG4gICAgICAgIGlmIChjYWNoZWQudHlwZSA9PT0gdm5vZGUudHlwZSAmJiBjYWNoZWQua2V5ID09PSB2bm9kZS5rZXkpIHtcbiAgICAgICAgICByZXNldFNoYXBlRmxhZyh2bm9kZSk7XG4gICAgICAgICAgY29uc3QgZGEgPSB2bm9kZS5jb21wb25lbnQuZGE7XG4gICAgICAgICAgZGEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRhLCBzdXNwZW5zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgICAgaWYgKCFzbG90cy5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0KCk7XG4gICAgICBjb25zdCByYXdWTm9kZSA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGBLZWVwQWxpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgY29tcG9uZW50IGNoaWxkLmApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKHJhd1ZOb2RlKSB8fCAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDQpICYmICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSkge1xuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgbGV0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChyYXdWTm9kZSk7XG4gICAgICBjb25zdCBjb21wID0gdm5vZGUudHlwZTtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFxuICAgICAgICBpc0FzeW5jV3JhcHBlcih2bm9kZSkgPyB2bm9kZS50eXBlLl9fYXN5bmNSZXNvbHZlZCB8fCB7fSA6IGNvbXBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGluY2x1ZGUsIGV4Y2x1ZGUsIG1heCB9ID0gcHJvcHM7XG4gICAgICBpZiAoaW5jbHVkZSAmJiAoIW5hbWUgfHwgIW1hdGNoZXMoaW5jbHVkZSwgbmFtZSkpIHx8IGV4Y2x1ZGUgJiYgbmFtZSAmJiBtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKSB7XG4gICAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gdm5vZGUua2V5ID09IG51bGwgPyBjb21wIDogdm5vZGUua2V5O1xuICAgICAgY29uc3QgY2FjaGVkVk5vZGUgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmICh2bm9kZS5lbCkge1xuICAgICAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgICAgICBpZiAocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgcmF3Vk5vZGUuc3NDb250ZW50ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBlbmRpbmdDYWNoZUtleSA9IGtleTtcbiAgICAgIGlmIChjYWNoZWRWTm9kZSkge1xuICAgICAgICB2bm9kZS5lbCA9IGNhY2hlZFZOb2RlLmVsO1xuICAgICAgICB2bm9kZS5jb21wb25lbnQgPSBjYWNoZWRWTm9kZS5jb21wb25lbnQ7XG4gICAgICAgIGlmICh2bm9kZS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCB2bm9kZS50cmFuc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB2bm9kZS5zaGFwZUZsYWcgfD0gNTEyO1xuICAgICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICAgICAgaWYgKG1heCAmJiBrZXlzLnNpemUgPiBwYXJzZUludChtYXgsIDEwKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXlzLnZhbHVlcygpLm5leHQoKS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSAyNTY7XG4gICAgICBjdXJyZW50ID0gdm5vZGU7XG4gICAgICByZXR1cm4gaXNTdXNwZW5zZShyYXdWTm9kZS50eXBlKSA/IHJhd1ZOb2RlIDogdm5vZGU7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEtlZXBBbGl2ZSA9IEtlZXBBbGl2ZUltcGw7XG5mdW5jdGlvbiBtYXRjaGVzKHBhdHRlcm4sIG5hbWUpIHtcbiAgaWYgKGlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zb21lKChwKSA9PiBtYXRjaGVzKHAsIG5hbWUpKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KFwiLFwiKS5pbmNsdWRlcyhuYW1lKTtcbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gb25BY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImFcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIG9uRGVhY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImRhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgdHlwZSwgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dkYyB8fCAoaG9vay5fX3dkYyA9ICgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRhcmdldDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGN1cnJlbnQuaXNEZWFjdGl2YXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBob29rKCk7XG4gIH0pO1xuICBpbmplY3RIb29rKHR5cGUsIHdyYXBwZWRIb29rLCB0YXJnZXQpO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQucGFyZW50O1xuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQucGFyZW50KSB7XG4gICAgICBpZiAoaXNLZWVwQWxpdmUoY3VycmVudC5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgIGluamVjdFRvS2VlcEFsaXZlUm9vdCh3cmFwcGVkSG9vaywgdHlwZSwgdGFyZ2V0LCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdFRvS2VlcEFsaXZlUm9vdChob29rLCB0eXBlLCB0YXJnZXQsIGtlZXBBbGl2ZVJvb3QpIHtcbiAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RIb29rKFxuICAgIHR5cGUsXG4gICAgaG9vayxcbiAgICBrZWVwQWxpdmVSb290LFxuICAgIHRydWVcbiAgICAvKiBwcmVwZW5kICovXG4gICk7XG4gIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICByZW1vdmUoa2VlcEFsaXZlUm9vdFt0eXBlXSwgaW5qZWN0ZWQpO1xuICB9LCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVzZXRTaGFwZUZsYWcodm5vZGUpIHtcbiAgdm5vZGUuc2hhcGVGbGFnICY9IH4yNTY7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSB+NTEyO1xufVxuZnVuY3Rpb24gZ2V0SW5uZXJDaGlsZCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgMTI4ID8gdm5vZGUuc3NDb250ZW50IDogdm5vZGU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEhvb2sodHlwZSwgaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlLCBwcmVwZW5kID0gZmFsc2UpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IGhvb2tzID0gdGFyZ2V0W3R5cGVdIHx8ICh0YXJnZXRbdHlwZV0gPSBbXSk7XG4gICAgY29uc3Qgd3JhcHBlZEhvb2sgPSBob29rLl9fd2VoIHx8IChob29rLl9fd2VoID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICh0YXJnZXQuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgc2V0Q3VycmVudEluc3RhbmNlKHRhcmdldCk7XG4gICAgICBjb25zdCByZXMgPSBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCB0YXJnZXQsIHR5cGUsIGFyZ3MpO1xuICAgICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gICAgaWYgKHByZXBlbmQpIHtcbiAgICAgIGhvb2tzLnVuc2hpZnQod3JhcHBlZEhvb2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rcy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZWRIb29rO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBhcGlOYW1lID0gdG9IYW5kbGVyS2V5KEVycm9yVHlwZVN0cmluZ3NbdHlwZV0ucmVwbGFjZSgvIGhvb2skLywgXCJcIikpO1xuICAgIHdhcm4oXG4gICAgICBgJHthcGlOYW1lfSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC4gTGlmZWN5Y2xlIGluamVjdGlvbiBBUElzIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBzZXR1cCgpLmAgKyAoYCBJZiB5b3UgYXJlIHVzaW5nIGFzeW5jIHNldHVwKCksIG1ha2Ugc3VyZSB0byByZWdpc3RlciBsaWZlY3ljbGUgaG9va3MgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdCBzdGF0ZW1lbnQuYCApXG4gICAgKTtcbiAgfVxufVxuY29uc3QgY3JlYXRlSG9vayA9IChsaWZlY3ljbGUpID0+IChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpID0+IChcbiAgLy8gcG9zdC1jcmVhdGUgbGlmZWN5Y2xlIHJlZ2lzdHJhdGlvbnMgYXJlIG5vb3BzIGR1cmluZyBTU1IgKGV4Y2VwdCBmb3Igc2VydmVyUHJlZmV0Y2gpXG4gICghaXNJblNTUkNvbXBvbmVudFNldHVwIHx8IGxpZmVjeWNsZSA9PT0gXCJzcFwiKSAmJiBpbmplY3RIb29rKGxpZmVjeWNsZSwgKC4uLmFyZ3MpID0+IGhvb2soLi4uYXJncyksIHRhcmdldClcbik7XG5jb25zdCBvbkJlZm9yZU1vdW50ID0gY3JlYXRlSG9vayhcImJtXCIpO1xuY29uc3Qgb25Nb3VudGVkID0gY3JlYXRlSG9vayhcIm1cIik7XG5jb25zdCBvbkJlZm9yZVVwZGF0ZSA9IGNyZWF0ZUhvb2soXCJidVwiKTtcbmNvbnN0IG9uVXBkYXRlZCA9IGNyZWF0ZUhvb2soXCJ1XCIpO1xuY29uc3Qgb25CZWZvcmVVbm1vdW50ID0gY3JlYXRlSG9vayhcImJ1bVwiKTtcbmNvbnN0IG9uVW5tb3VudGVkID0gY3JlYXRlSG9vayhcInVtXCIpO1xuY29uc3Qgb25TZXJ2ZXJQcmVmZXRjaCA9IGNyZWF0ZUhvb2soXCJzcFwiKTtcbmNvbnN0IG9uUmVuZGVyVHJpZ2dlcmVkID0gY3JlYXRlSG9vayhcbiAgXCJydGdcIlxuKTtcbmNvbnN0IG9uUmVuZGVyVHJhY2tlZCA9IGNyZWF0ZUhvb2soXG4gIFwicnRjXCJcbik7XG5mdW5jdGlvbiBvbkVycm9yQ2FwdHVyZWQoaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGluamVjdEhvb2soXCJlY1wiLCBob29rLCB0YXJnZXQpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMaXN0KHNvdXJjZSwgcmVuZGVySXRlbSwgY2FjaGUsIGluZGV4KSB7XG4gIGxldCByZXQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlICYmIGNhY2hlW2luZGV4XTtcbiAgaWYgKGlzQXJyYXkoc291cmNlKSB8fCBpc1N0cmluZyhzb3VyY2UpKSB7XG4gICAgcmV0ID0gbmV3IEFycmF5KHNvdXJjZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc291cmNlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2VbaV0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihzb3VyY2UpKSB7XG4gICAgICB3YXJuKGBUaGUgdi1mb3IgcmFuZ2UgZXhwZWN0IGFuIGludGVnZXIgdmFsdWUgYnV0IGdvdCAke3NvdXJjZX0uYCk7XG4gICAgfVxuICAgIHJldCA9IG5ldyBBcnJheShzb3VyY2UpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHJlbmRlckl0ZW0oaSArIDEsIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBpZiAoc291cmNlW1N5bWJvbC5pdGVyYXRvcl0pIHtcbiAgICAgIHJldCA9IEFycmF5LmZyb20oXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgKGl0ZW0sIGkpID0+IHJlbmRlckl0ZW0oaXRlbSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgICByZXQgPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXRbaV0gPSByZW5kZXJJdGVtKHNvdXJjZVtrZXldLCBrZXksIGksIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXQgPSBbXTtcbiAgfVxuICBpZiAoY2FjaGUpIHtcbiAgICBjYWNoZVtpbmRleF0gPSByZXQ7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2xvdHMoc2xvdHMsIGR5bmFtaWNTbG90cykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGR5bmFtaWNTbG90cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNsb3QgPSBkeW5hbWljU2xvdHNbaV07XG4gICAgaWYgKGlzQXJyYXkoc2xvdCkpIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xvdC5sZW5ndGg7IGorKykge1xuICAgICAgICBzbG90c1tzbG90W2pdLm5hbWVdID0gc2xvdFtqXS5mbjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgIHNsb3RzW3Nsb3QubmFtZV0gPSBzbG90LmtleSA/ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHNsb3QuZm4oLi4uYXJncyk7XG4gICAgICAgIGlmIChyZXMpXG4gICAgICAgICAgcmVzLmtleSA9IHNsb3Qua2V5O1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSA6IHNsb3QuZm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90cztcbn1cblxuZnVuY3Rpb24gcmVuZGVyU2xvdChzbG90cywgbmFtZSwgcHJvcHMgPSB7fSwgZmFsbGJhY2ssIG5vU2xvdHRlZCkge1xuICBpZiAoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLmlzQ0UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudCAmJiBpc0FzeW5jV3JhcHBlcihjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50KSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50LmlzQ0UpIHtcbiAgICBpZiAobmFtZSAhPT0gXCJkZWZhdWx0XCIpXG4gICAgICBwcm9wcy5uYW1lID0gbmFtZTtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoXCJzbG90XCIsIHByb3BzLCBmYWxsYmFjayAmJiBmYWxsYmFjaygpKTtcbiAgfVxuICBsZXQgc2xvdCA9IHNsb3RzW25hbWVdO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzbG90ICYmIHNsb3QubGVuZ3RoID4gMSkge1xuICAgIHdhcm4oXG4gICAgICBgU1NSLW9wdGltaXplZCBzbG90IGZ1bmN0aW9uIGRldGVjdGVkIGluIGEgbm9uLVNTUi1vcHRpbWl6ZWQgcmVuZGVyIGZ1bmN0aW9uLiBZb3UgbmVlZCB0byBtYXJrIHRoaXMgY29tcG9uZW50IHdpdGggJGR5bmFtaWMtc2xvdHMgaW4gdGhlIHBhcmVudCB0ZW1wbGF0ZS5gXG4gICAgKTtcbiAgICBzbG90ID0gKCkgPT4gW107XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSBmYWxzZTtcbiAgfVxuICBvcGVuQmxvY2soKTtcbiAgY29uc3QgdmFsaWRTbG90Q29udGVudCA9IHNsb3QgJiYgZW5zdXJlVmFsaWRWTm9kZShzbG90KHByb3BzKSk7XG4gIGNvbnN0IHJlbmRlcmVkID0gY3JlYXRlQmxvY2soXG4gICAgRnJhZ21lbnQsXG4gICAge1xuICAgICAga2V5OiBwcm9wcy5rZXkgfHwgLy8gc2xvdCBjb250ZW50IGFycmF5IG9mIGEgZHluYW1pYyBjb25kaXRpb25hbCBzbG90IG1heSBoYXZlIGEgYnJhbmNoXG4gICAgICAvLyBrZXkgYXR0YWNoZWQgaW4gdGhlIGBjcmVhdGVTbG90c2AgaGVscGVyLCByZXNwZWN0IHRoYXRcbiAgICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgdmFsaWRTbG90Q29udGVudC5rZXkgfHwgYF8ke25hbWV9YFxuICAgIH0sXG4gICAgdmFsaWRTbG90Q29udGVudCB8fCAoZmFsbGJhY2sgPyBmYWxsYmFjaygpIDogW10pLFxuICAgIHZhbGlkU2xvdENvbnRlbnQgJiYgc2xvdHMuXyA9PT0gMSA/IDY0IDogLTJcbiAgKTtcbiAgaWYgKCFub1Nsb3R0ZWQgJiYgcmVuZGVyZWQuc2NvcGVJZCkge1xuICAgIHJlbmRlcmVkLnNsb3RTY29wZUlkcyA9IFtyZW5kZXJlZC5zY29wZUlkICsgXCItc1wiXTtcbiAgfVxuICBpZiAoc2xvdCAmJiBzbG90Ll9jKSB7XG4gICAgc2xvdC5fZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlbmRlcmVkO1xufVxuZnVuY3Rpb24gZW5zdXJlVmFsaWRWTm9kZSh2bm9kZXMpIHtcbiAgcmV0dXJuIHZub2Rlcy5zb21lKChjaGlsZCkgPT4ge1xuICAgIGlmICghaXNWTm9kZShjaGlsZCkpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gQ29tbWVudClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQgJiYgIWVuc3VyZVZhbGlkVk5vZGUoY2hpbGQuY2hpbGRyZW4pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KSA/IHZub2RlcyA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHRvSGFuZGxlcnMob2JqLCBwcmVzZXJ2ZUNhc2VJZk5lY2Vzc2FyeSkge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KG9iaikpIHtcbiAgICB3YXJuKGB2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuYCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICByZXRbcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkgJiYgL1tBLVpdLy50ZXN0KGtleSkgPyBgb246JHtrZXl9YCA6IHRvSGFuZGxlcktleShrZXkpXSA9IG9ialtrZXldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IGdldFB1YmxpY0luc3RhbmNlID0gKGkpID0+IHtcbiAgaWYgKCFpKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoaXNTdGF0ZWZ1bENvbXBvbmVudChpKSlcbiAgICByZXR1cm4gZ2V0RXhwb3NlUHJveHkoaSkgfHwgaS5wcm94eTtcbiAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KTtcbn07XG5jb25zdCBwdWJsaWNQcm9wZXJ0aWVzTWFwID0gKFxuICAvLyBNb3ZlIFBVUkUgbWFya2VyIHRvIG5ldyBsaW5lIHRvIHdvcmthcm91bmQgY29tcGlsZXIgZGlzY2FyZGluZyBpdFxuICAvLyBkdWUgdG8gdHlwZSBhbm5vdGF0aW9uXG4gIC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHtcbiAgICAkOiAoaSkgPT4gaSxcbiAgICAkZWw6IChpKSA9PiBpLnZub2RlLmVsLFxuICAgICRkYXRhOiAoaSkgPT4gaS5kYXRhLFxuICAgICRwcm9wczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5wcm9wcykgOiBpLnByb3BzLFxuICAgICRhdHRyczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5hdHRycykgOiBpLmF0dHJzLFxuICAgICRzbG90czogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5zbG90cykgOiBpLnNsb3RzLFxuICAgICRyZWZzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnJlZnMpIDogaS5yZWZzLFxuICAgICRwYXJlbnQ6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnBhcmVudCksXG4gICAgJHJvb3Q6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnJvb3QpLFxuICAgICRlbWl0OiAoaSkgPT4gaS5lbWl0LFxuICAgICRvcHRpb25zOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlLFxuICAgICRmb3JjZVVwZGF0ZTogKGkpID0+IGkuZiB8fCAoaS5mID0gKCkgPT4gcXVldWVKb2IoaS51cGRhdGUpKSxcbiAgICAkbmV4dFRpY2s6IChpKSA9PiBpLm4gfHwgKGkubiA9IG5leHRUaWNrLmJpbmQoaS5wcm94eSkpLFxuICAgICR3YXRjaDogKGkpID0+IF9fVlVFX09QVElPTlNfQVBJX18gPyBpbnN0YW5jZVdhdGNoLmJpbmQoaSkgOiBOT09QXG4gIH0pXG4pO1xuY29uc3QgaXNSZXNlcnZlZFByZWZpeCA9IChrZXkpID0+IGtleSA9PT0gXCJfXCIgfHwga2V5ID09PSBcIiRcIjtcbmNvbnN0IGhhc1NldHVwQmluZGluZyA9IChzdGF0ZSwga2V5KSA9PiBzdGF0ZSAhPT0gRU1QVFlfT0JKICYmICFzdGF0ZS5fX2lzU2NyaXB0U2V0dXAgJiYgaGFzT3duKHN0YXRlLCBrZXkpO1xuY29uc3QgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzID0ge1xuICBnZXQoeyBfOiBpbnN0YW5jZSB9LCBrZXkpIHtcbiAgICBjb25zdCB7IGN0eCwgc2V0dXBTdGF0ZSwgZGF0YSwgcHJvcHMsIGFjY2Vzc0NhY2hlLCB0eXBlLCBhcHBDb250ZXh0IH0gPSBpbnN0YW5jZTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgPT09IFwiX19pc1Z1ZVwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IG5vcm1hbGl6ZWRQcm9wcztcbiAgICBpZiAoa2V5WzBdICE9PSBcIiRcIikge1xuICAgICAgY29uc3QgbiA9IGFjY2Vzc0NhY2hlW2tleV07XG4gICAgICBpZiAobiAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHN3aXRjaCAobikge1xuICAgICAgICAgIGNhc2UgMSAvKiBTRVRVUCAqLzpcbiAgICAgICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICAgICAgY2FzZSAyIC8qIERBVEEgKi86XG4gICAgICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgICAgIGNhc2UgNCAvKiBDT05URVhUICovOlxuICAgICAgICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgICAgICAgIGNhc2UgMyAvKiBQUk9QUyAqLzpcbiAgICAgICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAxIC8qIFNFVFVQICovO1xuICAgICAgICByZXR1cm4gc2V0dXBTdGF0ZVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGRhdGEsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDIgLyogREFUQSAqLztcbiAgICAgICAgcmV0dXJuIGRhdGFba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIC8vIG9ubHkgY2FjaGUgb3RoZXIgcHJvcGVydGllcyB3aGVuIGluc3RhbmNlIGhhcyBkZWNsYXJlZCAodGh1cyBzdGFibGUpXG4gICAgICAgIC8vIHByb3BzXG4gICAgICAgIChub3JtYWxpemVkUHJvcHMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pICYmIGhhc093bihub3JtYWxpemVkUHJvcHMsIGtleSlcbiAgICAgICkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMyAvKiBQUk9QUyAqLztcbiAgICAgICAgcmV0dXJuIHByb3BzW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGN0eCAhPT0gRU1QVFlfT0JKICYmIGhhc093bihjdHgsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDQgLyogQ09OVEVYVCAqLztcbiAgICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgICAgfSBlbHNlIGlmICghX19WVUVfT1BUSU9OU19BUElfXyB8fCBzaG91bGRDYWNoZUFjY2Vzcykge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMCAvKiBPVEhFUiAqLztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHVibGljR2V0dGVyID0gcHVibGljUHJvcGVydGllc01hcFtrZXldO1xuICAgIGxldCBjc3NNb2R1bGUsIGdsb2JhbFByb3BlcnRpZXM7XG4gICAgaWYgKHB1YmxpY0dldHRlcikge1xuICAgICAgaWYgKGtleSA9PT0gXCIkYXR0cnNcIikge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwga2V5KTtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCIkc2xvdHNcIikge1xuICAgICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwga2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwdWJsaWNHZXR0ZXIoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBjc3MgbW9kdWxlIChpbmplY3RlZCBieSB2dWUtbG9hZGVyKVxuICAgICAgKGNzc01vZHVsZSA9IHR5cGUuX19jc3NNb2R1bGVzKSAmJiAoY3NzTW9kdWxlID0gY3NzTW9kdWxlW2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3NzTW9kdWxlO1xuICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDQgLyogQ09OVEVYVCAqLztcbiAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgIGdsb2JhbFByb3BlcnRpZXMgPSBhcHBDb250ZXh0LmNvbmZpZy5nbG9iYWxQcm9wZXJ0aWVzLCBoYXNPd24oZ2xvYmFsUHJvcGVydGllcywga2V5KVxuICAgICkge1xuICAgICAge1xuICAgICAgICByZXR1cm4gZ2xvYmFsUHJvcGVydGllc1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgJiYgKCFpc1N0cmluZyhrZXkpIHx8IC8vICMxMDkxIGF2b2lkIGludGVybmFsIGlzUmVmL2lzVk5vZGUgY2hlY2tzIG9uIGNvbXBvbmVudCBpbnN0YW5jZSBsZWFkaW5nXG4gICAgLy8gdG8gaW5maW5pdGUgd2FybmluZyBsb29wXG4gICAga2V5LmluZGV4T2YoXCJfX3ZcIikgIT09IDApKSB7XG4gICAgICBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gbXVzdCBiZSBhY2Nlc3NlZCB2aWEgJGRhdGEgYmVjYXVzZSBpdCBzdGFydHMgd2l0aCBhIHJlc2VydmVkIGNoYXJhY3RlciAoXCIkXCIgb3IgXCJfXCIpIGFuZCBpcyBub3QgcHJveGllZCBvbiB0aGUgcmVuZGVyIGNvbnRleHQuYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZSA9PT0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gd2FzIGFjY2Vzc2VkIGR1cmluZyByZW5kZXIgYnV0IGlzIG5vdCBkZWZpbmVkIG9uIGluc3RhbmNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHNldCh7IF86IGluc3RhbmNlIH0sIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCB7IGRhdGEsIHNldHVwU3RhdGUsIGN0eCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICBzZXR1cFN0YXRlW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgd2FybihgQ2Fubm90IG11dGF0ZSA8c2NyaXB0IHNldHVwPiBiaW5kaW5nIFwiJHtrZXl9XCIgZnJvbSBPcHRpb25zIEFQSS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGhhc093bihpbnN0YW5jZS5wcm9wcywga2V5KSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwcm9wIFwiJHtrZXl9XCIuIFByb3BzIGFyZSByZWFkb25seS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGtleVswXSA9PT0gXCIkXCIgJiYga2V5LnNsaWNlKDEpIGluIGluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwdWJsaWMgcHJvcGVydHkgXCIke2tleX1cIi4gUHJvcGVydGllcyBzdGFydGluZyB3aXRoICQgYXJlIHJlc2VydmVkIGFuZCByZWFkb25seS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgaW4gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBoYXMoe1xuICAgIF86IHsgZGF0YSwgc2V0dXBTdGF0ZSwgYWNjZXNzQ2FjaGUsIGN0eCwgYXBwQ29udGV4dCwgcHJvcHNPcHRpb25zIH1cbiAgfSwga2V5KSB7XG4gICAgbGV0IG5vcm1hbGl6ZWRQcm9wcztcbiAgICByZXR1cm4gISFhY2Nlc3NDYWNoZVtrZXldIHx8IGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSB8fCBoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSB8fCAobm9ybWFsaXplZFByb3BzID0gcHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpIHx8IGhhc093bihjdHgsIGtleSkgfHwgaGFzT3duKHB1YmxpY1Byb3BlcnRpZXNNYXAsIGtleSkgfHwgaGFzT3duKGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGtleSk7XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuZ2V0ICE9IG51bGwpIHtcbiAgICAgIHRhcmdldC5fLmFjY2Vzc0NhY2hlW2tleV0gPSAwO1xuICAgIH0gZWxzZSBpZiAoaGFzT3duKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgIHRoaXMuc2V0KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yLnZhbHVlLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuICB9XG59O1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMub3duS2V5cyA9ICh0YXJnZXQpID0+IHtcbiAgICB3YXJuKFxuICAgICAgYEF2b2lkIGFwcCBsb2dpYyB0aGF0IHJlbGllcyBvbiBlbnVtZXJhdGluZyBrZXlzIG9uIGEgY29tcG9uZW50IGluc3RhbmNlLiBUaGUga2V5cyB3aWxsIGJlIGVtcHR5IGluIHByb2R1Y3Rpb24gbW9kZSB0byBhdm9pZCBwZXJmb3JtYW5jZSBvdmVyaGVhZC5gXG4gICAgKTtcbiAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gIH07XG59XG5jb25zdCBSdW50aW1lQ29tcGlsZWRQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKFxuICB7fSxcbiAgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLFxuICB7XG4gICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSBTeW1ib2wudW5zY29wYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5nZXQodGFyZ2V0LCBrZXksIHRhcmdldCk7XG4gICAgfSxcbiAgICBoYXMoXywga2V5KSB7XG4gICAgICBjb25zdCBoYXMgPSBrZXlbMF0gIT09IFwiX1wiICYmICFpc0dsb2JhbGx5QWxsb3dlZChrZXkpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWhhcyAmJiBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMuaGFzKF8sIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IHNob3VsZCBub3Qgc3RhcnQgd2l0aCBfIHdoaWNoIGlzIGEgcmVzZXJ2ZWQgcHJlZml4IGZvciBWdWUgaW50ZXJuYWxzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXM7XG4gICAgfVxuICB9XG4pO1xuZnVuY3Rpb24gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgYF9gLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogKCkgPT4gaW5zdGFuY2VcbiAgfSk7XG4gIE9iamVjdC5rZXlzKHB1YmxpY1Byb3BlcnRpZXNNYXApLmZvckVhY2goKGtleSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6ICgpID0+IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XShpbnN0YW5jZSksXG4gICAgICAvLyBpbnRlcmNlcHRlZCBieSB0aGUgcHJveHkgc28gbm8gbmVlZCBmb3IgaW1wbGVtZW50YXRpb24sXG4gICAgICAvLyBidXQgbmVlZGVkIHRvIHByZXZlbnQgc2V0IGVycm9yc1xuICAgICAgc2V0OiBOT09QXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIGN0eCxcbiAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gIH0gPSBpbnN0YW5jZTtcbiAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgIE9iamVjdC5rZXlzKHByb3BzT3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGluc3RhbmNlLnByb3BzW2tleV0sXG4gICAgICAgIHNldDogTk9PUFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUgfSA9IGluc3RhbmNlO1xuICBPYmplY3Qua2V5cyh0b1JhdyhzZXR1cFN0YXRlKSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCkge1xuICAgICAgaWYgKGlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIFwiJFwiIG9yIFwiX1wiIHdoaWNoIGFyZSByZXNlcnZlZCBwcmVmaXhlcyBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gc2V0dXBTdGF0ZVtrZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHdhcm5SdW50aW1lVXNhZ2UgPSAobWV0aG9kKSA9PiB3YXJuKFxuICBgJHttZXRob2R9KCkgaXMgYSBjb21waWxlci1oaW50IGhlbHBlciB0aGF0IGlzIG9ubHkgdXNhYmxlIGluc2lkZSA8c2NyaXB0IHNldHVwPiBvZiBhIHNpbmdsZSBmaWxlIGNvbXBvbmVudC4gSXRzIGFyZ3VtZW50cyBzaG91bGQgYmUgY29tcGlsZWQgYXdheSBhbmQgcGFzc2luZyBpdCBhdCBydW50aW1lIGhhcyBubyBlZmZlY3QuYFxuKTtcbmZ1bmN0aW9uIGRlZmluZVByb3BzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVByb3BzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVFbWl0cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFbWl0c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lRXhwb3NlKGV4cG9zZWQpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVFeHBvc2VgKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVmaW5lT3B0aW9ucyhvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lT3B0aW9uc2ApO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVTbG90cygpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVTbG90c2ApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGVmaW5lTW9kZWwoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShcImRlZmluZU1vZGVsXCIpO1xuICB9XG59XG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocHJvcHMsIGRlZmF1bHRzKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgd2l0aERlZmF1bHRzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTbG90cygpIHtcbiAgcmV0dXJuIGdldENvbnRleHQoKS5zbG90cztcbn1cbmZ1bmN0aW9uIHVzZUF0dHJzKCkge1xuICByZXR1cm4gZ2V0Q29udGV4dCgpLmF0dHJzO1xufVxuZnVuY3Rpb24gdXNlTW9kZWwocHJvcHMsIG5hbWUsIG9wdGlvbnMpIHtcbiAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaSkge1xuICAgIHdhcm4oYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGluc3RhbmNlLmApO1xuICAgIHJldHVybiByZWYoKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaS5wcm9wc09wdGlvbnNbMF1bbmFtZV0pIHtcbiAgICB3YXJuKGB1c2VNb2RlbCgpIGNhbGxlZCB3aXRoIHByb3AgXCIke25hbWV9XCIgd2hpY2ggaXMgbm90IGRlY2xhcmVkLmApO1xuICAgIHJldHVybiByZWYoKTtcbiAgfVxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmxvY2FsKSB7XG4gICAgY29uc3QgcHJveHkgPSByZWYocHJvcHNbbmFtZV0pO1xuICAgIHdhdGNoKFxuICAgICAgKCkgPT4gcHJvcHNbbmFtZV0sXG4gICAgICAodikgPT4gcHJveHkudmFsdWUgPSB2XG4gICAgKTtcbiAgICB3YXRjaChwcm94eSwgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgIT09IHByb3BzW25hbWVdKSB7XG4gICAgICAgIGkuZW1pdChgdXBkYXRlOiR7bmFtZX1gLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBfX3ZfaXNSZWY6IHRydWUsXG4gICAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBwcm9wc1tuYW1lXTtcbiAgICAgIH0sXG4gICAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpKSB7XG4gICAgd2FybihgdXNlQ29udGV4dCgpIGNhbGxlZCB3aXRob3V0IGFjdGl2ZSBpbnN0YW5jZS5gKTtcbiAgfVxuICByZXR1cm4gaS5zZXR1cENvbnRleHQgfHwgKGkuc2V0dXBDb250ZXh0ID0gY3JlYXRlU2V0dXBDb250ZXh0KGkpKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhwcm9wcykge1xuICByZXR1cm4gaXNBcnJheShwcm9wcykgPyBwcm9wcy5yZWR1Y2UoXG4gICAgKG5vcm1hbGl6ZWQsIHApID0+IChub3JtYWxpemVkW3BdID0gbnVsbCwgbm9ybWFsaXplZCksXG4gICAge31cbiAgKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWZhdWx0cyhyYXcsIGRlZmF1bHRzKSB7XG4gIGNvbnN0IHByb3BzID0gbm9ybWFsaXplUHJvcHNPckVtaXRzKHJhdyk7XG4gIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRzKSB7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKFwiX19za2lwXCIpKVxuICAgICAgY29udGludWU7XG4gICAgbGV0IG9wdCA9IHByb3BzW2tleV07XG4gICAgaWYgKG9wdCkge1xuICAgICAgaWYgKGlzQXJyYXkob3B0KSB8fCBpc0Z1bmN0aW9uKG9wdCkpIHtcbiAgICAgICAgb3B0ID0gcHJvcHNba2V5XSA9IHsgdHlwZTogb3B0LCBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHQuZGVmYXVsdCA9IGRlZmF1bHRzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHQgPT09IG51bGwpIHtcbiAgICAgIG9wdCA9IHByb3BzW2tleV0gPSB7IGRlZmF1bHQ6IGRlZmF1bHRzW2tleV0gfTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oYHByb3BzIGRlZmF1bHQga2V5IFwiJHtrZXl9XCIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24uYCk7XG4gICAgfVxuICAgIGlmIChvcHQgJiYgZGVmYXVsdHNbYF9fc2tpcF8ke2tleX1gXSkge1xuICAgICAgb3B0LnNraXBGYWN0b3J5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VNb2RlbHMoYSwgYikge1xuICBpZiAoIWEgfHwgIWIpXG4gICAgcmV0dXJuIGEgfHwgYjtcbiAgaWYgKGlzQXJyYXkoYSkgJiYgaXNBcnJheShiKSlcbiAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gIHJldHVybiBleHRlbmQoe30sIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhhKSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb3BzUmVzdFByb3h5KHByb3BzLCBleGNsdWRlZEtleXMpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKCFleGNsdWRlZEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcHJvcHNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiB3aXRoQXN5bmNDb250ZXh0KGdldEF3YWl0YWJsZSkge1xuICBjb25zdCBjdHggPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWN0eCkge1xuICAgIHdhcm4oXG4gICAgICBgd2l0aEFzeW5jQ29udGV4dCBjYWxsZWQgd2l0aG91dCBhY3RpdmUgY3VycmVudCBpbnN0YW5jZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcuYFxuICAgICk7XG4gIH1cbiAgbGV0IGF3YWl0YWJsZSA9IGdldEF3YWl0YWJsZSgpO1xuICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoaXNQcm9taXNlKGF3YWl0YWJsZSkpIHtcbiAgICBhd2FpdGFibGUgPSBhd2FpdGFibGUuY2F0Y2goKGUpID0+IHtcbiAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShjdHgpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gW2F3YWl0YWJsZSwgKCkgPT4gc2V0Q3VycmVudEluc3RhbmNlKGN0eCldO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkge1xuICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKHR5cGUsIGtleSkgPT4ge1xuICAgIGlmIChjYWNoZVtrZXldKSB7XG4gICAgICB3YXJuKGAke3R5cGV9IHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluICR7Y2FjaGVba2V5XX0uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlW2tleV0gPSB0eXBlO1xuICAgIH1cbiAgfTtcbn1cbmxldCBzaG91bGRDYWNoZUFjY2VzcyA9IHRydWU7XG5mdW5jdGlvbiBhcHBseU9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVNZXJnZWRPcHRpb25zKGluc3RhbmNlKTtcbiAgY29uc3QgcHVibGljVGhpcyA9IGluc3RhbmNlLnByb3h5O1xuICBjb25zdCBjdHggPSBpbnN0YW5jZS5jdHg7XG4gIHNob3VsZENhY2hlQWNjZXNzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmJlZm9yZUNyZWF0ZSkge1xuICAgIGNhbGxIb29rKG9wdGlvbnMuYmVmb3JlQ3JlYXRlLCBpbnN0YW5jZSwgXCJiY1wiKTtcbiAgfVxuICBjb25zdCB7XG4gICAgLy8gc3RhdGVcbiAgICBkYXRhOiBkYXRhT3B0aW9ucyxcbiAgICBjb21wdXRlZDogY29tcHV0ZWRPcHRpb25zLFxuICAgIG1ldGhvZHMsXG4gICAgd2F0Y2g6IHdhdGNoT3B0aW9ucyxcbiAgICBwcm92aWRlOiBwcm92aWRlT3B0aW9ucyxcbiAgICBpbmplY3Q6IGluamVjdE9wdGlvbnMsXG4gICAgLy8gbGlmZWN5Y2xlXG4gICAgY3JlYXRlZCxcbiAgICBiZWZvcmVNb3VudCxcbiAgICBtb3VudGVkLFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICB1cGRhdGVkLFxuICAgIGFjdGl2YXRlZCxcbiAgICBkZWFjdGl2YXRlZCxcbiAgICBiZWZvcmVEZXN0cm95LFxuICAgIGJlZm9yZVVubW91bnQsXG4gICAgZGVzdHJveWVkLFxuICAgIHVubW91bnRlZCxcbiAgICByZW5kZXIsXG4gICAgcmVuZGVyVHJhY2tlZCxcbiAgICByZW5kZXJUcmlnZ2VyZWQsXG4gICAgZXJyb3JDYXB0dXJlZCxcbiAgICBzZXJ2ZXJQcmVmZXRjaCxcbiAgICAvLyBwdWJsaWMgQVBJXG4gICAgZXhwb3NlLFxuICAgIGluaGVyaXRBdHRycyxcbiAgICAvLyBhc3NldHNcbiAgICBjb21wb25lbnRzLFxuICAgIGRpcmVjdGl2ZXMsXG4gICAgZmlsdGVyc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSA6IG51bGw7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgW3Byb3BzT3B0aW9uc10gPSBpbnN0YW5jZS5wcm9wc09wdGlvbnM7XG4gICAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHNPcHRpb25zKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIlByb3BzXCIgLyogUFJPUFMgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3RPcHRpb25zKSB7XG4gICAgcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMpO1xuICB9XG4gIGlmIChtZXRob2RzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWV0aG9kcykge1xuICAgICAgY29uc3QgbWV0aG9kSGFuZGxlciA9IG1ldGhvZHNba2V5XTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKG1ldGhvZEhhbmRsZXIpKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4W2tleV0gPSBtZXRob2RIYW5kbGVyLmJpbmQocHVibGljVGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJNZXRob2RzXCIgLyogTUVUSE9EUyAqLywga2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYE1ldGhvZCBcIiR7a2V5fVwiIGhhcyB0eXBlIFwiJHt0eXBlb2YgbWV0aG9kSGFuZGxlcn1cIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoZGF0YU9wdGlvbnMpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNGdW5jdGlvbihkYXRhT3B0aW9ucykpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBUaGUgZGF0YSBvcHRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uLiBQbGFpbiBvYmplY3QgdXNhZ2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gZGF0YU9wdGlvbnMuY2FsbChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1Byb21pc2UoZGF0YSkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBkYXRhKCkgcmV0dXJuZWQgYSBQcm9taXNlIC0gbm90ZSBkYXRhKCkgY2Fubm90IGJlIGFzeW5jOyBJZiB5b3UgaW50ZW5kIHRvIHBlcmZvcm0gZGF0YSBmZXRjaGluZyBiZWZvcmUgY29tcG9uZW50IHJlbmRlcnMsIHVzZSBhc3luYyBzZXR1cCgpICsgPFN1c3BlbnNlPi5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYGRhdGEoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuZGF0YSA9IHJlYWN0aXZlKGRhdGEpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkRhdGFcIiAvKiBEQVRBICovLCBrZXkpO1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQ6ICgpID0+IGRhdGFba2V5XSxcbiAgICAgICAgICAgICAgc2V0OiBOT09QXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSB0cnVlO1xuICBpZiAoY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCBvcHQgPSBjb21wdXRlZE9wdGlvbnNba2V5XTtcbiAgICAgIGNvbnN0IGdldCA9IGlzRnVuY3Rpb24ob3B0KSA/IG9wdC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogaXNGdW5jdGlvbihvcHQuZ2V0KSA/IG9wdC5nZXQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IE5PT1A7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBnZXQgPT09IE5PT1ApIHtcbiAgICAgICAgd2FybihgQ29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBoYXMgbm8gZ2V0dGVyLmApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2V0ID0gIWlzRnVuY3Rpb24ob3B0KSAmJiBpc0Z1bmN0aW9uKG9wdC5zZXQpID8gb3B0LnNldC5iaW5kKHB1YmxpY1RoaXMpIDogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/ICgpID0+IHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBpcyByZWFkb25seS5gXG4gICAgICAgICk7XG4gICAgICB9IDogTk9PUDtcbiAgICAgIGNvbnN0IGMgPSBjb21wdXRlZCh7XG4gICAgICAgIGdldCxcbiAgICAgICAgc2V0XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gYy52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gYy52YWx1ZSA9IHZcbiAgICAgIH0pO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiQ29tcHV0ZWRcIiAvKiBDT01QVVRFRCAqLywga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHdhdGNoT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHdhdGNoT3B0aW9ucykge1xuICAgICAgY3JlYXRlV2F0Y2hlcih3YXRjaE9wdGlvbnNba2V5XSwgY3R4LCBwdWJsaWNUaGlzLCBrZXkpO1xuICAgIH1cbiAgfVxuICBpZiAocHJvdmlkZU9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm92aWRlcyA9IGlzRnVuY3Rpb24ocHJvdmlkZU9wdGlvbnMpID8gcHJvdmlkZU9wdGlvbnMuY2FsbChwdWJsaWNUaGlzKSA6IHByb3ZpZGVPcHRpb25zO1xuICAgIFJlZmxlY3Qub3duS2V5cyhwcm92aWRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBwcm92aWRlKGtleSwgcHJvdmlkZXNba2V5XSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGNyZWF0ZWQpIHtcbiAgICBjYWxsSG9vayhjcmVhdGVkLCBpbnN0YW5jZSwgXCJjXCIpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhyZWdpc3RlciwgaG9vaykge1xuICAgIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgICBob29rLmZvckVhY2goKF9ob29rKSA9PiByZWdpc3RlcihfaG9vay5iaW5kKHB1YmxpY1RoaXMpKSk7XG4gICAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgICByZWdpc3Rlcihob29rLmJpbmQocHVibGljVGhpcykpO1xuICAgIH1cbiAgfVxuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVNb3VudCwgYmVmb3JlTW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Nb3VudGVkLCBtb3VudGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlVXBkYXRlLCBiZWZvcmVVcGRhdGUpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25VcGRhdGVkLCB1cGRhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQWN0aXZhdGVkLCBhY3RpdmF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25EZWFjdGl2YXRlZCwgZGVhY3RpdmF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25FcnJvckNhcHR1cmVkLCBlcnJvckNhcHR1cmVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uUmVuZGVyVHJhY2tlZCwgcmVuZGVyVHJhY2tlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyaWdnZXJlZCwgcmVuZGVyVHJpZ2dlcmVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlVW5tb3VudCwgYmVmb3JlVW5tb3VudCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblVubW91bnRlZCwgdW5tb3VudGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uU2VydmVyUHJlZmV0Y2gsIHNlcnZlclByZWZldGNoKTtcbiAgaWYgKGlzQXJyYXkoZXhwb3NlKSkge1xuICAgIGlmIChleHBvc2UubGVuZ3RoKSB7XG4gICAgICBjb25zdCBleHBvc2VkID0gaW5zdGFuY2UuZXhwb3NlZCB8fCAoaW5zdGFuY2UuZXhwb3NlZCA9IHt9KTtcbiAgICAgIGV4cG9zZS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9zZWQsIGtleSwge1xuICAgICAgICAgIGdldDogKCkgPT4gcHVibGljVGhpc1trZXldLFxuICAgICAgICAgIHNldDogKHZhbCkgPT4gcHVibGljVGhpc1trZXldID0gdmFsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgaW5zdGFuY2UuZXhwb3NlZCA9IHt9O1xuICAgIH1cbiAgfVxuICBpZiAocmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCkge1xuICAgIGluc3RhbmNlLnJlbmRlciA9IHJlbmRlcjtcbiAgfVxuICBpZiAoaW5oZXJpdEF0dHJzICE9IG51bGwpIHtcbiAgICBpbnN0YW5jZS5pbmhlcml0QXR0cnMgPSBpbmhlcml0QXR0cnM7XG4gIH1cbiAgaWYgKGNvbXBvbmVudHMpXG4gICAgaW5zdGFuY2UuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7XG4gIGlmIChkaXJlY3RpdmVzKVxuICAgIGluc3RhbmNlLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSBOT09QKSB7XG4gIGlmIChpc0FycmF5KGluamVjdE9wdGlvbnMpKSB7XG4gICAgaW5qZWN0T3B0aW9ucyA9IG5vcm1hbGl6ZUluamVjdChpbmplY3RPcHRpb25zKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBpbmplY3RPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gaW5qZWN0T3B0aW9uc1trZXldO1xuICAgIGxldCBpbmplY3RlZDtcbiAgICBpZiAoaXNPYmplY3Qob3B0KSkge1xuICAgICAgaWYgKFwiZGVmYXVsdFwiIGluIG9wdCkge1xuICAgICAgICBpbmplY3RlZCA9IGluamVjdChcbiAgICAgICAgICBvcHQuZnJvbSB8fCBrZXksXG4gICAgICAgICAgb3B0LmRlZmF1bHQsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIHRyZWF0IGRlZmF1bHQgZnVuY3Rpb24gYXMgZmFjdG9yeSAqL1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0LmZyb20gfHwga2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVmKGluamVjdGVkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbmplY3RlZC52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gaW5qZWN0ZWQudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4W2tleV0gPSBpbmplY3RlZDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkluamVjdFwiIC8qIElOSkVDVCAqLywga2V5KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxIb29rKGhvb2ssIGluc3RhbmNlLCB0eXBlKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgIGlzQXJyYXkoaG9vaykgPyBob29rLm1hcCgoaCkgPT4gaC5iaW5kKGluc3RhbmNlLnByb3h5KSkgOiBob29rLmJpbmQoaW5zdGFuY2UucHJveHkpLFxuICAgIGluc3RhbmNlLFxuICAgIHR5cGVcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIocmF3LCBjdHgsIHB1YmxpY1RoaXMsIGtleSkge1xuICBjb25zdCBnZXR0ZXIgPSBrZXkuaW5jbHVkZXMoXCIuXCIpID8gY3JlYXRlUGF0aEdldHRlcihwdWJsaWNUaGlzLCBrZXkpIDogKCkgPT4gcHVibGljVGhpc1trZXldO1xuICBpZiAoaXNTdHJpbmcocmF3KSkge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBjdHhbcmF3XTtcbiAgICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyKTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXd9XCJgLCBoYW5kbGVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihyYXcpKSB7XG4gICAgd2F0Y2goZ2V0dGVyLCByYXcuYmluZChwdWJsaWNUaGlzKSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QocmF3KSkge1xuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgIHJhdy5mb3JFYWNoKChyKSA9PiBjcmVhdGVXYXRjaGVyKHIsIGN0eCwgcHVibGljVGhpcywga2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBpc0Z1bmN0aW9uKHJhdy5oYW5kbGVyKSA/IHJhdy5oYW5kbGVyLmJpbmQocHVibGljVGhpcykgOiBjdHhbcmF3LmhhbmRsZXJdO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyLCByYXcpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4oYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXcuaGFuZGxlcn1cImAsIGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybihgSW52YWxpZCB3YXRjaCBvcHRpb246IFwiJHtrZXl9XCJgLCByYXcpO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkge1xuICBjb25zdCBiYXNlID0gaW5zdGFuY2UudHlwZTtcbiAgY29uc3QgeyBtaXhpbnMsIGV4dGVuZHM6IGV4dGVuZHNPcHRpb25zIH0gPSBiYXNlO1xuICBjb25zdCB7XG4gICAgbWl4aW5zOiBnbG9iYWxNaXhpbnMsXG4gICAgb3B0aW9uc0NhY2hlOiBjYWNoZSxcbiAgICBjb25maWc6IHsgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzIH1cbiAgfSA9IGluc3RhbmNlLmFwcENvbnRleHQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChiYXNlKTtcbiAgbGV0IHJlc29sdmVkO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmVzb2x2ZWQgPSBjYWNoZWQ7XG4gIH0gZWxzZSBpZiAoIWdsb2JhbE1peGlucy5sZW5ndGggJiYgIW1peGlucyAmJiAhZXh0ZW5kc09wdGlvbnMpIHtcbiAgICB7XG4gICAgICByZXNvbHZlZCA9IGJhc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc29sdmVkID0ge307XG4gICAgaWYgKGdsb2JhbE1peGlucy5sZW5ndGgpIHtcbiAgICAgIGdsb2JhbE1peGlucy5mb3JFYWNoKFxuICAgICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBtLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMsIHRydWUpXG4gICAgICApO1xuICAgIH1cbiAgICBtZXJnZU9wdGlvbnMocmVzb2x2ZWQsIGJhc2UsIG9wdGlvbk1lcmdlU3RyYXRlZ2llcyk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KGJhc2UpKSB7XG4gICAgY2FjaGUuc2V0KGJhc2UsIHJlc29sdmVkKTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5mdW5jdGlvbiBtZXJnZU9wdGlvbnModG8sIGZyb20sIHN0cmF0cywgYXNNaXhpbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gZnJvbTtcbiAgaWYgKGV4dGVuZHNPcHRpb25zKSB7XG4gICAgbWVyZ2VPcHRpb25zKHRvLCBleHRlbmRzT3B0aW9ucywgc3RyYXRzLCB0cnVlKTtcbiAgfVxuICBpZiAobWl4aW5zKSB7XG4gICAgbWl4aW5zLmZvckVhY2goXG4gICAgICAobSkgPT4gbWVyZ2VPcHRpb25zKHRvLCBtLCBzdHJhdHMsIHRydWUpXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgaWYgKGFzTWl4aW4gJiYga2V5ID09PSBcImV4cG9zZVwiKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgIGBcImV4cG9zZVwiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIEl0IHNob3VsZCBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBiYXNlIGNvbXBvbmVudCBpdHNlbGYuYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyYXQgPSBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzW2tleV0gfHwgc3RyYXRzICYmIHN0cmF0c1trZXldO1xuICAgICAgdG9ba2V5XSA9IHN0cmF0ID8gc3RyYXQodG9ba2V5XSwgZnJvbVtrZXldKSA6IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuY29uc3QgaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyA9IHtcbiAgZGF0YTogbWVyZ2VEYXRhRm4sXG4gIHByb3BzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIGVtaXRzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIC8vIG9iamVjdHNcbiAgbWV0aG9kczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBjb21wdXRlZDogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyBsaWZlY3ljbGVcbiAgYmVmb3JlQ3JlYXRlOiBtZXJnZUFzQXJyYXksXG4gIGNyZWF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlTW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgbW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVcGRhdGU6IG1lcmdlQXNBcnJheSxcbiAgdXBkYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVEZXN0cm95OiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVubW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgZGVzdHJveWVkOiBtZXJnZUFzQXJyYXksXG4gIHVubW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZGVhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZXJyb3JDYXB0dXJlZDogbWVyZ2VBc0FycmF5LFxuICBzZXJ2ZXJQcmVmZXRjaDogbWVyZ2VBc0FycmF5LFxuICAvLyBhc3NldHNcbiAgY29tcG9uZW50czogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBkaXJlY3RpdmVzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIHdhdGNoXG4gIHdhdGNoOiBtZXJnZVdhdGNoT3B0aW9ucyxcbiAgLy8gcHJvdmlkZSAvIGluamVjdFxuICBwcm92aWRlOiBtZXJnZURhdGFGbixcbiAgaW5qZWN0OiBtZXJnZUluamVjdFxufTtcbmZ1bmN0aW9uIG1lcmdlRGF0YUZuKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkge1xuICAgIHJldHVybiB0bztcbiAgfVxuICBpZiAoIXRvKSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbigpIHtcbiAgICByZXR1cm4gKGV4dGVuZCkoXG4gICAgICBpc0Z1bmN0aW9uKHRvKSA/IHRvLmNhbGwodGhpcywgdGhpcykgOiB0byxcbiAgICAgIGlzRnVuY3Rpb24oZnJvbSkgPyBmcm9tLmNhbGwodGhpcywgdGhpcykgOiBmcm9tXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlSW5qZWN0KHRvLCBmcm9tKSB7XG4gIHJldHVybiBtZXJnZU9iamVjdE9wdGlvbnMobm9ybWFsaXplSW5qZWN0KHRvKSwgbm9ybWFsaXplSW5qZWN0KGZyb20pKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdChyYXcpIHtcbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbcmF3W2ldXSA9IHJhd1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IFsuLi5uZXcgU2V0KFtdLmNvbmNhdCh0bywgZnJvbSkpXSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZU9iamVjdE9wdGlvbnModG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0bywgZnJvbSkgOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICh0bykge1xuICAgIGlmIChpc0FycmF5KHRvKSAmJiBpc0FycmF5KGZyb20pKSB7XG4gICAgICByZXR1cm4gWy4uLi8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi50bywgLi4uZnJvbV0pXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuZChcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKHRvKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhmcm9tICE9IG51bGwgPyBmcm9tIDoge30pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VXYXRjaE9wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKCF0bylcbiAgICByZXR1cm4gZnJvbTtcbiAgaWYgKCFmcm9tKVxuICAgIHJldHVybiB0bztcbiAgY29uc3QgbWVyZ2VkID0gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0byk7XG4gIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICBtZXJnZWRba2V5XSA9IG1lcmdlQXNBcnJheSh0b1trZXldLCBmcm9tW2tleV0pO1xuICB9XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFwcENvbnRleHQoKSB7XG4gIHJldHVybiB7XG4gICAgYXBwOiBudWxsLFxuICAgIGNvbmZpZzoge1xuICAgICAgaXNOYXRpdmVUYWc6IE5PLFxuICAgICAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuICAgICAgZ2xvYmFsUHJvcGVydGllczoge30sXG4gICAgICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IHt9LFxuICAgICAgZXJyb3JIYW5kbGVyOiB2b2lkIDAsXG4gICAgICB3YXJuSGFuZGxlcjogdm9pZCAwLFxuICAgICAgY29tcGlsZXJPcHRpb25zOiB7fVxuICAgIH0sXG4gICAgbWl4aW5zOiBbXSxcbiAgICBjb21wb25lbnRzOiB7fSxcbiAgICBkaXJlY3RpdmVzOiB7fSxcbiAgICBwcm92aWRlczogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgb3B0aW9uc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBwcm9wc0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICBlbWl0c0NhY2hlOiAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKVxuICB9O1xufVxubGV0IHVpZCQxID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUFwcChyb290Q29tcG9uZW50LCByb290UHJvcHMgPSBudWxsKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKHJvb3RDb21wb25lbnQpKSB7XG4gICAgICByb290Q29tcG9uZW50ID0gZXh0ZW5kKHt9LCByb290Q29tcG9uZW50KTtcbiAgICB9XG4gICAgaWYgKHJvb3RQcm9wcyAhPSBudWxsICYmICFpc09iamVjdChyb290UHJvcHMpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHJvb3QgcHJvcHMgcGFzc2VkIHRvIGFwcC5tb3VudCgpIG11c3QgYmUgYW4gb2JqZWN0LmApO1xuICAgICAgcm9vdFByb3BzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUFwcENvbnRleHQoKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHQuY29uZmlnLCBcInVud3JhcEluamVjdGVkUmVmXCIsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBhcHAuY29uZmlnLnVud3JhcEluamVjdGVkUmVmIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIDMuMyBub3cgYWx3YXlzIHVud3JhcHMgaW5qZWN0ZWQgcmVmcyBpbiBPcHRpb25zIEFQSS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbGxlZFBsdWdpbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICBsZXQgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY29uc3QgYXBwID0gY29udGV4dC5hcHAgPSB7XG4gICAgICBfdWlkOiB1aWQkMSsrLFxuICAgICAgX2NvbXBvbmVudDogcm9vdENvbXBvbmVudCxcbiAgICAgIF9wcm9wczogcm9vdFByb3BzLFxuICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2luc3RhbmNlOiBudWxsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNvbmZpZztcbiAgICAgIH0sXG4gICAgICBzZXQgY29uZmlnKHYpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYGFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2UocGx1Z2luLCAuLi5vcHRpb25zKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmhhcyhwbHVnaW4pKSB7XG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBQbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRhcmdldCBhcHAuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGx1Z2luICYmIGlzRnVuY3Rpb24ocGx1Z2luLmluc3RhbGwpKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5hZGQocGx1Z2luKTtcbiAgICAgICAgICBwbHVnaW4uaW5zdGFsbChhcHAsIC4uLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocGx1Z2luKSkge1xuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMuYWRkKHBsdWdpbik7XG4gICAgICAgICAgcGx1Z2luKGFwcCwgLi4ub3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiBcImluc3RhbGxcIiBmdW5jdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1peGluKG1peGluKSB7XG4gICAgICAgIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fKSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1peGlucy5pbmNsdWRlcyhtaXhpbikpIHtcbiAgICAgICAgICAgIGNvbnRleHQubWl4aW5zLnB1c2gobWl4aW4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgXCJNaXhpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcFwiICsgKG1peGluLm5hbWUgPyBgOiAke21peGluLm5hbWV9YCA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybihcIk1peGlucyBhcmUgb25seSBhdmFpbGFibGUgaW4gYnVpbGRzIHN1cHBvcnRpbmcgT3B0aW9ucyBBUElcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBjb21wb25lbnQobmFtZSwgY29tcG9uZW50KSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUsIGNvbnRleHQuY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5jb21wb25lbnRzW25hbWVdKSB7XG4gICAgICAgICAgd2FybihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSA9IGNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBkaXJlY3RpdmUobmFtZSwgZGlyZWN0aXZlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuKGBEaXJlY3RpdmUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdID0gZGlyZWN0aXZlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1vdW50KHJvb3RDb250YWluZXIsIGlzSHlkcmF0ZSwgaXNTVkcpIHtcbiAgICAgICAgaWYgKCFpc01vdW50ZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBgVGhlcmUgaXMgYWxyZWFkeSBhbiBhcHAgaW5zdGFuY2UgbW91bnRlZCBvbiB0aGUgaG9zdCBjb250YWluZXIuXG4gSWYgeW91IHdhbnQgdG8gbW91bnQgYW5vdGhlciBhcHAgb24gdGhlIHNhbWUgaG9zdCBjb250YWluZXIsIHlvdSBuZWVkIHRvIHVubW91bnQgdGhlIHByZXZpb3VzIGFwcCBieSBjYWxsaW5nIFxcYGFwcC51bm1vdW50KClcXGAgZmlyc3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShyb290Q29tcG9uZW50LCByb290UHJvcHMpO1xuICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlbG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVuZGVyKGNsb25lVk5vZGUodm5vZGUpLCByb290Q29udGFpbmVyLCBpc1NWRyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIeWRyYXRlICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodm5vZGUsIHJvb3RDb250YWluZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIGlzU1ZHKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgICBhcHAuX2NvbnRhaW5lciA9IHJvb3RDb250YWluZXI7XG4gICAgICAgICAgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXyA9IGFwcDtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICAgIGFwcC5faW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICBkZXZ0b29sc0luaXRBcHAoYXBwLCB2ZXJzaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdldEV4cG9zZVByb3h5KHZub2RlLmNvbXBvbmVudCkgfHwgdm5vZGUuY29tcG9uZW50LnByb3h5O1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgYEFwcCBoYXMgYWxyZWFkeSBiZWVuIG1vdW50ZWQuXG5JZiB5b3Ugd2FudCB0byByZW1vdW50IHRoZSBzYW1lIGFwcCwgbW92ZSB5b3VyIGFwcCBjcmVhdGlvbiBsb2dpYyBpbnRvIGEgZmFjdG9yeSBmdW5jdGlvbiBhbmQgY3JlYXRlIGZyZXNoIGFwcCBpbnN0YW5jZXMgZm9yIGVhY2ggbW91bnQgLSBlLmcuIFxcYGNvbnN0IGNyZWF0ZU15QXBwID0gKCkgPT4gY3JlYXRlQXBwKEFwcClcXGBgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVubW91bnQoKSB7XG4gICAgICAgIGlmIChpc01vdW50ZWQpIHtcbiAgICAgICAgICByZW5kZXIobnVsbCwgYXBwLl9jb250YWluZXIpO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICBkZXZ0b29sc1VubW91bnRBcHAoYXBwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFwcC5fY29udGFpbmVyLl9fdnVlX2FwcF9fO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGBDYW5ub3QgdW5tb3VudCBhbiBhcHAgdGhhdCBpcyBub3QgbW91bnRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3ZpZGUoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgaW4gY29udGV4dC5wcm92aWRlcykge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgQXBwIGFscmVhZHkgcHJvdmlkZXMgcHJvcGVydHkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyB2YWx1ZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnByb3ZpZGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBydW5XaXRoQ29udGV4dChmbikge1xuICAgICAgICBjdXJyZW50QXBwID0gYXBwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGN1cnJlbnRBcHAgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBwO1xuICB9O1xufVxubGV0IGN1cnJlbnRBcHAgPSBudWxsO1xuXG5mdW5jdGlvbiBwcm92aWRlKGtleSwgdmFsdWUpIHtcbiAgaWYgKCFjdXJyZW50SW5zdGFuY2UpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihgcHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcztcbiAgICBjb25zdCBwYXJlbnRQcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQgJiYgY3VycmVudEluc3RhbmNlLnBhcmVudC5wcm92aWRlcztcbiAgICBpZiAocGFyZW50UHJvdmlkZXMgPT09IHByb3ZpZGVzKSB7XG4gICAgICBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdmlkZXMpO1xuICAgIH1cbiAgICBwcm92aWRlc1trZXldID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdChrZXksIGRlZmF1bHRWYWx1ZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5ID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UgfHwgY3VycmVudEFwcCkge1xuICAgIGNvbnN0IHByb3ZpZGVzID0gaW5zdGFuY2UgPyBpbnN0YW5jZS5wYXJlbnQgPT0gbnVsbCA/IGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQgJiYgaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlcyA6IGluc3RhbmNlLnBhcmVudC5wcm92aWRlcyA6IGN1cnJlbnRBcHAuX2NvbnRleHQucHJvdmlkZXM7XG4gICAgaWYgKHByb3ZpZGVzICYmIGtleSBpbiBwcm92aWRlcykge1xuICAgICAgcmV0dXJuIHByb3ZpZGVzW2tleV07XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUuY2FsbChpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKGBpbmplY3Rpb24gXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZC5gKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oYGluamVjdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkgb3IgZnVuY3Rpb25hbCBjb21wb25lbnRzLmApO1xuICB9XG59XG5mdW5jdGlvbiBoYXNJbmplY3Rpb25Db250ZXh0KCkge1xuICByZXR1cm4gISEoY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB8fCBjdXJyZW50QXBwKTtcbn1cblxuZnVuY3Rpb24gaW5pdFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IgPSBmYWxzZSkge1xuICBjb25zdCBwcm9wcyA9IHt9O1xuICBjb25zdCBhdHRycyA9IHt9O1xuICBkZWYoYXR0cnMsIEludGVybmFsT2JqZWN0S2V5LCAxKTtcbiAgaW5zdGFuY2UucHJvcHNEZWZhdWx0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICBwcm9wc1trZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKGlzU3RhdGVmdWwpIHtcbiAgICBpbnN0YW5jZS5wcm9wcyA9IGlzU1NSID8gcHJvcHMgOiBzaGFsbG93UmVhY3RpdmUocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW5zdGFuY2UudHlwZS5wcm9wcykge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBhdHRycztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBwcm9wcztcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYXR0cnMgPSBhdHRycztcbn1cbmZ1bmN0aW9uIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIHdoaWxlIChpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS50eXBlLl9faG1ySWQpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlLnBhcmVudDtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCByYXdQcmV2UHJvcHMsIG9wdGltaXplZCkge1xuICBjb25zdCB7XG4gICAgcHJvcHMsXG4gICAgYXR0cnMsXG4gICAgdm5vZGU6IHsgcGF0Y2hGbGFnIH1cbiAgfSA9IGluc3RhbmNlO1xuICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IFtvcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBpZiAoXG4gICAgLy8gYWx3YXlzIGZvcmNlIGZ1bGwgZGlmZiBpbiBkZXZcbiAgICAvLyAtICMxOTQyIGlmIGhtciBpcyBlbmFibGVkIHdpdGggc2ZjIGNvbXBvbmVudFxuICAgIC8vIC0gdml0ZSM4NzIgbm9uLXNmYyBjb21wb25lbnQgdXNlZCBieSBzZmMgY29tcG9uZW50XG4gICAgISghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSkgJiYgKG9wdGltaXplZCB8fCBwYXRjaEZsYWcgPiAwKSAmJiAhKHBhdGNoRmxhZyAmIDE2KVxuICApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgcHJvcHNUb1VwZGF0ZSA9IGluc3RhbmNlLnZub2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHNUb1VwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQga2V5ID0gcHJvcHNUb1VwZGF0ZVtpXTtcbiAgICAgICAgaWYgKGlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaGFzT3duKGF0dHJzLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgICAgICAgcHJvcHNbY2FtZWxpemVkS2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAgY2FtZWxpemVkS2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgIC8qIGlzQWJzZW50ICovXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpKSB7XG4gICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQga2ViYWJLZXk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBpZiAoIXJhd1Byb3BzIHx8IC8vIGZvciBjYW1lbENhc2VcbiAgICAgICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgLy8gaXQncyBwb3NzaWJsZSB0aGUgb3JpZ2luYWwgcHJvcHMgd2FzIHBhc3NlZCBpbiBhcyBrZWJhYi1jYXNlXG4gICAgICAvLyBhbmQgY29udmVydGVkIHRvIGNhbWVsQ2FzZSAoIzk1NSlcbiAgICAgICgoa2ViYWJLZXkgPSBoeXBoZW5hdGUoa2V5KSkgPT09IGtleSB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZWJhYktleSkpKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKHJhd1ByZXZQcm9wcyAmJiAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAgICAgKHJhd1ByZXZQcm9wc1trZXldICE9PSB2b2lkIDAgfHwgLy8gZm9yIGtlYmFiLWNhc2VcbiAgICAgICAgICByYXdQcmV2UHJvcHNba2ViYWJLZXldICE9PSB2b2lkIDApKSB7XG4gICAgICAgICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgLyogaXNBYnNlbnQgKi9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdHRycyAhPT0gcmF3Q3VycmVudFByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoIXJhd1Byb3BzIHx8ICFoYXNPd24ocmF3UHJvcHMsIGtleSkgJiYgdHJ1ZSkge1xuICAgICAgICAgIGRlbGV0ZSBhdHRyc1trZXldO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGhhc0F0dHJzQ2hhbmdlZCkge1xuICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJGF0dHJzXCIpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgdmFsaWRhdGVQcm9wcyhyYXdQcm9wcyB8fCB7fSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSB7XG4gIGNvbnN0IFtvcHRpb25zLCBuZWVkQ2FzdEtleXNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCByYXdDYXN0VmFsdWVzO1xuICBpZiAocmF3UHJvcHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gcmF3UHJvcHMpIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgbGV0IGNhbWVsS2V5O1xuICAgICAgaWYgKG9wdGlvbnMgJiYgaGFzT3duKG9wdGlvbnMsIGNhbWVsS2V5ID0gY2FtZWxpemUoa2V5KSkpIHtcbiAgICAgICAgaWYgKCFuZWVkQ2FzdEtleXMgfHwgIW5lZWRDYXN0S2V5cy5pbmNsdWRlcyhjYW1lbEtleSkpIHtcbiAgICAgICAgICBwcm9wc1tjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAocmF3Q2FzdFZhbHVlcyB8fCAocmF3Q2FzdFZhbHVlcyA9IHt9KSlbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWlzRW1pdExpc3RlbmVyKGluc3RhbmNlLmVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gYXR0cnMpIHx8IHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG5lZWRDYXN0S2V5cykge1xuICAgIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICBjb25zdCBjYXN0VmFsdWVzID0gcmF3Q2FzdFZhbHVlcyB8fCBFTVBUWV9PQko7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZWVkQ2FzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG5lZWRDYXN0S2V5c1tpXTtcbiAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgIGtleSxcbiAgICAgICAgY2FzdFZhbHVlc1trZXldLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgIWhhc093bihjYXN0VmFsdWVzLCBrZXkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQXR0cnNDaGFuZ2VkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVByb3BWYWx1ZShvcHRpb25zLCBwcm9wcywga2V5LCB2YWx1ZSwgaW5zdGFuY2UsIGlzQWJzZW50KSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgaWYgKG9wdCAhPSBudWxsKSB7XG4gICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHQsIFwiZGVmYXVsdFwiKTtcbiAgICBpZiAoaGFzRGVmYXVsdCAmJiB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBvcHQuZGVmYXVsdDtcbiAgICAgIGlmIChvcHQudHlwZSAhPT0gRnVuY3Rpb24gJiYgIW9wdC5za2lwRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wc0RlZmF1bHRzIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGtleSBpbiBwcm9wc0RlZmF1bHRzKSB7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICB2YWx1ZSA9IHByb3BzRGVmYXVsdHNba2V5XSA9IGRlZmF1bHRWYWx1ZS5jYWxsKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdFswIC8qIHNob3VsZENhc3QgKi9dKSB7XG4gICAgICBpZiAoaXNBYnNlbnQgJiYgIWhhc0RlZmF1bHQpIHtcbiAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0WzEgLyogc2hvdWxkQ2FzdFRydWUgKi9dICYmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpKSB7XG4gICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHNPcHRpb25zKGNvbXAsIGFwcENvbnRleHQsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCBjYWNoZSA9IGFwcENvbnRleHQucHJvcHNDYWNoZTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNvbXApO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLnByb3BzO1xuICBjb25zdCBub3JtYWxpemVkID0ge307XG4gIGNvbnN0IG5lZWRDYXN0S2V5cyA9IFtdO1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZFByb3BzID0gKHJhdzIpID0+IHtcbiAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgY29uc3QgW3Byb3BzLCBrZXlzXSA9IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyhyYXcyLCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgIGV4dGVuZChub3JtYWxpemVkLCBwcm9wcyk7XG4gICAgICBpZiAoa2V5cylcbiAgICAgICAgbmVlZENhc3RLZXlzLnB1c2goLi4ua2V5cyk7XG4gICAgfTtcbiAgICBpZiAoIWFzTWl4aW4gJiYgYXBwQ29udGV4dC5taXhpbnMubGVuZ3RoKSB7XG4gICAgICBhcHBDb250ZXh0Lm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAuZXh0ZW5kcykge1xuICAgICAgZXh0ZW5kUHJvcHMoY29tcC5leHRlbmRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAubWl4aW5zKSB7XG4gICAgICBjb21wLm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyYXcgJiYgIWhhc0V4dGVuZHMpIHtcbiAgICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICAgIGNhY2hlLnNldChjb21wLCBFTVBUWV9BUlIpO1xuICAgIH1cbiAgICByZXR1cm4gRU1QVFlfQVJSO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzU3RyaW5nKHJhd1tpXSkpIHtcbiAgICAgICAgd2FybihgcHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LmAsIHJhd1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUocmF3W2ldKTtcbiAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplZEtleV0gPSBFTVBUWV9PQko7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHJhdykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChyYXcpKSB7XG4gICAgICB3YXJuKGBpbnZhbGlkIHByb3BzIG9wdGlvbnNgLCByYXcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXcpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgaWYgKHZhbGlkYXRlUHJvcE5hbWUobm9ybWFsaXplZEtleSkpIHtcbiAgICAgICAgY29uc3Qgb3B0ID0gcmF3W2tleV07XG4gICAgICAgIGNvbnN0IHByb3AgPSBub3JtYWxpemVkW25vcm1hbGl6ZWRLZXldID0gaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSA/IHsgdHlwZTogb3B0IH0gOiBleHRlbmQoe30sIG9wdCk7XG4gICAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgICAgY29uc3QgYm9vbGVhbkluZGV4ID0gZ2V0VHlwZUluZGV4KEJvb2xlYW4sIHByb3AudHlwZSk7XG4gICAgICAgICAgY29uc3Qgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgICAgIHByb3BbMCAvKiBzaG91bGRDYXN0ICovXSA9IGJvb2xlYW5JbmRleCA+IC0xO1xuICAgICAgICAgIHByb3BbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gPSBzdHJpbmdJbmRleCA8IDAgfHwgYm9vbGVhbkluZGV4IDwgc3RyaW5nSW5kZXg7XG4gICAgICAgICAgaWYgKGJvb2xlYW5JbmRleCA+IC0xIHx8IGhhc093bihwcm9wLCBcImRlZmF1bHRcIikpIHtcbiAgICAgICAgICAgIG5lZWRDYXN0S2V5cy5wdXNoKG5vcm1hbGl6ZWRLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCByZXMgPSBbbm9ybWFsaXplZCwgbmVlZENhc3RLZXlzXTtcbiAgaWYgKGlzT2JqZWN0KGNvbXApKSB7XG4gICAgY2FjaGUuc2V0KGNvbXAsIHJlcyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcE5hbWUoa2V5KSB7XG4gIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oYEludmFsaWQgcHJvcCBuYW1lOiBcIiR7a2V5fVwiIGlzIGEgcmVzZXJ2ZWQgcHJvcGVydHkuYCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0VHlwZShjdG9yKSB7XG4gIGNvbnN0IG1hdGNoID0gY3RvciAmJiBjdG9yLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXFx3KykvKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMl0gOiBjdG9yID09PSBudWxsID8gXCJudWxsXCIgOiBcIlwiO1xufVxuZnVuY3Rpb24gaXNTYW1lVHlwZShhLCBiKSB7XG4gIHJldHVybiBnZXRUeXBlKGEpID09PSBnZXRUeXBlKGIpO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4KHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKGlzQXJyYXkoZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlcy5maW5kSW5kZXgoKHQpID0+IGlzU2FtZVR5cGUodCwgdHlwZSkpO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzLCBwcm9wcywgaW5zdGFuY2UpIHtcbiAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF07XG4gIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICBsZXQgb3B0ID0gb3B0aW9uc1trZXldO1xuICAgIGlmIChvcHQgPT0gbnVsbClcbiAgICAgIGNvbnRpbnVlO1xuICAgIHZhbGlkYXRlUHJvcChcbiAgICAgIGtleSxcbiAgICAgIHJlc29sdmVkVmFsdWVzW2tleV0sXG4gICAgICBvcHQsXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmICFoYXNPd24ocmF3UHJvcHMsIGh5cGhlbmF0ZShrZXkpKVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcChuYW1lLCB2YWx1ZSwgcHJvcCwgaXNBYnNlbnQpIHtcbiAgY29uc3QgeyB0eXBlLCByZXF1aXJlZCwgdmFsaWRhdG9yLCBza2lwQ2hlY2sgfSA9IHByb3A7XG4gIGlmIChyZXF1aXJlZCAmJiBpc0Fic2VudCkge1xuICAgIHdhcm4oJ01pc3NpbmcgcmVxdWlyZWQgcHJvcDogXCInICsgbmFtZSArICdcIicpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcmVxdWlyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlICE9PSB0cnVlICYmICFza2lwQ2hlY2spIHtcbiAgICBsZXQgaXNWYWxpZCA9IGZhbHNlO1xuICAgIGNvbnN0IHR5cGVzID0gaXNBcnJheSh0eXBlKSA/IHR5cGUgOiBbdHlwZV07XG4gICAgY29uc3QgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoICYmICFpc1ZhbGlkOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsaWQsIGV4cGVjdGVkVHlwZSB9ID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZXNbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGV4cGVjdGVkVHlwZSB8fCBcIlwiKTtcbiAgICAgIGlzVmFsaWQgPSB2YWxpZDtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB3YXJuKGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0b3IodmFsdWUpKSB7XG4gICAgd2FybignSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicpO1xuICB9XG59XG5jb25zdCBpc1NpbXBsZVR5cGUgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgXCJTdHJpbmcsTnVtYmVyLEJvb2xlYW4sRnVuY3Rpb24sU3ltYm9sLEJpZ0ludFwiXG4pO1xuZnVuY3Rpb24gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZSkge1xuICBsZXQgdmFsaWQ7XG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChpc1NpbXBsZVR5cGUoZXhwZWN0ZWRUeXBlKSkge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICB2YWxpZCA9IGlzT2JqZWN0KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiQXJyYXlcIikge1xuICAgIHZhbGlkID0gaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm51bGxcIikge1xuICAgIHZhbGlkID0gdmFsdWUgPT09IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYFByb3AgdHlwZSBbXSBmb3IgcHJvcCBcIiR7bmFtZX1cIiB3b24ndCBtYXRjaCBhbnl0aGluZy4gRGlkIHlvdSBtZWFuIHRvIHVzZSB0eXBlIEFycmF5IGluc3RlYWQ/YDtcbiAgfVxuICBsZXQgbWVzc2FnZSA9IGBJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJHtuYW1lfVwiLiBFeHBlY3RlZCAke2V4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oXCIgfCBcIil9YDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlc1swXTtcbiAgY29uc3QgcmVjZWl2ZWRUeXBlID0gdG9SYXdUeXBlKHZhbHVlKTtcbiAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIGV4cGVjdGVkVHlwZSk7XG4gIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBzdHlsZVZhbHVlKHZhbHVlLCByZWNlaXZlZFR5cGUpO1xuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDEgJiYgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiYgIWlzQm9vbGVhbihleHBlY3RlZFR5cGUsIHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGAgd2l0aCB2YWx1ZSAke2V4cGVjdGVkVmFsdWV9YDtcbiAgfVxuICBtZXNzYWdlICs9IGAsIGdvdCAke3JlY2VpdmVkVHlwZX0gYDtcbiAgaWYgKGlzRXhwbGljYWJsZShyZWNlaXZlZFR5cGUpKSB7XG4gICAgbWVzc2FnZSArPSBgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9LmA7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5mdW5jdGlvbiBzdHlsZVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSBcIlN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiTnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7TnVtYmVyKHZhbHVlKX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5mdW5jdGlvbiBpc0V4cGxpY2FibGUodHlwZSkge1xuICBjb25zdCBleHBsaWNpdFR5cGVzID0gW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiXTtcbiAgcmV0dXJuIGV4cGxpY2l0VHlwZXMuc29tZSgoZWxlbSkgPT4gdHlwZS50b0xvd2VyQ2FzZSgpID09PSBlbGVtKTtcbn1cbmZ1bmN0aW9uIGlzQm9vbGVhbiguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzLnNvbWUoKGVsZW0pID0+IGVsZW0udG9Mb3dlckNhc2UoKSA9PT0gXCJib29sZWFuXCIpO1xufVxuXG5jb25zdCBpc0ludGVybmFsS2V5ID0gKGtleSkgPT4ga2V5WzBdID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJHN0YWJsZVwiO1xuY29uc3Qgbm9ybWFsaXplU2xvdFZhbHVlID0gKHZhbHVlKSA9PiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWTm9kZSkgOiBbbm9ybWFsaXplVk5vZGUodmFsdWUpXTtcbmNvbnN0IG5vcm1hbGl6ZVNsb3QgPSAoa2V5LCByYXdTbG90LCBjdHgpID0+IHtcbiAgaWYgKHJhd1Nsb3QuX24pIHtcbiAgICByZXR1cm4gcmF3U2xvdDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gd2l0aEN0eCgoLi4uYXJncykgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGN1cnJlbnRJbnN0YW5jZSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFNsb3QgXCIke2tleX1cIiBpbnZva2VkIG91dHNpZGUgb2YgdGhlIHJlbmRlciBmdW5jdGlvbjogdGhpcyB3aWxsIG5vdCB0cmFjayBkZXBlbmRlbmNpZXMgdXNlZCBpbiB0aGUgc2xvdC4gSW52b2tlIHRoZSBzbG90IGZ1bmN0aW9uIGluc2lkZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVNsb3RWYWx1ZShyYXdTbG90KC4uLmFyZ3MpKTtcbiAgfSwgY3R4KTtcbiAgbm9ybWFsaXplZC5fYyA9IGZhbHNlO1xuICByZXR1cm4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBub3JtYWxpemVPYmplY3RTbG90cyA9IChyYXdTbG90cywgc2xvdHMsIGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IGN0eCA9IHJhd1Nsb3RzLl9jdHg7XG4gIGZvciAoY29uc3Qga2V5IGluIHJhd1Nsb3RzKSB7XG4gICAgaWYgKGlzSW50ZXJuYWxLZXkoa2V5KSlcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcmF3U2xvdHNba2V5XTtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHNsb3RzW2tleV0gPSBub3JtYWxpemVTbG90KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYE5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3Igc2xvdCBcIiR7a2V5fVwiLiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKHZhbHVlKTtcbiAgICAgIHNsb3RzW2tleV0gPSAoKSA9PiBub3JtYWxpemVkO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IG5vcm1hbGl6ZVZOb2RlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0tlZXBBbGl2ZShpbnN0YW5jZS52bm9kZSkgJiYgdHJ1ZSkge1xuICAgIHdhcm4oXG4gICAgICBgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBkZWZhdWx0IHNsb3QuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUoY2hpbGRyZW4pO1xuICBpbnN0YW5jZS5zbG90cy5kZWZhdWx0ID0gKCkgPT4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBpbml0U2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmIChpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cyA9IHRvUmF3KGNoaWxkcmVuKTtcbiAgICAgIGRlZihjaGlsZHJlbiwgXCJfXCIsIHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVPYmplY3RTbG90cyhcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIGluc3RhbmNlLnNsb3RzID0ge30pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5zbG90cyA9IHt9O1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgfVxuICBkZWYoaW5zdGFuY2Uuc2xvdHMsIEludGVybmFsT2JqZWN0S2V5LCAxKTtcbn07XG5jb25zdCB1cGRhdGVTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBjb25zdCB7IHZub2RlLCBzbG90cyB9ID0gaW5zdGFuY2U7XG4gIGxldCBuZWVkRGVsZXRpb25DaGVjayA9IHRydWU7XG4gIGxldCBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSBFTVBUWV9PQko7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICAgIGV4dGVuZChzbG90cywgY2hpbGRyZW4pO1xuICAgICAgICB0cmlnZ2VyKGluc3RhbmNlLCBcInNldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW1pemVkICYmIHR5cGUgPT09IDEpIHtcbiAgICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4dGVuZChzbG90cywgY2hpbGRyZW4pO1xuICAgICAgICBpZiAoIW9wdGltaXplZCAmJiB0eXBlID09PSAxKSB7XG4gICAgICAgICAgZGVsZXRlIHNsb3RzLl87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSAhY2hpbGRyZW4uJHN0YWJsZTtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKGNoaWxkcmVuLCBzbG90cyk7XG4gICAgfVxuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IHsgZGVmYXVsdDogMSB9O1xuICB9XG4gIGlmIChuZWVkRGVsZXRpb25DaGVjaykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICBpZiAoIWlzSW50ZXJuYWxLZXkoa2V5KSAmJiBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBzbG90c1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gc2V0UmVmKHJhd1JlZiwgb2xkUmF3UmVmLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIGlzVW5tb3VudCA9IGZhbHNlKSB7XG4gIGlmIChpc0FycmF5KHJhd1JlZikpIHtcbiAgICByYXdSZWYuZm9yRWFjaChcbiAgICAgIChyLCBpKSA9PiBzZXRSZWYoXG4gICAgICAgIHIsXG4gICAgICAgIG9sZFJhd1JlZiAmJiAoaXNBcnJheShvbGRSYXdSZWYpID8gb2xkUmF3UmVmW2ldIDogb2xkUmF3UmVmKSxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBpc1VubW91bnRcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpICYmICFpc1VubW91bnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVmVmFsdWUgPSB2bm9kZS5zaGFwZUZsYWcgJiA0ID8gZ2V0RXhwb3NlUHJveHkodm5vZGUuY29tcG9uZW50KSB8fCB2bm9kZS5jb21wb25lbnQucHJveHkgOiB2bm9kZS5lbDtcbiAgY29uc3QgdmFsdWUgPSBpc1VubW91bnQgPyBudWxsIDogcmVmVmFsdWU7XG4gIGNvbnN0IHsgaTogb3duZXIsIHI6IHJlZiB9ID0gcmF3UmVmO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhb3duZXIpIHtcbiAgICB3YXJuKFxuICAgICAgYE1pc3NpbmcgcmVmIG93bmVyIGNvbnRleHQuIHJlZiBjYW5ub3QgYmUgdXNlZCBvbiBob2lzdGVkIHZub2Rlcy4gQSB2bm9kZSB3aXRoIHJlZiBtdXN0IGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24uYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9sZFJlZiA9IG9sZFJhd1JlZiAmJiBvbGRSYXdSZWYucjtcbiAgY29uc3QgcmVmcyA9IG93bmVyLnJlZnMgPT09IEVNUFRZX09CSiA/IG93bmVyLnJlZnMgPSB7fSA6IG93bmVyLnJlZnM7XG4gIGNvbnN0IHNldHVwU3RhdGUgPSBvd25lci5zZXR1cFN0YXRlO1xuICBpZiAob2xkUmVmICE9IG51bGwgJiYgb2xkUmVmICE9PSByZWYpIHtcbiAgICBpZiAoaXNTdHJpbmcob2xkUmVmKSkge1xuICAgICAgcmVmc1tvbGRSZWZdID0gbnVsbDtcbiAgICAgIGlmIChoYXNPd24oc2V0dXBTdGF0ZSwgb2xkUmVmKSkge1xuICAgICAgICBzZXR1cFN0YXRlW29sZFJlZl0gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNSZWYob2xkUmVmKSkge1xuICAgICAgb2xkUmVmLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24ocmVmKSkge1xuICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhyZWYsIG93bmVyLCAxMiwgW3ZhbHVlLCByZWZzXSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgX2lzU3RyaW5nID0gaXNTdHJpbmcocmVmKTtcbiAgICBjb25zdCBfaXNSZWYgPSBpc1JlZihyZWYpO1xuICAgIGlmIChfaXNTdHJpbmcgfHwgX2lzUmVmKSB7XG4gICAgICBjb25zdCBkb1NldCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJhd1JlZi5mKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBfaXNTdHJpbmcgPyBoYXNPd24oc2V0dXBTdGF0ZSwgcmVmKSA/IHNldHVwU3RhdGVbcmVmXSA6IHJlZnNbcmVmXSA6IHJlZi52YWx1ZTtcbiAgICAgICAgICBpZiAoaXNVbm1vdW50KSB7XG4gICAgICAgICAgICBpc0FycmF5KGV4aXN0aW5nKSAmJiByZW1vdmUoZXhpc3RpbmcsIHJlZlZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFpc0FycmF5KGV4aXN0aW5nKSkge1xuICAgICAgICAgICAgICBpZiAoX2lzU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgcmVmc1tyZWZdID0gW3JlZlZhbHVlXTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duKHNldHVwU3RhdGUsIHJlZikpIHtcbiAgICAgICAgICAgICAgICAgIHNldHVwU3RhdGVbcmVmXSA9IHJlZnNbcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVmLnZhbHVlID0gW3JlZlZhbHVlXTtcbiAgICAgICAgICAgICAgICBpZiAocmF3UmVmLmspXG4gICAgICAgICAgICAgICAgICByZWZzW3Jhd1JlZi5rXSA9IHJlZi52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghZXhpc3RpbmcuaW5jbHVkZXMocmVmVmFsdWUpKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLnB1c2gocmVmVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfaXNTdHJpbmcpIHtcbiAgICAgICAgICByZWZzW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICBpZiAoaGFzT3duKHNldHVwU3RhdGUsIHJlZikpIHtcbiAgICAgICAgICAgIHNldHVwU3RhdGVbcmVmXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfaXNSZWYpIHtcbiAgICAgICAgICByZWYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICBpZiAocmF3UmVmLmspXG4gICAgICAgICAgICByZWZzW3Jhd1JlZi5rXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKFwiSW52YWxpZCB0ZW1wbGF0ZSByZWYgdHlwZTpcIiwgcmVmLCBgKCR7dHlwZW9mIHJlZn0pYCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZG9TZXQuaWQgPSAtMTtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRvU2V0LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1NldCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6XCIsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgaGFzTWlzbWF0Y2ggPSBmYWxzZTtcbmNvbnN0IGlzU1ZHQ29udGFpbmVyID0gKGNvbnRhaW5lcikgPT4gL3N2Zy8udGVzdChjb250YWluZXIubmFtZXNwYWNlVVJJKSAmJiBjb250YWluZXIudGFnTmFtZSAhPT0gXCJmb3JlaWduT2JqZWN0XCI7XG5jb25zdCBpc0NvbW1lbnQgPSAobm9kZSkgPT4gbm9kZS5ub2RlVHlwZSA9PT0gOCAvKiBDT01NRU5UICovO1xuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBtdDogbW91bnRDb21wb25lbnQsXG4gICAgcDogcGF0Y2gsXG4gICAgbzoge1xuICAgICAgcGF0Y2hQcm9wLFxuICAgICAgY3JlYXRlVGV4dCxcbiAgICAgIG5leHRTaWJsaW5nLFxuICAgICAgcGFyZW50Tm9kZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIGluc2VydCxcbiAgICAgIGNyZWF0ZUNvbW1lbnRcbiAgICB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgY29uc3QgaHlkcmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIGh5ZHJhdGUgZXhpc3RpbmcgbWFya3VwIGJ1dCBjb250YWluZXIgaXMgZW1wdHkuIFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhhc01pc21hdGNoID0gZmFsc2U7XG4gICAgaHlkcmF0ZU5vZGUoY29udGFpbmVyLmZpcnN0Q2hpbGQsIHZub2RlLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICBpZiAoaGFzTWlzbWF0Y2ggJiYgdHJ1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSHlkcmF0aW9uIGNvbXBsZXRlZCBidXQgY29udGFpbnMgbWlzbWF0Y2hlcy5gKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVOb2RlID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgaXNGcmFnbWVudFN0YXJ0ID0gaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJbXCI7XG4gICAgY29uc3Qgb25NaXNtYXRjaCA9ICgpID0+IGhhbmRsZU1pc21hdGNoKFxuICAgICAgbm9kZSxcbiAgICAgIHZub2RlLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBpc0ZyYWdtZW50U3RhcnRcbiAgICApO1xuICAgIGNvbnN0IHsgdHlwZSwgcmVmLCBzaGFwZUZsYWcsIHBhdGNoRmxhZyB9ID0gdm5vZGU7XG4gICAgbGV0IGRvbVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgIHZub2RlLmVsID0gbm9kZTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGlmICghKFwiX192bm9kZVwiIGluIG5vZGUpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCBcIl9fdm5vZGVcIiwge1xuICAgICAgICAgIHZhbHVlOiB2bm9kZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghKFwiX192dWVQYXJlbnRDb21wb25lbnRcIiBpbiBub2RlKSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiLCB7XG4gICAgICAgICAgdmFsdWU6IHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgbGV0IG5leHROb2RlID0gbnVsbDtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVGV4dDpcbiAgICAgICAgaWYgKGRvbVR5cGUgIT09IDMgLyogVEVYVCAqLykge1xuICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgaW5zZXJ0KHZub2RlLmVsID0gY3JlYXRlVGV4dChcIlwiKSwgcGFyZW50Tm9kZShub2RlKSwgbm9kZSk7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobm9kZS5kYXRhICE9PSB2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgbWlzbWF0Y2g6XG4tIFNlcnZlciByZW5kZXJlZDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBub2RlLmRhdGFcbiAgICAgICAgICAgICAgKX1cbi0gQ2xpZW50IHJlbmRlcmVkOiAke0pTT04uc3RyaW5naWZ5KHZub2RlLmNoaWxkcmVuKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbW1lbnQ6XG4gICAgICAgIGlmIChpc1RlbXBsYXRlTm9kZShub2RlKSkge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgcmVwbGFjZU5vZGUoXG4gICAgICAgICAgICB2bm9kZS5lbCA9IG5vZGUuY29udGVudC5maXJzdENoaWxkLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tVHlwZSAhPT0gOCAvKiBDT01NRU5UICovIHx8IGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YXRpYzpcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICBkb21UeXBlID0gbm9kZS5ub2RlVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9tVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovIHx8IGRvbVR5cGUgPT09IDMgLyogVEVYVCAqLykge1xuICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICBjb25zdCBuZWVkVG9BZG9wdENvbnRlbnQgPSAhdm5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm5vZGUuc3RhdGljQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lZWRUb0Fkb3B0Q29udGVudClcbiAgICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4gKz0gbmV4dE5vZGUubm9kZVR5cGUgPT09IDEgLyogRUxFTUVOVCAqLyA/IG5leHROb2RlLm91dGVySFRNTCA6IG5leHROb2RlLmRhdGE7XG4gICAgICAgICAgICBpZiAoaSA9PT0gdm5vZGUuc3RhdGljQ291bnQgLSAxKSB7XG4gICAgICAgICAgICAgIHZub2RlLmFuY2hvciA9IG5leHROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhuZXh0Tm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpc0ZyYWdtZW50U3RhcnQgPyBuZXh0U2libGluZyhuZXh0Tm9kZSkgOiBuZXh0Tm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbk1pc21hdGNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgICBpZiAoIWlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUZyYWdtZW50KFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBpZiAoKGRvbVR5cGUgIT09IDEgLyogRUxFTUVOVCAqLyB8fCB2bm9kZS50eXBlLnRvTG93ZXJDYXNlKCkgIT09IG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSAmJiAhaXNUZW1wbGF0ZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGh5ZHJhdGVFbGVtZW50KFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICB2bm9kZS5zbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHM7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcInRlbGVwb3J0IHN0YXJ0XCIpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlLCBub2RlLmRhdGEsIFwidGVsZXBvcnQgZW5kXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkdDb250YWluZXIoY29udGFpbmVyKSxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzQXN5bmNXcmFwcGVyKHZub2RlKSkge1xuICAgICAgICAgICAgbGV0IHN1YlRyZWU7XG4gICAgICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBjcmVhdGVWTm9kZShGcmFnbWVudCk7XG4gICAgICAgICAgICAgIHN1YlRyZWUuYW5jaG9yID0gbmV4dE5vZGUgPyBuZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmcgOiBjb250YWluZXIubGFzdENoaWxkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IG5vZGUubm9kZVR5cGUgPT09IDMgPyBjcmVhdGVUZXh0Vk5vZGUoXCJcIikgOiBjcmVhdGVWTm9kZShcImRpdlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YlRyZWUuZWwgPSBub2RlO1xuICAgICAgICAgICAgdm5vZGUuY29tcG9uZW50LnN1YlRyZWUgPSBzdWJUcmVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgICAgIGlmIChkb21UeXBlICE9PSA4IC8qIENPTU1FTlQgKi8pIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IHZub2RlLnR5cGUuaHlkcmF0ZShcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgICByZW5kZXJlckludGVybmFscyxcbiAgICAgICAgICAgICAgaHlkcmF0ZUNoaWxkcmVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IHZub2RlLnR5cGUuaHlkcmF0ZShcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkdDb250YWluZXIocGFyZW50Tm9kZShub2RlKSksXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICByZW5kZXJlckludGVybmFscyxcbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybihcIkludmFsaWQgSG9zdFZOb2RlIHR5cGU6XCIsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICBzZXRSZWYocmVmLCBudWxsLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dE5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVFbGVtZW50ID0gKGVsLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBvcHRpbWl6ZWQgPSBvcHRpbWl6ZWQgfHwgISF2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gICAgY29uc3QgeyB0eXBlLCBwcm9wcywgcGF0Y2hGbGFnLCBzaGFwZUZsYWcsIGRpcnMsIHRyYW5zaXRpb24gfSA9IHZub2RlO1xuICAgIGNvbnN0IGZvcmNlUGF0Y2ggPSB0eXBlID09PSBcImlucHV0XCIgfHwgdHlwZSA9PT0gXCJvcHRpb25cIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmb3JjZVBhdGNoIHx8IHBhdGNoRmxhZyAhPT0gLTEpIHtcbiAgICAgIGlmIChkaXJzKSB7XG4gICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJjcmVhdGVkXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgIGlmIChmb3JjZVBhdGNoIHx8ICFvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnICYgKDE2IHwgMzIpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIGlmIChmb3JjZVBhdGNoICYmIChrZXkuZW5kc1dpdGgoXCJ2YWx1ZVwiKSB8fCBrZXkgPT09IFwiaW5kZXRlcm1pbmF0ZVwiKSB8fCBpc09uKGtleSkgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkgfHwgLy8gZm9yY2UgaHlkcmF0ZSB2LWJpbmQgd2l0aCAucHJvcCBtb2RpZmllcnNcbiAgICAgICAgICAgIGtleVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgcGF0Y2hQcm9wKFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0sXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgcGF0Y2hQcm9wKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBcIm9uQ2xpY2tcIixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwcm9wcy5vbkNsaWNrLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgdm5vZGVIb29rcztcbiAgICAgIGlmICh2bm9kZUhvb2tzID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZUJlZm9yZU1vdW50KSB7XG4gICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2tzLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICAgIGxldCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IGZhbHNlO1xuICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKGVsKSkge1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSAmJiBwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnZub2RlLnByb3BzICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcy5hcHBlYXI7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbC5jb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZU5vZGUoY29udGVudCwgZWwsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgIHZub2RlLmVsID0gZWwgPSBjb250ZW50O1xuICAgICAgfVxuICAgICAgaWYgKGRpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZU1vdW50XCIpO1xuICAgICAgfVxuICAgICAgaWYgKCh2bm9kZUhvb2tzID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IGRpcnMgfHwgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UoKCkgPT4ge1xuICAgICAgICAgIHZub2RlSG9va3MgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICAgIG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzICYmIHRyYW5zaXRpb24uZW50ZXIoZWwpO1xuICAgICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaGFwZUZsYWcgJiAxNiAmJiAvLyBza2lwIGlmIGVsZW1lbnQgaGFzIGlubmVySFRNTCAvIHRleHRDb250ZW50XG4gICAgICAhKHByb3BzICYmIChwcm9wcy5pbm5lckhUTUwgfHwgcHJvcHMudGV4dENvbnRlbnQpKSkge1xuICAgICAgICBsZXQgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBlbC5maXJzdENoaWxkLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKG5leHQpIHtcbiAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWhhc1dhcm5lZCkge1xuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBpbiA8JHt2bm9kZS50eXBlfT46IHNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIG1vcmUgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY3VyID0gbmV4dDtcbiAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICByZW1vdmUoY3VyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKFxuICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggaW4gPCR7dm5vZGUudHlwZX0+OlxuLSBTZXJ2ZXIgcmVuZGVyZWQ6ICR7ZWwudGV4dENvbnRlbnR9XG4tIENsaWVudCByZW5kZXJlZDogJHt2bm9kZS5jaGlsZHJlbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbC5uZXh0U2libGluZztcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZUNoaWxkcmVuID0gKG5vZGUsIHBhcmVudFZOb2RlLCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhcGFyZW50Vk5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Vk5vZGUuY2hpbGRyZW47XG4gICAgY29uc3QgbCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICBsZXQgaGFzV2FybmVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNvbnN0IHZub2RlID0gb3B0aW1pemVkID8gY2hpbGRyZW5baV0gOiBjaGlsZHJlbltpXSA9IG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2ldKTtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIG5vZGUgPSBoeWRyYXRlTm9kZShcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IFRleHQgJiYgIXZub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaGFzV2FybmVkKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBIeWRyYXRpb24gY2hpbGRyZW4gbWlzbWF0Y2ggaW4gPCR7Y29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKX0+OiBzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBmZXdlciBjaGlsZCBub2RlcyB0aGFuIGNsaWVudCB2ZG9tLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkdDb250YWluZXIoY29udGFpbmVyKSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVGcmFnbWVudCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCB7IHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IHZub2RlO1xuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICBjb25zdCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgbmV4dFNpYmxpbmcobm9kZSksXG4gICAgICB2bm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgb3B0aW1pemVkXG4gICAgKTtcbiAgICBpZiAobmV4dCAmJiBpc0NvbW1lbnQobmV4dCkgJiYgbmV4dC5kYXRhID09PSBcIl1cIikge1xuICAgICAgcmV0dXJuIG5leHRTaWJsaW5nKHZub2RlLmFuY2hvciA9IG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICBpbnNlcnQodm5vZGUuYW5jaG9yID0gY3JlYXRlQ29tbWVudChgXWApLCBjb250YWluZXIsIG5leHQpO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVNaXNtYXRjaCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBpc0ZyYWdtZW50KSA9PiB7XG4gICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihcbiAgICAgIGBIeWRyYXRpb24gbm9kZSBtaXNtYXRjaDpcbi0gQ2xpZW50IHZub2RlOmAsXG4gICAgICB2bm9kZS50eXBlLFxuICAgICAgYFxuLSBTZXJ2ZXIgcmVuZGVyZWQgRE9NOmAsXG4gICAgICBub2RlLFxuICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBURVhUICovID8gYCh0ZXh0KWAgOiBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIiA/IGAoc3RhcnQgb2YgZnJhZ21lbnQpYCA6IGBgXG4gICAgKTtcbiAgICB2bm9kZS5lbCA9IG51bGw7XG4gICAgaWYgKGlzRnJhZ21lbnQpIHtcbiAgICAgIGNvbnN0IGVuZCA9IGxvY2F0ZUNsb3NpbmdBbmNob3Iobm9kZSk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBuZXh0MiA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBpZiAobmV4dDIgJiYgbmV4dDIgIT09IGVuZCkge1xuICAgICAgICAgIHJlbW92ZShuZXh0Mik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgcmVtb3ZlKG5vZGUpO1xuICAgIHBhdGNoKFxuICAgICAgbnVsbCxcbiAgICAgIHZub2RlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgbmV4dCxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgaXNTVkdDb250YWluZXIoY29udGFpbmVyKSxcbiAgICAgIHNsb3RTY29wZUlkc1xuICAgICk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH07XG4gIGNvbnN0IGxvY2F0ZUNsb3NpbmdBbmNob3IgPSAobm9kZSwgb3BlbiA9IFwiW1wiLCBjbG9zZSA9IFwiXVwiKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gMDtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5vZGUgJiYgaXNDb21tZW50KG5vZGUpKSB7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IG9wZW4pXG4gICAgICAgICAgbWF0Y2grKztcbiAgICAgICAgaWYgKG5vZGUuZGF0YSA9PT0gY2xvc2UpIHtcbiAgICAgICAgICBpZiAobWF0Y2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2gtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IHJlcGxhY2VOb2RlID0gKG5ld05vZGUsIG9sZE5vZGUsIHBhcmVudENvbXBvbmVudCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudE5vZGUyID0gb2xkTm9kZS5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlMikge1xuICAgICAgcGFyZW50Tm9kZTIucmVwbGFjZUNoaWxkKG5ld05vZGUsIG9sZE5vZGUpO1xuICAgIH1cbiAgICBsZXQgcGFyZW50ID0gcGFyZW50Q29tcG9uZW50O1xuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQudm5vZGUuZWwgPT09IG9sZE5vZGUpIHtcbiAgICAgICAgcGFyZW50LnZub2RlLmVsID0gcGFyZW50LnN1YlRyZWUuZWwgPSBuZXdOb2RlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzVGVtcGxhdGVOb2RlID0gKG5vZGUpID0+IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRlbXBsYXRlXCI7XG4gIH07XG4gIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuXG5sZXQgc3VwcG9ydGVkO1xubGV0IHBlcmY7XG5mdW5jdGlvbiBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgaWYgKGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlICYmIGlzU3VwcG9ydGVkKCkpIHtcbiAgICBwZXJmLm1hcmsoYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWApO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZlN0YXJ0KGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICB9XG59XG5mdW5jdGlvbiBlbmRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgY29uc3Qgc3RhcnRUYWcgPSBgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YDtcbiAgICBjb25zdCBlbmRUYWcgPSBzdGFydFRhZyArIGA6ZW5kYDtcbiAgICBwZXJmLm1hcmsoZW5kVGFnKTtcbiAgICBwZXJmLm1lYXN1cmUoXG4gICAgICBgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgaW5zdGFuY2UudHlwZSl9PiAke3R5cGV9YCxcbiAgICAgIHN0YXJ0VGFnLFxuICAgICAgZW5kVGFnXG4gICAgKTtcbiAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZkVuZChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdXBwb3J0ZWQoKSB7XG4gIGlmIChzdXBwb3J0ZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBlcmZvcm1hbmNlKSB7XG4gICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICBwZXJmID0gd2luZG93LnBlcmZvcm1hbmNlO1xuICB9IGVsc2Uge1xuICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIGluaXRGZWF0dXJlRmxhZ3MoKSB7XG4gIGNvbnN0IG5lZWRXYXJuID0gW107XG4gIGlmICh0eXBlb2YgX19WVUVfT1BUSU9OU19BUElfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX09QVElPTlNfQVBJX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfT1BUSU9OU19BUElfXyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0RFVlRPT0xTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0RFVlRPT0xTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9ERVZUT09MU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZWVkV2Fybi5sZW5ndGggPiAxO1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBGZWF0dXJlIGZsYWcke211bHRpID8gYHNgIDogYGB9ICR7bmVlZFdhcm4uam9pbihcIiwgXCIpfSAke211bHRpID8gYGFyZWAgOiBgaXNgfSBub3QgZXhwbGljaXRseSBkZWZpbmVkLiBZb3UgYXJlIHJ1bm5pbmcgdGhlIGVzbS1idW5kbGVyIGJ1aWxkIG9mIFZ1ZSwgd2hpY2ggZXhwZWN0cyB0aGVzZSBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyB0byBiZSBnbG9iYWxseSBpbmplY3RlZCB2aWEgdGhlIGJ1bmRsZXIgY29uZmlnIGluIG9yZGVyIHRvIGdldCBiZXR0ZXIgdHJlZS1zaGFraW5nIGluIHRoZSBwcm9kdWN0aW9uIGJ1bmRsZS5cblxuRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QgPSBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSA7XG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucyk7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKTtcbn1cbmZ1bmN0aW9uIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAge1xuICAgIGluaXRGZWF0dXJlRmxhZ3MoKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIHRhcmdldC5fX1ZVRV9fID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgc2V0RGV2dG9vbHNIb29rKHRhcmdldC5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fLCB0YXJnZXQpO1xuICB9XG4gIGNvbnN0IHtcbiAgICBpbnNlcnQ6IGhvc3RJbnNlcnQsXG4gICAgcmVtb3ZlOiBob3N0UmVtb3ZlLFxuICAgIHBhdGNoUHJvcDogaG9zdFBhdGNoUHJvcCxcbiAgICBjcmVhdGVFbGVtZW50OiBob3N0Q3JlYXRlRWxlbWVudCxcbiAgICBjcmVhdGVUZXh0OiBob3N0Q3JlYXRlVGV4dCxcbiAgICBjcmVhdGVDb21tZW50OiBob3N0Q3JlYXRlQ29tbWVudCxcbiAgICBzZXRUZXh0OiBob3N0U2V0VGV4dCxcbiAgICBzZXRFbGVtZW50VGV4dDogaG9zdFNldEVsZW1lbnRUZXh0LFxuICAgIHBhcmVudE5vZGU6IGhvc3RQYXJlbnROb2RlLFxuICAgIG5leHRTaWJsaW5nOiBob3N0TmV4dFNpYmxpbmcsXG4gICAgc2V0U2NvcGVJZDogaG9zdFNldFNjb3BlSWQgPSBOT09QLFxuICAgIGluc2VydFN0YXRpY0NvbnRlbnQ6IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXRjaCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yID0gbnVsbCwgcGFyZW50Q29tcG9uZW50ID0gbnVsbCwgcGFyZW50U3VzcGVuc2UgPSBudWxsLCBpc1NWRyA9IGZhbHNlLCBzbG90U2NvcGVJZHMgPSBudWxsLCBvcHRpbWl6ZWQgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcgPyBmYWxzZSA6ICEhbjIuZHluYW1pY0NoaWxkcmVuKSA9PiB7XG4gICAgaWYgKG4xID09PSBuMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobjEgJiYgIWlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICBhbmNob3IgPSBnZXROZXh0SG9zdE5vZGUobjEpO1xuICAgICAgdW5tb3VudChuMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICBuMSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuMi5wYXRjaEZsYWcgPT09IC0yKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIG4yLmR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHsgdHlwZSwgcmVmLCBzaGFwZUZsYWcgfSA9IG4yO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUZXh0OlxuICAgICAgICBwcm9jZXNzVGV4dChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbW1lbnQ6XG4gICAgICAgIHByb2Nlc3NDb21tZW50Tm9kZShuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YXRpYzpcbiAgICAgICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgICAgICBtb3VudFN0YXRpY05vZGUobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBpc1NWRyk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBhdGNoU3RhdGljTm9kZShuMSwgbjIsIGNvbnRhaW5lciwgaXNTVkcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgcHJvY2Vzc0ZyYWdtZW50KFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMSkge1xuICAgICAgICAgIHByb2Nlc3NFbGVtZW50KFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50KFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICBpbnRlcm5hbHNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIHR5cGUucHJvY2VzcyhcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybihcIkludmFsaWQgVk5vZGUgdHlwZTpcIiwgdHlwZSwgYCgke3R5cGVvZiB0eXBlfSlgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmICE9IG51bGwgJiYgcGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBzZXRSZWYocmVmLCBuMSAmJiBuMS5yZWYsIHBhcmVudFN1c3BlbnNlLCBuMiB8fCBuMSwgIW4yKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NUZXh0ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChcbiAgICAgICAgbjIuZWwgPSBob3N0Q3JlYXRlVGV4dChuMi5jaGlsZHJlbiksXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbCA9IG4yLmVsID0gbjEuZWw7XG4gICAgICBpZiAobjIuY2hpbGRyZW4gIT09IG4xLmNoaWxkcmVuKSB7XG4gICAgICAgIGhvc3RTZXRUZXh0KGVsLCBuMi5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ29tbWVudE5vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcikgPT4ge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KFxuICAgICAgICBuMi5lbCA9IGhvc3RDcmVhdGVDb21tZW50KG4yLmNoaWxkcmVuIHx8IFwiXCIpLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50U3RhdGljTm9kZSA9IChuMiwgY29udGFpbmVyLCBhbmNob3IsIGlzU1ZHKSA9PiB7XG4gICAgW24yLmVsLCBuMi5hbmNob3JdID0gaG9zdEluc2VydFN0YXRpY0NvbnRlbnQoXG4gICAgICBuMi5jaGlsZHJlbixcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGFuY2hvcixcbiAgICAgIGlzU1ZHLFxuICAgICAgbjIuZWwsXG4gICAgICBuMi5hbmNob3JcbiAgICApO1xuICB9O1xuICBjb25zdCBwYXRjaFN0YXRpY05vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIGlzU1ZHKSA9PiB7XG4gICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgYW5jaG9yID0gaG9zdE5leHRTaWJsaW5nKG4xLmFuY2hvcik7XG4gICAgICByZW1vdmVTdGF0aWNOb2RlKG4xKTtcbiAgICAgIFtuMi5lbCwgbjIuYW5jaG9yXSA9IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50KFxuICAgICAgICBuMi5jaGlsZHJlbixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGlzU1ZHXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgbjIuYW5jaG9yID0gbjEuYW5jaG9yO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0sIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIG5leHRTaWJsaW5nKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdEluc2VydChhbmNob3IsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICB9O1xuICBjb25zdCByZW1vdmVTdGF0aWNOb2RlID0gKHsgZWwsIGFuY2hvciB9KSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGVsICYmIGVsICE9PSBhbmNob3IpIHtcbiAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoZWwpO1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBlbCA9IG5leHQ7XG4gICAgfVxuICAgIGhvc3RSZW1vdmUoYW5jaG9yKTtcbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0VsZW1lbnQgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgaXNTVkcgPSBpc1NWRyB8fCBuMi50eXBlID09PSBcInN2Z1wiO1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBtb3VudEVsZW1lbnQoXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaEVsZW1lbnQoXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRFbGVtZW50ID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbGV0IGVsO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgY29uc3QgeyB0eXBlLCBwcm9wcywgc2hhcGVGbGFnLCB0cmFuc2l0aW9uLCBkaXJzIH0gPSB2bm9kZTtcbiAgICBlbCA9IHZub2RlLmVsID0gaG9zdENyZWF0ZUVsZW1lbnQoXG4gICAgICB2bm9kZS50eXBlLFxuICAgICAgaXNTVkcsXG4gICAgICBwcm9wcyAmJiBwcm9wcy5pcyxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCB2bm9kZS5jaGlsZHJlbik7XG4gICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyAmJiB0eXBlICE9PSBcImZvcmVpZ25PYmplY3RcIixcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkaXJzKSB7XG4gICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICB9XG4gICAgc2V0U2NvcGVJZChlbCwgdm5vZGUsIHZub2RlLnNjb3BlSWQsIHNsb3RTY29wZUlkcywgcGFyZW50Q29tcG9uZW50KTtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgIGlmIChrZXkgIT09IFwidmFsdWVcIiAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSkge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwcm9wc1trZXldLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBwcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG51bGwsIHByb3BzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZUhvb2sgPSBwcm9wcy5vblZub2RlQmVmb3JlTW91bnQpIHtcbiAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCBcIl9fdm5vZGVcIiwge1xuICAgICAgICB2YWx1ZTogdm5vZGUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiLCB7XG4gICAgICAgIHZhbHVlOiBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVNb3VudFwiKTtcbiAgICB9XG4gICAgY29uc3QgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbik7XG4gICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9XG4gICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIGlmICgodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXRTY29wZUlkID0gKGVsLCB2bm9kZSwgc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBpZiAoc2NvcGVJZCkge1xuICAgICAgaG9zdFNldFNjb3BlSWQoZWwsIHNjb3BlSWQpO1xuICAgIH1cbiAgICBpZiAoc2xvdFNjb3BlSWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RTY29wZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2xvdFNjb3BlSWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgbGV0IHN1YlRyZWUgPSBwYXJlbnRDb21wb25lbnQuc3ViVHJlZTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHN1YlRyZWUucGF0Y2hGbGFnID4gMCAmJiBzdWJUcmVlLnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICAgICAgc3ViVHJlZSA9IGZpbHRlclNpbmdsZVJvb3Qoc3ViVHJlZS5jaGlsZHJlbikgfHwgc3ViVHJlZTtcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZSA9PT0gc3ViVHJlZSkge1xuICAgICAgICBjb25zdCBwYXJlbnRWTm9kZSA9IHBhcmVudENvbXBvbmVudC52bm9kZTtcbiAgICAgICAgc2V0U2NvcGVJZChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBwYXJlbnRWTm9kZSxcbiAgICAgICAgICBwYXJlbnRWTm9kZS5zY29wZUlkLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQucGFyZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBzdGFydCA9IDApID0+IHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGNoaWxkcmVuW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGNoaWxkcmVuW2ldKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBudWxsLFxuICAgICAgICBjaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoRWxlbWVudCA9IChuMSwgbjIsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICBsZXQgeyBwYXRjaEZsYWcsIGR5bmFtaWNDaGlsZHJlbiwgZGlycyB9ID0gbjI7XG4gICAgcGF0Y2hGbGFnIHw9IG4xLnBhdGNoRmxhZyAmIDE2O1xuICAgIGNvbnN0IG9sZFByb3BzID0gbjEucHJvcHMgfHwgRU1QVFlfT0JKO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gbjIucHJvcHMgfHwgRU1QVFlfT0JKO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgcGFyZW50Q29tcG9uZW50ICYmIHRvZ2dsZVJlY3Vyc2UocGFyZW50Q29tcG9uZW50LCBmYWxzZSk7XG4gICAgaWYgKHZub2RlSG9vayA9IG5ld1Byb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpIHtcbiAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgbjIsIG4xKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sobjIsIG4xLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlVXBkYXRlXCIpO1xuICAgIH1cbiAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIHRydWUpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgIHBhdGNoRmxhZyA9IDA7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFyZUNoaWxkcmVuU1ZHID0gaXNTVkcgJiYgbjIudHlwZSAhPT0gXCJmb3JlaWduT2JqZWN0XCI7XG4gICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgZWwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGFyZUNoaWxkcmVuU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICBwYXRjaENoaWxkcmVuKFxuICAgICAgICBuMSxcbiAgICAgICAgbjIsXG4gICAgICAgIGVsLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBhcmVDaGlsZHJlblNWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxNikge1xuICAgICAgICBwYXRjaFByb3BzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIG9sZFByb3BzLFxuICAgICAgICAgIG5ld1Byb3BzLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWR1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDIpIHtcbiAgICAgICAgICBpZiAob2xkUHJvcHMuY2xhc3MgIT09IG5ld1Byb3BzLmNsYXNzKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcImNsYXNzXCIsIG51bGwsIG5ld1Byb3BzLmNsYXNzLCBpc1NWRyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiA0KSB7XG4gICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJzdHlsZVwiLCBvbGRQcm9wcy5zdHlsZSwgbmV3UHJvcHMuc3R5bGUsIGlzU1ZHKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgICAgIGNvbnN0IHByb3BzVG9VcGRhdGUgPSBuMi5keW5hbWljUHJvcHM7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBwcm9wc1RvVXBkYXRlW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IG9sZFByb3BzW2tleV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgICAgICAgIGlmIChuZXh0ICE9PSBwcmV2IHx8IGtleSA9PT0gXCJ2YWx1ZVwiKSB7XG4gICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByZXYsXG4gICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgICAgICBuMS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMSkge1xuICAgICAgICBpZiAobjEuY2hpbGRyZW4gIT09IG4yLmNoaWxkcmVuKSB7XG4gICAgICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCBuMi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQgJiYgZHluYW1pY0NoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHBhdGNoUHJvcHMoXG4gICAgICAgIGVsLFxuICAgICAgICBuMixcbiAgICAgICAgb2xkUHJvcHMsXG4gICAgICAgIG5ld1Byb3BzLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWR1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlVXBkYXRlZCkgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgbjIsIG4xKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCBcInVwZGF0ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEJsb2NrQ2hpbGRyZW4gPSAob2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBmYWxsYmFja0NvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5baV07XG4gICAgICBjb25zdCBuZXdWTm9kZSA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gKFxuICAgICAgICAvLyBvbGRWTm9kZSBtYXkgYmUgYW4gZXJyb3JlZCBhc3luYyBzZXR1cCgpIGNvbXBvbmVudCBpbnNpZGUgU3VzcGVuc2VcbiAgICAgICAgLy8gd2hpY2ggd2lsbCBub3QgaGF2ZSBhIG1vdW50ZWQgZWxlbWVudFxuICAgICAgICBvbGRWTm9kZS5lbCAmJiAvLyAtIEluIHRoZSBjYXNlIG9mIGEgRnJhZ21lbnQsIHdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgYWN0dWFsIHBhcmVudFxuICAgICAgICAvLyBvZiB0aGUgRnJhZ21lbnQgaXRzZWxmIHNvIGl0IGNhbiBtb3ZlIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgKG9sZFZOb2RlLnR5cGUgPT09IEZyYWdtZW50IHx8IC8vIC0gSW4gdGhlIGNhc2Ugb2YgZGlmZmVyZW50IG5vZGVzLCB0aGVyZSBpcyBnb2luZyB0byBiZSBhIHJlcGxhY2VtZW50XG4gICAgICAgIC8vIHdoaWNoIGFsc28gcmVxdWlyZXMgdGhlIGNvcnJlY3QgcGFyZW50IGNvbnRhaW5lclxuICAgICAgICAhaXNTYW1lVk5vZGVUeXBlKG9sZFZOb2RlLCBuZXdWTm9kZSkgfHwgLy8gLSBJbiB0aGUgY2FzZSBvZiBhIGNvbXBvbmVudCwgaXQgY291bGQgY29udGFpbiBhbnl0aGluZy5cbiAgICAgICAgb2xkVk5vZGUuc2hhcGVGbGFnICYgKDYgfCA2NCkpID8gaG9zdFBhcmVudE5vZGUob2xkVk5vZGUuZWwpIDogKFxuICAgICAgICAgIC8vIEluIG90aGVyIGNhc2VzLCB0aGUgcGFyZW50IGNvbnRhaW5lciBpcyBub3QgYWN0dWFsbHkgdXNlZCBzbyB3ZVxuICAgICAgICAgIC8vIGp1c3QgcGFzcyB0aGUgYmxvY2sgZWxlbWVudCBoZXJlIHRvIGF2b2lkIGEgRE9NIHBhcmVudE5vZGUgY2FsbC5cbiAgICAgICAgICBmYWxsYmFja0NvbnRhaW5lclxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcGF0Y2goXG4gICAgICAgIG9sZFZOb2RlLFxuICAgICAgICBuZXdWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBpc1NWRyxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hQcm9wcyA9IChlbCwgdm5vZGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcpID0+IHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzKSB7XG4gICAgICBpZiAob2xkUHJvcHMgIT09IEVNUFRZX09CSikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRQcm9wcykge1xuICAgICAgICAgIGlmICghaXNSZXNlcnZlZFByb3Aoa2V5KSAmJiAhKGtleSBpbiBuZXdQcm9wcykpIHtcbiAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIG9sZFByb3BzW2tleV0sXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaWYgKGlzUmVzZXJ2ZWRQcm9wKGtleSkpXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG5leHQgIT09IHByZXYgJiYga2V5ICE9PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcmV2LFxuICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIHVubW91bnRDaGlsZHJlblxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcInZhbHVlXCIgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJ2YWx1ZVwiLCBvbGRQcm9wcy52YWx1ZSwgbmV3UHJvcHMudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0ZyYWdtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGZyYWdtZW50U3RhcnRBbmNob3IgPSBuMi5lbCA9IG4xID8gbjEuZWwgOiBob3N0Q3JlYXRlVGV4dChcIlwiKTtcbiAgICBjb25zdCBmcmFnbWVudEVuZEFuY2hvciA9IG4yLmFuY2hvciA9IG4xID8gbjEuYW5jaG9yIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IG4yO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIC8vICM1NTIzIGRldiByb290IGZyYWdtZW50IG1heSBpbmhlcml0IGRpcmVjdGl2ZXNcbiAgICAoaXNIbXJVcGRhdGluZyB8fCBwYXRjaEZsYWcgJiAyMDQ4KSkge1xuICAgICAgcGF0Y2hGbGFnID0gMDtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZyYWdtZW50U2xvdFNjb3BlSWRzKSB7XG4gICAgICBzbG90U2NvcGVJZHMgPSBzbG90U2NvcGVJZHMgPyBzbG90U2NvcGVJZHMuY29uY2F0KGZyYWdtZW50U2xvdFNjb3BlSWRzKSA6IGZyYWdtZW50U2xvdFNjb3BlSWRzO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudFN0YXJ0QW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBob3N0SW5zZXJ0KGZyYWdtZW50RW5kQW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICBuMi5jaGlsZHJlbixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBmcmFnbWVudEVuZEFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGF0Y2hGbGFnID4gMCAmJiBwYXRjaEZsYWcgJiA2NCAmJiBkeW5hbWljQ2hpbGRyZW4gJiYgLy8gIzI3MTUgdGhlIHByZXZpb3VzIGZyYWdtZW50IGNvdWxkJ3ZlIGJlZW4gYSBCQUlMZWQgb25lIGFzIGEgcmVzdWx0XG4gICAgICAvLyBvZiByZW5kZXJTbG90KCkgd2l0aCBubyB2YWxpZCBjaGlsZHJlblxuICAgICAgbjEuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgIHBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vICMyMDgwIGlmIHRoZSBzdGFibGUgZnJhZ21lbnQgaGFzIGEga2V5LCBpdCdzIGEgPHRlbXBsYXRlIHYtZm9yPiB0aGF0IG1heVxuICAgICAgICAgIC8vICBnZXQgbW92ZWQgYXJvdW5kLiBNYWtlIHN1cmUgYWxsIHJvb3QgbGV2ZWwgdm5vZGVzIGluaGVyaXQgZWwuXG4gICAgICAgICAgLy8gIzIxMzQgb3IgaWYgaXQncyBhIGNvbXBvbmVudCByb290LCBpdCBtYXkgYWxzbyBnZXQgbW92ZWQgYXJvdW5kXG4gICAgICAgICAgLy8gYXMgdGhlIGNvbXBvbmVudCBpcyBiZWluZyBtb3ZlZC5cbiAgICAgICAgICBuMi5rZXkgIT0gbnVsbCB8fCBwYXJlbnRDb21wb25lbnQgJiYgbjIgPT09IHBhcmVudENvbXBvbmVudC5zdWJUcmVlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgLyogc2hhbGxvdyAqL1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG4yLnNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcztcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaWYgKG4yLnNoYXBlRmxhZyAmIDUxMikge1xuICAgICAgICBwYXJlbnRDb21wb25lbnQuY3R4LmFjdGl2YXRlKFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50Q29tcG9uZW50ID0gKGluaXRpYWxWTm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IChpbml0aWFsVk5vZGUuY29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBpbml0aWFsVk5vZGUsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICkpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGluc3RhbmNlLnR5cGUuX19obXJJZCkge1xuICAgICAgcmVnaXN0ZXJITVIoaW5zdGFuY2UpO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KGluaXRpYWxWTm9kZSk7XG4gICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBtb3VudGApO1xuICAgIH1cbiAgICBpZiAoaXNLZWVwQWxpdmUoaW5pdGlhbFZOb2RlKSkge1xuICAgICAgaW5zdGFuY2UuY3R4LnJlbmRlcmVyID0gaW50ZXJuYWxzO1xuICAgIH1cbiAgICB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICB9XG4gICAgICBzZXR1cENvbXBvbmVudChpbnN0YW5jZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgaW5pdGApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5zdGFuY2UuYXN5bmNEZXApIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnJlZ2lzdGVyRGVwKGluc3RhbmNlLCBzZXR1cFJlbmRlckVmZmVjdCk7XG4gICAgICBpZiAoIWluaXRpYWxWTm9kZS5lbCkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGluc3RhbmNlLnN1YlRyZWUgPSBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgICAgICAgcHJvY2Vzc0NvbW1lbnROb2RlKG51bGwsIHBsYWNlaG9sZGVyLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldHVwUmVuZGVyRWZmZWN0KFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBpbml0aWFsVk5vZGUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBhbmNob3IsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIGlzU1ZHLFxuICAgICAgb3B0aW1pemVkXG4gICAgKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBtb3VudGApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdXBkYXRlQ29tcG9uZW50ID0gKG4xLCBuMiwgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuMi5jb21wb25lbnQgPSBuMS5jb21wb25lbnQ7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCkpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCAmJiAhaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChuMik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuMiwgb3B0aW1pemVkKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLm5leHQgPSBuMjtcbiAgICAgICAgaW52YWxpZGF0ZUpvYihpbnN0YW5jZS51cGRhdGUpO1xuICAgICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIGluc3RhbmNlLnZub2RlID0gbjI7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXR1cFJlbmRlckVmZmVjdCA9IChpbnN0YW5jZSwgaW5pdGlhbFZOb2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBjb21wb25lbnRVcGRhdGVGbiA9ICgpID0+IHtcbiAgICAgIGlmICghaW5zdGFuY2UuaXNNb3VudGVkKSB7XG4gICAgICAgIGxldCB2bm9kZUhvb2s7XG4gICAgICAgIGNvbnN0IHsgZWwsIHByb3BzIH0gPSBpbml0aWFsVk5vZGU7XG4gICAgICAgIGNvbnN0IHsgYm0sIG0sIHBhcmVudCB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IGlzQXN5bmNXcmFwcGVyVk5vZGUgPSBpc0FzeW5jV3JhcHBlcihpbml0aWFsVk5vZGUpO1xuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChibSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGJtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXN5bmNXcmFwcGVyVk5vZGUgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkpIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIGluaXRpYWxWTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChlbCAmJiBoeWRyYXRlTm9kZSkge1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVTdWJUcmVlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBoeWRyYXRlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoeWRyYXRlTm9kZShcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBoeWRyYXRlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaXNBc3luY1dyYXBwZXJWTm9kZSkge1xuICAgICAgICAgICAgaW5pdGlhbFZOb2RlLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oXG4gICAgICAgICAgICAgIC8vIG5vdGU6IHdlIGFyZSBtb3ZpbmcgdGhlIHJlbmRlciBjYWxsIGludG8gYW4gYXN5bmMgY2FsbGJhY2ssXG4gICAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIGl0IHdvbid0IHRyYWNrIGRlcGVuZGVuY2llcyAtIGJ1dCBpdCdzIG9rIGJlY2F1c2VcbiAgICAgICAgICAgICAgLy8gYSBzZXJ2ZXItcmVuZGVyZWQgYXN5bmMgd3JhcHBlciBpcyBhbHJlYWR5IGluIHJlc29sdmVkIHN0YXRlXG4gICAgICAgICAgICAgIC8vIGFuZCBpdCB3aWxsIG5ldmVyIG5lZWQgdG8gY2hhbmdlLlxuICAgICAgICAgICAgICAoKSA9PiAhaW5zdGFuY2UuaXNVbm1vdW50ZWQgJiYgaHlkcmF0ZVN1YlRyZWUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHlkcmF0ZVN1YlRyZWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdWJUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZSA9IHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBwYXRjaGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBzdWJUcmVlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGlzU1ZHXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRpYWxWTm9kZS5lbCA9IHN1YlRyZWUuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNBc3luY1dyYXBwZXJWTm9kZSAmJiAodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkSW5pdGlhbFZOb2RlID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgc2NvcGVkSW5pdGlhbFZOb2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdGlhbFZOb2RlLnNoYXBlRmxhZyAmIDI1NiB8fCBwYXJlbnQgJiYgaXNBc3luY1dyYXBwZXIocGFyZW50LnZub2RlKSAmJiBwYXJlbnQudm5vZGUuc2hhcGVGbGFnICYgMjU2KSB7XG4gICAgICAgICAgaW5zdGFuY2UuYSAmJiBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoaW5zdGFuY2UuYSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxWTm9kZSA9IGNvbnRhaW5lciA9IGFuY2hvciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgeyBuZXh0LCBidSwgdSwgcGFyZW50LCB2bm9kZSB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGxldCBvcmlnaW5OZXh0ID0gbmV4dDtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQobmV4dCB8fCBpbnN0YW5jZS52bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgZmFsc2UpO1xuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIoaW5zdGFuY2UsIG5leHQsIG9wdGltaXplZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dCA9IHZub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGJ1KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIG5leHQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0VHJlZSA9IHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2VHJlZSA9IGluc3RhbmNlLnN1YlRyZWU7XG4gICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSBuZXh0VHJlZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBwYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIHByZXZUcmVlLFxuICAgICAgICAgIG5leHRUcmVlLFxuICAgICAgICAgIC8vIHBhcmVudCBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSB0ZWxlcG9ydFxuICAgICAgICAgIGhvc3RQYXJlbnROb2RlKHByZXZUcmVlLmVsKSxcbiAgICAgICAgICAvLyBhbmNob3IgbWF5IGhhdmUgY2hhbmdlZCBpZiBpdCdzIGluIGEgZnJhZ21lbnRcbiAgICAgICAgICBnZXROZXh0SG9zdE5vZGUocHJldlRyZWUpLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHBhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5lbCA9IG5leHRUcmVlLmVsO1xuICAgICAgICBpZiAob3JpZ2luTmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgbmV4dFRyZWUuZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KHUsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVVcGRhdGVkKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSksXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGVmZmVjdCA9IGluc3RhbmNlLmVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChcbiAgICAgIGNvbXBvbmVudFVwZGF0ZUZuLFxuICAgICAgKCkgPT4gcXVldWVKb2IodXBkYXRlKSxcbiAgICAgIGluc3RhbmNlLnNjb3BlXG4gICAgICAvLyB0cmFjayBpdCBpbiBjb21wb25lbnQncyBlZmZlY3Qgc2NvcGVcbiAgICApO1xuICAgIGNvbnN0IHVwZGF0ZSA9IGluc3RhbmNlLnVwZGF0ZSA9ICgpID0+IGVmZmVjdC5ydW4oKTtcbiAgICB1cGRhdGUuaWQgPSBpbnN0YW5jZS51aWQ7XG4gICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGVmZmVjdC5vblRyYWNrID0gaW5zdGFuY2UucnRjID8gKGUpID0+IGludm9rZUFycmF5Rm5zKGluc3RhbmNlLnJ0YywgZSkgOiB2b2lkIDA7XG4gICAgICBlZmZlY3Qub25UcmlnZ2VyID0gaW5zdGFuY2UucnRnID8gKGUpID0+IGludm9rZUFycmF5Rm5zKGluc3RhbmNlLnJ0ZywgZSkgOiB2b2lkIDA7XG4gICAgICB1cGRhdGUub3duZXJJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICB1cGRhdGUoKTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyID0gKGluc3RhbmNlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkgPT4ge1xuICAgIG5leHRWTm9kZS5jb21wb25lbnQgPSBpbnN0YW5jZTtcbiAgICBjb25zdCBwcmV2UHJvcHMgPSBpbnN0YW5jZS52bm9kZS5wcm9wcztcbiAgICBpbnN0YW5jZS52bm9kZSA9IG5leHRWTm9kZTtcbiAgICBpbnN0YW5jZS5uZXh0ID0gbnVsbDtcbiAgICB1cGRhdGVQcm9wcyhpbnN0YW5jZSwgbmV4dFZOb2RlLnByb3BzLCBwcmV2UHJvcHMsIG9wdGltaXplZCk7XG4gICAgdXBkYXRlU2xvdHMoaW5zdGFuY2UsIG5leHRWTm9kZS5jaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgZmx1c2hQcmVGbHVzaENicygpO1xuICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgfTtcbiAgY29uc3QgcGF0Y2hDaGlsZHJlbiA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IGMxID0gbjEgJiYgbjEuY2hpbGRyZW47XG4gICAgY29uc3QgcHJldlNoYXBlRmxhZyA9IG4xID8gbjEuc2hhcGVGbGFnIDogMDtcbiAgICBjb25zdCBjMiA9IG4yLmNoaWxkcmVuO1xuICAgIGNvbnN0IHsgcGF0Y2hGbGFnLCBzaGFwZUZsYWcgfSA9IG4yO1xuICAgIGlmIChwYXRjaEZsYWcgPiAwKSB7XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMTI4KSB7XG4gICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICBjMSxcbiAgICAgICAgICBjMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocGF0Y2hGbGFnICYgMjU2KSB7XG4gICAgICAgIHBhdGNoVW5rZXllZENoaWxkcmVuKFxuICAgICAgICAgIGMxLFxuICAgICAgICAgIGMyLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oYzEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGMyICE9PSBjMSkge1xuICAgICAgICBob3N0U2V0RWxlbWVudFRleHQoY29udGFpbmVyLCBjMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgcGF0Y2hLZXllZENoaWxkcmVuKFxuICAgICAgICAgICAgYzEsXG4gICAgICAgICAgICBjMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgOCkge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgICBjMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFVua2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBpc1NWRywgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjMSA9IGMxIHx8IEVNUFRZX0FSUjtcbiAgICBjMiA9IGMyIHx8IEVNUFRZX0FSUjtcbiAgICBjb25zdCBvbGRMZW5ndGggPSBjMS5sZW5ndGg7XG4gICAgY29uc3QgbmV3TGVuZ3RoID0gYzIubGVuZ3RoO1xuICAgIGNvbnN0IGNvbW1vbkxlbmd0aCA9IE1hdGgubWluKG9sZExlbmd0aCwgbmV3TGVuZ3RoKTtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29tbW9uTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgcGF0Y2goXG4gICAgICAgIGMxW2ldLFxuICAgICAgICBuZXh0Q2hpbGQsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgaXNTVkcsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob2xkTGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICB1bm1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMxLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICBjMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIGlzU1ZHLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hLZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBwYXJlbnRBbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGlzU1ZHLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBsMiA9IGMyLmxlbmd0aDtcbiAgICBsZXQgZTEgPSBjMS5sZW5ndGggLSAxO1xuICAgIGxldCBlMiA9IGwyIC0gMTtcbiAgICB3aGlsZSAoaSA8PSBlMSAmJiBpIDw9IGUyKSB7XG4gICAgICBjb25zdCBuMSA9IGMxW2ldO1xuICAgICAgY29uc3QgbjIgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbZTFdO1xuICAgICAgY29uc3QgbjIgPSBjMltlMl0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltlMl0pIDogbm9ybWFsaXplVk5vZGUoYzJbZTJdKTtcbiAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgaXNTVkcsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBlMS0tO1xuICAgICAgZTItLTtcbiAgICB9XG4gICAgaWYgKGkgPiBlMSkge1xuICAgICAgaWYgKGkgPD0gZTIpIHtcbiAgICAgICAgY29uc3QgbmV4dFBvcyA9IGUyICsgMTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dFBvcyA8IGwyID8gYzJbbmV4dFBvc10uZWwgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgIHdoaWxlIChpIDw9IGUyKSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSksXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGkgPiBlMikge1xuICAgICAgd2hpbGUgKGkgPD0gZTEpIHtcbiAgICAgICAgdW5tb3VudChjMVtpXSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgczEgPSBpO1xuICAgICAgY29uc3QgczIgPSBpO1xuICAgICAgY29uc3Qga2V5VG9OZXdJbmRleE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBmb3IgKGkgPSBzMjsgaSA8PSBlMjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgICBpZiAobmV4dENoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5VG9OZXdJbmRleE1hcC5oYXMobmV4dENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgIGBEdXBsaWNhdGUga2V5cyBmb3VuZCBkdXJpbmcgdXBkYXRlOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5leHRDaGlsZC5rZXkpLFxuICAgICAgICAgICAgICBgTWFrZSBzdXJlIGtleXMgYXJlIHVuaXF1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlUb05ld0luZGV4TWFwLnNldChuZXh0Q2hpbGQua2V5LCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGo7XG4gICAgICBsZXQgcGF0Y2hlZCA9IDA7XG4gICAgICBjb25zdCB0b0JlUGF0Y2hlZCA9IGUyIC0gczIgKyAxO1xuICAgICAgbGV0IG1vdmVkID0gZmFsc2U7XG4gICAgICBsZXQgbWF4TmV3SW5kZXhTb0ZhciA9IDA7XG4gICAgICBjb25zdCBuZXdJbmRleFRvT2xkSW5kZXhNYXAgPSBuZXcgQXJyYXkodG9CZVBhdGNoZWQpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IHRvQmVQYXRjaGVkOyBpKyspXG4gICAgICAgIG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9IDA7XG4gICAgICBmb3IgKGkgPSBzMTsgaSA8PSBlMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZXZDaGlsZCA9IGMxW2ldO1xuICAgICAgICBpZiAocGF0Y2hlZCA+PSB0b0JlUGF0Y2hlZCkge1xuICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3SW5kZXg7XG4gICAgICAgIGlmIChwcmV2Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGtleVRvTmV3SW5kZXhNYXAuZ2V0KHByZXZDaGlsZC5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoaiA9IHMyOyBqIDw9IGUyOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaiAtIHMyXSA9PT0gMCAmJiBpc1NhbWVWTm9kZVR5cGUocHJldkNoaWxkLCBjMltqXSkpIHtcbiAgICAgICAgICAgICAgbmV3SW5kZXggPSBqO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0luZGV4ID09PSB2b2lkIDApIHtcbiAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5kZXhUb09sZEluZGV4TWFwW25ld0luZGV4IC0gczJdID0gaSArIDE7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IG1heE5ld0luZGV4U29GYXIpIHtcbiAgICAgICAgICAgIG1heE5ld0luZGV4U29GYXIgPSBuZXdJbmRleDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIHByZXZDaGlsZCxcbiAgICAgICAgICAgIGMyW25ld0luZGV4XSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXRjaGVkKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlID0gbW92ZWQgPyBnZXRTZXF1ZW5jZShuZXdJbmRleFRvT2xkSW5kZXhNYXApIDogRU1QVFlfQVJSO1xuICAgICAgaiA9IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlLmxlbmd0aCAtIDE7XG4gICAgICBmb3IgKGkgPSB0b0JlUGF0Y2hlZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHMyICsgaTtcbiAgICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbbmV4dEluZGV4XTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dEluZGV4ICsgMSA8IGwyID8gYzJbbmV4dEluZGV4ICsgMV0uZWwgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaV0gPT09IDApIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBuZXh0Q2hpbGQsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGlzU1ZHLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3ZlZCkge1xuICAgICAgICAgIGlmIChqIDwgMCB8fCBpICE9PSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZVtqXSkge1xuICAgICAgICAgICAgbW92ZShuZXh0Q2hpbGQsIGNvbnRhaW5lciwgYW5jaG9yLCAyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgbW92ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwpID0+IHtcbiAgICBjb25zdCB7IGVsLCB0eXBlLCB0cmFuc2l0aW9uLCBjaGlsZHJlbiwgc2hhcGVGbGFnIH0gPSB2bm9kZTtcbiAgICBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgbW92ZSh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdm5vZGUuc3VzcGVuc2UubW92ZShjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgIHR5cGUubW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb3ZlKGNoaWxkcmVuW2ldLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgfVxuICAgICAgaG9zdEluc2VydCh2bm9kZS5hbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFN0YXRpYykge1xuICAgICAgbW92ZVN0YXRpY05vZGUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmVlZFRyYW5zaXRpb24yID0gbW92ZVR5cGUgIT09IDIgJiYgc2hhcGVGbGFnICYgMSAmJiB0cmFuc2l0aW9uO1xuICAgIGlmIChuZWVkVHJhbnNpdGlvbjIpIHtcbiAgICAgIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4gdHJhbnNpdGlvbi5lbnRlcihlbCksIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUsIGFmdGVyTGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHJlbW92ZTIgPSAoKSA9PiBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGNvbnN0IHBlcmZvcm1MZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICBsZWF2ZShlbCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlMigpO1xuICAgICAgICAgICAgYWZ0ZXJMZWF2ZSAmJiBhZnRlckxlYXZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWxheUxlYXZlKSB7XG4gICAgICAgICAgZGVsYXlMZWF2ZShlbCwgcmVtb3ZlMiwgcGVyZm9ybUxlYXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZXJmb3JtTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgfVxuICB9O1xuICBjb25zdCB1bm1vdW50ID0gKHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIHJlZixcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZGlyc1xuICAgIH0gPSB2bm9kZTtcbiAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiAyNTYpIHtcbiAgICAgIHBhcmVudENvbXBvbmVudC5jdHguZGVhY3RpdmF0ZSh2bm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZEludm9rZURpcnMgPSBzaGFwZUZsYWcgJiAxICYmIGRpcnM7XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlVm5vZGVIb29rID0gIWlzQXN5bmNXcmFwcGVyKHZub2RlKTtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVVbm1vdW50KSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICB1bm1vdW50Q29tcG9uZW50KHZub2RlLmNvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICB2bm9kZS5zdXNwZW5zZS51bm1vdW50KHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVbm1vdW50XCIpO1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgIHZub2RlLnR5cGUucmVtb3ZlKFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjMTE1MzogZmFzdCBwYXRoIHNob3VsZCBub3QgYmUgdGFrZW4gZm9yIG5vbi1zdGFibGUgKHYtZm9yKSBmcmFnbWVudHNcbiAgICAgICh0eXBlICE9PSBGcmFnbWVudCB8fCBwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0KSkge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEZyYWdtZW50ICYmIHBhdGNoRmxhZyAmICgxMjggfCAyNTYpIHx8ICFvcHRpbWl6ZWQgJiYgc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb1JlbW92ZSkge1xuICAgICAgICByZW1vdmUodm5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW52b2tlVm5vZGVIb29rICYmICh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlVW5tb3VudGVkKSB8fCBzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICB2bm9kZUhvb2sgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgIHNob3VsZEludm9rZURpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcInVubW91bnRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlbW92ZSA9ICh2bm9kZSkgPT4ge1xuICAgIGNvbnN0IHsgdHlwZSwgZWwsIGFuY2hvciwgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gICAgaWYgKHR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5wYXRjaEZsYWcgPiAwICYmIHZub2RlLnBhdGNoRmxhZyAmIDIwNDggJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gQ29tbWVudCkge1xuICAgICAgICAgICAgaG9zdFJlbW92ZShjaGlsZC5lbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZShjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUZyYWdtZW50KGVsLCBhbmNob3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gU3RhdGljKSB7XG4gICAgICByZW1vdmVTdGF0aWNOb2RlKHZub2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGVyZm9ybVJlbW92ZSA9ICgpID0+IHtcbiAgICAgIGhvc3RSZW1vdmUoZWwpO1xuICAgICAgaWYgKHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkICYmIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSkge1xuICAgICAgICB0cmFuc2l0aW9uLmFmdGVyTGVhdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxICYmIHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkKSB7XG4gICAgICBjb25zdCB7IGxlYXZlLCBkZWxheUxlYXZlIH0gPSB0cmFuc2l0aW9uO1xuICAgICAgY29uc3QgcGVyZm9ybUxlYXZlID0gKCkgPT4gbGVhdmUoZWwsIHBlcmZvcm1SZW1vdmUpO1xuICAgICAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICAgICAgZGVsYXlMZWF2ZSh2bm9kZS5lbCwgcGVyZm9ybVJlbW92ZSwgcGVyZm9ybUxlYXZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZXJmb3JtUmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCByZW1vdmVGcmFnbWVudCA9IChjdXIsIGVuZCkgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChjdXIgIT09IGVuZCkge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhjdXIpO1xuICAgICAgaG9zdFJlbW92ZShjdXIpO1xuICAgICAgY3VyID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShlbmQpO1xuICB9O1xuICBjb25zdCB1bm1vdW50Q29tcG9uZW50ID0gKGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpID0+IHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpbnN0YW5jZS50eXBlLl9faG1ySWQpIHtcbiAgICAgIHVucmVnaXN0ZXJITVIoaW5zdGFuY2UpO1xuICAgIH1cbiAgICBjb25zdCB7IGJ1bSwgc2NvcGUsIHVwZGF0ZSwgc3ViVHJlZSwgdW0gfSA9IGluc3RhbmNlO1xuICAgIGlmIChidW0pIHtcbiAgICAgIGludm9rZUFycmF5Rm5zKGJ1bSk7XG4gICAgfVxuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB1cGRhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICB1bm1vdW50KHN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH1cbiAgICBpZiAodW0pIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1bSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiAhcGFyZW50U3VzcGVuc2UuaXNVbm1vdW50ZWQgJiYgaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgJiYgaW5zdGFuY2Uuc3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGluc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnRDaGlsZHJlbiA9IChjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UsIHN0YXJ0ID0gMCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1bm1vdW50KGNoaWxkcmVuW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldE5leHRIb3N0Tm9kZSA9ICh2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICByZXR1cm4gZ2V0TmV4dEhvc3ROb2RlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlKTtcbiAgICB9XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgcmV0dXJuIHZub2RlLnN1c3BlbnNlLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhvc3ROZXh0U2libGluZyh2bm9kZS5hbmNob3IgfHwgdm5vZGUuZWwpO1xuICB9O1xuICBjb25zdCByZW5kZXIgPSAodm5vZGUsIGNvbnRhaW5lciwgaXNTVkcpID0+IHtcbiAgICBpZiAodm5vZGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fdm5vZGUpIHtcbiAgICAgICAgdW5tb3VudChjb250YWluZXIuX3Zub2RlLCBudWxsLCBudWxsLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2goY29udGFpbmVyLl92bm9kZSB8fCBudWxsLCB2bm9kZSwgY29udGFpbmVyLCBudWxsLCBudWxsLCBudWxsLCBpc1NWRyk7XG4gICAgfVxuICAgIGZsdXNoUHJlRmx1c2hDYnMoKTtcbiAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgfTtcbiAgY29uc3QgaW50ZXJuYWxzID0ge1xuICAgIHA6IHBhdGNoLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG06IG1vdmUsXG4gICAgcjogcmVtb3ZlLFxuICAgIG10OiBtb3VudENvbXBvbmVudCxcbiAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICBwYmM6IHBhdGNoQmxvY2tDaGlsZHJlbixcbiAgICBuOiBnZXROZXh0SG9zdE5vZGUsXG4gICAgbzogb3B0aW9uc1xuICB9O1xuICBsZXQgaHlkcmF0ZTtcbiAgbGV0IGh5ZHJhdGVOb2RlO1xuICBpZiAoY3JlYXRlSHlkcmF0aW9uRm5zKSB7XG4gICAgW2h5ZHJhdGUsIGh5ZHJhdGVOb2RlXSA9IGNyZWF0ZUh5ZHJhdGlvbkZucyhcbiAgICAgIGludGVybmFsc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW5kZXIsXG4gICAgaHlkcmF0ZSxcbiAgICBjcmVhdGVBcHA6IGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpXG4gIH07XG59XG5mdW5jdGlvbiB0b2dnbGVSZWN1cnNlKHsgZWZmZWN0LCB1cGRhdGUgfSwgYWxsb3dlZCkge1xuICBlZmZlY3QuYWxsb3dSZWN1cnNlID0gdXBkYXRlLmFsbG93UmVjdXJzZSA9IGFsbG93ZWQ7XG59XG5mdW5jdGlvbiBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbikge1xuICByZXR1cm4gKCFwYXJlbnRTdXNwZW5zZSB8fCBwYXJlbnRTdXNwZW5zZSAmJiAhcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQ7XG59XG5mdW5jdGlvbiB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMiwgc2hhbGxvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IGNoMSA9IG4xLmNoaWxkcmVuO1xuICBjb25zdCBjaDIgPSBuMi5jaGlsZHJlbjtcbiAgaWYgKGlzQXJyYXkoY2gxKSAmJiBpc0FycmF5KGNoMikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoMS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYzEgPSBjaDFbaV07XG4gICAgICBsZXQgYzIgPSBjaDJbaV07XG4gICAgICBpZiAoYzIuc2hhcGVGbGFnICYgMSAmJiAhYzIuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjMi5wYXRjaEZsYWcgPD0gMCB8fCBjMi5wYXRjaEZsYWcgPT09IDMyKSB7XG4gICAgICAgICAgYzIgPSBjaDJbaV0gPSBjbG9uZUlmTW91bnRlZChjaDJbaV0pO1xuICAgICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaGFsbG93KVxuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oYzEsIGMyKTtcbiAgICAgIH1cbiAgICAgIGlmIChjMi50eXBlID09PSBUZXh0KSB7XG4gICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjMi50eXBlID09PSBDb21tZW50ICYmICFjMi5lbCkge1xuICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0U2VxdWVuY2UoYXJyKSB7XG4gIGNvbnN0IHAgPSBhcnIuc2xpY2UoKTtcbiAgY29uc3QgcmVzdWx0ID0gWzBdO1xuICBsZXQgaSwgaiwgdSwgdiwgYztcbiAgY29uc3QgbGVuID0gYXJyLmxlbmd0aDtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgYXJySSA9IGFycltpXTtcbiAgICBpZiAoYXJySSAhPT0gMCkge1xuICAgICAgaiA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoYXJyW2pdIDwgYXJySSkge1xuICAgICAgICBwW2ldID0gajtcbiAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdSA9IDA7XG4gICAgICB2ID0gcmVzdWx0Lmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAodSA8IHYpIHtcbiAgICAgICAgYyA9IHUgKyB2ID4+IDE7XG4gICAgICAgIGlmIChhcnJbcmVzdWx0W2NdXSA8IGFyckkpIHtcbiAgICAgICAgICB1ID0gYyArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdiA9IGM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhcnJJIDwgYXJyW3Jlc3VsdFt1XV0pIHtcbiAgICAgICAgaWYgKHUgPiAwKSB7XG4gICAgICAgICAgcFtpXSA9IHJlc3VsdFt1IC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3VdID0gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdSA9IHJlc3VsdC5sZW5ndGg7XG4gIHYgPSByZXN1bHRbdSAtIDFdO1xuICB3aGlsZSAodS0tID4gMCkge1xuICAgIHJlc3VsdFt1XSA9IHY7XG4gICAgdiA9IHBbdl07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgaXNUZWxlcG9ydCA9ICh0eXBlKSA9PiB0eXBlLl9faXNUZWxlcG9ydDtcbmNvbnN0IGlzVGVsZXBvcnREaXNhYmxlZCA9IChwcm9wcykgPT4gcHJvcHMgJiYgKHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmRpc2FibGVkID09PSBcIlwiKTtcbmNvbnN0IGlzVGFyZ2V0U1ZHID0gKHRhcmdldCkgPT4gdHlwZW9mIFNWR0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudDtcbmNvbnN0IHJlc29sdmVUYXJnZXQgPSAocHJvcHMsIHNlbGVjdCkgPT4ge1xuICBjb25zdCB0YXJnZXRTZWxlY3RvciA9IHByb3BzICYmIHByb3BzLnRvO1xuICBpZiAoaXNTdHJpbmcodGFyZ2V0U2VsZWN0b3IpKSB7XG4gICAgaWYgKCFzZWxlY3QpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihcbiAgICAgICAgYEN1cnJlbnQgcmVuZGVyZXIgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgdGFyZ2V0IGZvciBUZWxlcG9ydHMuIChtaXNzaW5nIHF1ZXJ5U2VsZWN0b3IgcmVuZGVyZXIgb3B0aW9uKWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0KHRhcmdldFNlbGVjdG9yKTtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvY2F0ZSBUZWxlcG9ydCB0YXJnZXQgd2l0aCBzZWxlY3RvciBcIiR7dGFyZ2V0U2VsZWN0b3J9XCIuIE5vdGUgdGhlIHRhcmdldCBlbGVtZW50IG11c3QgZXhpc3QgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZCAtIGkuZS4gdGhlIHRhcmdldCBjYW5ub3QgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYsIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBvdXRzaWRlIG9mIHRoZSBlbnRpcmUgVnVlIGNvbXBvbmVudCB0cmVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICF0YXJnZXRTZWxlY3RvciAmJiAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgd2FybihgSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQ6ICR7dGFyZ2V0U2VsZWN0b3J9YCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRTZWxlY3RvcjtcbiAgfVxufTtcbmNvbnN0IFRlbGVwb3J0SW1wbCA9IHtcbiAgbmFtZTogXCJUZWxlcG9ydFwiLFxuICBfX2lzVGVsZXBvcnQ6IHRydWUsXG4gIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgaXNTVkcsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgICAgcGJjOiBwYXRjaEJsb2NrQ2hpbGRyZW4sXG4gICAgICBvOiB7IGluc2VydCwgcXVlcnlTZWxlY3RvciwgY3JlYXRlVGV4dCwgY3JlYXRlQ29tbWVudCB9XG4gICAgfSA9IGludGVybmFscztcbiAgICBjb25zdCBkaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMi5wcm9wcyk7XG4gICAgbGV0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IG4yLmVsID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBzdGFydFwiKSA6IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBjb25zdCBtYWluQW5jaG9yID0gbjIuYW5jaG9yID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBlbmRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgaW5zZXJ0KHBsYWNlaG9sZGVyLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBpbnNlcnQobWFpbkFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gbjIudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChuMi5wcm9wcywgcXVlcnlTZWxlY3Rvcik7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpbnNlcnQodGFyZ2V0QW5jaG9yLCB0YXJnZXQpO1xuICAgICAgICBpc1NWRyA9IGlzU1ZHIHx8IGlzVGFyZ2V0U1ZHKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIHdhcm4oXCJJbnZhbGlkIFRlbGVwb3J0IHRhcmdldCBvbiBtb3VudDpcIiwgdGFyZ2V0LCBgKCR7dHlwZW9mIHRhcmdldH0pYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBtb3VudCA9IChjb250YWluZXIyLCBhbmNob3IyKSA9PiB7XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgIGNvbnRhaW5lcjIsXG4gICAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgbW91bnQoY29udGFpbmVyLCBtYWluQW5jaG9yKTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgIG1vdW50KHRhcmdldCwgdGFyZ2V0QW5jaG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIGNvbnN0IG1haW5BbmNob3IgPSBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSBuMS50YXJnZXQ7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBuMS50YXJnZXRBbmNob3I7XG4gICAgICBjb25zdCB3YXNEaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMS5wcm9wcyk7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gd2FzRGlzYWJsZWQgPyBjb250YWluZXIgOiB0YXJnZXQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gd2FzRGlzYWJsZWQgPyBtYWluQW5jaG9yIDogdGFyZ2V0QW5jaG9yO1xuICAgICAgaXNTVkcgPSBpc1NWRyB8fCBpc1RhcmdldFNWRyh0YXJnZXQpO1xuICAgICAgaWYgKGR5bmFtaWNDaGlsZHJlbikge1xuICAgICAgICBwYXRjaEJsb2NrQ2hpbGRyZW4oXG4gICAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBjdXJyZW50QW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpc1NWRyxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBpZiAoIXdhc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBtYWluQW5jaG9yLFxuICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG4yLnByb3BzICYmIG4xLnByb3BzICYmIG4yLnByb3BzLnRvICE9PSBuMS5wcm9wcy50bykge1xuICAgICAgICAgICAgbjIucHJvcHMudG8gPSBuMS5wcm9wcy50bztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgobjIucHJvcHMgJiYgbjIucHJvcHMudG8pICE9PSAobjEucHJvcHMgJiYgbjEucHJvcHMudG8pKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFRhcmdldCA9IG4yLnRhcmdldCA9IHJlc29sdmVUYXJnZXQoXG4gICAgICAgICAgICBuMi5wcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChuZXh0VGFyZ2V0KSB7XG4gICAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgICBuZXh0VGFyZ2V0LFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICBcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZTpcIixcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnMobjIpO1xuICB9LFxuICByZW1vdmUodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG9wdGltaXplZCwgeyB1bTogdW5tb3VudCwgbzogeyByZW1vdmU6IGhvc3RSZW1vdmUgfSB9LCBkb1JlbW92ZSkge1xuICAgIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgYW5jaG9yLCB0YXJnZXRBbmNob3IsIHRhcmdldCwgcHJvcHMgfSA9IHZub2RlO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGhvc3RSZW1vdmUodGFyZ2V0QW5jaG9yKTtcbiAgICB9XG4gICAgZG9SZW1vdmUgJiYgaG9zdFJlbW92ZShhbmNob3IpO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlID0gZG9SZW1vdmUgfHwgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNob3VsZFJlbW92ZSxcbiAgICAgICAgICAhIWNoaWxkLmR5bmFtaWNDaGlsZHJlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbW92ZTogbW92ZVRlbGVwb3J0LFxuICBoeWRyYXRlOiBoeWRyYXRlVGVsZXBvcnRcbn07XG5mdW5jdGlvbiBtb3ZlVGVsZXBvcnQodm5vZGUsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCB7IG86IHsgaW5zZXJ0IH0sIG06IG1vdmUgfSwgbW92ZVR5cGUgPSAyKSB7XG4gIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgIGluc2VydCh2bm9kZS50YXJnZXRBbmNob3IsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBjb25zdCB7IGVsLCBhbmNob3IsIHNoYXBlRmxhZywgY2hpbGRyZW4sIHByb3BzIH0gPSB2bm9kZTtcbiAgY29uc3QgaXNSZW9yZGVyID0gbW92ZVR5cGUgPT09IDI7XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoZWwsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBpZiAoIWlzUmVvcmRlciB8fCBpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoXG4gICAgICAgICAgY2hpbGRyZW5baV0sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudEFuY2hvcixcbiAgICAgICAgICAyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZWxlcG9ydChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHtcbiAgbzogeyBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcXVlcnlTZWxlY3RvciB9XG59LCBoeWRyYXRlQ2hpbGRyZW4pIHtcbiAgY29uc3QgdGFyZ2V0ID0gdm5vZGUudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChcbiAgICB2bm9kZS5wcm9wcyxcbiAgICBxdWVyeVNlbGVjdG9yXG4gICk7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGFyZ2V0Ll9scGEgfHwgdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoaXNUZWxlcG9ydERpc2FibGVkKHZub2RlLnByb3BzKSkge1xuICAgICAgICB2bm9kZS5hbmNob3IgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgbmV4dFNpYmxpbmcobm9kZSksXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Tm9kZShub2RlKSxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICB2bm9kZS50YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuYW5jaG9yID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGxldCB0YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlO1xuICAgICAgICB3aGlsZSAodGFyZ2V0QW5jaG9yKSB7XG4gICAgICAgICAgdGFyZ2V0QW5jaG9yID0gbmV4dFNpYmxpbmcodGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICBpZiAodGFyZ2V0QW5jaG9yICYmIHRhcmdldEFuY2hvci5ub2RlVHlwZSA9PT0gOCAmJiB0YXJnZXRBbmNob3IuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBhbmNob3JcIikge1xuICAgICAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0QW5jaG9yO1xuICAgICAgICAgICAgdGFyZ2V0Ll9scGEgPSB2bm9kZS50YXJnZXRBbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUudGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgdGFyZ2V0Tm9kZSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ3NzVmFycyh2bm9kZSk7XG4gIH1cbiAgcmV0dXJuIHZub2RlLmFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS5hbmNob3IpO1xufVxuY29uc3QgVGVsZXBvcnQgPSBUZWxlcG9ydEltcGw7XG5mdW5jdGlvbiB1cGRhdGVDc3NWYXJzKHZub2RlKSB7XG4gIGNvbnN0IGN0eCA9IHZub2RlLmN0eDtcbiAgaWYgKGN0eCAmJiBjdHgudXQpIHtcbiAgICBsZXQgbm9kZSA9IHZub2RlLmNoaWxkcmVuWzBdLmVsO1xuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IHZub2RlLnRhcmdldEFuY2hvcikge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZGF0YS12LW93bmVyXCIsIGN0eC51aWQpO1xuICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIGN0eC51dCgpO1xuICB9XG59XG5cbmNvbnN0IEZyYWdtZW50ID0gU3ltYm9sLmZvcihcInYtZmd0XCIpO1xuY29uc3QgVGV4dCA9IFN5bWJvbC5mb3IoXCJ2LXR4dFwiKTtcbmNvbnN0IENvbW1lbnQgPSBTeW1ib2wuZm9yKFwidi1jbXRcIik7XG5jb25zdCBTdGF0aWMgPSBTeW1ib2wuZm9yKFwidi1zdGNcIik7XG5jb25zdCBibG9ja1N0YWNrID0gW107XG5sZXQgY3VycmVudEJsb2NrID0gbnVsbDtcbmZ1bmN0aW9uIG9wZW5CbG9jayhkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSkge1xuICBibG9ja1N0YWNrLnB1c2goY3VycmVudEJsb2NrID0gZGlzYWJsZVRyYWNraW5nID8gbnVsbCA6IFtdKTtcbn1cbmZ1bmN0aW9uIGNsb3NlQmxvY2soKSB7XG4gIGJsb2NrU3RhY2sucG9wKCk7XG4gIGN1cnJlbnRCbG9jayA9IGJsb2NrU3RhY2tbYmxvY2tTdGFjay5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxubGV0IGlzQmxvY2tUcmVlRW5hYmxlZCA9IDE7XG5mdW5jdGlvbiBzZXRCbG9ja1RyYWNraW5nKHZhbHVlKSB7XG4gIGlzQmxvY2tUcmVlRW5hYmxlZCArPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldHVwQmxvY2sodm5vZGUpIHtcbiAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gaXNCbG9ja1RyZWVFbmFibGVkID4gMCA/IGN1cnJlbnRCbG9jayB8fCBFTVBUWV9BUlIgOiBudWxsO1xuICBjbG9zZUJsb2NrKCk7XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50QmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgc2hhcGVGbGFnKSB7XG4gIHJldHVybiBzZXR1cEJsb2NrKFxuICAgIGNyZWF0ZUJhc2VWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgdHJ1ZVxuICAgICAgLyogaXNCbG9jayAqL1xuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGR5bmFtaWNQcm9wcyxcbiAgICAgIHRydWVcbiAgICAgIC8qIGlzQmxvY2s6IHByZXZlbnQgYSBibG9jayBmcm9tIHRyYWNraW5nIGl0c2VsZiAqL1xuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVk5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuX192X2lzVk5vZGUgPT09IHRydWUgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbjIuc2hhcGVGbGFnICYgNiAmJiBobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG4yLnR5cGUpKSB7XG4gICAgbjEuc2hhcGVGbGFnICY9IH4yNTY7XG4gICAgbjIuc2hhcGVGbGFnICY9IH41MTI7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuMS50eXBlID09PSBuMi50eXBlICYmIG4xLmtleSA9PT0gbjIua2V5O1xufVxubGV0IHZub2RlQXJnc1RyYW5zZm9ybWVyO1xuZnVuY3Rpb24gdHJhbnNmb3JtVk5vZGVBcmdzKHRyYW5zZm9ybWVyKSB7XG4gIHZub2RlQXJnc1RyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7XG59XG5jb25zdCBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtID0gKC4uLmFyZ3MpID0+IHtcbiAgcmV0dXJuIF9jcmVhdGVWTm9kZShcbiAgICAuLi52bm9kZUFyZ3NUcmFuc2Zvcm1lciA/IHZub2RlQXJnc1RyYW5zZm9ybWVyKGFyZ3MsIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkgOiBhcmdzXG4gICk7XG59O1xuY29uc3QgSW50ZXJuYWxPYmplY3RLZXkgPSBgX192SW50ZXJuYWxgO1xuY29uc3Qgbm9ybWFsaXplS2V5ID0gKHsga2V5IH0pID0+IGtleSAhPSBudWxsID8ga2V5IDogbnVsbDtcbmNvbnN0IG5vcm1hbGl6ZVJlZiA9ICh7XG4gIHJlZixcbiAgcmVmX2tleSxcbiAgcmVmX2ZvclxufSkgPT4ge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gXCJudW1iZXJcIikge1xuICAgIHJlZiA9IFwiXCIgKyByZWY7XG4gIH1cbiAgcmV0dXJuIHJlZiAhPSBudWxsID8gaXNTdHJpbmcocmVmKSB8fCBpc1JlZihyZWYpIHx8IGlzRnVuY3Rpb24ocmVmKSA/IHsgaTogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLCByOiByZWYsIGs6IHJlZl9rZXksIGY6ICEhcmVmX2ZvciB9IDogcmVmIDogbnVsbDtcbn07XG5mdW5jdGlvbiBjcmVhdGVCYXNlVk5vZGUodHlwZSwgcHJvcHMgPSBudWxsLCBjaGlsZHJlbiA9IG51bGwsIHBhdGNoRmxhZyA9IDAsIGR5bmFtaWNQcm9wcyA9IG51bGwsIHNoYXBlRmxhZyA9IHR5cGUgPT09IEZyYWdtZW50ID8gMCA6IDEsIGlzQmxvY2tOb2RlID0gZmFsc2UsIG5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uID0gZmFsc2UpIHtcbiAgY29uc3Qgdm5vZGUgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZSxcbiAgICBwcm9wcyxcbiAgICBrZXk6IHByb3BzICYmIG5vcm1hbGl6ZUtleShwcm9wcyksXG4gICAgcmVmOiBwcm9wcyAmJiBub3JtYWxpemVSZWYocHJvcHMpLFxuICAgIHNjb3BlSWQ6IGN1cnJlbnRTY29wZUlkLFxuICAgIHNsb3RTY29wZUlkczogbnVsbCxcbiAgICBjaGlsZHJlbixcbiAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgc3VzcGVuc2U6IG51bGwsXG4gICAgc3NDb250ZW50OiBudWxsLFxuICAgIHNzRmFsbGJhY2s6IG51bGwsXG4gICAgZGlyczogbnVsbCxcbiAgICB0cmFuc2l0aW9uOiBudWxsLFxuICAgIGVsOiBudWxsLFxuICAgIGFuY2hvcjogbnVsbCxcbiAgICB0YXJnZXQ6IG51bGwsXG4gICAgdGFyZ2V0QW5jaG9yOiBudWxsLFxuICAgIHN0YXRpY0NvdW50OiAwLFxuICAgIHNoYXBlRmxhZyxcbiAgICBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzLFxuICAgIGR5bmFtaWNDaGlsZHJlbjogbnVsbCxcbiAgICBhcHBDb250ZXh0OiBudWxsLFxuICAgIGN0eDogY3VycmVudFJlbmRlcmluZ0luc3RhbmNlXG4gIH07XG4gIGlmIChuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbikge1xuICAgIG5vcm1hbGl6ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdHlwZS5ub3JtYWxpemUodm5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGlsZHJlbikge1xuICAgIHZub2RlLnNoYXBlRmxhZyB8PSBpc1N0cmluZyhjaGlsZHJlbikgPyA4IDogMTY7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUua2V5ICE9PSB2bm9kZS5rZXkpIHtcbiAgICB3YXJuKGBWTm9kZSBjcmVhdGVkIHdpdGggaW52YWxpZCBrZXkgKE5hTikuIFZOb2RlIHR5cGU6YCwgdm5vZGUudHlwZSk7XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgLy8gYXZvaWQgYSBibG9jayBub2RlIGZyb20gdHJhY2tpbmcgaXRzZWxmXG4gICFpc0Jsb2NrTm9kZSAmJiAvLyBoYXMgY3VycmVudCBwYXJlbnQgYmxvY2tcbiAgY3VycmVudEJsb2NrICYmIC8vIHByZXNlbmNlIG9mIGEgcGF0Y2ggZmxhZyBpbmRpY2F0ZXMgdGhpcyBub2RlIG5lZWRzIHBhdGNoaW5nIG9uIHVwZGF0ZXMuXG4gIC8vIGNvbXBvbmVudCBub2RlcyBhbHNvIHNob3VsZCBhbHdheXMgYmUgcGF0Y2hlZCwgYmVjYXVzZSBldmVuIGlmIHRoZVxuICAvLyBjb21wb25lbnQgZG9lc24ndCBuZWVkIHRvIHVwZGF0ZSwgaXQgbmVlZHMgdG8gcGVyc2lzdCB0aGUgaW5zdGFuY2Ugb24gdG9cbiAgLy8gdGhlIG5leHQgdm5vZGUgc28gdGhhdCBpdCBjYW4gYmUgcHJvcGVybHkgdW5tb3VudGVkIGxhdGVyLlxuICAodm5vZGUucGF0Y2hGbGFnID4gMCB8fCBzaGFwZUZsYWcgJiA2KSAmJiAvLyB0aGUgRVZFTlRTIGZsYWcgaXMgb25seSBmb3IgaHlkcmF0aW9uIGFuZCBpZiBpdCBpcyB0aGUgb25seSBmbGFnLCB0aGVcbiAgLy8gdm5vZGUgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGR5bmFtaWMgZHVlIHRvIGhhbmRsZXIgY2FjaGluZy5cbiAgdm5vZGUucGF0Y2hGbGFnICE9PSAzMikge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5jb25zdCBjcmVhdGVWTm9kZSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIDogX2NyZWF0ZVZOb2RlO1xuZnVuY3Rpb24gX2NyZWF0ZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBpc0Jsb2NrTm9kZSA9IGZhbHNlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlID09PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXR5cGUpIHtcbiAgICAgIHdhcm4oYEludmFsaWQgdm5vZGUgdHlwZSB3aGVuIGNyZWF0aW5nIHZub2RlOiAke3R5cGV9LmApO1xuICAgIH1cbiAgICB0eXBlID0gQ29tbWVudDtcbiAgfVxuICBpZiAoaXNWTm9kZSh0eXBlKSkge1xuICAgIGNvbnN0IGNsb25lZCA9IGNsb25lVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICB0cnVlXG4gICAgICAvKiBtZXJnZVJlZjogdHJ1ZSAqL1xuICAgICk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBub3JtYWxpemVDaGlsZHJlbihjbG9uZWQsIGNoaWxkcmVuKTtcbiAgICB9XG4gICAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgIWlzQmxvY2tOb2RlICYmIGN1cnJlbnRCbG9jaykge1xuICAgICAgaWYgKGNsb25lZC5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgIGN1cnJlbnRCbG9ja1tjdXJyZW50QmxvY2suaW5kZXhPZih0eXBlKV0gPSBjbG9uZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50QmxvY2sucHVzaChjbG9uZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBjbG9uZWQucGF0Y2hGbGFnIHw9IC0yO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbiAgaWYgKGlzQ2xhc3NDb21wb25lbnQodHlwZSkpIHtcbiAgICB0eXBlID0gdHlwZS5fX3ZjY09wdHM7XG4gIH1cbiAgaWYgKHByb3BzKSB7XG4gICAgcHJvcHMgPSBndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpO1xuICAgIGxldCB7IGNsYXNzOiBrbGFzcywgc3R5bGUgfSA9IHByb3BzO1xuICAgIGlmIChrbGFzcyAmJiAhaXNTdHJpbmcoa2xhc3MpKSB7XG4gICAgICBwcm9wcy5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKGtsYXNzKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHN0eWxlKSkge1xuICAgICAgaWYgKGlzUHJveHkoc3R5bGUpICYmICFpc0FycmF5KHN0eWxlKSkge1xuICAgICAgICBzdHlsZSA9IGV4dGVuZCh7fSwgc3R5bGUpO1xuICAgICAgfVxuICAgICAgcHJvcHMuc3R5bGUgPSBub3JtYWxpemVTdHlsZShzdHlsZSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNoYXBlRmxhZyA9IGlzU3RyaW5nKHR5cGUpID8gMSA6IGlzU3VzcGVuc2UodHlwZSkgPyAxMjggOiBpc1RlbGVwb3J0KHR5cGUpID8gNjQgOiBpc09iamVjdCh0eXBlKSA/IDQgOiBpc0Z1bmN0aW9uKHR5cGUpID8gMiA6IDA7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNoYXBlRmxhZyAmIDQgJiYgaXNQcm94eSh0eXBlKSkge1xuICAgIHR5cGUgPSB0b1Jhdyh0eXBlKTtcbiAgICB3YXJuKFxuICAgICAgYFZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB0aGF0IHdhcyBtYWRlIGEgcmVhY3RpdmUgb2JqZWN0LiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIG92ZXJoZWFkIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBieSBtYXJraW5nIHRoZSBjb21wb25lbnQgd2l0aCBcXGBtYXJrUmF3XFxgIG9yIHVzaW5nIFxcYHNoYWxsb3dSZWZcXGAgaW5zdGVhZCBvZiBcXGByZWZcXGAuYCxcbiAgICAgIGBcbkNvbXBvbmVudCB0aGF0IHdhcyBtYWRlIHJlYWN0aXZlOiBgLFxuICAgICAgdHlwZVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJhc2VWTm9kZShcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgc2hhcGVGbGFnLFxuICAgIGlzQmxvY2tOb2RlLFxuICAgIHRydWVcbiAgKTtcbn1cbmZ1bmN0aW9uIGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcykge1xuICBpZiAoIXByb3BzKVxuICAgIHJldHVybiBudWxsO1xuICByZXR1cm4gaXNQcm94eShwcm9wcykgfHwgSW50ZXJuYWxPYmplY3RLZXkgaW4gcHJvcHMgPyBleHRlbmQoe30sIHByb3BzKSA6IHByb3BzO1xufVxuZnVuY3Rpb24gY2xvbmVWTm9kZSh2bm9kZSwgZXh0cmFQcm9wcywgbWVyZ2VSZWYgPSBmYWxzZSkge1xuICBjb25zdCB7IHByb3BzLCByZWYsIHBhdGNoRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBtZXJnZWRQcm9wcyA9IGV4dHJhUHJvcHMgPyBtZXJnZVByb3BzKHByb3BzIHx8IHt9LCBleHRyYVByb3BzKSA6IHByb3BzO1xuICBjb25zdCBjbG9uZWQgPSB7XG4gICAgX192X2lzVk5vZGU6IHRydWUsXG4gICAgX192X3NraXA6IHRydWUsXG4gICAgdHlwZTogdm5vZGUudHlwZSxcbiAgICBwcm9wczogbWVyZ2VkUHJvcHMsXG4gICAga2V5OiBtZXJnZWRQcm9wcyAmJiBub3JtYWxpemVLZXkobWVyZ2VkUHJvcHMpLFxuICAgIHJlZjogZXh0cmFQcm9wcyAmJiBleHRyYVByb3BzLnJlZiA/IChcbiAgICAgIC8vICMyMDc4IGluIHRoZSBjYXNlIG9mIDxjb21wb25lbnQgOmlzPVwidm5vZGVcIiByZWY9XCJleHRyYVwiLz5cbiAgICAgIC8vIGlmIHRoZSB2bm9kZSBpdHNlbGYgYWxyZWFkeSBoYXMgYSByZWYsIGNsb25lVk5vZGUgd2lsbCBuZWVkIHRvIG1lcmdlXG4gICAgICAvLyB0aGUgcmVmcyBzbyB0aGUgc2luZ2xlIHZub2RlIGNhbiBiZSBzZXQgb24gbXVsdGlwbGUgcmVmc1xuICAgICAgbWVyZ2VSZWYgJiYgcmVmID8gaXNBcnJheShyZWYpID8gcmVmLmNvbmNhdChub3JtYWxpemVSZWYoZXh0cmFQcm9wcykpIDogW3JlZiwgbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXSA6IG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKVxuICAgICkgOiByZWYsXG4gICAgc2NvcGVJZDogdm5vZGUuc2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IHZub2RlLnNsb3RTY29wZUlkcyxcbiAgICBjaGlsZHJlbjogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwYXRjaEZsYWcgPT09IC0xICYmIGlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKSA6IGNoaWxkcmVuLFxuICAgIHRhcmdldDogdm5vZGUudGFyZ2V0LFxuICAgIHRhcmdldEFuY2hvcjogdm5vZGUudGFyZ2V0QW5jaG9yLFxuICAgIHN0YXRpY0NvdW50OiB2bm9kZS5zdGF0aWNDb3VudCxcbiAgICBzaGFwZUZsYWc6IHZub2RlLnNoYXBlRmxhZyxcbiAgICAvLyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIHdpdGggZXh0cmEgcHJvcHMsIHdlIGNhbiBubyBsb25nZXIgYXNzdW1lIGl0c1xuICAgIC8vIGV4aXN0aW5nIHBhdGNoIGZsYWcgdG8gYmUgcmVsaWFibGUgYW5kIG5lZWQgdG8gYWRkIHRoZSBGVUxMX1BST1BTIGZsYWcuXG4gICAgLy8gbm90ZTogcHJlc2VydmUgZmxhZyBmb3IgZnJhZ21lbnRzIHNpbmNlIHRoZXkgdXNlIHRoZSBmbGFnIGZvciBjaGlsZHJlblxuICAgIC8vIGZhc3QgcGF0aHMgb25seS5cbiAgICBwYXRjaEZsYWc6IGV4dHJhUHJvcHMgJiYgdm5vZGUudHlwZSAhPT0gRnJhZ21lbnQgPyBwYXRjaEZsYWcgPT09IC0xID8gMTYgOiBwYXRjaEZsYWcgfCAxNiA6IHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHM6IHZub2RlLmR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IHZub2RlLmR5bmFtaWNDaGlsZHJlbixcbiAgICBhcHBDb250ZXh0OiB2bm9kZS5hcHBDb250ZXh0LFxuICAgIGRpcnM6IHZub2RlLmRpcnMsXG4gICAgdHJhbnNpdGlvbjogdm5vZGUudHJhbnNpdGlvbixcbiAgICAvLyBUaGVzZSBzaG91bGQgdGVjaG5pY2FsbHkgb25seSBiZSBub24tbnVsbCBvbiBtb3VudGVkIFZOb2Rlcy4gSG93ZXZlcixcbiAgICAvLyB0aGV5ICpzaG91bGQqIGJlIGNvcGllZCBmb3Iga2VwdC1hbGl2ZSB2bm9kZXMuIFNvIHdlIGp1c3QgYWx3YXlzIGNvcHlcbiAgICAvLyB0aGVtIHNpbmNlIHRoZW0gYmVpbmcgbm9uLW51bGwgZHVyaW5nIGEgbW91bnQgZG9lc24ndCBhZmZlY3QgdGhlIGxvZ2ljIGFzXG4gICAgLy8gdGhleSB3aWxsIHNpbXBseSBiZSBvdmVyd3JpdHRlbi5cbiAgICBjb21wb25lbnQ6IHZub2RlLmNvbXBvbmVudCxcbiAgICBzdXNwZW5zZTogdm5vZGUuc3VzcGVuc2UsXG4gICAgc3NDb250ZW50OiB2bm9kZS5zc0NvbnRlbnQgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0NvbnRlbnQpLFxuICAgIHNzRmFsbGJhY2s6IHZub2RlLnNzRmFsbGJhY2sgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0ZhbGxiYWNrKSxcbiAgICBlbDogdm5vZGUuZWwsXG4gICAgYW5jaG9yOiB2bm9kZS5hbmNob3IsXG4gICAgY3R4OiB2bm9kZS5jdHgsXG4gICAgY2U6IHZub2RlLmNlXG4gIH07XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBkZWVwQ2xvbmVWTm9kZSh2bm9kZSkge1xuICBjb25zdCBjbG9uZWQgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgaWYgKGlzQXJyYXkodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgY2xvbmVkLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4ubWFwKGRlZXBDbG9uZVZOb2RlKTtcbiAgfVxuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dFZOb2RlKHRleHQgPSBcIiBcIiwgZmxhZyA9IDApIHtcbiAgcmV0dXJuIGNyZWF0ZVZOb2RlKFRleHQsIG51bGwsIHRleHQsIGZsYWcpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RhdGljVk5vZGUoY29udGVudCwgbnVtYmVyT2ZOb2Rlcykge1xuICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKFN0YXRpYywgbnVsbCwgY29udGVudCk7XG4gIHZub2RlLnN0YXRpY0NvdW50ID0gbnVtYmVyT2ZOb2RlcztcbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudFZOb2RlKHRleHQgPSBcIlwiLCBhc0Jsb2NrID0gZmFsc2UpIHtcbiAgcmV0dXJuIGFzQmxvY2sgPyAob3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKENvbW1lbnQsIG51bGwsIHRleHQpKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQsIG51bGwsIHRleHQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplVk5vZGUoY2hpbGQpIHtcbiAgaWYgKGNoaWxkID09IG51bGwgfHwgdHlwZW9mIGNoaWxkID09PSBcImJvb2xlYW5cIikge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShDb21tZW50KTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkKSkge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShcbiAgICAgIEZyYWdtZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vICMzNjY2LCBhdm9pZCByZWZlcmVuY2UgcG9sbHV0aW9uIHdoZW4gcmV1c2luZyB2bm9kZVxuICAgICAgY2hpbGQuc2xpY2UoKVxuICAgICk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGNsb25lSWZNb3VudGVkKGNoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgU3RyaW5nKGNoaWxkKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGNsb25lSWZNb3VudGVkKGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZC5lbCA9PT0gbnVsbCAmJiBjaGlsZC5wYXRjaEZsYWcgIT09IC0xIHx8IGNoaWxkLm1lbW8gPyBjaGlsZCA6IGNsb25lVk5vZGUoY2hpbGQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIGNoaWxkcmVuKSB7XG4gIGxldCB0eXBlID0gMDtcbiAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHZub2RlO1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIHR5cGUgPSAxNjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIHtcbiAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2NCkpIHtcbiAgICAgIGNvbnN0IHNsb3QgPSBjaGlsZHJlbi5kZWZhdWx0O1xuICAgICAgaWYgKHNsb3QpIHtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IGZhbHNlKTtcbiAgICAgICAgbm9ybWFsaXplQ2hpbGRyZW4odm5vZGUsIHNsb3QoKSk7XG4gICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDMyO1xuICAgICAgY29uc3Qgc2xvdEZsYWcgPSBjaGlsZHJlbi5fO1xuICAgICAgaWYgKCFzbG90RmxhZyAmJiAhKEludGVybmFsT2JqZWN0S2V5IGluIGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5fY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICAgICAgfSBlbHNlIGlmIChzbG90RmxhZyA9PT0gMyAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5zbG90cy5fID09PSAxKSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDI7XG4gICAgICAgICAgdm5vZGUucGF0Y2hGbGFnIHw9IDEwMjQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjaGlsZHJlbikpIHtcbiAgICBjaGlsZHJlbiA9IHsgZGVmYXVsdDogY2hpbGRyZW4sIF9jdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB9O1xuICAgIHR5cGUgPSAzMjtcbiAgfSBlbHNlIHtcbiAgICBjaGlsZHJlbiA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICB0eXBlID0gMTY7XG4gICAgICBjaGlsZHJlbiA9IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDg7XG4gICAgfVxuICB9XG4gIHZub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHZub2RlLnNoYXBlRmxhZyB8PSB0eXBlO1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wcyguLi5hcmdzKSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b01lcmdlID0gYXJnc1tpXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b01lcmdlKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgaWYgKHJldC5jbGFzcyAhPT0gdG9NZXJnZS5jbGFzcykge1xuICAgICAgICAgIHJldC5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKFtyZXQuY2xhc3MsIHRvTWVyZ2UuY2xhc3NdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgICAgICByZXQuc3R5bGUgPSBub3JtYWxpemVTdHlsZShbcmV0LnN0eWxlLCB0b01lcmdlLnN0eWxlXSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJldFtrZXldO1xuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHRvTWVyZ2Vba2V5XTtcbiAgICAgICAgaWYgKGluY29taW5nICYmIGV4aXN0aW5nICE9PSBpbmNvbWluZyAmJiAhKGlzQXJyYXkoZXhpc3RpbmcpICYmIGV4aXN0aW5nLmluY2x1ZGVzKGluY29taW5nKSkpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBpbmNvbWluZykgOiBpbmNvbWluZztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFwiXCIpIHtcbiAgICAgICAgcmV0W2tleV0gPSB0b01lcmdlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBpbnZva2VWTm9kZUhvb2soaG9vaywgaW5zdGFuY2UsIHZub2RlLCBwcmV2Vk5vZGUgPSBudWxsKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA3LCBbXG4gICAgdm5vZGUsXG4gICAgcHJldlZOb2RlXG4gIF0pO1xufVxuXG5jb25zdCBlbXB0eUFwcENvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG5sZXQgdWlkID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHZub2RlLCBwYXJlbnQsIHN1c3BlbnNlKSB7XG4gIGNvbnN0IHR5cGUgPSB2bm9kZS50eXBlO1xuICBjb25zdCBhcHBDb250ZXh0ID0gKHBhcmVudCA/IHBhcmVudC5hcHBDb250ZXh0IDogdm5vZGUuYXBwQ29udGV4dCkgfHwgZW1wdHlBcHBDb250ZXh0O1xuICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICB1aWQ6IHVpZCsrLFxuICAgIHZub2RlLFxuICAgIHR5cGUsXG4gICAgcGFyZW50LFxuICAgIGFwcENvbnRleHQsXG4gICAgcm9vdDogbnVsbCxcbiAgICAvLyB0byBiZSBpbW1lZGlhdGVseSBzZXRcbiAgICBuZXh0OiBudWxsLFxuICAgIHN1YlRyZWU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIGVmZmVjdDogbnVsbCxcbiAgICB1cGRhdGU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIHNjb3BlOiBuZXcgRWZmZWN0U2NvcGUoXG4gICAgICB0cnVlXG4gICAgICAvKiBkZXRhY2hlZCAqL1xuICAgICksXG4gICAgcmVuZGVyOiBudWxsLFxuICAgIHByb3h5OiBudWxsLFxuICAgIGV4cG9zZWQ6IG51bGwsXG4gICAgZXhwb3NlUHJveHk6IG51bGwsXG4gICAgd2l0aFByb3h5OiBudWxsLFxuICAgIHByb3ZpZGVzOiBwYXJlbnQgPyBwYXJlbnQucHJvdmlkZXMgOiBPYmplY3QuY3JlYXRlKGFwcENvbnRleHQucHJvdmlkZXMpLFxuICAgIGFjY2Vzc0NhY2hlOiBudWxsLFxuICAgIHJlbmRlckNhY2hlOiBbXSxcbiAgICAvLyBsb2NhbCByZXNvbHZlZCBhc3NldHNcbiAgICBjb21wb25lbnRzOiBudWxsLFxuICAgIGRpcmVjdGl2ZXM6IG51bGwsXG4gICAgLy8gcmVzb2x2ZWQgcHJvcHMgYW5kIGVtaXRzIG9wdGlvbnNcbiAgICBwcm9wc09wdGlvbnM6IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICBlbWl0c09wdGlvbnM6IG5vcm1hbGl6ZUVtaXRzT3B0aW9ucyh0eXBlLCBhcHBDb250ZXh0KSxcbiAgICAvLyBlbWl0XG4gICAgZW1pdDogbnVsbCxcbiAgICAvLyB0byBiZSBzZXQgaW1tZWRpYXRlbHlcbiAgICBlbWl0dGVkOiBudWxsLFxuICAgIC8vIHByb3BzIGRlZmF1bHQgdmFsdWVcbiAgICBwcm9wc0RlZmF1bHRzOiBFTVBUWV9PQkosXG4gICAgLy8gaW5oZXJpdEF0dHJzXG4gICAgaW5oZXJpdEF0dHJzOiB0eXBlLmluaGVyaXRBdHRycyxcbiAgICAvLyBzdGF0ZVxuICAgIGN0eDogRU1QVFlfT0JKLFxuICAgIGRhdGE6IEVNUFRZX09CSixcbiAgICBwcm9wczogRU1QVFlfT0JKLFxuICAgIGF0dHJzOiBFTVBUWV9PQkosXG4gICAgc2xvdHM6IEVNUFRZX09CSixcbiAgICByZWZzOiBFTVBUWV9PQkosXG4gICAgc2V0dXBTdGF0ZTogRU1QVFlfT0JKLFxuICAgIHNldHVwQ29udGV4dDogbnVsbCxcbiAgICBhdHRyc1Byb3h5OiBudWxsLFxuICAgIHNsb3RzUHJveHk6IG51bGwsXG4gICAgLy8gc3VzcGVuc2UgcmVsYXRlZFxuICAgIHN1c3BlbnNlLFxuICAgIHN1c3BlbnNlSWQ6IHN1c3BlbnNlID8gc3VzcGVuc2UucGVuZGluZ0lkIDogMCxcbiAgICBhc3luY0RlcDogbnVsbCxcbiAgICBhc3luY1Jlc29sdmVkOiBmYWxzZSxcbiAgICAvLyBsaWZlY3ljbGUgaG9va3NcbiAgICAvLyBub3QgdXNpbmcgZW51bXMgaGVyZSBiZWNhdXNlIGl0IHJlc3VsdHMgaW4gY29tcHV0ZWQgcHJvcGVydGllc1xuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgIGlzRGVhY3RpdmF0ZWQ6IGZhbHNlLFxuICAgIGJjOiBudWxsLFxuICAgIGM6IG51bGwsXG4gICAgYm06IG51bGwsXG4gICAgbTogbnVsbCxcbiAgICBidTogbnVsbCxcbiAgICB1OiBudWxsLFxuICAgIHVtOiBudWxsLFxuICAgIGJ1bTogbnVsbCxcbiAgICBkYTogbnVsbCxcbiAgICBhOiBudWxsLFxuICAgIHJ0ZzogbnVsbCxcbiAgICBydGM6IG51bGwsXG4gICAgZWM6IG51bGwsXG4gICAgc3A6IG51bGxcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbnN0YW5jZS5jdHggPSBjcmVhdGVEZXZSZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jdHggPSB7IF86IGluc3RhbmNlIH07XG4gIH1cbiAgaW5zdGFuY2Uucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IDogaW5zdGFuY2U7XG4gIGluc3RhbmNlLmVtaXQgPSBlbWl0LmJpbmQobnVsbCwgaW5zdGFuY2UpO1xuICBpZiAodm5vZGUuY2UpIHtcbiAgICB2bm9kZS5jZShpbnN0YW5jZSk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxubGV0IGN1cnJlbnRJbnN0YW5jZSA9IG51bGw7XG5jb25zdCBnZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xubGV0IGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlO1xubGV0IGdsb2JhbEN1cnJlbnRJbnN0YW5jZVNldHRlcnM7XG5sZXQgc2V0dGVyc0tleSA9IFwiX19WVUVfSU5TVEFOQ0VfU0VUVEVSU19fXCI7XG57XG4gIGlmICghKGdsb2JhbEN1cnJlbnRJbnN0YW5jZVNldHRlcnMgPSBnZXRHbG9iYWxUaGlzKClbc2V0dGVyc0tleV0pKSB7XG4gICAgZ2xvYmFsQ3VycmVudEluc3RhbmNlU2V0dGVycyA9IGdldEdsb2JhbFRoaXMoKVtzZXR0ZXJzS2V5XSA9IFtdO1xuICB9XG4gIGdsb2JhbEN1cnJlbnRJbnN0YW5jZVNldHRlcnMucHVzaCgoaSkgPT4gY3VycmVudEluc3RhbmNlID0gaSk7XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlID0gKGluc3RhbmNlKSA9PiB7XG4gICAgaWYgKGdsb2JhbEN1cnJlbnRJbnN0YW5jZVNldHRlcnMubGVuZ3RoID4gMSkge1xuICAgICAgZ2xvYmFsQ3VycmVudEluc3RhbmNlU2V0dGVycy5mb3JFYWNoKChzKSA9PiBzKGluc3RhbmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JhbEN1cnJlbnRJbnN0YW5jZVNldHRlcnNbMF0oaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbn1cbmNvbnN0IHNldEN1cnJlbnRJbnN0YW5jZSA9IChpbnN0YW5jZSkgPT4ge1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gIGluc3RhbmNlLnNjb3BlLm9uKCk7XG59O1xuY29uc3QgdW5zZXRDdXJyZW50SW5zdGFuY2UgPSAoKSA9PiB7XG4gIGN1cnJlbnRJbnN0YW5jZSAmJiBjdXJyZW50SW5zdGFuY2Uuc2NvcGUub2ZmKCk7XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKG51bGwpO1xufTtcbmNvbnN0IGlzQnVpbHRJblRhZyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKFwic2xvdCxjb21wb25lbnRcIik7XG5mdW5jdGlvbiB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgY29uZmlnKSB7XG4gIGNvbnN0IGFwcElzTmF0aXZlVGFnID0gY29uZmlnLmlzTmF0aXZlVGFnIHx8IE5PO1xuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGFwcElzTmF0aXZlVGFnKG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgIFwiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogXCIgKyBuYW1lXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2Uudm5vZGUuc2hhcGVGbGFnICYgNDtcbn1cbmxldCBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IGlzU1NSO1xuICBjb25zdCB7IHByb3BzLCBjaGlsZHJlbiB9ID0gaW5zdGFuY2Uudm5vZGU7XG4gIGNvbnN0IGlzU3RhdGVmdWwgPSBpc1N0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlKTtcbiAgaW5pdFByb3BzKGluc3RhbmNlLCBwcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IpO1xuICBpbml0U2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuKTtcbiAgY29uc3Qgc2V0dXBSZXN1bHQgPSBpc1N0YXRlZnVsID8gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIDogdm9pZCAwO1xuICBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSBmYWxzZTtcbiAgcmV0dXJuIHNldHVwUmVzdWx0O1xufVxuZnVuY3Rpb24gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIHtcbiAgdmFyIF9hO1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGlmIChDb21wb25lbnQubmFtZSkge1xuICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKENvbXBvbmVudC5uYW1lLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcG9uZW50cykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuY29tcG9uZW50cyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lc1tpXSwgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmRpcmVjdGl2ZXMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoQ29tcG9uZW50LmRpcmVjdGl2ZXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxpZGF0ZURpcmVjdGl2ZU5hbWUobmFtZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmNvbXBpbGVyT3B0aW9ucyAmJiBpc1J1bnRpbWVPbmx5KCkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBcImNvbXBpbGVyT3B0aW9uc1wiIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlci4gU2luY2UgeW91IGFyZSB1c2luZyBhIHJ1bnRpbWUtb25seSBidWlsZCwgdGhlIG9wdGlvbnMgc2hvdWxkIGJlIHBhc3NlZCB2aWEgeW91ciBidWlsZCB0b29sIGNvbmZpZyBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGluc3RhbmNlLmFjY2Vzc0NhY2hlID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGluc3RhbmNlLnByb3h5ID0gbWFya1JhdyhuZXcgUHJveHkoaW5zdGFuY2UuY3R4LCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMpKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBleHBvc2VQcm9wc09uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gIH1cbiAgY29uc3QgeyBzZXR1cCB9ID0gQ29tcG9uZW50O1xuICBpZiAoc2V0dXApIHtcbiAgICBjb25zdCBzZXR1cENvbnRleHQgPSBpbnN0YW5jZS5zZXR1cENvbnRleHQgPSBzZXR1cC5sZW5ndGggPiAxID8gY3JlYXRlU2V0dXBDb250ZXh0KGluc3RhbmNlKSA6IG51bGw7XG4gICAgc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgY29uc3Qgc2V0dXBSZXN1bHQgPSBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBzZXR1cCxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMCxcbiAgICAgIFshIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGluc3RhbmNlLnByb3BzKSA6IGluc3RhbmNlLnByb3BzLCBzZXR1cENvbnRleHRdXG4gICAgKTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoaXNQcm9taXNlKHNldHVwUmVzdWx0KSkge1xuICAgICAgc2V0dXBSZXN1bHQudGhlbih1bnNldEN1cnJlbnRJbnN0YW5jZSwgdW5zZXRDdXJyZW50SW5zdGFuY2UpO1xuICAgICAgaWYgKGlzU1NSKSB7XG4gICAgICAgIHJldHVybiBzZXR1cFJlc3VsdC50aGVuKChyZXNvbHZlZFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCByZXNvbHZlZFJlc3VsdCwgaXNTU1IpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGluc3RhbmNlLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5hc3luY0RlcCA9IHNldHVwUmVzdWx0O1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaW5zdGFuY2Uuc3VzcGVuc2UpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gKF9hID0gQ29tcG9uZW50Lm5hbWUpICE9IG51bGwgPyBfYSA6IFwiQW5vbnltb3VzXCI7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGBDb21wb25lbnQgPCR7bmFtZX0+OiBzZXR1cCBmdW5jdGlvbiByZXR1cm5lZCBhIHByb21pc2UsIGJ1dCBubyA8U3VzcGVuc2U+IGJvdW5kYXJ5IHdhcyBmb3VuZCBpbiB0aGUgcGFyZW50IGNvbXBvbmVudCB0cmVlLiBBIGNvbXBvbmVudCB3aXRoIGFzeW5jIHNldHVwKCkgbXVzdCBiZSBuZXN0ZWQgaW4gYSA8U3VzcGVuc2U+IGluIG9yZGVyIHRvIGJlIHJlbmRlcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBzZXR1cFJlc3VsdCwgaXNTU1IpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IpO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgc2V0dXBSZXN1bHQsIGlzU1NSKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNldHVwUmVzdWx0KSkge1xuICAgIGlmIChpbnN0YW5jZS50eXBlLl9fc3NySW5saW5lUmVuZGVyKSB7XG4gICAgICBpbnN0YW5jZS5zc3JSZW5kZXIgPSBzZXR1cFJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UucmVuZGVyID0gc2V0dXBSZXN1bHQ7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNldHVwUmVzdWx0KSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzVk5vZGUoc2V0dXBSZXN1bHQpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgc2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLmRldnRvb2xzUmF3U2V0dXBTdGF0ZSA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgICBpbnN0YW5jZS5zZXR1cFN0YXRlID0gcHJveHlSZWZzKHNldHVwUmVzdWx0KTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBSZXN1bHQgIT09IHZvaWQgMCkge1xuICAgIHdhcm4oXG4gICAgICBgc2V0dXAoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4gUmVjZWl2ZWQ6ICR7c2V0dXBSZXN1bHQgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBzZXR1cFJlc3VsdH1gXG4gICAgKTtcbiAgfVxuICBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IpO1xufVxubGV0IGNvbXBpbGU7XG5sZXQgaW5zdGFsbFdpdGhQcm94eTtcbmZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyKF9jb21waWxlKSB7XG4gIGNvbXBpbGUgPSBfY29tcGlsZTtcbiAgaW5zdGFsbFdpdGhQcm94eSA9IChpKSA9PiB7XG4gICAgaWYgKGkucmVuZGVyLl9yYykge1xuICAgICAgaS53aXRoUHJveHkgPSBuZXcgUHJveHkoaS5jdHgsIFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gICAgfVxuICB9O1xufVxuY29uc3QgaXNSdW50aW1lT25seSA9ICgpID0+ICFjb21waWxlO1xuZnVuY3Rpb24gZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSLCBza2lwT3B0aW9ucykge1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoIWluc3RhbmNlLnJlbmRlcikge1xuICAgIGlmICghaXNTU1IgJiYgY29tcGlsZSAmJiAhQ29tcG9uZW50LnJlbmRlcikge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBDb21wb25lbnQudGVtcGxhdGUgfHwgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpLnRlbXBsYXRlO1xuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaXNDdXN0b21FbGVtZW50LCBjb21waWxlck9wdGlvbnMgfSA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnO1xuICAgICAgICBjb25zdCB7IGRlbGltaXRlcnMsIGNvbXBpbGVyT3B0aW9uczogY29tcG9uZW50Q29tcGlsZXJPcHRpb25zIH0gPSBDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IGZpbmFsQ29tcGlsZXJPcHRpb25zID0gZXh0ZW5kKFxuICAgICAgICAgIGV4dGVuZChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50LFxuICAgICAgICAgICAgICBkZWxpbWl0ZXJzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zXG4gICAgICAgICAgKSxcbiAgICAgICAgICBjb21wb25lbnRDb21waWxlck9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgQ29tcG9uZW50LnJlbmRlciA9IGNvbXBpbGUodGVtcGxhdGUsIGZpbmFsQ29tcGlsZXJPcHRpb25zKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlciA9IENvbXBvbmVudC5yZW5kZXIgfHwgTk9PUDtcbiAgICBpZiAoaW5zdGFsbFdpdGhQcm94eSkge1xuICAgICAgaW5zdGFsbFdpdGhQcm94eShpbnN0YW5jZSk7XG4gICAgfVxuICB9XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmIHRydWUpIHtcbiAgICBzZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICB0cnkge1xuICAgICAgYXBwbHlPcHRpb25zKGluc3RhbmNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIUNvbXBvbmVudC5yZW5kZXIgJiYgaW5zdGFuY2UucmVuZGVyID09PSBOT09QICYmICFpc1NTUikge1xuICAgIGlmICghY29tcGlsZSAmJiBDb21wb25lbnQudGVtcGxhdGUpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBDb21wb25lbnQgcHJvdmlkZWQgdGVtcGxhdGUgb3B0aW9uIGJ1dCBydW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuYCArIChgIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgXCJ2dWVcIiB0byBcInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qc1wiLmAgKVxuICAgICAgICAvKiBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2FybihgQ29tcG9uZW50IGlzIG1pc3NpbmcgdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uLmApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0QXR0cnNQcm94eShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuYXR0cnNQcm94eSB8fCAoaW5zdGFuY2UuYXR0cnNQcm94eSA9IG5ldyBQcm94eShcbiAgICBpbnN0YW5jZS5hdHRycyxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBcIiRhdHRyc1wiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2Fybihgc2V0dXBDb250ZXh0LmF0dHJzIGlzIHJlYWRvbmx5LmApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHkoKSB7XG4gICAgICAgIHdhcm4oYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UsIFwiZ2V0XCIsIFwiJGF0dHJzXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICB9XG4gICAgfVxuICApKTtcbn1cbmZ1bmN0aW9uIGdldFNsb3RzUHJveHkoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLnNsb3RzUHJveHkgfHwgKGluc3RhbmNlLnNsb3RzUHJveHkgPSBuZXcgUHJveHkoaW5zdGFuY2Uuc2xvdHMsIHtcbiAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICB9XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCBleHBvc2UgPSAoZXhwb3NlZCkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgICB3YXJuKGBleHBvc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0dXAoKS5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBvc2VkICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGV4cG9zZWRUeXBlID0gdHlwZW9mIGV4cG9zZWQ7XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwiYXJyYXlcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwicmVmXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBgZXhwb3NlKCkgc2hvdWxkIGJlIHBhc3NlZCBhIHBsYWluIG9iamVjdCwgcmVjZWl2ZWQgJHtleHBvc2VkVHlwZX0uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UuZXhwb3NlZCA9IGV4cG9zZWQgfHwge307XG4gIH07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICByZXR1cm4gZ2V0QXR0cnNQcm94eShpbnN0YW5jZSk7XG4gICAgICB9LFxuICAgICAgZ2V0IHNsb3RzKCkge1xuICAgICAgICByZXR1cm4gZ2V0U2xvdHNQcm94eShpbnN0YW5jZSk7XG4gICAgICB9LFxuICAgICAgZ2V0IGVtaXQoKSB7XG4gICAgICAgIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+IGluc3RhbmNlLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgIHJldHVybiBnZXRBdHRyc1Byb3h5KGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgICBzbG90czogaW5zdGFuY2Uuc2xvdHMsXG4gICAgICBlbWl0OiBpbnN0YW5jZS5lbWl0LFxuICAgICAgZXhwb3NlXG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0RXhwb3NlUHJveHkoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuZXhwb3NlUHJveHkgfHwgKGluc3RhbmNlLmV4cG9zZVByb3h5ID0gbmV3IFByb3h5KHByb3h5UmVmcyhtYXJrUmF3KGluc3RhbmNlLmV4cG9zZWQpKSwge1xuICAgICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiBwdWJsaWNQcm9wZXJ0aWVzTWFwKSB7XG4gICAgICAgICAgcmV0dXJuIHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XShpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBoYXModGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSBpbiB0YXJnZXQgfHwga2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXA7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG59XG5jb25zdCBjbGFzc2lmeVJFID0gLyg/Ol58Wy1fXSkoXFx3KS9nO1xuY29uc3QgY2xhc3NpZnkgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShjbGFzc2lmeVJFLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC9bLV9dL2csIFwiXCIpO1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQsIGluY2x1ZGVJbmZlcnJlZCA9IHRydWUpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oQ29tcG9uZW50KSA/IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSA6IENvbXBvbmVudC5uYW1lIHx8IGluY2x1ZGVJbmZlcnJlZCAmJiBDb21wb25lbnQuX19uYW1lO1xufVxuZnVuY3Rpb24gZm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgQ29tcG9uZW50LCBpc1Jvb3QgPSBmYWxzZSkge1xuICBsZXQgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KTtcbiAgaWYgKCFuYW1lICYmIENvbXBvbmVudC5fX2ZpbGUpIHtcbiAgICBjb25zdCBtYXRjaCA9IENvbXBvbmVudC5fX2ZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwuXFx3KyQvKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG5hbWUgPSBtYXRjaFsxXTtcbiAgICB9XG4gIH1cbiAgaWYgKCFuYW1lICYmIGluc3RhbmNlICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgIGNvbnN0IGluZmVyRnJvbVJlZ2lzdHJ5ID0gKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiByZWdpc3RyeSkge1xuICAgICAgICBpZiAocmVnaXN0cnlba2V5XSA9PT0gQ29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgbmFtZSA9IGluZmVyRnJvbVJlZ2lzdHJ5KFxuICAgICAgaW5zdGFuY2UuY29tcG9uZW50cyB8fCBpbnN0YW5jZS5wYXJlbnQudHlwZS5jb21wb25lbnRzXG4gICAgKSB8fCBpbmZlckZyb21SZWdpc3RyeShpbnN0YW5jZS5hcHBDb250ZXh0LmNvbXBvbmVudHMpO1xuICB9XG4gIHJldHVybiBuYW1lID8gY2xhc3NpZnkobmFtZSkgOiBpc1Jvb3QgPyBgQXBwYCA6IGBBbm9ueW1vdXNgO1xufVxuZnVuY3Rpb24gaXNDbGFzc0NvbXBvbmVudCh2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSkgJiYgXCJfX3ZjY09wdHNcIiBpbiB2YWx1ZTtcbn1cblxuY29uc3QgY29tcHV0ZWQgPSAoZ2V0dGVyT3JPcHRpb25zLCBkZWJ1Z09wdGlvbnMpID0+IHtcbiAgcmV0dXJuIGNvbXB1dGVkJDEoZ2V0dGVyT3JPcHRpb25zLCBkZWJ1Z09wdGlvbnMsIGlzSW5TU1JDb21wb25lbnRTZXR1cCk7XG59O1xuXG5mdW5jdGlvbiBoKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pIHtcbiAgY29uc3QgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIGlmIChsID09PSAyKSB7XG4gICAgaWYgKGlzT2JqZWN0KHByb3BzT3JDaGlsZHJlbikgJiYgIWlzQXJyYXkocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgaWYgKGlzVk5vZGUocHJvcHNPckNoaWxkcmVuKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbnVsbCwgW3Byb3BzT3JDaGlsZHJlbl0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBwcm9wc09yQ2hpbGRyZW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAobCA+IDMpIHtcbiAgICAgIGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICB9IGVsc2UgaWYgKGwgPT09IDMgJiYgaXNWTm9kZShjaGlsZHJlbikpIHtcbiAgICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzT3JDaGlsZHJlbiwgY2hpbGRyZW4pO1xuICB9XG59XG5cbmNvbnN0IHNzckNvbnRleHRLZXkgPSBTeW1ib2wuZm9yKFwidi1zY3hcIik7XG5jb25zdCB1c2VTU1JDb250ZXh0ID0gKCkgPT4ge1xuICB7XG4gICAgY29uc3QgY3R4ID0gaW5qZWN0KHNzckNvbnRleHRLZXkpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICAgIGBTZXJ2ZXIgcmVuZGVyaW5nIGNvbnRleHQgbm90IHByb3ZpZGVkLiBNYWtlIHN1cmUgdG8gb25seSBjYWxsIHVzZVNTUkNvbnRleHQoKSBjb25kaXRpb25hbGx5IGluIHRoZSBzZXJ2ZXIgYnVpbGQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGN0eDtcbiAgfVxufTtcblxuZnVuY3Rpb24gaXNTaGFsbG93KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1NoYWxsb3dcIl0pO1xufVxuXG5mdW5jdGlvbiBpbml0Q3VzdG9tRm9ybWF0dGVyKCkge1xuICBpZiAoISEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB2dWVTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6IzNiYTc3NlwiIH07XG4gIGNvbnN0IG51bWJlclN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojMGIxYmM5XCIgfTtcbiAgY29uc3Qgc3RyaW5nU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiNiNjJlMjRcIiB9O1xuICBjb25zdCBrZXl3b3JkU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiM5ZDI4OGNcIiB9O1xuICBjb25zdCBmb3JtYXR0ZXIgPSB7XG4gICAgaGVhZGVyKG9iaikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5fX2lzVnVlKSB7XG4gICAgICAgIHJldHVybiBbXCJkaXZcIiwgdnVlU3R5bGUsIGBWdWVJbnN0YW5jZWBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlZihvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBnZW5SZWZGbGFnKG9iaildLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iai52YWx1ZSksXG4gICAgICAgICAgYD5gXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgaXNTaGFsbG93KG9iaikgPyBcIlNoYWxsb3dSZWFjdGl2ZVwiIDogXCJSZWFjdGl2ZVwiXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmopLFxuICAgICAgICAgIGA+JHtpc1JlYWRvbmx5KG9iaikgPyBgIChyZWFkb25seSlgIDogYGB9YFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWRvbmx5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gXCJTaGFsbG93UmVhZG9ubHlcIiA6IFwiUmVhZG9ubHlcIl0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqKSxcbiAgICAgICAgICBcIj5cIlxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBoYXNCb2R5KG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19pc1Z1ZTtcbiAgICB9LFxuICAgIGJvZHkob2JqKSB7XG4gICAgICBpZiAob2JqICYmIG9iai5fX2lzVnVlKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICAuLi5mb3JtYXRJbnN0YW5jZShvYmouJClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGZvcm1hdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gICAgY29uc3QgYmxvY2tzID0gW107XG4gICAgaWYgKGluc3RhbmNlLnR5cGUucHJvcHMgJiYgaW5zdGFuY2UucHJvcHMpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJwcm9wc1wiLCB0b1JhdyhpbnN0YW5jZS5wcm9wcykpKTtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLnNldHVwU3RhdGUgIT09IEVNUFRZX09CSikge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcInNldHVwXCIsIGluc3RhbmNlLnNldHVwU3RhdGUpKTtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLmRhdGEgIT09IEVNUFRZX09CSikge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImRhdGFcIiwgdG9SYXcoaW5zdGFuY2UuZGF0YSkpKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgXCJjb21wdXRlZFwiKTtcbiAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJjb21wdXRlZFwiLCBjb21wdXRlZCkpO1xuICAgIH1cbiAgICBjb25zdCBpbmplY3RlZCA9IGV4dHJhY3RLZXlzKGluc3RhbmNlLCBcImluamVjdFwiKTtcbiAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJpbmplY3RlZFwiLCBpbmplY3RlZCkpO1xuICAgIH1cbiAgICBibG9ja3MucHVzaChbXG4gICAgICBcImRpdlwiLFxuICAgICAge30sXG4gICAgICBbXG4gICAgICAgIFwic3BhblwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IGtleXdvcmRTdHlsZS5zdHlsZSArIFwiO29wYWNpdHk6MC42NlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiJCAoaW50ZXJuYWwpOiBcIlxuICAgICAgXSxcbiAgICAgIFtcIm9iamVjdFwiLCB7IG9iamVjdDogaW5zdGFuY2UgfV1cbiAgICBdKTtcbiAgICByZXR1cm4gYmxvY2tzO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQmxvY2sodHlwZSwgdGFyZ2V0KSB7XG4gICAgdGFyZ2V0ID0gZXh0ZW5kKHt9LCB0YXJnZXQpO1xuICAgIGlmICghT2JqZWN0LmtleXModGFyZ2V0KS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHt9XTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7IHN0eWxlOiBcImxpbmUtaGVpZ2h0OjEuMjVlbTttYXJnaW4tYm90dG9tOjAuNmVtXCIgfSxcbiAgICAgIFtcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBcImNvbG9yOiM0NzY1ODJcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IFwicGFkZGluZy1sZWZ0OjEuMjVlbVwiXG4gICAgICAgIH0sXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHRhcmdldCkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgW1wic3BhblwiLCBrZXl3b3JkU3R5bGUsIGtleSArIFwiOiBcIl0sXG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSh0YXJnZXRba2V5XSwgZmFsc2UpXG4gICAgICAgICAgXTtcbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICBdO1xuICB9XG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHYsIGFzUmF3ID0gdHJ1ZSkge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgbnVtYmVyU3R5bGUsIHZdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHN0cmluZ1N0eWxlLCBKU09OLnN0cmluZ2lmeSh2KV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIGtleXdvcmRTdHlsZSwgdl07XG4gICAgfSBlbHNlIGlmIChpc09iamVjdCh2KSkge1xuICAgICAgcmV0dXJuIFtcIm9iamVjdFwiLCB7IG9iamVjdDogYXNSYXcgPyB0b1Jhdyh2KSA6IHYgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHN0cmluZ1N0eWxlLCBTdHJpbmcodildO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBleHRyYWN0S2V5cyhpbnN0YW5jZSwgdHlwZSkge1xuICAgIGNvbnN0IENvbXAgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmIChpc0Z1bmN0aW9uKENvbXApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGluc3RhbmNlLmN0eCkge1xuICAgICAgaWYgKGlzS2V5T2ZUeXBlKENvbXAsIGtleSwgdHlwZSkpIHtcbiAgICAgICAgZXh0cmFjdGVkW2tleV0gPSBpbnN0YW5jZS5jdHhba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4dHJhY3RlZDtcbiAgfVxuICBmdW5jdGlvbiBpc0tleU9mVHlwZShDb21wLCBrZXksIHR5cGUpIHtcbiAgICBjb25zdCBvcHRzID0gQ29tcFt0eXBlXTtcbiAgICBpZiAoaXNBcnJheShvcHRzKSAmJiBvcHRzLmluY2x1ZGVzKGtleSkgfHwgaXNPYmplY3Qob3B0cykgJiYga2V5IGluIG9wdHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ29tcC5leHRlbmRzICYmIGlzS2V5T2ZUeXBlKENvbXAuZXh0ZW5kcywga2V5LCB0eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDb21wLm1peGlucyAmJiBDb21wLm1peGlucy5zb21lKChtKSA9PiBpc0tleU9mVHlwZShtLCBrZXksIHR5cGUpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlblJlZkZsYWcodikge1xuICAgIGlmIChpc1NoYWxsb3codikpIHtcbiAgICAgIHJldHVybiBgU2hhbGxvd1JlZmA7XG4gICAgfVxuICAgIGlmICh2LmVmZmVjdCkge1xuICAgICAgcmV0dXJuIGBDb21wdXRlZFJlZmA7XG4gICAgfVxuICAgIHJldHVybiBgUmVmYDtcbiAgfVxuICBpZiAod2luZG93LmRldnRvb2xzRm9ybWF0dGVycykge1xuICAgIHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMucHVzaChmb3JtYXR0ZXIpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMgPSBbZm9ybWF0dGVyXTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3aXRoTWVtbyhtZW1vLCByZW5kZXIsIGNhY2hlLCBpbmRleCkge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZVtpbmRleF07XG4gIGlmIChjYWNoZWQgJiYgaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByZXQgPSByZW5kZXIoKTtcbiAgcmV0Lm1lbW8gPSBtZW1vLnNsaWNlKCk7XG4gIHJldHVybiBjYWNoZVtpbmRleF0gPSByZXQ7XG59XG5mdW5jdGlvbiBpc01lbW9TYW1lKGNhY2hlZCwgbWVtbykge1xuICBjb25zdCBwcmV2ID0gY2FjaGVkLm1lbW87XG4gIGlmIChwcmV2Lmxlbmd0aCAhPSBtZW1vLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBtZW1vW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiBjdXJyZW50QmxvY2spIHtcbiAgICBjdXJyZW50QmxvY2sucHVzaChjYWNoZWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCB2ZXJzaW9uID0gXCIzLjMuOVwiO1xuY29uc3QgX3NzclV0aWxzID0ge1xuICBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSxcbiAgc2V0dXBDb21wb25lbnQsXG4gIHJlbmRlckNvbXBvbmVudFJvb3QsXG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSxcbiAgaXNWTm9kZTogaXNWTm9kZSxcbiAgbm9ybWFsaXplVk5vZGVcbn07XG5jb25zdCBzc3JVdGlscyA9IF9zc3JVdGlscyA7XG5jb25zdCByZXNvbHZlRmlsdGVyID0gbnVsbDtcbmNvbnN0IGNvbXBhdFV0aWxzID0gbnVsbDtcblxuZXhwb3J0IHsgQmFzZVRyYW5zaXRpb24sIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBDb21tZW50LCBGcmFnbWVudCwgS2VlcEFsaXZlLCBTdGF0aWMsIFN1c3BlbnNlLCBUZWxlcG9ydCwgVGV4dCwgYXNzZXJ0TnVtYmVyLCBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZywgY2FsbFdpdGhFcnJvckhhbmRsaW5nLCBjbG9uZVZOb2RlLCBjb21wYXRVdGlscywgY29tcHV0ZWQsIGNyZWF0ZUJsb2NrLCBjcmVhdGVDb21tZW50Vk5vZGUsIGNyZWF0ZUVsZW1lbnRCbG9jaywgY3JlYXRlQmFzZVZOb2RlIGFzIGNyZWF0ZUVsZW1lbnRWTm9kZSwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIsIGNyZWF0ZVByb3BzUmVzdFByb3h5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlU2xvdHMsIGNyZWF0ZVN0YXRpY1ZOb2RlLCBjcmVhdGVUZXh0Vk5vZGUsIGNyZWF0ZVZOb2RlLCBkZWZpbmVBc3luY0NvbXBvbmVudCwgZGVmaW5lQ29tcG9uZW50LCBkZWZpbmVFbWl0cywgZGVmaW5lRXhwb3NlLCBkZWZpbmVNb2RlbCwgZGVmaW5lT3B0aW9ucywgZGVmaW5lUHJvcHMsIGRlZmluZVNsb3RzLCBkZXZ0b29scywgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4sIGd1YXJkUmVhY3RpdmVQcm9wcywgaCwgaGFuZGxlRXJyb3IsIGhhc0luamVjdGlvbkNvbnRleHQsIGluaXRDdXN0b21Gb3JtYXR0ZXIsIGluamVjdCwgaXNNZW1vU2FtZSwgaXNSdW50aW1lT25seSwgaXNWTm9kZSwgbWVyZ2VEZWZhdWx0cywgbWVyZ2VNb2RlbHMsIG1lcmdlUHJvcHMsIG5leHRUaWNrLCBvbkFjdGl2YXRlZCwgb25CZWZvcmVNb3VudCwgb25CZWZvcmVVbm1vdW50LCBvbkJlZm9yZVVwZGF0ZSwgb25EZWFjdGl2YXRlZCwgb25FcnJvckNhcHR1cmVkLCBvbk1vdW50ZWQsIG9uUmVuZGVyVHJhY2tlZCwgb25SZW5kZXJUcmlnZ2VyZWQsIG9uU2VydmVyUHJlZmV0Y2gsIG9uVW5tb3VudGVkLCBvblVwZGF0ZWQsIG9wZW5CbG9jaywgcG9wU2NvcGVJZCwgcHJvdmlkZSwgcHVzaFNjb3BlSWQsIHF1ZXVlUG9zdEZsdXNoQ2IsIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyLCByZW5kZXJMaXN0LCByZW5kZXJTbG90LCByZXNvbHZlQ29tcG9uZW50LCByZXNvbHZlRGlyZWN0aXZlLCByZXNvbHZlRHluYW1pY0NvbXBvbmVudCwgcmVzb2x2ZUZpbHRlciwgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcywgc2V0QmxvY2tUcmFja2luZywgc2V0RGV2dG9vbHNIb29rLCBzZXRUcmFuc2l0aW9uSG9va3MsIHNzckNvbnRleHRLZXksIHNzclV0aWxzLCB0b0hhbmRsZXJzLCB0cmFuc2Zvcm1WTm9kZUFyZ3MsIHVzZUF0dHJzLCB1c2VNb2RlbCwgdXNlU1NSQ29udGV4dCwgdXNlU2xvdHMsIHVzZVRyYW5zaXRpb25TdGF0ZSwgdmVyc2lvbiwgd2Fybiwgd2F0Y2gsIHdhdGNoRWZmZWN0LCB3YXRjaFBvc3RFZmZlY3QsIHdhdGNoU3luY0VmZmVjdCwgd2l0aEFzeW5jQ29udGV4dCwgd2l0aEN0eCwgd2l0aERlZmF1bHRzLCB3aXRoRGlyZWN0aXZlcywgd2l0aE1lbW8sIHdpdGhTY29wZUlkIH07XG4iLCJpbXBvcnQgeyBoLCBCYXNlVHJhbnNpdGlvbiwgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIGFzc2VydE51bWJlciwgd2FybiwgY2FtZWxpemUsIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBjcmVhdGVWTm9kZSwgZ2V0Q3VycmVudEluc3RhbmNlLCB3YXRjaFBvc3RFZmZlY3QsIG9uTW91bnRlZCwgb25Vbm1vdW50ZWQsIEZyYWdtZW50LCBTdGF0aWMsIHVzZVRyYW5zaXRpb25TdGF0ZSwgb25VcGRhdGVkLCB0b1JhdywgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuLCBzZXRUcmFuc2l0aW9uSG9va3MsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIGlzUnVudGltZU9ubHksIGNyZWF0ZVJlbmRlcmVyLCBjcmVhdGVIeWRyYXRpb25SZW5kZXJlciB9IGZyb20gJ0B2dWUvcnVudGltZS1jb3JlJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvcnVudGltZS1jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaXNPYmplY3QsIHRvTnVtYmVyLCBpc0FycmF5LCBpc1N0cmluZywgaHlwaGVuYXRlLCBjYXBpdGFsaXplLCBpc1NwZWNpYWxCb29sZWFuQXR0ciwgaW5jbHVkZUJvb2xlYW5BdHRyLCBpc09uLCBpc01vZGVsTGlzdGVuZXIsIGlzRnVuY3Rpb24sIGNhbWVsaXplIGFzIGNhbWVsaXplJDEsIEVNUFRZX09CSiwgbG9vc2VUb051bWJlciwgbG9vc2VJbmRleE9mLCBpc1NldCwgbG9vc2VFcXVhbCwgaW52b2tlQXJyYXlGbnMsIGlzSFRNTFRhZywgaXNTVkdUYWcgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN2Z05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY29uc3QgZG9jID0gdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiBudWxsO1xuY29uc3QgdGVtcGxhdGVDb250YWluZXIgPSBkb2MgJiYgLyogQF9fUFVSRV9fICovIGRvYy5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5jb25zdCBub2RlT3BzID0ge1xuICBpbnNlcnQ6IChjaGlsZCwgcGFyZW50LCBhbmNob3IpID0+IHtcbiAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBhbmNob3IgfHwgbnVsbCk7XG4gIH0sXG4gIHJlbW92ZTogKGNoaWxkKSA9PiB7XG4gICAgY29uc3QgcGFyZW50ID0gY2hpbGQucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgIH1cbiAgfSxcbiAgY3JlYXRlRWxlbWVudDogKHRhZywgaXNTVkcsIGlzLCBwcm9wcykgPT4ge1xuICAgIGNvbnN0IGVsID0gaXNTVkcgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCBpcyA/IHsgaXMgfSA6IHZvaWQgMCk7XG4gICAgaWYgKHRhZyA9PT0gXCJzZWxlY3RcIiAmJiBwcm9wcyAmJiBwcm9wcy5tdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiLCBwcm9wcy5tdWx0aXBsZSk7XG4gICAgfVxuICAgIHJldHVybiBlbDtcbiAgfSxcbiAgY3JlYXRlVGV4dDogKHRleHQpID0+IGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSxcbiAgY3JlYXRlQ29tbWVudDogKHRleHQpID0+IGRvYy5jcmVhdGVDb21tZW50KHRleHQpLFxuICBzZXRUZXh0OiAobm9kZSwgdGV4dCkgPT4ge1xuICAgIG5vZGUubm9kZVZhbHVlID0gdGV4dDtcbiAgfSxcbiAgc2V0RWxlbWVudFRleHQ6IChlbCwgdGV4dCkgPT4ge1xuICAgIGVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfSxcbiAgcGFyZW50Tm9kZTogKG5vZGUpID0+IG5vZGUucGFyZW50Tm9kZSxcbiAgbmV4dFNpYmxpbmc6IChub2RlKSA9PiBub2RlLm5leHRTaWJsaW5nLFxuICBxdWVyeVNlbGVjdG9yOiAoc2VsZWN0b3IpID0+IGRvYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSxcbiAgc2V0U2NvcGVJZChlbCwgaWQpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoaWQsIFwiXCIpO1xuICB9LFxuICAvLyBfX1VOU0FGRV9fXG4gIC8vIFJlYXNvbjogaW5uZXJIVE1MLlxuICAvLyBTdGF0aWMgY29udGVudCBoZXJlIGNhbiBvbmx5IGNvbWUgZnJvbSBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gIC8vIEFzIGxvbmcgYXMgdGhlIHVzZXIgb25seSB1c2VzIHRydXN0ZWQgdGVtcGxhdGVzLCB0aGlzIGlzIHNhZmUuXG4gIGluc2VydFN0YXRpY0NvbnRlbnQoY29udGVudCwgcGFyZW50LCBhbmNob3IsIGlzU1ZHLCBzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgYmVmb3JlID0gYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgaWYgKHN0YXJ0ICYmIChzdGFydCA9PT0gZW5kIHx8IHN0YXJ0Lm5leHRTaWJsaW5nKSkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzdGFydC5jbG9uZU5vZGUodHJ1ZSksIGFuY2hvcik7XG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kIHx8ICEoc3RhcnQgPSBzdGFydC5uZXh0U2libGluZykpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBsYXRlQ29udGFpbmVyLmlubmVySFRNTCA9IGlzU1ZHID8gYDxzdmc+JHtjb250ZW50fTwvc3ZnPmAgOiBjb250ZW50O1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKGlzU1ZHKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0ZW1wbGF0ZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod3JhcHBlci5maXJzdENoaWxkKSB7XG4gICAgICAgICAgdGVtcGxhdGUuYXBwZW5kQ2hpbGQod3JhcHBlci5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wbGF0ZS5yZW1vdmVDaGlsZCh3cmFwcGVyKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGVtcGxhdGUsIGFuY2hvcik7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAvLyBmaXJzdFxuICAgICAgYmVmb3JlID8gYmVmb3JlLm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQsXG4gICAgICAvLyBsYXN0XG4gICAgICBhbmNob3IgPyBhbmNob3IucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZFxuICAgIF07XG4gIH1cbn07XG5cbmNvbnN0IFRSQU5TSVRJT04gPSBcInRyYW5zaXRpb25cIjtcbmNvbnN0IEFOSU1BVElPTiA9IFwiYW5pbWF0aW9uXCI7XG5jb25zdCB2dGNLZXkgPSBTeW1ib2woXCJfdnRjXCIpO1xuY29uc3QgVHJhbnNpdGlvbiA9IChwcm9wcywgeyBzbG90cyB9KSA9PiBoKEJhc2VUcmFuc2l0aW9uLCByZXNvbHZlVHJhbnNpdGlvblByb3BzKHByb3BzKSwgc2xvdHMpO1xuVHJhbnNpdGlvbi5kaXNwbGF5TmFtZSA9IFwiVHJhbnNpdGlvblwiO1xuY29uc3QgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IHtcbiAgbmFtZTogU3RyaW5nLFxuICB0eXBlOiBTdHJpbmcsXG4gIGNzczoge1xuICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgZGVmYXVsdDogdHJ1ZVxuICB9LFxuICBkdXJhdGlvbjogW1N0cmluZywgTnVtYmVyLCBPYmplY3RdLFxuICBlbnRlckZyb21DbGFzczogU3RyaW5nLFxuICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyVG9DbGFzczogU3RyaW5nLFxuICBhcHBlYXJGcm9tQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyVG9DbGFzczogU3RyaW5nLFxuICBsZWF2ZUZyb21DbGFzczogU3RyaW5nLFxuICBsZWF2ZUFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlVG9DbGFzczogU3RyaW5nXG59O1xuY29uc3QgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IFRyYW5zaXRpb24ucHJvcHMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKFxuICB7fSxcbiAgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsXG4gIERPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnNcbik7XG5jb25zdCBjYWxsSG9vayA9IChob29rLCBhcmdzID0gW10pID0+IHtcbiAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICBob29rLmZvckVhY2goKGgyKSA9PiBoMiguLi5hcmdzKSk7XG4gIH0gZWxzZSBpZiAoaG9vaykge1xuICAgIGhvb2soLi4uYXJncyk7XG4gIH1cbn07XG5jb25zdCBoYXNFeHBsaWNpdENhbGxiYWNrID0gKGhvb2spID0+IHtcbiAgcmV0dXJuIGhvb2sgPyBpc0FycmF5KGhvb2spID8gaG9vay5zb21lKChoMikgPT4gaDIubGVuZ3RoID4gMSkgOiBob29rLmxlbmd0aCA+IDEgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvblByb3BzKHJhd1Byb3BzKSB7XG4gIGNvbnN0IGJhc2VQcm9wcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghKGtleSBpbiBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzKSkge1xuICAgICAgYmFzZVByb3BzW2tleV0gPSByYXdQcm9wc1trZXldO1xuICAgIH1cbiAgfVxuICBpZiAocmF3UHJvcHMuY3NzID09PSBmYWxzZSkge1xuICAgIHJldHVybiBiYXNlUHJvcHM7XG4gIH1cbiAgY29uc3Qge1xuICAgIG5hbWUgPSBcInZcIixcbiAgICB0eXBlLFxuICAgIGR1cmF0aW9uLFxuICAgIGVudGVyRnJvbUNsYXNzID0gYCR7bmFtZX0tZW50ZXItZnJvbWAsXG4gICAgZW50ZXJBY3RpdmVDbGFzcyA9IGAke25hbWV9LWVudGVyLWFjdGl2ZWAsXG4gICAgZW50ZXJUb0NsYXNzID0gYCR7bmFtZX0tZW50ZXItdG9gLFxuICAgIGFwcGVhckZyb21DbGFzcyA9IGVudGVyRnJvbUNsYXNzLFxuICAgIGFwcGVhckFjdGl2ZUNsYXNzID0gZW50ZXJBY3RpdmVDbGFzcyxcbiAgICBhcHBlYXJUb0NsYXNzID0gZW50ZXJUb0NsYXNzLFxuICAgIGxlYXZlRnJvbUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtZnJvbWAsXG4gICAgbGVhdmVBY3RpdmVDbGFzcyA9IGAke25hbWV9LWxlYXZlLWFjdGl2ZWAsXG4gICAgbGVhdmVUb0NsYXNzID0gYCR7bmFtZX0tbGVhdmUtdG9gXG4gIH0gPSByYXdQcm9wcztcbiAgY29uc3QgZHVyYXRpb25zID0gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pO1xuICBjb25zdCBlbnRlckR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1swXTtcbiAgY29uc3QgbGVhdmVEdXJhdGlvbiA9IGR1cmF0aW9ucyAmJiBkdXJhdGlvbnNbMV07XG4gIGNvbnN0IHtcbiAgICBvbkJlZm9yZUVudGVyLFxuICAgIG9uRW50ZXIsXG4gICAgb25FbnRlckNhbmNlbGxlZCxcbiAgICBvbkxlYXZlLFxuICAgIG9uTGVhdmVDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVBcHBlYXIgPSBvbkJlZm9yZUVudGVyLFxuICAgIG9uQXBwZWFyID0gb25FbnRlcixcbiAgICBvbkFwcGVhckNhbmNlbGxlZCA9IG9uRW50ZXJDYW5jZWxsZWRcbiAgfSA9IGJhc2VQcm9wcztcbiAgY29uc3QgZmluaXNoRW50ZXIgPSAoZWwsIGlzQXBwZWFyLCBkb25lKSA9PiB7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhclRvQ2xhc3MgOiBlbnRlclRvQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJBY3RpdmVDbGFzcyA6IGVudGVyQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBmaW5pc2hMZWF2ZSA9IChlbCwgZG9uZSkgPT4ge1xuICAgIGVsLl9pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICBkb25lICYmIGRvbmUoKTtcbiAgfTtcbiAgY29uc3QgbWFrZUVudGVySG9vayA9IChpc0FwcGVhcikgPT4ge1xuICAgIHJldHVybiAoZWwsIGRvbmUpID0+IHtcbiAgICAgIGNvbnN0IGhvb2sgPSBpc0FwcGVhciA/IG9uQXBwZWFyIDogb25FbnRlcjtcbiAgICAgIGNvbnN0IHJlc29sdmUgPSAoKSA9PiBmaW5pc2hFbnRlcihlbCwgaXNBcHBlYXIsIGRvbmUpO1xuICAgICAgY2FsbEhvb2soaG9vaywgW2VsLCByZXNvbHZlXSk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyRnJvbUNsYXNzIDogZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhob29rKSkge1xuICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgZW50ZXJEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG4gIHJldHVybiBleHRlbmQoYmFzZVByb3BzLCB7XG4gICAgb25CZWZvcmVFbnRlcihlbCkge1xuICAgICAgY2FsbEhvb2sob25CZWZvcmVFbnRlciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGVudGVyRnJvbUNsYXNzKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgfSxcbiAgICBvbkJlZm9yZUFwcGVhcihlbCkge1xuICAgICAgY2FsbEhvb2sob25CZWZvcmVBcHBlYXIsIFtlbF0pO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhcHBlYXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhcHBlYXJBY3RpdmVDbGFzcyk7XG4gICAgfSxcbiAgICBvbkVudGVyOiBtYWtlRW50ZXJIb29rKGZhbHNlKSxcbiAgICBvbkFwcGVhcjogbWFrZUVudGVySG9vayh0cnVlKSxcbiAgICBvbkxlYXZlKGVsLCBkb25lKSB7XG4gICAgICBlbC5faXNMZWF2aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc29sdmUgPSAoKSA9PiBmaW5pc2hMZWF2ZShlbCwgZG9uZSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKCFlbC5faXNMZWF2aW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhvbkxlYXZlKSkge1xuICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgbGVhdmVEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2FsbEhvb2sob25MZWF2ZSwgW2VsLCByZXNvbHZlXSk7XG4gICAgfSxcbiAgICBvbkVudGVyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgZmFsc2UpO1xuICAgICAgY2FsbEhvb2sob25FbnRlckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkFwcGVhckNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoRW50ZXIoZWwsIHRydWUpO1xuICAgICAgY2FsbEhvb2sob25BcHBlYXJDYW5jZWxsZWQsIFtlbF0pO1xuICAgIH0sXG4gICAgb25MZWF2ZUNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoTGVhdmUoZWwpO1xuICAgICAgY2FsbEhvb2sob25MZWF2ZUNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUR1cmF0aW9uKGR1cmF0aW9uKSB7XG4gIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZHVyYXRpb24pKSB7XG4gICAgcmV0dXJuIFtOdW1iZXJPZihkdXJhdGlvbi5lbnRlciksIE51bWJlck9mKGR1cmF0aW9uLmxlYXZlKV07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbiA9IE51bWJlck9mKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gW24sIG5dO1xuICB9XG59XG5mdW5jdGlvbiBOdW1iZXJPZih2YWwpIHtcbiAgY29uc3QgcmVzID0gdG9OdW1iZXIodmFsKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBhc3NlcnROdW1iZXIocmVzLCBcIjx0cmFuc2l0aW9uPiBleHBsaWNpdCBkdXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBjbHMpIHtcbiAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBlbC5jbGFzc0xpc3QuYWRkKGMpKTtcbiAgKGVsW3Z0Y0tleV0gfHwgKGVsW3Z0Y0tleV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSkuYWRkKGNscyk7XG59XG5mdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5yZW1vdmUoYykpO1xuICBjb25zdCBfdnRjID0gZWxbdnRjS2V5XTtcbiAgaWYgKF92dGMpIHtcbiAgICBfdnRjLmRlbGV0ZShjbHMpO1xuICAgIGlmICghX3Z0Yy5zaXplKSB7XG4gICAgICBlbFt2dGNLZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbmV4dEZyYW1lKGNiKSB7XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKTtcbiAgfSk7XG59XG5sZXQgZW5kSWQgPSAwO1xuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzKGVsLCBleHBlY3RlZFR5cGUsIGV4cGxpY2l0VGltZW91dCwgcmVzb2x2ZSkge1xuICBjb25zdCBpZCA9IGVsLl9lbmRJZCA9ICsrZW5kSWQ7XG4gIGNvbnN0IHJlc29sdmVJZk5vdFN0YWxlID0gKCkgPT4ge1xuICAgIGlmIChpZCA9PT0gZWwuX2VuZElkKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfVxuICB9O1xuICBpZiAoZXhwbGljaXRUaW1lb3V0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZUlmTm90U3RhbGUsIGV4cGxpY2l0VGltZW91dCk7XG4gIH1cbiAgY29uc3QgeyB0eXBlLCB0aW1lb3V0LCBwcm9wQ291bnQgfSA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpO1xuICBpZiAoIXR5cGUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICB9XG4gIGNvbnN0IGVuZEV2ZW50ID0gdHlwZSArIFwiZW5kXCI7XG4gIGxldCBlbmRlZCA9IDA7XG4gIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG4gICAgcmVzb2x2ZUlmTm90U3RhbGUoKTtcbiAgfTtcbiAgY29uc3Qgb25FbmQgPSAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gZWwgJiYgKytlbmRlZCA+PSBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH0sIHRpbWVvdXQgKyAxKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihlbmRFdmVudCwgb25FbmQpO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSkge1xuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIGNvbnN0IGdldFN0eWxlUHJvcGVydGllcyA9IChrZXkpID0+IChzdHlsZXNba2V5XSB8fCBcIlwiKS5zcGxpdChcIiwgXCIpO1xuICBjb25zdCB0cmFuc2l0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RGVsYXlgKTtcbiAgY29uc3QgdHJhbnNpdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTtcbiAgY29uc3QgYW5pbWF0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke0FOSU1BVElPTn1EZWxheWApO1xuICBjb25zdCBhbmltYXRpb25EdXJhdGlvbnMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IGFuaW1hdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KGFuaW1hdGlvbkRlbGF5cywgYW5pbWF0aW9uRHVyYXRpb25zKTtcbiAgbGV0IHR5cGUgPSBudWxsO1xuICBsZXQgdGltZW91dCA9IDA7XG4gIGxldCBwcm9wQ291bnQgPSAwO1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7XG4gICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHtcbiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgdHlwZSA9IHRpbWVvdXQgPiAwID8gdHJhbnNpdGlvblRpbWVvdXQgPiBhbmltYXRpb25UaW1lb3V0ID8gVFJBTlNJVElPTiA6IEFOSU1BVElPTiA6IG51bGw7XG4gICAgcHJvcENvdW50ID0gdHlwZSA/IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aCA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIGNvbnN0IGhhc1RyYW5zZm9ybSA9IHR5cGUgPT09IFRSQU5TSVRJT04gJiYgL1xcYih0cmFuc2Zvcm18YWxsKSgsfCQpLy50ZXN0KFxuICAgIGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfVByb3BlcnR5YCkudG9TdHJpbmcoKVxuICApO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgdGltZW91dCxcbiAgICBwcm9wQ291bnQsXG4gICAgaGFzVHJhbnNmb3JtXG4gIH07XG59XG5mdW5jdGlvbiBnZXRUaW1lb3V0KGRlbGF5cywgZHVyYXRpb25zKSB7XG4gIHdoaWxlIChkZWxheXMubGVuZ3RoIDwgZHVyYXRpb25zLmxlbmd0aCkge1xuICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTtcbiAgfVxuICByZXR1cm4gTWF0aC5tYXgoLi4uZHVyYXRpb25zLm1hcCgoZCwgaSkgPT4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKSkpO1xufVxuZnVuY3Rpb24gdG9NcyhzKSB7XG4gIGlmIChzID09PSBcImF1dG9cIilcbiAgICByZXR1cm4gMDtcbiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKS5yZXBsYWNlKFwiLFwiLCBcIi5cIikpICogMWUzO1xufVxuZnVuY3Rpb24gZm9yY2VSZWZsb3coKSB7XG4gIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDtcbn1cblxuZnVuY3Rpb24gcGF0Y2hDbGFzcyhlbCwgdmFsdWUsIGlzU1ZHKSB7XG4gIGNvbnN0IHRyYW5zaXRpb25DbGFzc2VzID0gZWxbdnRjS2V5XTtcbiAgaWYgKHRyYW5zaXRpb25DbGFzc2VzKSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPyBbdmFsdWUsIC4uLnRyYW5zaXRpb25DbGFzc2VzXSA6IFsuLi50cmFuc2l0aW9uQ2xhc3Nlc10pLmpvaW4oXCIgXCIpO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gIH0gZWxzZSBpZiAoaXNTVkcpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuY2xhc3NOYW1lID0gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgdlNob3dPbGRLZXkgPSBTeW1ib2woXCJfdm9kXCIpO1xuY29uc3QgdlNob3cgPSB7XG4gIGJlZm9yZU1vdW50KGVsLCB7IHZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgZWxbdlNob3dPbGRLZXldID0gZWwuc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgPyBcIlwiIDogZWwuc3R5bGUuZGlzcGxheTtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH0sXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgfVxuICB9LFxuICB1cGRhdGVkKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICghdmFsdWUgPT09ICFvbGRWYWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICBzZXREaXNwbGF5KGVsLCB0cnVlKTtcbiAgICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2l0aW9uLmxlYXZlKGVsLCAoKSA9PiB7XG4gICAgICAgICAgc2V0RGlzcGxheShlbCwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlVW5tb3VudChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICB9XG59O1xuZnVuY3Rpb24gc2V0RGlzcGxheShlbCwgdmFsdWUpIHtcbiAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gZWxbdlNob3dPbGRLZXldIDogXCJub25lXCI7XG59XG5mdW5jdGlvbiBpbml0VlNob3dGb3JTU1IoKSB7XG4gIHZTaG93LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB7IHN0eWxlOiB7IGRpc3BsYXk6IFwibm9uZVwiIH0gfTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhdGNoU3R5bGUoZWwsIHByZXYsIG5leHQpIHtcbiAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgY29uc3QgaXNDc3NTdHJpbmcgPSBpc1N0cmluZyhuZXh0KTtcbiAgaWYgKG5leHQgJiYgIWlzQ3NzU3RyaW5nKSB7XG4gICAgaWYgKHByZXYgJiYgIWlzU3RyaW5nKHByZXYpKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcmV2KSB7XG4gICAgICAgIGlmIChuZXh0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG5leHQpIHtcbiAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIG5leHRba2V5XSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5ID0gc3R5bGUuZGlzcGxheTtcbiAgICBpZiAoaXNDc3NTdHJpbmcpIHtcbiAgICAgIGlmIChwcmV2ICE9PSBuZXh0KSB7XG4gICAgICAgIHN0eWxlLmNzc1RleHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJldikge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgfVxuICAgIGlmICh2U2hvd09sZEtleSBpbiBlbCkge1xuICAgICAgc3R5bGUuZGlzcGxheSA9IGN1cnJlbnREaXNwbGF5O1xuICAgIH1cbiAgfVxufVxuY29uc3Qgc2VtaWNvbG9uUkUgPSAvW15cXFxcXTtcXHMqJC87XG5jb25zdCBpbXBvcnRhbnRSRSA9IC9cXHMqIWltcG9ydGFudCQvO1xuZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUsIG5hbWUsIHZhbCkge1xuICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgdmFsLmZvckVhY2goKHYpID0+IHNldFN0eWxlKHN0eWxlLCBuYW1lLCB2KSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKVxuICAgICAgdmFsID0gXCJcIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKHNlbWljb2xvblJFLnRlc3QodmFsKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHNlbWljb2xvbiBhdCB0aGUgZW5kIG9mICcke25hbWV9JyBzdHlsZSB2YWx1ZTogJyR7dmFsfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBhdXRvUHJlZml4KHN0eWxlLCBuYW1lKTtcbiAgICAgIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgaHlwaGVuYXRlKHByZWZpeGVkKSxcbiAgICAgICAgICB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgXCJcIiksXG4gICAgICAgICAgXCJpbXBvcnRhbnRcIlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVbcHJlZml4ZWRdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgcHJlZml4ZXMgPSBbXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiXTtcbmNvbnN0IHByZWZpeENhY2hlID0ge307XG5mdW5jdGlvbiBhdXRvUHJlZml4KHN0eWxlLCByYXdOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IHByZWZpeENhY2hlW3Jhd05hbWVdO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBsZXQgbmFtZSA9IGNhbWVsaXplKHJhd05hbWUpO1xuICBpZiAobmFtZSAhPT0gXCJmaWx0ZXJcIiAmJiBuYW1lIGluIHN0eWxlKSB7XG4gICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gbmFtZTtcbiAgfVxuICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcHJlZml4ZXNbaV0gKyBuYW1lO1xuICAgIGlmIChwcmVmaXhlZCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gcHJlZml4ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByYXdOYW1lO1xufVxuXG5jb25zdCB4bGlua05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5mdW5jdGlvbiBwYXRjaEF0dHIoZWwsIGtleSwgdmFsdWUsIGlzU1ZHLCBpbnN0YW5jZSkge1xuICBpZiAoaXNTVkcgJiYga2V5LnN0YXJ0c1dpdGgoXCJ4bGluazpcIikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywga2V5LnNsaWNlKDYsIGtleS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlzQm9vbGVhbiA9IGlzU3BlY2lhbEJvb2xlYW5BdHRyKGtleSk7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgaXNCb29sZWFuICYmICFpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNCb29sZWFuID8gXCJcIiA6IHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0Y2hET01Qcm9wKGVsLCBrZXksIHZhbHVlLCBwcmV2Q2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHVubW91bnRDaGlsZHJlbikge1xuICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgaWYgKHByZXZDaGlsZHJlbikge1xuICAgICAgdW5tb3VudENoaWxkcmVuKHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICAgIGVsW2tleV0gPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICBpZiAoa2V5ID09PSBcInZhbHVlXCIgJiYgdGFnICE9PSBcIlBST0dSRVNTXCIgJiYgLy8gY3VzdG9tIGVsZW1lbnRzIG1heSB1c2UgX3ZhbHVlIGludGVybmFsbHlcbiAgIXRhZy5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICBlbC5fdmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhZyA9PT0gXCJPUFRJT05cIiA/IGVsLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpIDogZWwudmFsdWU7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBuZWVkUmVtb3ZlID0gZmFsc2U7XG4gIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBlbFtrZXldO1xuICAgIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICBuZWVkUmVtb3ZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGVsW2tleV0gPSB2YWx1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFuZWVkUmVtb3ZlKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHNldHRpbmcgcHJvcCBcIiR7a2V5fVwiIG9uIDwke3RhZy50b0xvd2VyQ2FzZSgpfT46IHZhbHVlICR7dmFsdWV9IGlzIGludmFsaWQuYCxcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbmVlZFJlbW92ZSAmJiBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbCwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmNvbnN0IHZlaUtleSA9IFN5bWJvbChcIl92ZWlcIik7XG5mdW5jdGlvbiBwYXRjaEV2ZW50KGVsLCByYXdOYW1lLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5zdGFuY2UgPSBudWxsKSB7XG4gIGNvbnN0IGludm9rZXJzID0gZWxbdmVpS2V5XSB8fCAoZWxbdmVpS2V5XSA9IHt9KTtcbiAgY29uc3QgZXhpc3RpbmdJbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV07XG4gIGlmIChuZXh0VmFsdWUgJiYgZXhpc3RpbmdJbnZva2VyKSB7XG4gICAgZXhpc3RpbmdJbnZva2VyLnZhbHVlID0gbmV4dFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtuYW1lLCBvcHRpb25zXSA9IHBhcnNlTmFtZShyYXdOYW1lKTtcbiAgICBpZiAobmV4dFZhbHVlKSB7XG4gICAgICBjb25zdCBpbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV0gPSBjcmVhdGVJbnZva2VyKG5leHRWYWx1ZSwgaW5zdGFuY2UpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgaW52b2tlciwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChleGlzdGluZ0ludm9rZXIpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIG5hbWUsIGV4aXN0aW5nSW52b2tlciwgb3B0aW9ucyk7XG4gICAgICBpbnZva2Vyc1tyYXdOYW1lXSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IG9wdGlvbnNNb2RpZmllclJFID0gLyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO1xuZnVuY3Rpb24gcGFyc2VOYW1lKG5hbWUpIHtcbiAgbGV0IG9wdGlvbnM7XG4gIGlmIChvcHRpb25zTW9kaWZpZXJSRS50ZXN0KG5hbWUpKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICAgIGxldCBtO1xuICAgIHdoaWxlIChtID0gbmFtZS5tYXRjaChvcHRpb25zTW9kaWZpZXJSRSkpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoIC0gbVswXS5sZW5ndGgpO1xuICAgICAgb3B0aW9uc1ttWzBdLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZXZlbnQgPSBuYW1lWzJdID09PSBcIjpcIiA/IG5hbWUuc2xpY2UoMykgOiBoeXBoZW5hdGUobmFtZS5zbGljZSgyKSk7XG4gIHJldHVybiBbZXZlbnQsIG9wdGlvbnNdO1xufVxubGV0IGNhY2hlZE5vdyA9IDA7XG5jb25zdCBwID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgZ2V0Tm93ID0gKCkgPT4gY2FjaGVkTm93IHx8IChwLnRoZW4oKCkgPT4gY2FjaGVkTm93ID0gMCksIGNhY2hlZE5vdyA9IERhdGUubm93KCkpO1xuZnVuY3Rpb24gY3JlYXRlSW52b2tlcihpbml0aWFsVmFsdWUsIGluc3RhbmNlKSB7XG4gIGNvbnN0IGludm9rZXIgPSAoZSkgPT4ge1xuICAgIGlmICghZS5fdnRzKSB7XG4gICAgICBlLl92dHMgPSBEYXRlLm5vdygpO1xuICAgIH0gZWxzZSBpZiAoZS5fdnRzIDw9IGludm9rZXIuYXR0YWNoZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBwYXRjaFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbihlLCBpbnZva2VyLnZhbHVlKSxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNSxcbiAgICAgIFtlXVxuICAgICk7XG4gIH07XG4gIGludm9rZXIudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGludm9rZXIuYXR0YWNoZWQgPSBnZXROb3coKTtcbiAgcmV0dXJuIGludm9rZXI7XG59XG5mdW5jdGlvbiBwYXRjaFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbihlLCB2YWx1ZSkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBvcmlnaW5hbFN0b3AgPSBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsU3RvcC5jYWxsKGUpO1xuICAgICAgZS5fc3RvcHBlZCA9IHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gdmFsdWUubWFwKChmbikgPT4gKGUyKSA9PiAhZTIuX3N0b3BwZWQgJiYgZm4gJiYgZm4oZTIpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgbmF0aXZlT25SRSA9IC9eb25bYS16XS87XG5jb25zdCBwYXRjaFByb3AgPSAoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIGlzU1ZHID0gZmFsc2UsIHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdW5tb3VudENoaWxkcmVuKSA9PiB7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIHBhdGNoQ2xhc3MoZWwsIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgcGF0Y2hTdHlsZShlbCwgcHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgIHBhdGNoRXZlbnQoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleVswXSA9PT0gXCIuXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCB0cnVlKSA6IGtleVswXSA9PT0gXCJeXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCBmYWxzZSkgOiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRykpIHtcbiAgICBwYXRjaERPTVByb3AoXG4gICAgICBlbCxcbiAgICAgIGtleSxcbiAgICAgIG5leHRWYWx1ZSxcbiAgICAgIHByZXZDaGlsZHJlbixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoa2V5ID09PSBcInRydWUtdmFsdWVcIikge1xuICAgICAgZWwuX3RydWVWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJmYWxzZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fZmFsc2VWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gICAgcGF0Y2hBdHRyKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9XG59O1xuZnVuY3Rpb24gc2hvdWxkU2V0QXNQcm9wKGVsLCBrZXksIHZhbHVlLCBpc1NWRykge1xuICBpZiAoaXNTVkcpIHtcbiAgICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleSBpbiBlbCAmJiBuYXRpdmVPblJFLnRlc3Qoa2V5KSAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInNwZWxsY2hlY2tcIiB8fCBrZXkgPT09IFwiZHJhZ2dhYmxlXCIgfHwga2V5ID09PSBcInRyYW5zbGF0ZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwiZm9ybVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwibGlzdFwiICYmIGVsLnRhZ05hbWUgPT09IFwiSU5QVVRcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcInR5cGVcIiAmJiBlbC50YWdOYW1lID09PSBcIlRFWFRBUkVBXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5hdGl2ZU9uUkUudGVzdChrZXkpICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4ga2V5IGluIGVsO1xufVxuXG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGh5ZHJhdGUyKSB7XG4gIGNvbnN0IENvbXAgPSBkZWZpbmVDb21wb25lbnQob3B0aW9ucyk7XG4gIGNsYXNzIFZ1ZUN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBWdWVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsUHJvcHMpIHtcbiAgICAgIHN1cGVyKENvbXAsIGluaXRpYWxQcm9wcywgaHlkcmF0ZTIpO1xuICAgIH1cbiAgfVxuICBWdWVDdXN0b21FbGVtZW50LmRlZiA9IENvbXA7XG4gIHJldHVybiBWdWVDdXN0b21FbGVtZW50O1xufVxuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG5jb25zdCBkZWZpbmVTU1JDdXN0b21FbGVtZW50ID0gLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi8gKG9wdGlvbnMpID0+IHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBkZWZpbmVDdXN0b21FbGVtZW50KG9wdGlvbnMsIGh5ZHJhdGUpO1xufTtcbmNvbnN0IEJhc2VDbGFzcyA9IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IEhUTUxFbGVtZW50IDogY2xhc3Mge1xufTtcbmNsYXNzIFZ1ZUVsZW1lbnQgZXh0ZW5kcyBCYXNlQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcihfZGVmLCBfcHJvcHMgPSB7fSwgaHlkcmF0ZTIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2RlZiA9IF9kZWY7XG4gICAgdGhpcy5fcHJvcHMgPSBfcHJvcHM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3Jlc29sdmVkID0gZmFsc2U7XG4gICAgdGhpcy5fbnVtYmVyUHJvcHMgPSBudWxsO1xuICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICBpZiAodGhpcy5zaGFkb3dSb290ICYmIGh5ZHJhdGUyKSB7XG4gICAgICBoeWRyYXRlMih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgQ3VzdG9tIGVsZW1lbnQgaGFzIHByZS1yZW5kZXJlZCBkZWNsYXJhdGl2ZSBzaGFkb3cgcm9vdCBidXQgaXMgbm90IGRlZmluZWQgYXMgaHlkcmF0YWJsZS4gVXNlIFxcYGRlZmluZVNTUkN1c3RvbUVsZW1lbnRcXGAuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgICAgIGlmICghdGhpcy5fZGVmLl9fYXN5bmNMb2FkZXIpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKHRoaXMuX2RlZik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgaWYgKHRoaXMuX3Jlc29sdmVkKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZURlZigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5fb2IpIHtcbiAgICAgIHRoaXMuX29iLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICB9XG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgcmVuZGVyKG51bGwsIHRoaXMuc2hhZG93Um9vdCk7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogcmVzb2x2ZSBpbm5lciBjb21wb25lbnQgZGVmaW5pdGlvbiAoaGFuZGxlIHBvc3NpYmxlIGFzeW5jIGNvbXBvbmVudClcbiAgICovXG4gIF9yZXNvbHZlRGVmKCkge1xuICAgIHRoaXMuX3Jlc29sdmVkID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fc2V0QXR0cih0aGlzLmF0dHJpYnV0ZXNbaV0ubmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX29iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgZm9yIChjb25zdCBtIG9mIG11dGF0aW9ucykge1xuICAgICAgICB0aGlzLl9zZXRBdHRyKG0uYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb2Iub2JzZXJ2ZSh0aGlzLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgY29uc3QgcmVzb2x2ZSA9IChkZWYsIGlzQXN5bmMgPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgeyBwcm9wcywgc3R5bGVzIH0gPSBkZWY7XG4gICAgICBsZXQgbnVtYmVyUHJvcHM7XG4gICAgICBpZiAocHJvcHMgJiYgIWlzQXJyYXkocHJvcHMpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgY29uc3Qgb3B0ID0gcHJvcHNba2V5XTtcbiAgICAgICAgICBpZiAob3B0ID09PSBOdW1iZXIgfHwgb3B0ICYmIG9wdC50eXBlID09PSBOdW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gdGhpcy5fcHJvcHMpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJvcHNba2V5XSA9IHRvTnVtYmVyKHRoaXMuX3Byb3BzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKG51bWJlclByb3BzIHx8IChudW1iZXJQcm9wcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpKSlbY2FtZWxpemUkMShrZXkpXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bWJlclByb3BzO1xuICAgICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKGRlZik7XG4gICAgICB9XG4gICAgICB0aGlzLl9hcHBseVN0eWxlcyhzdHlsZXMpO1xuICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfTtcbiAgICBjb25zdCBhc3luY0RlZiA9IHRoaXMuX2RlZi5fX2FzeW5jTG9hZGVyO1xuICAgIGlmIChhc3luY0RlZikge1xuICAgICAgYXN5bmNEZWYoKS50aGVuKChkZWYpID0+IHJlc29sdmUoZGVmLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodGhpcy5fZGVmKTtcbiAgICB9XG4gIH1cbiAgX3Jlc29sdmVQcm9wcyhkZWYpIHtcbiAgICBjb25zdCB7IHByb3BzIH0gPSBkZWY7XG4gICAgY29uc3QgZGVjbGFyZWRQcm9wS2V5cyA9IGlzQXJyYXkocHJvcHMpID8gcHJvcHMgOiBPYmplY3Qua2V5cyhwcm9wcyB8fCB7fSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcykpIHtcbiAgICAgIGlmIChrZXlbMF0gIT09IFwiX1wiICYmIGRlY2xhcmVkUHJvcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdGhpc1trZXldLCB0cnVlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIGRlY2xhcmVkUHJvcEtleXMubWFwKGNhbWVsaXplJDEpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UHJvcChrZXkpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodmFsKSB7XG4gICAgICAgICAgdGhpcy5fc2V0UHJvcChrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBfc2V0QXR0cihrZXkpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShrZXkpO1xuICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgIGlmICh0aGlzLl9udW1iZXJQcm9wcyAmJiB0aGlzLl9udW1iZXJQcm9wc1tjYW1lbEtleV0pIHtcbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9zZXRQcm9wKGNhbWVsS2V5LCB2YWx1ZSwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRQcm9wKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9wcm9wc1trZXldO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXRQcm9wKGtleSwgdmFsLCBzaG91bGRSZWZsZWN0ID0gdHJ1ZSwgc2hvdWxkVXBkYXRlID0gdHJ1ZSkge1xuICAgIGlmICh2YWwgIT09IHRoaXMuX3Byb3BzW2tleV0pIHtcbiAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB2YWw7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlICYmIHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJlZmxlY3QpIHtcbiAgICAgICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpLCBcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSwgdmFsICsgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGh5cGhlbmF0ZShrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBfdXBkYXRlKCkge1xuICAgIHJlbmRlcih0aGlzLl9jcmVhdGVWTm9kZSgpLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICB9XG4gIF9jcmVhdGVWTm9kZSgpIHtcbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKHt9LCB0aGlzLl9wcm9wcykpO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHZub2RlLmNlID0gKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGluc3RhbmNlLmNlUmVsb2FkID0gKG5ld1N0eWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5zaGFkb3dSb290LnJlbW92ZUNoaWxkKHMpKTtcbiAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhuZXdTdHlsZXMpO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChldmVudCwge1xuICAgICAgICAgICAgICBkZXRhaWw6IGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdGFuY2UuZW1pdCA9IChldmVudCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgIGRpc3BhdGNoKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICBpZiAoaHlwaGVuYXRlKGV2ZW50KSAhPT0gZXZlbnQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGh5cGhlbmF0ZShldmVudCksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQgJiYgKHBhcmVudC5wYXJlbnROb2RlIHx8IHBhcmVudC5ob3N0KSkge1xuICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWdWVFbGVtZW50KSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQuX2luc3RhbmNlO1xuICAgICAgICAgICAgaW5zdGFuY2UucHJvdmlkZXMgPSBwYXJlbnQuX2luc3RhbmNlLnByb3ZpZGVzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgX2FwcGx5U3R5bGVzKHN0eWxlcykge1xuICAgIGlmIChzdHlsZXMpIHtcbiAgICAgIHN0eWxlcy5mb3JFYWNoKChjc3MpID0+IHtcbiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgICAgcy50ZXh0Q29udGVudCA9IGNzcztcbiAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKHMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICh0aGlzLl9zdHlsZXMgfHwgKHRoaXMuX3N0eWxlcyA9IFtdKSkucHVzaChzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1c2VDc3NWYXJzKGdldHRlcikge1xuICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGB1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdXBkYXRlVGVsZXBvcnRzID0gaW5zdGFuY2UudXQgPSAodmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSkpID0+IHtcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtdi1vd25lcj1cIiR7aW5zdGFuY2UudWlkfVwiXWApXG4gICAgKS5mb3JFYWNoKChub2RlKSA9PiBzZXRWYXJzT25Ob2RlKG5vZGUsIHZhcnMpKTtcbiAgfTtcbiAgY29uc3Qgc2V0VmFycyA9ICgpID0+IHtcbiAgICBjb25zdCB2YXJzID0gZ2V0dGVyKGluc3RhbmNlLnByb3h5KTtcbiAgICBzZXRWYXJzT25WTm9kZShpbnN0YW5jZS5zdWJUcmVlLCB2YXJzKTtcbiAgICB1cGRhdGVUZWxlcG9ydHModmFycyk7XG4gIH07XG4gIHdhdGNoUG9zdEVmZmVjdChzZXRWYXJzKTtcbiAgb25Nb3VudGVkKCgpID0+IHtcbiAgICBjb25zdCBvYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHNldFZhcnMpO1xuICAgIG9iLm9ic2VydmUoaW5zdGFuY2Uuc3ViVHJlZS5lbC5wYXJlbnROb2RlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICBvblVubW91bnRlZCgoKSA9PiBvYi5kaXNjb25uZWN0KCkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHNldFZhcnNPblZOb2RlKHZub2RlLCB2YXJzKSB7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlO1xuICAgIHZub2RlID0gc3VzcGVuc2UuYWN0aXZlQnJhbmNoO1xuICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoICYmICFzdXNwZW5zZS5pc0h5ZHJhdGluZykge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKCgpID0+IHtcbiAgICAgICAgc2V0VmFyc09uVk5vZGUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCB2YXJzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB3aGlsZSAodm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnQuc3ViVHJlZTtcbiAgfVxuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMSAmJiB2bm9kZS5lbCkge1xuICAgIHNldFZhcnNPbk5vZGUodm5vZGUuZWwsIHZhcnMpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoYykgPT4gc2V0VmFyc09uVk5vZGUoYywgdmFycykpO1xuICB9IGVsc2UgaWYgKHZub2RlLnR5cGUgPT09IFN0YXRpYykge1xuICAgIGxldCB7IGVsLCBhbmNob3IgfSA9IHZub2RlO1xuICAgIHdoaWxlIChlbCkge1xuICAgICAgc2V0VmFyc09uTm9kZShlbCwgdmFycyk7XG4gICAgICBpZiAoZWwgPT09IGFuY2hvcilcbiAgICAgICAgYnJlYWs7XG4gICAgICBlbCA9IGVsLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0VmFyc09uTm9kZShlbCwgdmFycykge1xuICBpZiAoZWwubm9kZVR5cGUgPT09IDEpIHtcbiAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnMpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KGAtLSR7a2V5fWAsIHZhcnNba2V5XSk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHBvc2l0aW9uTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBuZXdQb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbW92ZUNiS2V5ID0gU3ltYm9sKFwiX21vdmVDYlwiKTtcbmNvbnN0IGVudGVyQ2JLZXkgPSBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmNvbnN0IFRyYW5zaXRpb25Hcm91cEltcGwgPSB7XG4gIG5hbWU6IFwiVHJhbnNpdGlvbkdyb3VwXCIsXG4gIHByb3BzOiAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHt9LCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCB7XG4gICAgdGFnOiBTdHJpbmcsXG4gICAgbW92ZUNsYXNzOiBTdHJpbmdcbiAgfSksXG4gIHNldHVwKHByb3BzLCB7IHNsb3RzIH0pIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHN0YXRlID0gdXNlVHJhbnNpdGlvblN0YXRlKCk7XG4gICAgbGV0IHByZXZDaGlsZHJlbjtcbiAgICBsZXQgY2hpbGRyZW47XG4gICAgb25VcGRhdGVkKCgpID0+IHtcbiAgICAgIGlmICghcHJldkNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3ZlQ2xhc3MgPSBwcm9wcy5tb3ZlQ2xhc3MgfHwgYCR7cHJvcHMubmFtZSB8fCBcInZcIn0tbW92ZWA7XG4gICAgICBpZiAoIWhhc0NTU1RyYW5zZm9ybShcbiAgICAgICAgcHJldkNoaWxkcmVuWzBdLmVsLFxuICAgICAgICBpbnN0YW5jZS52bm9kZS5lbCxcbiAgICAgICAgbW92ZUNsYXNzXG4gICAgICApKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByZXZDaGlsZHJlbi5mb3JFYWNoKGNhbGxQZW5kaW5nQ2JzKTtcbiAgICAgIHByZXZDaGlsZHJlbi5mb3JFYWNoKHJlY29yZFBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IG1vdmVkQ2hpbGRyZW4gPSBwcmV2Q2hpbGRyZW4uZmlsdGVyKGFwcGx5VHJhbnNsYXRpb24pO1xuICAgICAgZm9yY2VSZWZsb3coKTtcbiAgICAgIG1vdmVkQ2hpbGRyZW4uZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IGMuZWw7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gICAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gc3R5bGUud2Via2l0VHJhbnNmb3JtID0gc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2IgPSBlbFttb3ZlQ2JLZXldID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZSAmJiBlLnRhcmdldCAhPT0gZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFlIHx8IC90cmFuc2Zvcm0kLy50ZXN0KGUucHJvcGVydHlOYW1lKSkge1xuICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgY2IpO1xuICAgICAgICAgICAgZWxbbW92ZUNiS2V5XSA9IG51bGw7XG4gICAgICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCBjYik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgcmF3UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gICAgICBjb25zdCBjc3NUcmFuc2l0aW9uUHJvcHMgPSByZXNvbHZlVHJhbnNpdGlvblByb3BzKHJhd1Byb3BzKTtcbiAgICAgIGxldCB0YWcgPSByYXdQcm9wcy50YWcgfHwgRnJhZ21lbnQ7XG4gICAgICBwcmV2Q2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCA/IGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCkpIDogW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGlmIChjaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhjaGlsZCwgY3NzVHJhbnNpdGlvblByb3BzLCBzdGF0ZSwgaW5zdGFuY2UpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybihgPFRyYW5zaXRpb25Hcm91cD4gY2hpbGRyZW4gbXVzdCBiZSBrZXllZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByZXZDaGlsZHJlbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gcHJldkNoaWxkcmVuW2ldO1xuICAgICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhjaGlsZCwgY3NzVHJhbnNpdGlvblByb3BzLCBzdGF0ZSwgaW5zdGFuY2UpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwb3NpdGlvbk1hcC5zZXQoY2hpbGQsIGNoaWxkLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHRhZywgbnVsbCwgY2hpbGRyZW4pO1xuICAgIH07XG4gIH1cbn07XG5jb25zdCByZW1vdmVNb2RlID0gKHByb3BzKSA9PiBkZWxldGUgcHJvcHMubW9kZTtcbi8qIEBfX1BVUkVfXyAqLyByZW1vdmVNb2RlKFRyYW5zaXRpb25Hcm91cEltcGwucHJvcHMpO1xuY29uc3QgVHJhbnNpdGlvbkdyb3VwID0gVHJhbnNpdGlvbkdyb3VwSW1wbDtcbmZ1bmN0aW9uIGNhbGxQZW5kaW5nQ2JzKGMpIHtcbiAgY29uc3QgZWwgPSBjLmVsO1xuICBpZiAoZWxbbW92ZUNiS2V5XSkge1xuICAgIGVsW21vdmVDYktleV0oKTtcbiAgfVxuICBpZiAoZWxbZW50ZXJDYktleV0pIHtcbiAgICBlbFtlbnRlckNiS2V5XSgpO1xuICB9XG59XG5mdW5jdGlvbiByZWNvcmRQb3NpdGlvbihjKSB7XG4gIG5ld1Bvc2l0aW9uTWFwLnNldChjLCBjLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbn1cbmZ1bmN0aW9uIGFwcGx5VHJhbnNsYXRpb24oYykge1xuICBjb25zdCBvbGRQb3MgPSBwb3NpdGlvbk1hcC5nZXQoYyk7XG4gIGNvbnN0IG5ld1BvcyA9IG5ld1Bvc2l0aW9uTWFwLmdldChjKTtcbiAgY29uc3QgZHggPSBvbGRQb3MubGVmdCAtIG5ld1Bvcy5sZWZ0O1xuICBjb25zdCBkeSA9IG9sZFBvcy50b3AgLSBuZXdQb3MudG9wO1xuICBpZiAoZHggfHwgZHkpIHtcbiAgICBjb25zdCBzID0gYy5lbC5zdHlsZTtcbiAgICBzLnRyYW5zZm9ybSA9IHMud2Via2l0VHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2R4fXB4LCR7ZHl9cHgpYDtcbiAgICBzLnRyYW5zaXRpb25EdXJhdGlvbiA9IFwiMHNcIjtcbiAgICByZXR1cm4gYztcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ1NTVHJhbnNmb3JtKGVsLCByb290LCBtb3ZlQ2xhc3MpIHtcbiAgY29uc3QgY2xvbmUgPSBlbC5jbG9uZU5vZGUoKTtcbiAgY29uc3QgX3Z0YyA9IGVsW3Z0Y0tleV07XG4gIGlmIChfdnRjKSB7XG4gICAgX3Z0Yy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICAgIGNscy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgY2xvbmUuY2xhc3NMaXN0LnJlbW92ZShjKSk7XG4gICAgfSk7XG4gIH1cbiAgbW92ZUNsYXNzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBjbG9uZS5jbGFzc0xpc3QuYWRkKGMpKTtcbiAgY2xvbmUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICBjb25zdCBjb250YWluZXIgPSByb290Lm5vZGVUeXBlID09PSAxID8gcm9vdCA6IHJvb3QucGFyZW50Tm9kZTtcbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lKTtcbiAgY29uc3QgeyBoYXNUcmFuc2Zvcm0gfSA9IGdldFRyYW5zaXRpb25JbmZvKGNsb25lKTtcbiAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgcmV0dXJuIGhhc1RyYW5zZm9ybTtcbn1cblxuY29uc3QgZ2V0TW9kZWxBc3NpZ25lciA9ICh2bm9kZSkgPT4ge1xuICBjb25zdCBmbiA9IHZub2RlLnByb3BzW1wib25VcGRhdGU6bW9kZWxWYWx1ZVwiXSB8fCBmYWxzZTtcbiAgcmV0dXJuIGlzQXJyYXkoZm4pID8gKHZhbHVlKSA9PiBpbnZva2VBcnJheUZucyhmbiwgdmFsdWUpIDogZm47XG59O1xuZnVuY3Rpb24gb25Db21wb3NpdGlvblN0YXJ0KGUpIHtcbiAgZS50YXJnZXQuY29tcG9zaW5nID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25FbmQoZSkge1xuICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgaWYgKHRhcmdldC5jb21wb3NpbmcpIHtcbiAgICB0YXJnZXQuY29tcG9zaW5nID0gZmFsc2U7XG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICB9XG59XG5jb25zdCBhc3NpZ25LZXkgPSBTeW1ib2woXCJfYXNzaWduXCIpO1xuY29uc3Qgdk1vZGVsVGV4dCA9IHtcbiAgY3JlYXRlZChlbCwgeyBtb2RpZmllcnM6IHsgbGF6eSwgdHJpbSwgbnVtYmVyIH0gfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgY29uc3QgY2FzdFRvTnVtYmVyID0gbnVtYmVyIHx8IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnR5cGUgPT09IFwibnVtYmVyXCI7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgbGF6eSA/IFwiY2hhbmdlXCIgOiBcImlucHV0XCIsIChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQuY29tcG9zaW5nKVxuICAgICAgICByZXR1cm47XG4gICAgICBsZXQgZG9tVmFsdWUgPSBlbC52YWx1ZTtcbiAgICAgIGlmICh0cmltKSB7XG4gICAgICAgIGRvbVZhbHVlID0gZG9tVmFsdWUudHJpbSgpO1xuICAgICAgfVxuICAgICAgaWYgKGNhc3RUb051bWJlcikge1xuICAgICAgICBkb21WYWx1ZSA9IGxvb3NlVG9OdW1iZXIoZG9tVmFsdWUpO1xuICAgICAgfVxuICAgICAgZWxbYXNzaWduS2V5XShkb21WYWx1ZSk7XG4gICAgfSk7XG4gICAgaWYgKHRyaW0pIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgICAgZWwudmFsdWUgPSBlbC52YWx1ZS50cmltKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFsYXp5KSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNvbXBvc2l0aW9uc3RhcnRcIiwgb25Db21wb3NpdGlvblN0YXJ0KTtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY29tcG9zaXRpb25lbmRcIiwgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICB9XG4gIH0sXG4gIC8vIHNldCB2YWx1ZSBvbiBtb3VudGVkIHNvIGl0J3MgYWZ0ZXIgbWluL21heCBmb3IgdHlwZT1cInJhbmdlXCJcbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgZWwudmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIHsgdmFsdWUsIG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBpZiAoZWwuY29tcG9zaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGVsVmFsdWUgPSBudW1iZXIgfHwgZWwudHlwZSA9PT0gXCJudW1iZXJcIiA/IGxvb3NlVG9OdW1iZXIoZWwudmFsdWUpIDogZWwudmFsdWU7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICAgIGlmIChlbFZhbHVlID09PSBuZXdWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWwgJiYgZWwudHlwZSAhPT0gXCJyYW5nZVwiKSB7XG4gICAgICBpZiAobGF6eSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodHJpbSAmJiBlbC52YWx1ZS50cmltKCkgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgZWwudmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxufTtcbmNvbnN0IHZNb2RlbENoZWNrYm94ID0ge1xuICAvLyAjNDA5NiBhcnJheSBjaGVja2JveGVzIG5lZWQgdG8gYmUgZGVlcCB0cmF2ZXJzZWRcbiAgZGVlcDogdHJ1ZSxcbiAgY3JlYXRlZChlbCwgXywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IGVsLl9tb2RlbFZhbHVlO1xuICAgICAgY29uc3QgZWxlbWVudFZhbHVlID0gZ2V0VmFsdWUoZWwpO1xuICAgICAgY29uc3QgY2hlY2tlZCA9IGVsLmNoZWNrZWQ7XG4gICAgICBjb25zdCBhc3NpZ24gPSBlbFthc3NpZ25LZXldO1xuICAgICAgaWYgKGlzQXJyYXkobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsb29zZUluZGV4T2YobW9kZWxWYWx1ZSwgZWxlbWVudFZhbHVlKTtcbiAgICAgICAgY29uc3QgZm91bmQgPSBpbmRleCAhPT0gLTE7XG4gICAgICAgIGlmIChjaGVja2VkICYmICFmb3VuZCkge1xuICAgICAgICAgIGFzc2lnbihtb2RlbFZhbHVlLmNvbmNhdChlbGVtZW50VmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICghY2hlY2tlZCAmJiBmb3VuZCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gWy4uLm1vZGVsVmFsdWVdO1xuICAgICAgICAgIGZpbHRlcmVkLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgYXNzaWduKGZpbHRlcmVkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1NldChtb2RlbFZhbHVlKSkge1xuICAgICAgICBjb25zdCBjbG9uZWQgPSBuZXcgU2V0KG1vZGVsVmFsdWUpO1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgIGNsb25lZC5hZGQoZWxlbWVudFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbG9uZWQuZGVsZXRlKGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduKGNsb25lZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NpZ24oZ2V0Q2hlY2tib3hWYWx1ZShlbCwgY2hlY2tlZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICAvLyBzZXQgaW5pdGlhbCBjaGVja2VkIG9uIG1vdW50IHRvIHdhaXQgZm9yIHRydWUtdmFsdWUvZmFsc2UtdmFsdWVcbiAgbW91bnRlZDogc2V0Q2hlY2tlZCxcbiAgYmVmb3JlVXBkYXRlKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBzZXRDaGVja2VkKGVsLCBiaW5kaW5nLCB2bm9kZSk7XG4gIH1cbn07XG5mdW5jdGlvbiBzZXRDaGVja2VkKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSB9LCB2bm9kZSkge1xuICBlbC5fbW9kZWxWYWx1ZSA9IHZhbHVlO1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBlbC5jaGVja2VkID0gbG9vc2VJbmRleE9mKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSkgPiAtMTtcbiAgfSBlbHNlIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICBlbC5jaGVja2VkID0gdmFsdWUuaGFzKHZub2RlLnByb3BzLnZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICBlbC5jaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgZ2V0Q2hlY2tib3hWYWx1ZShlbCwgdHJ1ZSkpO1xuICB9XG59XG5jb25zdCB2TW9kZWxSYWRpbyA9IHtcbiAgY3JlYXRlZChlbCwgeyB2YWx1ZSB9LCB2bm9kZSkge1xuICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSk7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIGVsW2Fzc2lnbktleV0oZ2V0VmFsdWUoZWwpKTtcbiAgICB9KTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBpZiAodmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICBlbC5jaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IHZNb2RlbFNlbGVjdCA9IHtcbiAgLy8gPHNlbGVjdCBtdWx0aXBsZT4gdmFsdWUgbmVlZCB0byBiZSBkZWVwIHRyYXZlcnNlZFxuICBkZWVwOiB0cnVlLFxuICBjcmVhdGVkKGVsLCB7IHZhbHVlLCBtb2RpZmllcnM6IHsgbnVtYmVyIH0gfSwgdm5vZGUpIHtcbiAgICBjb25zdCBpc1NldE1vZGVsID0gaXNTZXQodmFsdWUpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkVmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGVsLm9wdGlvbnMsIChvKSA9PiBvLnNlbGVjdGVkKS5tYXAoXG4gICAgICAgIChvKSA9PiBudW1iZXIgPyBsb29zZVRvTnVtYmVyKGdldFZhbHVlKG8pKSA6IGdldFZhbHVlKG8pXG4gICAgICApO1xuICAgICAgZWxbYXNzaWduS2V5XShcbiAgICAgICAgZWwubXVsdGlwbGUgPyBpc1NldE1vZGVsID8gbmV3IFNldChzZWxlY3RlZFZhbCkgOiBzZWxlY3RlZFZhbCA6IHNlbGVjdGVkVmFsWzBdXG4gICAgICApO1xuICAgIH0pO1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgfSxcbiAgLy8gc2V0IHZhbHVlIGluIG1vdW50ZWQgJiB1cGRhdGVkIGJlY2F1c2UgPHNlbGVjdD4gcmVsaWVzIG9uIGl0cyBjaGlsZHJlblxuICAvLyA8b3B0aW9uPnMuXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSk7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgX2JpbmRpbmcsIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICB9LFxuICB1cGRhdGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBzZXRTZWxlY3RlZChlbCwgdmFsdWUpO1xuICB9XG59O1xuZnVuY3Rpb24gc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKSB7XG4gIGNvbnN0IGlzTXVsdGlwbGUgPSBlbC5tdWx0aXBsZTtcbiAgaWYgKGlzTXVsdGlwbGUgJiYgIWlzQXJyYXkodmFsdWUpICYmICFpc1NldCh2YWx1ZSkpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICBgPHNlbGVjdCBtdWx0aXBsZSB2LW1vZGVsPiBleHBlY3RzIGFuIEFycmF5IG9yIFNldCB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgJHtPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKX0uYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAobGV0IGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBvcHRpb24gPSBlbC5vcHRpb25zW2ldO1xuICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2V0VmFsdWUob3B0aW9uKTtcbiAgICBpZiAoaXNNdWx0aXBsZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGxvb3NlSW5kZXhPZih2YWx1ZSwgb3B0aW9uVmFsdWUpID4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZS5oYXMob3B0aW9uVmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobG9vc2VFcXVhbChnZXRWYWx1ZShvcHRpb24pLCB2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGVsLnNlbGVjdGVkSW5kZXggIT09IGkpXG4gICAgICAgICAgZWwuc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFpc011bHRpcGxlICYmIGVsLnNlbGVjdGVkSW5kZXggIT09IC0xKSB7XG4gICAgZWwuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICB9XG59XG5mdW5jdGlvbiBnZXRWYWx1ZShlbCkge1xuICByZXR1cm4gXCJfdmFsdWVcIiBpbiBlbCA/IGVsLl92YWx1ZSA6IGVsLnZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0Q2hlY2tib3hWYWx1ZShlbCwgY2hlY2tlZCkge1xuICBjb25zdCBrZXkgPSBjaGVja2VkID8gXCJfdHJ1ZVZhbHVlXCIgOiBcIl9mYWxzZVZhbHVlXCI7XG4gIHJldHVybiBrZXkgaW4gZWwgPyBlbFtrZXldIDogY2hlY2tlZDtcbn1cbmNvbnN0IHZNb2RlbER5bmFtaWMgPSB7XG4gIGNyZWF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwiY3JlYXRlZFwiKTtcbiAgfSxcbiAgbW91bnRlZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgbnVsbCwgXCJtb3VudGVkXCIpO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcImJlZm9yZVVwZGF0ZVwiKTtcbiAgfSxcbiAgdXBkYXRlZChlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIFwidXBkYXRlZFwiKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVEeW5hbWljTW9kZWwodGFnTmFtZSwgdHlwZSkge1xuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICBjYXNlIFwiU0VMRUNUXCI6XG4gICAgICByZXR1cm4gdk1vZGVsU2VsZWN0O1xuICAgIGNhc2UgXCJURVhUQVJFQVwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsQ2hlY2tib3g7XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOlxuICAgICAgICAgIHJldHVybiB2TW9kZWxSYWRpbztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsVGV4dDtcbiAgICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgaG9vaykge1xuICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICBlbC50YWdOYW1lLFxuICAgIHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnR5cGVcbiAgKTtcbiAgY29uc3QgZm4gPSBtb2RlbFRvVXNlW2hvb2tdO1xuICBmbiAmJiBmbihlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSk7XG59XG5mdW5jdGlvbiBpbml0Vk1vZGVsRm9yU1NSKCkge1xuICB2TW9kZWxUZXh0LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSkgPT4gKHsgdmFsdWUgfSk7XG4gIHZNb2RlbFJhZGlvLmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSwgdm5vZGUpID0+IHtcbiAgICBpZiAodm5vZGUucHJvcHMgJiYgbG9vc2VFcXVhbCh2bm9kZS5wcm9wcy52YWx1ZSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgfVxuICB9O1xuICB2TW9kZWxDaGVja2JveC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgbG9vc2VJbmRleE9mKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSkgPiAtMSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgIGlmICh2bm9kZS5wcm9wcyAmJiB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgfVxuICB9O1xuICB2TW9kZWxEeW5hbWljLmdldFNTUlByb3BzID0gKGJpbmRpbmcsIHZub2RlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2bm9kZS50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsVG9Vc2UgPSByZXNvbHZlRHluYW1pY01vZGVsKFxuICAgICAgLy8gcmVzb2x2ZUR5bmFtaWNNb2RlbCBleHBlY3RzIGFuIHVwcGVyY2FzZSB0YWcgbmFtZSwgYnV0IHZub2RlLnR5cGUgaXMgbG93ZXJjYXNlXG4gICAgICB2bm9kZS50eXBlLnRvVXBwZXJDYXNlKCksXG4gICAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICAgKTtcbiAgICBpZiAobW9kZWxUb1VzZS5nZXRTU1JQcm9wcykge1xuICAgICAgcmV0dXJuIG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMoYmluZGluZywgdm5vZGUpO1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3Qgc3lzdGVtTW9kaWZpZXJzID0gW1wiY3RybFwiLCBcInNoaWZ0XCIsIFwiYWx0XCIsIFwibWV0YVwiXTtcbmNvbnN0IG1vZGlmaWVyR3VhcmRzID0ge1xuICBzdG9wOiAoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSxcbiAgcHJldmVudDogKGUpID0+IGUucHJldmVudERlZmF1bHQoKSxcbiAgc2VsZjogKGUpID0+IGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQsXG4gIGN0cmw6IChlKSA9PiAhZS5jdHJsS2V5LFxuICBzaGlmdDogKGUpID0+ICFlLnNoaWZ0S2V5LFxuICBhbHQ6IChlKSA9PiAhZS5hbHRLZXksXG4gIG1ldGE6IChlKSA9PiAhZS5tZXRhS2V5LFxuICBsZWZ0OiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAwLFxuICBtaWRkbGU6IChlKSA9PiBcImJ1dHRvblwiIGluIGUgJiYgZS5idXR0b24gIT09IDEsXG4gIHJpZ2h0OiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAyLFxuICBleGFjdDogKGUsIG1vZGlmaWVycykgPT4gc3lzdGVtTW9kaWZpZXJzLnNvbWUoKG0pID0+IGVbYCR7bX1LZXlgXSAmJiAhbW9kaWZpZXJzLmluY2x1ZGVzKG0pKVxufTtcbmNvbnN0IHdpdGhNb2RpZmllcnMgPSAoZm4sIG1vZGlmaWVycykgPT4ge1xuICByZXR1cm4gKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGd1YXJkID0gbW9kaWZpZXJHdWFyZHNbbW9kaWZpZXJzW2ldXTtcbiAgICAgIGlmIChndWFyZCAmJiBndWFyZChldmVudCwgbW9kaWZpZXJzKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZm4oZXZlbnQsIC4uLmFyZ3MpO1xuICB9O1xufTtcbmNvbnN0IGtleU5hbWVzID0ge1xuICBlc2M6IFwiZXNjYXBlXCIsXG4gIHNwYWNlOiBcIiBcIixcbiAgdXA6IFwiYXJyb3ctdXBcIixcbiAgbGVmdDogXCJhcnJvdy1sZWZ0XCIsXG4gIHJpZ2h0OiBcImFycm93LXJpZ2h0XCIsXG4gIGRvd246IFwiYXJyb3ctZG93blwiLFxuICBkZWxldGU6IFwiYmFja3NwYWNlXCJcbn07XG5jb25zdCB3aXRoS2V5cyA9IChmbiwgbW9kaWZpZXJzKSA9PiB7XG4gIHJldHVybiAoZXZlbnQpID0+IHtcbiAgICBpZiAoIShcImtleVwiIGluIGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBldmVudEtleSA9IGh5cGhlbmF0ZShldmVudC5rZXkpO1xuICAgIGlmIChtb2RpZmllcnMuc29tZSgoaykgPT4gayA9PT0gZXZlbnRLZXkgfHwga2V5TmFtZXNba10gPT09IGV2ZW50S2V5KSkge1xuICAgICAgcmV0dXJuIGZuKGV2ZW50KTtcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCByZW5kZXJlck9wdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKHsgcGF0Y2hQcm9wIH0sIG5vZGVPcHMpO1xubGV0IHJlbmRlcmVyO1xubGV0IGVuYWJsZWRIeWRyYXRpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZVJlbmRlcmVyKCkge1xuICByZXR1cm4gcmVuZGVyZXIgfHwgKHJlbmRlcmVyID0gY3JlYXRlUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKSk7XG59XG5mdW5jdGlvbiBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpIHtcbiAgcmVuZGVyZXIgPSBlbmFibGVkSHlkcmF0aW9uID8gcmVuZGVyZXIgOiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihyZW5kZXJlck9wdGlvbnMpO1xuICBlbmFibGVkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlcmVyO1xufVxuY29uc3QgcmVuZGVyID0gKC4uLmFyZ3MpID0+IHtcbiAgZW5zdXJlUmVuZGVyZXIoKS5yZW5kZXIoLi4uYXJncyk7XG59O1xuY29uc3QgaHlkcmF0ZSA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuaHlkcmF0ZSguLi5hcmdzKTtcbn07XG5jb25zdCBjcmVhdGVBcHAgPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCBhcHAgPSBlbnN1cmVSZW5kZXJlcigpLmNyZWF0ZUFwcCguLi5hcmdzKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbmplY3ROYXRpdmVUYWdDaGVjayhhcHApO1xuICAgIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCk7XG4gIH1cbiAgY29uc3QgeyBtb3VudCB9ID0gYXBwO1xuICBhcHAubW91bnQgPSAoY29udGFpbmVyT3JTZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXJPclNlbGVjdG9yKTtcbiAgICBpZiAoIWNvbnRhaW5lcilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBjb21wb25lbnQgPSBhcHAuX2NvbXBvbmVudDtcbiAgICBpZiAoIWlzRnVuY3Rpb24oY29tcG9uZW50KSAmJiAhY29tcG9uZW50LnJlbmRlciAmJiAhY29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICBjb21wb25lbnQudGVtcGxhdGUgPSBjb250YWluZXIuaW5uZXJIVE1MO1xuICAgIH1cbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICBjb25zdCBwcm94eSA9IG1vdW50KGNvbnRhaW5lciwgZmFsc2UsIGNvbnRhaW5lciBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpO1xuICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwidi1jbG9ha1wiKTtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLXYtYXBwXCIsIFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG4gIHJldHVybiBhcHA7XG59O1xuY29uc3QgY3JlYXRlU1NSQXBwID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG1vdW50KGNvbnRhaW5lciwgdHJ1ZSwgY29udGFpbmVyIGluc3RhbmNlb2YgU1ZHRWxlbWVudCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBwO1xufTtcbmZ1bmN0aW9uIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJpc05hdGl2ZVRhZ1wiLCB7XG4gICAgdmFsdWU6ICh0YWcpID0+IGlzSFRNTFRhZyh0YWcpIHx8IGlzU1ZHVGFnKHRhZyksXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKSB7XG4gIGlmIChpc1J1bnRpbWVPbmx5KCkpIHtcbiAgICBjb25zdCBpc0N1c3RvbUVsZW1lbnQgPSBhcHAuY29uZmlnLmlzQ3VzdG9tRWxlbWVudDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJpc0N1c3RvbUVsZW1lbnRcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gaXNDdXN0b21FbGVtZW50O1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgVGhlIFxcYGlzQ3VzdG9tRWxlbWVudFxcYCBjb25maWcgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBcXGBjb21waWxlck9wdGlvbnMuaXNDdXN0b21FbGVtZW50XFxgIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IGFwcC5jb25maWcuY29tcGlsZXJPcHRpb25zO1xuICAgIGNvbnN0IG1zZyA9IGBUaGUgXFxgY29tcGlsZXJPcHRpb25zXFxgIGNvbmZpZyBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyBhIGJ1aWxkIG9mIFZ1ZS5qcyB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyIChha2EgXCJmdWxsIGJ1aWxkXCIpLiBTaW5jZSB5b3UgYXJlIHVzaW5nIHRoZSBydW50aW1lLW9ubHkgYnVpbGQsIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBtdXN0IGJlIHBhc3NlZCB0byBcXGBAdnVlL2NvbXBpbGVyLWRvbVxcYCBpbiB0aGUgYnVpbGQgc2V0dXAgaW5zdGVhZC5cbi0gRm9yIHZ1ZS1sb2FkZXI6IHBhc3MgaXQgdmlhIHZ1ZS1sb2FkZXIncyBcXGBjb21waWxlck9wdGlvbnNcXGAgbG9hZGVyIG9wdGlvbi5cbi0gRm9yIHZ1ZS1jbGk6IHNlZSBodHRwczovL2NsaS52dWVqcy5vcmcvZ3VpZGUvd2VicGFjay5odG1sI21vZGlmeWluZy1vcHRpb25zLW9mLWEtbG9hZGVyXG4tIEZvciB2aXRlOiBwYXNzIGl0IHZpYSBAdml0ZWpzL3BsdWdpbi12dWUgb3B0aW9ucy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS1wbHVnaW4tdnVlL3RyZWUvbWFpbi9wYWNrYWdlcy9wbHVnaW4tdnVlI2V4YW1wbGUtZm9yLXBhc3Npbmctb3B0aW9ucy10by12dWVjb21waWxlci1zZmNgO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImNvbXBpbGVyT3B0aW9uc1wiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVyT3B0aW9ucztcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoaXNTdHJpbmcoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IHJlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhcmVzKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIG1vdW50IGFwcDogbW91bnQgdGFyZ2V0IHNlbGVjdG9yIFwiJHtjb250YWluZXJ9XCIgcmV0dXJuZWQgbnVsbC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdpbmRvdy5TaGFkb3dSb290ICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290ICYmIGNvbnRhaW5lci5tb2RlID09PSBcImNsb3NlZFwiKSB7XG4gICAgd2FybihcbiAgICAgIGBtb3VudGluZyBvbiBhIFNoYWRvd1Jvb3Qgd2l0aCBcXGB7bW9kZTogXCJjbG9zZWRcIn1cXGAgbWF5IGxlYWQgdG8gdW5wcmVkaWN0YWJsZSBidWdzYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lcjtcbn1cbmxldCBzc3JEaXJlY3RpdmVJbml0aWFsaXplZCA9IGZhbHNlO1xuY29uc3QgaW5pdERpcmVjdGl2ZXNGb3JTU1IgPSAoKSA9PiB7XG4gIGlmICghc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQpIHtcbiAgICBzc3JEaXJlY3RpdmVJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaW5pdFZNb2RlbEZvclNTUigpO1xuICAgIGluaXRWU2hvd0ZvclNTUigpO1xuICB9XG59IDtcblxuZXhwb3J0IHsgVHJhbnNpdGlvbiwgVHJhbnNpdGlvbkdyb3VwLCBWdWVFbGVtZW50LCBjcmVhdGVBcHAsIGNyZWF0ZVNTUkFwcCwgZGVmaW5lQ3VzdG9tRWxlbWVudCwgZGVmaW5lU1NSQ3VzdG9tRWxlbWVudCwgaHlkcmF0ZSwgaW5pdERpcmVjdGl2ZXNGb3JTU1IsIHJlbmRlciwgdXNlQ3NzTW9kdWxlLCB1c2VDc3NWYXJzLCB2TW9kZWxDaGVja2JveCwgdk1vZGVsRHluYW1pYywgdk1vZGVsUmFkaW8sIHZNb2RlbFNlbGVjdCwgdk1vZGVsVGV4dCwgdlNob3csIHdpdGhLZXlzLCB3aXRoTW9kaWZpZXJzIH07XG4iLCJpbXBvcnQgeyBpbml0Q3VzdG9tRm9ybWF0dGVyLCB3YXJuIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWRvbSc7XG5leHBvcnQgKiBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcblxuZnVuY3Rpb24gaW5pdERldigpIHtcbiAge1xuICAgIGluaXRDdXN0b21Gb3JtYXR0ZXIoKTtcbiAgfVxufVxuXG5pZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICBpbml0RGV2KCk7XG59XG5jb25zdCBjb21waWxlID0gKCkgPT4ge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oXG4gICAgICBgUnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLmAgKyAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gIClcbiAgICAgIC8qIHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgY29tcGlsZSB9O1xuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jYWxlbmRhclxuICAuZGl0by1jYWxlbmRhci1wb3B1cFxuICAgIC5kaXRvLWNhbGVuZGFyLWlubmVyXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1pZj1cImN1cnJlbnRNb2RlID09PSAnZGF5J1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1tb250aChcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgnbW9udGgnKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgbW9udGg6IHRydWUgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItd2Vla2RheXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwid2Vla2RheSBpbiB3ZWVrZGF5TmFtZXNcIlxuICAgICAgICAgICAgKSB7eyB3ZWVrZGF5LnNob3J0IH19XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItZGF0ZXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiZGF0ZSBpbiBkYXRlUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJkYXRlLnN0YXRlICYmIGBkaXRvLWNhbGVuZGFyLWl0ZW0tJHtkYXRlLnN0YXRlfWBcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJkYXRlLnN0YXRlICE9PSAnZGlzYWJsZWQnICYmIHNlbGVjdERhdGUoZGF0ZS5kYXRlKVwiXG4gICAgICAgICAgICApIHt7IGRhdGUudGV4dCB9fVxuICAgICAgICAuZGl0by1jYWxlbmRhci1mb290ZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW5vdyhcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOnRpdGxlPVwiZGF0ZVRvU3RyaW5nKG5ldyBEYXRlKCkpXCJcbiAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUobmV3IERhdGUoKSlcIlxuICAgICAgICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItbW9udGhzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIihtb250aCwgaW5kZXgpIGluIG1vbnRoTmFtZXNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRNb250aENsYXNzKGluZGV4KVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdE1vbnRoKGluZGV4KVwiXG4gICAgICAgICAgICApIHt7IG1vbnRoLnNob3J0IH19XG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICd5ZWFyJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW4ge3sgZGVjYWRlVG9TdHJpbmcoY3VycmVudFZhbHVlKSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci15ZWFyc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ5ZWFyIGluIHllYXJSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldFllYXJDbGFzcyh5ZWFyKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgKSB7eyB5ZWFyIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVzY3JpYmVEYXRlLCBhbHRlckRhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBtb2RlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RheScgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyB3ZWVrZGF5TmFtZXMsIG1vbnRoTmFtZXMgfSA9IGdldExvY2FsZU5hbWVzKHRoaXMubG9jYWxlKVxuICAgIHJldHVybiB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzLFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcbiAgICAgIHllYXJSYW5nZTogW10sXG4gICAgICBjdXJyZW50VmFsdWU6IChcbiAgICAgICAgdGhpcy5tb2RlbFZhbHVlIHx8XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB1c2UgY3VycmVudCBkYXRlIGJ1dCBjbGVhciB0aW1lIGZpZWxkczpcbiAgICAgICAgYWx0ZXJEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApLFxuICAgICAgY3VycmVudE1vZGU6IHRoaXMubW9kZVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG8gfHwgbmV3IERhdGUoKVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkaXNhYmxlZERhdGU6ICd1cGRhdGVEYXRlUmFuZ2UnLFxuXG4gICAgbW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TW9udGhDbGFzcyhtb250aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmXG4gICAgICAgICAgbW9udGggPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogbW9udGggPT09IHRoaXMuY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0WWVhckNsYXNzKHllYXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJiB5ZWFyID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiB5ZWFyID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldERhdGUob3ZlcnJpZGVzLCB1cGRhdGUgPSBmYWxzZSkge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50VmFsdWUsIG92ZXJyaWRlcylcbiAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RlcERlY2FkZShzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIDEwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZXRNb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfSxcblxuICAgIHN0ZXBNb250aChzdGVwKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeyB5ZWFyLCBtb250aCB9ID0gdGhpcy5nZXRZZWFyTW9udGgoXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXBcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIG1vbnRoLFxuICAgICAgICBkYXk6IE1hdGgubWluKFxuICAgICAgICAgIHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpLFxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldERhdGUoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzdGVwWWVhcihzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2VsZWN0RGF0ZShkYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGUoZGVzY3JpYmVEYXRlKGRhdGUpLCB0cnVlKVxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0JylcbiAgICB9LFxuXG4gICAgc2VsZWN0TW9udGgobW9udGgpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgIC8vIFNldCBkYXkgdG8gMSB0byBhdm9pZCBzZWxlY3RpbmcgYSBkYXRlIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGVcbiAgICAgIC8vIG5ldyBtb250aCwgZS5nLiBGZWIgMzEgLT4gTWFyIDMuXG4gICAgICB0aGlzLnNldERhdGUoeyBtb250aCwgZGF5OiAxIH0sIHRydWUpXG4gICAgfSxcblxuICAgIHNlbGVjdFllYXIoeWVhcikge1xuICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICB0aGlzLnNldERhdGUoeyB5ZWFyIH0sIHRydWUpXG4gICAgfSxcblxuICAgIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgeWVhcisrXG4gICAgICAgIG1vbnRoID0gMFxuICAgICAgfSBlbHNlIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgeWVhci0tXG4gICAgICAgIG1vbnRoID0gMTFcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoIH1cbiAgICB9LFxuXG4gICAgZGF0ZVRvU3RyaW5nKFxuICAgICAgZGF0ZSxcbiAgICAgIHsgeWVhciwgbW9udGgsIGRheSB9ID0geyB5ZWFyOiB0cnVlLCBtb250aDogdHJ1ZSwgZGF5OiB0cnVlIH1cbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgIHllYXI6IHllYXIgJiYgJ251bWVyaWMnLFxuICAgICAgICBtb250aDogbW9udGggJiYgJ2xvbmcnLFxuICAgICAgICBkYXk6IGRheSAmJiAnbnVtZXJpYydcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGRlY2FkZVRvU3RyaW5nKGRhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgICAgIHJldHVybiBgJHt5ZWFyfSDigJMgJHt5ZWFyICsgOX1gXG4gICAgfSxcblxuICAgIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKClcbiAgICB9LFxuXG4gICAgZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcikge1xuICAgICAgY29uc3QgeWVhclN0ciA9IHllYXIudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuICtgJHt5ZWFyU3RyLnNsaWNlKDAsIC0xKX0wYFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZSh7IHN0ZXAsIGVudGVyLCBtb2RlID0gdGhpcy5jdXJyZW50TW9kZSwgdXBkYXRlID0gZmFsc2UgfSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyBkYXk6IGN1cnJlbnRWYWx1ZS5nZXREYXRlKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGg6IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgeWVhcjogY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlRGF0ZVJhbmdlKCkge1xuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxuICAgICAgdGhpcy55ZWFyUmFuZ2UgPSBbXVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2UucHVzaChzdGFydFllYXIgKyBpKVxuICAgICAgfVxuICAgICAgY29uc3QgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPT09IDApIHtcbiAgICAgICAgZmlyc3REYXlXZWVrID0gN1xuICAgICAgfVxuICAgICAgY29uc3QgbnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCAtIDEpXG4gICAgICAgIGNvbnN0IHByZXZNb250aE51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKFxuICAgICAgICAgIHByZXZNb250aC55ZWFyLFxuICAgICAgICAgIHByZXZNb250aC5tb250aFxuICAgICAgICApXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwcmV2TW9udGhOdW1EYXlzIC0gZmlyc3REYXlXZWVrICsgaSArIDFcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUocHJldk1vbnRoLnllYXIsIHByZXZNb250aC5tb250aCwgZGF5KVxuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogZGF5LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG51bURheXM7IGkrKykge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGkpXG4gICAgICAgIGNvbnN0IGlzRGF5ID0gZGF0ZSA9PiAoXG4gICAgICAgICAgZGF0ZSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpID09PSBpICYmXG4gICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXG4gICAgICAgICAgZGF0ZS5nZXRNb250aCgpID09PSBtb250aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNEYXkodGhpcy5tb2RlbFZhbHVlKVxuICAgICAgICAgID8gJ2FjdGl2ZSdcbiAgICAgICAgICA6IGlzRGF5KG5vdylcbiAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKVxuICAgICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgICAgOiBpc0RheShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnY3VycmVudCdcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRNb250aE5lZWQgPSA0MiAtIHRoaXMuZGF0ZVJhbmdlLmxlbmd0aFxuICAgICAgaWYgKG5leHRNb250aE5lZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoICsgMSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbmV4dE1vbnRoTmVlZDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxvY2FsZU5hbWVzID0ge31cblxuLy8gQ2FsbGluZyBgdG9Mb2NhbGVTdHJpbmcoKWAgdGhpcyBtdWNoIGFwcGVhcnMgdG8gYmUgZXhwZW5zaXZlLCBzbyBjYWNoZSBpdDpcbmZ1bmN0aW9uIGdldExvY2FsZU5hbWVzKGxvY2FsZSkge1xuICBsZXQgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdXG4gIGlmICghbmFtZXMpIHtcbiAgICBjb25zdCB3ZWVrZGF5TmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgMCwgaSlcbiAgICAgIHdlZWtkYXlOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIGksIDApXG4gICAgICBtb250aE5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXSA9IHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jYWxlbmRhciB7XG4gIG1pbi13aWR0aDogMjQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXBvcHVwIHtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgei1pbmRleDogJHotaW5kZXgtcG9wdXA7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWJvZHkge1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNyk7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiBjYWxjKCN7JGlucHV0LWhlaWdodH0gLSAycHgpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tdG9kYXkge1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUge1xuICAgICYsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQsXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZ3JheSB7XG4gICAgY29sb3I6ICM5OTk5OTk7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItbW9udGhzLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMge1xuICBzcGFuIHtcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNCk7XG4gICAgbWFyZ2luOiAwLjVlbSAwO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICB3aWR0aDogY2FsYygxMDAlIC8gNSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyIGEsXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW4sXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIgc3BhbiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICBhIHtcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhcjpub3QoOmhvdmVyKSAuZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci13ZWVrZGF5cyBzcGFuIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIsXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbn1cblxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogJGJvcmRlci1zdHlsZTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgPiBzcGFuIHtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgcGFkZGluZzogMCAwLjVlbTtcbiAgfVxuXG4gIGEge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LFxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogNSU7XG4gIG1pbi13aWR0aDogMmVtO1xuICBtYXgtd2lkdGg6IDNlbTtcblxuICAmOjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZm9udC1zaXplOiAxLjI1ZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLknO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCqyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLonO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCuyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc2VsZWN0LW5vdyB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnTm93JztcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkRXZlbnRzKHRhcmdldHMsIGV2ZW50cykge1xuICB0YXJnZXRzID1cbiAgICB0YXJnZXRzIGluc3RhbmNlb2YgTm9kZUxpc3RcbiAgICAgID8gQXJyYXkuZnJvbSh0YXJnZXRzKVxuICAgICAgOiBhc0FycmF5KHRhcmdldHMpXG5cbiAgZm9yIChjb25zdCBbdHlwZSwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnRzKSkge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVtb3ZlKCkge1xuICAgICAgZm9yIChjb25zdCBbdHlwZSwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVFdmVudHMoLi4uZXZlbnRzKSB7XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlKCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgZXZlbnQucmVtb3ZlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleShldmVudCkge1xuICByZXR1cm4ge1xuICAgIDM3OiAnbGVmdCcsXG4gICAgMzg6ICd1cCcsXG4gICAgMzk6ICdyaWdodCcsXG4gICAgNDA6ICdkb3duJyxcbiAgICAxMzogJ2VudGVyJ1xuICB9W2V2ZW50Py5rZXlDb2RlXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5TmF2aWdhdGlvbihldmVudCkge1xuICBjb25zdCBrZXkgPSBnZXRLZXkoZXZlbnQpXG4gIHJldHVybiB7XG4gICAgaG9yOiB7IGxlZnQ6IC0xLCByaWdodDogMSB9W2tleV0gfHwgMCxcbiAgICB2ZXI6IHsgdXA6IC0xLCBkb3duOiAxIH1ba2V5XSB8fCAwLFxuICAgIGVudGVyOiBrZXkgPT09ICdlbnRlcidcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0KGNvbXBvbmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBpc1N0cmluZyhjb21wb25lbnQudGFyZ2V0KVxuICAgID8gY29tcG9uZW50LiRyZWZzW2NvbXBvbmVudC50YXJnZXRdXG4gICAgOiBjb21wb25lbnQudGFyZ2V0XG4gIHJldHVybiB0YXJnZXQ/LiRlbCA/PyB0YXJnZXRcbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdHJpZ2dlci1jb250YWluZXJcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWlmPVwiYWx3YXlzU2hvd1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnY2xpY2snXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQG1vdXNlZW50ZXI9XCJvbkhvdmVyKHRydWUpXCJcbiAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnZm9jdXMnIHx8IHRyaWdnZXIgPT09ICdhbHdheXMnXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICBUcmFuc2l0aW9uKDpuYW1lPVwiYGRpdG8tJHt0cmFuc2l0aW9ufWBcIilcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgICAgQG1vdXNlZW50ZXI9XCJvbkhvdmVyKHRydWUpXCJcbiAgICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1lbHNlXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzLCBjb21iaW5lRXZlbnRzIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpzaG93J10sXG5cbiAgcHJvcHM6IHtcbiAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2NsaWNrJyB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbScgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY3VzdG9tQ2xhc3M6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgekluZGV4OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgIGtlZXBJblZpZXc6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGhpZGVXaGVuQ2xpY2tPdXRzaWRlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBhbHdheXNTaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY292ZXI6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBoaWRlRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIHBvcHVwUGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudCxcbiAgICAgIGZvY3VzRXZlbnRzOiBudWxsLFxuICAgICAgY2xvc2VFdmVudHM6IG51bGwsXG4gICAgICBwb3B1cEV2ZW50czogbnVsbCxcbiAgICAgIGJsdXJUaW1lcjogbnVsbCxcbiAgICAgIG1vdXNlTGVhdmVUaW1lcjogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRyaWdnZXJDbGFzcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXRyaWdnZXItZGlzYWJsZWQnOiB0aGlzLmRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBvcHVwQ2xhc3MoKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICBbYGRpdG8tcG9wdXAtJHtoeXBoZW5hdGUodGhpcy5wbGFjZW1lbnQpfWBdOiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jdXN0b21DbGFzcykge1xuICAgICAgICBjbGFzc2VzW3RoaXMuY3VzdG9tQ2xhc3NdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsYXNzZXNcbiAgICB9LFxuXG4gICAgcG9wdXBTdHlsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpJbmRleCA/IGB6LWluZGV4OiAke3RoaXMuekluZGV4fWAgOiAnJ1xuICAgIH0sXG5cbiAgICB0cmlnZ2VyVGFyZ2V0KCkge1xuICAgICAgcmV0dXJuIGdldFRhcmdldCh0aGlzKVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93IHx8IHRoaXMuYWx3YXlzU2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vblNob3dQb3B1cCh0bykpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgY29uc3QgeyB0cmlnZ2VyLCBwb3B1cCB9ID0gdGhpcy4kcmVmc1xuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgIHRoaXMuZm9jdXNFdmVudHMgPSB0aGlzLmFkZEZvY3VzRXZlbnRzKHRoaXMudHJpZ2dlclRhcmdldCA/PyB0cmlnZ2VyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhpZGVXaGVuQ2xpY2tPdXRzaWRlICYmICF0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIC8vIFVzZSAnbW91c2V1cCcgaW5zdGVhZCBvZiAnY2xpY2snLCBzaW5jZSBjbGljayBhcHBlYXJzIHRvIGhhcHBlbiBhZnRlclxuICAgICAgLy8gdGhlIERPTSBpbnNpZGUgb2YgcG9wdXBzIGNvdWxkIGNoYW5nZSBpbiBhIHdheSBzbyB0aGF0IHRoZSBjaGVja1xuICAgICAgLy8gYHBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldClgIHdvdWxkIGZhaWw6XG4gICAgICB0aGlzLmNsb3NlRXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAgICBtb3VzZXVwOiBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgJiZcbiAgICAgICAgICAgICFwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICAgICAhdHJpZ2dlci5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICAgICAhdGhpcy50cmlnZ2VyVGFyZ2V0Py5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zaG93UG9wdXAgPSB0aGlzLnNob3dcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5mb2N1c0V2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLmNsb3NlRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMucG9wdXBFdmVudHM/LnJlbW92ZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHVwZGF0ZVBvc2l0aW9uKCkge1xuICAgICAgY29uc3QgeyB0cmlnZ2VyLCBwb3B1cCB9ID0gdGhpcy4kcmVmc1xuICAgICAgaWYgKHRoaXMuc2hvdyAmJiBwb3B1cC5vZmZzZXRXaWR0aCA9PT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSwgMClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMudHJpZ2dlclRhcmdldCA/PyB0cmlnZ2VyXG4gICAgICAvLyBBY3R1YWxseSByZXNpemUgdGhlIHBvcHVwJ3MgZmlyc3QgY2hpbGQsIHNvIHRoZXkgY2FuIHNldCBzaXplIGxpbWl0cy5cbiAgICAgIGNvbnN0IGVsID0gdGhpcy50YXJnZXQgPT09ICdwb3B1cCcgPyB0cmlnZ2VyIDogcG9wdXAuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zdHlsZS53aWR0aCA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS53aWR0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBib3VuZHMgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGNvbnN0IHRyaWdnZXJMZWZ0ID0gYm91bmRzLmxlZnQgKyB3aW5kb3cuc2Nyb2xsWFxuICAgICAgY29uc3QgdHJpZ2dlclRvcCA9IGJvdW5kcy50b3AgKyB3aW5kb3cuc2Nyb2xsWVxuICAgICAgY29uc3QgdHJpZ2dlcldpZHRoID0gYm91bmRzLndpZHRoXG4gICAgICBjb25zdCB0cmlnZ2VySGVpZ2h0ID0gYm91bmRzLmhlaWdodFxuICAgICAgY29uc3QgcG9wdXBXaWR0aCA9IHBvcHVwLm9mZnNldFdpZHRoXG4gICAgICBjb25zdCBwb3B1cEhlaWdodCA9IHBvcHVwLm9mZnNldEhlaWdodFxuXG4gICAgICBsZXQgW3BhcnQxLCBwYXJ0Ml0gPSB0aGlzLnBvcHVwUGxhY2VtZW50LnNwbGl0KCctJykgfHwgW11cbiAgICAgIGlmICh0aGlzLmtlZXBJblZpZXcpIHtcbiAgICAgICAgY29uc3Qgd2luV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgICAgICBjb25zdCB3aW5IZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgaWYgKHBhcnQxID09PSAndG9wJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wIDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ2JvdHRvbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgaWYgKHdpbkhlaWdodCAtIHRyaWdnZXJUb3AgLSB0cmlnZ2VySGVpZ2h0IDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ3RvcCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh3aW5XaWR0aCAtIHRyaWdnZXJMZWZ0IC0gdHJpZ2dlcldpZHRoIDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAnbGVmdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydDIgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHdpbkhlaWdodCAtIHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDIgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlclRvcCArIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDIgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdyaWdodCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlckxlZnQgKyB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgbGVmdCA9IDBcbiAgICAgIGxldCB0b3AgPSAwXG4gICAgICBzd2l0Y2ggKHBhcnQxKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgbGVmdCAtPSBwb3B1cFdpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgKz0gdHJpZ2dlcldpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgKz0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHBhcnQyKSB7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGggLSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCAtPSBwb3B1cEhlaWdodCAtIHRyaWdnZXJIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY292ZXIpIHtcbiAgICAgICAgaWYgKHBhcnQxID09PSAndG9wJykge1xuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgdG9wIC09IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRhcmdldCAhPT0gdHJpZ2dlcikge1xuICAgICAgICBjb25zdCB0cmlnZ2VyQm91bmRzID0gdHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBsZWZ0ICs9IHRyaWdnZXJMZWZ0IC0gdHJpZ2dlckJvdW5kcy5sZWZ0XG4gICAgICAgIHRvcCArPSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckJvdW5kcy50b3BcbiAgICAgIH1cbiAgICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YFxuICAgICAgcG9wdXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YFxuICAgIH0sXG5cbiAgICBhZGRGb2N1c0V2ZW50cyhwYXJlbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHRleHRhcmVhJylcbiAgICAgIGxldCBpbnB1dFxuXG4gICAgICByZXR1cm4gY29tYmluZUV2ZW50cyhcbiAgICAgICAgYWRkRXZlbnRzKHRhcmdldHMsIHtcbiAgICAgICAgICBmb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ibHVyVGltZXIpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSB0aW1lb3V0IHRvIGFsbG93IGNsaWNrZWQgaW5wdXRzIHRvIGdyYWIgZm9jdXNcbiAgICAgICAgICAgIHRoaXMuYmx1clRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy4kcmVmcy5wb3B1cC5tYXRjaGVzKCc6Zm9jdXMtd2l0aGluJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICBhZGRFdmVudHMocGFyZW50LCB7XG4gICAgICAgICAgbW91c2Vkb3duOiBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbicpKSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJy5kaXRvLWJ1dHRvbi1jbGVhcicpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdGhpcy4kcmVmcy50cmlnZ2VyXG4gICAgICAgICAgICAgIC8vIE1hcmsgdHJpZ2dlciBpbnB1dCBhcyByZWFkb25seSBzbyBpdCBjYW4ndCBsb29zZSBmb2N1cyB3aGlsZVxuICAgICAgICAgICAgICAvLyB1c2VyIGRvZXMgb3RoZXIgbW91c2UtYWN0aXZpdGllcyBpbiBwb3B1cC5cbiAgICAgICAgICAgICAgaW5wdXQgPSB0cmlnZ2VyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICAgICAgICAgIGlmIChpbnB1dCAmJiAhaW5wdXQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICd0cnVlJylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBtb3VzZXVwOiBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgLy8gR2l2ZSBzb21lIHRpbWUgZm9yIG90aGVyIGV2ZW50cyB0byB1cGRhdGUgaW5wdXQgYmVmb3JlIGl0XG4gICAgICAgICAgICAgIC8vIGJlY29tZXMgZWRpdGFibGUgYW5kIHN0aWxsIGZvY3VzZWQgYWdhaW4uXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKVxuICAgICAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgYnV0dG9uJykpIHtcbiAgICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsXG4gICAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBvblNob3dQb3B1cChzaG93KSB7XG4gICAgICBpZiAoc2hvdykge1xuICAgICAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICAgICAgdGhpcy5wb3B1cEV2ZW50cyA9IHRoaXMuYWRkRm9jdXNFdmVudHModGhpcy4kcmVmcy5wb3B1cClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9wdXBFdmVudHM/LnJlbW92ZSgpXG4gICAgICAgIHRoaXMucG9wdXBFdmVudHMgPSBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2xpY2soKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXIoZW50ZXIpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZUxlYXZlVGltZXIpXG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmhpZGVEZWxheSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgfSwgdGhpcy5oaWRlRGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMvaW5kZXguc2Nzcyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1pbnB1dCg6Y2xhc3M9XCJjbGFzc2VzXCIpXG4gIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICBpbnB1dChcbiAgICA6aWQ9XCJpZFwiXG4gICAgcmVmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgIDp0eXBlPVwidHlwZVwiXG4gICAgOm5hbWU9XCJuYW1lXCJcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpyZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICA6YXV0b2ZvY3VzPVwiYXV0b2ZvY3VzXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgOmF1dG9jb21wbGV0ZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgOmFyaWEtbGFiZWw9XCJ0aXRsZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIClcbiAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgYXV0b2ZvY3VzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgYXV0b2NvbXBsZXRlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ29mZicgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgaG92ZXJpbmc6IGZhbHNlLFxuICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJGF0dHJzLmNsYXNzXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dFxuICAgIH0sXG5cbiAgICBzaXplKCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHNpemUgYmFzZWQgb24gbWluICYgbWF4IHNldHRpbmdzLCBpZiB0aGV5J3JlIHByb3ZpZGVkLlxuICAgICAgY29uc3QgeyBzaXplLCBtaW4sIG1heCB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIGNvbnN0IGdldExlbmd0aCA9IHZhbHVlID0+ICh2YWx1ZSAhPSBudWxsID8gYCR7dmFsdWV9YC5sZW5ndGggOiAwKVxuICAgICAgcmV0dXJuIHNpemUgfHwgZ2V0TGVuZ3RoKG1pbikgfHwgZ2V0TGVuZ3RoKG1heCkgfHwgdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1pbnB1dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuICBAZXh0ZW5kICVpbnB1dDtcblxuICBpbnB1dCB7XG4gICAgLy8gSW5oZXJpdCBhbGwgc3R5bGluZyBmcm9tIC5kaXRvLWlucHV0XG4gICAgYWxsOiBpbmhlcml0O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaS5kaXRvLWljb24oXG4gIDpjbGFzcz1ge1xuICAgIFsnZGl0by1pY29uLS0nICsgbmFtZV06IHRydWUsXG4gICAgJ2RpdG8taWNvbi0tZGlzYWJsZWQnOiBkaXNhYmxlZFxuICB9YFxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLy8gYHlhcm4gYnVpbGQ6aWNvbnNgIGNvbnZlcnRzIHRoZSBpY29uIFNWRyBmaWxlcyB0byBzaWxlbnQgY2xhc3NlcyBpbnNpZGVcbi8vIGBzcmMvc3R5bGVzL21peGlucy9faWNvbnMuc2Nzc2AsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBhbGwgb3RoZXIgc2Fzc1xuLy8gY29kZSB0aHJvdWdoIGBfaW1wb3J0c2AuXG4vLyBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIGFzIG5vcm1hbCBDU1MgY2xhc3NlcywgY29udmVydCB0aGVtIGhlcmU6XG5AZWFjaCAkbmFtZSBpbiAkaWNvbnMge1xuICAuZGl0by1pY29uLS0jeyRuYW1lfSB7XG4gICAgJjo6YWZ0ZXIge1xuICAgICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcblxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1pY29uIHtcbiAgQGF0LXJvb3QgLmRpdG8taW5wdXQgJiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAkYm9yZGVyLXdpZHRoO1xuICAgIGxlZnQ6IHVuc2V0O1xuICAgIHdpZHRoOiAyZW07XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGNvbG9yOiAkY29sb3ItZ3JleTtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG5cbiAgICAmLS1kaXNhYmxlZCB7XG4gICAgICBjb2xvcjogJGNvbG9yLWxpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIEBhdC1yb290IC5kaXRvLWlucHV0OmZvY3VzLXdpdGhpbiAmIHtcbiAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQsIGVuZCB9KSB7XG4gIGlmIChpbnB1dD8uc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICBpbnB1dC5mb2N1cygpXG4gICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dCAmJiAnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0XG4gICAgPyB7IHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCwgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmQgfVxuICAgIDogbnVsbFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tZGF0ZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiZm9jdXNcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIkc2xvdHMudHJpZ2dlclwiXG4gICAgICBuYW1lPVwidHJpZ2dlclwiXG4gICAgKVxuICAgIElucHV0RmllbGQuZGl0by1kYXRlLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIC4uLiRhdHRycyB9XCJcbiAgICAgIEBmb2N1cz1cIm9uRm9jdXModHJ1ZSlcIlxuICAgICAgQGJsdXI9XCJvbkZvY3VzKGZhbHNlKVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvbk1vdXNlRG93bihmYWxzZSlcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNiZWZvcmUpXG4gICAgICAgIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICAgICAgdGVtcGxhdGUoI2FmdGVyKVxuICAgICAgICBJY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJhZnRlclwiKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgQ2FsZW5kYXIuZGl0by1kYXRlLXBpY2tlci1wb3B1cChcbiAgICAgIHJlZj1cImNhbGVuZGFyXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1iaW5kPVwieyBsb2NhbGUsIGRpc2FibGVkRGF0ZSB9XCJcbiAgICAgIEBzZWxlY3Q9XCJzaG93UG9wdXAgPSBmYWxzZVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuL0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgQ2FsZW5kYXIsIElucHV0RmllbGQsIEljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIGRhdGU6IGRlZmF1bHRGb3JtYXRzLmRhdGUsXG4gICAgICAgIHRpbWU6IGZhbHNlXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIGdldFRhcmdldCh0aGlzKT8ucXVlcnlTZWxlY3RvcignaW5wdXQnKVxuICAgIH0sXG5cbiAgICBmb3JtYXRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgLi4udGhpcy5mb3JtYXRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uRm9jdXMoZm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZm9jdXNcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gZm9jdXNcbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCB7IHZlcjogc3RlcCwgZW50ZXIgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICBpZiAoc3RlcCB8fCBlbnRlcikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dCk/LnN0YXJ0XG4gICAgICAgIGNvbnN0IGdldERhdGVQYXJ0ID0gcG9zaXRpb24gPT5cbiAgICAgICAgICBnZXREYXRlUGFydEF0UG9zaXRpb24odGhpcy5jdXJyZW50VGV4dCwgcG9zaXRpb24sIHRoaXMuZm9ybWF0T3B0aW9ucylcblxuICAgICAgICBpZiAoc3RlcCAmJiAhdGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7IGNhbGVuZGFyIH0gPSB0aGlzLiRyZWZzXG4gICAgICAgICAgaWYgKGNhbGVuZGFyKSB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWU6IG1vZGUsIHN0YXJ0IH0gPSBnZXREYXRlUGFydChwb3NpdGlvbikgfHwge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbW9kZSAmJlxuICAgICAgICAgICAgICBjYWxlbmRhci5uYXZpZ2F0ZSh7IHN0ZXAsIGVudGVyLCBtb2RlLCB1cGRhdGU6IHRydWUgfSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy5pbnB1dCwgZ2V0RGF0ZVBhcnQoc3RhcnQpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9ICF0aGlzLmRpc2FibGVkICYmICghdG9nZ2xlIHx8ICF0aGlzLnNob3dQb3B1cClcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1pbi13aWR0aDogOGVtO1xuICB9XG59XG5cbi5kaXRvLWRhdGUtcGlja2VyLXBvcHVwIHtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuPC9zdHlsZT5cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLXRpbWUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBJbnB1dEZpZWxkLmRpdG8tdGltZS1waWNrZXItaW5wdXQoXG4gICAgICB2LWVsc2VcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYmVmb3JlKVxuICAgICAgICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgICAgIHRlbXBsYXRlKCNhZnRlcilcbiAgICAgICAgSWNvbihcbiAgICAgICAgICBuYW1lPVwiY2xvY2tcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnByZXZlbnQ9XCJvbk1vdXNlRG93bih0cnVlKVwiXG4gICAgICAgIClcbiAgICAgICAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIC5kaXRvLXRpbWUtcGlja2VyLXBvcHVwXG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLWhvdXIocmVmPVwiaG91clwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiAyNFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRIb3VyKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBob3VyID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImhvdXIgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItbWludXRlKHJlZj1cIm1pbnV0ZVwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRNaW51dGUoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IG1pbnV0ZSA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJtaW51dGUgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItc2Vjb25kKHJlZj1cInNlY29uZFwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRTZWNvbmQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IHNlY29uZCA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWNvbmQgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4vVHJpZ2dlci52dWUnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uLnZ1ZSdcbmltcG9ydCB7IGFsdGVyRGF0ZSwgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgSW5wdXRGaWVsZCwgSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgdGltZTogZGVmYXVsdEZvcm1hdHMudGltZSxcbiAgICAgICAgZGF0ZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZEhvdXI6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRNaW51dGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRTZWNvbmQ6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGlnbm9yZU5leHRDaGFuZ2U6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcyk/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgIC4uLnRoaXMuZm9ybWF0XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgfHwgJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudERhdGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSB8fFxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRGF0ZSgpIG9iamVjdCB3aXRoIHRoZSB0aW1lIHNldCB0byAwLCB0byBiZSB1c2VkIHdoZW5cbiAgICAgICAgLy8gZmlyc3Qgc2V0dGluZyBhbnkgb2YgdGhlIHRpbWVzLCBmb3IgbWVhbmluZ2Z1bCBkYXRlcyBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBvYmplY3QgaXMgc2hhcmVkIHdpdGggYSBEYXRlUGlja2VyLCBlLmcuIHRocm91Z2ggRGF0ZVRpbWVQaWNrZXIuXG4gICAgICAgIGFsdGVyRGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBob3VyOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldEhvdXJzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChob3VyKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IGhvdXIgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWludXRlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KG1pbnV0ZSkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBtaW51dGUgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2Vjb25kOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldFNlY29uZHMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KHNlY29uZCkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBzZWNvbmQgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKHRydWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zY3JvbGxBbGwodHJ1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQoKSB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB0aGlzXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oaW5wdXQpXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZm9jdXNlZCAmJlxuICAgICAgICAhdGhpcy5pZ25vcmVOZXh0Q2hhbmdlICYmXG4gICAgICAgIHNlbGVjdGlvbi5zdGFydCA9PT0gc2VsZWN0aW9uLmVuZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbihpbnB1dCwgc2VsZWN0aW9uKSlcbiAgICAgIH1cbiAgICAgIHRoaXMuaWdub3JlTmV4dENoYW5nZSA9IGZhbHNlXG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKGZhbHNlKVxuICAgICAgfVxuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGVmdFBhZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpXG4gICAgfSxcblxuICAgIHNldFRpbWUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGFsdGVyRGF0ZSh0aGlzLmN1cnJlbnREYXRlLCB7XG4gICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNjcm9sbEFsbChzbW9vdGgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbCA9IChyZWYsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJHJlZnNbcmVmXVxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IChcbiAgICAgICAgICAgIHRhcmdldC5zY3JvbGxIZWlnaHQgL1xuICAgICAgICAgICAgLy8gRmlyc3QgYW5kIGxhc3Qgb25lIGFkZCAzIHRpbWVzIHRoZSBtYXJnaW4uXG4gICAgICAgICAgICAodGFyZ2V0LmNoaWxkRWxlbWVudENvdW50ICsgNilcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgdG9wID0gTWF0aC5yb3VuZCh2YWx1ZSAqIGxpbmVIZWlnaHQpXG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyh0YXJnZXQuc2Nyb2xsVG9wIC0gdG9wKVxuICAgICAgICAgIHRhcmdldC5zY3JvbGxUbyh7XG4gICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICBiZWhhdmlvcjogc21vb3RoICYmIGRpc3RhbmNlIDwgMTAwID8gJ3Ntb290aCcgOiAnYXV0bydcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHNjcm9sbCgnaG91cicsIHRoaXMuaG91cilcbiAgICAgICAgc2Nyb2xsKCdtaW51dGUnLCB0aGlzLm1pbnV0ZSlcbiAgICAgICAgc2Nyb2xsKCdzZWNvbmQnLCB0aGlzLnNlY29uZClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRm9jdXMoZm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZm9jdXNcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gZm9jdXNcbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB0aGlzXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oaW5wdXQpXG4gICAgICBjb25zdCB7IHZlcjogc3RlcCwgZW50ZXIgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICBpZiAoc3RlcCB8fCBlbnRlcikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHNlbGVjdGlvbi5zdGFydCkgfHwge31cbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXSArIHN0ZXBcbiAgICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLiRyZWZzW25hbWVdLmNoaWxkRWxlbWVudENvdW50XG4gICAgICAgICAgICAgIHRoaXNbbmFtZV0gPVxuICAgICAgICAgICAgICAgIHZhbHVlIDwgMFxuICAgICAgICAgICAgICAgICAgPyB2YWx1ZSArIGNvdW50XG4gICAgICAgICAgICAgICAgICA6IHZhbHVlID49IGNvdW50XG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWUgLSBjb3VudFxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgICAgIHRoaXMuaWdub3JlTmV4dENoYW5nZSA9IHRydWVcbiAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKGlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uc3RhcnQgPT09IHNlbGVjdGlvbi5lbmQpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gaW5wdXRcbiAgICAgICAgbGV0IHBvcyA9IHNlbGVjdGlvbi5zdGFydFxuXG4gICAgICAgIGNvbnN0IGlzRGlnaXQgPSBjaGFyID0+ICFpc05hTihwYXJzZUludChjaGFyLCAxMCkpXG5cbiAgICAgICAgaWYgKGV2ZW50LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBpZiAoaXNEaWdpdChldmVudC5rZXkpICYmIHBvcyA8IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB2YWx1ZVtwb3NdID09PSAnOicgJiZcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAxXSkgJiZcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAyXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBwb3MrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIG5leHQgZGlnaXQgc28gdGhlIGV2ZW50IG92ZXJyaWRlcyBpdCBpbnN0ZWFkIG9mIGluc2VydGluZ1xuICAgICAgICAgICAgLy8gbmV3IGNoYXJzLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3Bvc10pICYmIChcbiAgICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyArIDFdKSB8fFxuICAgICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMV0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IChcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZShwb3MgKyAxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykubGVuZ3RoXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBsZW5ndGgpXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgc2VsZWN0aW9uKVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwb3MgPT09IDEgfHxcbiAgICAgICAgICAgIFsnICcsICc6J10uaW5jbHVkZXModmFsdWVbcG9zIC0gMl0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHBvcyA9PT0gdmFsdWUubGVuZ3RoIHx8XG4gICAgICAgICAgICAgIHZhbHVlW3Bvc10gPT09ICc6J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHBvcy0tXG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gKFxuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKDAsIHBvcykgK1xuICAgICAgICAgICAgICAgICgodmFsdWVbcG9zIC0gMV0gPz8gJycpICsgJzAwJykgK1xuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKHBvcyArIDEpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0OiBwb3MsIGVuZDogcG9zIH0pXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3Bvc10pICYmXG4gICAgICAgICAgICAgICFpc0RpZ2l0KCt2YWx1ZVtwb3MgKyAxXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBXaGVuIHJlbW92aW5nIHRoZSBmaXJzdCBvZiB0d28gZGlnaXRzLCByZXBsYWNlIHdpdGggMFxuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHBvcykgKyAnMCcgKyB2YWx1ZS5zbGljZShwb3MpXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1pbi13aWR0aDogNmVtO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbWF4LXdpZHRoOiAxNjBweDtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuXG4kdGltZS1waWNrZXItbGluZS1oZWlnaHQ6IDI0cHg7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCAuZGl0by10aW1lLXBpY2tlci1wYW5lbCB7XG4gIGZsb2F0OiBsZWZ0O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci13aWR0aDogMCAxcHggMDtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyAzICsgMXB4KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAmOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci1yaWdodDogMDtcbiAgfVxuXG4gIHVsIHtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbjogMDtcbiAgICAvLyBIaWRlIHNjcm9sbGJhcjpcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBwYWRkaW5nOiAwIDE3cHggMCAwO1xuICAgIGhlaWdodDogNyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcblxuICAgICYgPiBsaSB7XG4gICAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICBsaW5lLWhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcbiAgICAgIH1cblxuICAgICAgJi5zZWxlY3RlZCxcbiAgICAgICYuc2VsZWN0ZWQ6aG92ZXIge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQ6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlcihyZWY9XCJwaWNrZXJcIilcbiAgLmRpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5uZXIoOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiKVxuICAgIElucHV0RmllbGQuZGl0by1kYXRlLXRpbWUtcGlja2VyX19pbnB1dChcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYmVmb3JlKVxuICAgICAgICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgICAgIHRlbXBsYXRlKCNhZnRlcilcbiAgICAgICAgSWNvbihcbiAgICAgICAgICBuYW1lPVwiY2FsZW5kYXJcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnByZXZlbnQ9XCJvbk1vdXNlRG93bih0cnVlKVwiXG4gICAgICAgIClcbiAgICAgICAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbiAgICBEYXRlUGlja2VyKFxuICAgICAgcmVmPVwiZGF0ZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dEYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgICAgIC8vLSBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgVGltZVBpY2tlcihcbiAgICAgIHJlZj1cInRpbWVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93VGltZVwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tcmlnaHRcIlxuICAgICAgOnRhcmdldD1cIiRyZWZzLnBpY2tlclwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAgICAgLy8tIEludGVudGlvbmFsbHkgZW1wdHlcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzLCBhc3NpZ25EZWVwbHkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4vRGF0ZVBpY2tlci52dWUnXG5pbXBvcnQgVGltZVBpY2tlciBmcm9tICcuL1RpbWVQaWNrZXIudnVlJ1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uLnZ1ZSdcbmltcG9ydCB7IHBhcnNlRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IElucHV0RmllbGQsIERhdGVQaWNrZXIsIFRpbWVQaWNrZXIsIEljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZm9ybWF0OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93RGF0ZTogZmFsc2UsXG4gICAgICBzaG93VGltZTogZmFsc2UsXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgZGF0ZUZvY3VzZWQ6IGZhbHNlLFxuICAgICAgdGltZUZvY3VzZWQ6IGZhbHNlLFxuICAgICAgY2xvc2VkTW9kZTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IHRyYW5zaXRpb24sIGRpc2FibGVkLCBsb2NhbGUsIGZvcm1hdE9wdGlvbnM6IGZvcm1hdCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHsgdHJhbnNpdGlvbiwgZGlzYWJsZWQsIGxvY2FsZSwgZm9ybWF0IH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dEYXRlIHx8IHRoaXMuc2hvd1RpbWVcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dC5pbnB1dFxuICAgIH0sXG5cbiAgICBmb3JtYXRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIGFzc2lnbkRlZXBseShcbiAgICAgICAge1xuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgdGltZTogZGVmYXVsdEZvcm1hdHMudGltZSxcbiAgICAgICAgICBkYXRlOiBkZWZhdWx0Rm9ybWF0cy5kYXRlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgICAgIGZvcm1hdDogKHZhbHVlLCB0eXBlLCBvcHRpb25zKSA9PlxuICAgICAgICAgICAgICB0eXBlID09PSAnbGl0ZXJhbCcgJiYgL1xcYmF0XFxiLy50ZXN0KHZhbHVlKVxuICAgICAgICAgICAgICAgID8gJywgJ1xuICAgICAgICAgICAgICAgIDogdGhpcy5mb3JtYXQ/LmRhdGU/LmZvcm1hdD8uKHZhbHVlLCB0eXBlLCBvcHRpb25zKSA/PyB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5mb3JtYXRcbiAgICAgIClcbiAgICB9LFxuXG4gICAgdGltZUluZGV4KCkge1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY3VycmVudFRleHRcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0ZXh0Lm1hdGNoKC8oW1xcU10rXFxzKikkLyk/LlsxXVxuICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCAtIHRpbWUubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgfHwgJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQpXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQsIHNlbGVjdGlvbikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uRm9jdXMoZm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZm9jdXNcbiAgICAgIGlmIChmb2N1cykge1xuICAgICAgICB0aGlzLnVwZGF0ZVBvcHVwcygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dEYXRlID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaG93VGltZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKHRvZ2dsZSkge1xuICAgICAgaWYgKHRvZ2dsZSAmJiAodGhpcy5zaG93RGF0ZSB8fCB0aGlzLnNob3dUaW1lKSkge1xuICAgICAgICB0aGlzLnNob3dEYXRlID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaG93VGltZSA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51cGRhdGVQb3B1cHMoKSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5nZXRNb2RlKGV2ZW50KVxuICAgICAgdGhpcy4kcmVmc1ttb2RlXS5vbktleURvd24oZXZlbnQpXG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICB0aGlzLmNsb3NlZE1vZGUgPSBtb2RlXG4gICAgICB9IGVsc2UgaWYgKG1vZGUgIT09IHRoaXMuY2xvc2VkTW9kZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBvcHVwcyhtb2RlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRNb2RlKGV2ZW50ID0gbnVsbCkge1xuICAgICAgY29uc3QgeyBzdGFydCB9ID0gZ2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQpXG4gICAgICBjb25zdCB7IGhvcjogc3RlcCB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIHJldHVybiB0aGlzLnRpbWVJbmRleCA9PT0gbnVsbCB8fCBzdGFydCArIHN0ZXAgPCB0aGlzLnRpbWVJbmRleFxuICAgICAgICA/ICdkYXRlJ1xuICAgICAgICA6ICd0aW1lJ1xuICAgIH0sXG5cbiAgICB1cGRhdGVQb3B1cHMobW9kZSA9IHRoaXMuZ2V0TW9kZSgpKSB7XG4gICAgICBpZiAobW9kZSkge1xuICAgICAgICB0aGlzLmNsb3NlZE1vZGUgPSBudWxsXG4gICAgICB9XG4gICAgICB0aGlzLnNob3dEYXRlID0gbW9kZSA9PT0gJ2RhdGUnXG4gICAgICB0aGlzLnNob3dUaW1lID0gbW9kZSA9PT0gJ3RpbWUnXG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlciB7XG4gICZfX2lubmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgJl9faW5wdXQge1xuICAgIGZsZXg6IDE7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBtaW4td2lkdGg6IDEyZW07XG4gIH1cblxuICAuZGl0by1kYXRlLXBpY2tlcixcbiAgLmRpdG8tdGltZS1waWNrZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYWdpbmF0aW9uXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwoXG4gICAgdi1pZj1cInNob3dUb3RhbFwiXG4gIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJ0b3RhbCA+IDBcIlxuICAgICkge3sgZmlyc3QgfX0g4oCTIHt7IGxhc3QgfX0gLyB7eyB0b3RhbCB9fVxuICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgICB2LWlmPVwibnVtUGFnZXMgPiAxXCJcbiAgKVxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwiYnV0dG9uIGluIGJ1dHRvbnNcIlxuICAgICAgOmNsYXNzPVwiZ2V0QnV0dG9uQ2xhc3NlcyhidXR0b24pXCJcbiAgICAgIDpkaXNhYmxlZD1cImJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgICBAY2xpY2s9XCJvbkNsaWNrQnV0dG9uKGJ1dHRvbilcIlxuICAgIClcbiAgICAgIHNwYW4oXG4gICAgICAgIHYtaWY9XCJidXR0b24udGV4dFwiXG4gICAgICApIHt7IGJ1dHRvbi50ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6cGFnZSddLFxuXG4gIHByb3BzOiB7XG4gICAgdG90YWw6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAgcGFnZTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEgfSxcbiAgICBwYWdlU2l6ZTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEwIH0sXG4gICAgc2hvd1RvdGFsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQcmV2OiB0cnVlLFxuICAgICAgc2hvd05leHQ6IHRydWUsXG4gICAgICBjdXJyZW50UGFnZTogdGhpcy5wYWdlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZmlyc3QoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemUgKyAxXG4gICAgfSxcblxuICAgIGxhc3QoKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5maXJzdCArIHRoaXMucGFnZVNpemUgLSAxLCB0aGlzLnRvdGFsKVxuICAgIH0sXG5cbiAgICBudW1QYWdlcygpIHtcbiAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy50b3RhbCAvIHRoaXMucGFnZVNpemUpXG4gICAgfSxcblxuICAgIGJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7IHNob3dQcmV2LCBzaG93TmV4dCwgY3VycmVudFBhZ2UsIG51bVBhZ2VzIH0gPSB0aGlzXG4gICAgICBjb25zdCBzaG93TGVuZ3RoID0gc2hvd1ByZXYgKyBzaG93TmV4dCArIDFcblxuICAgICAgbGV0IHN0YXJ0ID0gMVxuICAgICAgbGV0IGVuZCA9IDFcbiAgICAgIGlmIChudW1QYWdlcyA8PSBzaG93TGVuZ3RoKSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlIDw9IHNob3dQcmV2ICsgMSkge1xuICAgICAgICBlbmQgPSBzaG93TGVuZ3RoXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IG51bVBhZ2VzIC0gc2hvd05leHQpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgICAgc3RhcnQgPSBudW1QYWdlcyAtIHNob3dMZW5ndGggKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IGN1cnJlbnRQYWdlIC0gc2hvd1ByZXZcbiAgICAgICAgZW5kID0gY3VycmVudFBhZ2UgKyBzaG93TmV4dFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25zID0gW11cbiAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgIGluZGV4OiBjdXJyZW50UGFnZSAtIDEsXG4gICAgICAgIHR5cGU6ICdwcmV2JyxcbiAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnRQYWdlIDw9IDFcbiAgICAgIH0pXG4gICAgICBpZiAoc3RhcnQgPj0gMikge1xuICAgICAgICBidXR0b25zLnB1c2goeyBpbmRleDogMSwgdGV4dDogMSB9KVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID4gMikge1xuICAgICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1heCgxLCBjdXJyZW50UGFnZSAtIDEwKSxcbiAgICAgICAgICB0eXBlOiAnZWxsaXBzaXMtcHJldidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgYWN0aXZlOiBpID09PSBjdXJyZW50UGFnZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1pbihudW1QYWdlcywgY3VycmVudFBhZ2UgKyAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLW5leHQnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDw9IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBidXR0b25zLnB1c2goeyBpbmRleDogbnVtUGFnZXMsIHRleHQ6IG51bVBhZ2VzIH0pXG4gICAgICB9XG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgKyAxLFxuICAgICAgICB0eXBlOiAnbmV4dCcsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA+PSBudW1QYWdlc1xuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGJ1dHRvbnNcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBwYWdlKHBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlXG4gICAgfSxcblxuICAgIHBhZ2VTaXplKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLm51bVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLm51bVBhZ2VzXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRQYWdlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnBhZ2UnLCB0bylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldEJ1dHRvbkNsYXNzZXMoYnV0dG9uKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICAnZGl0by1zZWxlY3RlZCc6IGJ1dHRvbi5hY3RpdmVcbiAgICAgIH1cbiAgICAgIGlmIChidXR0b24udHlwZSkge1xuICAgICAgICBjbGFzc2VzW2BkaXRvLWJ1dHRvbi0ke2J1dHRvbi50eXBlfWBdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsYXNzZXNcbiAgICB9LFxuXG4gICAgb25DbGlja0J1dHRvbihidXR0b24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgYnV0dG9uLmluZGV4ICYmXG4gICAgICAgICFidXR0b24uZGlzYWJsZWQgJiZcbiAgICAgICAgYnV0dG9uLmluZGV4ICE9PSB0aGlzLmN1cnJlbnRQYWdlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGJ1dHRvbi5pbmRleFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tcGFnaW5hdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbCB7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICBtYXJnaW46IDAgMC41ZW07XG4gICAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIH1cblxuICAuZGl0by1idXR0b24ge1xuICAgIHRyYW5zaXRpb246XG4gICAgICBhbGwgMC4zcyBlYXNlLFxuICAgICAgY29sb3IgMHMsXG4gICAgICBiYWNrZ3JvdW5kIDBzLFxuICAgICAgYm9yZGVyIDBzO1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgcGFkZGluZzogMCAwLjVlbTtcblxuICAgICYtcHJldixcbiAgICAmLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1hcnJvdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuXG4gICAgJi1lbGxpcHNpcy1wcmV2LFxuICAgICYtZWxsaXBzaXMtbmV4dCB7XG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWVsbGlwc2lzO1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWNoZXZyb25zO1xuICAgICAgfVxuXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcblxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmOmFjdGl2ZSB7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1lbGxpcHNpcy1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zd2l0Y2goXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuICA6c3R5bGU9XCJzdHlsZXNcIlxuKVxuICAuZGl0by1zd2l0Y2gtcGFuZVxuICAgIGlucHV0KFxuICAgICAgOmlkPVwiaWRcIlxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICB2LW1vZGVsPVwiY2hlY2tlZFwiXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgOm5hbWU9XCJuYW1lXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2gtbGFiZWwoXG4gICAgICB2LWlmPVwibGFiZWxzXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwiY2hlY2tlZFwiXG4gICAgICAgIG5hbWU9XCJjaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLmNoZWNrZWQgfHwgJ29uJyB9fVxuICAgICAgc2xvdChcbiAgICAgICAgdi1lbHNlXG4gICAgICAgIG5hbWU9XCJ1bmNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMudW5jaGVja2VkIHx8ICdvZmYnIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxzOiB7IHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbFZhbHVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRoaXMuJGF0dHJzLmNsYXNzLFxuICAgICAgICB7XG4gICAgICAgICAgJ2RpdG8tY2hlY2tlZCc6IHRoaXMuY2hlY2tlZCxcbiAgICAgICAgICAnZGl0by1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICBjb25zdCB7IGxhYmVsczogeyBjaGVja2VkLCB1bmNoZWNrZWQgfSA9IHt9IH0gPSB0aGlzXG4gICAgICAvLyBDYWxjdWxhdGUgYC0tc3dpdGNoLXdpZHRoYCBpbiBgcmVtYCwgYmFzZWQgb24gbGFiZWwgbGVuZ3RoLlxuICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoMCwgY2hlY2tlZD8ubGVuZ3RoLCB1bmNoZWNrZWQ/Lmxlbmd0aClcbiAgICAgIHJldHVybiB7XG4gICAgICAgICctLXN3aXRjaC13aWR0aCc6IGxlbmd0aCA/IGAke2xlbmd0aCAqIDEuNX1yZW1gIDogbnVsbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBjbGFzczogXywgLi4uYXR0cmlidXRlcyB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZShtb2RlbFZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBtb2RlbFZhbHVlXG4gICAgfSxcblxuICAgIGNoZWNrZWQoY2hlY2tlZCkge1xuICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNoZWNrZWQpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGNoZWNrZWQpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc3dpdGNoIHtcbiAgLy8gVXNlIHdob2xlIG11bHRpcGxlcyBvZiBgcmVtYCBmb3Igc2l6ZXMgYW5kIGBweGAgbWFyZ2lucy9wYWRkaW5nIGFsb25nXG4gIC8vIHdpdGggYGNhbGMoKWAgdG8gZW5kIHVwIHdpdGggZXZlbiBwaXhlbCBzaXplcy5cbiAgLS1zd2l0Y2gtd2lkdGg6IDRlbTtcbiAgLS1zd2l0Y2gtaGVpZ2h0OiAyZW07XG4gIC0tc3dpdGNoLW1hcmdpbjogMnB4O1xuICAtLXN3aXRjaC1wYWRkaW5nOiAzcHg7XG4gIC0tc3dpdGNoLXNwZWVkOiAzMDBtcztcbiAgLS1sYWJlbC1tYXJnaW46IDAuNWVtO1xuICAtLXdpZHRoOiBjYWxjKHZhcigtLXN3aXRjaC13aWR0aCkgLSAyICogdmFyKC0tc3dpdGNoLW1hcmdpbikpO1xuICAtLWhlaWdodDogY2FsYyh2YXIoLS1zd2l0Y2gtaGVpZ2h0KSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0tb2Zmc2V0OiBjYWxjKHZhcigtLXdpZHRoKSAtIHZhcigtLWhlaWdodCkpO1xuXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IHZhcigtLXN3aXRjaC1oZWlnaHQpO1xuICAvLyBUbyBtYWtlIGlubGluZSBsYWJlbHMgYXBwZWFyIG9uIGNvbnNpc3RlbnQgYmFzZWxpbmU6XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIC5kaXRvLXN3aXRjaC1wYW5lIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IHZhcigtLXdpZHRoKTtcbiAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCk7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtcGFuZSxcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICB0b3A6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIH1cblxuICBpbnB1dCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHQ7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIGJvcmRlci1jb2xvciAwLjNzLFxuICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgLS1zaXplOiBjYWxjKHZhcigtLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLXBhZGRpbmcpKTtcblxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IHZhcigtLXN3aXRjaC1wYWRkaW5nKTtcbiAgICBsZWZ0OiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgd2lkdGg6IHZhcigtLXNpemUpO1xuICAgIGhlaWdodDogdmFyKC0tc2l6ZSk7XG4gICAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1zaXplKSAvIDIpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1zd2l0Y2gtc3BlZWQpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1idXR0b24sXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAmLmRpdG8tY2hlY2tlZCB7XG4gICAgaW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1vZmZzZXQpKTtcbiAgICB9XG5cbiAgICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgICAgbGVmdDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICAgIHJpZ2h0OiB1bnNldDtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tZGlzYWJsZWQge1xuICAgIEBleHRlbmQgJWJ1dHRvbi1kaXNhYmxlZDtcbiAgfVxuXG4gICY6Zm9jdXMtd2l0aGluOm5vdCg6aG92ZXIpIHtcbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAgIGJveC1zaGFkb3c6ICRzaGFkb3ctZm9jdXM7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdD5cbmltcG9ydCB7IGggYXMgY3JlYXRlRWxlbWVudCwgVHJhbnNpdGlvbiB9IGZyb20gJ3Z1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmZ1bmN0aW9uIFRyYW5zaXRpb25IZWlnaHQoeyBlbmFibGVkIH0sIHsgc2xvdHMgfSkge1xuICByZXR1cm4gZW5hYmxlZFxuICAgID8gY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCBwcm9wcywgc2xvdHMpXG4gICAgOiBzbG90cy5kZWZhdWx0KClcbn1cblxuVHJhbnNpdGlvbkhlaWdodC5wcm9wcyA9IHtcbiAgZW5hYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbkhlaWdodFxuXG5jb25zdCBzZXRTdHlsZSA9IChlbGVtZW50LCBzdHlsZSkgPT4gT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSlcblxuY29uc3QgbmV4dFRpbWVvdXQgPSBjYWxsYmFjayA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKVxuXG4vLyBGb3JjZSByZXBhaW50IHRvIG1ha2Ugc3VyZSB0aGUgYW5pbWF0aW9uIGlzIHRyaWdnZXJlZCBjb3JyZWN0bHkuXG5jb25zdCBmb3JjZVJlcGFpbnQgPSBlbGVtZW50ID0+IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0XG5cbmNvbnN0IHByb3BzID0ge1xuICBuYW1lOiAnZGl0by1oZWlnaHQnLFxuXG4gIG9uQWZ0ZXJFbnRlcihlbGVtZW50KSB7XG4gICAgLy8gQSB0aW1lb3V0IGJlZm9yZSBzZXR0aW5nIHN0eWxlIGlzIG9ubHkgcmVhbGx5IG5lZWRlZCBhZnRlciBjYWxscyB0b1xuICAgIC8vIGBmb3JjZVJlcGFpbnQoKWAsIGJ1dCB1c2luZyBvbmUgaGVyZSB0b28gcHJlc2VydmVzIGV4ZWN1dGlvbiBzZXF1ZW5jZSBzb1xuICAgIC8vIHRoYXQgdGhlIGNhbGwgZnJvbSBgZW50ZXIoKWAgY2FuIG5ldmVyIG91dHJ1biB0aGUgb25lIGZyb20gYGFmdGVyRW50ZXIoKWBcbiAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogbnVsbCB9KSlcbiAgfSxcblxuICBvbkVudGVyKGVsZW1lbnQpIHtcbiAgICAvLyBGb3Igc29tZSByZWFzb24gd2UncmUgZ2V0dGluZyB0d28gYG9uRW50ZXIoKWAgY2FsbHMgcGVyIHRyYW5zaXRpb24sXG4gICAgLy8gc28gd2UgbmVlZCB0byBpZ25vcmUgdGhlIHNlY29uZCBvbmUuIFRoaXMgbWlnaHQgYmUgbGlua2VkIHRvIHRoZSB1c2VcbiAgICAvLyBvZiBgbmV4dFRpbWVvdXQoKWAsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZSBmb3JcbiAgICAvLyBgaGVpZ2h0YCwgYmFzZWQgb24gYCYtLWxhYmVsLXZlcnRpY2FsYCBjYWxjdWxhdGlvbnMuXG4gICAgY29uc3QgeyB3aWR0aCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHtcbiAgICAgIHdpZHRoLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgIGhlaWdodDogJ2F1dG8nXG4gICAgfSlcbiAgICBuZXh0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgICAgc2V0U3R5bGUoZWxlbWVudCwge1xuICAgICAgICB3aWR0aDogbnVsbCxcbiAgICAgICAgcG9zaXRpb246IG51bGwsXG4gICAgICAgIHZpc2liaWxpdHk6IG51bGwsXG4gICAgICAgIGhlaWdodDogMFxuICAgICAgfSlcbiAgICAgIGZvcmNlUmVwYWludChlbGVtZW50KVxuICAgICAgbmV4dFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQgfSkpXG4gICAgfSlcbiAgfSxcblxuICBvbkxlYXZlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQ6IDAgfSkpXG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbiRkdXJhdGlvbjogMC4xNXM7XG5cbi5kaXRvLWhlaWdodC1lbnRlci1hY3RpdmUsXG4uZGl0by1oZWlnaHQtbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNpdGlvbjogaGVpZ2h0ICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLWhlaWdodC1lbnRlci1hY3RpdmUge1xuICBhbmltYXRpb246IGRpdG8tc2xpZGUtZW50ZXIgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmRpdG8taGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogZGl0by1zbGlkZS1sZWF2ZSAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xufVxuXG4uZGl0by1oZWlnaHQtZW50ZXItZnJvbSxcbi5kaXRvLWhlaWdodC1sZWF2ZS10byB7XG4gIGhlaWdodDogMDtcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyB1c2VTbG90cywgQ29tbWVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZOb2RlQ29udGVudCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUgJiYgYXNBcnJheSh2bm9kZSkuc29tZSh2bm9kZSA9PiB2bm9kZS50eXBlICE9PSBDb21tZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzU2xvdENvbnRlbnQoc2xvdCwgcHJvcHMgPSB7fSkge1xuICBzbG90ID0gaXNTdHJpbmcoc2xvdCkgPyB1c2VTbG90cygpW3Nsb3RdIDogc2xvdFxuICByZXR1cm4gaGFzVk5vZGVDb250ZW50KHNsb3Q/Lihwcm9wcykpXG59XG4iXSwibmFtZXMiOlsiZGVzY3JpYmVEYXRlIiwiZGF0ZSIsImFsdGVyRGF0ZSIsIm92ZXJyaWRlcyIsInBhcnNlRGF0ZSIsInN0cmluZyIsImxvY2FsZSIsInRpbWUiLCJ0aW1lRGVmYXVsdCIsImRheSIsInNlcDEiLCJtb250aCIsInNlcDIiLCJ5ZWFyIiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIiwiZ2V0RGF0ZVBhcnRzIiwiZ2V0TW9udGhJbmRleCIsImlzVmFsaWRUaW1lUGFydCIsInBhcnQiLCJnZXREYXRlUGFydEF0UG9zaXRpb24iLCJwb3NpdGlvbiIsInBhcnRzIiwiZ2V0UG9zaXRpb24iLCJsZW5ndGgiLCJwb3MiLCJpbmRleCIsIl9hIiwib2Zmc2V0IiwiaXNVUyIsInZhbHVlcyIsInN0YXJ0IiwiZW5kIiwidmFsdWUiLCJtYXRjaCIsInNob3J0Rm9ybWF0IiwibG9uZ0Zvcm1hdCIsImkiLCJ3YXJuIiwibXNnIiwiYXJncyIsImFjdGl2ZUVmZmVjdFNjb3BlIiwicmVjb3JkRWZmZWN0U2NvcGUiLCJlZmZlY3QiLCJzY29wZSIsImdldEN1cnJlbnRTY29wZSIsImNyZWF0ZURlcCIsImVmZmVjdHMiLCJkZXAiLCJ3YXNUcmFja2VkIiwidHJhY2tPcEJpdCIsIm5ld1RyYWNrZWQiLCJpbml0RGVwTWFya2VycyIsImRlcHMiLCJmaW5hbGl6ZURlcE1hcmtlcnMiLCJwdHIiLCJ0YXJnZXRNYXAiLCJlZmZlY3RUcmFja0RlcHRoIiwibWF4TWFya2VyQml0cyIsImFjdGl2ZUVmZmVjdCIsIklURVJBVEVfS0VZIiwiTUFQX0tFWV9JVEVSQVRFX0tFWSIsIlJlYWN0aXZlRWZmZWN0IiwiZm4iLCJzY2hlZHVsZXIiLCJwYXJlbnQiLCJsYXN0U2hvdWxkVHJhY2siLCJzaG91bGRUcmFjayIsImNsZWFudXBFZmZlY3QiLCJlZmZlY3QyIiwidHJhY2tTdGFjayIsInBhdXNlVHJhY2tpbmciLCJyZXNldFRyYWNraW5nIiwibGFzdCIsInRyYWNrIiwidGFyZ2V0IiwidHlwZSIsImtleSIsImRlcHNNYXAiLCJldmVudEluZm8iLCJ0cmFja0VmZmVjdHMiLCJkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvIiwic2hvdWxkVHJhY2syIiwiZXh0ZW5kIiwidHJpZ2dlciIsIm5ld1ZhbHVlIiwib2xkVmFsdWUiLCJvbGRUYXJnZXQiLCJpc0FycmF5IiwibmV3TGVuZ3RoIiwia2V5MiIsImlzU3ltYm9sIiwiaXNJbnRlZ2VyS2V5IiwiaXNNYXAiLCJ0cmlnZ2VyRWZmZWN0cyIsInRyaWdnZXJFZmZlY3QiLCJpc05vblRyYWNrYWJsZUtleXMiLCJtYWtlTWFwIiwiYnVpbHRJblN5bWJvbHMiLCJhcnJheUluc3RydW1lbnRhdGlvbnMiLCJjcmVhdGVBcnJheUluc3RydW1lbnRhdGlvbnMiLCJpbnN0cnVtZW50YXRpb25zIiwiYXJyIiwidG9SYXciLCJsIiwicmVzIiwiaGFzT3duUHJvcGVydHkiLCJvYmoiLCJCYXNlUmVhY3RpdmVIYW5kbGVyIiwiX2lzUmVhZG9ubHkiLCJfc2hhbGxvdyIsInJlY2VpdmVyIiwiaXNSZWFkb25seTIiLCJzaGFsbG93Iiwic2hhbGxvd1JlYWRvbmx5TWFwIiwicmVhZG9ubHlNYXAiLCJzaGFsbG93UmVhY3RpdmVNYXAiLCJyZWFjdGl2ZU1hcCIsInRhcmdldElzQXJyYXkiLCJoYXNPd24iLCJpc1JlZiIsImlzT2JqZWN0IiwicmVhZG9ubHkiLCJyZWFjdGl2ZSIsIk11dGFibGVSZWFjdGl2ZUhhbmRsZXIiLCJpc1JlYWRvbmx5IiwiaXNTaGFsbG93IiwiaGFkS2V5IiwicmVzdWx0IiwiaGFzQ2hhbmdlZCIsIlJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyIiwibXV0YWJsZUhhbmRsZXJzIiwicmVhZG9ubHlIYW5kbGVycyIsInNoYWxsb3dSZWFkb25seUhhbmRsZXJzIiwidG9TaGFsbG93IiwiZ2V0UHJvdG8iLCJ2IiwiZ2V0IiwicmF3VGFyZ2V0IiwicmF3S2V5IiwiaGFzMiIsIndyYXAiLCJ0b1JlYWRvbmx5IiwidG9SZWFjdGl2ZSIsImhhcyIsInNpemUiLCJhZGQiLCJzZXQiLCJnZXQyIiwiY2hlY2tJZGVudGl0eUtleXMiLCJkZWxldGVFbnRyeSIsImNsZWFyIiwiaGFkSXRlbXMiLCJjcmVhdGVGb3JFYWNoIiwiY2FsbGJhY2siLCJ0aGlzQXJnIiwib2JzZXJ2ZWQiLCJjcmVhdGVJdGVyYWJsZU1ldGhvZCIsIm1ldGhvZCIsInRhcmdldElzTWFwIiwiaXNQYWlyIiwiaXNLZXlPbmx5IiwiaW5uZXJJdGVyYXRvciIsImRvbmUiLCJjcmVhdGVSZWFkb25seU1ldGhvZCIsImNhcGl0YWxpemUiLCJjcmVhdGVJbnN0cnVtZW50YXRpb25zIiwibXV0YWJsZUluc3RydW1lbnRhdGlvbnMyIiwic2hhbGxvd0luc3RydW1lbnRhdGlvbnMyIiwicmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiIsInNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMyIiwibXV0YWJsZUluc3RydW1lbnRhdGlvbnMiLCJyZWFkb25seUluc3RydW1lbnRhdGlvbnMiLCJzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyIsInNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMiLCJjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIiLCJtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzIiwicmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJ0b1Jhd1R5cGUiLCJ0YXJnZXRUeXBlTWFwIiwicmF3VHlwZSIsImdldFRhcmdldFR5cGUiLCJjcmVhdGVSZWFjdGl2ZU9iamVjdCIsInNoYWxsb3dSZWFkb25seSIsImJhc2VIYW5kbGVycyIsImNvbGxlY3Rpb25IYW5kbGVycyIsInByb3h5TWFwIiwiZXhpc3RpbmdQcm94eSIsInRhcmdldFR5cGUiLCJwcm94eSIsImlzUmVhY3RpdmUiLCJpc1Byb3h5IiwicmF3IiwibWFya1JhdyIsImRlZiIsInIiLCJ1bnJlZiIsInJlZjIiLCJzaGFsbG93VW53cmFwSGFuZGxlcnMiLCJwcm94eVJlZnMiLCJvYmplY3RXaXRoUmVmcyIsInN0YWNrIiwicHVzaFdhcm5pbmdDb250ZXh0Iiwidm5vZGUiLCJwb3BXYXJuaW5nQ29udGV4dCIsImluc3RhbmNlIiwiYXBwV2FybkhhbmRsZXIiLCJ0cmFjZSIsImdldENvbXBvbmVudFRyYWNlIiwiY2FsbFdpdGhFcnJvckhhbmRsaW5nIiwiZm9ybWF0Q29tcG9uZW50TmFtZSIsIndhcm5BcmdzIiwiZm9ybWF0VHJhY2UiLCJjdXJyZW50Vk5vZGUiLCJub3JtYWxpemVkU3RhY2siLCJwYXJlbnRJbnN0YW5jZSIsImxvZ3MiLCJlbnRyeSIsImZvcm1hdFRyYWNlRW50cnkiLCJyZWN1cnNlQ291bnQiLCJwb3N0Zml4IiwiaXNSb290Iiwib3BlbiIsImNsb3NlIiwiZm9ybWF0UHJvcHMiLCJwcm9wcyIsImtleXMiLCJmb3JtYXRQcm9wIiwiaXNTdHJpbmciLCJpc0Z1bmN0aW9uIiwiYXNzZXJ0TnVtYmVyIiwidmFsIiwiRXJyb3JUeXBlU3RyaW5ncyIsImVyciIsImhhbmRsZUVycm9yIiwiY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmciLCJpc1Byb21pc2UiLCJ0aHJvd0luRGV2IiwiY29udGV4dFZOb2RlIiwiY3VyIiwiZXhwb3NlZEluc3RhbmNlIiwiZXJyb3JJbmZvIiwiZXJyb3JDYXB0dXJlZEhvb2tzIiwiYXBwRXJyb3JIYW5kbGVyIiwibG9nRXJyb3IiLCJpbmZvIiwiaXNGbHVzaGluZyIsImlzRmx1c2hQZW5kaW5nIiwicXVldWUiLCJmbHVzaEluZGV4IiwicGVuZGluZ1Bvc3RGbHVzaENicyIsImFjdGl2ZVBvc3RGbHVzaENicyIsInBvc3RGbHVzaEluZGV4IiwicmVzb2x2ZWRQcm9taXNlIiwiY3VycmVudEZsdXNoUHJvbWlzZSIsIlJFQ1VSU0lPTl9MSU1JVCIsIm5leHRUaWNrIiwicCIsImZpbmRJbnNlcnRpb25JbmRleCIsImlkIiwibWlkZGxlIiwibWlkZGxlSm9iIiwibWlkZGxlSm9iSWQiLCJnZXRJZCIsInF1ZXVlSm9iIiwiam9iIiwicXVldWVGbHVzaCIsImZsdXNoSm9icyIsInF1ZXVlUG9zdEZsdXNoQ2IiLCJjYiIsImZsdXNoUG9zdEZsdXNoQ2JzIiwic2VlbiIsImRlZHVwZWQiLCJhIiwiYiIsImNoZWNrUmVjdXJzaXZlVXBkYXRlcyIsImNvbXBhcmF0b3IiLCJkaWZmIiwiY2hlY2siLCJOT09QIiwiY291bnQiLCJjb21wb25lbnROYW1lIiwiZ2V0Q29tcG9uZW50TmFtZSIsImhtckRpcnR5Q29tcG9uZW50cyIsImdldEdsb2JhbFRoaXMiLCJ0cnlXcmFwIiwiY3JlYXRlUmVjb3JkIiwicmVyZW5kZXIiLCJyZWxvYWQiLCJtYXAiLCJpbml0aWFsRGVmIiwibm9ybWFsaXplQ2xhc3NDb21wb25lbnQiLCJjb21wb25lbnQiLCJpc0NsYXNzQ29tcG9uZW50IiwibmV3UmVuZGVyIiwicmVjb3JkIiwibmV3Q29tcCIsInVwZGF0ZUNvbXBvbmVudERlZiIsImluc3RhbmNlcyIsIm9sZENvbXAiLCJhcmciLCJlIiwiZW1pdCQxIiwiZXZlbnQiLCJkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQiLCJjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2siLCJob29rIiwiY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIiwiY3VycmVudFNjb3BlSWQiLCJzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UiLCJwcmV2Iiwid2l0aEN0eCIsImN0eCIsImlzTm9uU2NvcGVkU2xvdCIsInJlbmRlckZuV2l0aENvbnRleHQiLCJzZXRCbG9ja1RyYWNraW5nIiwicHJldkluc3RhbmNlIiwibWFya0F0dHJzQWNjZXNzZWQiLCJDT01QT05FTlRTIiwicmVzb2x2ZUNvbXBvbmVudCIsIm5hbWUiLCJtYXliZVNlbGZSZWZlcmVuY2UiLCJyZXNvbHZlQXNzZXQiLCJOVUxMX0RZTkFNSUNfQ09NUE9ORU5UIiwid2Fybk1pc3NpbmciLCJjdXJyZW50SW5zdGFuY2UiLCJDb21wb25lbnQiLCJzZWxmTmFtZSIsImNhbWVsaXplIiwicmVzb2x2ZSIsImV4dHJhIiwicmVnaXN0cnkiLCJpc1N1c3BlbnNlIiwicXVldWVFZmZlY3RXaXRoU3VzcGVuc2UiLCJzdXNwZW5zZSIsIklOSVRJQUxfV0FUQ0hFUl9WQUxVRSIsImRvV2F0Y2giLCJzb3VyY2UiLCJpbW1lZGlhdGUiLCJkZWVwIiwiZmx1c2giLCJvblRyYWNrIiwib25UcmlnZ2VyIiwiRU1QVFlfT0JKIiwid2FybkludmFsaWRTb3VyY2UiLCJzIiwiZ2V0dGVyIiwiZm9yY2VUcmlnZ2VyIiwiaXNNdWx0aVNvdXJjZSIsImlzU2hhbGxvdyQxIiwidHJhdmVyc2UiLCJjbGVhbnVwIiwib25DbGVhbnVwIiwiYmFzZUdldHRlciIsInF1ZXVlUG9zdFJlbmRlckVmZmVjdCIsInJlbW92ZSIsImluc3RhbmNlV2F0Y2giLCJvcHRpb25zIiwicHVibGljVGhpcyIsImNyZWF0ZVBhdGhHZXR0ZXIiLCJzZXRDdXJyZW50SW5zdGFuY2UiLCJ1bnNldEN1cnJlbnRJbnN0YW5jZSIsInBhdGgiLCJzZWdtZW50cyIsImlzU2V0IiwiaXNQbGFpbk9iamVjdCIsIndpdGhEaXJlY3RpdmVzIiwiZGlyZWN0aXZlcyIsImludGVybmFsSW5zdGFuY2UiLCJnZXRFeHBvc2VQcm94eSIsImJpbmRpbmdzIiwiZGlyIiwibW9kaWZpZXJzIiwibGVhdmVDYktleSIsImVudGVyQ2JLZXkiLCJ1c2VUcmFuc2l0aW9uU3RhdGUiLCJzdGF0ZSIsIm9uTW91bnRlZCIsIm9uQmVmb3JlVW5tb3VudCIsIlRyYW5zaXRpb25Ib29rVmFsaWRhdG9yIiwiQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMiLCJCYXNlVHJhbnNpdGlvbiIsInNsb3RzIiwiZ2V0Q3VycmVudEluc3RhbmNlIiwicHJldlRyYW5zaXRpb25LZXkiLCJjaGlsZHJlbiIsImdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiIsImNoaWxkIiwiaGFzRm91bmQiLCJjIiwiQ29tbWVudCIsInJhd1Byb3BzIiwibW9kZSIsImVtcHR5UGxhY2Vob2xkZXIiLCJpbm5lckNoaWxkIiwiZ2V0S2VlcEFsaXZlQ2hpbGQiLCJlbnRlckhvb2tzIiwicmVzb2x2ZVRyYW5zaXRpb25Ib29rcyIsInNldFRyYW5zaXRpb25Ib29rcyIsIm9sZENoaWxkIiwib2xkSW5uZXJDaGlsZCIsInRyYW5zaXRpb25LZXlDaGFuZ2VkIiwiZ2V0VHJhbnNpdGlvbktleSIsImlzU2FtZVZOb2RlVHlwZSIsImxlYXZpbmdIb29rcyIsImVsIiwiZWFybHlSZW1vdmUiLCJkZWxheWVkTGVhdmUiLCJsZWF2aW5nVk5vZGVzQ2FjaGUiLCJnZXRMZWF2aW5nTm9kZXNGb3JUeXBlIiwibGVhdmluZ1ZOb2RlcyIsImFwcGVhciIsInBlcnNpc3RlZCIsIm9uQmVmb3JlRW50ZXIiLCJvbkVudGVyIiwib25BZnRlckVudGVyIiwib25FbnRlckNhbmNlbGxlZCIsIm9uQmVmb3JlTGVhdmUiLCJvbkxlYXZlIiwib25BZnRlckxlYXZlIiwib25MZWF2ZUNhbmNlbGxlZCIsIm9uQmVmb3JlQXBwZWFyIiwib25BcHBlYXIiLCJvbkFmdGVyQXBwZWFyIiwib25BcHBlYXJDYW5jZWxsZWQiLCJjYWxsSG9vayIsImNhbGxBc3luY0hvb2siLCJob29rMiIsImhvb2tzIiwibGVhdmluZ1ZOb2RlIiwiYWZ0ZXJIb29rIiwiY2FuY2VsSG9vayIsImNhbGxlZCIsImNhbmNlbGxlZCIsInZub2RlMiIsImlzS2VlcEFsaXZlIiwiY2xvbmVWTm9kZSIsImtlZXBDb21tZW50IiwicGFyZW50S2V5IiwicmV0Iiwia2V5ZWRGcmFnbWVudENvdW50IiwiRnJhZ21lbnQiLCJpc0FzeW5jV3JhcHBlciIsImluamVjdEhvb2siLCJwcmVwZW5kIiwid3JhcHBlZEhvb2siLCJhcGlOYW1lIiwidG9IYW5kbGVyS2V5IiwiY3JlYXRlSG9vayIsImxpZmVjeWNsZSIsInJlbmRlckxpc3QiLCJyZW5kZXJJdGVtIiwiY2FjaGUiLCJjYWNoZWQiLCJpdGVtIiwicmVuZGVyU2xvdCIsImZhbGxiYWNrIiwibm9TbG90dGVkIiwiY3JlYXRlVk5vZGUiLCJzbG90Iiwib3BlbkJsb2NrIiwidmFsaWRTbG90Q29udGVudCIsImVuc3VyZVZhbGlkVk5vZGUiLCJyZW5kZXJlZCIsImNyZWF0ZUJsb2NrIiwidm5vZGVzIiwiaXNWTm9kZSIsImdldFB1YmxpY0luc3RhbmNlIiwiaXNTdGF0ZWZ1bENvbXBvbmVudCIsInB1YmxpY1Byb3BlcnRpZXNNYXAiLCJyZXNvbHZlTWVyZ2VkT3B0aW9ucyIsImlzUmVzZXJ2ZWRQcmVmaXgiLCJoYXNTZXR1cEJpbmRpbmciLCJQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMiLCJzZXR1cFN0YXRlIiwiZGF0YSIsImFjY2Vzc0NhY2hlIiwiYXBwQ29udGV4dCIsIm5vcm1hbGl6ZWRQcm9wcyIsIm4iLCJwdWJsaWNHZXR0ZXIiLCJjc3NNb2R1bGUiLCJnbG9iYWxQcm9wZXJ0aWVzIiwicHJvcHNPcHRpb25zIiwiZGVzY3JpcHRvciIsInVzZVNsb3RzIiwiZ2V0Q29udGV4dCIsImNyZWF0ZVNldHVwQ29udGV4dCIsIm5vcm1hbGl6ZVByb3BzT3JFbWl0cyIsIm5vcm1hbGl6ZWQiLCJiYXNlIiwibWl4aW5zIiwiZXh0ZW5kc09wdGlvbnMiLCJnbG9iYWxNaXhpbnMiLCJvcHRpb25NZXJnZVN0cmF0ZWdpZXMiLCJyZXNvbHZlZCIsIm0iLCJtZXJnZU9wdGlvbnMiLCJ0byIsImZyb20iLCJzdHJhdHMiLCJhc01peGluIiwic3RyYXQiLCJpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzIiwibWVyZ2VEYXRhRm4iLCJtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMiLCJtZXJnZU9iamVjdE9wdGlvbnMiLCJtZXJnZUFzQXJyYXkiLCJtZXJnZVdhdGNoT3B0aW9ucyIsIm1lcmdlSW5qZWN0Iiwibm9ybWFsaXplSW5qZWN0IiwibWVyZ2VkIiwiaXNUZWxlcG9ydCIsIlRleHQiLCJibG9ja1N0YWNrIiwiY3VycmVudEJsb2NrIiwiZGlzYWJsZVRyYWNraW5nIiwiY2xvc2VCbG9jayIsImlzQmxvY2tUcmVlRW5hYmxlZCIsInNldHVwQmxvY2siLCJFTVBUWV9BUlIiLCJjcmVhdGVFbGVtZW50QmxvY2siLCJwYXRjaEZsYWciLCJkeW5hbWljUHJvcHMiLCJzaGFwZUZsYWciLCJjcmVhdGVCYXNlVk5vZGUiLCJuMSIsIm4yIiwiY3JlYXRlVk5vZGVXaXRoQXJnc1RyYW5zZm9ybSIsIl9jcmVhdGVWTm9kZSIsIkludGVybmFsT2JqZWN0S2V5Iiwibm9ybWFsaXplS2V5Iiwibm9ybWFsaXplUmVmIiwicmVmIiwicmVmX2tleSIsInJlZl9mb3IiLCJpc0Jsb2NrTm9kZSIsIm5lZWRGdWxsQ2hpbGRyZW5Ob3JtYWxpemF0aW9uIiwibm9ybWFsaXplQ2hpbGRyZW4iLCJjbG9uZWQiLCJndWFyZFJlYWN0aXZlUHJvcHMiLCJrbGFzcyIsInN0eWxlIiwibm9ybWFsaXplQ2xhc3MiLCJub3JtYWxpemVTdHlsZSIsImV4dHJhUHJvcHMiLCJtZXJnZVJlZiIsIm1lcmdlZFByb3BzIiwibWVyZ2VQcm9wcyIsImRlZXBDbG9uZVZOb2RlIiwiY3JlYXRlVGV4dFZOb2RlIiwidGV4dCIsImZsYWciLCJjcmVhdGVDb21tZW50Vk5vZGUiLCJhc0Jsb2NrIiwic2xvdEZsYWciLCJ0b01lcmdlIiwiaXNPbiIsImV4aXN0aW5nIiwiaW5jb21pbmciLCJpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZSIsImdsb2JhbEN1cnJlbnRJbnN0YW5jZVNldHRlcnMiLCJzZXR0ZXJzS2V5IiwiZ2V0QXR0cnNQcm94eSIsImdldFNsb3RzUHJveHkiLCJleHBvc2UiLCJleHBvc2VkIiwiZXhwb3NlZFR5cGUiLCJjbGFzc2lmeVJFIiwiY2xhc3NpZnkiLCJzdHIiLCJpbmNsdWRlSW5mZXJyZWQiLCJpbmZlckZyb21SZWdpc3RyeSIsImgiLCJwcm9wc09yQ2hpbGRyZW4iLCJpbml0Q3VzdG9tRm9ybWF0dGVyIiwidnVlU3R5bGUiLCJudW1iZXJTdHlsZSIsInN0cmluZ1N0eWxlIiwia2V5d29yZFN0eWxlIiwiZm9ybWF0dGVyIiwiZ2VuUmVmRmxhZyIsImZvcm1hdFZhbHVlIiwiZm9ybWF0SW5zdGFuY2UiLCJibG9ja3MiLCJjcmVhdGVJbnN0YW5jZUJsb2NrIiwiY29tcHV0ZWQiLCJleHRyYWN0S2V5cyIsImluamVjdGVkIiwiYXNSYXciLCJDb21wIiwiZXh0cmFjdGVkIiwiaXNLZXlPZlR5cGUiLCJvcHRzIiwiVFJBTlNJVElPTiIsIkFOSU1BVElPTiIsInZ0Y0tleSIsIlRyYW5zaXRpb24iLCJyZXNvbHZlVHJhbnNpdGlvblByb3BzIiwiRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyIsImgyIiwiaGFzRXhwbGljaXRDYWxsYmFjayIsImJhc2VQcm9wcyIsImR1cmF0aW9uIiwiZW50ZXJGcm9tQ2xhc3MiLCJlbnRlckFjdGl2ZUNsYXNzIiwiZW50ZXJUb0NsYXNzIiwiYXBwZWFyRnJvbUNsYXNzIiwiYXBwZWFyQWN0aXZlQ2xhc3MiLCJhcHBlYXJUb0NsYXNzIiwibGVhdmVGcm9tQ2xhc3MiLCJsZWF2ZUFjdGl2ZUNsYXNzIiwibGVhdmVUb0NsYXNzIiwiZHVyYXRpb25zIiwibm9ybWFsaXplRHVyYXRpb24iLCJlbnRlckR1cmF0aW9uIiwibGVhdmVEdXJhdGlvbiIsImZpbmlzaEVudGVyIiwiaXNBcHBlYXIiLCJyZW1vdmVUcmFuc2l0aW9uQ2xhc3MiLCJmaW5pc2hMZWF2ZSIsIm1ha2VFbnRlckhvb2siLCJuZXh0RnJhbWUiLCJhZGRUcmFuc2l0aW9uQ2xhc3MiLCJ3aGVuVHJhbnNpdGlvbkVuZHMiLCJmb3JjZVJlZmxvdyIsIk51bWJlck9mIiwidG9OdW1iZXIiLCJjbHMiLCJfdnRjIiwiZW5kSWQiLCJleHBlY3RlZFR5cGUiLCJleHBsaWNpdFRpbWVvdXQiLCJyZXNvbHZlSWZOb3RTdGFsZSIsInRpbWVvdXQiLCJwcm9wQ291bnQiLCJnZXRUcmFuc2l0aW9uSW5mbyIsImVuZEV2ZW50IiwiZW5kZWQiLCJvbkVuZCIsInN0eWxlcyIsImdldFN0eWxlUHJvcGVydGllcyIsInRyYW5zaXRpb25EZWxheXMiLCJ0cmFuc2l0aW9uRHVyYXRpb25zIiwidHJhbnNpdGlvblRpbWVvdXQiLCJnZXRUaW1lb3V0IiwiYW5pbWF0aW9uRGVsYXlzIiwiYW5pbWF0aW9uRHVyYXRpb25zIiwiYW5pbWF0aW9uVGltZW91dCIsImhhc1RyYW5zZm9ybSIsImRlbGF5cyIsImQiLCJ0b01zIiwidlNob3dPbGRLZXkiLCJ2U2hvdyIsInRyYW5zaXRpb24iLCJzZXREaXNwbGF5IiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZXIiLCJnZXRNb2RlbEFzc2lnbmVyIiwiaW52b2tlQXJyYXlGbnMiLCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJvbkNvbXBvc2l0aW9uRW5kIiwiYXNzaWduS2V5Iiwidk1vZGVsVGV4dCIsImxhenkiLCJ0cmltIiwibnVtYmVyIiwiY2FzdFRvTnVtYmVyIiwiZG9tVmFsdWUiLCJsb29zZVRvTnVtYmVyIiwiZWxWYWx1ZSIsInZNb2RlbENoZWNrYm94IiwiXyIsIm1vZGVsVmFsdWUiLCJlbGVtZW50VmFsdWUiLCJnZXRWYWx1ZSIsImNoZWNrZWQiLCJhc3NpZ24iLCJsb29zZUluZGV4T2YiLCJmb3VuZCIsImZpbHRlcmVkIiwiZ2V0Q2hlY2tib3hWYWx1ZSIsInNldENoZWNrZWQiLCJiaW5kaW5nIiwibG9vc2VFcXVhbCIsInZNb2RlbFJhZGlvIiwidk1vZGVsU2VsZWN0IiwiaXNTZXRNb2RlbCIsInNlbGVjdGVkVmFsIiwibyIsInNldFNlbGVjdGVkIiwiX2JpbmRpbmciLCJpc011bHRpcGxlIiwib3B0aW9uIiwib3B0aW9uVmFsdWUiLCJ2TW9kZWxEeW5hbWljIiwiY2FsbE1vZGVsSG9vayIsInByZXZWTm9kZSIsInJlc29sdmVEeW5hbWljTW9kZWwiLCJ0YWdOYW1lIiwic3lzdGVtTW9kaWZpZXJzIiwibW9kaWZpZXJHdWFyZHMiLCJ3aXRoTW9kaWZpZXJzIiwiZ3VhcmQiLCJpbml0RGV2IiwiX3NmY19tYWluIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsImdldExvY2FsZU5hbWVzIiwidXBkYXRlIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsImVudGVyIiwic3RhcnRZZWFyIiwiZmlyc3REYXlXZWVrIiwibnVtRGF5cyIsInByZXZNb250aCIsInByZXZNb250aE51bURheXMiLCJub3ciLCJpc0RheSIsIm5leHRNb250aE5lZWQiLCJuZXh0TW9udGgiLCJsb2NhbGVOYW1lcyIsIm5hbWVzIiwiYWRkRXZlbnRzIiwidGFyZ2V0cyIsImV2ZW50cyIsImFzQXJyYXkiLCJjb21iaW5lRXZlbnRzIiwiZ2V0S2V5IiwiZ2V0S2V5TmF2aWdhdGlvbiIsImdldFRhcmdldCIsImNsYXNzZXMiLCJoeXBoZW5hdGUiLCJzaG93IiwicG9wdXAiLCJfYiIsIl9jIiwiYm91bmRzIiwidHJpZ2dlckxlZnQiLCJ0cmlnZ2VyVG9wIiwidHJpZ2dlcldpZHRoIiwidHJpZ2dlckhlaWdodCIsInBvcHVwV2lkdGgiLCJwb3B1cEhlaWdodCIsInBhcnQxIiwicGFydDIiLCJ3aW5XaWR0aCIsIndpbkhlaWdodCIsImxlZnQiLCJ0b3AiLCJ0cmlnZ2VyQm91bmRzIiwiaW5wdXQiLCJhdHRyaWJ1dGVzIiwibWluIiwibWF4IiwiZ2V0TGVuZ3RoIiwiX29wZW5CbG9jayIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJzZXRTZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb24iLCJUcmlnZ2VyIiwiQ2FsZW5kYXIiLCJJbnB1dEZpZWxkIiwiSWNvbiIsImRlZmF1bHRGb3JtYXRzIiwiZm9ybWF0IiwiZm9jdXMiLCJnZXREYXRlUGFydCIsImNhbGVuZGFyIiwidG9nZ2xlIiwic2VsZWN0aW9uIiwic21vb3RoIiwic2Nyb2xsIiwibGluZUhlaWdodCIsImRpc3RhbmNlIiwiaXNEaWdpdCIsImNoYXIiLCJEYXRlUGlja2VyIiwiVGltZVBpY2tlciIsImRpc2FibGVkIiwiYXNzaWduRGVlcGx5Iiwic2hvd1ByZXYiLCJzaG93TmV4dCIsImN1cnJlbnRQYWdlIiwibnVtUGFnZXMiLCJzaG93TGVuZ3RoIiwiYnV0dG9ucyIsInBhZ2UiLCJidXR0b24iLCJ1bmNoZWNrZWQiLCJUcmFuc2l0aW9uSGVpZ2h0IiwiZW5hYmxlZCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRTdHlsZSIsImVsZW1lbnQiLCJuZXh0VGltZW91dCIsImZvcmNlUmVwYWludCIsIndpZHRoIiwiaGVpZ2h0IiwiaGFzVk5vZGVDb250ZW50IiwiaGFzU2xvdENvbnRlbnQiXSwibWFwcGluZ3MiOiJ3VkFBTyxTQUFTQSxHQUFhQyxFQUFNLENBQ2pDLE1BQU8sQ0FDTCxNQUFNQSxHQUFBLFlBQUFBLEVBQU0sZ0JBQWlCLEVBQzdCLE9BQU9BLEdBQUEsWUFBQUEsRUFBTSxhQUFjLEVBQzNCLEtBQUtBLEdBQUEsWUFBQUEsRUFBTSxZQUFhLEVBQ3hCLE1BQU1BLEdBQUEsWUFBQUEsRUFBTSxhQUFjLEVBQzFCLFFBQVFBLEdBQUEsWUFBQUEsRUFBTSxlQUFnQixFQUM5QixRQUFRQSxHQUFBLFlBQUFBLEVBQU0sZUFBZ0IsRUFDOUIsYUFBYUEsR0FBQSxZQUFBQSxFQUFNLG9CQUFxQixDQUN6QyxDQUNILENBRU8sU0FBU0MsR0FBVUQsRUFBTUUsRUFBWSxHQUFJLENBQzlDLE9BQU8sSUFBSSxLQUFLLEdBQUcsT0FBTyxPQUFPLENBQUUsR0FBR0gsR0FBYUMsQ0FBSSxFQUFHLEdBQUdFLENBQVMsQ0FBRSxDQUFDLENBQzNFLENBRU8sU0FBU0MsR0FBVUMsRUFBUSxDQUNoQyxPQUFBQyxFQUFT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QUFPLEVBRWhDLENBQ0QsRUFFRCxRQUFTLENBQ1AsT0FBUSxDQUNOLEtBQUssTUFBTSxNQUFNLE1BQU0sQ0FDekIsQ0FDRixDQUNGLG1CQ3hGQSxTQUFTbUgsR0FBaUIsQ0FBRSxRQUFBQyxHQUFXLENBQUUsTUFBQTNaLENBQUksRUFBSyxDQUNoRCxPQUFPMlosRUFDSEMsR0FBY3JNLEdBQVlwWCxHQUFPNkosQ0FBSyxFQUN0Q0EsRUFBTSxRQUFRLENBQ3BCLENBRUEwWixHQUFpQixNQUFRLENBQ3ZCLFFBQVMsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFLLENBQzFDLEVBRUssTUFBQXRGLEdBQWFzRixHQUVaRyxHQUFXLENBQUNDLEVBQVM5UCxJQUFVLE9BQU8sT0FBTzhQLEVBQVEsTUFBTzlQLENBQUssRUFFakUrUCxHQUFjcG9CLEdBQVksV0FBV0EsRUFBVSxDQUFDLEVBR2hEcW9CLEdBQWVGLEdBQVcsaUJBQWlCQSxDQUFPLEVBQUUsT0FFcEQzakIsR0FBUSxDQUNaLEtBQU0sY0FFTixhQUFhMmpCLEVBQVMsQ0FJcEJDLEdBQVksSUFBTUYsR0FBU0MsRUFBUyxDQUFFLE9BQVEsSUFBSyxDQUFDLENBQUMsQ0FDdEQsRUFFRCxRQUFRQSxFQUFTLENBS2YsS0FBTSxDQUFFLE1BQUFHLEdBQVUsaUJBQWlCSCxDQUFPLEVBQzFDRCxHQUFTQyxFQUFTLENBQ2hCLE1BQUFHLEVBQ0EsU0FBVSxXQUNWLFdBQVksU0FDWixPQUFRLE9BQ1QsRUFDREYsR0FBWSxJQUFNLENBQ2hCLEtBQU0sQ0FBRSxPQUFBRyxHQUFXLGlCQUFpQkosQ0FBTyxFQUMzQ0QsR0FBU0MsRUFBUyxDQUNoQixNQUFPLEtBQ1AsU0FBVSxLQUNWLFdBQVksS0FDWixPQUFRLEVBQ1QsRUFDREUsR0FBYUYsQ0FBTyxFQUNwQkMsR0FBWSxJQUFNRixHQUFTQyxFQUFTLENBQUUsT0FBQUksQ0FBUSxDQUFBLENBQUMsRUFDaEQsQ0FDRixFQUVELFFBQVFKLEVBQVMsQ0FDZixLQUFNLENBQUUsT0FBQUksR0FBVyxpQkFBaUJKLENBQU8sRUFDM0NELEdBQVNDLEVBQVMsQ0FBRSxPQUFBSSxFQUFRLEVBQzVCRixHQUFhRixDQUFPLEVBQ3BCQyxHQUFZLElBQU1GLEdBQVNDLEVBQVMsQ0FBRSxPQUFRLENBQUEsQ0FBRyxDQUFDLENBQ3BELENBQ0YsRUM3RE8sU0FBU0ssR0FBZ0J0bEIsRUFBTyxDQUNyQyxPQUFPQSxHQUFTNmdCLEVBQU8sUUFBQzdnQixDQUFLLEVBQUUsS0FBS0EsR0FBU0EsRUFBTSxPQUFTMkwsQ0FBTyxDQUNyRSxDQUVPLFNBQVM0WixHQUFldlYsRUFBTTFPLEVBQVEsR0FBSSxDQUMvQyxPQUFBME8sRUFBT3ZPLEVBQVEsU0FBQ3VPLENBQUksRUFBSTBCLEdBQVUsRUFBQzFCLENBQUksRUFBSUEsRUFDcENzVixHQUFnQnRWLEdBQUEsWUFBQUEsRUFBTzFPLEVBQU0sQ0FDdEMiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMSwyLDMsNF19
|