@sidekick-coder/zenith-kit 0.3.3 → 0.3.5

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.
@@ -1,2 +0,0 @@
1
- import{t as e}from"./chunk-0Lt9GpW0.mjs";import{toast as t}from"vue-sonner";import n from"qs";import{debounce as r,get as i,has as a,orderBy as o,set as s,unset as c}from"lodash-es";import*as l from"valibot";import{format as u}from"date-fns";import{defineAbility as d,subject as f}from"@casl/ability";import{createMemoryHistory as p,createRouter as m,createWebHistory as h}from"vue-router";import{computed as g,getCurrentInstance as _,getCurrentScope as ee,hasInjectionContext as te,inject as ne,isRef as v,nextTick as re,onMounted as ie,provide as ae,ref as y,shallowRef as b,toRef as x,toValue as S,unref as oe,watch as C,watchEffect as se}from"vue";import{toTypedSchema as ce}from"@vee-validate/valibot";import{useForm as le}from"vee-validate";import"@unhead/vue";import{useRouteQuery as ue}from"@vueuse/router";import{clsx as de}from"clsx";import{twMerge as fe}from"tailwind-merge";async function w(e){try{return[null,await e()]}catch(e){return[e,null]}}w.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var T=class{static __container_entry_key=`FetchService`;async handleError(e){if(e.headers.get(`Content-Type`)?.includes(`json`)){let n=await e.json().catch(()=>({message:$t(`Internal Server Error`)}));return n.message&&t.error(n.message),n}return t.error($t(`Internal Server Error`)),{message:$t(`Internal Server Error`)}}buildUrl(e,t){if(!t)return e;let r=n.stringify(t,{arrayFormat:`brackets`});return e+`?`+r}buildRequestInit(e){let t={...e};return e.data&&(t.body=JSON.stringify(e.data),t.headers={...t.headers,"Content-Type":`application/json`}),t}async parseResponse(e){return e.headers.get(`Content-Type`)?.includes(`json`)?e.json():e.text()}async fetch(e,t={}){throw Error(`Method not implemented`)}async try(e,t={}){return w(()=>this.fetch(e,t))}async get(e,t={}){return this.fetch(e,{...t,method:`GET`})}async post(e,t={}){return this.fetch(e,{...t,method:`POST`})}async put(e,t={}){return this.fetch(e,{...t,method:`PUT`})}async delete(e,t={}){return this.fetch(e,{...t,method:`DELETE`})}},pe=class e extends Error{status=500;constructor(e,t=500){super(e),this.name=`BaseException`,this.status=t}static fromError(t){return new e(t.message,500)}},me=class{entries=new Map;loadFromRecord(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[String(t)]=n;return e}getKey(e){let t=e;(typeof e==`function`||typeof e==`object`)&&(t=e.name);let n=typeof e!=`string`&&typeof e!=`symbol`;return n&&!e.__container_entry_key&&console.warn(`Warning: The constructor ${e.name} does not have a unique identifier. Consider adding a static property __container_entry_key to avoid potential conflicts.`),n&&e.__container_entry_key&&(t=e.__container_entry_key),t}set(e,t){let n=this.getKey(e);return this.entries.set(n,t),this}has(e){let t=this.getKey(e);return this.entries.has(t)}get(e){let t=this.getKey(e);if(!this.entries.has(t))throw new pe(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}unset(e){let t=this.getKey(e);this.entries.delete(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const E=globalThis.clientContainer||new me;globalThis.clientContainer=E;const D=E.proxy(T);function O(...e){return e.reduce((e,t)=>t(e),class{})}function he(e,...t){return t.reduce((e,t)=>t(e),e)}function ge(e){return function(t){class n extends t{constructor(...t){super(...t);let n=new e(...t);Object.assign(this,n)}}for(let t of Reflect.ownKeys(e.prototype))t!==`constructor`&&Object.defineProperty(n.prototype,t,Object.getOwnPropertyDescriptor(e.prototype,t));return n}}function k(e){return class extends e{static from(t){let n=typeof this==`function`?this:e,r=new n,i={...t};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}function A(e){return class extends e{created_at;updated_at}}function j(e){return class extends e{deleted_at=null}}O(k,A,j);var _e=class{static __container_entry_key=`AuthService`;user;constructor(e={}){this.user=e.user||null}async logout(e){let[t]=await D.try(`/auth/logout`,{method:`POST`});t||(window.location.href=e?.redirect||`/`)}},ve=class extends T{async fetch(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i);return await this.parseResponse(i)}},ye=class{static __container_entry_key=`CookieMapEntity`;cookies;prefix;constructor(e){this.cookies=e?.cookies||new Map,this.prefix=e?.prefix||``}load(e){if(e instanceof Map){for(let[t,n]of e.entries())this.set(t,n);return}for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){let n=this.prefix+e;return this.cookies.get(n)||t}set(e,t,n){let r=this.prefix+e;this.cookies.set(r,t)}toRecord(){let e={};for(let[t,n]of this.cookies.entries())if(t.startsWith(this.prefix)){let r=t.slice(this.prefix.length);e[r]=n}return e}};function be(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=/^\d+$/.test(r)?`${t}[${r}]`:t?`${t}.${r}`:r;if(i&&typeof i==`object`){be(i,e,n);continue}n[e]=i}return n}function xe(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function Se(e=``){return e+xe()}var Ce=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:a(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],a=this.entries.get(r);if(!a){let n=this.entries.get(e);return n?n.value:t}let o=a.value;return typeof o!=`object`||Array.isArray(o)?t:i(o,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),s(i,e.substring(r.length+1),t),this.entries.set(r,{key:r,source:n,value:i})}unset(e){if(!e.includes(`.`)){this.entries.delete(e);return}let t=e.split(`.`)[0],n=this.get(t,{});n&&(typeof n!=`object`||Array.isArray(n)||(c(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return be(this.toRecord())}};const we=E.proxy(Ce);function Te(e,t){let n={},r=e.split(`/`).filter(Boolean),i=t.split(`/`).filter(Boolean);for(let e=0;e<r.length;e++){let t=r[e],a=i[e];if(t.startsWith(`:`)){let e=t.slice(1);n[e]=a}if(t===`*`){n[`*`]=i.slice(e).join(`/`);break}}return n}function Ee(e){let t={},r=e.split(`?`)[1];return r?n.parse(r):t}var De=class extends T{async fetch(e,t={}){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)?this.fetchInternal(e,t):this.fetchExternal(e,t)}async fetchExternal(e,t={}){let n=this.buildUrl(e,t.query),r=this.buildRequestInit(t),i=await fetch(n,r);if(!i.ok)throw await this.handleError(i),Error(`HTTP error! status: ${i.status}`);return this.parseResponse(i)}async fetchInternal(e,t={}){let n=E.get(`RouterService`),r=t.method||`GET`,i=n.resolve(r,e),a=new ye({prefix:we.get(`cookie.prefix`,``)});if(E.has(`cookies`)&&a.load(E.get(`cookies`)),!i||!i.handler)throw Error(`Route not found for ${r} ${e}`);return await n.execute(i,{url:e,params:Te(i.path,e),query:t.query||Ee(e),body:t.data||t.body,method:r.toLowerCase(),cookie:a})}},M=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},Oe=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new M,this.debug&&this.logger.debug(`emmitter loaded with debug mode enabled`)}static create(t){return new e(t)}setDebug(e){this.debug=e,this.debug&&this.logger.debug(`debug mode enabled`)}setLogger(e){this.logger=e}on(e,t,n){let r=n?.id||Se();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=(n,i)=>{t(n,i),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let i=r(t,n?.debounce||300),a=this.on(e,i,n);return a&&(a.originalListener=t),a}onAnyOf(e,t,n){let r=[];for(let i of e){let e=this.on(i,t,n);e&&r.push(e)}return r}off(e,t){this.handlers=this.handlers.filter(n=>!(n.event===e&&(n.listener===t||n.originalListener===t))),this.debug&&this.logger.debug(`handler removed`,{event:e})}emit(e,t){this.debug&&this.logger.debug(`emitting event`,{event:e,args:t});let n=this.handlers.filter(t=>t.event===e);for(let r of n)w.sync(()=>r.listener(t,{event:e}))}async emitAndWait(e,t){let n=this.handlers.filter(t=>t.event===e);this.debug&&this.logger.debug(`emitting event and wait`,{handlers:n.length,event:e,args:t});for await(let r of n)await r.listener(t,{event:e})}list(){return this.handlers}listByEvent(e){return this.handlers.filter(t=>t.event===e)}remove(e){let t=Array.isArray(e)?e:[e];this.handlers=this.handlers.filter(e=>!t.includes(e.id)),this.debug&&this.logger.debug(`handlers removed`,{ids:t})}clear(){this.handlers=[],this.debug&&this.logger.debug(`all handlers cleared`)}hasHandlers(){return this.handlers.length>0}},ke=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},Ae=class{static __container_entry_key=`LifecycleService`;hooks;logger;debug=!1;constructor(e={}){this.debug=e.debug??this.debug,this.hooks=e.hooks??new Map,this.logger=e.logger??new M,e.onError&&(this.onError=e.onError)}setOnError(e){this.onError=e}onError(e,t){Object.assign(e,{context:t}),this.logger.error(`Error in hook ${t.method} (${t.hookId}):`,e)}mapAliases(e){let t=[],n=Array.from(this.hooks.values());for(let r of n){if(e.includes(r.hook_id)){t.push(r.hook_id);continue}r.hook_aliases&&r.hook_aliases.find(t=>e.includes(t))&&t.push(r.hook_id)}return t}list(e){let t=Array.from(this.hooks.values());if(e?.exclude){let n=Array.isArray(e.exclude)?e.exclude:[e.exclude];n=this.mapAliases(n),t=t.filter(e=>!n.includes(e.hook_id))}if(e?.include){let n=Array.isArray(e.include)?e.include:[e.include];n=this.mapAliases(n),t=t.filter(e=>n.includes(e.hook_id))}return t=o(t,[`order`],[`asc`]),t}add(...e){let t=[];for(let n of e){if(typeof n==`function`){t.push(new n);continue}t.push(n)}for(let e of t){if(!e.hook_id){this.logger.warn(`Skipping hook without hook_id:`,e);continue}this.hooks.set(e.hook_id,e),this.debug&&this.logger.debug(`add `+e.hook_id),e.subhooks&&e.subhooks.forEach(e=>this.add(e))}}async emitMethod(e,t){let n=this.list(t);this.debug&&this.logger.debug(`emitting ${e} for hooks:`,{hooks:n.map(e=>e.hook_id)});for(let n of this.list(t)){let t={register:()=>Promise.all([n.register(),n.onRegister()]),load:()=>Promise.all([n.load(),n.onLoad()]),boot:()=>Promise.all([n.boot(),n.onBoot()]),shutdown:()=>Promise.all([n.shutdown(),n.onShutdown()])},[r]=await w(()=>t[e]());if(r){this.onError(r,{hookId:n.hook_id,method:e});continue}this.debug&&this.logger.debug(`${e} `+n.hook_id)}}async emit(e,t){let n=Array.isArray(e)?e:[e];for(let e of n)await this.emitMethod(e,t)}on(e,t){let n=new ke;n.hook_id=`custom:${e}:${Date.now()}`,n[e]=t,this.add(n)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}};const N=()=>l.pipe(l.union([l.string(),l.number()]),l.transform(Number),l.integer()),je=()=>l.pipe(l.union([l.string(),l.boolean()]),l.transform(e=>e===!0||e===`true`)),Me=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e instanceof Date?e:new Date(e)),l.transform(e=>e&&u(e,`yyyy-MM-dd`))),Ne=()=>l.pipe(l.union([l.string(),l.date()]),l.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),u(e,`yyyy-MM-dd HH:mm`))))),P=(e=l.any())=>l.pipe(l.union([l.string(),l.array(l.string())]),l.transform(e=>Array.isArray(e)?e:e.split(`,`)),l.array(e)),Pe=()=>l.pipe(P(),l.transform(e=>e.map(Number))),Fe=()=>l.pipe(l.union([l.string(),l.record(l.string(),l.any())]),l.transform(e=>typeof e==`string`?n.parse(e):e),l.transform(e=>{let t={};for(let n in e)s(t,n,i(e,n));return t}));function F(){return Fe()}F.number=N,F.boolean=je,F.date=Me,F.datetime=Ne,F.array=P,F.arrayNumber=Pe,F.object=Fe;const Ie=()=>l.pipe(l.string(),l.transform(e=>{let t=e.split(/[;\n]/).filter(Boolean).filter(e=>e.includes(`=`)).map(e=>e.trim().split(`=`)),n=Object.fromEntries(t),r={};for(let[e,t]of Object.entries(n)){let n=t;t.startsWith(`bool:`)&&(n=t.replace(`bool:`,``).trim()===`true`),s(r,e,n)}return r})),Le=(e={})=>l.object({page:l.optional(N(),1),limit:l.optional(N(),e.maxLimit||100),orderBy:l.nullish(e.orderFields?P(l.picklist(e.orderFields)):P(l.string()),[]),orderDirection:l.nullish(P(l.union([l.literal(`asc`),l.literal(`desc`)])),[])});function Re(e={}){return Le(e)}Re.base=Le;var ze=e({array:()=>P,arrayNumber:()=>Pe,base:()=>Le,boolean:()=>je,date:()=>Me,datetime:()=>Ne,keyValue:()=>Ie,number:()=>N,object:()=>Fe,pagination:()=>Re,url:()=>F});const I=new class{static __container_entry_key=`ValidatorService`;v={...l,extras:ze};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=l.safeParse(n,e);if(!a){let e=l.flatten(i),t=[];e.root&&t.push(...e.root),e.nested&&Object.entries(e.nested).forEach(e=>{let[n,r]=e;t.push(...r.map(e=>`${n}: ${e}`))});let n=new pe(t.length?t.join(`, `):`Validation failed`,422);throw n.name=`ValidationError`,Object.assign(n,{messages:t}),n}return r}async validateAsync(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=await l.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=l.flatten(i),n={...t.root,...t.nested};throw Object.assign(e,{details:n}),e}return r}isValid(e,t){let n=typeof t==`function`?t(this.v):t,{success:r}=l.safeParse(n,e);return r}};function L(){return I.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}L.create=I.create(e=>e.pick(L(),[`dashboard_id`,`name`,`value`])),L.update=I.create(e=>e.partial(L.create));function R(){return I.create(e=>e.object({id:e.number(),name:e.string(),description:e.nullable(e.string()),created_at:e.string(),updated_at:e.string(),deleted_at:e.nullable(e.string()),metas:e.optional(e.record(e.string(),e.any()))}))}R.create=I.create(e=>e.pick(R(),[`name`,`description`])),R.update=I.create(e=>e.partial(R.create)),l.object({id:l.number(),permission_id:l.number(),assignable_type:l.string(),assignable_id:l.string(),created_at:l.string(),updated_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),description:l.nullable(l.string()),action:l.string(),subject:l.string(),conditions:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),expires_at:l.string()}),l.object({id:l.number(),name:l.nullable(l.string()),type:l.string(),user_id:l.number(),token:l.string(),created_at:l.string(),updated_at:l.string(),expires_at:l.string()});function z(){return l.object({id:l.number(),name:l.optional(l.string()),email:l.pipe(l.string(),l.email()),password:l.pipe(l.string(),l.minLength(6)),username:l.pipe(l.string(),l.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:l.nullable(l.string()),created_at:l.string(),updated_at:l.string(),deleted_at:l.nullable(l.string())})}z.create=()=>l.omit(z(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),z.update=()=>l.partial(z.create());async function Be(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function Ve(e,t,n){let r=e.listeners||[];r.find(e=>e.event===t&&e.listener===n)||(r.push({event:t,listener:n}),e.listeners=r)}function He(e){return class extends e{constructor(...e){super(...e),typeof this.constructor.boot==`function`&&this.constructor.boot.apply(this.constructor)}static listeners=[];static on(e,t){return Ve(this,e,t)}static async emit(e,...t){return Be(this,e,...t)}}}He.emit=Be,He.on=Ve;var Ue=class extends O(k){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=w.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},We=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Ue.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new M().child({label:`acl`}),this.ability=d(e=>{t.forEach(t=>{e(t.action,t.subject,t.parsedConditions)})}),this.debug&&this.logger.debug(`initialized in debug mode`,{permissions:this.permissions})}can(e,t,n){if(!n)return this.ability.can(e,t);let r=f(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=f(t,n);return this.ability.cannot(e,r)}subject(e,t){return f(e,t)}};O(k,A,j),O(k,A,j),O(k,A,j);var Ge=class extends O(k,ge(ke)){id;name;enabled=!1;dependencies={};build={};directory;upgrade_info;setData(e){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));Object.assign(this,t),this.hook_id=`module:${this.id}`}};O(k);var Ke=class extends O(k){id;name;version;enabled;aliases;version_channel;version_available_channels};O(k,A,j);const B=E.proxy(Oe);var qe=class{static __container_entry_key=`LayoutService`;components=new Map;options={};currendId=null;setCurrent(e){this.currendId=e,B.emit(`layout:change`,e)}add(e,t,n){this.components.set(e,t),this.options=n||{}}has(e){return this.components.has(e)}get(e){let t=this.components.get(e);if(!t)throw new pe(`Layout ${e} not found`);return t}getOptions(){return this.options}getCurrent(){return this.currendId?this.get(this.currendId):null}setOptions(e={}){this.options=e,B.emit(`layout:set-options`,e)}},Je=class extends Ae{addImports(e){let t=[];for(let[n,r]of Object.entries(e)){let e=new(r.default||r);e.hook_id=e.hook_id||n,t.push(e)}t.forEach(e=>this.add(e))}},Ye=class extends O(k){id;label;layout;to;target;group;order;icon;parent};const Xe=E.proxy(We);var Ze=class{static __container_entry_key=`MenuService`;items=new Map;add(...e){for(let t of e)t.id||=JSON.stringify(t),this.items.set(t.id,Ye.from(t))}remove(e){this.items.delete(e)}list(e={}){let t=JSON.parse(JSON.stringify(Array.from(this.items.values())));return e.layout&&(t=t.filter(t=>t.layout===e.layout)),e.group&&(t=t.filter(t=>t.group===e.group||t.parent===e.group)),e.parent&&(t=t.filter(t=>t.parent===e.parent)),e.allowed!==void 0&&e.allowed===!0&&(t=t.filter(e=>Xe.can(`view`,e))),t.sort((e,t)=>(e.order?e.order:98)-(t.order?t.order:98)),t}clear(){this.items.clear()}};const Qe=e=>{let t=we.get(`setup`),n=!t?.need_database&&!t?.need_users;return n&&e.path.startsWith(`/setup`)?`/`:n?!0:e.path.startsWith(`/setup`)?e.path===`/setup`?!0:t?.need_database?e.path===`/setup/database`?!0:`/setup/database`:t?.need_users?e.path===`/setup/user`?!0:`/setup/user`:!0:`/setup`};function $e(e,t={}){let n=[];for(let[r,i]of Object.entries(e)){if(t.exclude?.some(e=>typeof e==`string`?r.includes(e):e.test(r)))continue;let e=r.replace(/\.vue$/,``).split(`/`).filter(e=>e&&!e.startsWith(`.`)).map(e=>{let t=e;return t.startsWith(`[`)&&t.endsWith(`]`)&&(t=`:`+t.slice(1,-1)),t});t.strip?.length&&(e=e.filter(e=>!t.strip.some(t=>typeof t==`string`?e===t:t.test(e))));let a=e.join(`/`).replace(/index$/,``);t.prefix&&(a=t.prefix+`/`+a),a.startsWith(`/`)||(a=`/`+a),a.endsWith(`/`)&&(a=a.slice(0,-1));let o={path:a,component:i,beforeEnter:[]};t.guards&&Array.isArray(t.guards)&&(o.beforeEnter=t.guards),t.guards&&typeof t.guards==`function`&&(o.beforeEnter=t.guards(o)),n.push(o)}return t.refine&&(n=t.refine(n)),n}function et(){let e=import.meta.env.SSR,t=m({history:e?p():h(),routes:[],scrollBehavior(e,t,n){return n||{top:0}}});return t.beforeEach(Qe),t.auto=(e,n={})=>{let r=$e(e,n);return r.forEach(e=>t.addRoute(e)),r},t}var tt=class{static __container_entry_key=`ToastService`;success(e,t){console.log(`Success:`,e,t)}error(e,t){console.error(`Error:`,e,t)}};const nt=new WeakMap,rt=(...e)=>{let t=e[0],n=_()?.proxy??ee();if(n==null&&!te())throw Error(`injectLocal must be called in setup`);return n&&nt.has(n)&&t in nt.get(n)?nt.get(n)[t]:ne(...e)},V=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;const it=Object.prototype.toString,at=e=>it.call(e)===`[object Object]`,ot=()=>{};function st(e,t){function n(...n){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(r).catch(i)})}return n}const ct=e=>e();function lt(e,t={}){let n,r,i=ot,a=e=>{clearTimeout(e),i(),i=ot},o;return s=>{let c=S(e),l=S(t.maxWait);return n&&a(n),c<=0||l!==void 0&&l<=0?(r&&=(a(r),void 0),Promise.resolve(s())):new Promise((e,u)=>{i=t.rejectOnCancel?u:e,o=s,l&&!r&&(r=setTimeout(()=>{n&&a(n),r=void 0,e(o())},l)),n=setTimeout(()=>{r&&a(r),r=void 0,e(s())},c)})}}function ut(e,t){if(typeof e==`number`)return e+t;let n=e.match(/^-?\d+\.?\d*/)?.[0]||``,r=e.slice(n.length),i=Number.parseFloat(n)+t;return Number.isNaN(i)?e:i+r}function H(e){return e.endsWith(`rem`)?Number.parseFloat(e)*16:Number.parseFloat(e)}function dt(e){return Array.isArray(e)?e:[e]}function ft(e){return e||_()}function pt(e,t,n={}){let{eventFilter:r=ct,...i}=n;return C(e,st(r,t),i)}function mt(e,t=!0,n){ft(n)?ie(e,n):t?e():re(e)}function ht(e,t,n={}){let{debounce:r=0,maxWait:i=void 0,...a}=n;return pt(e,t,{...a,eventFilter:lt(r,{maxWait:i})})}function gt(e,t,n){return C(e,t,{...n,immediate:!0})}const _t=V?window:void 0;V&&window.document,V&&window.navigator,V&&window.location;function vt(e){let t=S(e);return t?.$el??t}function yt(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=g(()=>{let t=dt(S(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return gt(()=>[n.value?.map(e=>vt(e))??[_t].filter(e=>e!=null),dt(S(n.value?e[1]:e[0])),dt(oe(n.value?e[2]:e[1])),S(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=at(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}function bt(){let e=b(!1),t=_();return t&&ie(()=>{e.value=!0},t),e}function xt(e){let t=bt();return g(()=>(t.value,!!e()))}const St=Symbol(`vueuse-ssr-width`);function Ct(){let e=te()?rt(St,null):null;return typeof e==`number`?e:void 0}function U(e,t={}){let{window:n=_t,ssrWidth:r=Ct()}=t,i=xt(()=>n&&`matchMedia`in n&&typeof n.matchMedia==`function`),a=b(typeof r==`number`),o=b(),s=b(!1);return se(()=>{if(a.value){a.value=!i.value,s.value=S(e).split(`,`).some(e=>{let t=e.includes(`not all`),n=e.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),i=e.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),a=!!(n||i);return n&&a&&(a=r>=H(n[1])),i&&a&&(a=r<=H(i[1])),t?!a:a});return}i.value&&(o.value=n.matchMedia(S(e)),s.value=o.value.matches)}),yt(o,`change`,e=>{s.value=e.matches},{passive:!0}),g(()=>s.value)}const wt={sm:640,md:768,lg:1024,xl:1280,"2xl":1536};function Tt(e,t={}){function n(t,n){let r=S(e[S(t)]);return n!=null&&(r=ut(r,n)),typeof r==`number`&&(r=`${r}px`),r}let{window:r=_t,strategy:i=`min-width`,ssrWidth:a=Ct()}=t,o=typeof a==`number`,s=o?b(!1):{value:!0};o&&mt(()=>s.value=!!r);function c(e,t){return!s.value&&o?e===`min`?a>=H(t):a<=H(t):r?r.matchMedia(`(${e}-width: ${t})`).matches:!1}let l=e=>U(()=>`(min-width: ${n(e)})`,t),u=e=>U(()=>`(max-width: ${n(e)})`,t),d=Object.keys(e).reduce((e,t)=>(Object.defineProperty(e,t,{get:()=>i===`min-width`?l(t):u(t),enumerable:!0,configurable:!0}),e),{});function f(){let t=Object.keys(e).map(e=>[e,d[e],H(n(e))]).sort((e,t)=>e[2]-t[2]);return g(()=>t.filter(([,e])=>e.value).map(([e])=>e))}return Object.assign(d,{greaterOrEqual:l,smallerOrEqual:u,greater(e){return U(()=>`(min-width: ${n(e,.1)})`,t)},smaller(e){return U(()=>`(max-width: ${n(e,-.1)})`,t)},between(e,r){return U(()=>`(min-width: ${n(e)}) and (max-width: ${n(r,-.1)})`,t)},isGreater(e){return c(`min`,n(e,.1))},isGreaterOrEqual(e){return c(`min`,n(e))},isSmaller(e){return c(`max`,n(e,-.1))},isSmallerOrEqual(e){return c(`max`,n(e))},isInBetween(e,t){return c(`min`,n(e))&&c(`max`,n(t,-.1))},current:f,active(){let e=f();return g(()=>e.value.length===0?``:e.value.at(i===`min-width`?-1:0))}})}function Et(){return Tt(wt)}function W(e){let t=/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid RGB color format: `+e);return{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3])}}function G(e){let t=/rgba\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)/.exec(e);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:parseFloat(t[4])}:{...W(e),a:1}}function Dt(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)throw Error(`Invalid HEX color format: `+e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}}function K(e){let t=/hsla?\((\d+),\s*(\d+)%,\s*(\d+)%(?:,\s*[\d.]+)?\)/.exec(e);if(!t)throw Error(`Invalid HSL color format: `+e);let n=parseInt(t[1])/360,r=parseInt(t[2])/100,i=parseInt(t[3])/100,a,o,s;if(r===0)a=o=s=i;else{let e=(e,t,n)=>(n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e),t=i<.5?i*(1+r):i+r-i*r,c=2*i-t;a=e(c,t,n+1/3),o=e(c,t,n),s=e(c,t,n-1/3)}return{r:Math.round(a*255),g:Math.round(o*255),b:Math.round(s*255)}}function q(e,t,n){e/=255,t/=255,n/=255;let r=Math.max(e,t,n),i=Math.min(e,t,n),a=(r+i)/2;if(r===i)return{h:0,s:0,l:Math.round(a*100)};let o=r-i,s=a>.5?o/(2-r-i):o/(r+i),c=0;switch(r){case e:c=((t-n)/o+(t<n?6:0))*60;break;case t:c=((n-e)/o+2)*60;break;case n:c=((e-t)/o+4)*60;break}return{h:Math.round(c),s:Math.round(s*100),l:Math.round(a*100)}}function J(e,t,n){let r=e=>{let t=e.toString(16);return t.length===1?`0`+t:t};return`#${r(e)}${r(t)}${r(n)}`}function Ot(e){return`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}function kt(e){let t=/oklch\(([\d.]+)\s+([\d.]+)\s+([\d.]+)\)/.exec(e);if(!t)throw Error(`Invalid OKLCH color format: `+e);return{l:parseFloat(t[1]),c:parseFloat(t[2]),h:parseFloat(t[3])}}function At(e){let{l:t,c:n,h:r}=kt(e),i=r*Math.PI/180,a=n*Math.cos(i),o=n*Math.sin(i),s=t+.3963377774*a+.2158037573*o,c=t-.1055613458*a-.0638541728*o,l=t-.0894841775*a-1.291485548*o,u=s*s*s,d=c*c*c,f=l*l*l,p=4.0767416621*u-3.3077115913*d+.2309699292*f,m=-1.2684380046*u+2.6097574011*d-.3413193965*f,h=-.0041960863*u-.7034186147*d+1.707614701*f,g=e=>e>=.0031308?1.055*e**(1/2.4)-.055:12.92*e;return p=g(p),m=g(m),h=g(h),{r:Math.round(Math.max(0,Math.min(1,p))*255),g:Math.round(Math.max(0,Math.min(1,m))*255),b:Math.round(Math.max(0,Math.min(1,h))*255)}}function Y(e,t,n){e/=255,t/=255,n/=255;let r=e=>e>=.04045?((e+.055)/1.055)**2.4:e/12.92;e=r(e),t=r(t),n=r(n);let i=.4122214708*e+.5363325363*t+.0514459929*n,a=.2119034982*e+.6806995451*t+.1073969566*n,o=.0883024619*e+.2817188376*t+.6299787005*n,s=Math.cbrt(i),c=Math.cbrt(a),l=Math.cbrt(o),u=.2104542553*s+.793617785*c-.0040720468*l,d=1.9779984951*s-2.428592205*c+.4505937099*l,f=.0259040371*s+.7827717662*c-.808675766*l,p=Math.sqrt(d*d+f*f),m=180/Math.PI*Math.atan2(f,d);return m<0&&(m+=360),{l:Math.round(u*1e3)/1e3,c:Math.round(p*1e3)/1e3,h:Math.round(m*1e3)/1e3}}function X(e){let t=v(e)?e:y(S(e));return g({get(){return t.value?t.value.startsWith(`#`)?`hex`:/^rgba/.test(t.value)?`rgba`:/^rgb/.test(t.value)?`rgb`:/^oklch/.test(t.value)?`oklch`:/^hsla/.test(t.value)?`hsla`:/^hsl/.test(t.value)?`hsl`:`unknown`:null},set(e){if(!t.value||!e)return;let n=Z(t).value;if(n){if(e===`hex`){t.value=J(n.r,n.g,n.b);return}if(e===`rgb`){t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(e===`rgba`){t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(e===`hsl`){let e=q(n.r,n.g,n.b);t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`hsla`){let e=q(n.r,n.g,n.b);t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(e===`oklch`){let e=Y(n.r,n.g,n.b);t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}}}})}function Z(e){let t=v(e)?e:y(S(e)),n=X(t);return g({get(){if(!t.value)return null;if(n.value===`rgba`){let e=G(t.value);return{r:e.r,g:e.g,b:e.b}}return n.value===`rgb`?W(t.value):n.value===`hex`&&t.value.length===7?Dt(t.value):n.value===`hsl`?K(t.value):n.value===`oklch`?At(t.value):null},set(){if(t.value){if(n.value===`rgb`){let e=W(t.value);t.value=`rgb(${e.r}, ${e.g}, ${e.b})`}if(n.value===`rgba`){let e=G(t.value);t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`}}}})}function jt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?n.value===`rgba`?G(t.value):{...r.value,a:1}:null},set(e){if(!(!e||!t.value)){if(n.value===`rgba`){t.value=`rgba(${e.r}, ${e.g}, ${e.b}, ${e.a})`;return}if(n.value===`rgb`){t.value=`rgb(${e.r}, ${e.g}, ${e.b})`;return}}}})}function Mt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?q(r.value.r,r.value.g,r.value.b):null},set(e){if(!(!e||!t.value)){if(n.value===`hsl`){t.value=`hsl(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hsla`){t.value=`hsla(${e.h}, ${e.s}%, ${e.l}%)`;return}if(n.value===`hex`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=J(n.r,n.g,n.b);return}if(n.value===`rgba`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgba(${n.r}, ${n.g}, ${n.b}, 1)`;return}if(n.value===`rgb`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`);t.value=`rgb(${n.r}, ${n.g}, ${n.b})`;return}if(n.value===`oklch`){let n=K(`hsl(${e.h}, ${e.s}%, ${e.l}%)`),r=Y(n.r,n.g,n.b);t.value=`oklch(${r.l} ${r.c} ${r.h})`;return}}}})}function Nt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Z(t);return g({get(){return r.value?J(r.value.r,r.value.g,r.value.b):null},set(e){if(e&&n.value===`hex`){t.value=e.startsWith(`#`)?e:`#${e}`;return}}})}function Pt(e){let t=v(e)?e:y(S(e)),n=X(t),r=Nt(t),i=Z(t),a=jt(t);return{type:n,color:t,hex:r,rgb:i,hsl:Mt(t),oklch:g({get(){return i.value?Y(i.value.r,i.value.g,i.value.b):null},set(e){if(!e)return;if(n.value===`oklch`){t.value=`oklch(${e.l} ${e.c} ${e.h})`;return}let r=At(`oklch(${e.l} ${e.c} ${e.h})`);if(n.value===`hex`){t.value=J(r.r,r.g,r.b);return}if(n.value===`rgb`){t.value=`rgb(${r.r}, ${r.g}, ${r.b})`;return}}}),rgba:a}}const Ft=Symbol(`dashboard`);function It(e){ae(Ft,e)}function Lt(){let e=ne(Ft);if(!e)throw Error(`useDashboard must be used inside a component that calls provideDashboard`);return e}const Rt=Symbol(`dashboard-widget`);function zt(e){ae(Rt,e)}function Bt(){let e=ne(Rt);if(!e)throw Error(`useDashboardWidget must be used inside a component that calls provideDashboardWidget`);return e}function Vt(e,t){let n=E.get(`state`),r=n[e];!r&&t?.default!==void 0&&(r=t.default()),r&&t?.transform&&(r=t.transform(r));let i=y(r),a=t=>{n[e]=t,E.set(`state`,n)};return C(i,a,{deep:!0}),g({get:()=>i.value,set:e=>{i.value=e,a(e)}})}const Ht=new Set;function Ut(e,t={}){let n=t.key||e,r=Vt(n,{default:()=>({items:[],page:1,total:0,total_pages:1})}),i=y(!1),a=x(t.page||1),o=x(t.query||{}),s=x(t.limit||10),c=x(t.orderBy||null),l=x(t.orderDirection||null),u=g(()=>r.value.total),d=g(()=>r.value.total_pages),f=g(()=>{let e=Array.isArray(r.value.items)?r.value.items:[];return t.refine&&(e=t.refine(e)),t.serialize?e.map(e=>t.serialize(e)):e});async function p(){if(i.value)return;i.value=!0;let t=JSON.parse(JSON.stringify({...o.value,page:a.value,limit:s.value,orderBy:c.value?c.value:void 0,orderDirection:l.value?l.value:void 0})),[n,u]=await D.try(e,{method:`GET`,query:t});if(n){i.value=!1,console.error(n);return}if(r.value=u,import.meta.env.SSR){i.value=!1;return}await new Promise(e=>setTimeout(e,800)),i.value=!1}async function m(){if(a.value===1){await p();return}a.value=1}function h(e,t){JSON.stringify(e)!==JSON.stringify(t)&&m()}C([a,s],p),C([c,l],m,{deep:!0}),ht(()=>JSON.parse(JSON.stringify(o.value)),h,{debounce:t.debounce||1e3});async function _(){if(!Ht.has(n)&&f.value.length){Ht.add(n);return}Ht.add(n),await p()}return{page:a,limit:s,orderBy:c,orderDirection:l,total:u,totalPages:d,items:f,loading:i,load:p,reset:m,query:o,hydrate:_}}const Wt=Kt,Gt=ce;function Kt(e,t={}){return le({...t,validationSchema:ce(e)})}const qt=`unhead-vue`,Jt=E.proxy(qt),Yt=(...e)=>Jt.useHead(...e),Xt=globalThis,Q=Xt.layout||new qe;Xt.layout=Q;function Zt(){let e=y(Q.getOptions()),t=()=>{e.value=Q.getOptions()};return B.on(`layout:change`,t),B.on(`layout:set-options`,t),e}function Qt(e=!1,t){let n=y(e),r=y(t?.timeout??500);function i(e){n.value=e}let a=g({get(){return n.value},set(e){if(e){n.value=!0;return}setTimeout(()=>i(!1),r.value)}});return Object.assign(a,{set:i})}const $=y(new Map);function en(){function e(...e){e.forEach(e=>{e.layout||=`admin`,$.value.set(e.id,e)})}function t(e){typeof e==`string`&&$.value.delete(e)}function n(e){Array.from($.value.values()).filter(t=>t.group===e||t.parent===e).forEach(e=>$.value.delete(e.id))}function r(e){e.forEach(e=>t(e))}function i(e){e.forEach(e=>n(e))}function a(){$.value.clear()}return{items:g(()=>Array.from($.value.values())),add:e,remove:t,removeGroup:n,removeMany:r,removeManyGroup:i,clear:a}}const tn=E.proxy(`route`),nn=E.proxy(`router`),rn=(e,t,n)=>ue(e,t,{route:tn,router:nn,...n}),an=E.proxy(_e);var on=class{static __container_entry_key=`DashboardWidgetRegistry`;definitions=new Map;register(...e){for(let t of e)this.definitions.set(t.id,t)}get(e){return this.definitions.get(e)||null}list(){return Array.from(this.definitions.values())}};const sn=E.proxy(on),cn=E.proxy(Je),ln=E.proxy(M),un=E.proxy(Ze),dn=E.proxy(tt),fn=`vee-validate`,pn=E.proxy(fn),mn=`Vue`,hn=E.proxy(`Vue`),gn=`VueRouter`,_n=E.proxy(gn);var vn=class{id;name;definition_id;columns;rows;x;y;order;options;constructor(e){Object.assign(this,e),this.id||=Se(),this.options||={}}},yn=class{id;name;description;icon;constructor(){this.id=``,this.name=``,this.description=``,this.icon=``}component(){return null}actions(){return[]}};const bn=80;var xn=class e{data;definition;emmitter;constructor({data:e,definition:t}){this.data=e,this.definition=t,this.emmitter=new Oe}static fromData(t){let n=sn.get(t.definition_id);return n||(n=new yn,n.name=`Unknown: ${t.definition_id}`,n.id=t.definition_id,console.warn(`DashboardWidgetDefinition not found for id: ${t.definition_id}. Using unknown definition.`)),new e({data:t,definition:n})}setEmmitter(e){this.emmitter=e}get id(){return this.data.id}get name(){return this.data.name}set name(e){this.update({name:e})}get options(){return this.data.options||{}}get definition_id(){return this.data.definition_id}component(){return this.definition.component()}actions(){return this.definition.actions()}get columns(){return this.data.columns||{}}set columns(e){let t=JSON.parse(JSON.stringify(this.data.columns||{}));Object.assign(t,e),this.update({columns:t})}get rows(){return this.data.rows||{}}set rows(e){let t=JSON.parse(JSON.stringify(this.data.rows||{}));Object.assign(t,e),this.update({rows:t})}get x(){return this.data.x||{}}set x(e){let t=JSON.parse(JSON.stringify(this.data.x||{}));Object.assign(t,e),this.update({x:t})}get y(){return this.data.y||{}}set y(e){let t=JSON.parse(JSON.stringify(this.data.y||{}));Object.assign(t,e),this.update({y:t})}get classes(){let e=new Set;return Array.from(e.values()).join(` `)}computeStyles(e){let t=new Map,n=e.breakpoint??`base`,r=this.x[n]??0,i=this.y[n]??0,a=this.columns[n]??1,o=this.rows[n]??1,s=e.contianerWidth/12;return t.set(`position`,`absolute`),t.set(`left`,`${r*s}px`),t.set(`top`,`${i*80}px`),t.set(`width`,`${a*s-10}px`),t.set(`height`,`${o*80}px`),Array.from(t.entries()).map(([e,t])=>`${e}: ${t};`).join(` `)}update(e){Object.assign(this.data,e),this.emmitter.emit(`widget:updated`,{id:this.id,data:this.data})}setOption(e,t){let n=JSON.parse(JSON.stringify(this.data.options||{}));s(n,e,t),this.update({options:n})}setX(e,t=void 0){let n=JSON.parse(JSON.stringify(this.x));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({x:n})}setY(e,t=void 0){let n=JSON.parse(JSON.stringify(this.y));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({y:n})}setColumn(e,t=void 0){let n=JSON.parse(JSON.stringify(this.columns));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({columns:n})}setRow(e,t=void 0){let n=JSON.parse(JSON.stringify(this.rows));t===void 0&&delete n[e],t!==void 0&&(n[e]=t),this.update({rows:n})}},Sn=class{name=``;description=``;widgets=[];emmitter;containerWidth=0;constructor(){this.emmitter=new Oe}setName(e){return this.name=e,this}setDescription(e){return this.description=e,this}setContainerWidth(e){return this.containerWidth=e,this}setWidgets(e){this.widgets=[];for(let t of e){let e=xn.fromData(t);e.setEmmitter(this.emmitter),this.widgets.push(e)}return this}findLastRow(){let e=0;for(let t of this.widgets){let n=t.rows?.base??0,r=(t.y?.base??0)+n;r>e&&(e=r)}return e}addWidget(e={}){e.columns||={base:4},e.rows||={base:4},e.x||={base:0},e.y||={base:this.findLastRow()};let t=new vn(e),n=xn.fromData(t);n.setEmmitter(this.emmitter),this.widgets.push(n)}removeWidget(e){this.widgets=this.widgets.filter((t,n)=>n!==e)}removeWidgetById(e){this.widgets=this.widgets.filter(t=>t.id!==e)}updateWidget(e,t){this.widgets=this.widgets.map((n,r)=>r===e?t:n)}duplicateWidget(e){let t=JSON.parse(JSON.stringify(this.widgets[e]));[...this.widgets].splice(e+1,0,t)}},Cn=class e extends yn{static renderer;constructor(){super(),this.name=`Chart`,this.id=`chart`}static setRenderer(t){e.renderer=t}component(){return e.renderer}async chartOptions(e){return{grid:{left:`3%`,right:`4%`,bottom:`3%`,containLabel:!0},title:{text:`ECharts Getting Started Example`},tooltip:{},xAxis:{data:[`shirt`,`cardigan`,`chiffon`,`pants`,`heels`,`socks`]},yAxis:{},series:[{name:`sales`,type:`bar`,data:[5,20,36,10,10,20]}]}}},wn=class extends he(Ge){},Tn=class extends he(Ke){addPagesFolder(e,t){nn.auto(e,t)}async load(){}};function En(e,t={}){return $e(e,t)}function Dn(e){return e}function On(e){return e}const kn=D;function An(e){return new Promise(t=>{let n=document.createElement(`input`);n.type=`file`,n.accept=e.accept||`*/*`,n.multiple=e.multiple||!1,n.onchange=n=>{let r=n.target,i=Array.from(r.files);t(e.multiple?Array.from(i):i[0])},n.oncancel=()=>{t(e.multiple?[]:null)},n.click()})}function jn(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>{e.target?.result instanceof ArrayBuffer?t(new Uint8Array(e.target.result)):n(Error(`Failed to read file as ArrayBuffer`))},r.onerror=()=>{n(r.error)},r.readAsArrayBuffer(e)})}async function Mn(e){let t=new FormData;return t.append(`file`,e.file),e.directory&&t.append(`directory`,e.directory),kn(`/api/drives/${e.driveId}/upload`,{method:`POST`,body:t,query:{directory:e.directory}})}const Nn={pick:An,upload:Mn,toUint8Array:jn};function Pn(e){let t=e;for(let[e,n]of Object.entries(tn.params)){let r=`:${e}`;t=t.replace(r,String(n))}return t}const Fn=t;function In(...e){return fe(e)}function Ln(...e){return de(e)}function Rn(...e){return fe(de(e))}function zn(e){let t=e.exclude||[`/auth/login`,`/auth/register`];return n=>{if(!an.user&&!t.includes(n.path))return typeof e.redirect==`function`?e.redirect(n):e.redirect}}const Bn=zn({redirect:e=>`/auth/login?redirect=`+encodeURIComponent(e.fullPath)});function Vn(e){return()=>{if(an.user)return e.redirect}}const Hn=Vn({redirect:`/`});export{kn as $fetch,Nn as $file,Fn as $toast,_e as AuthService,bn as DASHBOARD_ROW_HEIGHT,Sn as Dashboard,xn as DashboardWidget,vn as DashboardWidgetData,yn as DashboardWidgetDefinition,Cn as DashboardWidgetDefinitionChart,on as DashboardWidgetRegistry,ve as FetchBrowserService,De as FetchNodeService,T as FetchService,qe as LayoutService,Je as LifecycleService,Ye as MenuItemEntity,Ze as MenuService,wn as ModuleEntity,Tn as PluginEntity,tt as ToastService,qt as UNHEAD_VUE_CONTAINER_KEY,fn as VEE_VALIDATE_CONTAINER_KEY,mn as VUE_CONTAINER_KEY,gn as VUE_ROUTER_CONTAINER_KEY,Xe as acl,an as auth,Bn as authGuard,$e as auto,En as autoRoutes,Ln as clsx,Rn as cn,we as config,E as container,zn as createAuthGuard,Vn as createGuestGuard,Se as createId,et as createRouter,sn as dashboardRegistry,Dn as defineColumns,On as defineFormFields,B as emmitter,W as extracRGB,kt as extractOKLCH,G as extractRGBA,D as fetcher,Hn as guestGuard,Dt as hexToRGB,K as hslToRgb,Q as layout,cn as lifecycle,ln as logger,un as menu,At as oklchToRgb,Pn as parseTo,It as provideDashboard,zt as provideDashboardWidget,J as rgbToHex,q as rgbToHsl,Y as rgbToOklch,Ot as rgbaToString,tn as route,nn as router,Qe as setupGuard,Gt as toTypedSchema,dn as toast,In as twMerge,Jt as unheadVue,Et as useBreakpoints,Pt as useColor,X as useColorType,Lt as useDashboard,Bt as useDashboardWidget,Ut as useFetchPagination,Wt as useForm,Mt as useHSL,Yt as useHead,Nt as useHex,Zt as useLayoutOptions,Qt as useLoading,en as useMenu,Z as useRGB,jt as useRGBA,rn as useRouteQuery,Vt as useState,Kt as useValibotForm,pn as veeValidate,hn as vue,_n as vueRouter};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiJGZldGNoIiwiQ29ra2llTWFwRW50aXR5IiwiTGlmZWN5Y2xlU2VydmljZSIsIlBlcm1pc3Npb24iLCJzdWJqZWN0IiwiY3JlYXRlU3ViamVjdCIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIkJhc2VFbnRpdHlNaXhpbiIsIk1vZHVsZSIsIlBsdWdpbkVudGl0eSIsIkJhc2VMaWZlY3ljbGVTZXJ2aWNlIiwiY3JlYXRlVnVlUm91dGVyIiwidXNlQnJlYWtwb2ludHMiLCJjb3JlVXNlQnJlYWtwb2ludHMiLCJkaSIsIiRmZXRjaCIsInZlZVZhbGlkYXRlVG9UeXBlZFNjaGVtYSIsInVzZVZlZVZhbGlkYXRlRm9ybSIsIkxheW91dE1hbmFnZXIiLCJ2dWVVc2VyUm91dGVRdWVyeSIsIkJhc2UiLCJCYXNlIiwiJG9yaWdpbmFsIiwidG9hc3QiLCJvcmlnaW5hbFR3TWVyZ2UiLCJvcmlnaW5hbENsc3giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9GZXRjaFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY29tcG9zZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9BdXRoU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvRmV0Y2hCcm93c2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mbGF0dGVuLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9jb25maWcudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL0ZldGNoTm9kZVNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy91cmxWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMva2V5VmFsdWVWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvcGFnaW5hdGlvblZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvZGFzaGJvYXJkTWV0YVNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy91c2VyU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUGVybWlzc2lvbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZVVwbG9hZFNlc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9lbW1pdHRlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGF5b3V0U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvTWVudUl0ZW1FbnRpdHkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYWNsLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9zZXJ2aWNlcy9NZW51U2VydmljZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZ3VhcmRzL3NldHVwR3VhcmQudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvY2xpZW50L3NlcnZpY2VzL1RvYXN0U2VydmljZS50cyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL3NoYXJlZC9kaXN0L2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWV1c2UvY29yZS9kaXN0L2luZGV4LmpzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VCcmVha3BvaW50LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VDb2xvci50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlRGFzaGJvYXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VEYXNoYm9hcmRXaWRnZXQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZVN0YXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VGZXRjaFBhZ2luYXRpb24udHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZUZvcm0udHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvdW5oZWFkVnVlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9jb21wb3NhYmxlcy91c2VIZWFkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2xheW91dC50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlTGF5b3V0T3B0aW9ucy50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlTG9hZGluZy50cyIsIi4uLy4uL3NyYy9jbGllbnQvY29tcG9zYWJsZXMvdXNlTWVudS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9yb3V0ZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9yb3V0ZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2NvbXBvc2FibGVzL3VzZVJvdXRlUXVlcnkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvYXV0aC50cyIsIi4uLy4uL3NyYy9jbGllbnQvcmVnaXN0cnkvRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvZGFzaGJvYXJkUmVnaXN0cnkudHMiLCIuLi8uLi9zcmMvY2xpZW50L2ZhY2FkZXMvbGlmZWN5Y2xlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL2xvZ2dlci50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy9tZW51LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3RvYXN0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3ZlZVZhbGlkYXRlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9mYWNhZGVzL3Z1ZS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZmFjYWRlcy92dWVSb3V0ZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERhdGEudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24udHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldC50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvRGFzaGJvYXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQudHMiLCIuLi8uLi9zcmMvY2xpZW50L2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9jbGllbnQvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy9hdXRvUGFnZXMudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2RlZmluZUNvbHVtbnMudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2RlZmluZUZvcm1GaWVsZHMudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2ZldGNoZXIudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL2ZpbGUudHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL3BhcnNlVG8udHMiLCIuLi8uLi9zcmMvY2xpZW50L3V0aWxzL3RvYXN0LnRzIiwiLi4vLi4vc3JjL2NsaWVudC91dGlscy90d01lcmdlLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvYXV0aEd1YXJkLnRzIiwiLi4vLi4vc3JjL2NsaWVudC9ndWFyZHMvZ3Vlc3RHdWFyZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbnRlcmZhY2UgVHJ5ZXIge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IGFueVxufVxuXG5pbnRlcmZhY2UgVHJ5ZXJBc3luYyB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+IHwgYW55XG59XG5cbnR5cGUgVHJ5Q2F0Y2hSZXN1bHQ8VCBleHRlbmRzIFRyeWVyPiA9IFtudWxsLCBSZXR1cm5UeXBlPFQ+XSB8IFtFcnJvciwgbnVsbF1cblxudHlwZSBUcnlDYXRjaEFzeW5jUmVzdWx0PFQgZXh0ZW5kcyBUcnllckFzeW5jPiA9IFtudWxsLCBBd2FpdGVkPFJldHVyblR5cGU8VD4+XSB8IFtFcnJvciwgbnVsbF1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeUNhdGNoPFQgZXh0ZW5kcyBUcnllckFzeW5jPih0cnllcjogVCk6IFByb21pc2U8VHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUPj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuXG50cnlDYXRjaC5zeW5jID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBUcnllcj4odHJ5ZXI6IFQpOiBUcnlDYXRjaFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3Z1ZS1zb25uZXInXG5pbXBvcnQgcXMgZnJvbSAncXMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hPcHRpb25zIGV4dGVuZHMgUmVxdWVzdEluaXQge1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PlxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRmV0Y2hTZXJ2aWNlJ1xuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZUVycm9yKHJlc3BvbnNlOiBSZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSB9KSlcblxuICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRvYXN0LmVycm9yKGRhdGEubWVzc2FnZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgfVxuXG4gICAgICAgIHRvYXN0LmVycm9yKCR0KCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVzc2FnZTogJHQoJ0ludGVybmFsIFNlcnZlciBFcnJvcicpLFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkVXJsKHVybDogc3RyaW5nLCBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHFzLnN0cmluZ2lmeShxdWVyeSwgeyBhcnJheUZvcm1hdDogJ2JyYWNrZXRzJyB9KVxuXG4gICAgICAgIHJldHVybiB1cmwgKyAnPycgKyBxdWVyeVN0cmluZ1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZFJlcXVlc3RJbml0KG9wdGlvbnM6IEZldGNoT3B0aW9ucyk6IFJlcXVlc3RJbml0IHtcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHsgLi4ub3B0aW9ucyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpXG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mZXRjaE9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZldGNoT3B0aW9uc1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBwYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnanNvbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpIGFzIFByb21pc2U8VD5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCkgYXMgUHJvbWlzZTxUPlxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPihfdXJsOiBzdHJpbmcsIF9vcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB0cnk8VCA9IGFueT4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IEZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cnlDYXRjaCgoKSA9PiB0aGlzLmZldGNoPFQ+KHVybCwgb3B0aW9ucykpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcG9zdDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHB1dDxUID0gYW55Pih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2g8VD4odXJsLCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVsZXRlPFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaDxUPih1cmwsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHN0YXR1czogbnVtYmVyID0gNTAwXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyID0gNTAwKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubmFtZSA9ICdCYXNlRXhjZXB0aW9uJ1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUVycm9yKGVycm9yOiBFcnJvcik6IEJhc2VFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IEJhc2VFeGNlcHRpb24oZXJyb3IubWVzc2FnZSwgNTAwKVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gXCIjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50c1wiXG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IG9iamVjdD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5cbnR5cGUgRW50cnlLZXkgPSBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3RvclxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGVudHJpZXMgPSBuZXcgTWFwPEVudHJ5S2V5LCBhbnk+KClcblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtTdHJpbmcoa2V5KV0gPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0S2V5KHBheWxvYWQ6IEVudHJ5S2V5KTogRW50cnlLZXkge1xuICAgICAgICBsZXQga2V5ID0gcGF5bG9hZFxuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGtleSA9IHBheWxvYWQubmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNDb25zdHJ1Y3RvciA9IHR5cGVvZiBwYXlsb2FkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N5bWJvbCdcblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAhKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogVGhlIGNvbnN0cnVjdG9yICR7cGF5bG9hZC5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuIENvbnNpZGVyIGFkZGluZyBhIHN0YXRpYyBwcm9wZXJ0eSBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgdG8gYXZvaWQgcG90ZW50aWFsIGNvbmZsaWN0cy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGtleSA9IChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KHBheWxvYWQ6IEVudHJ5S2V5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHZhbHVlKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwYXlsb2FkOiBFbnRyeUtleSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuaGFzKGtleSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KHBheWxvYWQ6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFbnRyeSB3aXRoIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kIGluIGNvbnRhaW5lci5gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQocGF5bG9hZDogRW50cnlLZXkpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2luZ2xldG9uPFQ+KGNsYXNzQ29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+KTogVCB7XG4gICAgICAgIGNvbnN0IGtleSA9IGNsYXNzQ29uc3RydWN0b3IubmFtZVxuICAgICAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBjbGFzc0NvbnN0cnVjdG9yKClcbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIG5ld0luc3RhbmNlKVxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2VcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChlbnRyaWVzOiBSZWNvcmQ8YW55LCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJveHk8VCA9IHVua25vd24+KGtleTogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5W3Byb3BdXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGVudHJ5KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVtwcm9wXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKF90YXJnZXQsIHByb3AsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgZW50cnlbcHJvcF0gPSB2YWx1ZVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkgYXMgVFxuICAgIH1cblxuICAgIHB1YmxpYyBrZXlzKCk6IEVudHJ5S2V5W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMua2V5cygpKVxuICAgIH1cbn1cbiIsImltcG9ydCBDb250YWluZXJTZXJ2aWNlIGZyb20gXCIjc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHNcIjtcblxuY29uc3QgY29udGFpbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5jbGllbnRDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuXG5nbG9iYWxUaGlzLmNsaWVudENvbnRhaW5lciA9IGNvbnRhaW5lclxuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXIgYXMgQ29udGFpbmVyU2VydmljZVxuIiwiaW1wb3J0IEZldGNoU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGZldGNoZXIgPSBjb250YWluZXIucHJveHk8RmV0Y2hTZXJ2aWNlPihGZXRjaFNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGZldGNoZXJcbiIsImltcG9ydCB0eXBlIHsgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gJy4vdHlwaW5nLnRzJ1xuXG5leHBvcnQgdHlwZSBBbnlDbGFzcyA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueVxuZXhwb3J0IHR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbmV4cG9ydCB0eXBlIE1peGluPFQ+ID0gKGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3RvcjxUPlxuXG4vKipcbiAqIENvbXBvc2VzIG11bHRpcGxlIG1peGlucyBpbnRvIGEgc2luZ2xlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkLlxuICogQWxsb3dzIGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS1saWtlIGJlaGF2aW9yIGJ5IGFwcGx5aW5nIG1peGlucyBzZXF1ZW50aWFsbHkuXG4gKiBcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gY29tcG9zZVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGluY2x1ZGVzIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZShUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlPFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3I8YW55PikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oLi4ubWl4aW5zOiBNKTogVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBjbGFzcyB7fSBhcyBhbnkpIGFzIGFueVxufVxuXG4vKipcbiAqIEFsdGVybmF0aXZlIGNvbXBvc2UgZnVuY3Rpb24gdGhhdCBzdGFydHMgd2l0aCBhIGJhc2UgY2xhc3NcbiAqIFxuICogQHBhcmFtIGJhc2VDbGFzcyAtIFRoZSBiYXNlIGNsYXNzIHRvIHN0YXJ0IHdpdGhcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGNsYXNzIHdpdGggYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlRW50aXR5LCBUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlV2l0aDxcbiAgICBUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yLFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KFxuICAgIGJhc2VDbGFzczogVEJhc2UsXG4gICAgLi4ubWl4aW5zOiBNXG4pOiBUQmFzZSAmIFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgYmFzZUNsYXNzIGFzIGFueSkgYXMgYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihTb3VyY2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIDxUVGFyZ2V0IGV4dGVuZHMgQ29uc3RydWN0b3I+KFRhcmdldDogVFRhcmdldCkge1xuICAgICAgICBjbGFzcyBNaXhlZCBleHRlbmRzIFRhcmdldCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZSguLi5hcmdzKVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgc291cmNlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29weSBtZXRob2RzXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhTb3VyY2UucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgTWl4ZWQucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU291cmNlLnByb3RvdHlwZSwga2V5KSFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTWl4ZWQgYXMgVFRhcmdldCAmIFRCYXNlXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuaW50ZXJmYWNlIENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zIHtcbiAgICBwYXJzZT86IChkYXRhOiBhbnkpID0+IGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFzZUVudGl0eShvcHRpb25zOiBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG9wdGlvbnMucGFyc2UoZGF0YSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udHJ1Y3Rvcj8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKGNvbnRydWN0b3IgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzIGFzIGFueSk/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9ICh0aGlzIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUaW1lc3RhbXBNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGNyZWF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICAgICAgcHVibGljIHVwZGF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTb2Z0RGVsZXRlTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBkZWxldGVkX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCB0eXBlIFJvbGUgZnJvbSAnLi9Sb2xlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBlbWFpbDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB1c2VybmFtZTogc3RyaW5nXG4gICAgcHVibGljIHBhc3N3b3JkPzogc3RyaW5nXG4gICAgcHVibGljIHZlcmlmaWVkX2F0PzogRGF0ZSB8IHN0cmluZyB8IG51bGxcblxuICAgIHB1YmxpYyBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyByb2xlcz86IFJvbGVbXVxuXG4gICAgcHVibGljIGdldCBpbml0aWFscygpe1xuICAgICAgICBjb25zdCBbZmlyc3ROYW1lLCBzZWNvbmROYW1lXSA9IHRoaXMubmFtZS5zcGxpdCgnICcpXG5cbiAgICAgICAgaWYgKCFzZWNvbmROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGEgPSBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICBjb25zdCBiID0gc2Vjb25kTmFtZVswXS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgICAgcmV0dXJuIGEgKyBiXG4gICAgfVxufVxuIiwiaW1wb3J0ICRmZXRjaCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvZmV0Y2hlci50cydcbmltcG9ydCBVc2VyIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cydcblxuaW50ZXJmYWNlIExvZ291dE9wdGlvbnMge1xuICAgIHJlZGlyZWN0Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBdXRoU2VydmljZSdcbiAgICBwdWJsaWMgdXNlcjogVXNlciB8IG51bGxcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QXV0aFNlcnZpY2U+ID0ge30pIHtcbiAgICAgICAgdGhpcy51c2VyID0gZGF0YS51c2VyIHx8IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9nb3V0KG9wdGlvbnM/OiBMb2dvdXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCAkZmV0Y2gudHJ5KCcvYXV0aC9sb2dvdXQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gb3B0aW9ucz8ucmVkaXJlY3QgfHwgJy8nXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGZXRjaE9wdGlvbnMgfSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBGZXRjaFNlcnZpY2UgZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoQnJvd3NlclNlcnZpY2UgZXh0ZW5kcyBGZXRjaFNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgZnVsbFVybCA9IHRoaXMuYnVpbGRVcmwodXJsLCBvcHRpb25zLnF1ZXJ5KVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB0aGlzLmJ1aWxkUmVxdWVzdEluaXQob3B0aW9ucylcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZ1bGxVcmwsIGZldGNoT3B0aW9ucylcblxuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlRXJyb3IocmVzcG9uc2UpXG5cbiAgICAgICAgICAgIHRocm93IHJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gYXdhaXQgdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuXG4gICAgICAgIHJldHVybiBwYXJzZWRcbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGNvb2tpZXM/OiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29va2llTWFwRW50aXR5J1xuXG4gICAgcHVibGljIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgcHJlZml4OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29va2llcyA9IGRhdGE/LmNvb2tpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnByZWZpeCA9IGRhdGE/LnByZWZpeCB8fCAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjb29raWVzIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChmdWxsTmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFdlIHdhbnQgdG8gYWxsb3cgYW55IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGhlcmUsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgY29va2llXG4gICAgLy8gIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHRoaXMuY29va2llcy5zZXQoZnVsbE5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5wcmVmaXhlZEtleSA9IGtleS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdW5wcmVmaXhlZEtleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4ob2JqOiBhbnksIHByZWZpeCA9ICcnLCByZXM6IGFueSA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBjb25zdCBpc0luZGV4ID0gL15cXGQrJC8udGVzdChrZXkpXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGlzSW5kZXggPyBgJHtwcmVmaXh9WyR7a2V5fV1gIDogcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZsYXR0ZW4odmFsdWUsIG5ld0tleSwgcmVzKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc1tuZXdLZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmZsYXR0ZW4ob2JqOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxufVxuIiwiZnVuY3Rpb24gdXVpZCgpe1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OFxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWQocHJlZml4ID0gJycpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgdXVpZCgpXG59IiwiaW1wb3J0IHsgZ2V0LCBzZXQsIGhhcywgdW5zZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmludGVyZmFjZSBFbnRyeSB7XG4gICAga2V5OiBzdHJpbmdcbiAgICB2YWx1ZTogYW55XG4gICAgc291cmNlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29uZmlnU2VydmljZSdcblxuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFbnRyeT5cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnOmJvb2xlYW4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoJzpib29sZWFuJywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21FbnRyaWVzKGVudHJpZXM6IFtzdHJpbmcsIGFueV1bXSwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtrZXldID0gZW50cnkudmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhcyh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlIGFzIFRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LnZhbHVlIDogZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXQodmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgZGVmYXVsdFZhbHVlKVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T25lPFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQ8VD4oa2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZSA9ICdydW50aW1lJyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgbGV0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHByaW1hcnlWYWx1ZSA9IHt9XG4gICAgICAgIH1cblxuICAgICAgICBzZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIHZhbHVlKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5VmFsdWUpIHJldHVyblxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdW5zZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6ICdydW50aW1lJyxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50cmllcy5jbGVhcigpXG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMudG9SZWNvcmQoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBjb25maWcgPSBjb250YWluZXIucHJveHk8Q29uZmlnU2VydmljZT4oQ29uZmlnU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYpIHtcbiAgICBnbG9iYWxUaGlzLmNvbmZpZyA9IGNvbmZpZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsImltcG9ydCBxcyBmcm9tICdxcycgXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFBhcmFtcyhyb3V0ZVBhdGg6IHN0cmluZywgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgcmVxdWVzdFNlZ21lbnRzID0gcmVxdWVzdFBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50ID0gcmVxdWVzdFNlZ21lbnRzW2ldXG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSAvLyBSZW1vdmUgdGhlICc6JyBwcmVmaXhcbiAgICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gcmVxdWVzdFNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgLy8gQ2FwdHVyZSBhbGwgcmVtYWluaW5nIHNlZ21lbnRzIGFzIGEgc2luZ2xlIHBhdGhcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICBwYXJhbXNbJyonXSA9IHJlbWFpbmluZ1NlZ21lbnRzLmpvaW4oJy8nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMV1cblxuICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgfVxuXG4gICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGZXRjaE9wdGlvbnMgfSBmcm9tICcuL0ZldGNoU2VydmljZS50cydcbmltcG9ydCBGZXRjaFNlcnZpY2UgZnJvbSAnLi9GZXRjaFNlcnZpY2UudHMnXG5pbXBvcnQgQ29ra2llTWFwRW50aXR5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IHsgcGFyc2VVcmxQYXJhbXMsIHBhcnNlVXJsUXVlcnkgfSBmcm9tICcjc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZldGNoTm9kZVNlcnZpY2UgZXh0ZW5kcyBGZXRjaFNlcnZpY2Uge1xuICAgIHB1YmxpYyBhc3luYyBmZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9ICF1cmwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKVxuXG4gICAgICAgIGlmICghaXNJbnRlcm5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hFeHRlcm5hbDxUPih1cmwsIG9wdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEludGVybmFsPFQ+KHVybCwgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZmV0Y2hFeHRlcm5hbDxUPih1cmw6IHN0cmluZywgb3B0aW9uczogRmV0Y2hPcHRpb25zID0ge30pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgZnVsbFVybCA9IHRoaXMuYnVpbGRVcmwodXJsLCBvcHRpb25zLnF1ZXJ5KVxuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB0aGlzLmJ1aWxkUmVxdWVzdEluaXQob3B0aW9ucylcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZ1bGxVcmwsIGZldGNoT3B0aW9ucylcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUVycm9yKHJlc3BvbnNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlc3BvbnNlPFQ+KHJlc3BvbnNlKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBmZXRjaEludGVybmFsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zOiBGZXRjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSAgY29udGFpbmVyLmdldDxhbnk+KCdSb3V0ZXJTZXJ2aWNlJylcbiAgICAgICAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgJ0dFVCdcbiAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXIucmVzb2x2ZShtZXRob2QsIHVybClcbiAgICAgICAgY29uc3QgY29va2llID0gbmV3IENva2tpZU1hcEVudGl0eSh7XG4gICAgICAgICAgICBwcmVmaXg6IGNvbmZpZy5nZXQoJ2Nvb2tpZS5wcmVmaXgnLCAnJylcbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIGlmIChjb250YWluZXIuaGFzKCdjb29raWVzJykpIHtcbiAgICAgICAgICAgIGNvb2tpZS5sb2FkKGNvbnRhaW5lci5nZXQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oJ2Nvb2tpZXMnKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcm91dGUgfHwgIXJvdXRlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgbm90IGZvdW5kIGZvciAke21ldGhvZH0gJHt1cmx9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJvdXRlci5leGVjdXRlKHJvdXRlLCB7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyc2VVcmxQYXJhbXMocm91dGUucGF0aCwgdXJsKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5IHx8IHBhcnNlVXJsUXVlcnkodXJsKSxcbiAgICAgICAgICAgIGJvZHk6IG9wdGlvbnMuZGF0YSB8fCBvcHRpb25zLmJvZHksXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZC50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgY29va2llOiBjb29raWVcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIFByb21pc2U8VD5cbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hpbGQob3B0aW9uczogYW55KTogTG9nZ2VyU2VydmljZSB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGNyZWF0ZUlkLCB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL2luZGV4LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyTGlzdGVuZXJPcHRpb25zIHtcbiAgICBldmVudDogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyTGlzdGVuZXIge1xuICAgIChkYXRhOiBhbnksIG9wdGlvbnM6IEVtbWl0dGVyTGlzdGVuZXJPcHRpb25zKTogdm9pZFxufVxuXG5pbnRlcmZhY2UgRW1taXR0ZXJIYW5kbGVyIHtcbiAgICBpZDogc3RyaW5nXG4gICAgZXZlbnQ6IHN0cmluZ1xuICAgIGxpc3RlbmVyOiBFbW1pdHRlckxpc3RlbmVyXG4gICAgb3JpZ2luYWxMaXN0ZW5lcj86IEVtbWl0dGVyTGlzdGVuZXJcbn1cblxuaW50ZXJmYWNlIE9uT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICB1bmlxdWU/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBPbkRlYm91bmNlT3B0aW9ucyBleHRlbmRzIE9uT3B0aW9ucyB7XG4gICAgZGVib3VuY2U/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VtbWl0dGVyU2VydmljZSdcblxuICAgIHB1YmxpYyBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhblxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEVtbWl0dGVyU2VydmljZTxFdmVudHM+KG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb3B0aW9ucz8uaWQgfHwgY3JlYXRlSWQoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy51bmlxdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuaGFuZGxlcnMuc29tZShoID0+IChoLmV2ZW50ID09PSBldmVudCAmJiBoLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgfHwgaC5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXI6IEVtbWl0dGVySGFuZGxlciA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIGFkZGVkJywgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoYXJnczogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGFyZ3MsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIHRoaXMub2ZmKGV2ZW50LCB3cmFwcGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub24oZXZlbnQsIHdyYXBwZXIgYXMgYW55LCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKGxpc3RlbmVyLCBvcHRpb25zPy5kZWJvdW5jZSB8fCAzMDApXG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGRlYm91bmNlZCBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIub3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbkFueU9mPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50czogS1tdLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJbXVxuICAgIHB1YmxpYyBvbkFueU9mKGV2ZW50czogc3RyaW5nW10sIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGxpc3RlbmVyIGFzIGFueSwgb3B0aW9ucylcblxuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlcnNcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4ge1xuICAgICAgICAgICAgaWYgKGguZXZlbnQgPT09IGV2ZW50ICYmIChoLmxpc3RlbmVyID09PSBsaXN0ZW5lciB8fCBoLm9yaWdpbmFsTGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciByZW1vdmVkJywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0cnlDYXRjaC5zeW5jKCgpID0+IGhhbmRsZXIubGlzdGVuZXIoYXJncywgeyBldmVudCB9KSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgYXJnczogRXZlbnRzW0tdKTogUHJvbWlzZTx2b2lkPlxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogUHJvbWlzZTx2b2lkPlxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50IGFuZCB3YWl0Jywge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5saXN0ZW5lcihhcmdzLCB7IGV2ZW50IH0pXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0QnlFdmVudChldmVudDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUocGF5bG9hZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiAhaWRzLmluY2x1ZGVzKGguaWQpKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlcnMgcmVtb3ZlZCcsIHsgaWRzIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWxsIGhhbmRsZXJzIGNsZWFyZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0hhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggPiAwXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlSG9vayB7XG4gICAgcHVibGljIGhvb2tfaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBob29rX2FsaWFzZXM/OiBzdHJpbmdbXVxuICAgIHB1YmxpYyBvcmRlcj86IG51bWJlclxuICAgIHB1YmxpYyBzdWJob29rcz86IExpZmVjeWNsZUhvb2tbXVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSByZWdpc3RlciAqL1xuICAgIHB1YmxpYyBhc3luYyBvblJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBsb2FkICovXG4gICAgcHVibGljIGFzeW5jIG9uTG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgYm9vdCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHNodXRkb3duICovXG4gICAgcHVibGljIGFzeW5jIG9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgeyBvcmRlckJ5IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG50eXBlIExpZmVjeWNsZU1ldGhvZCA9ICdyZWdpc3RlcicgfCAnbG9hZCcgfCAnYm9vdCcgfCAnc2h1dGRvd24nXG5cbmludGVyZmFjZSBMaXN0T3B0aW9ucyB7XG4gICAgaW5jbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgZXhjbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGhvb2tzPzogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTGlmZWN5Y2xlU2VydmljZSdcblxuICAgIHB1YmxpYyBob29rczogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IExpZmVjeWNsZVNlcnZpY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmhvb2tzID0gZGF0YS5ob29rcyA/PyBuZXcgTWFwKClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IgPSBkYXRhLm9uRXJyb3JcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPbkVycm9yKGhhbmRsZXI6IFJlcXVpcmVkPExpZmVjeWNsZVNlcnZpY2VPcHRpb25zPlsnb25FcnJvciddKSB7XG4gICAgICAgIHRoaXMub25FcnJvciA9IGhhbmRsZXJcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkVycm9yKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGNvbnRleHQgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaG9vayAke2NvbnRleHQubWV0aG9kfSAoJHtjb250ZXh0Lmhvb2tJZH0pOmAsIGVycm9yKVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXBBbGlhc2VzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuICAgICAgICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGFsbCkge1xuICAgICAgICAgICAgaWYgKGFyZ3MuaW5jbHVkZXMoaG9vay5ob29rX2lkKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5ob29rX2FsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkQWxpYXMgPSBob29rLmhvb2tfYWxpYXNlcy5maW5kKGFsaWFzID0+IGFyZ3MuaW5jbHVkZXMoYWxpYXMpKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRBbGlhcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KG9wdGlvbnM/OiBMaXN0T3B0aW9ucykge1xuICAgICAgICBsZXQgaG9va3MgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmV4Y2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuZXhjbHVkZSkgPyBvcHRpb25zLmV4Y2x1ZGUgOiBbb3B0aW9ucy5leGNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+ICFpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pbmNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmluY2x1ZGUpID8gb3B0aW9ucy5pbmNsdWRlIDogW29wdGlvbnMuaW5jbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiBpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzID0gb3JkZXJCeShob29rcywgWydvcmRlciddLCBbJ2FzYyddKVxuXG4gICAgICAgIHJldHVybiBob29rc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoLi4ucGF5bG9hZDogKExpZmVjeWNsZUhvb2sgfCBDb25zdHJ1Y3RvcjxMaWZlY3ljbGVIb29rPilbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnN0YW5jZXM6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBheWxvYWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKG5ldyBpdGVtKCkpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goaXRlbSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGlmICghaG9vay5ob29rX2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignU2tpcHBpbmcgaG9vayB3aXRob3V0IGhvb2tfaWQ6JywgaG9vaylcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmhvb2tzLnNldChob29rLmhvb2tfaWQsIGhvb2spXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FkZCAnICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5zdWJob29rcykge1xuICAgICAgICAgICAgICAgIGhvb2suc3ViaG9va3MuZm9yRWFjaChzdWJob29rID0+IHRoaXMuYWRkKHN1Ymhvb2spKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRNZXRob2QobWV0aG9kOiBMaWZlY3ljbGVNZXRob2QsIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBob29rcyA9IHRoaXMubGlzdChvcHRpb25zKSBcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGVtaXR0aW5nICR7bWV0aG9kfSBmb3IgaG9va3M6YCwge1xuICAgICAgICAgICAgICAgIGhvb2tzOiBob29rcy5tYXAoaG9vayA9PiBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIHRoaXMubGlzdChvcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5yZWdpc3RlcigpLCBob29rLm9uUmVnaXN0ZXIoKV0pLFxuICAgICAgICAgICAgICAgIGxvYWQ6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmxvYWQoKSwgaG9vay5vbkxvYWQoKV0pLFxuICAgICAgICAgICAgICAgIGJvb3Q6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmJvb3QoKSwgaG9vay5vbkJvb3QoKV0pLFxuICAgICAgICAgICAgICAgIHNodXRkb3duOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5zaHV0ZG93bigpLCBob29rLm9uU2h1dGRvd24oKV0pLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gbWFwW21ldGhvZF0oKSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yLCB7IGhvb2tJZDogaG9vay5ob29rX2lkLCBtZXRob2QgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke21ldGhvZH0gYCArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0KHBheWxvYWQ6IExpZmVjeWNsZU1ldGhvZCB8IExpZmVjeWNsZU1ldGhvZFtdLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0TWV0aG9kKG1ldGhvZCwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbihtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgaGFuZGxlcjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgICAgICBjb25zdCBoID0gbmV3IExpZmVjeWNsZUhvb2soKVxuXG4gICAgICAgIGguaG9va19pZCA9IGBjdXN0b206JHttZXRob2R9OiR7RGF0ZS5ub3coKX1gXG5cbiAgICAgICAgaFttZXRob2RdID0gaGFuZGxlclxuXG4gICAgICAgIHRoaXMuYWRkKGgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBxcyBmcm9tICdxcydcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2Lm51bWJlcigpXSksXG4gICAgdi50cmFuc2Zvcm0oTnVtYmVyKSxcbiAgICB2LmludGVnZXIoKSxcbilcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5ib29sZWFuKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPT09IHRydWUgfHwgdiA9PT0gJ3RydWUnKSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgaW5zdGFuY2VvZiBEYXRlID8gdiA6IG5ldyBEYXRlKHYpKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPyBmb3JtYXQodiwgJ3l5eXktTU0tZGQnKSA6IHYpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZXRpbWUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHtcbiAgICAgICAgaWYgKCF2KSByZXR1cm4gdlxuXG4gICAgICAgIGlmICh2ID09PSAnbnVsbCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHYpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0KHYsICd5eXl5LU1NLWRkIEhIOm1tJylcbiAgICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5ID0gPFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+KHNjaGVtYTogVCA9IHYuYW55KCkgYXMgYW55IGFzIFQpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmFycmF5KHYuc3RyaW5nKCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnNwbGl0KCcsJykpLFxuICAgIHYuYXJyYXkoc2NoZW1hKSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5TnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIGFycmF5KCksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdmFsdWUubWFwKE51bWJlcikpLFxuKVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHFzLnBhcnNlKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHNldChyZXN1bHQsIGtleSwgZ2V0KHZhbHVlLCBrZXkpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pLFxuKVxuXG5leHBvcnQgZnVuY3Rpb24gdXJsKCkge1xuICAgIHJldHVybiBvYmplY3QoKVxufVxuXG51cmwubnVtYmVyID0gbnVtYmVyXG51cmwuYm9vbGVhbiA9IGJvb2xlYW4gXG51cmwuZGF0ZSA9IGRhdGUgXG51cmwuZGF0ZXRpbWUgPSBkYXRldGltZVxudXJsLmFycmF5ID0gYXJyYXlcbnVybC5hcnJheU51bWJlciA9IGFycmF5TnVtYmVyXG51cmwub2JqZWN0ID0gb2JqZWN0XG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnIFxuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5leHBvcnQgY29uc3Qga2V5VmFsdWUgPSAoKSA9PiB2LnBpcGUodi5zdHJpbmcoKSwgdi50cmFuc2Zvcm0oKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW50cmllcyA9IHZhbHVlLnNwbGl0KC9bO1xcbl0vKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5maWx0ZXIobCA9PiBsLmluY2x1ZGVzKCc9JykpXG4gICAgICAgIC5tYXAobCA9PiBsLnRyaW0oKS5zcGxpdCgnPScpKVxuXG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGxldCBwYXJzZWRWYWx1ZTogYW55ID0gdmFsdWVcblxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnYm9vbDonKSkge1xuICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdib29sOicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBwYXJzZWRWYWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59KSlcbiIsImltcG9ydCB7IG51bWJlciwgYXJyYXkgfSBmcm9tICcuL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uUGFyYW1zIHtcbiAgICBtYXhMaW1pdD86IG51bWJlclxuICAgIG9yZGVyRmllbGRzPzogc3RyaW5nW11cbn1cblxuXG5leHBvcnQgY29uc3QgYmFzZSA9IChvcHRpb25zOiBQYWdpbmF0aW9uUGFyYW1zID0ge30pID0+IHYub2JqZWN0KHtcbiAgICBwYWdlOiB2Lm9wdGlvbmFsKG51bWJlcigpLCAxKSxcbiAgICBsaW1pdDogdi5vcHRpb25hbChudW1iZXIoKSwgb3B0aW9ucy5tYXhMaW1pdCB8fCAxMDApLFxuICAgIG9yZGVyQnk6IHYubnVsbGlzaChvcHRpb25zLm9yZGVyRmllbGRzID8gYXJyYXkodi5waWNrbGlzdChvcHRpb25zLm9yZGVyRmllbGRzKSkgOiBhcnJheSh2LnN0cmluZygpKSwgW10pLFxuICAgIG9yZGVyRGlyZWN0aW9uOiB2Lm51bGxpc2goYXJyYXkodi51bmlvbihbdi5saXRlcmFsKCdhc2MnKSwgdi5saXRlcmFsKCdkZXNjJyldKSksIFtdKSxcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBwYWdpbmF0aW9uKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBiYXNlKG9wdGlvbnMpXG59XG5cbnBhZ2luYXRpb24uYmFzZSA9IGJhc2VcbiIsImV4cG9ydCAqIGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9rZXlWYWx1ZVZhbGlkYXRvci50cydcbmV4cG9ydCAqIGZyb20gJy4vcGFnaW5hdGlvblZhbGlkYXRvci50cydcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCAqIGFzIGV4dHJhcyBmcm9tICcjc2hhcmVkL3ZhbGlkYXRvcnMvaW5kZXgudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCB0eXBlIFZhbGlib3QgPSB0eXBlb2YgdiAmIHsgZXh0cmFzOiB0eXBlb2YgZXh0cmFzIH1cblxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYSA9IHYuQmFzZVNjaGVtYTx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cbmV4cG9ydCB0eXBlIFZhbGlib3RPYmplY3RTY2hlbWEgPSB2Lk9iamVjdFNjaGVtYTxhbnksIGFueT5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWFBc3luYyA9IHYuQmFzZVNjaGVtYUFzeW5jPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckNhbGxiYWNrPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPiB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+ID0ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yUmVzdWx0PFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+ID0gdi5JbmZlck91dHB1dDxUPlxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVBheWxvYWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPSBWYWxpYm90U2NoZW1hPiA9IFZhbGlkYXRvckNhbGxiYWNrPFQ+IHwgVFxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJlc3VsdDxUIGV4dGVuZHMgVmFsaWRhdGVQYXlsb2FkPiA9XG4gICAgVCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPyB2LkluZmVyT3V0cHV0PFQ+IDpcbiAgICBUIGV4dGVuZHMgVmFsaWRhdG9yQ2FsbGJhY2s8aW5mZXIgVT4gPyB2LkluZmVyT3V0cHV0PFU+IDpcbiAgICB1bmtub3duXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVmFsaWRhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyB2OiBWYWxpYm90ID0ge1xuICAgICAgICAuLi52LFxuICAgICAgICBleHRyYXMsXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4oY2I6IFZhbGlkYXRvckNhbGxiYWNrPFQ+KSB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnYpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmZsYXR0ZW4ucm9vdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ubmVzdGVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmxhdHRlbi5uZXN0ZWQpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5IGFzIFtzdHJpbmcsIHN0cmluZ1tdXVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4udmFsdWUubWFwKCh2KSA9PiBgJHtrZXl9OiAke3Z9YCkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmxlbmd0aCA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiAnVmFsaWRhdGlvbiBmYWlsZWQnXG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24obWVzc2FnZSwgNDIyKVxuXG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcidcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBtZXNzYWdlcywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQ+IHwgVCkge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSBhd2FpdCB2LnNhZmVQYXJzZUFzeW5jKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5yb290LFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ubmVzdGVkLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGRldGFpbHMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IFZhbGlkYXRvclNlcnZpY2UgZnJvbSBcIi4uL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2VcIlxuXG5leHBvcnQgY29uc3QgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvclNlcnZpY2UoKVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0b3JcbiIsImltcG9ydCB0eXBlIHsgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZE1ldGFTY2hlbWEgPSBWYWxpZGF0b3JSZXN1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgZGFzaGJvYXJkTWV0YVNjaGVtYT4+XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoYm9hcmRNZXRhU2NoZW1hKCkge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgZGFzaGJvYXJkX2lkOiB2Lm51bWJlcigpLFxuICAgICAgICBuYW1lOiB2LnN0cmluZygpLFxuICAgICAgICB2YWx1ZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB9KSlcbn1cblxuZGFzaGJvYXJkTWV0YVNjaGVtYS5jcmVhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5waWNrKGRhc2hib2FyZE1ldGFTY2hlbWEoKSwgWydkYXNoYm9hcmRfaWQnLCAnbmFtZScsICd2YWx1ZSddKSlcblxuZGFzaGJvYXJkTWV0YVNjaGVtYS51cGRhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5wYXJ0aWFsKGRhc2hib2FyZE1ldGFTY2hlbWEuY3JlYXRlKSlcbiIsImltcG9ydCB0eXBlIHsgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuXG5leHBvcnQgdHlwZSBEYXNoYm9hcmRTY2hlbWEgPSBWYWxpZGF0b3JSZXN1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgZGFzaGJvYXJkU2NoZW1hPj5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZFNjaGVtYSgpIHtcbiAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgICAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICBkZWxldGVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuXG4gICAgICAgIG1ldGFzOiB2Lm9wdGlvbmFsKHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpKSxcbiAgICB9KSlcbn1cblxuZGFzaGJvYXJkU2NoZW1hLmNyZWF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBpY2soZGFzaGJvYXJkU2NoZW1hKCksIFsnbmFtZScsICdkZXNjcmlwdGlvbiddKSlcblxuZGFzaGJvYXJkU2NoZW1hLnVwZGF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBhcnRpYWwoZGFzaGJvYXJkU2NoZW1hLmNyZWF0ZSkpXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25Bc3NpZ25tZW50ID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBwZXJtaXNzaW9uX2lkOiB2Lm51bWJlcigpLFxuICAgIGFzc2lnbmFibGVfdHlwZTogdi5zdHJpbmcoKSxcbiAgICBhc3NpZ25hYmxlX2lkOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGFjdGlvbjogdi5zdHJpbmcoKSxcbiAgICBzdWJqZWN0OiB2LnN0cmluZygpLFxuICAgIGNvbmRpdGlvbnM6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBUb2tlbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHRva2VuU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgdG9rZW5TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB0eXBlOiB2LnN0cmluZygpLFxuICAgIHVzZXJfaWQ6IHYubnVtYmVyKCksXG4gICAgdG9rZW46IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5mdW5jdGlvbiB1c2VyU2NoZW1hKCkge1xuICAgIHJldHVybiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBuYW1lOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgICAgICBlbWFpbDogdi5waXBlKHYuc3RyaW5nKCksIHYuZW1haWwoKSksXG4gICAgICAgIHBhc3N3b3JkOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoNikpLFxuICAgICAgICB1c2VybmFtZTogdi5waXBlKHYuc3RyaW5nKCksIHYucmVnZXgoL15bYS16QS1aMC05Xy1dKyQvKSksXG4gICAgICAgIHZlcmlmaWVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgICAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICBkZWxldGVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpXG4gICAgfSlcbn1cblxudXNlclNjaGVtYS5jcmVhdGUgPSAoKSA9PiB2Lm9taXQodXNlclNjaGVtYSgpLCBbJ2lkJywgJ3ZlcmlmaWVkX2F0JywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdkZWxldGVkX2F0J10pXG51c2VyU2NoZW1hLnVwZGF0ZSA9ICgpID0+IHYucGFydGlhbCh1c2VyU2NoZW1hLmNyZWF0ZSgpKVxuXG5leHBvcnQgZGVmYXVsdCB1c2VyU2NoZW1hXG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbmVyIHtcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW1pdEhvb2soY29uc3RydWN0b3I6IGFueSwgZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHsgICAgICAgICAgICAgICAgXG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGwgb2YgbGlzdGVuZXJzLmZpbHRlcigobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCkpIHtcbiAgICAgICAgYXdhaXQgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uSG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBjb25zdCBleGlzdHMgPSBsaXN0ZW5lcnMuZmluZCgobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyIFxuICAgIH0pXG5cbiAgICBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgPSBsaXN0ZW5lcnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhvb2tzU3RhdGljPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QuYXBwbHkodGhpcy5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgbGlzdGVuZXJzID0gW10gYXMgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPlxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uSG9vayh0aGlzLCBldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0SG9vayh0aGlzLCBldmVudCwgLi4uYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSG9va3M8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIGxpc3RlbmVyczogTGlzdGVuZXJbXVxuXG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciBcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuZmluZEluZGV4KChsKSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50KVxuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHB1YmxpYyBhc3luYyBlbWl0QXN5bmMoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkhvb2tzU3RhdGljLmVtaXQgPSBlbWl0SG9va1xuSG9va3NTdGF0aWMub24gPSBvbkhvb2tcbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nXG4gICAgcHVibGljIHN1YmplY3Q6IHN0cmluZ1xuICAgIHB1YmxpYyBhY3Rpb246IHN0cmluZ1xuICAgIHB1YmxpYyBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgYW55PiA9IG51bGxcblxuICAgIHB1YmxpYyBnZXQgZWRpdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiA9PT0gJ2N1c3RvbSdcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcnNlZENvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSB0cnlDYXRjaC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25kaXRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuY29uZGl0aW9ucyBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBlcnJvciA/IHt9IDoganNvblxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHksIHN1YmplY3QgYXMgY3JlYXRlU3ViamVjdCB9IGZyb20gJ0BjYXNsL2FiaWxpdHknXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQWNsRW50aXR5J1xuXG4gICAgcHVibGljIGFiaWxpdHk6IFJldHVyblR5cGU8dHlwZW9mIGRlZmluZUFiaWxpdHk+XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QWNsRW50aXR5PiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gZGF0YS5wZXJtaXNzaW9ucyB8fCBbXVxuICAgICAgICBjb25zdCBwZXJtcyA9IHBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4gUGVybWlzc2lvbi5mcm9tKHBlcm1pc3Npb24pKVxuXG4gICAgICAgIFxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybXNcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFiaWxpdHkgPSBkZWZpbmVBYmlsaXR5KChjYW4pID0+IHtcbiAgICAgICAgICAgIHBlcm1zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYW4ocGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uc3ViamVjdCwgcGVybWlzc2lvbi5wYXJzZWRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbihhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2Fubm90KGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3ViamVjdChzdWJqZWN0OiBzdHJpbmcsIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG4gICAgfVxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZHJpdmU6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1ldHlwZTogc3RyaW5nXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBjbGllbnRfbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVibGljOiBib29sZWFuXG5cbiAgICAvLyBkeW5hbWljXG4gICAgcHVibGljIHVybD86IHN0cmluZ1xuICAgIHB1YmxpYyBtZXRhcz86IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIHB1YmxpYyBpc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1ldHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBmaWxlX2lkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcgfCBudWxsXG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2Vzc2lvbiBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWVfdHlwZXM6IHN0cmluZ1xuICAgIHB1YmxpYyBtYXhfc2l6ZTogbnVtYmVyXG5cbiAgICAvLyBkeW5hbWljIFxuICAgIHB1YmxpYyB1cGxvYWRfdXJsPzogc3RyaW5nXG4gICAgcHVibGljIGNyZWF0ZV9maWxlX3VybD86IHN0cmluZ1xuXG4gICAgcHVibGljIGdldFBhcnNlZE1pbWVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkTWltZVR5cGUobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmdldFBhcnNlZE1pbWVUeXBlcygpXG4gICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMobWltZVR5cGUpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygnKi8qJylcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkU2l6ZShzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNpemUgPD0gdGhpcy5tYXhfc2l6ZVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnQge1xuICAgIGZyb206IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHlwZTogJ2dsb2JhbF9pbXBvcnQnXG59XG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGQge1xuICAgIGltcG9ydHM/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0W11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlTWFuaWZlc3QgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYXV0aG9yPzogc3RyaW5nXG4gICAgcHVibGljIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgYnVpbGQ/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYWxpYXNlczogc3RyaW5nW11cbiAgICBwdWJsaWMgdmVyc2lvbl9jaGFubmVsOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbl9hdmFpbGFibGVfY2hhbm5lbHM6IHN0cmluZ1tdXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5pbXBvcnQgeyBFbW1pdHRlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuXG5jb25zdCBlbW1pdHRlciA9IGNvbnRhaW5lci5wcm94eTxFbW1pdHRlclNlcnZpY2U+KEVtbWl0dGVyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZW1taXR0ZXJcbiIsImltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tIFwiI3NoYXJlZC9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gXCJ2dWVcIlxuaW1wb3J0IGVtbWl0dGVyIGZyb20gJy4uL2ZhY2FkZXMvZW1taXR0ZXIudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExheW91dFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xheW91dFNlcnZpY2UnXG4gICAgcHVibGljIGNvbXBvbmVudHM6IE1hcDxzdHJpbmcsIERlZmluZUNvbXBvbmVudD4gPSBuZXcgTWFwKClcbiAgICBwdWJsaWMgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgcHVibGljIGN1cnJlbmRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgIHB1YmxpYyBzZXRDdXJyZW50KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jdXJyZW5kSWQgPSBpZFxuXG4gICAgICAgIGVtbWl0dGVyLmVtaXQoJ2xheW91dDpjaGFuZ2UnLCBpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKG5hbWU6IHN0cmluZywgY29tcG9uZW50OiBEZWZpbmVDb21wb25lbnQsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnNldChuYW1lLCBjb21wb25lbnQpXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRzLmhhcyhuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jb21wb25lbnRzLmdldChuYW1lKVxuXG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBMYXlvdXQgJHtuYW1lfSBub3QgZm91bmRgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbmRJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLmN1cnJlbmRJZClcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICAgICAgZW1taXR0ZXIuZW1pdCgnbGF5b3V0OnNldC1vcHRpb25zJywgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnO1xuaW1wb3J0IEJhc2VMaWZlY3ljbGVTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIGFkZEltcG9ydHMoaW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55Pil7XG4gICAgICAgIGNvbnN0IGhvb2tzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMoaW1wb3J0cykpIHtcbiAgICAgICAgICAgIGNvbnN0IEhvb2tDbGFzcyA9IG1vZC5kZWZhdWx0IHx8IG1vZFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSG9va0NsYXNzKCkgYXMgTGlmZWN5Y2xlSG9va1xuXG4gICAgICAgICAgICBpbnN0YW5jZS5ob29rX2lkID0gaW5zdGFuY2UuaG9va19pZCB8fCBuYW1lXG5cbiAgICAgICAgICAgIGhvb2tzLnB1c2goaW5zdGFuY2UpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcy5mb3JFYWNoKGhvb2sgPT4gdGhpcy5hZGQoaG9vaykpXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVudUl0ZW0gZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nXG4gICAgcHVibGljIGxheW91dDogc3RyaW5nXG5cbiAgICBwdWJsaWMgdG8/OiBzdHJpbmdcblxuICAgIHB1YmxpYyB0YXJnZXQ/OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCdcbiAgICBwdWJsaWMgZ3JvdXA/OiBzdHJpbmdcbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgaWNvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBwYXJlbnQ/OiBzdHJpbmdcbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBBY2xFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMnXG5cbmNvbnN0IGFjbCA9IGNvbnRhaW5lci5wcm94eTxBY2xFbnRpdHk+KEFjbEVudGl0eSlcblxuZXhwb3J0IGRlZmF1bHQgYWNsXG4iLCJpbXBvcnQgTWVudUl0ZW0gZnJvbSAnI2NsaWVudC9lbnRpdGllcy9NZW51SXRlbUVudGl0eS50cydcbmltcG9ydCBhY2wgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2FjbC50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmlsdGVyIHtcbiAgICBsYXlvdXQ/OiBzdHJpbmdcbiAgICBncm91cD86IHN0cmluZ1xuICAgIHBhcmVudD86IHN0cmluZ1xuICAgIGFsbG93ZWQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbnVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdNZW51U2VydmljZSdcblxuICAgIHB1YmxpYyBpdGVtczogTWFwPHN0cmluZywgTWVudUl0ZW0+ID0gbmV3IE1hcCgpXG5cbiAgICBwdWJsaWMgYWRkKC4uLml0ZW06IE9taXQ8UGFydGlhbDxNZW51SXRlbT4sICdtZXJnZScgfCAnZnJvbSc+W10pIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW0pIHtcblxuICAgICAgICAgICAgaWYgKCFpLmlkKSB7XG4gICAgICAgICAgICAgICAgaS5pZCA9IEpTT04uc3RyaW5naWZ5KGkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KGkuaWQsIE1lbnVJdGVtLmZyb20oaSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKGlkOiBNZW51SXRlbVsnaWQnXSkge1xuICAgICAgICB0aGlzLml0ZW1zLmRlbGV0ZShpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChmaWx0ZXI6IExpc3RGaWx0ZXIgPSB7fSkge1xuICAgICAgICBsZXQgaXRlbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odGhpcy5pdGVtcy52YWx1ZXMoKSkpKSBhcyBNZW51SXRlbVtdXG5cblxuICAgICAgICBpZiAoZmlsdGVyLmxheW91dCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLmxheW91dCA9PT0gZmlsdGVyLmxheW91dClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuZ3JvdXApIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gaS5ncm91cCA9PT0gZmlsdGVyLmdyb3VwIHx8IGkucGFyZW50ID09PSBmaWx0ZXIuZ3JvdXApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyLnBhcmVudCkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBpLnBhcmVudCA9PT0gZmlsdGVyLnBhcmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIuYWxsb3dlZCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci5hbGxvd2VkID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGFjbC5jYW4oJ3ZpZXcnLCBpKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQSA9IGEub3JkZXIgPyBhLm9yZGVyIDogOThcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQiA9IGIub3JkZXIgPyBiLm9yZGVyIDogOThcblxuICAgICAgICAgICAgcmV0dXJuIG9yZGVyQSAtIG9yZGVyQlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5jb25zdCBzZXR1cEd1YXJkOiBOYXZpZ2F0aW9uR3VhcmQgPSAodG8pID0+IHtcbiAgICBjb25zdCBzZXR1cCA9IGNvbmZpZy5nZXQ8YW55Pignc2V0dXAnKVxuICAgIFxuICAgIGNvbnN0IGNvbXBsZXRlZCA9ICFzZXR1cD8ubmVlZF9kYXRhYmFzZSAmJiAhc2V0dXA/Lm5lZWRfdXNlcnNcbiAgICBcbiAgICBpZiAoY29tcGxldGVkICYmIHRvLnBhdGguc3RhcnRzV2l0aCgnL3NldHVwJykpIHtcbiAgICAgICAgcmV0dXJuICcvJ1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIFxuICAgIGlmICghdG8ucGF0aC5zdGFydHNXaXRoKCcvc2V0dXAnKSkge1xuICAgICAgICByZXR1cm4gJy9zZXR1cCdcbiAgICB9XG4gICAgXG4gICAgaWYgKHRvLnBhdGggPT09ICcvc2V0dXAnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfSAgICBcblxuICAgIGlmIChzZXR1cD8ubmVlZF9kYXRhYmFzZSkge1xuICAgICAgICByZXR1cm4gdG8ucGF0aCAhPT0gJy9zZXR1cC9kYXRhYmFzZScgPyAnL3NldHVwL2RhdGFiYXNlJyA6IHRydWVcbiAgICB9XG5cbiAgICBpZiAoc2V0dXA/Lm5lZWRfdXNlcnMpIHtcbiAgICAgICAgcmV0dXJuIHRvLnBhdGggIT09ICcvc2V0dXAvdXNlcicgPyAnL3NldHVwL3VzZXInIDogdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldHVwR3VhcmRcbiIsImltcG9ydCB7XG4gICAgY3JlYXRlUm91dGVyIGFzIGNyZWF0ZVZ1ZVJvdXRlcixcbiAgICBjcmVhdGVNZW1vcnlIaXN0b3J5LFxuICAgIGNyZWF0ZVdlYkhpc3Rvcnlcbn0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgTmF2aWdhdGlvbkd1YXJkLCBSb3V0ZXIgYXMgVnVlUm91dGVyIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCB0eXBlIHsgUm91dGVSZWNvcmRSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHR5cGUgeyBEZWZpbmVDb21wb25lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgc2V0dXBHdWFyZCBmcm9tICcjY2xpZW50L2d1YXJkcy9zZXR1cEd1YXJkLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlciBleHRlbmRzIFZ1ZVJvdXRlciB7XG4gICAgYXV0bzogdHlwZW9mIGF1dG87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b09wdGlvbnMge1xuICAgIGd1YXJkcz86IE5hdmlnYXRpb25HdWFyZFtdIHwgKChyZWNvcmQ6IFJvdXRlUmVjb3JkUmF3KSA9PiBOYXZpZ2F0aW9uR3VhcmRbXSk7XG4gICAgc3RyaXA/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIGV4Y2x1ZGU/OiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICByZWZpbmU/OiAocmVjb3JkczogUm91dGVSZWNvcmRSYXdbXSkgPT4gUm91dGVSZWNvcmRSYXdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG8oaW1wb3J0czogUmVjb3JkPHN0cmluZywgRGVmaW5lQ29tcG9uZW50IHwgKCgpID0+IFByb21pc2U8RGVmaW5lQ29tcG9uZW50Pik+LCBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9KTogUm91dGVSZWNvcmRSYXdbXSB7XG4gICAgbGV0IHJvdXRlczogUm91dGVSZWNvcmRSYXdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhpbXBvcnRzKSkge1xuXG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGU/LnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgdHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBmaWxlbmFtZS5pbmNsdWRlcyhydWxlKVxuICAgICAgICAgICAgICAgIDogcnVsZS50ZXN0KGZpbGVuYW1lKVxuICAgICAgICApKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnRzID0gZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC52dWUkLywgJycpXG4gICAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+IHAgJiYgIXAuc3RhcnRzV2l0aCgnLicpKVxuICAgICAgICAgICAgLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IHBhcnRcblxuICAgICAgICAgICAgICAgIGlmIChwLnN0YXJ0c1dpdGgoJ1snKSAmJiBwLmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcCA9ICc6JyArIHAuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICAvLyBTdHJpcCBzcGVjaWZpYyBzZWdtZW50c1xuICAgICAgICBpZiAob3B0aW9ucy5zdHJpcD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmZpbHRlcihwID0+XG4gICAgICAgICAgICAgICAgIW9wdGlvbnMuc3RyaXAhLnNvbWUocnVsZSA9PlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcnVsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcCA9PT0gcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBydWxlLnRlc3QocClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKS5yZXBsYWNlKC9pbmRleCQvLCAnJylcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHBhdGggPSBvcHRpb25zLnByZWZpeCArICcvJyArIHBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBEZWZpbmVDb21wb25lbnQsXG4gICAgICAgICAgICBiZWZvcmVFbnRlcjogW10gYXMgTmF2aWdhdGlvbkd1YXJkW10sXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuZ3VhcmRzKSkge1xuICAgICAgICAgICAgcmVjb3JkLmJlZm9yZUVudGVyID0gb3B0aW9ucy5ndWFyZHNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmd1YXJkcyAmJiB0eXBlb2Ygb3B0aW9ucy5ndWFyZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWZvcmVFbnRlciA9IG9wdGlvbnMuZ3VhcmRzKHJlY29yZClcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlcy5wdXNoKHJlY29yZClcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yZWZpbmUpIHtcbiAgICAgICAgcm91dGVzID0gb3B0aW9ucy5yZWZpbmUocm91dGVzKVxuICAgIH1cblxuICAgIHJldHVybiByb3V0ZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcigpIHtcbiAgICBjb25zdCBzc3IgPSBpbXBvcnQubWV0YS5lbnYuU1NSXG5cbiAgICBjb25zdCByb3V0ZXIgPSBjcmVhdGVWdWVSb3V0ZXIoe1xuICAgICAgICBoaXN0b3J5OiBzc3IgPyBjcmVhdGVNZW1vcnlIaXN0b3J5KCkgOiBjcmVhdGVXZWJIaXN0b3J5KCksXG4gICAgICAgIHJvdXRlczogW10sXG4gICAgICAgIHNjcm9sbEJlaGF2aW9yKHRvLCBmcm9tLCBzYXZlZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc2F2ZWRQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZFBvc2l0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRvcDogMCB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkgYXMgYW55IGFzIFJvdXRlclxuXG4gICAgcm91dGVyLmJlZm9yZUVhY2goc2V0dXBHdWFyZClcblxuICAgIHJvdXRlci5hdXRvID0gKGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIERlZmluZUNvbXBvbmVudCB8ICgoKSA9PiBQcm9taXNlPERlZmluZUNvbXBvbmVudD4pPiwgb3B0aW9uczogQXV0b09wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRvUm91dGVzID0gYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgICAgICBcbiAgICAgICAgYXV0b1JvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHJvdXRlci5hZGRSb3V0ZShyb3V0ZSkpXG5cbiAgICAgICAgcmV0dXJuIGF1dG9Sb3V0ZXNcbiAgICB9XG5cbiAgICByZXR1cm4gcm91dGVyXG59XG5cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVG9hc3RTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCBtZXNzYWdlLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIG1lc3NhZ2UsIG9wdGlvbnMpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIGN1c3RvbVJlZiwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0Q3VycmVudFNjb3BlLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbmplY3QsIGlzUmVhY3RpdmUsIGlzUmVmLCBuZXh0VGljaywgb25CZWZvcmVNb3VudCwgb25CZWZvcmVVbm1vdW50LCBvbk1vdW50ZWQsIG9uU2NvcGVEaXNwb3NlLCBvblVubW91bnRlZCwgcHJvdmlkZSwgcmVhY3RpdmUsIHJlYWRvbmx5LCByZWYsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgdG9SZWYgYXMgdG9SZWYkMSwgdG9SZWZzIGFzIHRvUmVmcyQxLCB0b1ZhbHVlLCB1bnJlZiwgd2F0Y2gsIHdhdGNoRWZmZWN0IH0gZnJvbSBcInZ1ZVwiO1xuXG4vLyNyZWdpb24gY29tcHV0ZWRFYWdlci9pbmRleC50c1xuLyoqXG4qXG4qIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9uLlxuKlxuKiBOb3RlOiBJZiB5b3UgYXJlIHVzaW5nIFZ1ZSAzLjQrLCB5b3UgY2FuIHN0cmFpZ2h0IHVzZSBjb21wdXRlZCBpbnN0ZWFkLlxuKiBCZWNhdXNlIGluIFZ1ZSAzLjQrLCBpZiBjb21wdXRlZCBuZXcgdmFsdWUgZG9lcyBub3QgY2hhbmdlLFxuKiBjb21wdXRlZCwgZWZmZWN0LCB3YXRjaCwgd2F0Y2hFZmZlY3QsIHJlbmRlciBkZXBlbmRlbmNpZXMgd2lsbCBub3QgYmUgdHJpZ2dlcmVkLlxuKiByZWZlcjogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUvcHVsbC81OTEyXG4qXG4qIEBwYXJhbSBmbiBlZmZlY3QgZnVuY3Rpb25cbiogQHBhcmFtIG9wdGlvbnMgV2F0Y2hPcHRpb25zQmFzZVxuKiBAcmV0dXJucyByZWFkb25seSBzaGFsbG93UmVmXG4qL1xuZnVuY3Rpb24gY29tcHV0ZWRFYWdlcihmbiwgb3B0aW9ucykge1xuXHR2YXIgX29wdGlvbnMkZmx1c2g7XG5cdGNvbnN0IHJlc3VsdCA9IHNoYWxsb3dSZWYoKTtcblx0d2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdHJlc3VsdC52YWx1ZSA9IGZuKCk7XG5cdH0sIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGZsdXNoOiAoX29wdGlvbnMkZmx1c2ggPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZmx1c2gpICE9PSBudWxsICYmIF9vcHRpb25zJGZsdXNoICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRmbHVzaCA6IFwic3luY1wiXG5cdH0pO1xuXHRyZXR1cm4gcmVhZG9ubHkocmVzdWx0KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGNvbXB1dGVkRWFnZXJgIGluc3RlYWQgKi9cbmNvbnN0IGVhZ2VyQ29tcHV0ZWQgPSBjb21wdXRlZEVhZ2VyO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBjb21wdXRlZFdpdGhDb250cm9sL2luZGV4LnRzXG4vKipcbiogRXhwbGljaXRseSBkZWZpbmUgdGhlIGRlcHMgb2YgY29tcHV0ZWQuXG4qXG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIGZuXG4qL1xuZnVuY3Rpb24gY29tcHV0ZWRXaXRoQ29udHJvbChzb3VyY2UsIGZuLCBvcHRpb25zID0ge30pIHtcblx0bGV0IHYgPSB2b2lkIDA7XG5cdGxldCB0cmFjaztcblx0bGV0IHRyaWdnZXI7XG5cdGxldCBkaXJ0eSA9IHRydWU7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHRkaXJ0eSA9IHRydWU7XG5cdFx0dHJpZ2dlcigpO1xuXHR9O1xuXHR3YXRjaChzb3VyY2UsIHVwZGF0ZSwge1xuXHRcdGZsdXNoOiBcInN5bmNcIixcblx0XHQuLi5vcHRpb25zXG5cdH0pO1xuXHRjb25zdCBnZXQkMSA9IHR5cGVvZiBmbiA9PT0gXCJmdW5jdGlvblwiID8gZm4gOiBmbi5nZXQ7XG5cdGNvbnN0IHNldCQxID0gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgPyB2b2lkIDAgOiBmbi5zZXQ7XG5cdGNvbnN0IHJlc3VsdCA9IGN1c3RvbVJlZigoX3RyYWNrLCBfdHJpZ2dlcikgPT4ge1xuXHRcdHRyYWNrID0gX3RyYWNrO1xuXHRcdHRyaWdnZXIgPSBfdHJpZ2dlcjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRpZiAoZGlydHkpIHtcblx0XHRcdFx0XHR2ID0gZ2V0JDEodik7XG5cdFx0XHRcdFx0ZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0cmFjaygpO1xuXHRcdFx0XHRyZXR1cm4gdjtcblx0XHRcdH0sXG5cdFx0XHRzZXQodiQxKSB7XG5cdFx0XHRcdHNldCQxID09PSBudWxsIHx8IHNldCQxID09PSB2b2lkIDAgfHwgc2V0JDEodiQxKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcblx0cmVzdWx0LnRyaWdnZXIgPSB1cGRhdGU7XG5cdHJldHVybiByZXN1bHQ7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBjb21wdXRlZFdpdGhDb250cm9sYCBpbnN0ZWFkICovXG5jb25zdCBjb250cm9sbGVkQ29tcHV0ZWQgPSBjb21wdXRlZFdpdGhDb250cm9sO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0cnlPblNjb3BlRGlzcG9zZS9pbmRleC50c1xuLyoqXG4qIENhbGwgb25TY29wZURpc3Bvc2UoKSBpZiBpdCdzIGluc2lkZSBhbiBlZmZlY3Qgc2NvcGUgbGlmZWN5Y2xlLCBpZiBub3QsIGRvIG5vdGhpbmdcbipcbiogQHBhcmFtIGZuXG4qL1xuZnVuY3Rpb24gdHJ5T25TY29wZURpc3Bvc2UoZm4sIGZhaWxTaWxlbnRseSkge1xuXHRpZiAoZ2V0Q3VycmVudFNjb3BlKCkpIHtcblx0XHRvblNjb3BlRGlzcG9zZShmbiwgZmFpbFNpbGVudGx5KTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNyZWF0ZUV2ZW50SG9vay9pbmRleC50c1xuLyoqXG4qIFV0aWxpdHkgZm9yIGNyZWF0aW5nIGV2ZW50IGhvb2tzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZUV2ZW50SG9va1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50SG9vaygpIHtcblx0Y29uc3QgZm5zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Y29uc3Qgb2ZmID0gKGZuKSA9PiB7XG5cdFx0Zm5zLmRlbGV0ZShmbik7XG5cdH07XG5cdGNvbnN0IGNsZWFyID0gKCkgPT4ge1xuXHRcdGZucy5jbGVhcigpO1xuXHR9O1xuXHRjb25zdCBvbiA9IChmbikgPT4ge1xuXHRcdGZucy5hZGQoZm4pO1xuXHRcdGNvbnN0IG9mZkZuID0gKCkgPT4gb2ZmKGZuKTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZShvZmZGbik7XG5cdFx0cmV0dXJuIHsgb2ZmOiBvZmZGbiB9O1xuXHR9O1xuXHRjb25zdCB0cmlnZ2VyID0gKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShmbnMpLm1hcCgoZm4pID0+IGZuKC4uLmFyZ3MpKSk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0b24sXG5cdFx0b2ZmLFxuXHRcdHRyaWdnZXIsXG5cdFx0Y2xlYXJcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlR2xvYmFsU3RhdGUvaW5kZXgudHNcbi8qKlxuKiBLZWVwIHN0YXRlcyBpbiB0aGUgZ2xvYmFsIHNjb3BlIHRvIGJlIHJldXNhYmxlIGFjcm9zcyBWdWUgaW5zdGFuY2VzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9jcmVhdGVHbG9iYWxTdGF0ZVxuKiBAcGFyYW0gc3RhdGVGYWN0b3J5IEEgZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIHN0YXRlXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gY3JlYXRlR2xvYmFsU3RhdGUoc3RhdGVGYWN0b3J5KSB7XG5cdGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXHRsZXQgc3RhdGU7XG5cdGNvbnN0IHNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG5cdHJldHVybiAoKC4uLmFyZ3MpID0+IHtcblx0XHRpZiAoIWluaXRpYWxpemVkKSB7XG5cdFx0XHRzdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiBzdGF0ZUZhY3RvcnkoLi4uYXJncykpO1xuXHRcdFx0aW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gc3RhdGU7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBwcm92aWRlTG9jYWwvbWFwLnRzXG5jb25zdCBsb2NhbFByb3ZpZGVkU3RhdGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gaW5qZWN0TG9jYWwvaW5kZXgudHNcbi8qKlxuKiBPbiB0aGUgYmFzaXMgb2YgYGluamVjdGAsIGl0IGlzIGFsbG93ZWQgdG8gZGlyZWN0bHkgY2FsbCBpbmplY3QgdG8gb2J0YWluIHRoZSB2YWx1ZSBhZnRlciBjYWxsIHByb3ZpZGUgaW4gdGhlIHNhbWUgY29tcG9uZW50LlxuKlxuKiBAZXhhbXBsZVxuKiBgYGB0c1xuKiBpbmplY3RMb2NhbCgnTXlJbmplY3Rpb25LZXknLCAxKVxuKiBjb25zdCBpbmplY3RlZFZhbHVlID0gaW5qZWN0TG9jYWwoJ015SW5qZWN0aW9uS2V5JykgLy8gaW5qZWN0ZWRWYWx1ZSA9PT0gMVxuKiBgYGBcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5jb25zdCBpbmplY3RMb2NhbCA9ICguLi5hcmdzKSA9PiB7XG5cdHZhciBfZ2V0Q3VycmVudEluc3RhbmNlO1xuXHRjb25zdCBrZXkgPSBhcmdzWzBdO1xuXHRjb25zdCBpbnN0YW5jZSA9IChfZ2V0Q3VycmVudEluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCkpID09PSBudWxsIHx8IF9nZXRDdXJyZW50SW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nZXRDdXJyZW50SW5zdGFuY2UucHJveHk7XG5cdGNvbnN0IG93bmVyID0gaW5zdGFuY2UgIT09IG51bGwgJiYgaW5zdGFuY2UgIT09IHZvaWQgMCA/IGluc3RhbmNlIDogZ2V0Q3VycmVudFNjb3BlKCk7XG5cdGlmIChvd25lciA9PSBudWxsICYmICFoYXNJbmplY3Rpb25Db250ZXh0KCkpIHRocm93IG5ldyBFcnJvcihcImluamVjdExvY2FsIG11c3QgYmUgY2FsbGVkIGluIHNldHVwXCIpO1xuXHRpZiAob3duZXIgJiYgbG9jYWxQcm92aWRlZFN0YXRlTWFwLmhhcyhvd25lcikgJiYga2V5IGluIGxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5nZXQob3duZXIpKSByZXR1cm4gbG9jYWxQcm92aWRlZFN0YXRlTWFwLmdldChvd25lcilba2V5XTtcblx0cmV0dXJuIGluamVjdCguLi5hcmdzKTtcbn07XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHByb3ZpZGVMb2NhbC9pbmRleC50c1xuLyoqXG4qIE9uIHRoZSBiYXNpcyBvZiBgcHJvdmlkZWAsIGl0IGlzIGFsbG93ZWQgdG8gZGlyZWN0bHkgY2FsbCBpbmplY3QgdG8gb2J0YWluIHRoZSB2YWx1ZSBhZnRlciBjYWxsIHByb3ZpZGUgaW4gdGhlIHNhbWUgY29tcG9uZW50LlxuKlxuKiBAZXhhbXBsZVxuKiBgYGB0c1xuKiBwcm92aWRlTG9jYWwoJ015SW5qZWN0aW9uS2V5JywgMSlcbiogY29uc3QgaW5qZWN0ZWRWYWx1ZSA9IGluamVjdExvY2FsKCdNeUluamVjdGlvbktleScpIC8vIGluamVjdGVkVmFsdWUgPT09IDFcbiogYGBgXG4qL1xuZnVuY3Rpb24gcHJvdmlkZUxvY2FsKGtleSwgdmFsdWUpIHtcblx0dmFyIF9nZXRDdXJyZW50SW5zdGFuY2U7XG5cdGNvbnN0IGluc3RhbmNlID0gKF9nZXRDdXJyZW50SW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKSkgPT09IG51bGwgfHwgX2dldEN1cnJlbnRJbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dldEN1cnJlbnRJbnN0YW5jZS5wcm94eTtcblx0Y29uc3Qgb3duZXIgPSBpbnN0YW5jZSAhPT0gbnVsbCAmJiBpbnN0YW5jZSAhPT0gdm9pZCAwID8gaW5zdGFuY2UgOiBnZXRDdXJyZW50U2NvcGUoKTtcblx0aWYgKG93bmVyID09IG51bGwpIHRocm93IG5ldyBFcnJvcihcInByb3ZpZGVMb2NhbCBtdXN0IGJlIGNhbGxlZCBpbiBzZXR1cFwiKTtcblx0aWYgKCFsb2NhbFByb3ZpZGVkU3RhdGVNYXAuaGFzKG93bmVyKSkgbG9jYWxQcm92aWRlZFN0YXRlTWFwLnNldChvd25lciwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cdGNvbnN0IGxvY2FsUHJvdmlkZWRTdGF0ZSA9IGxvY2FsUHJvdmlkZWRTdGF0ZU1hcC5nZXQob3duZXIpO1xuXHRsb2NhbFByb3ZpZGVkU3RhdGVba2V5XSA9IHZhbHVlO1xuXHRyZXR1cm4gcHJvdmlkZShrZXksIHZhbHVlKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlSW5qZWN0aW9uU3RhdGUvaW5kZXgudHNcbi8qKlxuKiBDcmVhdGUgZ2xvYmFsIHN0YXRlIHRoYXQgY2FuIGJlIGluamVjdGVkIGludG8gY29tcG9uZW50cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvY3JlYXRlSW5qZWN0aW9uU3RhdGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVJbmplY3Rpb25TdGF0ZShjb21wb3NhYmxlLCBvcHRpb25zKSB7XG5cdGNvbnN0IGtleSA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaW5qZWN0aW9uS2V5KSB8fCBTeW1ib2woY29tcG9zYWJsZS5uYW1lIHx8IFwiSW5qZWN0aW9uU3RhdGVcIik7XG5cdGNvbnN0IGRlZmF1bHRWYWx1ZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kZWZhdWx0VmFsdWU7XG5cdGNvbnN0IHVzZVByb3ZpZGluZ1N0YXRlID0gKC4uLmFyZ3MpID0+IHtcblx0XHRjb25zdCBzdGF0ZSA9IGNvbXBvc2FibGUoLi4uYXJncyk7XG5cdFx0cHJvdmlkZUxvY2FsKGtleSwgc3RhdGUpO1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fTtcblx0Y29uc3QgdXNlSW5qZWN0ZWRTdGF0ZSA9ICgpID0+IGluamVjdExvY2FsKGtleSwgZGVmYXVsdFZhbHVlKTtcblx0cmV0dXJuIFt1c2VQcm92aWRpbmdTdGF0ZSwgdXNlSW5qZWN0ZWRTdGF0ZV07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNyZWF0ZVJlZi9pbmRleC50c1xuLyoqXG4qIFJldHVybnMgYSBgZGVlcFJlZmAgb3IgYHNoYWxsb3dSZWZgIGRlcGVuZGluZyBvbiB0aGUgYGRlZXBgIHBhcmFtLlxuKlxuKiBAZXhhbXBsZSBjcmVhdGVSZWYoMSkgLy8gU2hhbGxvd1JlZjxudW1iZXI+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZigxLCBmYWxzZSkgLy8gU2hhbGxvd1JlZjxudW1iZXI+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZigxLCB0cnVlKSAvLyBSZWY8bnVtYmVyPlxuKiBAZXhhbXBsZSBjcmVhdGVSZWYoXCJzdHJpbmdcIikgLy8gU2hhbGxvd1JlZjxzdHJpbmc+XG4qIEBleGFtcGxlIGNyZWF0ZVJlZjxcIkFcInxcIkJcIj4oXCJBXCIsIHRydWUpIC8vIFJlZjxcIkFcInxcIkJcIj5cbipcbiogQHBhcmFtIHZhbHVlXG4qIEBwYXJhbSBkZWVwXG4qIEByZXR1cm5zIHRoZSBgZGVlcFJlZmAgb3IgYHNoYWxsb3dSZWZgXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gY3JlYXRlUmVmKHZhbHVlLCBkZWVwKSB7XG5cdGlmIChkZWVwID09PSB0cnVlKSByZXR1cm4gcmVmKHZhbHVlKTtcblx0ZWxzZSByZXR1cm4gc2hhbGxvd1JlZih2YWx1ZSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHV0aWxzL2lzLnRzXG5jb25zdCBpc0NsaWVudCA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3QgaXNXb3JrZXIgPSB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsVGhpcyBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlO1xuY29uc3QgaXNEZWYgPSAodmFsKSA9PiB0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiO1xuY29uc3Qgbm90TnVsbGlzaCA9ICh2YWwpID0+IHZhbCAhPSBudWxsO1xuY29uc3QgYXNzZXJ0ID0gKGNvbmRpdGlvbiwgLi4uaW5mb3MpID0+IHtcblx0aWYgKCFjb25kaXRpb24pIGNvbnNvbGUud2FybiguLi5pbmZvcyk7XG59O1xuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB0b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBPYmplY3RdXCI7XG5jb25zdCBub3cgPSAoKSA9PiBEYXRlLm5vdygpO1xuY29uc3QgdGltZXN0YW1wID0gKCkgPT4gK0RhdGUubm93KCk7XG5jb25zdCBjbGFtcCA9IChuLCBtaW4sIG1heCkgPT4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG4pKTtcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmNvbnN0IHJhbmQgPSAobWluLCBtYXgpID0+IHtcblx0bWluID0gTWF0aC5jZWlsKG1pbik7XG5cdG1heCA9IE1hdGguZmxvb3IobWF4KTtcblx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG59O1xuY29uc3QgaGFzT3duID0gKHZhbCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpO1xuY29uc3QgaXNJT1MgPSAvKiBAX19QVVJFX18gKi8gZ2V0SXNJT1MoKTtcbmZ1bmN0aW9uIGdldElzSU9TKCkge1xuXHR2YXIgX3dpbmRvdywgX3dpbmRvdzIsIF93aW5kb3czO1xuXHRyZXR1cm4gaXNDbGllbnQgJiYgISEoKF93aW5kb3cgPSB3aW5kb3cpID09PSBudWxsIHx8IF93aW5kb3cgPT09IHZvaWQgMCB8fCAoX3dpbmRvdyA9IF93aW5kb3cubmF2aWdhdG9yKSA9PT0gbnVsbCB8fCBfd2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93LnVzZXJBZ2VudCkgJiYgKC9pUCg/OmFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSB8fCAoKF93aW5kb3cyID0gd2luZG93KSA9PT0gbnVsbCB8fCBfd2luZG93MiA9PT0gdm9pZCAwIHx8IChfd2luZG93MiA9IF93aW5kb3cyLm5hdmlnYXRvcikgPT09IG51bGwgfHwgX3dpbmRvdzIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3cyLm1heFRvdWNoUG9pbnRzKSA+IDIgJiYgL2lQYWR8TWFjaW50b3NoLy50ZXN0KChfd2luZG93MyA9IHdpbmRvdykgPT09IG51bGwgfHwgX3dpbmRvdzMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3czLm5hdmlnYXRvci51c2VyQWdlbnQpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdG9SZWYvaW5kZXgudHNcbmZ1bmN0aW9uIHRvUmVmKC4uLmFyZ3MpIHtcblx0aWYgKGFyZ3MubGVuZ3RoICE9PSAxKSByZXR1cm4gdG9SZWYkMSguLi5hcmdzKTtcblx0Y29uc3QgciA9IGFyZ3NbMF07XG5cdHJldHVybiB0eXBlb2YgciA9PT0gXCJmdW5jdGlvblwiID8gcmVhZG9ubHkoY3VzdG9tUmVmKCgpID0+ICh7XG5cdFx0Z2V0OiByLFxuXHRcdHNldDogbm9vcFxuXHR9KSkpIDogcmVmKHIpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy9maWx0ZXJzLnRzXG4vKipcbiogQGludGVybmFsXG4qL1xuZnVuY3Rpb24gY3JlYXRlRmlsdGVyV3JhcHBlcihmaWx0ZXIsIGZuKSB7XG5cdGZ1bmN0aW9uIHdyYXBwZXIoLi4uYXJncykge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRQcm9taXNlLnJlc29sdmUoZmlsdGVyKCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MpLCB7XG5cdFx0XHRcdGZuLFxuXHRcdFx0XHR0aGlzQXJnOiB0aGlzLFxuXHRcdFx0XHRhcmdzXG5cdFx0XHR9KSkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB3cmFwcGVyO1xufVxuY29uc3QgYnlwYXNzRmlsdGVyID0gKGludm9rZSQxKSA9PiB7XG5cdHJldHVybiBpbnZva2UkMSgpO1xufTtcbi8qKlxuKiBDcmVhdGUgYW4gRXZlbnRGaWx0ZXIgdGhhdCBkZWJvdW5jZSB0aGUgZXZlbnRzXG4qL1xuZnVuY3Rpb24gZGVib3VuY2VGaWx0ZXIobXMsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgdGltZXI7XG5cdGxldCBtYXhUaW1lcjtcblx0bGV0IGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdGNvbnN0IF9jbGVhclRpbWVvdXQgPSAodGltZXIkMSkgPT4ge1xuXHRcdGNsZWFyVGltZW91dCh0aW1lciQxKTtcblx0XHRsYXN0UmVqZWN0b3IoKTtcblx0XHRsYXN0UmVqZWN0b3IgPSBub29wO1xuXHR9O1xuXHRsZXQgbGFzdEludm9rZXI7XG5cdGNvbnN0IGZpbHRlciA9IChpbnZva2UkMSkgPT4ge1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdG9WYWx1ZShtcyk7XG5cdFx0Y29uc3QgbWF4RHVyYXRpb24gPSB0b1ZhbHVlKG9wdGlvbnMubWF4V2FpdCk7XG5cdFx0aWYgKHRpbWVyKSBfY2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRpZiAoZHVyYXRpb24gPD0gMCB8fCBtYXhEdXJhdGlvbiAhPT0gdm9pZCAwICYmIG1heER1cmF0aW9uIDw9IDApIHtcblx0XHRcdGlmIChtYXhUaW1lcikge1xuXHRcdFx0XHRfY2xlYXJUaW1lb3V0KG1heFRpbWVyKTtcblx0XHRcdFx0bWF4VGltZXIgPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGludm9rZSQxKCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0bGFzdFJlamVjdG9yID0gb3B0aW9ucy5yZWplY3RPbkNhbmNlbCA/IHJlamVjdCA6IHJlc29sdmU7XG5cdFx0XHRsYXN0SW52b2tlciA9IGludm9rZSQxO1xuXHRcdFx0aWYgKG1heER1cmF0aW9uICYmICFtYXhUaW1lcikgbWF4VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0aWYgKHRpbWVyKSBfY2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdFx0bWF4VGltZXIgPSB2b2lkIDA7XG5cdFx0XHRcdHJlc29sdmUobGFzdEludm9rZXIoKSk7XG5cdFx0XHR9LCBtYXhEdXJhdGlvbik7XG5cdFx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAobWF4VGltZXIpIF9jbGVhclRpbWVvdXQobWF4VGltZXIpO1xuXHRcdFx0XHRtYXhUaW1lciA9IHZvaWQgMDtcblx0XHRcdFx0cmVzb2x2ZShpbnZva2UkMSgpKTtcblx0XHRcdH0sIGR1cmF0aW9uKTtcblx0XHR9KTtcblx0fTtcblx0cmV0dXJuIGZpbHRlcjtcbn1cbmZ1bmN0aW9uIHRocm90dGxlRmlsdGVyKC4uLmFyZ3MpIHtcblx0bGV0IGxhc3RFeGVjID0gMDtcblx0bGV0IHRpbWVyO1xuXHRsZXQgaXNMZWFkaW5nID0gdHJ1ZTtcblx0bGV0IGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdGxldCBsYXN0VmFsdWU7XG5cdGxldCBtcztcblx0bGV0IHRyYWlsaW5nO1xuXHRsZXQgbGVhZGluZztcblx0bGV0IHJlamVjdE9uQ2FuY2VsO1xuXHRpZiAoIWlzUmVmKGFyZ3NbMF0pICYmIHR5cGVvZiBhcmdzWzBdID09PSBcIm9iamVjdFwiKSAoe2RlbGF5OiBtcywgdHJhaWxpbmcgPSB0cnVlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZX0gPSBhcmdzWzBdKTtcblx0ZWxzZSBbbXMsIHRyYWlsaW5nID0gdHJ1ZSwgbGVhZGluZyA9IHRydWUsIHJlamVjdE9uQ2FuY2VsID0gZmFsc2VdID0gYXJncztcblx0Y29uc3QgY2xlYXIgPSAoKSA9PiB7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0dGltZXIgPSB2b2lkIDA7XG5cdFx0XHRsYXN0UmVqZWN0b3IoKTtcblx0XHRcdGxhc3RSZWplY3RvciA9IG5vb3A7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBmaWx0ZXIgPSAoX2ludm9rZSkgPT4ge1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdG9WYWx1ZShtcyk7XG5cdFx0Y29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBsYXN0RXhlYztcblx0XHRjb25zdCBpbnZva2UkMSA9ICgpID0+IHtcblx0XHRcdHJldHVybiBsYXN0VmFsdWUgPSBfaW52b2tlKCk7XG5cdFx0fTtcblx0XHRjbGVhcigpO1xuXHRcdGlmIChkdXJhdGlvbiA8PSAwKSB7XG5cdFx0XHRsYXN0RXhlYyA9IERhdGUubm93KCk7XG5cdFx0XHRyZXR1cm4gaW52b2tlJDEoKTtcblx0XHR9XG5cdFx0aWYgKGVsYXBzZWQgPiBkdXJhdGlvbikge1xuXHRcdFx0bGFzdEV4ZWMgPSBEYXRlLm5vdygpO1xuXHRcdFx0aWYgKGxlYWRpbmcgfHwgIWlzTGVhZGluZykgaW52b2tlJDEoKTtcblx0XHR9IGVsc2UgaWYgKHRyYWlsaW5nKSBsYXN0VmFsdWUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRsYXN0UmVqZWN0b3IgPSByZWplY3RPbkNhbmNlbCA/IHJlamVjdCA6IHJlc29sdmU7XG5cdFx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRsYXN0RXhlYyA9IERhdGUubm93KCk7XG5cdFx0XHRcdGlzTGVhZGluZyA9IHRydWU7XG5cdFx0XHRcdHJlc29sdmUoaW52b2tlJDEoKSk7XG5cdFx0XHRcdGNsZWFyKCk7XG5cdFx0XHR9LCBNYXRoLm1heCgwLCBkdXJhdGlvbiAtIGVsYXBzZWQpKTtcblx0XHR9KTtcblx0XHRpZiAoIWxlYWRpbmcgJiYgIXRpbWVyKSB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gaXNMZWFkaW5nID0gdHJ1ZSwgZHVyYXRpb24pO1xuXHRcdGlzTGVhZGluZyA9IGZhbHNlO1xuXHRcdHJldHVybiBsYXN0VmFsdWU7XG5cdH07XG5cdHJldHVybiBmaWx0ZXI7XG59XG4vKipcbiogRXZlbnRGaWx0ZXIgdGhhdCBnaXZlcyBleHRyYSBjb250cm9scyB0byBwYXVzZSBhbmQgcmVzdW1lIHRoZSBmaWx0ZXJcbipcbiogQHBhcmFtIGV4dGVuZEZpbHRlciAgRXh0cmEgZmlsdGVyIHRvIGFwcGx5IHdoZW4gdGhlIFBhdXNhYmxlRmlsdGVyIGlzIGFjdGl2ZSwgZGVmYXVsdCB0byBub25lXG4qIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBmaWx0ZXJcbiovXG5mdW5jdGlvbiBwYXVzYWJsZUZpbHRlcihleHRlbmRGaWx0ZXIgPSBieXBhc3NGaWx0ZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxTdGF0ZSA9IFwiYWN0aXZlXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzQWN0aXZlID0gdG9SZWYoaW5pdGlhbFN0YXRlID09PSBcImFjdGl2ZVwiKTtcblx0ZnVuY3Rpb24gcGF1c2UoKSB7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0fVxuXHRmdW5jdGlvbiByZXN1bWUoKSB7XG5cdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHR9XG5cdGNvbnN0IGV2ZW50RmlsdGVyID0gKC4uLmFyZ3MpID0+IHtcblx0XHRpZiAoaXNBY3RpdmUudmFsdWUpIGV4dGVuZEZpbHRlciguLi5hcmdzKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZTogcmVhZG9ubHkoaXNBY3RpdmUpLFxuXHRcdHBhdXNlLFxuXHRcdHJlc3VtZSxcblx0XHRldmVudEZpbHRlclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy9nZW5lcmFsLnRzXG5mdW5jdGlvbiBwcm9taXNlVGltZW91dChtcywgdGhyb3dPblRpbWVvdXQgPSBmYWxzZSwgcmVhc29uID0gXCJUaW1lb3V0XCIpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRpZiAodGhyb3dPblRpbWVvdXQpIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KHJlYXNvbiksIG1zKTtcblx0XHRlbHNlIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuXHR9KTtcbn1cbmZ1bmN0aW9uIGlkZW50aXR5KGFyZykge1xuXHRyZXR1cm4gYXJnO1xufVxuLyoqXG4qIENyZWF0ZSBzaW5nbGV0b24gcHJvbWlzZSBmdW5jdGlvblxuKlxuKiBAZXhhbXBsZVxuKiBgYGBcbiogY29uc3QgcHJvbWlzZSA9IGNyZWF0ZVNpbmdsZXRvblByb21pc2UoYXN5bmMgKCkgPT4geyAuLi4gfSlcbipcbiogYXdhaXQgcHJvbWlzZSgpXG4qIGF3YWl0IHByb21pc2UoKSAvLyBhbGwgb2YgdGhlbSB3aWxsIGJlIGJpbmQgdG8gYSBzaW5nbGUgcHJvbWlzZSBpbnN0YW5jZVxuKiBhd2FpdCBwcm9taXNlKCkgLy8gYW5kIGJlIHJlc29sdmVkIHRvZ2V0aGVyXG4qIGBgYFxuKi9cbmZ1bmN0aW9uIGNyZWF0ZVNpbmdsZXRvblByb21pc2UoZm4pIHtcblx0bGV0IF9wcm9taXNlO1xuXHRmdW5jdGlvbiB3cmFwcGVyKCkge1xuXHRcdGlmICghX3Byb21pc2UpIF9wcm9taXNlID0gZm4oKTtcblx0XHRyZXR1cm4gX3Byb21pc2U7XG5cdH1cblx0d3JhcHBlci5yZXNldCA9IGFzeW5jICgpID0+IHtcblx0XHRjb25zdCBfcHJldiA9IF9wcm9taXNlO1xuXHRcdF9wcm9taXNlID0gdm9pZCAwO1xuXHRcdGlmIChfcHJldikgYXdhaXQgX3ByZXY7XG5cdH07XG5cdHJldHVybiB3cmFwcGVyO1xufVxuZnVuY3Rpb24gaW52b2tlKGZuKSB7XG5cdHJldHVybiBmbigpO1xufVxuZnVuY3Rpb24gY29udGFpbnNQcm9wKG9iaiwgLi4ucHJvcHMpIHtcblx0cmV0dXJuIHByb3BzLnNvbWUoKGspID0+IGsgaW4gb2JqKTtcbn1cbmZ1bmN0aW9uIGluY3JlYXNlV2l0aFVuaXQodGFyZ2V0LCBkZWx0YSkge1xuXHR2YXIgX3RhcmdldCRtYXRjaDtcblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09IFwibnVtYmVyXCIpIHJldHVybiB0YXJnZXQgKyBkZWx0YTtcblx0Y29uc3QgdmFsdWUgPSAoKF90YXJnZXQkbWF0Y2ggPSB0YXJnZXQubWF0Y2goL14tP1xcZCtcXC4/XFxkKi8pKSA9PT0gbnVsbCB8fCBfdGFyZ2V0JG1hdGNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFyZ2V0JG1hdGNoWzBdKSB8fCBcIlwiO1xuXHRjb25zdCB1bml0ID0gdGFyZ2V0LnNsaWNlKHZhbHVlLmxlbmd0aCk7XG5cdGNvbnN0IHJlc3VsdCA9IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKSArIGRlbHRhO1xuXHRpZiAoTnVtYmVyLmlzTmFOKHJlc3VsdCkpIHJldHVybiB0YXJnZXQ7XG5cdHJldHVybiByZXN1bHQgKyB1bml0O1xufVxuLyoqXG4qIEdldCBhIHB4IHZhbHVlIGZvciBTU1IgdXNlLCBkbyBub3QgcmVseSBvbiB0aGlzIG1ldGhvZCBvdXRzaWRlIG9mIFNTUiBhcyBSRU0gdW5pdCBpcyBhc3N1bWVkIGF0IDE2cHgsIHdoaWNoIG1pZ2h0IG5vdCBiZSB0aGUgY2FzZSBvbiB0aGUgY2xpZW50XG4qL1xuZnVuY3Rpb24gcHhWYWx1ZShweCkge1xuXHRyZXR1cm4gcHguZW5kc1dpdGgoXCJyZW1cIikgPyBOdW1iZXIucGFyc2VGbG9hdChweCkgKiAxNiA6IE51bWJlci5wYXJzZUZsb2F0KHB4KTtcbn1cbi8qKlxuKiBDcmVhdGUgYSBuZXcgc3Vic2V0IG9iamVjdCBieSBnaXZpbmcga2V5c1xuKi9cbmZ1bmN0aW9uIG9iamVjdFBpY2sob2JqLCBrZXlzLCBvbWl0VW5kZWZpbmVkID0gZmFsc2UpIHtcblx0cmV0dXJuIGtleXMucmVkdWNlKChuLCBrKSA9PiB7XG5cdFx0aWYgKGsgaW4gb2JqKSB7XG5cdFx0XHRpZiAoIW9taXRVbmRlZmluZWQgfHwgb2JqW2tdICE9PSB2b2lkIDApIG5ba10gPSBvYmpba107XG5cdFx0fVxuXHRcdHJldHVybiBuO1xuXHR9LCB7fSk7XG59XG4vKipcbiogQ3JlYXRlIGEgbmV3IHN1YnNldCBvYmplY3QgYnkgb21pdCBnaXZpbmcga2V5c1xuKi9cbmZ1bmN0aW9uIG9iamVjdE9taXQob2JqLCBrZXlzLCBvbWl0VW5kZWZpbmVkID0gZmFsc2UpIHtcblx0cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhvYmopLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0cmV0dXJuICghb21pdFVuZGVmaW5lZCB8fCB2YWx1ZSAhPT0gdm9pZCAwKSAmJiAha2V5cy5pbmNsdWRlcyhrZXkpO1xuXHR9KSk7XG59XG5mdW5jdGlvbiBvYmplY3RFbnRyaWVzKG9iaikge1xuXHRyZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKTtcbn1cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy9wb3J0LnRzXG5mdW5jdGlvbiBjYWNoZVN0cmluZ0Z1bmN0aW9uKGZuKSB7XG5cdGNvbnN0IGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0cmV0dXJuICgoc3RyKSA9PiB7XG5cdFx0cmV0dXJuIGNhY2hlW3N0cl0gfHwgKGNhY2hlW3N0cl0gPSBmbihzdHIpKTtcblx0fSk7XG59XG5jb25zdCBoeXBoZW5hdGVSRSA9IC9cXEIoW0EtWl0pL2c7XG5jb25zdCBoeXBoZW5hdGUgPSBjYWNoZVN0cmluZ0Z1bmN0aW9uKChzdHIpID0+IHN0ci5yZXBsYWNlKGh5cGhlbmF0ZVJFLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpKTtcbmNvbnN0IGNhbWVsaXplUkUgPSAvLShcXHcpL2c7XG5jb25zdCBjYW1lbGl6ZSA9IGNhY2hlU3RyaW5nRnVuY3Rpb24oKHN0cikgPT4ge1xuXHRyZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgKF8sIGMpID0+IGMgPyBjLnRvVXBwZXJDYXNlKCkgOiBcIlwiKTtcbn0pO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1dGlscy92dWUudHNcbmZ1bmN0aW9uIGdldExpZmVDeWNsZVRhcmdldCh0YXJnZXQpIHtcblx0cmV0dXJuIHRhcmdldCB8fCBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlU2hhcmVkQ29tcG9zYWJsZS9pbmRleC50c1xuLyoqXG4qIE1ha2UgYSBjb21wb3NhYmxlIGZ1bmN0aW9uIHVzYWJsZSB3aXRoIG11bHRpcGxlIFZ1ZSBpbnN0YW5jZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZVNoYXJlZENvbXBvc2FibGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVTaGFyZWRDb21wb3NhYmxlKGNvbXBvc2FibGUpIHtcblx0aWYgKCFpc0NsaWVudCkgcmV0dXJuIGNvbXBvc2FibGU7XG5cdGxldCBzdWJzY3JpYmVycyA9IDA7XG5cdGxldCBzdGF0ZTtcblx0bGV0IHNjb3BlO1xuXHRjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuXHRcdHN1YnNjcmliZXJzIC09IDE7XG5cdFx0aWYgKHNjb3BlICYmIHN1YnNjcmliZXJzIDw9IDApIHtcblx0XHRcdHNjb3BlLnN0b3AoKTtcblx0XHRcdHN0YXRlID0gdm9pZCAwO1xuXHRcdFx0c2NvcGUgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gKCguLi5hcmdzKSA9PiB7XG5cdFx0c3Vic2NyaWJlcnMgKz0gMTtcblx0XHRpZiAoIXNjb3BlKSB7XG5cdFx0XHRzY29wZSA9IGVmZmVjdFNjb3BlKHRydWUpO1xuXHRcdFx0c3RhdGUgPSBzY29wZS5ydW4oKCkgPT4gY29tcG9zYWJsZSguLi5hcmdzKSk7XG5cdFx0fVxuXHRcdHRyeU9uU2NvcGVEaXNwb3NlKGRpc3Bvc2UpO1xuXHRcdHJldHVybiBzdGF0ZTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGV4dGVuZFJlZi9pbmRleC50c1xuZnVuY3Rpb24gZXh0ZW5kUmVmKHJlZiQxLCBleHRlbmQsIHsgZW51bWVyYWJsZSA9IGZhbHNlLCB1bndyYXAgPSB0cnVlIH0gPSB7fSkge1xuXHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHRlbmQpKSB7XG5cdFx0aWYgKGtleSA9PT0gXCJ2YWx1ZVwiKSBjb250aW51ZTtcblx0XHRpZiAoaXNSZWYodmFsdWUpICYmIHVud3JhcCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlZiQxLCBrZXksIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlLnZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldCh2KSB7XG5cdFx0XHRcdHZhbHVlLnZhbHVlID0gdjtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlXG5cdFx0fSk7XG5cdFx0ZWxzZSBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVmJDEsIGtleSwge1xuXHRcdFx0dmFsdWUsXG5cdFx0XHRlbnVtZXJhYmxlXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHJlZiQxO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBnZXQvaW5kZXgudHNcbmZ1bmN0aW9uIGdldChvYmosIGtleSkge1xuXHRpZiAoa2V5ID09IG51bGwpIHJldHVybiB1bnJlZihvYmopO1xuXHRyZXR1cm4gdW5yZWYob2JqKVtrZXldO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBpc0RlZmluZWQvaW5kZXgudHNcbmZ1bmN0aW9uIGlzRGVmaW5lZCh2KSB7XG5cdHJldHVybiB1bnJlZih2KSAhPSBudWxsO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBtYWtlRGVzdHJ1Y3R1cmFibGUvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiBtYWtlRGVzdHJ1Y3R1cmFibGUob2JqLCBhcnIpIHtcblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRjb25zdCBjbG9uZSA9IHsgLi4ub2JqIH07XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb25lLCBTeW1ib2wuaXRlcmF0b3IsIHtcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWUoKSB7XG5cdFx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRcdHJldHVybiB7IG5leHQ6ICgpID0+ICh7XG5cdFx0XHRcdFx0dmFsdWU6IGFycltpbmRleCsrXSxcblx0XHRcdFx0XHRkb25lOiBpbmRleCA+IGFyci5sZW5ndGhcblx0XHRcdFx0fSkgfTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0gZWxzZSByZXR1cm4gT2JqZWN0LmFzc2lnbihbLi4uYXJyXSwgb2JqKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpZnkvaW5kZXgudHNcbi8qKlxuKiBDb252ZXJ0cyBwbGFpbiBmdW5jdGlvbiBpbnRvIGEgcmVhY3RpdmUgZnVuY3Rpb24uXG4qIFRoZSBjb252ZXJ0ZWQgZnVuY3Rpb24gYWNjZXB0cyByZWZzIGFzIGl0J3MgYXJndW1lbnRzXG4qIGFuZCByZXR1cm5zIGEgQ29tcHV0ZWRSZWYsIHdpdGggcHJvcGVyIHR5cGluZy5cbipcbiogQHBhcmFtIGZuIC0gU291cmNlIGZ1bmN0aW9uXG4qIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHJlYWN0aWZ5KGZuLCBvcHRpb25zKSB7XG5cdGNvbnN0IHVucmVmRm4gPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbXB1dGVkR2V0dGVyKSA9PT0gZmFsc2UgPyB1bnJlZiA6IHRvVmFsdWU7XG5cdHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGZuLmFwcGx5KHRoaXMsIGFyZ3MubWFwKChpKSA9PiB1bnJlZkZuKGkpKSkpO1xuXHR9O1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVhY3RpZnlgIGluc3RlYWQgKi9cbmNvbnN0IGNyZWF0ZVJlYWN0aXZlRm4gPSByZWFjdGlmeTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpZnlPYmplY3QvaW5kZXgudHNcbi8qKlxuKiBBcHBseSBgcmVhY3RpZnlgIHRvIGFuIG9iamVjdFxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHJlYWN0aWZ5T2JqZWN0KG9iaiwgb3B0aW9uc09yS2V5cyA9IHt9KSB7XG5cdGxldCBrZXlzID0gW107XG5cdGxldCBvcHRpb25zO1xuXHRpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zT3JLZXlzKSkga2V5cyA9IG9wdGlvbnNPcktleXM7XG5cdGVsc2Uge1xuXHRcdG9wdGlvbnMgPSBvcHRpb25zT3JLZXlzO1xuXHRcdGNvbnN0IHsgaW5jbHVkZU93blByb3BlcnRpZXMgPSB0cnVlIH0gPSBvcHRpb25zT3JLZXlzO1xuXHRcdGtleXMucHVzaCguLi5PYmplY3Qua2V5cyhvYmopKTtcblx0XHRpZiAoaW5jbHVkZU93blByb3BlcnRpZXMpIGtleXMucHVzaCguLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopKTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGtleXMubWFwKChrZXkpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXHRcdHJldHVybiBba2V5LCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJlYWN0aWZ5KHZhbHVlLmJpbmQob2JqKSwgb3B0aW9ucykgOiB2YWx1ZV07XG5cdH0pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdG9SZWFjdGl2ZS9pbmRleC50c1xuLyoqXG4qIENvbnZlcnRzIHJlZiB0byByZWFjdGl2ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdG9SZWFjdGl2ZVxuKiBAcGFyYW0gb2JqZWN0UmVmIEEgcmVmIG9mIG9iamVjdFxuKi9cbmZ1bmN0aW9uIHRvUmVhY3RpdmUob2JqZWN0UmVmKSB7XG5cdGlmICghaXNSZWYob2JqZWN0UmVmKSkgcmV0dXJuIHJlYWN0aXZlKG9iamVjdFJlZik7XG5cdHJldHVybiByZWFjdGl2ZShuZXcgUHJveHkoe30sIHtcblx0XHRnZXQoXywgcCwgcmVjZWl2ZXIpIHtcblx0XHRcdHJldHVybiB1bnJlZihSZWZsZWN0LmdldChvYmplY3RSZWYudmFsdWUsIHAsIHJlY2VpdmVyKSk7XG5cdFx0fSxcblx0XHRzZXQoXywgcCwgdmFsdWUpIHtcblx0XHRcdGlmIChpc1JlZihvYmplY3RSZWYudmFsdWVbcF0pICYmICFpc1JlZih2YWx1ZSkpIG9iamVjdFJlZi52YWx1ZVtwXS52YWx1ZSA9IHZhbHVlO1xuXHRcdFx0ZWxzZSBvYmplY3RSZWYudmFsdWVbcF0gPSB2YWx1ZTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0ZGVsZXRlUHJvcGVydHkoXywgcCkge1xuXHRcdFx0cmV0dXJuIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkob2JqZWN0UmVmLnZhbHVlLCBwKTtcblx0XHR9LFxuXHRcdGhhcyhfLCBwKSB7XG5cdFx0XHRyZXR1cm4gUmVmbGVjdC5oYXMob2JqZWN0UmVmLnZhbHVlLCBwKTtcblx0XHR9LFxuXHRcdG93bktleXMoKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0UmVmLnZhbHVlKTtcblx0XHR9LFxuXHRcdGdldE93blByb3BlcnR5RGVzY3JpcHRvcigpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH0pKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpdmVDb21wdXRlZC9pbmRleC50c1xuLyoqXG4qIENvbXB1dGVkIHJlYWN0aXZlIG9iamVjdC5cbiovXG5mdW5jdGlvbiByZWFjdGl2ZUNvbXB1dGVkKGZuKSB7XG5cdHJldHVybiB0b1JlYWN0aXZlKGNvbXB1dGVkKGZuKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlYWN0aXZlT21pdC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgb21pdCBmaWVsZHMgZnJvbSBhIHJlYWN0aXZlIG9iamVjdFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9yZWFjdGl2ZU9taXRcbiovXG5mdW5jdGlvbiByZWFjdGl2ZU9taXQob2JqLCAuLi5rZXlzKSB7XG5cdGNvbnN0IGZsYXRLZXlzID0ga2V5cy5mbGF0KCk7XG5cdGNvbnN0IHByZWRpY2F0ZSA9IGZsYXRLZXlzWzBdO1xuXHRyZXR1cm4gcmVhY3RpdmVDb21wdXRlZCgoKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSBcImZ1bmN0aW9uXCIgPyBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModG9SZWZzJDEob2JqKSkuZmlsdGVyKChbaywgdl0pID0+ICFwcmVkaWNhdGUodG9WYWx1ZSh2KSwgaykpKSA6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKGUpID0+ICFmbGF0S2V5cy5pbmNsdWRlcyhlWzBdKSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVhY3RpdmVQaWNrL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBwaWNrIGZpZWxkcyBmcm9tIGEgcmVhY3RpdmUgb2JqZWN0XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3JlYWN0aXZlUGlja1xuKi9cbmZ1bmN0aW9uIHJlYWN0aXZlUGljayhvYmosIC4uLmtleXMpIHtcblx0Y29uc3QgZmxhdEtleXMgPSBrZXlzLmZsYXQoKTtcblx0Y29uc3QgcHJlZGljYXRlID0gZmxhdEtleXNbMF07XG5cdHJldHVybiByZWFjdGl2ZUNvbXB1dGVkKCgpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09IFwiZnVuY3Rpb25cIiA/IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0b1JlZnMkMShvYmopKS5maWx0ZXIoKFtrLCB2XSkgPT4gcHJlZGljYXRlKHRvVmFsdWUodiksIGspKSkgOiBPYmplY3QuZnJvbUVudHJpZXMoZmxhdEtleXMubWFwKChrKSA9PiBbaywgdG9SZWYob2JqLCBrKV0pKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHJlZkF1dG9SZXNldC9pbmRleC50c1xuLyoqXG4qIENyZWF0ZSBhIHJlZiB3aGljaCB3aWxsIGJlIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIGFmdGVyIHNvbWUgdGltZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvcmVmQXV0b1Jlc2V0XG4qIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHdoaWNoIHdpbGwgYmUgc2V0LlxuKiBAcGFyYW0gYWZ0ZXJNcyAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiovXG5mdW5jdGlvbiByZWZBdXRvUmVzZXQoZGVmYXVsdFZhbHVlLCBhZnRlck1zID0gMWU0KSB7XG5cdHJldHVybiBjdXN0b21SZWYoKHRyYWNrLCB0cmlnZ2VyKSA9PiB7XG5cdFx0bGV0IHZhbHVlID0gdG9WYWx1ZShkZWZhdWx0VmFsdWUpO1xuXHRcdGxldCB0aW1lcjtcblx0XHRjb25zdCByZXNldEFmdGVyID0gKCkgPT4gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHR2YWx1ZSA9IHRvVmFsdWUoZGVmYXVsdFZhbHVlKTtcblx0XHRcdHRyaWdnZXIoKTtcblx0XHR9LCB0b1ZhbHVlKGFmdGVyTXMpKTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQobmV3VmFsdWUpIHtcblx0XHRcdFx0dmFsdWUgPSBuZXdWYWx1ZTtcblx0XHRcdFx0dHJpZ2dlcigpO1xuXHRcdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHR0aW1lciA9IHJlc2V0QWZ0ZXIoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9KTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZkF1dG9SZXNldGAgaW5zdGVhZCAqL1xuY29uc3QgYXV0b1Jlc2V0UmVmID0gcmVmQXV0b1Jlc2V0O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEZWJvdW5jZUZuL2luZGV4LnRzXG4vKipcbiogRGVib3VuY2UgZXhlY3V0aW9uIG9mIGEgZnVuY3Rpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURlYm91bmNlRm5cbiogQHBhcmFtICBmbiAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcyBkZWJvdW5jZWQuXG4qIEBwYXJhbSAgbXMgICAgICAgICAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBGb3IgZXZlbnQgY2FsbGJhY2tzLCB2YWx1ZXMgYXJvdW5kIDEwMCBvciAyNTAgKG9yIGV2ZW4gaGlnaGVyKSBhcmUgbW9zdCB1c2VmdWwuXG4qIEBwYXJhbSAgb3B0aW9ucyAgICAgT3B0aW9uc1xuKlxuKiBAcmV0dXJuIEEgbmV3LCBkZWJvdW5jZSwgZnVuY3Rpb24uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlRGVib3VuY2VGbihmbiwgbXMgPSAyMDAsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gY3JlYXRlRmlsdGVyV3JhcHBlcihkZWJvdW5jZUZpbHRlcihtcywgb3B0aW9ucyksIGZuKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmRGVib3VuY2VkL2luZGV4LnRzXG4vKipcbiogRGVib3VuY2UgdXBkYXRlcyBvZiBhIHJlZi5cbipcbiogQHJldHVybiBBIG5ldyBkZWJvdW5jZWQgcmVmLlxuKi9cbmZ1bmN0aW9uIHJlZkRlYm91bmNlZCh2YWx1ZSwgbXMgPSAyMDAsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBkZWJvdW5jZWQgPSByZWYodG9WYWx1ZSh2YWx1ZSkpO1xuXHRjb25zdCB1cGRhdGVyID0gdXNlRGVib3VuY2VGbigoKSA9PiB7XG5cdFx0ZGVib3VuY2VkLnZhbHVlID0gdmFsdWUudmFsdWU7XG5cdH0sIG1zLCBvcHRpb25zKTtcblx0d2F0Y2godmFsdWUsICgpID0+IHVwZGF0ZXIoKSk7XG5cdHJldHVybiBzaGFsbG93UmVhZG9ubHkoZGVib3VuY2VkKTtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZkRlYm91bmNlZGAgaW5zdGVhZCAqL1xuY29uc3QgZGVib3VuY2VkUmVmID0gcmVmRGVib3VuY2VkO1xuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmRGVib3VuY2VkYCBpbnN0ZWFkICovXG5jb25zdCB1c2VEZWJvdW5jZSA9IHJlZkRlYm91bmNlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmRGVmYXVsdC9pbmRleC50c1xuLyoqXG4qIEFwcGx5IGRlZmF1bHQgdmFsdWUgdG8gYSByZWYuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gcmVmRGVmYXVsdChzb3VyY2UsIGRlZmF1bHRWYWx1ZSkge1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHZhciBfc291cmNlJHZhbHVlO1xuXHRcdFx0cmV0dXJuIChfc291cmNlJHZhbHVlID0gc291cmNlLnZhbHVlKSAhPT0gbnVsbCAmJiBfc291cmNlJHZhbHVlICE9PSB2b2lkIDAgPyBfc291cmNlJHZhbHVlIDogZGVmYXVsdFZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzb3VyY2UudmFsdWUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZNYW51YWxSZXNldC9pbmRleC50c1xuLyoqXG4qIENyZWF0ZSBhIHJlZiB3aXRoIG1hbnVhbCByZXNldCBmdW5jdGlvbmFsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9yZWZNYW51YWxSZXNldFxuKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB3aGljaCB3aWxsIGJlIHNldC5cbiovXG5mdW5jdGlvbiByZWZNYW51YWxSZXNldChkZWZhdWx0VmFsdWUpIHtcblx0bGV0IHZhbHVlID0gdG9WYWx1ZShkZWZhdWx0VmFsdWUpO1xuXHRsZXQgdHJpZ2dlcjtcblx0Y29uc3QgcmVzZXQgPSAoKSA9PiB7XG5cdFx0dmFsdWUgPSB0b1ZhbHVlKGRlZmF1bHRWYWx1ZSk7XG5cdFx0dHJpZ2dlcigpO1xuXHR9O1xuXHRjb25zdCByZWZWYWx1ZSA9IGN1c3RvbVJlZigodHJhY2ssIF90cmlnZ2VyKSA9PiB7XG5cdFx0dHJpZ2dlciA9IF90cmlnZ2VyO1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXQoKSB7XG5cdFx0XHRcdHRyYWNrKCk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQobmV3VmFsdWUpIHtcblx0XHRcdFx0dmFsdWUgPSBuZXdWYWx1ZTtcblx0XHRcdFx0dHJpZ2dlcigpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0pO1xuXHRyZWZWYWx1ZS5yZXNldCA9IHJlc2V0O1xuXHRyZXR1cm4gcmVmVmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRocm90dGxlRm4vaW5kZXgudHNcbi8qKlxuKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiogZXhlY3V0aW9uIG9mIGhhbmRsZXJzIG9uIGV2ZW50cyBsaWtlIHJlc2l6ZSBhbmQgc2Nyb2xsLlxuKlxuKiBAcGFyYW0gICBmbiAgICAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcy4gVGhlIGB0aGlzYCBjb250ZXh0IGFuZCBhbGwgYXJndW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCwgYXMtaXMsXG4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYGNhbGxiYWNrYCB3aGVuIHRoZSB0aHJvdHRsZWQtZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG4qIEBwYXJhbSAgIG1zICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcikgYXJlIG1vc3QgdXNlZnVsLlxuKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHZhbHVlOiAyMDApXG4qXG4qIEBwYXJhbSBbdHJhaWxpbmddIGlmIHRydWUsIGNhbGwgZm4gYWdhaW4gYWZ0ZXIgdGhlIHRpbWUgaXMgdXAgKGRlZmF1bHQgdmFsdWU6IGZhbHNlKVxuKlxuKiBAcGFyYW0gW2xlYWRpbmddIGlmIHRydWUsIGNhbGwgZm4gb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgbXMgdGltZW91dCAoZGVmYXVsdCB2YWx1ZTogdHJ1ZSlcbipcbiogQHBhcmFtIFtyZWplY3RPbkNhbmNlbF0gaWYgdHJ1ZSwgcmVqZWN0IHRoZSBsYXN0IGNhbGwgaWYgaXQncyBiZWVuIGNhbmNlbCAoZGVmYXVsdCB2YWx1ZTogZmFsc2UpXG4qXG4qIEByZXR1cm4gIEEgbmV3LCB0aHJvdHRsZWQsIGZ1bmN0aW9uLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVRocm90dGxlRm4oZm4sIG1zID0gMjAwLCB0cmFpbGluZyA9IGZhbHNlLCBsZWFkaW5nID0gdHJ1ZSwgcmVqZWN0T25DYW5jZWwgPSBmYWxzZSkge1xuXHRyZXR1cm4gY3JlYXRlRmlsdGVyV3JhcHBlcih0aHJvdHRsZUZpbHRlcihtcywgdHJhaWxpbmcsIGxlYWRpbmcsIHJlamVjdE9uQ2FuY2VsKSwgZm4pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiByZWZUaHJvdHRsZWQvaW5kZXgudHNcbi8qKlxuKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiogZXhlY3V0aW9uIG9mIGhhbmRsZXJzIG9uIGV2ZW50cyBsaWtlIHJlc2l6ZSBhbmQgc2Nyb2xsLlxuKlxuKiBAcGFyYW0gdmFsdWUgUmVmIHZhbHVlIHRvIGJlIHdhdGNoZWQgd2l0aCB0aHJvdHRsZSBlZmZlY3RcbiogQHBhcmFtICBkZWxheSAgQSB6ZXJvLW9yLWdyZWF0ZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBGb3IgZXZlbnQgY2FsbGJhY2tzLCB2YWx1ZXMgYXJvdW5kIDEwMCBvciAyNTAgKG9yIGV2ZW4gaGlnaGVyKSBhcmUgbW9zdCB1c2VmdWwuXG4qIEBwYXJhbSB0cmFpbGluZyBpZiB0cnVlLCB1cGRhdGUgdGhlIHZhbHVlIGFnYWluIGFmdGVyIHRoZSBkZWxheSB0aW1lIGlzIHVwXG4qIEBwYXJhbSBsZWFkaW5nIGlmIHRydWUsIHVwZGF0ZSB0aGUgdmFsdWUgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgbXMgdGltZW91dFxuKi9cbmZ1bmN0aW9uIHJlZlRocm90dGxlZCh2YWx1ZSwgZGVsYXkgPSAyMDAsIHRyYWlsaW5nID0gdHJ1ZSwgbGVhZGluZyA9IHRydWUpIHtcblx0aWYgKGRlbGF5IDw9IDApIHJldHVybiB2YWx1ZTtcblx0Y29uc3QgdGhyb3R0bGVkID0gcmVmKHRvVmFsdWUodmFsdWUpKTtcblx0Y29uc3QgdXBkYXRlciA9IHVzZVRocm90dGxlRm4oKCkgPT4ge1xuXHRcdHRocm90dGxlZC52YWx1ZSA9IHZhbHVlLnZhbHVlO1xuXHR9LCBkZWxheSwgdHJhaWxpbmcsIGxlYWRpbmcpO1xuXHR3YXRjaCh2YWx1ZSwgKCkgPT4gdXBkYXRlcigpKTtcblx0cmV0dXJuIHRocm90dGxlZDtcbn1cbi8qKiBAZGVwcmVjYXRlZCB1c2UgYHJlZlRocm90dGxlZGAgaW5zdGVhZCAqL1xuY29uc3QgdGhyb3R0bGVkUmVmID0gcmVmVGhyb3R0bGVkO1xuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmVmVGhyb3R0bGVkYCBpbnN0ZWFkICovXG5jb25zdCB1c2VUaHJvdHRsZSA9IHJlZlRocm90dGxlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gcmVmV2l0aENvbnRyb2wvaW5kZXgudHNcbi8qKlxuKiBGaW5lLWdyYWluZWQgY29udHJvbHMgb3ZlciByZWYgYW5kIGl0cyByZWFjdGl2aXR5LlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHJlZldpdGhDb250cm9sKGluaXRpYWwsIG9wdGlvbnMgPSB7fSkge1xuXHRsZXQgc291cmNlID0gaW5pdGlhbDtcblx0bGV0IHRyYWNrO1xuXHRsZXQgdHJpZ2dlcjtcblx0Y29uc3QgcmVmJDEgPSBjdXN0b21SZWYoKF90cmFjaywgX3RyaWdnZXIpID0+IHtcblx0XHR0cmFjayA9IF90cmFjaztcblx0XHR0cmlnZ2VyID0gX3RyaWdnZXI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0cmV0dXJuIGdldCQxKCk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0KHYpIHtcblx0XHRcdFx0c2V0JDEodik7XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG5cdGZ1bmN0aW9uIGdldCQxKHRyYWNraW5nID0gdHJ1ZSkge1xuXHRcdGlmICh0cmFja2luZykgdHJhY2soKTtcblx0XHRyZXR1cm4gc291cmNlO1xuXHR9XG5cdGZ1bmN0aW9uIHNldCQxKHZhbHVlLCB0cmlnZ2VyaW5nID0gdHJ1ZSkge1xuXHRcdHZhciBfb3B0aW9ucyRvbkJlZm9yZUNoYW4sIF9vcHRpb25zJG9uQ2hhbmdlZDtcblx0XHRpZiAodmFsdWUgPT09IHNvdXJjZSkgcmV0dXJuO1xuXHRcdGNvbnN0IG9sZCA9IHNvdXJjZTtcblx0XHRpZiAoKChfb3B0aW9ucyRvbkJlZm9yZUNoYW4gPSBvcHRpb25zLm9uQmVmb3JlQ2hhbmdlKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkJlZm9yZUNoYW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG9uQmVmb3JlQ2hhbi5jYWxsKG9wdGlvbnMsIHZhbHVlLCBvbGQpKSA9PT0gZmFsc2UpIHJldHVybjtcblx0XHRzb3VyY2UgPSB2YWx1ZTtcblx0XHQoX29wdGlvbnMkb25DaGFuZ2VkID0gb3B0aW9ucy5vbkNoYW5nZWQpID09PSBudWxsIHx8IF9vcHRpb25zJG9uQ2hhbmdlZCA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uQ2hhbmdlZC5jYWxsKG9wdGlvbnMsIHZhbHVlLCBvbGQpO1xuXHRcdGlmICh0cmlnZ2VyaW5nKSB0cmlnZ2VyKCk7XG5cdH1cblx0LyoqXG5cdCogR2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyYWNrZWQgaW4gdGhlIHJlYWN0aXZpdHkgc3lzdGVtXG5cdCovXG5cdGNvbnN0IHVudHJhY2tlZEdldCA9ICgpID0+IGdldCQxKGZhbHNlKTtcblx0LyoqXG5cdCogU2V0IHRoZSB2YWx1ZSB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIHJlYWN0aXZpdHkgc3lzdGVtXG5cdCovXG5cdGNvbnN0IHNpbGVudFNldCA9ICh2KSA9PiBzZXQkMSh2LCBmYWxzZSk7XG5cdC8qKlxuXHQqIEdldCB0aGUgdmFsdWUgd2l0aG91dCB0cmFja2VkIGluIHRoZSByZWFjdGl2aXR5IHN5c3RlbS5cblx0KlxuXHQqIEFsaWFzIGZvciBgdW50cmFja2VkR2V0KClgXG5cdCovXG5cdGNvbnN0IHBlZWsgPSAoKSA9PiBnZXQkMShmYWxzZSk7XG5cdC8qKlxuXHQqIFNldCB0aGUgdmFsdWUgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZSByZWFjdGl2aXR5IHN5c3RlbVxuXHQqXG5cdCogQWxpYXMgZm9yIGBzaWxlbnRTZXQodilgXG5cdCovXG5cdGNvbnN0IGxheSA9ICh2KSA9PiBzZXQkMSh2LCBmYWxzZSk7XG5cdHJldHVybiBleHRlbmRSZWYocmVmJDEsIHtcblx0XHRnZXQ6IGdldCQxLFxuXHRcdHNldDogc2V0JDEsXG5cdFx0dW50cmFja2VkR2V0LFxuXHRcdHNpbGVudFNldCxcblx0XHRwZWVrLFxuXHRcdGxheVxuXHR9LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGByZWZXaXRoQ29udHJvbGAgaW5zdGVhZCAqL1xuY29uc3QgY29udHJvbGxlZFJlZiA9IHJlZldpdGhDb250cm9sO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzZXQvaW5kZXgudHNcbi8qKlxuKiAgU2hvcnRoYW5kIGZvciBgcmVmLnZhbHVlID0geGBcbiovXG5mdW5jdGlvbiBzZXQoLi4uYXJncykge1xuXHRpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcblx0XHRjb25zdCBbcmVmJDEsIHZhbHVlXSA9IGFyZ3M7XG5cdFx0cmVmJDEudmFsdWUgPSB2YWx1ZTtcblx0fVxuXHRpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcblx0XHRjb25zdCBbdGFyZ2V0LCBrZXksIHZhbHVlXSA9IGFyZ3M7XG5cdFx0dGFyZ2V0W2tleV0gPSB2YWx1ZTtcblx0fVxufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaFdpdGhGaWx0ZXIvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoV2l0aEZpbHRlcihzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBldmVudEZpbHRlciA9IGJ5cGFzc0ZpbHRlciwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB3YXRjaChzb3VyY2UsIGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsIGNiKSwgd2F0Y2hPcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hQYXVzYWJsZS9pbmRleC50c1xuLyoqIEBkZXByZWNhdGVkIFVzZSBWdWUncyBidWlsdC1pbiBgd2F0Y2hgIGluc3RlYWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9uLiAqL1xuZnVuY3Rpb24gd2F0Y2hQYXVzYWJsZShzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBldmVudEZpbHRlcjogZmlsdGVyLCBpbml0aWFsU3RhdGUgPSBcImFjdGl2ZVwiLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBldmVudEZpbHRlciwgcGF1c2UsIHJlc3VtZSwgaXNBY3RpdmUgfSA9IHBhdXNhYmxlRmlsdGVyKGZpbHRlciwgeyBpbml0aWFsU3RhdGUgfSk7XG5cdHJldHVybiB7XG5cdFx0c3RvcDogd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIHtcblx0XHRcdC4uLndhdGNoT3B0aW9ucyxcblx0XHRcdGV2ZW50RmlsdGVyXG5cdFx0fSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGlzQWN0aXZlXG5cdH07XG59XG4vKiogQGRlcHJlY2F0ZWQgVXNlIFZ1ZSdzIGJ1aWx0LWluIGB3YXRjaGAgaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb24uICovXG5jb25zdCBwYXVzYWJsZVdhdGNoID0gd2F0Y2hQYXVzYWJsZTtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3luY1JlZi9pbmRleC50c1xuLyoqXG4qIFR3by13YXkgcmVmcyBzeW5jaHJvbml6YXRpb24uXG4qIEZyb20gdGhlIHNldCB0aGVvcnkgcGVyc3BlY3RpdmUgdG8gcmVzdHJpY3QgdGhlIG9wdGlvbidzIHR5cGVcbiogQ2hlY2sgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiogMS4gTCA9IFJcbiogMi4gTCDiiKkgUiDiiaAg4oiFXG4qIDMuIEwg4oqGIFJcbiogNC4gTCDiiKkgUiA9IOKIhVxuKi9cbmZ1bmN0aW9uIHN5bmNSZWYobGVmdCwgcmlnaHQsIC4uLltvcHRpb25zXSkge1xuXHRjb25zdCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSwgZGlyZWN0aW9uID0gXCJib3RoXCIsIHRyYW5zZm9ybSA9IHt9IH0gPSBvcHRpb25zIHx8IHt9O1xuXHRjb25zdCB3YXRjaGVycyA9IFtdO1xuXHRjb25zdCB0cmFuc2Zvcm1MVFIgPSBcImx0clwiIGluIHRyYW5zZm9ybSAmJiB0cmFuc2Zvcm0ubHRyIHx8ICgodikgPT4gdik7XG5cdGNvbnN0IHRyYW5zZm9ybVJUTCA9IFwicnRsXCIgaW4gdHJhbnNmb3JtICYmIHRyYW5zZm9ybS5ydGwgfHwgKCh2KSA9PiB2KTtcblx0aWYgKGRpcmVjdGlvbiA9PT0gXCJib3RoXCIgfHwgZGlyZWN0aW9uID09PSBcImx0clwiKSB3YXRjaGVycy5wdXNoKHdhdGNoUGF1c2FibGUobGVmdCwgKG5ld1ZhbHVlKSA9PiB7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5wYXVzZSgpKTtcblx0XHRyaWdodC52YWx1ZSA9IHRyYW5zZm9ybUxUUihuZXdWYWx1ZSk7XG5cdFx0d2F0Y2hlcnMuZm9yRWFjaCgodykgPT4gdy5yZXN1bWUoKSk7XG5cdH0sIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KSk7XG5cdGlmIChkaXJlY3Rpb24gPT09IFwiYm90aFwiIHx8IGRpcmVjdGlvbiA9PT0gXCJydGxcIikgd2F0Y2hlcnMucHVzaCh3YXRjaFBhdXNhYmxlKHJpZ2h0LCAobmV3VmFsdWUpID0+IHtcblx0XHR3YXRjaGVycy5mb3JFYWNoKCh3KSA9PiB3LnBhdXNlKCkpO1xuXHRcdGxlZnQudmFsdWUgPSB0cmFuc2Zvcm1SVEwobmV3VmFsdWUpO1xuXHRcdHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcucmVzdW1lKCkpO1xuXHR9LCB7XG5cdFx0Zmx1c2gsXG5cdFx0ZGVlcCxcblx0XHRpbW1lZGlhdGVcblx0fSkpO1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdHdhdGNoZXJzLmZvckVhY2goKHcpID0+IHcuc3RvcCgpKTtcblx0fTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHN5bmNSZWZzL2luZGV4LnRzXG4vKipcbiogS2VlcCB0YXJnZXQgcmVmKHMpIGluIHN5bmMgd2l0aCB0aGUgc291cmNlIHJlZlxuKlxuKiBAcGFyYW0gc291cmNlIHNvdXJjZSByZWZcbiogQHBhcmFtIHRhcmdldHNcbiovXG5mdW5jdGlvbiBzeW5jUmVmcyhzb3VyY2UsIHRhcmdldHMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGZsdXNoID0gXCJzeW5jXCIsIGRlZXAgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGFyZ2V0c0FycmF5ID0gdG9BcnJheSh0YXJnZXRzKTtcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgKG5ld1ZhbHVlKSA9PiB0YXJnZXRzQXJyYXkuZm9yRWFjaCgodGFyZ2V0KSA9PiB0YXJnZXQudmFsdWUgPSBuZXdWYWx1ZSksIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdG9SZWZzL2luZGV4LnRzXG4vKipcbiogRXh0ZW5kZWQgYHRvUmVmc2AgdGhhdCBhbHNvIGFjY2VwdHMgcmVmcyBvZiBhbiBvYmplY3QuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3RvUmVmc1xuKiBAcGFyYW0gb2JqZWN0UmVmIEEgcmVmIG9yIG5vcm1hbCBvYmplY3Qgb3IgYXJyYXkuXG4qIEBwYXJhbSBvcHRpb25zIE9wdGlvbnNcbiovXG5mdW5jdGlvbiB0b1JlZnMob2JqZWN0UmVmLCBvcHRpb25zID0ge30pIHtcblx0aWYgKCFpc1JlZihvYmplY3RSZWYpKSByZXR1cm4gdG9SZWZzJDEob2JqZWN0UmVmKTtcblx0Y29uc3QgcmVzdWx0ID0gQXJyYXkuaXNBcnJheShvYmplY3RSZWYudmFsdWUpID8gQXJyYXkuZnJvbSh7IGxlbmd0aDogb2JqZWN0UmVmLnZhbHVlLmxlbmd0aCB9KSA6IHt9O1xuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3RSZWYudmFsdWUpIHJlc3VsdFtrZXldID0gY3VzdG9tUmVmKCgpID0+ICh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIG9iamVjdFJlZi52YWx1ZVtrZXldO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHZhciBfdG9WYWx1ZTtcblx0XHRcdGlmICgoX3RvVmFsdWUgPSB0b1ZhbHVlKG9wdGlvbnMucmVwbGFjZVJlZikpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHRydWUpIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFJlZi52YWx1ZSkpIHtcblx0XHRcdFx0Y29uc3QgY29weSA9IFsuLi5vYmplY3RSZWYudmFsdWVdO1xuXHRcdFx0XHRjb3B5W2tleV0gPSB2O1xuXHRcdFx0XHRvYmplY3RSZWYudmFsdWUgPSBjb3B5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmV3T2JqZWN0ID0ge1xuXHRcdFx0XHRcdC4uLm9iamVjdFJlZi52YWx1ZSxcblx0XHRcdFx0XHRba2V5XTogdlxuXHRcdFx0XHR9O1xuXHRcdFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3T2JqZWN0LCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0UmVmLnZhbHVlKSk7XG5cdFx0XHRcdG9iamVjdFJlZi52YWx1ZSA9IG5ld09iamVjdDtcblx0XHRcdH1cblx0XHRcdGVsc2Ugb2JqZWN0UmVmLnZhbHVlW2tleV0gPSB2O1xuXHRcdH1cblx0fSkpO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB0cnlPbkJlZm9yZU1vdW50L2luZGV4LnRzXG4vKipcbiogQ2FsbCBvbkJlZm9yZU1vdW50KCkgaWYgaXQncyBpbnNpZGUgYSBjb21wb25lbnQgbGlmZWN5Y2xlLCBpZiBub3QsIGp1c3QgY2FsbCB0aGUgZnVuY3Rpb25cbipcbiogQHBhcmFtIGZuXG4qIEBwYXJhbSBzeW5jIGlmIHNldCB0byBmYWxzZSwgaXQgd2lsbCBydW4gaW4gdGhlIG5leHRUaWNrKCkgb2YgVnVlXG4qIEBwYXJhbSB0YXJnZXRcbiovXG5mdW5jdGlvbiB0cnlPbkJlZm9yZU1vdW50KGZuLCBzeW5jID0gdHJ1ZSwgdGFyZ2V0KSB7XG5cdGlmIChnZXRMaWZlQ3ljbGVUYXJnZXQodGFyZ2V0KSkgb25CZWZvcmVNb3VudChmbiwgdGFyZ2V0KTtcblx0ZWxzZSBpZiAoc3luYykgZm4oKTtcblx0ZWxzZSBuZXh0VGljayhmbik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uQmVmb3JlVW5tb3VudC9pbmRleC50c1xuLyoqXG4qIENhbGwgb25CZWZvcmVVbm1vdW50KCkgaWYgaXQncyBpbnNpZGUgYSBjb21wb25lbnQgbGlmZWN5Y2xlLCBpZiBub3QsIGRvIG5vdGhpbmdcbipcbiogQHBhcmFtIGZuXG4qIEBwYXJhbSB0YXJnZXRcbiovXG5mdW5jdGlvbiB0cnlPbkJlZm9yZVVubW91bnQoZm4sIHRhcmdldCkge1xuXHRpZiAoZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkpIG9uQmVmb3JlVW5tb3VudChmbiwgdGFyZ2V0KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdHJ5T25Nb3VudGVkL2luZGV4LnRzXG4vKipcbiogQ2FsbCBvbk1vdW50ZWQoKSBpZiBpdCdzIGluc2lkZSBhIGNvbXBvbmVudCBsaWZlY3ljbGUsIGlmIG5vdCwganVzdCBjYWxsIHRoZSBmdW5jdGlvblxuKlxuKiBAcGFyYW0gZm5cbiogQHBhcmFtIHN5bmMgaWYgc2V0IHRvIGZhbHNlLCBpdCB3aWxsIHJ1biBpbiB0aGUgbmV4dFRpY2soKSBvZiBWdWVcbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHRyeU9uTW91bnRlZChmbiwgc3luYyA9IHRydWUsIHRhcmdldCkge1xuXHRpZiAoZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkpIG9uTW91bnRlZChmbiwgdGFyZ2V0KTtcblx0ZWxzZSBpZiAoc3luYykgZm4oKTtcblx0ZWxzZSBuZXh0VGljayhmbik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHRyeU9uVW5tb3VudGVkL2luZGV4LnRzXG4vKipcbiogQ2FsbCBvblVubW91bnRlZCgpIGlmIGl0J3MgaW5zaWRlIGEgY29tcG9uZW50IGxpZmVjeWNsZSwgaWYgbm90LCBkbyBub3RoaW5nXG4qXG4qIEBwYXJhbSBmblxuKiBAcGFyYW0gdGFyZ2V0XG4qL1xuZnVuY3Rpb24gdHJ5T25Vbm1vdW50ZWQoZm4sIHRhcmdldCkge1xuXHRpZiAoZ2V0TGlmZUN5Y2xlVGFyZ2V0KHRhcmdldCkpIG9uVW5tb3VudGVkKGZuLCB0YXJnZXQpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1bnRpbC9pbmRleC50c1xuZnVuY3Rpb24gY3JlYXRlVW50aWwociwgaXNOb3QgPSBmYWxzZSkge1xuXHRmdW5jdGlvbiB0b01hdGNoKGNvbmRpdGlvbiwgeyBmbHVzaCA9IFwic3luY1wiLCBkZWVwID0gZmFsc2UsIHRpbWVvdXQsIHRocm93T25UaW1lb3V0IH0gPSB7fSkge1xuXHRcdGxldCBzdG9wID0gbnVsbDtcblx0XHRjb25zdCBwcm9taXNlcyA9IFtuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0c3RvcCA9IHdhdGNoKHIsICh2KSA9PiB7XG5cdFx0XHRcdGlmIChjb25kaXRpb24odikgIT09IGlzTm90KSB7XG5cdFx0XHRcdFx0aWYgKHN0b3ApIHN0b3AoKTtcblx0XHRcdFx0XHRlbHNlIG5leHRUaWNrKCgpID0+IHN0b3AgPT09IG51bGwgfHwgc3RvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RvcCgpKTtcblx0XHRcdFx0XHRyZXNvbHZlKHYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB7XG5cdFx0XHRcdGZsdXNoLFxuXHRcdFx0XHRkZWVwLFxuXHRcdFx0XHRpbW1lZGlhdGU6IHRydWVcblx0XHRcdH0pO1xuXHRcdH0pXTtcblx0XHRpZiAodGltZW91dCAhPSBudWxsKSBwcm9taXNlcy5wdXNoKHByb21pc2VUaW1lb3V0KHRpbWVvdXQsIHRocm93T25UaW1lb3V0KS50aGVuKCgpID0+IHRvVmFsdWUocikpLmZpbmFsbHkoKCkgPT4gc3RvcCA9PT0gbnVsbCB8fCBzdG9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdG9wKCkpKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yYWNlKHByb21pc2VzKTtcblx0fVxuXHRmdW5jdGlvbiB0b0JlKHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0aWYgKCFpc1JlZih2YWx1ZSkpIHJldHVybiB0b01hdGNoKCh2KSA9PiB2ID09PSB2YWx1ZSwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgeyBmbHVzaCA9IFwic3luY1wiLCBkZWVwID0gZmFsc2UsIHRpbWVvdXQsIHRocm93T25UaW1lb3V0IH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0XHRsZXQgc3RvcCA9IG51bGw7XG5cdFx0Y29uc3QgcHJvbWlzZXMgPSBbbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdHN0b3AgPSB3YXRjaChbciwgdmFsdWVdLCAoW3YxLCB2Ml0pID0+IHtcblx0XHRcdFx0aWYgKGlzTm90ICE9PSAodjEgPT09IHYyKSkge1xuXHRcdFx0XHRcdGlmIChzdG9wKSBzdG9wKCk7XG5cdFx0XHRcdFx0ZWxzZSBuZXh0VGljaygoKSA9PiBzdG9wID09PSBudWxsIHx8IHN0b3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0b3AoKSk7XG5cdFx0XHRcdFx0cmVzb2x2ZSh2MSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHtcblx0XHRcdFx0Zmx1c2gsXG5cdFx0XHRcdGRlZXAsXG5cdFx0XHRcdGltbWVkaWF0ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fSldO1xuXHRcdGlmICh0aW1lb3V0ICE9IG51bGwpIHByb21pc2VzLnB1c2gocHJvbWlzZVRpbWVvdXQodGltZW91dCwgdGhyb3dPblRpbWVvdXQpLnRoZW4oKCkgPT4gdG9WYWx1ZShyKSkuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRzdG9wID09PSBudWxsIHx8IHN0b3AgPT09IHZvaWQgMCB8fCBzdG9wKCk7XG5cdFx0XHRyZXR1cm4gdG9WYWx1ZShyKTtcblx0XHR9KSk7XG5cdFx0cmV0dXJuIFByb21pc2UucmFjZShwcm9taXNlcyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9CZVRydXRoeShvcHRpb25zKSB7XG5cdFx0cmV0dXJuIHRvTWF0Y2goKHYpID0+IEJvb2xlYW4odiksIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmVOdWxsKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdG9CZShudWxsLCBvcHRpb25zKTtcblx0fVxuXHRmdW5jdGlvbiB0b0JlVW5kZWZpbmVkKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gdG9CZSh2b2lkIDAsIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIHRvQmVOYU4ob3B0aW9ucykge1xuXHRcdHJldHVybiB0b01hdGNoKE51bWJlci5pc05hTiwgb3B0aW9ucyk7XG5cdH1cblx0ZnVuY3Rpb24gdG9Db250YWlucyh2YWx1ZSwgb3B0aW9ucykge1xuXHRcdHJldHVybiB0b01hdGNoKCh2KSA9PiB7XG5cdFx0XHRjb25zdCBhcnJheSA9IEFycmF5LmZyb20odik7XG5cdFx0XHRyZXR1cm4gYXJyYXkuaW5jbHVkZXModmFsdWUpIHx8IGFycmF5LmluY2x1ZGVzKHRvVmFsdWUodmFsdWUpKTtcblx0XHR9LCBvcHRpb25zKTtcblx0fVxuXHRmdW5jdGlvbiBjaGFuZ2VkKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gY2hhbmdlZFRpbWVzKDEsIG9wdGlvbnMpO1xuXHR9XG5cdGZ1bmN0aW9uIGNoYW5nZWRUaW1lcyhuID0gMSwgb3B0aW9ucykge1xuXHRcdGxldCBjb3VudCA9IC0xO1xuXHRcdHJldHVybiB0b01hdGNoKCgpID0+IHtcblx0XHRcdGNvdW50ICs9IDE7XG5cdFx0XHRyZXR1cm4gY291bnQgPj0gbjtcblx0XHR9LCBvcHRpb25zKTtcblx0fVxuXHRpZiAoQXJyYXkuaXNBcnJheSh0b1ZhbHVlKHIpKSkgcmV0dXJuIHtcblx0XHR0b01hdGNoLFxuXHRcdHRvQ29udGFpbnMsXG5cdFx0Y2hhbmdlZCxcblx0XHRjaGFuZ2VkVGltZXMsXG5cdFx0Z2V0IG5vdCgpIHtcblx0XHRcdHJldHVybiBjcmVhdGVVbnRpbChyLCAhaXNOb3QpO1xuXHRcdH1cblx0fTtcblx0ZWxzZSByZXR1cm4ge1xuXHRcdHRvTWF0Y2gsXG5cdFx0dG9CZSxcblx0XHR0b0JlVHJ1dGh5LFxuXHRcdHRvQmVOdWxsLFxuXHRcdHRvQmVOYU4sXG5cdFx0dG9CZVVuZGVmaW5lZCxcblx0XHRjaGFuZ2VkLFxuXHRcdGNoYW5nZWRUaW1lcyxcblx0XHRnZXQgbm90KCkge1xuXHRcdFx0cmV0dXJuIGNyZWF0ZVVudGlsKHIsICFpc05vdCk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gdW50aWwocikge1xuXHRyZXR1cm4gY3JlYXRlVW50aWwocik7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RGlmZmVyZW5jZS9pbmRleC50c1xuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3IodmFsdWUsIG90aFZhbCkge1xuXHRyZXR1cm4gdmFsdWUgPT09IG90aFZhbDtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBnZXQgYXJyYXkgZGlmZmVyZW5jZSBvZiB0d28gYXJyYXlcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlEaWZmZXJlbmNlXG4qIEByZXR1cm5zIC0gdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGFycmF5XG4qIEBwYXJhbSBhcmdzXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlEaWZmZXJlbmNlKC4uLmFyZ3MpIHtcblx0dmFyIF9hcmdzJCwgX2FyZ3MkMjtcblx0Y29uc3QgbGlzdCA9IGFyZ3NbMF07XG5cdGNvbnN0IHZhbHVlcyA9IGFyZ3NbMV07XG5cdGxldCBjb21wYXJlRm4gPSAoX2FyZ3MkID0gYXJnc1syXSkgIT09IG51bGwgJiYgX2FyZ3MkICE9PSB2b2lkIDAgPyBfYXJncyQgOiBkZWZhdWx0Q29tcGFyYXRvcjtcblx0Y29uc3QgeyBzeW1tZXRyaWMgPSBmYWxzZSB9ID0gKF9hcmdzJDIgPSBhcmdzWzNdKSAhPT0gbnVsbCAmJiBfYXJncyQyICE9PSB2b2lkIDAgPyBfYXJncyQyIDoge307XG5cdGlmICh0eXBlb2YgY29tcGFyZUZuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0Y29uc3Qga2V5ID0gY29tcGFyZUZuO1xuXHRcdGNvbXBhcmVGbiA9ICh2YWx1ZSwgb3RoVmFsKSA9PiB2YWx1ZVtrZXldID09PSBvdGhWYWxba2V5XTtcblx0fVxuXHRjb25zdCBkaWZmMSA9IGNvbXB1dGVkKCgpID0+IHRvVmFsdWUobGlzdCkuZmlsdGVyKCh4KSA9PiB0b1ZhbHVlKHZhbHVlcykuZmluZEluZGV4KCh5KSA9PiBjb21wYXJlRm4oeCwgeSkpID09PSAtMSkpO1xuXHRpZiAoc3ltbWV0cmljKSB7XG5cdFx0Y29uc3QgZGlmZjIgPSBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKHZhbHVlcykuZmlsdGVyKCh4KSA9PiB0b1ZhbHVlKGxpc3QpLmZpbmRJbmRleCgoeSkgPT4gY29tcGFyZUZuKHgsIHkpKSA9PT0gLTEpKTtcblx0XHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gc3ltbWV0cmljID8gWy4uLnRvVmFsdWUoZGlmZjEpLCAuLi50b1ZhbHVlKGRpZmYyKV0gOiB0b1ZhbHVlKGRpZmYxKSk7XG5cdH0gZWxzZSByZXR1cm4gZGlmZjE7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RXZlcnkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuZXZlcnlgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5RXZlcnlcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuKlxuKiBAcmV0dXJucyAqKnRydWUqKiBpZiB0aGUgYGZuYCBmdW5jdGlvbiByZXR1cm5zIGEgKip0cnV0aHkqKiB2YWx1ZSBmb3IgZXZlcnkgZWxlbWVudCBmcm9tIHRoZSBhcnJheS4gT3RoZXJ3aXNlLCAqKmZhbHNlKiouXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlFdmVyeShsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5ldmVyeSgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RmlsdGVyL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYEFycmF5LmZpbHRlcmBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlGaWx0ZXJcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGZvciBldmVyeSBlbGVtZW50IG9mIHRoZSBnaXZlbiBgbGlzdGAuIEVhY2ggdGltZSBgZm5gIGV4ZWN1dGVzLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIG5ldyBhcnJheS5cbipcbiogQHJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgYSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBhcnJheSwgZmlsdGVyZWQgZG93biB0byBqdXN0IHRoZSBlbGVtZW50cyBmcm9tIHRoZSBnaXZlbiBhcnJheSB0aGF0IHBhc3MgdGhlIHRlc3QgaW1wbGVtZW50ZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLiBJZiBubyBlbGVtZW50cyBwYXNzIHRoZSB0ZXN0LCBhbiBlbXB0eSBhcnJheSB3aWxsIGJlIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmlsdGVyKGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkuZmlsdGVyKGZuKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RmluZC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5maW5kYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbmRcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuKlxuKiBAcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHRlc3RpbmcgZnVuY3Rpb24uIE90aGVyd2lzZSwgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmluZChsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZSh0b1ZhbHVlKGxpc3QpLmZpbmQoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlGaW5kSW5kZXgvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuZmluZEluZGV4YFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheUZpbmRJbmRleFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgdGhhdCBwYXNzZXMgdGhlIHRlc3QuIE90aGVyd2lzZSwgXCItMVwiLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5RmluZEluZGV4KGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLmZpbmRJbmRleCgoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5RmluZExhc3QvaW5kZXgudHNcbmZ1bmN0aW9uIGZpbmRMYXN0KGFyciwgY2IpIHtcblx0bGV0IGluZGV4ID0gYXJyLmxlbmd0aDtcblx0d2hpbGUgKGluZGV4LS0gPiAwKSBpZiAoY2IoYXJyW2luZGV4XSwgaW5kZXgsIGFycikpIHJldHVybiBhcnJbaW5kZXhdO1xufVxuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5maW5kTGFzdGBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlGaW5kTGFzdFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4qXG4qIEByZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IHRoYXQgc2F0aXNmaWVzIHRoZSBwcm92aWRlZCB0ZXN0aW5nIGZ1bmN0aW9uLiBPdGhlcndpc2UsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUZpbmRMYXN0KGxpc3QsIGZuKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKCFBcnJheS5wcm90b3R5cGUuZmluZExhc3QgPyBmaW5kTGFzdCh0b1ZhbHVlKGxpc3QpLCAoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBmbih0b1ZhbHVlKGVsZW1lbnQpLCBpbmRleCwgYXJyYXkpKSA6IHRvVmFsdWUobGlzdCkuZmluZExhc3QoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gZm4odG9WYWx1ZShlbGVtZW50KSwgaW5kZXgsIGFycmF5KSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlJbmNsdWRlcy9pbmRleC50c1xuZnVuY3Rpb24gaXNBcnJheUluY2x1ZGVzT3B0aW9ucyhvYmopIHtcblx0cmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgY29udGFpbnNQcm9wKG9iaiwgXCJmb3JtSW5kZXhcIiwgXCJjb21wYXJhdG9yXCIpO1xufVxuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5pbmNsdWRlc2BcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlJbmNsdWRlc1xuKlxuKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBgdmFsdWVgIGlzIGZvdW5kIGluIHRoZSBhcnJheS4gT3RoZXJ3aXNlLCBmYWxzZS5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUluY2x1ZGVzKC4uLmFyZ3MpIHtcblx0dmFyIF9jb21wYXJhdG9yO1xuXHRjb25zdCBsaXN0ID0gYXJnc1swXTtcblx0Y29uc3QgdmFsdWUgPSBhcmdzWzFdO1xuXHRsZXQgY29tcGFyYXRvciA9IGFyZ3NbMl07XG5cdGxldCBmb3JtSW5kZXggPSAwO1xuXHRpZiAoaXNBcnJheUluY2x1ZGVzT3B0aW9ucyhjb21wYXJhdG9yKSkge1xuXHRcdHZhciBfY29tcGFyYXRvciRmcm9tSW5kZXg7XG5cdFx0Zm9ybUluZGV4ID0gKF9jb21wYXJhdG9yJGZyb21JbmRleCA9IGNvbXBhcmF0b3IuZnJvbUluZGV4KSAhPT0gbnVsbCAmJiBfY29tcGFyYXRvciRmcm9tSW5kZXggIT09IHZvaWQgMCA/IF9jb21wYXJhdG9yJGZyb21JbmRleCA6IDA7XG5cdFx0Y29tcGFyYXRvciA9IGNvbXBhcmF0b3IuY29tcGFyYXRvcjtcblx0fVxuXHRpZiAodHlwZW9mIGNvbXBhcmF0b3IgPT09IFwic3RyaW5nXCIpIHtcblx0XHRjb25zdCBrZXkgPSBjb21wYXJhdG9yO1xuXHRcdGNvbXBhcmF0b3IgPSAoZWxlbWVudCwgdmFsdWUkMSkgPT4gZWxlbWVudFtrZXldID09PSB0b1ZhbHVlKHZhbHVlJDEpO1xuXHR9XG5cdGNvbXBhcmF0b3IgPSAoX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yKSAhPT0gbnVsbCAmJiBfY29tcGFyYXRvciAhPT0gdm9pZCAwID8gX2NvbXBhcmF0b3IgOiAoKGVsZW1lbnQsIHZhbHVlJDEpID0+IGVsZW1lbnQgPT09IHRvVmFsdWUodmFsdWUkMSkpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5zbGljZShmb3JtSW5kZXgpLnNvbWUoKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4gY29tcGFyYXRvcih0b1ZhbHVlKGVsZW1lbnQpLCB0b1ZhbHVlKHZhbHVlKSwgaW5kZXgsIHRvVmFsdWUoYXJyYXkpKSkpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheUpvaW4vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkuam9pbmBcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXJyYXlKb2luXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIHNlcGFyYXRvciAtIGEgc3RyaW5nIHRvIHNlcGFyYXRlIGVhY2ggcGFpciBvZiBhZGphY2VudCBlbGVtZW50cyBvZiB0aGUgYXJyYXkuIElmIG9taXR0ZWQsIHRoZSBhcnJheSBlbGVtZW50cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBjb21tYSAoXCIsXCIpLlxuKlxuKiBAcmV0dXJucyBhIHN0cmluZyB3aXRoIGFsbCBhcnJheSBlbGVtZW50cyBqb2luZWQuIElmIGFyci5sZW5ndGggaXMgMCwgdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheUpvaW4obGlzdCwgc2VwYXJhdG9yKSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB0b1ZhbHVlKGxpc3QpLm1hcCgoaSkgPT4gdG9WYWx1ZShpKSkuam9pbih0b1ZhbHVlKHNlcGFyYXRvcikpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlNYXAvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBgQXJyYXkubWFwYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheU1hcFxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBmbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGBsaXN0YC4gRWFjaCB0aW1lIGBmbmAgZXhlY3V0ZXMsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgbmV3IGFycmF5LlxuKlxuKiBAcmV0dXJucyBhIG5ldyBhcnJheSB3aXRoIGVhY2ggZWxlbWVudCBiZWluZyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VBcnJheU1hcChsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5tYXAoKGkpID0+IHRvVmFsdWUoaSkpLm1hcChmbikpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBcnJheVJlZHVjZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5yZWR1Y2VgXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFycmF5UmVkdWNlXG4qIEBwYXJhbSBsaXN0IC0gdGhlIGFycmF5IHdhcyBjYWxsZWQgdXBvbi5cbiogQHBhcmFtIHJlZHVjZXIgLSBhIFwicmVkdWNlclwiIGZ1bmN0aW9uLlxuKiBAcGFyYW0gYXJnc1xuKlxuKiBAcmV0dXJucyB0aGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gcnVubmluZyB0aGUgXCJyZWR1Y2VyXCIgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY29tcGxldGlvbiBvdmVyIHRoZSBlbnRpcmUgYXJyYXkuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQXJyYXlSZWR1Y2UobGlzdCwgcmVkdWNlciwgLi4uYXJncykge1xuXHRjb25zdCByZWR1Y2VDYWxsYmFjayA9IChzdW0sIHZhbHVlLCBpbmRleCkgPT4gcmVkdWNlcih0b1ZhbHVlKHN1bSksIHRvVmFsdWUodmFsdWUpLCBpbmRleCk7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSB0b1ZhbHVlKGxpc3QpO1xuXHRcdHJldHVybiBhcmdzLmxlbmd0aCA/IHJlc29sdmVkLnJlZHVjZShyZWR1Y2VDYWxsYmFjaywgdHlwZW9mIGFyZ3NbMF0gPT09IFwiZnVuY3Rpb25cIiA/IHRvVmFsdWUoYXJnc1swXSgpKSA6IHRvVmFsdWUoYXJnc1swXSkpIDogcmVzb2x2ZWQucmVkdWNlKHJlZHVjZUNhbGxiYWNrKTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUFycmF5U29tZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBBcnJheS5zb21lYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheVNvbWVcbiogQHBhcmFtIGxpc3QgLSB0aGUgYXJyYXkgd2FzIGNhbGxlZCB1cG9uLlxuKiBAcGFyYW0gZm4gLSBhIGZ1bmN0aW9uIHRvIHRlc3QgZWFjaCBlbGVtZW50LlxuKlxuKiBAcmV0dXJucyAqKnRydWUqKiBpZiB0aGUgYGZuYCBmdW5jdGlvbiByZXR1cm5zIGEgKip0cnV0aHkqKiB2YWx1ZSBmb3IgYW55IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuIE90aGVyd2lzZSwgKipmYWxzZSoqLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5U29tZShsaXN0LCBmbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShsaXN0KS5zb21lKChlbGVtZW50LCBpbmRleCwgYXJyYXkpID0+IGZuKHRvVmFsdWUoZWxlbWVudCksIGluZGV4LCBhcnJheSkpKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXJyYXlVbmlxdWUvaW5kZXgudHNcbmZ1bmN0aW9uIHVuaXEoYXJyYXkpIHtcblx0cmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhcnJheSkpO1xufVxuZnVuY3Rpb24gdW5pcXVlRWxlbWVudHNCeShhcnJheSwgZm4pIHtcblx0cmV0dXJuIGFycmF5LnJlZHVjZSgoYWNjLCB2KSA9PiB7XG5cdFx0aWYgKCFhY2Muc29tZSgoeCkgPT4gZm4odiwgeCwgYXJyYXkpKSkgYWNjLnB1c2godik7XG5cdFx0cmV0dXJuIGFjYztcblx0fSwgW10pO1xufVxuLyoqXG4qIHJlYWN0aXZlIHVuaXF1ZSBhcnJheVxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBcnJheVVuaXF1ZVxuKiBAcGFyYW0gbGlzdCAtIHRoZSBhcnJheSB3YXMgY2FsbGVkIHVwb24uXG4qIEBwYXJhbSBjb21wYXJlRm5cbiogQHJldHVybnMgQSBjb21wdXRlZCByZWYgdGhhdCByZXR1cm5zIGEgdW5pcXVlIGFycmF5IG9mIGl0ZW1zLlxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZUFycmF5VW5pcXVlKGxpc3QsIGNvbXBhcmVGbikge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHJlc29sdmVkTGlzdCA9IHRvVmFsdWUobGlzdCkubWFwKChlbGVtZW50KSA9PiB0b1ZhbHVlKGVsZW1lbnQpKTtcblx0XHRyZXR1cm4gY29tcGFyZUZuID8gdW5pcXVlRWxlbWVudHNCeShyZXNvbHZlZExpc3QsIGNvbXBhcmVGbikgOiB1bmlxKHJlc29sdmVkTGlzdCk7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDb3VudGVyL2luZGV4LnRzXG4vKipcbiogQmFzaWMgY291bnRlciB3aXRoIHV0aWxpdHkgZnVuY3Rpb25zLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb3VudGVyXG4qIEBwYXJhbSBbaW5pdGlhbFZhbHVlXVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUNvdW50ZXIoaW5pdGlhbFZhbHVlID0gMCwgb3B0aW9ucyA9IHt9KSB7XG5cdGxldCBfaW5pdGlhbFZhbHVlID0gdW5yZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgY291bnQgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHsgbWF4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBtaW4gPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGluYyA9IChkZWx0YSA9IDEpID0+IGNvdW50LnZhbHVlID0gTWF0aC5tYXgoTWF0aC5taW4obWF4LCBjb3VudC52YWx1ZSArIGRlbHRhKSwgbWluKTtcblx0Y29uc3QgZGVjID0gKGRlbHRhID0gMSkgPT4gY291bnQudmFsdWUgPSBNYXRoLm1pbihNYXRoLm1heChtaW4sIGNvdW50LnZhbHVlIC0gZGVsdGEpLCBtYXgpO1xuXHRjb25zdCBnZXQkMSA9ICgpID0+IGNvdW50LnZhbHVlO1xuXHRjb25zdCBzZXQkMSA9ICh2YWwpID0+IGNvdW50LnZhbHVlID0gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbCkpO1xuXHRjb25zdCByZXNldCA9ICh2YWwgPSBfaW5pdGlhbFZhbHVlKSA9PiB7XG5cdFx0X2luaXRpYWxWYWx1ZSA9IHZhbDtcblx0XHRyZXR1cm4gc2V0JDEodmFsKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRjb3VudDogc2hhbGxvd1JlYWRvbmx5KGNvdW50KSxcblx0XHRpbmMsXG5cdFx0ZGVjLFxuXHRcdGdldDogZ2V0JDEsXG5cdFx0c2V0OiBzZXQkMSxcblx0XHRyZXNldFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEYXRlRm9ybWF0L2luZGV4LnRzXG5jb25zdCBSRUdFWF9QQVJTRSA9IC9eKFxcZHs0fSlbLS9dPyhcXGR7MSwyfSk/Wy0vXT8oXFxkezAsMn0pW1RcXHNdKihcXGR7MSwyfSk/Oj8oXFxkezEsMn0pPzo/KFxcZHsxLDJ9KT9bLjpdPyhcXGQrKT8kL2k7XG5jb25zdCBSRUdFWF9GT1JNQVQgPSAvW1lNREhobXNdb3xcXFsoW15cXF1dKylcXF18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXsxLDJ9fEF7MSwyfXxtezEsMn18c3sxLDJ9fFp7MSwyfXx6ezEsNH18U1NTL2c7XG5mdW5jdGlvbiBkZWZhdWx0TWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXJjYXNlLCBoYXNQZXJpb2QpIHtcblx0bGV0IG0gPSBob3VycyA8IDEyID8gXCJBTVwiIDogXCJQTVwiO1xuXHRpZiAoaGFzUGVyaW9kKSBtID0gbS5zcGxpdChcIlwiKS5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICs9IGAke2N1cnJ9LmAsIFwiXCIpO1xuXHRyZXR1cm4gaXNMb3dlcmNhc2UgPyBtLnRvTG93ZXJDYXNlKCkgOiBtO1xufVxuZnVuY3Rpb24gZm9ybWF0T3JkaW5hbChudW0pIHtcblx0Y29uc3Qgc3VmZml4ZXMgPSBbXG5cdFx0XCJ0aFwiLFxuXHRcdFwic3RcIixcblx0XHRcIm5kXCIsXG5cdFx0XCJyZFwiXG5cdF07XG5cdGNvbnN0IHYgPSBudW0gJSAxMDA7XG5cdHJldHVybiBudW0gKyAoc3VmZml4ZXNbKHYgLSAyMCkgJSAxMF0gfHwgc3VmZml4ZXNbdl0gfHwgc3VmZml4ZXNbMF0pO1xufVxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkY3VzdG9tTWVyaWRpO1xuXHRjb25zdCB5ZWFycyA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0Y29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG5cdGNvbnN0IGRheXMgPSBkYXRlLmdldERhdGUoKTtcblx0Y29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG5cdGNvbnN0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcblx0Y29uc3Qgc2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuXHRjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuXHRjb25zdCBkYXkgPSBkYXRlLmdldERheSgpO1xuXHRjb25zdCBtZXJpZGllbSA9IChfb3B0aW9ucyRjdXN0b21NZXJpZGkgPSBvcHRpb25zLmN1c3RvbU1lcmlkaWVtKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRjdXN0b21NZXJpZGkgIT09IHZvaWQgMCA/IF9vcHRpb25zJGN1c3RvbU1lcmlkaSA6IGRlZmF1bHRNZXJpZGllbTtcblx0Y29uc3Qgc3RyaXBUaW1lWm9uZSA9IChkYXRlU3RyaW5nKSA9PiB7XG5cdFx0dmFyIF9kYXRlU3RyaW5nJHNwbGl0JDtcblx0XHRyZXR1cm4gKF9kYXRlU3RyaW5nJHNwbGl0JCA9IGRhdGVTdHJpbmcuc3BsaXQoXCIgXCIpWzFdKSAhPT0gbnVsbCAmJiBfZGF0ZVN0cmluZyRzcGxpdCQgIT09IHZvaWQgMCA/IF9kYXRlU3RyaW5nJHNwbGl0JCA6IFwiXCI7XG5cdH07XG5cdGNvbnN0IG1hdGNoZXMgPSB7XG5cdFx0WW86ICgpID0+IGZvcm1hdE9yZGluYWwoeWVhcnMpLFxuXHRcdFlZOiAoKSA9PiBTdHJpbmcoeWVhcnMpLnNsaWNlKC0yKSxcblx0XHRZWVlZOiAoKSA9PiB5ZWFycyxcblx0XHRNOiAoKSA9PiBtb250aCArIDEsXG5cdFx0TW86ICgpID0+IGZvcm1hdE9yZGluYWwobW9udGggKyAxKSxcblx0XHRNTTogKCkgPT4gYCR7bW9udGggKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdE1NTTogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IG1vbnRoOiBcInNob3J0XCIgfSksXG5cdFx0TU1NTTogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IG1vbnRoOiBcImxvbmdcIiB9KSxcblx0XHREOiAoKSA9PiBTdHJpbmcoZGF5cyksXG5cdFx0RG86ICgpID0+IGZvcm1hdE9yZGluYWwoZGF5cyksXG5cdFx0REQ6ICgpID0+IGAke2RheXN9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0SDogKCkgPT4gU3RyaW5nKGhvdXJzKSxcblx0XHRIbzogKCkgPT4gZm9ybWF0T3JkaW5hbChob3VycyksXG5cdFx0SEg6ICgpID0+IGAke2hvdXJzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdGg6ICgpID0+IGAke2hvdXJzICUgMTIgfHwgMTJ9YC5wYWRTdGFydCgxLCBcIjBcIiksXG5cdFx0aG86ICgpID0+IGZvcm1hdE9yZGluYWwoaG91cnMgJSAxMiB8fCAxMiksXG5cdFx0aGg6ICgpID0+IGAke2hvdXJzICUgMTIgfHwgMTJ9YC5wYWRTdGFydCgyLCBcIjBcIiksXG5cdFx0bTogKCkgPT4gU3RyaW5nKG1pbnV0ZXMpLFxuXHRcdG1vOiAoKSA9PiBmb3JtYXRPcmRpbmFsKG1pbnV0ZXMpLFxuXHRcdG1tOiAoKSA9PiBgJHttaW51dGVzfWAucGFkU3RhcnQoMiwgXCIwXCIpLFxuXHRcdHM6ICgpID0+IFN0cmluZyhzZWNvbmRzKSxcblx0XHRzbzogKCkgPT4gZm9ybWF0T3JkaW5hbChzZWNvbmRzKSxcblx0XHRzczogKCkgPT4gYCR7c2Vjb25kc31gLnBhZFN0YXJ0KDIsIFwiMFwiKSxcblx0XHRTU1M6ICgpID0+IGAke21pbGxpc2Vjb25kc31gLnBhZFN0YXJ0KDMsIFwiMFwiKSxcblx0XHRkOiAoKSA9PiBkYXksXG5cdFx0ZGQ6ICgpID0+IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRvVmFsdWUob3B0aW9ucy5sb2NhbGVzKSwgeyB3ZWVrZGF5OiBcIm5hcnJvd1wiIH0pLFxuXHRcdGRkZDogKCkgPT4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHdlZWtkYXk6IFwic2hvcnRcIiB9KSxcblx0XHRkZGRkOiAoKSA9PiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgd2Vla2RheTogXCJsb25nXCIgfSksXG5cdFx0QTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMpLFxuXHRcdEFBOiAoKSA9PiBtZXJpZGllbShob3VycywgbWludXRlcywgZmFsc2UsIHRydWUpLFxuXHRcdGE6ICgpID0+IG1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCB0cnVlKSxcblx0XHRhYTogKCkgPT4gbWVyaWRpZW0oaG91cnMsIG1pbnV0ZXMsIHRydWUsIHRydWUpLFxuXHRcdHo6ICgpID0+IHN0cmlwVGltZVpvbmUoZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHRpbWVab25lTmFtZTogXCJzaG9ydE9mZnNldFwiIH0pKSxcblx0XHR6ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcInNob3J0T2Zmc2V0XCIgfSkpLFxuXHRcdHp6ejogKCkgPT4gc3RyaXBUaW1lWm9uZShkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0b1ZhbHVlKG9wdGlvbnMubG9jYWxlcyksIHsgdGltZVpvbmVOYW1lOiBcInNob3J0T2Zmc2V0XCIgfSkpLFxuXHRcdHp6eno6ICgpID0+IHN0cmlwVGltZVpvbmUoZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodG9WYWx1ZShvcHRpb25zLmxvY2FsZXMpLCB7IHRpbWVab25lTmFtZTogXCJsb25nT2Zmc2V0XCIgfSkpXG5cdH07XG5cdHJldHVybiBmb3JtYXRTdHIucmVwbGFjZShSRUdFWF9GT1JNQVQsIChtYXRjaCwgJDEpID0+IHtcblx0XHR2YXIgX3JlZiwgX21hdGNoZXMkbWF0Y2g7XG5cdFx0cmV0dXJuIChfcmVmID0gJDEgIT09IG51bGwgJiYgJDEgIT09IHZvaWQgMCA/ICQxIDogKF9tYXRjaGVzJG1hdGNoID0gbWF0Y2hlc1ttYXRjaF0pID09PSBudWxsIHx8IF9tYXRjaGVzJG1hdGNoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbWF0Y2hlcyRtYXRjaC5jYWxsKG1hdGNoZXMpKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogbWF0Y2g7XG5cdH0pO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplRGF0ZShkYXRlKSB7XG5cdGlmIChkYXRlID09PSBudWxsKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKE5hTik7XG5cdGlmIChkYXRlID09PSB2b2lkIDApIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKTtcblx0aWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gbmV3IERhdGUoZGF0ZSk7XG5cdGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiAhL1okL2kudGVzdChkYXRlKSkge1xuXHRcdGNvbnN0IGQgPSBkYXRlLm1hdGNoKFJFR0VYX1BBUlNFKTtcblx0XHRpZiAoZCkge1xuXHRcdFx0Y29uc3QgbSA9IGRbMl0gLSAxIHx8IDA7XG5cdFx0XHRjb25zdCBtcyA9IChkWzddIHx8IFwiMFwiKS5zdWJzdHJpbmcoMCwgMyk7XG5cdFx0XHRyZXR1cm4gbmV3IERhdGUoZFsxXSwgbSwgZFszXSB8fCAxLCBkWzRdIHx8IDAsIGRbNV0gfHwgMCwgZFs2XSB8fCAwLCBtcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbn1cbi8qKlxuKiBHZXQgdGhlIGZvcm1hdHRlZCBkYXRlIGFjY29yZGluZyB0byB0aGUgc3RyaW5nIG9mIHRva2VucyBwYXNzZWQgaW4uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURhdGVGb3JtYXRcbiogQHBhcmFtIGRhdGUgLSBUaGUgZGF0ZSB0byBmb3JtYXQsIGNhbiBlaXRoZXIgYmUgYSBgRGF0ZWAgb2JqZWN0LCBhIHRpbWVzdGFtcCwgb3IgYSBzdHJpbmdcbiogQHBhcmFtIGZvcm1hdFN0ciAtIFRoZSBjb21iaW5hdGlvbiBvZiB0b2tlbnMgdG8gZm9ybWF0IHRoZSBkYXRlXG4qIEBwYXJhbSBvcHRpb25zIC0gVXNlRGF0ZUZvcm1hdE9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEYXRlRm9ybWF0KGRhdGUsIGZvcm1hdFN0ciA9IFwiSEg6bW06c3NcIiwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBjb21wdXRlZCgoKSA9PiBmb3JtYXREYXRlKG5vcm1hbGl6ZURhdGUodG9WYWx1ZShkYXRlKSksIHRvVmFsdWUoZm9ybWF0U3RyKSwgb3B0aW9ucykpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbnRlcnZhbEZuL2luZGV4LnRzXG4vKipcbiogV3JhcHBlciBmb3IgYHNldEludGVydmFsYCB3aXRoIGNvbnRyb2xzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUludGVydmFsRm5cbiogQHBhcmFtIGNiXG4qIEBwYXJhbSBpbnRlcnZhbFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUludGVydmFsRm4oY2IsIGludGVydmFsID0gMWUzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBpbW1lZGlhdGVDYWxsYmFjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRsZXQgdGltZXIgPSBudWxsO1xuXHRjb25zdCBpc0FjdGl2ZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRmdW5jdGlvbiBjbGVhbigpIHtcblx0XHRpZiAodGltZXIpIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwodGltZXIpO1xuXHRcdFx0dGltZXIgPSBudWxsO1xuXHRcdH1cblx0fVxuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHRcdGNsZWFuKCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGNvbnN0IGludGVydmFsVmFsdWUgPSB0b1ZhbHVlKGludGVydmFsKTtcblx0XHRpZiAoaW50ZXJ2YWxWYWx1ZSA8PSAwKSByZXR1cm47XG5cdFx0aXNBY3RpdmUudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChpbW1lZGlhdGVDYWxsYmFjaykgY2IoKTtcblx0XHRjbGVhbigpO1xuXHRcdGlmIChpc0FjdGl2ZS52YWx1ZSkgdGltZXIgPSBzZXRJbnRlcnZhbChjYiwgaW50ZXJ2YWxWYWx1ZSk7XG5cdH1cblx0aWYgKGltbWVkaWF0ZSAmJiBpc0NsaWVudCkgcmVzdW1lKCk7XG5cdGlmIChpc1JlZihpbnRlcnZhbCkgfHwgdHlwZW9mIGludGVydmFsID09PSBcImZ1bmN0aW9uXCIpIHRyeU9uU2NvcGVEaXNwb3NlKHdhdGNoKGludGVydmFsLCAoKSA9PiB7XG5cdFx0aWYgKGlzQWN0aXZlLnZhbHVlICYmIGlzQ2xpZW50KSByZXN1bWUoKTtcblx0fSkpO1xuXHR0cnlPblNjb3BlRGlzcG9zZShwYXVzZSk7XG5cdHJldHVybiB7XG5cdFx0aXNBY3RpdmU6IHNoYWxsb3dSZWFkb25seShpc0FjdGl2ZSksXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUludGVydmFsL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VJbnRlcnZhbChpbnRlcnZhbCA9IDFlMywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHM6IGV4cG9zZUNvbnRyb2xzID0gZmFsc2UsIGltbWVkaWF0ZSA9IHRydWUsIGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb3VudGVyID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgdXBkYXRlID0gKCkgPT4gY291bnRlci52YWx1ZSArPSAxO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHRjb3VudGVyLnZhbHVlID0gMDtcblx0fTtcblx0Y29uc3QgY29udHJvbHMgPSB1c2VJbnRlcnZhbEZuKGNhbGxiYWNrID8gKCkgPT4ge1xuXHRcdHVwZGF0ZSgpO1xuXHRcdGNhbGxiYWNrKGNvdW50ZXIudmFsdWUpO1xuXHR9IDogdXBkYXRlLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGUgfSk7XG5cdGlmIChleHBvc2VDb250cm9scykgcmV0dXJuIHtcblx0XHRjb3VudGVyOiBzaGFsbG93UmVhZG9ubHkoY291bnRlciksXG5cdFx0cmVzZXQsXG5cdFx0Li4uY29udHJvbHNcblx0fTtcblx0ZWxzZSByZXR1cm4gc2hhbGxvd1JlYWRvbmx5KGNvdW50ZXIpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VMYXN0Q2hhbmdlZC9pbmRleC50c1xuZnVuY3Rpb24gdXNlTGFzdENoYW5nZWQoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGluaXRpYWxWYWx1ZTtcblx0Y29uc3QgbXMgPSBzaGFsbG93UmVmKChfb3B0aW9ucyRpbml0aWFsVmFsdWUgPSBvcHRpb25zLmluaXRpYWxWYWx1ZSkgIT09IG51bGwgJiYgX29wdGlvbnMkaW5pdGlhbFZhbHVlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRpbml0aWFsVmFsdWUgOiBudWxsKTtcblx0d2F0Y2goc291cmNlLCAoKSA9PiBtcy52YWx1ZSA9IHRpbWVzdGFtcCgpLCBvcHRpb25zKTtcblx0cmV0dXJuIHNoYWxsb3dSZWFkb25seShtcyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVvdXRGbi9pbmRleC50c1xuLyoqXG4qIFdyYXBwZXIgZm9yIGBzZXRUaW1lb3V0YCB3aXRoIGNvbnRyb2xzLlxuKlxuKiBAcGFyYW0gY2JcbiogQHBhcmFtIGludGVydmFsXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVGltZW91dEZuKGNiLCBpbnRlcnZhbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW1tZWRpYXRlID0gdHJ1ZSwgaW1tZWRpYXRlQ2FsbGJhY2sgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNQZW5kaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGxldCB0aW1lcjtcblx0ZnVuY3Rpb24gY2xlYXIoKSB7XG5cdFx0aWYgKHRpbWVyKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0dGltZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHN0b3AoKSB7XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2xlYXIoKTtcblx0fVxuXHRmdW5jdGlvbiBzdGFydCguLi5hcmdzKSB7XG5cdFx0aWYgKGltbWVkaWF0ZUNhbGxiYWNrKSBjYigpO1xuXHRcdGNsZWFyKCk7XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHR0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aXNQZW5kaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHR0aW1lciA9IHZvaWQgMDtcblx0XHRcdGNiKC4uLmFyZ3MpO1xuXHRcdH0sIHRvVmFsdWUoaW50ZXJ2YWwpKTtcblx0fVxuXHRpZiAoaW1tZWRpYXRlKSB7XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAoaXNDbGllbnQpIHN0YXJ0KCk7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNQZW5kaW5nOiBzaGFsbG93UmVhZG9ubHkoaXNQZW5kaW5nKSxcblx0XHRzdGFydCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVvdXQvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVRpbWVvdXQoaW50ZXJ2YWwgPSAxZTMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBjYWxsYmFjayB9ID0gb3B0aW9ucztcblx0Y29uc3QgY29udHJvbHMgPSB1c2VUaW1lb3V0Rm4oY2FsbGJhY2sgIT09IG51bGwgJiYgY2FsbGJhY2sgIT09IHZvaWQgMCA/IGNhbGxiYWNrIDogbm9vcCwgaW50ZXJ2YWwsIG9wdGlvbnMpO1xuXHRjb25zdCByZWFkeSA9IGNvbXB1dGVkKCgpID0+ICFjb250cm9scy5pc1BlbmRpbmcudmFsdWUpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0cmVhZHksXG5cdFx0Li4uY29udHJvbHNcblx0fTtcblx0ZWxzZSByZXR1cm4gcmVhZHk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRvTnVtYmVyL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSBjb252ZXJ0IGEgc3RyaW5nIHJlZiB0byBudW1iZXIuXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVG9OdW1iZXIodmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG1ldGhvZCA9IFwicGFyc2VGbG9hdFwiLCByYWRpeCwgbmFuVG9aZXJvIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGxldCByZXNvbHZlZCA9IHRvVmFsdWUodmFsdWUpO1xuXHRcdGlmICh0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIpIHJlc29sdmVkID0gbWV0aG9kKHJlc29sdmVkKTtcblx0XHRlbHNlIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCIpIHJlc29sdmVkID0gTnVtYmVyW21ldGhvZF0ocmVzb2x2ZWQsIHJhZGl4KTtcblx0XHRpZiAobmFuVG9aZXJvICYmIE51bWJlci5pc05hTihyZXNvbHZlZCkpIHJlc29sdmVkID0gMDtcblx0XHRyZXR1cm4gcmVzb2x2ZWQ7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUb1N0cmluZy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgY29udmVydCBhIHJlZiB0byBzdHJpbmcuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRvU3RyaW5nXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVG9TdHJpbmcodmFsdWUpIHtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGAke3RvVmFsdWUodmFsdWUpfWApO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUb2dnbGUvaW5kZXgudHNcbi8qKlxuKiBBIGJvb2xlYW4gcmVmIHdpdGggYSB0b2dnbGVyXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRvZ2dsZVxuKiBAcGFyYW0gW2luaXRpYWxWYWx1ZV1cbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUb2dnbGUoaW5pdGlhbFZhbHVlID0gZmFsc2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRydXRoeVZhbHVlID0gdHJ1ZSwgZmFsc3lWYWx1ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB2YWx1ZUlzUmVmID0gaXNSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgX3ZhbHVlID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUpO1xuXHRmdW5jdGlvbiB0b2dnbGUodmFsdWUpIHtcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0X3ZhbHVlLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gX3ZhbHVlLnZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCB0cnV0aHkgPSB0b1ZhbHVlKHRydXRoeVZhbHVlKTtcblx0XHRcdF92YWx1ZS52YWx1ZSA9IF92YWx1ZS52YWx1ZSA9PT0gdHJ1dGh5ID8gdG9WYWx1ZShmYWxzeVZhbHVlKSA6IHRydXRoeTtcblx0XHRcdHJldHVybiBfdmFsdWUudmFsdWU7XG5cdFx0fVxuXHR9XG5cdGlmICh2YWx1ZUlzUmVmKSByZXR1cm4gdG9nZ2xlO1xuXHRlbHNlIHJldHVybiBbX3ZhbHVlLCB0b2dnbGVdO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaEFycmF5L2luZGV4LnRzXG4vKipcbiogV2F0Y2ggZm9yIGFuIGFycmF5IHdpdGggYWRkaXRpb25zIGFuZCByZW1vdmFscy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvd2F0Y2hBcnJheVxuKi9cbmZ1bmN0aW9uIHdhdGNoQXJyYXkoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRsZXQgb2xkTGlzdCA9IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuaW1tZWRpYXRlKSA/IFtdIDogWy4uLnR5cGVvZiBzb3VyY2UgPT09IFwiZnVuY3Rpb25cIiA/IHNvdXJjZSgpIDogQXJyYXkuaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogdG9WYWx1ZShzb3VyY2UpXTtcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgKG5ld0xpc3QsIF8sIG9uQ2xlYW51cCkgPT4ge1xuXHRcdGNvbnN0IG9sZExpc3RSZW1haW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogb2xkTGlzdC5sZW5ndGggfSk7XG5cdFx0Y29uc3QgYWRkZWQgPSBbXTtcblx0XHRmb3IgKGNvbnN0IG9iaiBvZiBuZXdMaXN0KSB7XG5cdFx0XHRsZXQgZm91bmQgPSBmYWxzZTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb2xkTGlzdC5sZW5ndGg7IGkrKykgaWYgKCFvbGRMaXN0UmVtYWluc1tpXSAmJiBvYmogPT09IG9sZExpc3RbaV0pIHtcblx0XHRcdFx0b2xkTGlzdFJlbWFpbnNbaV0gPSB0cnVlO1xuXHRcdFx0XHRmb3VuZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFmb3VuZCkgYWRkZWQucHVzaChvYmopO1xuXHRcdH1cblx0XHRjb25zdCByZW1vdmVkID0gb2xkTGlzdC5maWx0ZXIoKF8kMSwgaSkgPT4gIW9sZExpc3RSZW1haW5zW2ldKTtcblx0XHRjYihuZXdMaXN0LCBvbGRMaXN0LCBhZGRlZCwgcmVtb3ZlZCwgb25DbGVhbnVwKTtcblx0XHRvbGRMaXN0ID0gWy4uLm5ld0xpc3RdO1xuXHR9LCBvcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hBdE1vc3QvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoQXRNb3N0KHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyBjb3VudCwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGN1cnJlbnQgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB7IHN0b3AsIHJlc3VtZSwgcGF1c2UgfSA9IHdhdGNoV2l0aEZpbHRlcihzb3VyY2UsICguLi5hcmdzKSA9PiB7XG5cdFx0Y3VycmVudC52YWx1ZSArPSAxO1xuXHRcdGlmIChjdXJyZW50LnZhbHVlID49IHRvVmFsdWUoY291bnQpKSBuZXh0VGljaygoKSA9PiBzdG9wKCkpO1xuXHRcdGNiKC4uLmFyZ3MpO1xuXHR9LCB3YXRjaE9wdGlvbnMpO1xuXHRyZXR1cm4ge1xuXHRcdGNvdW50OiBjdXJyZW50LFxuXHRcdHN0b3AsXG5cdFx0cmVzdW1lLFxuXHRcdHBhdXNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoRGVib3VuY2VkL2luZGV4LnRzXG5mdW5jdGlvbiB3YXRjaERlYm91bmNlZChzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkZWJvdW5jZSA9IDAsIG1heFdhaXQgPSB2b2lkIDAsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIHtcblx0XHQuLi53YXRjaE9wdGlvbnMsXG5cdFx0ZXZlbnRGaWx0ZXI6IGRlYm91bmNlRmlsdGVyKGRlYm91bmNlLCB7IG1heFdhaXQgfSlcblx0fSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGB3YXRjaERlYm91bmNlZGAgaW5zdGVhZCAqL1xuY29uc3QgZGVib3VuY2VkV2F0Y2ggPSB3YXRjaERlYm91bmNlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hEZWVwL2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciB3YXRjaGluZyB2YWx1ZSB3aXRoIHtkZWVwOiB0cnVlfVxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93YXRjaERlZXBcbiovXG5mdW5jdGlvbiB3YXRjaERlZXAoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCBjYiwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZGVlcDogdHJ1ZVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hJZ25vcmFibGUvaW5kZXgudHNcbmZ1bmN0aW9uIHdhdGNoSWdub3JhYmxlKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyID0gYnlwYXNzRmlsdGVyLC4uLndhdGNoT3B0aW9ucyB9ID0gb3B0aW9ucztcblx0Y29uc3QgZmlsdGVyZWRDYiA9IGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsIGNiKTtcblx0bGV0IGlnbm9yZVVwZGF0ZXM7XG5cdGxldCBpZ25vcmVQcmV2QXN5bmNVcGRhdGVzO1xuXHRsZXQgc3RvcDtcblx0aWYgKHdhdGNoT3B0aW9ucy5mbHVzaCA9PT0gXCJzeW5jXCIpIHtcblx0XHRsZXQgaWdub3JlID0gZmFsc2U7XG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlcyA9ICgpID0+IHt9O1xuXHRcdGlnbm9yZVVwZGF0ZXMgPSAodXBkYXRlcikgPT4ge1xuXHRcdFx0aWdub3JlID0gdHJ1ZTtcblx0XHRcdHVwZGF0ZXIoKTtcblx0XHRcdGlnbm9yZSA9IGZhbHNlO1xuXHRcdH07XG5cdFx0c3RvcCA9IHdhdGNoKHNvdXJjZSwgKC4uLmFyZ3MpID0+IHtcblx0XHRcdGlmICghaWdub3JlKSBmaWx0ZXJlZENiKC4uLmFyZ3MpO1xuXHRcdH0sIHdhdGNoT3B0aW9ucyk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgZGlzcG9zYWJsZXMgPSBbXTtcblx0XHRsZXQgaWdub3JlQ291bnRlciA9IDA7XG5cdFx0bGV0IHN5bmNDb3VudGVyID0gMDtcblx0XHRpZ25vcmVQcmV2QXN5bmNVcGRhdGVzID0gKCkgPT4ge1xuXHRcdFx0aWdub3JlQ291bnRlciA9IHN5bmNDb3VudGVyO1xuXHRcdH07XG5cdFx0ZGlzcG9zYWJsZXMucHVzaCh3YXRjaChzb3VyY2UsICgpID0+IHtcblx0XHRcdHN5bmNDb3VudGVyKys7XG5cdFx0fSwge1xuXHRcdFx0Li4ud2F0Y2hPcHRpb25zLFxuXHRcdFx0Zmx1c2g6IFwic3luY1wiXG5cdFx0fSkpO1xuXHRcdGlnbm9yZVVwZGF0ZXMgPSAodXBkYXRlcikgPT4ge1xuXHRcdFx0Y29uc3Qgc3luY0NvdW50ZXJQcmV2ID0gc3luY0NvdW50ZXI7XG5cdFx0XHR1cGRhdGVyKCk7XG5cdFx0XHRpZ25vcmVDb3VudGVyICs9IHN5bmNDb3VudGVyIC0gc3luY0NvdW50ZXJQcmV2O1xuXHRcdH07XG5cdFx0ZGlzcG9zYWJsZXMucHVzaCh3YXRjaChzb3VyY2UsICguLi5hcmdzKSA9PiB7XG5cdFx0XHRjb25zdCBpZ25vcmUgPSBpZ25vcmVDb3VudGVyID4gMCAmJiBpZ25vcmVDb3VudGVyID09PSBzeW5jQ291bnRlcjtcblx0XHRcdGlnbm9yZUNvdW50ZXIgPSAwO1xuXHRcdFx0c3luY0NvdW50ZXIgPSAwO1xuXHRcdFx0aWYgKGlnbm9yZSkgcmV0dXJuO1xuXHRcdFx0ZmlsdGVyZWRDYiguLi5hcmdzKTtcblx0XHR9LCB3YXRjaE9wdGlvbnMpKTtcblx0XHRzdG9wID0gKCkgPT4ge1xuXHRcdFx0ZGlzcG9zYWJsZXMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzdG9wLFxuXHRcdGlnbm9yZVVwZGF0ZXMsXG5cdFx0aWdub3JlUHJldkFzeW5jVXBkYXRlc1xuXHR9O1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgd2F0Y2hJZ25vcmFibGVgIGluc3RlYWQgKi9cbmNvbnN0IGlnbm9yYWJsZVdhdGNoID0gd2F0Y2hJZ25vcmFibGU7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoSW1tZWRpYXRlL2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciB3YXRjaGluZyB2YWx1ZSB3aXRoIHtpbW1lZGlhdGU6IHRydWV9XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3dhdGNoSW1tZWRpYXRlXG4qL1xuZnVuY3Rpb24gd2F0Y2hJbW1lZGlhdGUoc291cmNlLCBjYiwgb3B0aW9ucykge1xuXHRyZXR1cm4gd2F0Y2goc291cmNlLCBjYiwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0aW1tZWRpYXRlOiB0cnVlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB3YXRjaE9uY2UvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHdpdGggeyBvbmNlOiB0cnVlIH1cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvd2F0Y2hPbmNlXG4qL1xuZnVuY3Rpb24gd2F0Y2hPbmNlKHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcblx0cmV0dXJuIHdhdGNoKHNvdXJjZSwgY2IsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdG9uY2U6IHRydWVcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHdhdGNoVGhyb3R0bGVkL2luZGV4LnRzXG5mdW5jdGlvbiB3YXRjaFRocm90dGxlZChzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0aHJvdHRsZSA9IDAsIHRyYWlsaW5nID0gdHJ1ZSwgbGVhZGluZyA9IHRydWUsLi4ud2F0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gd2F0Y2hXaXRoRmlsdGVyKHNvdXJjZSwgY2IsIHtcblx0XHQuLi53YXRjaE9wdGlvbnMsXG5cdFx0ZXZlbnRGaWx0ZXI6IHRocm90dGxlRmlsdGVyKHRocm90dGxlLCB0cmFpbGluZywgbGVhZGluZylcblx0fSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGB3YXRjaFRocm90dGxlZGAgaW5zdGVhZCAqL1xuY29uc3QgdGhyb3R0bGVkV2F0Y2ggPSB3YXRjaFRocm90dGxlZDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2F0Y2hUcmlnZ2VyYWJsZS9pbmRleC50c1xuZnVuY3Rpb24gd2F0Y2hUcmlnZ2VyYWJsZShzb3VyY2UsIGNiLCBvcHRpb25zID0ge30pIHtcblx0bGV0IGNsZWFudXBGbjtcblx0ZnVuY3Rpb24gb25FZmZlY3QoKSB7XG5cdFx0aWYgKCFjbGVhbnVwRm4pIHJldHVybjtcblx0XHRjb25zdCBmbiA9IGNsZWFudXBGbjtcblx0XHRjbGVhbnVwRm4gPSB2b2lkIDA7XG5cdFx0Zm4oKTtcblx0fVxuXHQvKiogUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIGBjbGVhbnVwRm5gICovXG5cdGZ1bmN0aW9uIG9uQ2xlYW51cChjYWxsYmFjaykge1xuXHRcdGNsZWFudXBGbiA9IGNhbGxiYWNrO1xuXHR9XG5cdGNvbnN0IF9jYiA9ICh2YWx1ZSwgb2xkVmFsdWUpID0+IHtcblx0XHRvbkVmZmVjdCgpO1xuXHRcdHJldHVybiBjYih2YWx1ZSwgb2xkVmFsdWUsIG9uQ2xlYW51cCk7XG5cdH07XG5cdGNvbnN0IHJlcyA9IHdhdGNoSWdub3JhYmxlKHNvdXJjZSwgX2NiLCBvcHRpb25zKTtcblx0Y29uc3QgeyBpZ25vcmVVcGRhdGVzIH0gPSByZXM7XG5cdGNvbnN0IHRyaWdnZXIgPSAoKSA9PiB7XG5cdFx0bGV0IHJlcyQxO1xuXHRcdGlnbm9yZVVwZGF0ZXMoKCkgPT4ge1xuXHRcdFx0cmVzJDEgPSBfY2IoZ2V0V2F0Y2hTb3VyY2VzKHNvdXJjZSksIGdldE9sZFZhbHVlKHNvdXJjZSkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXMkMTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHQuLi5yZXMsXG5cdFx0dHJpZ2dlclxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0V2F0Y2hTb3VyY2VzKHNvdXJjZXMpIHtcblx0aWYgKGlzUmVhY3RpdmUoc291cmNlcykpIHJldHVybiBzb3VyY2VzO1xuXHRpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VzKSkgcmV0dXJuIHNvdXJjZXMubWFwKChpdGVtKSA9PiB0b1ZhbHVlKGl0ZW0pKTtcblx0cmV0dXJuIHRvVmFsdWUoc291cmNlcyk7XG59XG5mdW5jdGlvbiBnZXRPbGRWYWx1ZShzb3VyY2UpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkoc291cmNlKSA/IHNvdXJjZS5tYXAoKCkgPT4gdm9pZCAwKSA6IHZvaWQgMDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gd2hlbmV2ZXIvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHdhdGNoaW5nIHZhbHVlIHRvIGJlIHRydXRoeVxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy93aGVuZXZlclxuKi9cbmZ1bmN0aW9uIHdoZW5ldmVyKHNvdXJjZSwgY2IsIG9wdGlvbnMpIHtcblx0Y29uc3Qgc3RvcCA9IHdhdGNoKHNvdXJjZSwgKHYsIG92LCBvbkludmFsaWRhdGUpID0+IHtcblx0XHRpZiAodikge1xuXHRcdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vbmNlKSBuZXh0VGljaygoKSA9PiBzdG9wKCkpO1xuXHRcdFx0Y2Iodiwgb3YsIG9uSW52YWxpZGF0ZSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRvbmNlOiBmYWxzZVxuXHR9KTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgYXNzZXJ0LCBhdXRvUmVzZXRSZWYsIGJ5cGFzc0ZpbHRlciwgY2FtZWxpemUsIGNsYW1wLCBjb21wdXRlZEVhZ2VyLCBjb21wdXRlZFdpdGhDb250cm9sLCBjb250YWluc1Byb3AsIGNvbnRyb2xsZWRDb21wdXRlZCwgY29udHJvbGxlZFJlZiwgY3JlYXRlRXZlbnRIb29rLCBjcmVhdGVGaWx0ZXJXcmFwcGVyLCBjcmVhdGVHbG9iYWxTdGF0ZSwgY3JlYXRlSW5qZWN0aW9uU3RhdGUsIGNyZWF0ZVJlYWN0aXZlRm4sIGNyZWF0ZVJlZiwgY3JlYXRlU2hhcmVkQ29tcG9zYWJsZSwgY3JlYXRlU2luZ2xldG9uUHJvbWlzZSwgZGVib3VuY2VGaWx0ZXIsIGRlYm91bmNlZFJlZiwgZGVib3VuY2VkV2F0Y2gsIGVhZ2VyQ29tcHV0ZWQsIGV4dGVuZFJlZiwgZm9ybWF0RGF0ZSwgZ2V0LCBnZXRMaWZlQ3ljbGVUYXJnZXQsIGhhc093biwgaHlwaGVuYXRlLCBpZGVudGl0eSwgaWdub3JhYmxlV2F0Y2gsIGluY3JlYXNlV2l0aFVuaXQsIGluamVjdExvY2FsLCBpbnZva2UsIGlzQ2xpZW50LCBpc0RlZiwgaXNEZWZpbmVkLCBpc0lPUywgaXNPYmplY3QsIGlzV29ya2VyLCBtYWtlRGVzdHJ1Y3R1cmFibGUsIG5vb3AsIG5vcm1hbGl6ZURhdGUsIG5vdE51bGxpc2gsIG5vdywgb2JqZWN0RW50cmllcywgb2JqZWN0T21pdCwgb2JqZWN0UGljaywgcGF1c2FibGVGaWx0ZXIsIHBhdXNhYmxlV2F0Y2gsIHByb21pc2VUaW1lb3V0LCBwcm92aWRlTG9jYWwsIHB4VmFsdWUsIHJhbmQsIHJlYWN0aWZ5LCByZWFjdGlmeU9iamVjdCwgcmVhY3RpdmVDb21wdXRlZCwgcmVhY3RpdmVPbWl0LCByZWFjdGl2ZVBpY2ssIHJlZkF1dG9SZXNldCwgcmVmRGVib3VuY2VkLCByZWZEZWZhdWx0LCByZWZNYW51YWxSZXNldCwgcmVmVGhyb3R0bGVkLCByZWZXaXRoQ29udHJvbCwgc2V0LCBzeW5jUmVmLCBzeW5jUmVmcywgdGhyb3R0bGVGaWx0ZXIsIHRocm90dGxlZFJlZiwgdGhyb3R0bGVkV2F0Y2gsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9SZWFjdGl2ZSwgdG9SZWYsIHRvUmVmcywgdHJ5T25CZWZvcmVNb3VudCwgdHJ5T25CZWZvcmVVbm1vdW50LCB0cnlPbk1vdW50ZWQsIHRyeU9uU2NvcGVEaXNwb3NlLCB0cnlPblVubW91bnRlZCwgdW50aWwsIHVzZUFycmF5RGlmZmVyZW5jZSwgdXNlQXJyYXlFdmVyeSwgdXNlQXJyYXlGaWx0ZXIsIHVzZUFycmF5RmluZCwgdXNlQXJyYXlGaW5kSW5kZXgsIHVzZUFycmF5RmluZExhc3QsIHVzZUFycmF5SW5jbHVkZXMsIHVzZUFycmF5Sm9pbiwgdXNlQXJyYXlNYXAsIHVzZUFycmF5UmVkdWNlLCB1c2VBcnJheVNvbWUsIHVzZUFycmF5VW5pcXVlLCB1c2VDb3VudGVyLCB1c2VEYXRlRm9ybWF0LCB1c2VEZWJvdW5jZSwgdXNlRGVib3VuY2VGbiwgdXNlSW50ZXJ2YWwsIHVzZUludGVydmFsRm4sIHVzZUxhc3RDaGFuZ2VkLCB1c2VUaHJvdHRsZSwgdXNlVGhyb3R0bGVGbiwgdXNlVGltZW91dCwgdXNlVGltZW91dEZuLCB1c2VUb051bWJlciwgdXNlVG9TdHJpbmcsIHVzZVRvZ2dsZSwgd2F0Y2hBcnJheSwgd2F0Y2hBdE1vc3QsIHdhdGNoRGVib3VuY2VkLCB3YXRjaERlZXAsIHdhdGNoSWdub3JhYmxlLCB3YXRjaEltbWVkaWF0ZSwgd2F0Y2hPbmNlLCB3YXRjaFBhdXNhYmxlLCB3YXRjaFRocm90dGxlZCwgd2F0Y2hUcmlnZ2VyYWJsZSwgd2F0Y2hXaXRoRmlsdGVyLCB3aGVuZXZlciB9OyIsImltcG9ydCB7IGJ5cGFzc0ZpbHRlciwgY2FtZWxpemUsIGNsYW1wLCBjb21wdXRlZFdpdGhDb250cm9sLCBjb250YWluc1Byb3AsIGNyZWF0ZUV2ZW50SG9vaywgY3JlYXRlRmlsdGVyV3JhcHBlciwgY3JlYXRlUmVmLCBjcmVhdGVTaW5nbGV0b25Qcm9taXNlLCBkZWJvdW5jZUZpbHRlciwgaGFzT3duLCBpZGVudGl0eSwgaW5jcmVhc2VXaXRoVW5pdCwgaW5qZWN0TG9jYWwsIGlzQ2xpZW50LCBpc0RlZiwgaXNJT1MsIGlzT2JqZWN0LCBpc1dvcmtlciwgbWFrZURlc3RydWN0dXJhYmxlLCBub29wLCBub3ROdWxsaXNoLCBvYmplY3RFbnRyaWVzLCBvYmplY3RPbWl0LCBvYmplY3RQaWNrLCBwYXVzYWJsZUZpbHRlciwgcHJvbWlzZVRpbWVvdXQsIHByb3ZpZGVMb2NhbCwgcHhWYWx1ZSwgc3luY1JlZiwgdGhyb3R0bGVGaWx0ZXIsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9SZWYsIHRvUmVmcywgdHJ5T25Nb3VudGVkLCB0cnlPblNjb3BlRGlzcG9zZSwgdHJ5T25Vbm1vdW50ZWQsIHVudGlsLCB1c2VEZWJvdW5jZUZuLCB1c2VJbnRlcnZhbEZuLCB1c2VUaHJvdHRsZUZuLCB1c2VUaW1lb3V0Rm4sIHdhdGNoSWdub3JhYmxlLCB3YXRjaEltbWVkaWF0ZSwgd2F0Y2hPbmNlLCB3YXRjaFBhdXNhYmxlLCB3YXRjaFdpdGhGaWx0ZXIsIHdoZW5ldmVyIH0gZnJvbSBcIkB2dWV1c2Uvc2hhcmVkXCI7XG5pbXBvcnQgeyBGcmFnbWVudCwgVHJhbnNpdGlvbkdyb3VwLCBjb21wdXRlZCwgY3VzdG9tUmVmLCBkZWZpbmVDb21wb25lbnQsIGdldEN1cnJlbnRJbnN0YW5jZSwgZ2V0Q3VycmVudFNjb3BlLCBoLCBoYXNJbmplY3Rpb25Db250ZXh0LCBpbmplY3QsIGlzUmVhZG9ubHksIGlzUmVmLCBtYXJrUmF3LCBuZXh0VGljaywgb25CZWZvcmVVcGRhdGUsIG9uTW91bnRlZCwgb25VcGRhdGVkLCByZWFjdGl2ZSwgcmVhZG9ubHksIHJlZiwgc2hhbGxvd1JlYWN0aXZlLCBzaGFsbG93UmVhZG9ubHksIHNoYWxsb3dSZWYsIHRvUmF3LCB0b1ZhbHVlLCB1bnJlZiwgd2F0Y2gsIHdhdGNoRWZmZWN0IH0gZnJvbSBcInZ1ZVwiO1xuXG5leHBvcnQgKiBmcm9tIFwiQHZ1ZXVzZS9zaGFyZWRcIlxuXG4vLyNyZWdpb24gY29tcHV0ZWRBc3luYy9pbmRleC50c1xuZnVuY3Rpb24gY29tcHV0ZWRBc3luYyhldmFsdWF0aW9uQ2FsbGJhY2ssIGluaXRpYWxTdGF0ZSwgb3B0aW9uc09yUmVmKSB7XG5cdHZhciBfZ2xvYmFsVGhpcyRyZXBvcnRFcnI7XG5cdGxldCBvcHRpb25zO1xuXHRpZiAoaXNSZWYob3B0aW9uc09yUmVmKSkgb3B0aW9ucyA9IHsgZXZhbHVhdGluZzogb3B0aW9uc09yUmVmIH07XG5cdGVsc2Ugb3B0aW9ucyA9IG9wdGlvbnNPclJlZiB8fCB7fTtcblx0Y29uc3QgeyBsYXp5ID0gZmFsc2UsIGZsdXNoID0gXCJzeW5jXCIsIGV2YWx1YXRpbmcgPSB2b2lkIDAsIHNoYWxsb3cgPSB0cnVlLCBvbkVycm9yID0gKF9nbG9iYWxUaGlzJHJlcG9ydEVyciA9IGdsb2JhbFRoaXMucmVwb3J0RXJyb3IpICE9PSBudWxsICYmIF9nbG9iYWxUaGlzJHJlcG9ydEVyciAhPT0gdm9pZCAwID8gX2dsb2JhbFRoaXMkcmVwb3J0RXJyIDogbm9vcCB9ID0gb3B0aW9ucztcblx0Y29uc3Qgc3RhcnRlZCA9IHNoYWxsb3dSZWYoIWxhenkpO1xuXHRjb25zdCBjdXJyZW50ID0gc2hhbGxvdyA/IHNoYWxsb3dSZWYoaW5pdGlhbFN0YXRlKSA6IHJlZihpbml0aWFsU3RhdGUpO1xuXHRsZXQgY291bnRlciA9IDA7XG5cdHdhdGNoRWZmZWN0KGFzeW5jIChvbkludmFsaWRhdGUpID0+IHtcblx0XHRpZiAoIXN0YXJ0ZWQudmFsdWUpIHJldHVybjtcblx0XHRjb3VudGVyKys7XG5cdFx0Y29uc3QgY291bnRlckF0QmVnaW5uaW5nID0gY291bnRlcjtcblx0XHRsZXQgaGFzRmluaXNoZWQgPSBmYWxzZTtcblx0XHRpZiAoZXZhbHVhdGluZykgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG5cdFx0XHRldmFsdWF0aW5nLnZhbHVlID0gdHJ1ZTtcblx0XHR9KTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgZXZhbHVhdGlvbkNhbGxiYWNrKChjYW5jZWxDYWxsYmFjaykgPT4ge1xuXHRcdFx0XHRvbkludmFsaWRhdGUoKCkgPT4ge1xuXHRcdFx0XHRcdGlmIChldmFsdWF0aW5nKSBldmFsdWF0aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKCFoYXNGaW5pc2hlZCkgY2FuY2VsQ2FsbGJhY2soKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdGlmIChjb3VudGVyQXRCZWdpbm5pbmcgPT09IGNvdW50ZXIpIGN1cnJlbnQudmFsdWUgPSByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGV2YWx1YXRpbmcgJiYgY291bnRlckF0QmVnaW5uaW5nID09PSBjb3VudGVyKSBldmFsdWF0aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRoYXNGaW5pc2hlZCA9IHRydWU7XG5cdFx0fVxuXHR9LCB7IGZsdXNoIH0pO1xuXHRpZiAobGF6eSkgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcblx0XHRzdGFydGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gY3VycmVudC52YWx1ZTtcblx0fSk7XG5cdGVsc2UgcmV0dXJuIGN1cnJlbnQ7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBjb21wdXRlZEFzeW5jYCBpbnN0ZWFkICovXG5jb25zdCBhc3luY0NvbXB1dGVkID0gY29tcHV0ZWRBc3luYztcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY29tcHV0ZWRJbmplY3QvaW5kZXgudHNcbmZ1bmN0aW9uIGNvbXB1dGVkSW5qZWN0KGtleSwgb3B0aW9ucywgZGVmYXVsdFNvdXJjZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5KSB7XG5cdGxldCBzb3VyY2UgPSBpbmplY3Qoa2V5KTtcblx0aWYgKGRlZmF1bHRTb3VyY2UpIHNvdXJjZSA9IGluamVjdChrZXksIGRlZmF1bHRTb3VyY2UpO1xuXHRpZiAodHJlYXREZWZhdWx0QXNGYWN0b3J5KSBzb3VyY2UgPSBpbmplY3Qoa2V5LCBkZWZhdWx0U291cmNlLCB0cmVhdERlZmF1bHRBc0ZhY3RvcnkpO1xuXHRpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGNvbXB1dGVkKChvbGRWYWx1ZSkgPT4gb3B0aW9ucyhzb3VyY2UsIG9sZFZhbHVlKSk7XG5cdGVsc2UgcmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQ6IChvbGRWYWx1ZSkgPT4gb3B0aW9ucy5nZXQoc291cmNlLCBvbGRWYWx1ZSksXG5cdFx0c2V0OiBvcHRpb25zLnNldFxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlUmV1c2FibGVUZW1wbGF0ZS9pbmRleC50c1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBgZGVmaW5lYCBhbmQgYHJldXNlYCBjb21wb25lbnRzIGluIHBhaXIsXG4qIEl0IGFsc28gYWxsb3cgdG8gcGFzcyBhIGdlbmVyaWMgdG8gYmluZCB3aXRoIHR5cGUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL2NyZWF0ZVJldXNhYmxlVGVtcGxhdGVcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVSZXVzYWJsZVRlbXBsYXRlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaGVyaXRBdHRycyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJlbmRlciA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgZGVmaW5lID0gZGVmaW5lQ29tcG9uZW50KHsgc2V0dXAoXywgeyBzbG90cyB9KSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHJlbmRlci52YWx1ZSA9IHNsb3RzLmRlZmF1bHQ7XG5cdFx0fTtcblx0fSB9KTtcblx0Y29uc3QgcmV1c2UgPSBkZWZpbmVDb21wb25lbnQoe1xuXHRcdGluaGVyaXRBdHRycyxcblx0XHRwcm9wczogb3B0aW9ucy5wcm9wcyxcblx0XHRzZXR1cChwcm9wcywgeyBhdHRycywgc2xvdHMgfSkge1xuXHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0dmFyIF9yZW5kZXIkdmFsdWU7XG5cdFx0XHRcdGlmICghcmVuZGVyLnZhbHVlICYmIHRydWUpIHRocm93IG5ldyBFcnJvcihcIltWdWVVc2VdIEZhaWxlZCB0byBmaW5kIHRoZSBkZWZpbml0aW9uIG9mIHJldXNhYmxlIHRlbXBsYXRlXCIpO1xuXHRcdFx0XHRjb25zdCB2bm9kZSA9IChfcmVuZGVyJHZhbHVlID0gcmVuZGVyLnZhbHVlKSA9PT0gbnVsbCB8fCBfcmVuZGVyJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVuZGVyJHZhbHVlLmNhbGwocmVuZGVyLCB7XG5cdFx0XHRcdFx0Li4ub3B0aW9ucy5wcm9wcyA9PSBudWxsID8ga2V5c1RvQ2FtZWxLZWJhYkNhc2UoYXR0cnMpIDogcHJvcHMsXG5cdFx0XHRcdFx0JHNsb3RzOiBzbG90c1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGluaGVyaXRBdHRycyAmJiAodm5vZGUgPT09IG51bGwgfHwgdm5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZub2RlLmxlbmd0aCkgPT09IDEgPyB2bm9kZVswXSA6IHZub2RlO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbWFrZURlc3RydWN0dXJhYmxlKHtcblx0XHRkZWZpbmUsXG5cdFx0cmV1c2Vcblx0fSwgW2RlZmluZSwgcmV1c2VdKTtcbn1cbmZ1bmN0aW9uIGtleXNUb0NhbWVsS2ViYWJDYXNlKG9iaikge1xuXHRjb25zdCBuZXdPYmogPSB7fTtcblx0Zm9yIChjb25zdCBrZXkgaW4gb2JqKSBuZXdPYmpbY2FtZWxpemUoa2V5KV0gPSBvYmpba2V5XTtcblx0cmV0dXJuIG5ld09iajtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gY3JlYXRlVGVtcGxhdGVQcm9taXNlL2luZGV4LnRzXG4vKipcbiogQ3JlYXRlcyBhIHRlbXBsYXRlIHByb21pc2UgY29tcG9uZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9jcmVhdGVUZW1wbGF0ZVByb21pc2VcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZVByb21pc2Uob3B0aW9ucyA9IHt9KSB7XG5cdGxldCBpbmRleCA9IDA7XG5cdGNvbnN0IGluc3RhbmNlcyA9IHJlZihbXSk7XG5cdGZ1bmN0aW9uIGNyZWF0ZSguLi5hcmdzKSB7XG5cdFx0Y29uc3QgcHJvcHMgPSBzaGFsbG93UmVhY3RpdmUoe1xuXHRcdFx0a2V5OiBpbmRleCsrLFxuXHRcdFx0YXJncyxcblx0XHRcdHByb21pc2U6IHZvaWQgMCxcblx0XHRcdHJlc29sdmU6ICgpID0+IHt9LFxuXHRcdFx0cmVqZWN0OiAoKSA9PiB7fSxcblx0XHRcdGlzUmVzb2x2aW5nOiBmYWxzZSxcblx0XHRcdG9wdGlvbnNcblx0XHR9KTtcblx0XHRpbnN0YW5jZXMudmFsdWUucHVzaChwcm9wcyk7XG5cdFx0cHJvcHMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuXHRcdFx0cHJvcHMucmVzb2x2ZSA9ICh2KSA9PiB7XG5cdFx0XHRcdHByb3BzLmlzUmVzb2x2aW5nID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIF9yZXNvbHZlKHYpO1xuXHRcdFx0fTtcblx0XHRcdHByb3BzLnJlamVjdCA9IF9yZWplY3Q7XG5cdFx0fSkuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRwcm9wcy5wcm9taXNlID0gdm9pZCAwO1xuXHRcdFx0Y29uc3QgaW5kZXgkMSA9IGluc3RhbmNlcy52YWx1ZS5pbmRleE9mKHByb3BzKTtcblx0XHRcdGlmIChpbmRleCQxICE9PSAtMSkgaW5zdGFuY2VzLnZhbHVlLnNwbGljZShpbmRleCQxLCAxKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gcHJvcHMucHJvbWlzZTtcblx0fVxuXHRmdW5jdGlvbiBzdGFydCguLi5hcmdzKSB7XG5cdFx0aWYgKG9wdGlvbnMuc2luZ2xldG9uICYmIGluc3RhbmNlcy52YWx1ZS5sZW5ndGggPiAwKSByZXR1cm4gaW5zdGFuY2VzLnZhbHVlWzBdLnByb21pc2U7XG5cdFx0cmV0dXJuIGNyZWF0ZSguLi5hcmdzKTtcblx0fVxuXHRjb25zdCBjb21wb25lbnQgPSBkZWZpbmVDb21wb25lbnQoKF8sIHsgc2xvdHMgfSkgPT4ge1xuXHRcdGNvbnN0IHJlbmRlckxpc3QgPSAoKSA9PiBpbnN0YW5jZXMudmFsdWUubWFwKChwcm9wcykgPT4ge1xuXHRcdFx0dmFyIF9zbG90cyRkZWZhdWx0O1xuXHRcdFx0cmV0dXJuIGgoRnJhZ21lbnQsIHsga2V5OiBwcm9wcy5rZXkgfSwgKF9zbG90cyRkZWZhdWx0ID0gc2xvdHMuZGVmYXVsdCkgPT09IG51bGwgfHwgX3Nsb3RzJGRlZmF1bHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zbG90cyRkZWZhdWx0LmNhbGwoc2xvdHMsIHByb3BzKSk7XG5cdFx0fSk7XG5cdFx0aWYgKG9wdGlvbnMudHJhbnNpdGlvbikgcmV0dXJuICgpID0+IGgoVHJhbnNpdGlvbkdyb3VwLCBvcHRpb25zLnRyYW5zaXRpb24sIHJlbmRlckxpc3QpO1xuXHRcdHJldHVybiByZW5kZXJMaXN0O1xuXHR9KTtcblx0Y29tcG9uZW50LnN0YXJ0ID0gc3RhcnQ7XG5cdHJldHVybiBjb21wb25lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIGNyZWF0ZVVucmVmRm4vaW5kZXgudHNcbi8qKlxuKiBNYWtlIGEgcGxhaW4gZnVuY3Rpb24gYWNjZXB0aW5nIHJlZiBhbmQgcmF3IHZhbHVlcyBhcyBhcmd1bWVudHMuXG4qIFJldHVybnMgdGhlIHNhbWUgdmFsdWUgdGhlIHVuY29udmVydGVkIGZ1bmN0aW9uIHJldHVybnMsIHdpdGggcHJvcGVyIHR5cGluZy5cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiBjcmVhdGVVbnJlZkZuKGZuKSB7XG5cdHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MubWFwKChpKSA9PiB0b1ZhbHVlKGkpKSk7XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIF9jb25maWd1cmFibGUudHNcbmNvbnN0IGRlZmF1bHRXaW5kb3cgPSBpc0NsaWVudCA/IHdpbmRvdyA6IHZvaWQgMDtcbmNvbnN0IGRlZmF1bHREb2N1bWVudCA9IGlzQ2xpZW50ID8gd2luZG93LmRvY3VtZW50IDogdm9pZCAwO1xuY29uc3QgZGVmYXVsdE5hdmlnYXRvciA9IGlzQ2xpZW50ID8gd2luZG93Lm5hdmlnYXRvciA6IHZvaWQgMDtcbmNvbnN0IGRlZmF1bHRMb2NhdGlvbiA9IGlzQ2xpZW50ID8gd2luZG93LmxvY2F0aW9uIDogdm9pZCAwO1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1bnJlZkVsZW1lbnQvaW5kZXgudHNcbi8qKlxuKiBHZXQgdGhlIGRvbSBlbGVtZW50IG9mIGEgcmVmIG9mIGVsZW1lbnQgb3IgVnVlIGNvbXBvbmVudCBpbnN0YW5jZVxuKlxuKiBAcGFyYW0gZWxSZWZcbiovXG5mdW5jdGlvbiB1bnJlZkVsZW1lbnQoZWxSZWYpIHtcblx0dmFyIF8kZWw7XG5cdGNvbnN0IHBsYWluID0gdG9WYWx1ZShlbFJlZik7XG5cdHJldHVybiAoXyRlbCA9IHBsYWluID09PSBudWxsIHx8IHBsYWluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwbGFpbi4kZWwpICE9PSBudWxsICYmIF8kZWwgIT09IHZvaWQgMCA/IF8kZWwgOiBwbGFpbjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRMaXN0ZW5lci9pbmRleC50c1xuZnVuY3Rpb24gdXNlRXZlbnRMaXN0ZW5lciguLi5hcmdzKSB7XG5cdGNvbnN0IHJlZ2lzdGVyID0gKGVsLCBldmVudCwgbGlzdGVuZXIsIG9wdGlvbnMpID0+IHtcblx0XHRlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuICgpID0+IGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBvcHRpb25zKTtcblx0fTtcblx0Y29uc3QgZmlyc3RQYXJhbVRhcmdldHMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgdGVzdCA9IHRvQXJyYXkodG9WYWx1ZShhcmdzWzBdKSkuZmlsdGVyKChlKSA9PiBlICE9IG51bGwpO1xuXHRcdHJldHVybiB0ZXN0LmV2ZXJ5KChlKSA9PiB0eXBlb2YgZSAhPT0gXCJzdHJpbmdcIikgPyB0ZXN0IDogdm9pZCAwO1xuXHR9KTtcblx0cmV0dXJuIHdhdGNoSW1tZWRpYXRlKCgpID0+IHtcblx0XHR2YXIgX2ZpcnN0UGFyYW1UYXJnZXRzJHZhLCBfZmlyc3RQYXJhbVRhcmdldHMkdmEyO1xuXHRcdHJldHVybiBbXG5cdFx0XHQoX2ZpcnN0UGFyYW1UYXJnZXRzJHZhID0gKF9maXJzdFBhcmFtVGFyZ2V0cyR2YTIgPSBmaXJzdFBhcmFtVGFyZ2V0cy52YWx1ZSkgPT09IG51bGwgfHwgX2ZpcnN0UGFyYW1UYXJnZXRzJHZhMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpcnN0UGFyYW1UYXJnZXRzJHZhMi5tYXAoKGUpID0+IHVucmVmRWxlbWVudChlKSkpICE9PSBudWxsICYmIF9maXJzdFBhcmFtVGFyZ2V0cyR2YSAhPT0gdm9pZCAwID8gX2ZpcnN0UGFyYW1UYXJnZXRzJHZhIDogW2RlZmF1bHRXaW5kb3ddLmZpbHRlcigoZSkgPT4gZSAhPSBudWxsKSxcblx0XHRcdHRvQXJyYXkodG9WYWx1ZShmaXJzdFBhcmFtVGFyZ2V0cy52YWx1ZSA/IGFyZ3NbMV0gOiBhcmdzWzBdKSksXG5cdFx0XHR0b0FycmF5KHVucmVmKGZpcnN0UGFyYW1UYXJnZXRzLnZhbHVlID8gYXJnc1syXSA6IGFyZ3NbMV0pKSxcblx0XHRcdHRvVmFsdWUoZmlyc3RQYXJhbVRhcmdldHMudmFsdWUgPyBhcmdzWzNdIDogYXJnc1syXSlcblx0XHRdO1xuXHR9LCAoW3Jhd190YXJnZXRzLCByYXdfZXZlbnRzLCByYXdfbGlzdGVuZXJzLCByYXdfb3B0aW9uc10sIF8sIG9uQ2xlYW51cCkgPT4ge1xuXHRcdGlmICghKHJhd190YXJnZXRzID09PSBudWxsIHx8IHJhd190YXJnZXRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXdfdGFyZ2V0cy5sZW5ndGgpIHx8ICEocmF3X2V2ZW50cyA9PT0gbnVsbCB8fCByYXdfZXZlbnRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiByYXdfZXZlbnRzLmxlbmd0aCkgfHwgIShyYXdfbGlzdGVuZXJzID09PSBudWxsIHx8IHJhd19saXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJhd19saXN0ZW5lcnMubGVuZ3RoKSkgcmV0dXJuO1xuXHRcdGNvbnN0IG9wdGlvbnNDbG9uZSA9IGlzT2JqZWN0KHJhd19vcHRpb25zKSA/IHsgLi4ucmF3X29wdGlvbnMgfSA6IHJhd19vcHRpb25zO1xuXHRcdGNvbnN0IGNsZWFudXBzID0gcmF3X3RhcmdldHMuZmxhdE1hcCgoZWwpID0+IHJhd19ldmVudHMuZmxhdE1hcCgoZXZlbnQpID0+IHJhd19saXN0ZW5lcnMubWFwKChsaXN0ZW5lcikgPT4gcmVnaXN0ZXIoZWwsIGV2ZW50LCBsaXN0ZW5lciwgb3B0aW9uc0Nsb25lKSkpKTtcblx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0Y2xlYW51cHMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuXHRcdH0pO1xuXHR9LCB7IGZsdXNoOiBcInBvc3RcIiB9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25DbGlja091dHNpZGUvaW5kZXgudHNcbmxldCBfaU9TV29ya2Fyb3VuZCA9IGZhbHNlO1xuZnVuY3Rpb24gb25DbGlja091dHNpZGUodGFyZ2V0LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaWdub3JlID0gW10sIGNhcHR1cmUgPSB0cnVlLCBkZXRlY3RJZnJhbWUgPSBmYWxzZSwgY29udHJvbHMgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIGNvbnRyb2xzID8ge1xuXHRcdHN0b3A6IG5vb3AsXG5cdFx0Y2FuY2VsOiBub29wLFxuXHRcdHRyaWdnZXI6IG5vb3Bcblx0fSA6IG5vb3A7XG5cdGlmIChpc0lPUyAmJiAhX2lPU1dvcmthcm91bmQpIHtcblx0XHRfaU9TV29ya2Fyb3VuZCA9IHRydWU7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0QXJyYXkuZnJvbSh3aW5kb3ckMS5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKChlbCkgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIG5vb3AsIGxpc3RlbmVyT3B0aW9ucykpO1xuXHRcdHdpbmRvdyQxLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgbm9vcCwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRsZXQgc2hvdWxkTGlzdGVuID0gdHJ1ZTtcblx0Y29uc3Qgc2hvdWxkSWdub3JlID0gKGV2ZW50KSA9PiB7XG5cdFx0cmV0dXJuIHRvVmFsdWUoaWdub3JlKS5zb21lKCh0YXJnZXQkMSkgPT4ge1xuXHRcdFx0aWYgKHR5cGVvZiB0YXJnZXQkMSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIEFycmF5LmZyb20od2luZG93JDEuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0YXJnZXQkMSkpLnNvbWUoKGVsKSA9PiBlbCA9PT0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSk7XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0JDEpO1xuXHRcdFx0XHRyZXR1cm4gZWwgJiYgKGV2ZW50LnRhcmdldCA9PT0gZWwgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoZWwpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblx0LyoqXG5cdCogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gdGFyZ2V0IGhhcyBtdWx0aXBsZSByb290IGVsZW1lbnRzLlxuXHQqIFJlZmVyZW5jZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Rlc3QtdXRpbHMvYmxvYi9jY2I0NjBiZTU1ZjlmNmJlMDVhYjcwODUwMGE0MWVjOGFkZjZmNGJjL3NyYy92dWUtd3JhcHBlci50cyNMMjFcblx0Ki9cblx0ZnVuY3Rpb24gaGFzTXVsdGlwbGVSb290cyh0YXJnZXQkMSkge1xuXHRcdGNvbnN0IHZtID0gdG9WYWx1ZSh0YXJnZXQkMSk7XG5cdFx0cmV0dXJuIHZtICYmIHZtLiQuc3ViVHJlZS5zaGFwZUZsYWcgPT09IDE2O1xuXHR9XG5cdGZ1bmN0aW9uIGNoZWNrTXVsdGlwbGVSb290cyh0YXJnZXQkMSwgZXZlbnQpIHtcblx0XHRjb25zdCB2bSA9IHRvVmFsdWUodGFyZ2V0JDEpO1xuXHRcdGNvbnN0IGNoaWxkcmVuID0gdm0uJC5zdWJUcmVlICYmIHZtLiQuc3ViVHJlZS5jaGlsZHJlbjtcblx0XHRpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCAhQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gY2hpbGRyZW4uc29tZSgoY2hpbGQpID0+IGNoaWxkLmVsID09PSBldmVudC50YXJnZXQgfHwgZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMoY2hpbGQuZWwpKTtcblx0fVxuXHRjb25zdCBsaXN0ZW5lciA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKGV2ZW50LnRhcmdldCA9PSBudWxsKSByZXR1cm47XG5cdFx0aWYgKCEoZWwgaW5zdGFuY2VvZiBFbGVtZW50KSAmJiBoYXNNdWx0aXBsZVJvb3RzKHRhcmdldCkgJiYgY2hlY2tNdWx0aXBsZVJvb3RzKHRhcmdldCwgZXZlbnQpKSByZXR1cm47XG5cdFx0aWYgKCFlbCB8fCBlbCA9PT0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKGVsKSkgcmV0dXJuO1xuXHRcdGlmIChcImRldGFpbFwiIGluIGV2ZW50ICYmIGV2ZW50LmRldGFpbCA9PT0gMCkgc2hvdWxkTGlzdGVuID0gIXNob3VsZElnbm9yZShldmVudCk7XG5cdFx0aWYgKCFzaG91bGRMaXN0ZW4pIHtcblx0XHRcdHNob3VsZExpc3RlbiA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhhbmRsZXIoZXZlbnQpO1xuXHR9O1xuXHRsZXQgaXNQcm9jZXNzaW5nQ2xpY2sgPSBmYWxzZTtcblx0Y29uc3QgY2xlYW51cCA9IFtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImNsaWNrXCIsIChldmVudCkgPT4ge1xuXHRcdFx0aWYgKCFpc1Byb2Nlc3NpbmdDbGljaykge1xuXHRcdFx0XHRpc1Byb2Nlc3NpbmdDbGljayA9IHRydWU7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdGlzUHJvY2Vzc2luZ0NsaWNrID0gZmFsc2U7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0XHRsaXN0ZW5lcihldmVudCk7XG5cdFx0XHR9XG5cdFx0fSwge1xuXHRcdFx0cGFzc2l2ZTogdHJ1ZSxcblx0XHRcdGNhcHR1cmVcblx0XHR9KSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInBvaW50ZXJkb3duXCIsIChlKSA9PiB7XG5cdFx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gIXNob3VsZElnbm9yZShlKSAmJiAhIShlbCAmJiAhZS5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhlbCkpO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KSxcblx0XHRkZXRlY3RJZnJhbWUgJiYgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJibHVyXCIsIChldmVudCkgPT4ge1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHZhciBfd2luZG93JGRvY3VtZW50JGFjdGk7XG5cdFx0XHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0XHRcdGlmICgoKF93aW5kb3ckZG9jdW1lbnQkYWN0aSA9IHdpbmRvdyQxLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpID09PSBudWxsIHx8IF93aW5kb3ckZG9jdW1lbnQkYWN0aSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3dpbmRvdyRkb2N1bWVudCRhY3RpLnRhZ05hbWUpID09PSBcIklGUkFNRVwiICYmICEoZWwgPT09IG51bGwgfHwgZWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsLmNvbnRhaW5zKHdpbmRvdyQxLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSkgaGFuZGxlcihldmVudCk7XG5cdFx0XHR9LCAwKTtcblx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSlcblx0XS5maWx0ZXIoQm9vbGVhbik7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiBjbGVhbnVwLmZvckVhY2goKGZuKSA9PiBmbigpKTtcblx0aWYgKGNvbnRyb2xzKSByZXR1cm4ge1xuXHRcdHN0b3AsXG5cdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRzaG91bGRMaXN0ZW4gPSBmYWxzZTtcblx0XHR9LFxuXHRcdHRyaWdnZXI6IChldmVudCkgPT4ge1xuXHRcdFx0c2hvdWxkTGlzdGVuID0gdHJ1ZTtcblx0XHRcdGxpc3RlbmVyKGV2ZW50KTtcblx0XHRcdHNob3VsZExpc3RlbiA9IGZhbHNlO1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1vdW50ZWQvaW5kZXgudHNcbi8qKlxuKiBNb3VudGVkIHN0YXRlIGluIHJlZi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTW91bnRlZFxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU1vdW50ZWQoKSB7XG5cdGNvbnN0IGlzTW91bnRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXHRpZiAoaW5zdGFuY2UpIG9uTW91bnRlZCgoKSA9PiB7XG5cdFx0aXNNb3VudGVkLnZhbHVlID0gdHJ1ZTtcblx0fSwgaW5zdGFuY2UpO1xuXHRyZXR1cm4gaXNNb3VudGVkO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdXBwb3J0ZWQvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VTdXBwb3J0ZWQoY2FsbGJhY2spIHtcblx0Y29uc3QgaXNNb3VudGVkID0gdXNlTW91bnRlZCgpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlzTW91bnRlZC52YWx1ZTtcblx0XHRyZXR1cm4gQm9vbGVhbihjYWxsYmFjaygpKTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU11dGF0aW9uT2JzZXJ2ZXIvaW5kZXgudHNcbi8qKlxuKiBXYXRjaCBmb3IgY2hhbmdlcyBiZWluZyBtYWRlIHRvIHRoZSBET00gdHJlZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTXV0YXRpb25PYnNlcnZlclxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NdXRhdGlvbk9ic2VydmVyIE11dGF0aW9uT2JzZXJ2ZXIgTUROXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIGNhbGxiYWNrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTXV0YXRpb25PYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywuLi5tdXRhdGlvbk9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cdGxldCBvYnNlcnZlcjtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiTXV0YXRpb25PYnNlcnZlclwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgY2xlYW51cCA9ICgpID0+IHtcblx0XHRpZiAob2JzZXJ2ZXIpIHtcblx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdG9ic2VydmVyID0gdm9pZCAwO1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc3RvcFdhdGNoID0gd2F0Y2goY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGl0ZW1zID0gdG9BcnJheSh0b1ZhbHVlKHRhcmdldCkpLm1hcCh1bnJlZkVsZW1lbnQpLmZpbHRlcihub3ROdWxsaXNoKTtcblx0XHRyZXR1cm4gbmV3IFNldChpdGVtcyk7XG5cdH0pLCAobmV3VGFyZ2V0cykgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgbmV3VGFyZ2V0cy5zaXplKSB7XG5cdFx0XHRvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcblx0XHRcdG5ld1RhcmdldHMuZm9yRWFjaCgoZWwpID0+IG9ic2VydmVyLm9ic2VydmUoZWwsIG11dGF0aW9uT3B0aW9ucykpO1xuXHRcdH1cblx0fSwge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRmbHVzaDogXCJwb3N0XCJcblx0fSk7XG5cdGNvbnN0IHRha2VSZWNvcmRzID0gKCkgPT4ge1xuXHRcdHJldHVybiBvYnNlcnZlciA9PT0gbnVsbCB8fCBvYnNlcnZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JzZXJ2ZXIudGFrZVJlY29yZHMoKTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRzdG9wV2F0Y2goKTtcblx0XHRjbGVhbnVwKCk7XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdHN0b3AsXG5cdFx0dGFrZVJlY29yZHNcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25FbGVtZW50UmVtb3ZhbC9pbmRleC50c1xuLyoqXG4qIEZpcmVzIHdoZW4gdGhlIGVsZW1lbnQgb3IgYW55IGVsZW1lbnQgY29udGFpbmluZyBpdCBpcyByZW1vdmVkLlxuKlxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBjYWxsYmFja1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIG9uRWxlbWVudFJlbW92YWwodGFyZ2V0LCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGRvY3VtZW50OiBkb2N1bWVudCQxID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50LCBmbHVzaCA9IFwic3luY1wiIH0gPSBvcHRpb25zO1xuXHRpZiAoIXdpbmRvdyQxIHx8ICFkb2N1bWVudCQxKSByZXR1cm4gbm9vcDtcblx0bGV0IHN0b3BGbjtcblx0Y29uc3QgY2xlYW51cEFuZFVwZGF0ZSA9IChmbikgPT4ge1xuXHRcdHN0b3BGbiA9PT0gbnVsbCB8fCBzdG9wRm4gPT09IHZvaWQgMCB8fCBzdG9wRm4oKTtcblx0XHRzdG9wRm4gPSBmbjtcblx0fTtcblx0Y29uc3Qgc3RvcFdhdGNoID0gd2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKGVsKSB7XG5cdFx0XHRjb25zdCB7IHN0b3AgfSA9IHVzZU11dGF0aW9uT2JzZXJ2ZXIoZG9jdW1lbnQkMSwgKG11dGF0aW9uc0xpc3QpID0+IHtcblx0XHRcdFx0aWYgKG11dGF0aW9uc0xpc3QubWFwKChtdXRhdGlvbikgPT4gWy4uLm11dGF0aW9uLnJlbW92ZWROb2Rlc10pLmZsYXQoKS5zb21lKChub2RlKSA9PiBub2RlID09PSBlbCB8fCBub2RlLmNvbnRhaW5zKGVsKSkpIGNhbGxiYWNrKG11dGF0aW9uc0xpc3QpO1xuXHRcdFx0fSwge1xuXHRcdFx0XHR3aW5kb3c6IHdpbmRvdyQxLFxuXHRcdFx0XHRjaGlsZExpc3Q6IHRydWUsXG5cdFx0XHRcdHN1YnRyZWU6IHRydWVcblx0XHRcdH0pO1xuXHRcdFx0Y2xlYW51cEFuZFVwZGF0ZShzdG9wKTtcblx0XHR9XG5cdH0sIHsgZmx1c2ggfSk7XG5cdGNvbnN0IHN0b3BIYW5kbGUgPSAoKSA9PiB7XG5cdFx0c3RvcFdhdGNoKCk7XG5cdFx0Y2xlYW51cEFuZFVwZGF0ZSgpO1xuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wSGFuZGxlKTtcblx0cmV0dXJuIHN0b3BIYW5kbGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIG9uS2V5U3Ryb2tlL2luZGV4LnRzXG5mdW5jdGlvbiBjcmVhdGVLZXlQcmVkaWNhdGUoa2V5RmlsdGVyKSB7XG5cdGlmICh0eXBlb2Yga2V5RmlsdGVyID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBrZXlGaWx0ZXI7XG5cdGVsc2UgaWYgKHR5cGVvZiBrZXlGaWx0ZXIgPT09IFwic3RyaW5nXCIpIHJldHVybiAoZXZlbnQpID0+IGV2ZW50LmtleSA9PT0ga2V5RmlsdGVyO1xuXHRlbHNlIGlmIChBcnJheS5pc0FycmF5KGtleUZpbHRlcikpIHJldHVybiAoZXZlbnQpID0+IGtleUZpbHRlci5pbmNsdWRlcyhldmVudC5rZXkpO1xuXHRyZXR1cm4gKCkgPT4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG9uS2V5U3Ryb2tlKC4uLmFyZ3MpIHtcblx0bGV0IGtleTtcblx0bGV0IGhhbmRsZXI7XG5cdGxldCBvcHRpb25zID0ge307XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuXHRcdGtleSA9IGFyZ3NbMF07XG5cdFx0aGFuZGxlciA9IGFyZ3NbMV07XG5cdFx0b3B0aW9ucyA9IGFyZ3NbMl07XG5cdH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIGlmICh0eXBlb2YgYXJnc1sxXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdGtleSA9IHRydWU7XG5cdFx0aGFuZGxlciA9IGFyZ3NbMF07XG5cdFx0b3B0aW9ucyA9IGFyZ3NbMV07XG5cdH0gZWxzZSB7XG5cdFx0a2V5ID0gYXJnc1swXTtcblx0XHRoYW5kbGVyID0gYXJnc1sxXTtcblx0fVxuXHRlbHNlIHtcblx0XHRrZXkgPSB0cnVlO1xuXHRcdGhhbmRsZXIgPSBhcmdzWzBdO1xuXHR9XG5cdGNvbnN0IHsgdGFyZ2V0ID0gZGVmYXVsdFdpbmRvdywgZXZlbnROYW1lID0gXCJrZXlkb3duXCIsIHBhc3NpdmUgPSBmYWxzZSwgZGVkdXBlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHByZWRpY2F0ZSA9IGNyZWF0ZUtleVByZWRpY2F0ZShrZXkpO1xuXHRjb25zdCBsaXN0ZW5lciA9IChlKSA9PiB7XG5cdFx0aWYgKGUucmVwZWF0ICYmIHRvVmFsdWUoZGVkdXBlKSkgcmV0dXJuO1xuXHRcdGlmIChwcmVkaWNhdGUoZSkpIGhhbmRsZXIoZSk7XG5cdH07XG5cdHJldHVybiB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBsaXN0ZW5lciwgcGFzc2l2ZSk7XG59XG4vKipcbiogTGlzdGVuIHRvIHRoZSBrZXlkb3duIGV2ZW50IG9mIHRoZSBnaXZlbiBrZXkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL29uS2V5U3Ryb2tlXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGhhbmRsZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvbktleURvd24oa2V5LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIG9uS2V5U3Ryb2tlKGtleSwgaGFuZGxlciwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZXZlbnROYW1lOiBcImtleWRvd25cIlxuXHR9KTtcbn1cbi8qKlxuKiBMaXN0ZW4gdG8gdGhlIGtleXByZXNzIGV2ZW50IG9mIHRoZSBnaXZlbiBrZXkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL29uS2V5U3Ryb2tlXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGhhbmRsZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvbktleVByZXNzZWQoa2V5LCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIG9uS2V5U3Ryb2tlKGtleSwgaGFuZGxlciwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZXZlbnROYW1lOiBcImtleXByZXNzXCJcblx0fSk7XG59XG4vKipcbiogTGlzdGVuIHRvIHRoZSBrZXl1cCBldmVudCBvZiB0aGUgZ2l2ZW4ga2V5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy9vbktleVN0cm9rZVxuKiBAcGFyYW0ga2V5XG4qIEBwYXJhbSBoYW5kbGVyXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gb25LZXlVcChrZXksIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gb25LZXlTdHJva2Uoa2V5LCBoYW5kbGVyLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudE5hbWU6IFwia2V5dXBcIlxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gb25Mb25nUHJlc3MvaW5kZXgudHNcbmNvbnN0IERFRkFVTFRfREVMQVkgPSA1MDA7XG5jb25zdCBERUZBVUxUX1RIUkVTSE9MRCA9IDEwO1xuZnVuY3Rpb24gb25Mb25nUHJlc3ModGFyZ2V0LCBoYW5kbGVyLCBvcHRpb25zKSB7XG5cdHZhciBfb3B0aW9ucyRtb2RpZmllcnMxMCwgX29wdGlvbnMkbW9kaWZpZXJzMTE7XG5cdGNvbnN0IGVsZW1lbnRSZWYgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSk7XG5cdGxldCB0aW1lb3V0O1xuXHRsZXQgcG9zU3RhcnQ7XG5cdGxldCBzdGFydFRpbWVzdGFtcDtcblx0bGV0IGhhc0xvbmdQcmVzc2VkID0gZmFsc2U7XG5cdGZ1bmN0aW9uIGNsZWFyKCkge1xuXHRcdGlmICh0aW1lb3V0KSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdFx0XHR0aW1lb3V0ID0gdm9pZCAwO1xuXHRcdH1cblx0XHRwb3NTdGFydCA9IHZvaWQgMDtcblx0XHRzdGFydFRpbWVzdGFtcCA9IHZvaWQgMDtcblx0XHRoYXNMb25nUHJlc3NlZCA9IGZhbHNlO1xuXHR9XG5cdGZ1bmN0aW9uIGdldERlbGF5KGV2KSB7XG5cdFx0Y29uc3QgZGVsYXkgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGVsYXk7XG5cdFx0aWYgKHR5cGVvZiBkZWxheSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGVsYXkoZXYpO1xuXHRcdHJldHVybiBkZWxheSAhPT0gbnVsbCAmJiBkZWxheSAhPT0gdm9pZCAwID8gZGVsYXkgOiBERUZBVUxUX0RFTEFZO1xuXHR9XG5cdGZ1bmN0aW9uIG9uUmVsZWFzZShldikge1xuXHRcdHZhciBfb3B0aW9ucyRtb2RpZmllcnMsIF9vcHRpb25zJG1vZGlmaWVyczIsIF9vcHRpb25zJG1vZGlmaWVyczM7XG5cdFx0Y29uc3QgW19zdGFydFRpbWVzdGFtcCwgX3Bvc1N0YXJ0LCBfaGFzTG9uZ1ByZXNzZWRdID0gW1xuXHRcdFx0c3RhcnRUaW1lc3RhbXAsXG5cdFx0XHRwb3NTdGFydCxcblx0XHRcdGhhc0xvbmdQcmVzc2VkXG5cdFx0XTtcblx0XHRjbGVhcigpO1xuXHRcdGlmICghKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vbk1vdXNlVXApIHx8ICFfcG9zU3RhcnQgfHwgIV9zdGFydFRpbWVzdGFtcCkgcmV0dXJuO1xuXHRcdGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVycyA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVycy5zZWxmKSAmJiBldi50YXJnZXQgIT09IGVsZW1lbnRSZWYudmFsdWUpIHJldHVybjtcblx0XHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczIgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzMi5wcmV2ZW50KSBldi5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzMyA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMzLnN0b3ApIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGNvbnN0IGR4ID0gZXYueCAtIF9wb3NTdGFydC54O1xuXHRcdGNvbnN0IGR5ID0gZXYueSAtIF9wb3NTdGFydC55O1xuXHRcdGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcblx0XHRvcHRpb25zLm9uTW91c2VVcChldi50aW1lU3RhbXAgLSBfc3RhcnRUaW1lc3RhbXAsIGRpc3RhbmNlLCBfaGFzTG9uZ1ByZXNzZWQpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uRG93bihldikge1xuXHRcdHZhciBfb3B0aW9ucyRtb2RpZmllcnM0LCBfb3B0aW9ucyRtb2RpZmllcnM1LCBfb3B0aW9ucyRtb2RpZmllcnM2O1xuXHRcdGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczQgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzNC5zZWxmKSAmJiBldi50YXJnZXQgIT09IGVsZW1lbnRSZWYudmFsdWUpIHJldHVybjtcblx0XHRjbGVhcigpO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzNSA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM1ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM1LnByZXZlbnQpIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM2ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczYuc3RvcCkgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0cG9zU3RhcnQgPSB7XG5cdFx0XHR4OiBldi54LFxuXHRcdFx0eTogZXYueVxuXHRcdH07XG5cdFx0c3RhcnRUaW1lc3RhbXAgPSBldi50aW1lU3RhbXA7XG5cdFx0dGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aGFzTG9uZ1ByZXNzZWQgPSB0cnVlO1xuXHRcdFx0aGFuZGxlcihldik7XG5cdFx0fSwgZ2V0RGVsYXkoZXYpKTtcblx0fVxuXHRmdW5jdGlvbiBvbk1vdmUoZXYpIHtcblx0XHR2YXIgX29wdGlvbnMkbW9kaWZpZXJzNywgX29wdGlvbnMkbW9kaWZpZXJzOCwgX29wdGlvbnMkbW9kaWZpZXJzOSwgX29wdGlvbnMkZGlzdGFuY2VUaHJlO1xuXHRcdGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczcgPSBvcHRpb25zLm1vZGlmaWVycykgPT09IG51bGwgfHwgX29wdGlvbnMkbW9kaWZpZXJzNyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzNy5zZWxmKSAmJiBldi50YXJnZXQgIT09IGVsZW1lbnRSZWYudmFsdWUpIHJldHVybjtcblx0XHRpZiAoIXBvc1N0YXJ0IHx8IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZGlzdGFuY2VUaHJlc2hvbGQpID09PSBmYWxzZSkgcmV0dXJuO1xuXHRcdGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCB8fCAoX29wdGlvbnMkbW9kaWZpZXJzOCA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnM4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnM4LnByZXZlbnQpIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnM5ID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG1vZGlmaWVyczkuc3RvcCkgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0Y29uc3QgZHggPSBldi54IC0gcG9zU3RhcnQueDtcblx0XHRjb25zdCBkeSA9IGV2LnkgLSBwb3NTdGFydC55O1xuXHRcdGlmIChNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpID49ICgoX29wdGlvbnMkZGlzdGFuY2VUaHJlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRpc3RhbmNlVGhyZXNob2xkKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRkaXN0YW5jZVRocmUgIT09IHZvaWQgMCA/IF9vcHRpb25zJGRpc3RhbmNlVGhyZSA6IERFRkFVTFRfVEhSRVNIT0xEKSkgY2xlYXIoKTtcblx0fVxuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7XG5cdFx0Y2FwdHVyZTogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG1vZGlmaWVyczEwID0gb3B0aW9ucy5tb2RpZmllcnMpID09PSBudWxsIHx8IF9vcHRpb25zJG1vZGlmaWVyczEwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfb3B0aW9ucyRtb2RpZmllcnMxMC5jYXB0dXJlLFxuXHRcdG9uY2U6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwIHx8IChfb3B0aW9ucyRtb2RpZmllcnMxMSA9IG9wdGlvbnMubW9kaWZpZXJzKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRtb2RpZmllcnMxMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkbW9kaWZpZXJzMTEub25jZVxuXHR9O1xuXHRjb25zdCBjbGVhbnVwID0gW1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZWxlbWVudFJlZiwgXCJwb2ludGVyZG93blwiLCBvbkRvd24sIGxpc3RlbmVyT3B0aW9ucyksXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50UmVmLCBcInBvaW50ZXJtb3ZlXCIsIG9uTW92ZSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnRSZWYsIFtcInBvaW50ZXJ1cFwiLCBcInBvaW50ZXJsZWF2ZVwiXSwgb25SZWxlYXNlLCBsaXN0ZW5lck9wdGlvbnMpXG5cdF07XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiBjbGVhbnVwLmZvckVhY2goKGZuKSA9PiBmbigpKTtcblx0cmV0dXJuIHN0b3A7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIG9uU3RhcnRUeXBpbmcvaW5kZXgudHNcbmZ1bmN0aW9uIGlzRm9jdXNlZEVsZW1lbnRFZGl0YWJsZSgpIHtcblx0Y29uc3QgeyBhY3RpdmVFbGVtZW50LCBib2R5IH0gPSBkb2N1bWVudDtcblx0aWYgKCFhY3RpdmVFbGVtZW50KSByZXR1cm4gZmFsc2U7XG5cdGlmIChhY3RpdmVFbGVtZW50ID09PSBib2R5KSByZXR1cm4gZmFsc2U7XG5cdHN3aXRjaCAoYWN0aXZlRWxlbWVudC50YWdOYW1lKSB7XG5cdFx0Y2FzZSBcIklOUFVUXCI6XG5cdFx0Y2FzZSBcIlRFWFRBUkVBXCI6IHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBhY3RpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKTtcbn1cbmZ1bmN0aW9uIGlzVHlwZWRDaGFyVmFsaWQoeyBrZXlDb2RlLCBtZXRhS2V5LCBjdHJsS2V5LCBhbHRLZXkgfSkge1xuXHRpZiAobWV0YUtleSB8fCBjdHJsS2V5IHx8IGFsdEtleSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoa2V5Q29kZSA+PSA0OCAmJiBrZXlDb2RlIDw9IDU3IHx8IGtleUNvZGUgPj0gOTYgJiYga2V5Q29kZSA8PSAxMDUpIHJldHVybiB0cnVlO1xuXHRpZiAoa2V5Q29kZSA+PSA2NSAmJiBrZXlDb2RlIDw9IDkwKSByZXR1cm4gdHJ1ZTtcblx0cmV0dXJuIGZhbHNlO1xufVxuLyoqXG4qIEZpcmVzIHdoZW4gdXNlcnMgc3RhcnQgdHlwaW5nIG9uIG5vbi1lZGl0YWJsZSBlbGVtZW50cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvb25TdGFydFR5cGluZ1xuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiBvblN0YXJ0VHlwaW5nKGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0Y29uc3Qga2V5ZG93biA9IChldmVudCkgPT4ge1xuXHRcdGlmICghaXNGb2N1c2VkRWxlbWVudEVkaXRhYmxlKCkgJiYgaXNUeXBlZENoYXJWYWxpZChldmVudCkpIGNhbGxiYWNrKGV2ZW50KTtcblx0fTtcblx0aWYgKGRvY3VtZW50JDEpIHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJrZXlkb3duXCIsIGtleWRvd24sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdGVtcGxhdGVSZWYvaW5kZXgudHNcbi8qKlxuKiBAZGVwcmVjYXRlZCBVc2UgVnVlJ3MgYnVpbHQtaW4gYHVzZVRlbXBsYXRlUmVmYCBpbnN0ZWFkLlxuKlxuKiBTaG9ydGhhbmQgZm9yIGJpbmRpbmcgcmVmIHRvIHRlbXBsYXRlIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3RlbXBsYXRlUmVmXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGluaXRpYWxWYWx1ZVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHRlbXBsYXRlUmVmKGtleSwgaW5pdGlhbFZhbHVlID0gbnVsbCkge1xuXHRjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXHRsZXQgX3RyaWdnZXIgPSAoKSA9PiB7fTtcblx0Y29uc3QgZWxlbWVudCA9IGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcblx0XHRfdHJpZ2dlciA9IHRyaWdnZXI7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldCgpIHtcblx0XHRcdFx0dmFyIF9pbnN0YW5jZSRwcm94eSQkcmVmcywgX2luc3RhbmNlJHByb3h5O1xuXHRcdFx0XHR0cmFjaygpO1xuXHRcdFx0XHRyZXR1cm4gKF9pbnN0YW5jZSRwcm94eSQkcmVmcyA9IGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB2b2lkIDAgfHwgKF9pbnN0YW5jZSRwcm94eSA9IGluc3RhbmNlLnByb3h5KSA9PT0gbnVsbCB8fCBfaW5zdGFuY2UkcHJveHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9pbnN0YW5jZSRwcm94eS4kcmVmc1trZXldKSAhPT0gbnVsbCAmJiBfaW5zdGFuY2UkcHJveHkkJHJlZnMgIT09IHZvaWQgMCA/IF9pbnN0YW5jZSRwcm94eSQkcmVmcyA6IGluaXRpYWxWYWx1ZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQoKSB7fVxuXHRcdH07XG5cdH0pO1xuXHR0cnlPbk1vdW50ZWQoX3RyaWdnZXIpO1xuXHRvblVwZGF0ZWQoX3RyaWdnZXIpO1xuXHRyZXR1cm4gZWxlbWVudDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQWN0aXZlRWxlbWVudC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBY3RpdmVFbGVtZW50XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQWN0aXZlRWxlbWVudChvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGRvY3VtZW50O1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBkZWVwID0gdHJ1ZSwgdHJpZ2dlck9uUmVtb3ZhbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkb2N1bWVudCQxID0gKF9vcHRpb25zJGRvY3VtZW50ID0gb3B0aW9ucy5kb2N1bWVudCkgIT09IG51bGwgJiYgX29wdGlvbnMkZG9jdW1lbnQgIT09IHZvaWQgMCA/IF9vcHRpb25zJGRvY3VtZW50IDogd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmRvY3VtZW50O1xuXHRjb25zdCBnZXREZWVwQWN0aXZlRWxlbWVudCA9ICgpID0+IHtcblx0XHRsZXQgZWxlbWVudCA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS5hY3RpdmVFbGVtZW50O1xuXHRcdGlmIChkZWVwKSB7XG5cdFx0XHR2YXIgX2VsZW1lbnQkc2hhZG93Um9vdDtcblx0XHRcdHdoaWxlIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsZW1lbnQuc2hhZG93Um9vdCkgZWxlbWVudCA9IGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwIHx8IChfZWxlbWVudCRzaGFkb3dSb290ID0gZWxlbWVudC5zaGFkb3dSb290KSA9PT0gbnVsbCB8fCBfZWxlbWVudCRzaGFkb3dSb290ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZWxlbWVudCRzaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtZW50O1xuXHR9O1xuXHRjb25zdCBhY3RpdmVFbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB0cmlnZ2VyID0gKCkgPT4ge1xuXHRcdGFjdGl2ZUVsZW1lbnQudmFsdWUgPSBnZXREZWVwQWN0aXZlRWxlbWVudCgpO1xuXHR9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7XG5cdFx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdFx0cGFzc2l2ZTogdHJ1ZVxuXHRcdH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJibHVyXCIsIChldmVudCkgPT4ge1xuXHRcdFx0aWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgIT09IG51bGwpIHJldHVybjtcblx0XHRcdHRyaWdnZXIoKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZm9jdXNcIiwgdHJpZ2dlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRpZiAodHJpZ2dlck9uUmVtb3ZhbCkgb25FbGVtZW50UmVtb3ZhbChhY3RpdmVFbGVtZW50LCB0cmlnZ2VyLCB7IGRvY3VtZW50OiBkb2N1bWVudCQxIH0pO1xuXHR0cmlnZ2VyKCk7XG5cdHJldHVybiBhY3RpdmVFbGVtZW50O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VSYWZGbi9pbmRleC50c1xuLyoqXG4qIENhbGwgZnVuY3Rpb24gb24gZXZlcnkgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuIFdpdGggY29udHJvbHMgb2YgcGF1c2luZyBhbmQgcmVzdW1pbmcuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJhZkZuXG4qIEBwYXJhbSBmblxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVJhZkZuKGZuLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBmcHNMaW1pdCA9IG51bGwsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBvbmNlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzQWN0aXZlID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGludGVydmFsTGltaXQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgbGltaXQgPSB0b1ZhbHVlKGZwc0xpbWl0KTtcblx0XHRyZXR1cm4gbGltaXQgPyAxZTMgLyBsaW1pdCA6IG51bGw7XG5cdH0pO1xuXHRsZXQgcHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IDA7XG5cdGxldCByYWZJZCA9IG51bGw7XG5cdGZ1bmN0aW9uIGxvb3AodGltZXN0YW1wJDEpIHtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlIHx8ICF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGlmICghcHJldmlvdXNGcmFtZVRpbWVzdGFtcCkgcHJldmlvdXNGcmFtZVRpbWVzdGFtcCA9IHRpbWVzdGFtcCQxO1xuXHRcdGNvbnN0IGRlbHRhID0gdGltZXN0YW1wJDEgLSBwcmV2aW91c0ZyYW1lVGltZXN0YW1wO1xuXHRcdGlmIChpbnRlcnZhbExpbWl0LnZhbHVlICYmIGRlbHRhIDwgaW50ZXJ2YWxMaW1pdC52YWx1ZSkge1xuXHRcdFx0cmFmSWQgPSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHByZXZpb3VzRnJhbWVUaW1lc3RhbXAgPSB0aW1lc3RhbXAkMTtcblx0XHRmbih7XG5cdFx0XHRkZWx0YSxcblx0XHRcdHRpbWVzdGFtcDogdGltZXN0YW1wJDFcblx0XHR9KTtcblx0XHRpZiAob25jZSkge1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0XHRcdHJhZklkID0gbnVsbDtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0cmFmSWQgPSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKCkge1xuXHRcdGlmICghaXNBY3RpdmUudmFsdWUgJiYgd2luZG93JDEpIHtcblx0XHRcdGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcblx0XHRcdHByZXZpb3VzRnJhbWVUaW1lc3RhbXAgPSAwO1xuXHRcdFx0cmFmSWQgPSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHBhdXNlKCkge1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdFx0aWYgKHJhZklkICE9IG51bGwgJiYgd2luZG93JDEpIHtcblx0XHRcdHdpbmRvdyQxLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcblx0XHRcdHJhZklkID0gbnVsbDtcblx0XHR9XG5cdH1cblx0aWYgKGltbWVkaWF0ZSkgcmVzdW1lKCk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHBhdXNlKTtcblx0cmV0dXJuIHtcblx0XHRpc0FjdGl2ZTogcmVhZG9ubHkoaXNBY3RpdmUpLFxuXHRcdHBhdXNlLFxuXHRcdHJlc3VtZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBbmltYXRlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgV2ViIEFuaW1hdGlvbnMgQVBJXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUFuaW1hdGVcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0ga2V5ZnJhbWVzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQW5pbWF0ZSh0YXJnZXQsIGtleWZyYW1lcywgb3B0aW9ucykge1xuXHRsZXQgY29uZmlnO1xuXHRsZXQgYW5pbWF0ZU9wdGlvbnM7XG5cdGlmIChpc09iamVjdChvcHRpb25zKSkge1xuXHRcdGNvbmZpZyA9IG9wdGlvbnM7XG5cdFx0YW5pbWF0ZU9wdGlvbnMgPSBvYmplY3RPbWl0KG9wdGlvbnMsIFtcblx0XHRcdFwid2luZG93XCIsXG5cdFx0XHRcImltbWVkaWF0ZVwiLFxuXHRcdFx0XCJjb21taXRTdHlsZXNcIixcblx0XHRcdFwicGVyc2lzdFwiLFxuXHRcdFx0XCJvblJlYWR5XCIsXG5cdFx0XHRcIm9uRXJyb3JcIlxuXHRcdF0pO1xuXHR9IGVsc2Uge1xuXHRcdGNvbmZpZyA9IHsgZHVyYXRpb246IG9wdGlvbnMgfTtcblx0XHRhbmltYXRlT3B0aW9ucyA9IG9wdGlvbnM7XG5cdH1cblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW1tZWRpYXRlID0gdHJ1ZSwgY29tbWl0U3R5bGVzLCBwZXJzaXN0LCBwbGF5YmFja1JhdGU6IF9wbGF5YmFja1JhdGUgPSAxLCBvblJlYWR5LCBvbkVycm9yID0gKGUpID0+IHtcblx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHR9IH0gPSBjb25maWc7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBIVE1MRWxlbWVudCAmJiBcImFuaW1hdGVcIiBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGUpO1xuXHRjb25zdCBhbmltYXRlID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBzdG9yZSA9IHNoYWxsb3dSZWFjdGl2ZSh7XG5cdFx0c3RhcnRUaW1lOiBudWxsLFxuXHRcdGN1cnJlbnRUaW1lOiBudWxsLFxuXHRcdHRpbWVsaW5lOiBudWxsLFxuXHRcdHBsYXliYWNrUmF0ZTogX3BsYXliYWNrUmF0ZSxcblx0XHRwZW5kaW5nOiBmYWxzZSxcblx0XHRwbGF5U3RhdGU6IGltbWVkaWF0ZSA/IFwiaWRsZVwiIDogXCJwYXVzZWRcIixcblx0XHRyZXBsYWNlU3RhdGU6IFwiYWN0aXZlXCJcblx0fSk7XG5cdGNvbnN0IHBlbmRpbmcgPSBjb21wdXRlZCgoKSA9PiBzdG9yZS5wZW5kaW5nKTtcblx0Y29uc3QgcGxheVN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUucGxheVN0YXRlKTtcblx0Y29uc3QgcmVwbGFjZVN0YXRlID0gY29tcHV0ZWQoKCkgPT4gc3RvcmUucmVwbGFjZVN0YXRlKTtcblx0Y29uc3Qgc3RhcnRUaW1lID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBzdG9yZS5zdGFydFRpbWU7XG5cdFx0fSxcblx0XHRzZXQodmFsdWUpIHtcblx0XHRcdHN0b3JlLnN0YXJ0VGltZSA9IHZhbHVlO1xuXHRcdFx0aWYgKGFuaW1hdGUudmFsdWUpIGFuaW1hdGUudmFsdWUuc3RhcnRUaW1lID0gdmFsdWU7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgY3VycmVudFRpbWUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLmN1cnJlbnRUaW1lO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzdG9yZS5jdXJyZW50VGltZSA9IHZhbHVlO1xuXHRcdFx0aWYgKGFuaW1hdGUudmFsdWUpIHtcblx0XHRcdFx0YW5pbWF0ZS52YWx1ZS5jdXJyZW50VGltZSA9IHZhbHVlO1xuXHRcdFx0XHRzeW5jUmVzdW1lKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgdGltZWxpbmUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLnRpbWVsaW5lO1xuXHRcdH0sXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHRzdG9yZS50aW1lbGluZSA9IHZhbHVlO1xuXHRcdFx0aWYgKGFuaW1hdGUudmFsdWUpIGFuaW1hdGUudmFsdWUudGltZWxpbmUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBwbGF5YmFja1JhdGUgPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHN0b3JlLnBsYXliYWNrUmF0ZTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0c3RvcmUucGxheWJhY2tSYXRlID0gdmFsdWU7XG5cdFx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkgYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBwbGF5ID0gKCkgPT4ge1xuXHRcdGlmIChhbmltYXRlLnZhbHVlKSB0cnkge1xuXHRcdFx0YW5pbWF0ZS52YWx1ZS5wbGF5KCk7XG5cdFx0XHRzeW5jUmVzdW1lKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0XHRlbHNlIHVwZGF0ZSgpO1xuXHR9O1xuXHRjb25zdCBwYXVzZSA9ICgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIF9hbmltYXRlJHZhbHVlO1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlID0gYW5pbWF0ZS52YWx1ZSkgPT09IG51bGwgfHwgX2FuaW1hdGUkdmFsdWUgPT09IHZvaWQgMCB8fCBfYW5pbWF0ZSR2YWx1ZS5wYXVzZSgpO1xuXHRcdFx0c3luY1BhdXNlKCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJldmVyc2UgPSAoKSA9PiB7XG5cdFx0aWYgKCFhbmltYXRlLnZhbHVlKSB1cGRhdGUoKTtcblx0XHR0cnkge1xuXHRcdFx0dmFyIF9hbmltYXRlJHZhbHVlMjtcblx0XHRcdChfYW5pbWF0ZSR2YWx1ZTIgPSBhbmltYXRlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYW5pbWF0ZSR2YWx1ZTIgPT09IHZvaWQgMCB8fCBfYW5pbWF0ZSR2YWx1ZTIucmV2ZXJzZSgpO1xuXHRcdFx0c3luY1Jlc3VtZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHN5bmNQYXVzZSgpO1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIF9hbmltYXRlJHZhbHVlMztcblx0XHRcdChfYW5pbWF0ZSR2YWx1ZTMgPSBhbmltYXRlLnZhbHVlKSA9PT0gbnVsbCB8fCBfYW5pbWF0ZSR2YWx1ZTMgPT09IHZvaWQgMCB8fCBfYW5pbWF0ZSR2YWx1ZTMuZmluaXNoKCk7XG5cdFx0XHRzeW5jUGF1c2UoKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvbkVycm9yKGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgY2FuY2VsID0gKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgX2FuaW1hdGUkdmFsdWU0O1xuXHRcdFx0KF9hbmltYXRlJHZhbHVlNCA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlNCA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlNC5jYW5jZWwoKTtcblx0XHRcdHN5bmNQYXVzZSgpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHR9O1xuXHR3YXRjaCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSwgKGVsKSA9PiB7XG5cdFx0aWYgKGVsKSB1cGRhdGUodHJ1ZSk7XG5cdFx0ZWxzZSBhbmltYXRlLnZhbHVlID0gdm9pZCAwO1xuXHR9KTtcblx0d2F0Y2goKCkgPT4ga2V5ZnJhbWVzLCAodmFsdWUpID0+IHtcblx0XHRpZiAoYW5pbWF0ZS52YWx1ZSkge1xuXHRcdFx0dXBkYXRlKCk7XG5cdFx0XHRjb25zdCB0YXJnZXRFbCA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdFx0aWYgKHRhcmdldEVsKSBhbmltYXRlLnZhbHVlLmVmZmVjdCA9IG5ldyBLZXlmcmFtZUVmZmVjdCh0YXJnZXRFbCwgdG9WYWx1ZSh2YWx1ZSksIGFuaW1hdGVPcHRpb25zKTtcblx0XHR9XG5cdH0sIHsgZGVlcDogdHJ1ZSB9KTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IHVwZGF0ZSh0cnVlKSwgZmFsc2UpO1xuXHR0cnlPblNjb3BlRGlzcG9zZShjYW5jZWwpO1xuXHRmdW5jdGlvbiB1cGRhdGUoaW5pdCkge1xuXHRcdGNvbnN0IGVsID0gdW5yZWZFbGVtZW50KHRhcmdldCk7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhZWwpIHJldHVybjtcblx0XHRpZiAoIWFuaW1hdGUudmFsdWUpIGFuaW1hdGUudmFsdWUgPSBlbC5hbmltYXRlKHRvVmFsdWUoa2V5ZnJhbWVzKSwgYW5pbWF0ZU9wdGlvbnMpO1xuXHRcdGlmIChwZXJzaXN0KSBhbmltYXRlLnZhbHVlLnBlcnNpc3QoKTtcblx0XHRpZiAoX3BsYXliYWNrUmF0ZSAhPT0gMSkgYW5pbWF0ZS52YWx1ZS5wbGF5YmFja1JhdGUgPSBfcGxheWJhY2tSYXRlO1xuXHRcdGlmIChpbml0ICYmICFpbW1lZGlhdGUpIGFuaW1hdGUudmFsdWUucGF1c2UoKTtcblx0XHRlbHNlIHN5bmNSZXN1bWUoKTtcblx0XHRvblJlYWR5ID09PSBudWxsIHx8IG9uUmVhZHkgPT09IHZvaWQgMCB8fCBvblJlYWR5KGFuaW1hdGUudmFsdWUpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKGFuaW1hdGUsIFtcblx0XHRcImNhbmNlbFwiLFxuXHRcdFwiZmluaXNoXCIsXG5cdFx0XCJyZW1vdmVcIlxuXHRdLCBzeW5jUGF1c2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoYW5pbWF0ZSwgXCJmaW5pc2hcIiwgKCkgPT4ge1xuXHRcdHZhciBfYW5pbWF0ZSR2YWx1ZTU7XG5cdFx0aWYgKGNvbW1pdFN0eWxlcykgKF9hbmltYXRlJHZhbHVlNSA9IGFuaW1hdGUudmFsdWUpID09PSBudWxsIHx8IF9hbmltYXRlJHZhbHVlNSA9PT0gdm9pZCAwIHx8IF9hbmltYXRlJHZhbHVlNS5jb21taXRTdHlsZXMoKTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0Y29uc3QgeyByZXN1bWU6IHJlc3VtZVJlZiwgcGF1c2U6IHBhdXNlUmVmIH0gPSB1c2VSYWZGbigoKSA9PiB7XG5cdFx0aWYgKCFhbmltYXRlLnZhbHVlKSByZXR1cm47XG5cdFx0c3RvcmUucGVuZGluZyA9IGFuaW1hdGUudmFsdWUucGVuZGluZztcblx0XHRzdG9yZS5wbGF5U3RhdGUgPSBhbmltYXRlLnZhbHVlLnBsYXlTdGF0ZTtcblx0XHRzdG9yZS5yZXBsYWNlU3RhdGUgPSBhbmltYXRlLnZhbHVlLnJlcGxhY2VTdGF0ZTtcblx0XHRzdG9yZS5zdGFydFRpbWUgPSBhbmltYXRlLnZhbHVlLnN0YXJ0VGltZTtcblx0XHRzdG9yZS5jdXJyZW50VGltZSA9IGFuaW1hdGUudmFsdWUuY3VycmVudFRpbWU7XG5cdFx0c3RvcmUudGltZWxpbmUgPSBhbmltYXRlLnZhbHVlLnRpbWVsaW5lO1xuXHRcdHN0b3JlLnBsYXliYWNrUmF0ZSA9IGFuaW1hdGUudmFsdWUucGxheWJhY2tSYXRlO1xuXHR9LCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGZ1bmN0aW9uIHN5bmNSZXN1bWUoKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSByZXN1bWVSZWYoKTtcblx0fVxuXHRmdW5jdGlvbiBzeW5jUGF1c2UoKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyQxKSB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocGF1c2VSZWYpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0YW5pbWF0ZSxcblx0XHRwbGF5LFxuXHRcdHBhdXNlLFxuXHRcdHJldmVyc2UsXG5cdFx0ZmluaXNoLFxuXHRcdGNhbmNlbCxcblx0XHRwZW5kaW5nLFxuXHRcdHBsYXlTdGF0ZSxcblx0XHRyZXBsYWNlU3RhdGUsXG5cdFx0c3RhcnRUaW1lLFxuXHRcdGN1cnJlbnRUaW1lLFxuXHRcdHRpbWVsaW5lLFxuXHRcdHBsYXliYWNrUmF0ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VBc3luY1F1ZXVlL2luZGV4LnRzXG4vKipcbiogQXN5bmNocm9ub3VzIHF1ZXVlIHRhc2sgY29udHJvbGxlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQXN5bmNRdWV1ZVxuKiBAcGFyYW0gdGFza3NcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VBc3luY1F1ZXVlKHRhc2tzLCBvcHRpb25zKSB7XG5cdGNvbnN0IHsgaW50ZXJydXB0ID0gdHJ1ZSwgb25FcnJvciA9IG5vb3AsIG9uRmluaXNoZWQgPSBub29wLCBzaWduYWwgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IHByb21pc2VTdGF0ZSA9IHtcblx0XHRhYm9ydGVkOiBcImFib3J0ZWRcIixcblx0XHRmdWxmaWxsZWQ6IFwiZnVsZmlsbGVkXCIsXG5cdFx0cGVuZGluZzogXCJwZW5kaW5nXCIsXG5cdFx0cmVqZWN0ZWQ6IFwicmVqZWN0ZWRcIlxuXHR9O1xuXHRjb25zdCByZXN1bHQgPSByZWFjdGl2ZShBcnJheS5mcm9tKEFycmF5LmZyb20oeyBsZW5ndGg6IHRhc2tzLmxlbmd0aCB9KSwgKCkgPT4gKHtcblx0XHRzdGF0ZTogcHJvbWlzZVN0YXRlLnBlbmRpbmcsXG5cdFx0ZGF0YTogbnVsbFxuXHR9KSkpO1xuXHRjb25zdCBhY3RpdmVJbmRleCA9IHNoYWxsb3dSZWYoLTEpO1xuXHRpZiAoIXRhc2tzIHx8IHRhc2tzLmxlbmd0aCA9PT0gMCkge1xuXHRcdG9uRmluaXNoZWQoKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YWN0aXZlSW5kZXgsXG5cdFx0XHRyZXN1bHRcblx0XHR9O1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVJlc3VsdChzdGF0ZSwgcmVzKSB7XG5cdFx0YWN0aXZlSW5kZXgudmFsdWUrKztcblx0XHRyZXN1bHRbYWN0aXZlSW5kZXgudmFsdWVdLmRhdGEgPSByZXM7XG5cdFx0cmVzdWx0W2FjdGl2ZUluZGV4LnZhbHVlXS5zdGF0ZSA9IHN0YXRlO1xuXHR9XG5cdHRhc2tzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuXHRcdHJldHVybiBwcmV2LnRoZW4oKHByZXZSZXMpID0+IHtcblx0XHRcdHZhciBfcmVzdWx0JGFjdGl2ZUluZGV4JHY7XG5cdFx0XHRpZiAoc2lnbmFsID09PSBudWxsIHx8IHNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2lnbmFsLmFib3J0ZWQpIHtcblx0XHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5hYm9ydGVkLCAvKiBAX19QVVJFX18gKi8gbmV3IEVycm9yKFwiYWJvcnRlZFwiKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICgoKF9yZXN1bHQkYWN0aXZlSW5kZXgkdiA9IHJlc3VsdFthY3RpdmVJbmRleC52YWx1ZV0pID09PSBudWxsIHx8IF9yZXN1bHQkYWN0aXZlSW5kZXgkdiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Jlc3VsdCRhY3RpdmVJbmRleCR2LnN0YXRlKSA9PT0gcHJvbWlzZVN0YXRlLnJlamVjdGVkICYmIGludGVycnVwdCkge1xuXHRcdFx0XHRvbkZpbmlzaGVkKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGRvbmUgPSBjdXJyKHByZXZSZXMpLnRoZW4oKGN1cnJlbnRSZXMpID0+IHtcblx0XHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5mdWxmaWxsZWQsIGN1cnJlbnRSZXMpO1xuXHRcdFx0XHRpZiAoYWN0aXZlSW5kZXgudmFsdWUgPT09IHRhc2tzLmxlbmd0aCAtIDEpIG9uRmluaXNoZWQoKTtcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRSZXM7XG5cdFx0XHR9KTtcblx0XHRcdGlmICghc2lnbmFsKSByZXR1cm4gZG9uZTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJhY2UoW2RvbmUsIHdoZW5BYm9ydGVkKHNpZ25hbCldKTtcblx0XHR9KS5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0aWYgKHNpZ25hbCA9PT0gbnVsbCB8fCBzaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNpZ25hbC5hYm9ydGVkKSB7XG5cdFx0XHRcdHVwZGF0ZVJlc3VsdChwcm9taXNlU3RhdGUuYWJvcnRlZCwgZSk7XG5cdFx0XHRcdHJldHVybiBlO1xuXHRcdFx0fVxuXHRcdFx0dXBkYXRlUmVzdWx0KHByb21pc2VTdGF0ZS5yZWplY3RlZCwgZSk7XG5cdFx0XHRvbkVycm9yKCk7XG5cdFx0XHRpZiAoYWN0aXZlSW5kZXgudmFsdWUgPT09IHRhc2tzLmxlbmd0aCAtIDEpIG9uRmluaXNoZWQoKTtcblx0XHRcdHJldHVybiBlO1xuXHRcdH0pO1xuXHR9LCBQcm9taXNlLnJlc29sdmUoKSk7XG5cdHJldHVybiB7XG5cdFx0YWN0aXZlSW5kZXgsXG5cdFx0cmVzdWx0XG5cdH07XG59XG5mdW5jdGlvbiB3aGVuQWJvcnRlZChzaWduYWwpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBlcnJvciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJhYm9ydGVkXCIpO1xuXHRcdGlmIChzaWduYWwuYWJvcnRlZCkgcmVqZWN0KGVycm9yKTtcblx0XHRlbHNlIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gcmVqZWN0KGVycm9yKSwgeyBvbmNlOiB0cnVlIH0pO1xuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQXN5bmNTdGF0ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGFzeW5jIHN0YXRlLiBXaWxsIG5vdCBibG9jayB5b3VyIHNldHVwIGZ1bmN0aW9uIGFuZCB3aWxsIHRyaWdnZXIgY2hhbmdlcyBvbmNlXG4qIHRoZSBwcm9taXNlIGlzIHJlYWR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VBc3luY1N0YXRlXG4qIEBwYXJhbSBwcm9taXNlICAgICAgICAgVGhlIHByb21pc2UgLyBhc3luYyBmdW5jdGlvbiB0byBiZSByZXNvbHZlZFxuKiBAcGFyYW0gaW5pdGlhbFN0YXRlICAgIFRoZSBpbml0aWFsIHN0YXRlLCB1c2VkIHVudGlsIHRoZSBmaXJzdCBldmFsdWF0aW9uIGZpbmlzaGVzXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlQXN5bmNTdGF0ZShwcm9taXNlLCBpbml0aWFsU3RhdGUsIG9wdGlvbnMpIHtcblx0dmFyIF9nbG9iYWxUaGlzJHJlcG9ydEVycjtcblx0Y29uc3QgeyBpbW1lZGlhdGUgPSB0cnVlLCBkZWxheSA9IDAsIG9uRXJyb3IgPSAoX2dsb2JhbFRoaXMkcmVwb3J0RXJyID0gZ2xvYmFsVGhpcy5yZXBvcnRFcnJvcikgIT09IG51bGwgJiYgX2dsb2JhbFRoaXMkcmVwb3J0RXJyICE9PSB2b2lkIDAgPyBfZ2xvYmFsVGhpcyRyZXBvcnRFcnIgOiBub29wLCBvblN1Y2Nlc3MgPSBub29wLCByZXNldE9uRXhlY3V0ZSA9IHRydWUsIHNoYWxsb3cgPSB0cnVlLCB0aHJvd0Vycm9yIH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93ID8gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpIDogcmVmKGluaXRpYWxTdGF0ZSk7XG5cdGNvbnN0IGlzUmVhZHkgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNMb2FkaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRsZXQgZXhlY3V0aW9uc0NvdW50ID0gMDtcblx0YXN5bmMgZnVuY3Rpb24gZXhlY3V0ZShkZWxheSQxID0gMCwgLi4uYXJncykge1xuXHRcdGNvbnN0IGV4ZWN1dGlvbklkID0gZXhlY3V0aW9uc0NvdW50ICs9IDE7XG5cdFx0aWYgKHJlc2V0T25FeGVjdXRlKSBzdGF0ZS52YWx1ZSA9IHRvVmFsdWUoaW5pdGlhbFN0YXRlKTtcblx0XHRlcnJvci52YWx1ZSA9IHZvaWQgMDtcblx0XHRpc1JlYWR5LnZhbHVlID0gZmFsc2U7XG5cdFx0aXNMb2FkaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAoZGVsYXkkMSA+IDApIGF3YWl0IHByb21pc2VUaW1lb3V0KGRlbGF5JDEpO1xuXHRcdGNvbnN0IF9wcm9taXNlID0gdHlwZW9mIHByb21pc2UgPT09IFwiZnVuY3Rpb25cIiA/IHByb21pc2UoLi4uYXJncykgOiBwcm9taXNlO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgX3Byb21pc2U7XG5cdFx0XHRpZiAoZXhlY3V0aW9uSWQgPT09IGV4ZWN1dGlvbnNDb3VudCkge1xuXHRcdFx0XHRzdGF0ZS52YWx1ZSA9IGRhdGE7XG5cdFx0XHRcdGlzUmVhZHkudmFsdWUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0b25TdWNjZXNzKGRhdGEpO1xuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGV4ZWN1dGlvbklkID09PSBleGVjdXRpb25zQ291bnQpIGVycm9yLnZhbHVlID0gZTtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0XHRpZiAodGhyb3dFcnJvcikgdGhyb3cgZTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGV4ZWN1dGlvbklkID09PSBleGVjdXRpb25zQ291bnQpIGlzTG9hZGluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXHRpZiAoaW1tZWRpYXRlKSBleGVjdXRlKGRlbGF5KTtcblx0Y29uc3Qgc2hlbGwgPSB7XG5cdFx0c3RhdGUsXG5cdFx0aXNSZWFkeSxcblx0XHRpc0xvYWRpbmcsXG5cdFx0ZXJyb3IsXG5cdFx0ZXhlY3V0ZSxcblx0XHRleGVjdXRlSW1tZWRpYXRlOiAoLi4uYXJncykgPT4gZXhlY3V0ZSgwLCAuLi5hcmdzKVxuXHR9O1xuXHRmdW5jdGlvbiB3YWl0VW50aWxJc0xvYWRlZCgpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dW50aWwoaXNMb2FkaW5nKS50b0JlKGZhbHNlKS50aGVuKCgpID0+IHJlc29sdmUoc2hlbGwpKS5jYXRjaChyZWplY3QpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Li4uc2hlbGwsXG5cdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0cmV0dXJuIHdhaXRVbnRpbElzTG9hZGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCYXNlNjQvc2VyaWFsaXphdGlvbi50c1xuY29uc3QgZGVmYXVsdHMgPSB7XG5cdGFycmF5OiAodikgPT4gSlNPTi5zdHJpbmdpZnkodiksXG5cdG9iamVjdDogKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpLFxuXHRzZXQ6ICh2KSA9PiBKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHYpKSxcblx0bWFwOiAodikgPT4gSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmZyb21FbnRyaWVzKHYpKSxcblx0bnVsbDogKCkgPT4gXCJcIlxufTtcbmZ1bmN0aW9uIGdldERlZmF1bHRTZXJpYWxpemF0aW9uKHRhcmdldCkge1xuXHRpZiAoIXRhcmdldCkgcmV0dXJuIGRlZmF1bHRzLm51bGw7XG5cdGlmICh0YXJnZXQgaW5zdGFuY2VvZiBNYXApIHJldHVybiBkZWZhdWx0cy5tYXA7XG5cdGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIGRlZmF1bHRzLnNldDtcblx0ZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSByZXR1cm4gZGVmYXVsdHMuYXJyYXk7XG5cdGVsc2UgcmV0dXJuIGRlZmF1bHRzLm9iamVjdDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQmFzZTY0L2luZGV4LnRzXG5mdW5jdGlvbiB1c2VCYXNlNjQodGFyZ2V0LCBvcHRpb25zKSB7XG5cdGNvbnN0IGJhc2U2NCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IHByb21pc2UgPSBzaGFsbG93UmVmKCk7XG5cdGZ1bmN0aW9uIGV4ZWN1dGUoKSB7XG5cdFx0aWYgKCFpc0NsaWVudCkgcmV0dXJuO1xuXHRcdHByb21pc2UudmFsdWUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBfdGFyZ2V0ID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdFx0XHRpZiAoX3RhcmdldCA9PSBudWxsKSByZXNvbHZlKFwiXCIpO1xuXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgX3RhcmdldCA9PT0gXCJzdHJpbmdcIikgcmVzb2x2ZShibG9iVG9CYXNlNjQobmV3IEJsb2IoW190YXJnZXRdLCB7IHR5cGU6IFwidGV4dC9wbGFpblwiIH0pKSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBCbG9iKSByZXNvbHZlKGJsb2JUb0Jhc2U2NChfdGFyZ2V0KSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmVzb2x2ZSh3aW5kb3cuYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLm5ldyBVaW50OEFycmF5KF90YXJnZXQpKSkpO1xuXHRcdFx0XHRlbHNlIGlmIChfdGFyZ2V0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHJlc29sdmUoX3RhcmdldC50b0RhdGFVUkwob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnR5cGUsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5xdWFsaXR5KSk7XG5cdFx0XHRcdGVsc2UgaWYgKF90YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG5cdFx0XHRcdFx0Y29uc3QgaW1nID0gX3RhcmdldC5jbG9uZU5vZGUoZmFsc2UpO1xuXHRcdFx0XHRcdGltZy5jcm9zc09yaWdpbiA9IFwiQW5vbnltb3VzXCI7XG5cdFx0XHRcdFx0aW1nTG9hZGVkKGltZykudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuXHRcdFx0XHRcdFx0Y29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0XHRcdFx0XHRcdGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcblx0XHRcdFx0XHRcdGNhbnZhcy5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXHRcdFx0XHRcdFx0Y3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKGNhbnZhcy50b0RhdGFVUkwob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnR5cGUsIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5xdWFsaXR5KSk7XG5cdFx0XHRcdFx0fSkuY2F0Y2gocmVqZWN0KTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgX3RhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNlcmlhbGl6ZWQgPSAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zZXJpYWxpemVyKSB8fCBnZXREZWZhdWx0U2VyaWFsaXphdGlvbihfdGFyZ2V0KSkoX3RhcmdldCk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc29sdmUoYmxvYlRvQmFzZTY0KG5ldyBCbG9iKFtzZXJpYWxpemVkXSwgeyB0eXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KSkpO1xuXHRcdFx0XHR9IGVsc2UgcmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJ0YXJnZXQgaXMgdW5zdXBwb3J0ZWQgdHlwZXNcIikpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRwcm9taXNlLnZhbHVlLnRoZW4oKHJlcykgPT4ge1xuXHRcdFx0YmFzZTY0LnZhbHVlID0gKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5kYXRhVXJsKSA9PT0gZmFsc2UgPyByZXMucmVwbGFjZSgvXmRhdGE6Lio/O2Jhc2U2NCwvLCBcIlwiKSA6IHJlcztcblx0XHR9KTtcblx0XHRyZXR1cm4gcHJvbWlzZS52YWx1ZTtcblx0fVxuXHRpZiAoaXNSZWYodGFyZ2V0KSB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIpIHdhdGNoKHRhcmdldCwgZXhlY3V0ZSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdGVsc2UgZXhlY3V0ZSgpO1xuXHRyZXR1cm4ge1xuXHRcdGJhc2U2NCxcblx0XHRwcm9taXNlLFxuXHRcdGV4ZWN1dGVcblx0fTtcbn1cbmZ1bmN0aW9uIGltZ0xvYWRlZChpbWcpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRpZiAoIWltZy5jb21wbGV0ZSkge1xuXHRcdFx0aW1nLm9ubG9hZCA9ICgpID0+IHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fTtcblx0XHRcdGltZy5vbmVycm9yID0gcmVqZWN0O1xuXHRcdH0gZWxzZSByZXNvbHZlKCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gYmxvYlRvQmFzZTY0KGJsb2IpIHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cdFx0ZnIub25sb2FkID0gKGUpID0+IHtcblx0XHRcdHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcblx0XHR9O1xuXHRcdGZyLm9uZXJyb3IgPSByZWplY3Q7XG5cdFx0ZnIucmVhZEFzRGF0YVVSTChibG9iKTtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJhdHRlcnkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBCYXR0ZXJ5IFN0YXR1cyBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUJhdHRlcnlcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VCYXR0ZXJ5KG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBldmVudHMkMSA9IFtcblx0XHRcImNoYXJnaW5nY2hhbmdlXCIsXG5cdFx0XCJjaGFyZ2luZ3RpbWVjaGFuZ2VcIixcblx0XHRcImRpc2NoYXJnaW5ndGltZWNoYW5nZVwiLFxuXHRcdFwibGV2ZWxjaGFuZ2VcIlxuXHRdO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJnZXRCYXR0ZXJ5XCIgaW4gbmF2aWdhdG9yJDEgJiYgdHlwZW9mIG5hdmlnYXRvciQxLmdldEJhdHRlcnkgPT09IFwiZnVuY3Rpb25cIik7XG5cdGNvbnN0IGNoYXJnaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGNoYXJnaW5nVGltZSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGRpc2NoYXJnaW5nVGltZSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGxldmVsID0gc2hhbGxvd1JlZigxKTtcblx0bGV0IGJhdHRlcnk7XG5cdGZ1bmN0aW9uIHVwZGF0ZUJhdHRlcnlJbmZvKCkge1xuXHRcdGNoYXJnaW5nLnZhbHVlID0gdGhpcy5jaGFyZ2luZztcblx0XHRjaGFyZ2luZ1RpbWUudmFsdWUgPSB0aGlzLmNoYXJnaW5nVGltZSB8fCAwO1xuXHRcdGRpc2NoYXJnaW5nVGltZS52YWx1ZSA9IHRoaXMuZGlzY2hhcmdpbmdUaW1lIHx8IDA7XG5cdFx0bGV2ZWwudmFsdWUgPSB0aGlzLmxldmVsO1xuXHR9XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgbmF2aWdhdG9yJDEuZ2V0QmF0dGVyeSgpLnRoZW4oKF9iYXR0ZXJ5KSA9PiB7XG5cdFx0YmF0dGVyeSA9IF9iYXR0ZXJ5O1xuXHRcdHVwZGF0ZUJhdHRlcnlJbmZvLmNhbGwoYmF0dGVyeSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihiYXR0ZXJ5LCBldmVudHMkMSwgdXBkYXRlQmF0dGVyeUluZm8sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0Y2hhcmdpbmcsXG5cdFx0Y2hhcmdpbmdUaW1lLFxuXHRcdGRpc2NoYXJnaW5nVGltZSxcblx0XHRsZXZlbFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCbHVldG9vdGgvaW5kZXgudHNcbi8qIEBfX05PX1NJREVfRUZGRUNUU19fICovXG5mdW5jdGlvbiB1c2VCbHVldG9vdGgob3B0aW9ucykge1xuXHRsZXQgeyBhY2NlcHRBbGxEZXZpY2VzID0gZmFsc2UgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IHsgZmlsdGVycyA9IHZvaWQgMCwgb3B0aW9uYWxTZXJ2aWNlcyA9IHZvaWQgMCwgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImJsdWV0b290aFwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgZGV2aWNlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdHdhdGNoKGRldmljZSwgKCkgPT4ge1xuXHRcdGNvbm5lY3RUb0JsdWV0b290aEdBVFRTZXJ2ZXIoKTtcblx0fSk7XG5cdGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3REZXZpY2UoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmxlbmd0aCA+IDApIGFjY2VwdEFsbERldmljZXMgPSBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0ZGV2aWNlLnZhbHVlID0gYXdhaXQgKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5ibHVldG9vdGgucmVxdWVzdERldmljZSh7XG5cdFx0XHRcdGFjY2VwdEFsbERldmljZXMsXG5cdFx0XHRcdGZpbHRlcnMsXG5cdFx0XHRcdG9wdGlvbmFsU2VydmljZXNcblx0XHRcdH0pKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGVycm9yLnZhbHVlID0gZXJyO1xuXHRcdH1cblx0fVxuXHRjb25zdCBzZXJ2ZXIgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IGlzQ29ubmVjdGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdGlzQ29ubmVjdGVkLnZhbHVlID0gZmFsc2U7XG5cdFx0ZGV2aWNlLnZhbHVlID0gdm9pZCAwO1xuXHRcdHNlcnZlci52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9CbHVldG9vdGhHQVRUU2VydmVyKCkge1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRpZiAoZGV2aWNlLnZhbHVlICYmIGRldmljZS52YWx1ZS5nYXR0KSB7XG5cdFx0XHR1c2VFdmVudExpc3RlbmVyKGRldmljZSwgXCJnYXR0c2VydmVyZGlzY29ubmVjdGVkXCIsIHJlc2V0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzZXJ2ZXIudmFsdWUgPSBhd2FpdCBkZXZpY2UudmFsdWUuZ2F0dC5jb25uZWN0KCk7XG5cdFx0XHRcdGlzQ29ubmVjdGVkLnZhbHVlID0gc2VydmVyLnZhbHVlLmNvbm5lY3RlZDtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRlcnJvci52YWx1ZSA9IGVycjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR2YXIgX2RldmljZSR2YWx1ZSRnYXR0O1xuXHRcdGlmIChkZXZpY2UudmFsdWUpIChfZGV2aWNlJHZhbHVlJGdhdHQgPSBkZXZpY2UudmFsdWUuZ2F0dCkgPT09IG51bGwgfHwgX2RldmljZSR2YWx1ZSRnYXR0ID09PSB2b2lkIDAgfHwgX2RldmljZSR2YWx1ZSRnYXR0LmNvbm5lY3QoKTtcblx0fSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHR2YXIgX2RldmljZSR2YWx1ZSRnYXR0Mjtcblx0XHRpZiAoZGV2aWNlLnZhbHVlKSAoX2RldmljZSR2YWx1ZSRnYXR0MiA9IGRldmljZS52YWx1ZS5nYXR0KSA9PT0gbnVsbCB8fCBfZGV2aWNlJHZhbHVlJGdhdHQyID09PSB2b2lkIDAgfHwgX2RldmljZSR2YWx1ZSRnYXR0Mi5kaXNjb25uZWN0KCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzQ29ubmVjdGVkOiByZWFkb25seShpc0Nvbm5lY3RlZCksXG5cdFx0ZGV2aWNlLFxuXHRcdHJlcXVlc3REZXZpY2UsXG5cdFx0c2VydmVyLFxuXHRcdGVycm9yXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNTUldpZHRoL2luZGV4LnRzXG5jb25zdCBzc3JXaWR0aFN5bWJvbCA9IFN5bWJvbChcInZ1ZXVzZS1zc3Itd2lkdGhcIik7XG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlU1NSV2lkdGgoKSB7XG5cdGNvbnN0IHNzcldpZHRoID0gaGFzSW5qZWN0aW9uQ29udGV4dCgpID8gaW5qZWN0TG9jYWwoc3NyV2lkdGhTeW1ib2wsIG51bGwpIDogbnVsbDtcblx0cmV0dXJuIHR5cGVvZiBzc3JXaWR0aCA9PT0gXCJudW1iZXJcIiA/IHNzcldpZHRoIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gcHJvdmlkZVNTUldpZHRoKHdpZHRoLCBhcHApIHtcblx0aWYgKGFwcCAhPT0gdm9pZCAwKSBhcHAucHJvdmlkZShzc3JXaWR0aFN5bWJvbCwgd2lkdGgpO1xuXHRlbHNlIHByb3ZpZGVMb2NhbChzc3JXaWR0aFN5bWJvbCwgd2lkdGgpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNZWRpYVF1ZXJ5L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgTWVkaWEgUXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1lZGlhUXVlcnlcbiogQHBhcmFtIHF1ZXJ5XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTWVkaWFRdWVyeShxdWVyeSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHNzcldpZHRoID0gLyogQF9fUFVSRV9fICovIHVzZVNTUldpZHRoKCkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIm1hdGNoTWVkaWFcIiBpbiB3aW5kb3ckMSAmJiB0eXBlb2Ygd2luZG93JDEubWF0Y2hNZWRpYSA9PT0gXCJmdW5jdGlvblwiKTtcblx0Y29uc3Qgc3NyU3VwcG9ydCA9IHNoYWxsb3dSZWYodHlwZW9mIHNzcldpZHRoID09PSBcIm51bWJlclwiKTtcblx0Y29uc3QgbWVkaWFRdWVyeSA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgbWF0Y2hlcyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0bWF0Y2hlcy52YWx1ZSA9IGV2ZW50Lm1hdGNoZXM7XG5cdH07XG5cdHdhdGNoRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoc3NyU3VwcG9ydC52YWx1ZSkge1xuXHRcdFx0c3NyU3VwcG9ydC52YWx1ZSA9ICFpc1N1cHBvcnRlZC52YWx1ZTtcblx0XHRcdG1hdGNoZXMudmFsdWUgPSB0b1ZhbHVlKHF1ZXJ5KS5zcGxpdChcIixcIikuc29tZSgocXVlcnlTdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgbm90ID0gcXVlcnlTdHJpbmcuaW5jbHVkZXMoXCJub3QgYWxsXCIpO1xuXHRcdFx0XHRjb25zdCBtaW5XaWR0aCA9IHF1ZXJ5U3RyaW5nLm1hdGNoKC9cXChcXHMqbWluLXdpZHRoOlxccyooLT9cXGQrKD86XFwuXFxkKik/W2Etel0rXFxzKilcXCkvKTtcblx0XHRcdFx0Y29uc3QgbWF4V2lkdGggPSBxdWVyeVN0cmluZy5tYXRjaCgvXFwoXFxzKm1heC13aWR0aDpcXHMqKC0/XFxkKyg/OlxcLlxcZCopP1thLXpdK1xccyopXFwpLyk7XG5cdFx0XHRcdGxldCByZXMgPSBCb29sZWFuKG1pbldpZHRoIHx8IG1heFdpZHRoKTtcblx0XHRcdFx0aWYgKG1pbldpZHRoICYmIHJlcykgcmVzID0gc3NyV2lkdGggPj0gcHhWYWx1ZShtaW5XaWR0aFsxXSk7XG5cdFx0XHRcdGlmIChtYXhXaWR0aCAmJiByZXMpIHJlcyA9IHNzcldpZHRoIDw9IHB4VmFsdWUobWF4V2lkdGhbMV0pO1xuXHRcdFx0XHRyZXR1cm4gbm90ID8gIXJlcyA6IHJlcztcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0bWVkaWFRdWVyeS52YWx1ZSA9IHdpbmRvdyQxLm1hdGNoTWVkaWEodG9WYWx1ZShxdWVyeSkpO1xuXHRcdG1hdGNoZXMudmFsdWUgPSBtZWRpYVF1ZXJ5LnZhbHVlLm1hdGNoZXM7XG5cdH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKG1lZGlhUXVlcnksIFwiY2hhbmdlXCIsIGhhbmRsZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IG1hdGNoZXMudmFsdWUpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCcmVha3BvaW50cy9icmVha3BvaW50cy50c1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gVGFpbHdpbmQgVjJcbipcbiogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2JyZWFrcG9pbnRzXG4qL1xuY29uc3QgYnJlYWtwb2ludHNUYWlsd2luZCA9IHtcblx0XCJzbVwiOiA2NDAsXG5cdFwibWRcIjogNzY4LFxuXHRcImxnXCI6IDEwMjQsXG5cdFwieGxcIjogMTI4MCxcblx0XCIyeGxcIjogMTUzNlxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIEJvb3RzdHJhcCBWNVxuKlxuKiBAc2VlIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzUuMC9sYXlvdXQvYnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c0Jvb3RzdHJhcFY1ID0ge1xuXHR4czogMCxcblx0c206IDU3Nixcblx0bWQ6IDc2OCxcblx0bGc6IDk5Mixcblx0eGw6IDEyMDAsXG5cdHh4bDogMTQwMFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIFZ1ZXRpZnkgVjJcbipcbiogQHNlZSBodHRwczovL3YyLnZ1ZXRpZnlqcy5jb20vZW4vZmVhdHVyZXMvYnJlYWtwb2ludHMvXG4qL1xuY29uc3QgYnJlYWtwb2ludHNWdWV0aWZ5VjIgPSB7XG5cdHhzOiAwLFxuXHRzbTogNjAwLFxuXHRtZDogOTYwLFxuXHRsZzogMTI2NCxcblx0eGw6IDE5MDRcbn07XG4vKipcbiogQnJlYWtwb2ludHMgZnJvbSBWdWV0aWZ5IFYzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV0aWZ5anMuY29tL2VuL3N0eWxlcy9mbG9hdC8jb3ZlcnZpZXdcbiovXG5jb25zdCBicmVha3BvaW50c1Z1ZXRpZnlWMyA9IHtcblx0eHM6IDAsXG5cdHNtOiA2MDAsXG5cdG1kOiA5NjAsXG5cdGxnOiAxMjgwLFxuXHR4bDogMTkyMCxcblx0eHhsOiAyNTYwXG59O1xuLyoqXG4qIEFsaWFzIHRvIGBicmVha3BvaW50c1Z1ZXRpZnlWMmBcbipcbiogQGRlcHJlY2F0ZWQgZXhwbGljdGx5IHVzZSBgYnJlYWtwb2ludHNWdWV0aWZ5VjJgIG9yIGBicmVha3BvaW50c1Z1ZXRpZnlWM2AgaW5zdGVhZFxuKi9cbmNvbnN0IGJyZWFrcG9pbnRzVnVldGlmeSA9IGJyZWFrcG9pbnRzVnVldGlmeVYyO1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gQW50IERlc2lnblxuKlxuKiBAc2VlIGh0dHBzOi8vYW50LmRlc2lnbi9jb21wb25lbnRzL2xheW91dC8jYnJlYWtwb2ludC13aWR0aFxuKi9cbmNvbnN0IGJyZWFrcG9pbnRzQW50RGVzaWduID0ge1xuXHR4czogNDgwLFxuXHRzbTogNTc2LFxuXHRtZDogNzY4LFxuXHRsZzogOTkyLFxuXHR4bDogMTIwMCxcblx0eHhsOiAxNjAwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gUXVhc2FyIFYyXG4qXG4qIEBzZWUgaHR0cHM6Ly9xdWFzYXIuZGV2L3N0eWxlL2JyZWFrcG9pbnRzXG4qL1xuY29uc3QgYnJlYWtwb2ludHNRdWFzYXIgPSB7XG5cdHhzOiAwLFxuXHRzbTogNjAwLFxuXHRtZDogMTAyNCxcblx0bGc6IDE0NDAsXG5cdHhsOiAxOTIwXG59O1xuLyoqXG4qIFNlbWF0aWMgQnJlYWtwb2ludHNcbiovXG5jb25zdCBicmVha3BvaW50c1NlbWF0aWMgPSB7XG5cdG1vYmlsZVM6IDMyMCxcblx0bW9iaWxlTTogMzc1LFxuXHRtb2JpbGVMOiA0MjUsXG5cdHRhYmxldDogNzY4LFxuXHRsYXB0b3A6IDEwMjQsXG5cdGxhcHRvcEw6IDE0NDAsXG5cdGRlc2t0b3A0SzogMjU2MFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIE1hc3RlciBDU1NcbipcbiogQHNlZSBodHRwczovL2RvY3MubWFzdGVyLmNvL2Nzcy9icmVha3BvaW50c1xuKi9cbmNvbnN0IGJyZWFrcG9pbnRzTWFzdGVyQ3NzID0ge1xuXHRcIjN4c1wiOiAzNjAsXG5cdFwiMnhzXCI6IDQ4MCxcblx0XCJ4c1wiOiA2MDAsXG5cdFwic21cIjogNzY4LFxuXHRcIm1kXCI6IDEwMjQsXG5cdFwibGdcIjogMTI4MCxcblx0XCJ4bFwiOiAxNDQwLFxuXHRcIjJ4bFwiOiAxNjAwLFxuXHRcIjN4bFwiOiAxOTIwLFxuXHRcIjR4bFwiOiAyNTYwXG59O1xuLyoqXG4qIEJyZWFrcG9pbnRzIGZyb20gUHJpbWVGbGV4XG4qXG4qIEBzZWUgaHR0cHM6Ly9wcmltZWZsZXgub3JnL2luc3RhbGxhdGlvblxuKi9cbmNvbnN0IGJyZWFrcG9pbnRzUHJpbWVGbGV4ID0ge1xuXHRzbTogNTc2LFxuXHRtZDogNzY4LFxuXHRsZzogOTkyLFxuXHR4bDogMTIwMFxufTtcbi8qKlxuKiBCcmVha3BvaW50cyBmcm9tIEVsZW1lbnRVSS9FbGVtZW50UGx1c1xuKlxuKiBAc2VlIGh0dHBzOi8vZWxlbWVudC5lbGVtZS5pby8jL2VuLVVTL2NvbXBvbmVudC9sYXlvdXRcbiogQHNlZSBodHRwczovL2VsZW1lbnQtcGx1cy5vcmcvZW4tVVMvY29tcG9uZW50L2xheW91dC5odG1sXG4qL1xuY29uc3QgYnJlYWtwb2ludHNFbGVtZW50ID0ge1xuXHR4czogMCxcblx0c206IDc2OCxcblx0bWQ6IDk5Mixcblx0bGc6IDEyMDAsXG5cdHhsOiAxOTIwXG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VCcmVha3BvaW50cy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgdmlld3BvcnQgYnJlYWtwb2ludHNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQnJlYWtwb2ludHNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VCcmVha3BvaW50cyhicmVha3BvaW50cywgb3B0aW9ucyA9IHt9KSB7XG5cdGZ1bmN0aW9uIGdldFZhbHVlJDEoaywgZGVsdGEpIHtcblx0XHRsZXQgdiA9IHRvVmFsdWUoYnJlYWtwb2ludHNbdG9WYWx1ZShrKV0pO1xuXHRcdGlmIChkZWx0YSAhPSBudWxsKSB2ID0gaW5jcmVhc2VXaXRoVW5pdCh2LCBkZWx0YSk7XG5cdFx0aWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSB2ID0gYCR7dn1weGA7XG5cdFx0cmV0dXJuIHY7XG5cdH1cblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgc3RyYXRlZ3kgPSBcIm1pbi13aWR0aFwiLCBzc3JXaWR0aCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTU1JXaWR0aCgpIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzc3JTdXBwb3J0ID0gdHlwZW9mIHNzcldpZHRoID09PSBcIm51bWJlclwiO1xuXHRjb25zdCBtb3VudGVkID0gc3NyU3VwcG9ydCA/IHNoYWxsb3dSZWYoZmFsc2UpIDogeyB2YWx1ZTogdHJ1ZSB9O1xuXHRpZiAoc3NyU3VwcG9ydCkgdHJ5T25Nb3VudGVkKCgpID0+IG1vdW50ZWQudmFsdWUgPSAhIXdpbmRvdyQxKTtcblx0ZnVuY3Rpb24gbWF0Y2gocXVlcnksIHNpemUpIHtcblx0XHRpZiAoIW1vdW50ZWQudmFsdWUgJiYgc3NyU3VwcG9ydCkgcmV0dXJuIHF1ZXJ5ID09PSBcIm1pblwiID8gc3NyV2lkdGggPj0gcHhWYWx1ZShzaXplKSA6IHNzcldpZHRoIDw9IHB4VmFsdWUoc2l6ZSk7XG5cdFx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiB3aW5kb3ckMS5tYXRjaE1lZGlhKGAoJHtxdWVyeX0td2lkdGg6ICR7c2l6ZX0pYCkubWF0Y2hlcztcblx0fVxuXHRjb25zdCBncmVhdGVyT3JFcXVhbCA9IChrKSA9PiB7XG5cdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUkMShrKX0pYCwgb3B0aW9ucyk7XG5cdH07XG5cdGNvbnN0IHNtYWxsZXJPckVxdWFsID0gKGspID0+IHtcblx0XHRyZXR1cm4gdXNlTWVkaWFRdWVyeSgoKSA9PiBgKG1heC13aWR0aDogJHtnZXRWYWx1ZSQxKGspfSlgLCBvcHRpb25zKTtcblx0fTtcblx0Y29uc3Qgc2hvcnRjdXRNZXRob2RzID0gT2JqZWN0LmtleXMoYnJlYWtwb2ludHMpLnJlZHVjZSgoc2hvcnRjdXRzLCBrKSA9PiB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHNob3J0Y3V0cywgaywge1xuXHRcdFx0Z2V0OiAoKSA9PiBzdHJhdGVneSA9PT0gXCJtaW4td2lkdGhcIiA/IGdyZWF0ZXJPckVxdWFsKGspIDogc21hbGxlck9yRXF1YWwoayksXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHNob3J0Y3V0cztcblx0fSwge30pO1xuXHRmdW5jdGlvbiBjdXJyZW50KCkge1xuXHRcdGNvbnN0IHBvaW50cyA9IE9iamVjdC5rZXlzKGJyZWFrcG9pbnRzKS5tYXAoKGspID0+IFtcblx0XHRcdGssXG5cdFx0XHRzaG9ydGN1dE1ldGhvZHNba10sXG5cdFx0XHRweFZhbHVlKGdldFZhbHVlJDEoaykpXG5cdFx0XSkuc29ydCgoYSwgYikgPT4gYVsyXSAtIGJbMl0pO1xuXHRcdHJldHVybiBjb21wdXRlZCgoKSA9PiBwb2ludHMuZmlsdGVyKChbLCB2XSkgPT4gdi52YWx1ZSkubWFwKChba10pID0+IGspKTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihzaG9ydGN1dE1ldGhvZHMsIHtcblx0XHRncmVhdGVyT3JFcXVhbCxcblx0XHRzbWFsbGVyT3JFcXVhbCxcblx0XHRncmVhdGVyKGspIHtcblx0XHRcdHJldHVybiB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAobWluLXdpZHRoOiAke2dldFZhbHVlJDEoaywgLjEpfSlgLCBvcHRpb25zKTtcblx0XHR9LFxuXHRcdHNtYWxsZXIoaykge1xuXHRcdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtYXgtd2lkdGg6ICR7Z2V0VmFsdWUkMShrLCAtLjEpfSlgLCBvcHRpb25zKTtcblx0XHR9LFxuXHRcdGJldHdlZW4oYSwgYikge1xuXHRcdFx0cmV0dXJuIHVzZU1lZGlhUXVlcnkoKCkgPT4gYChtaW4td2lkdGg6ICR7Z2V0VmFsdWUkMShhKX0pIGFuZCAobWF4LXdpZHRoOiAke2dldFZhbHVlJDEoYiwgLS4xKX0pYCwgb3B0aW9ucyk7XG5cdFx0fSxcblx0XHRpc0dyZWF0ZXIoaykge1xuXHRcdFx0cmV0dXJuIG1hdGNoKFwibWluXCIsIGdldFZhbHVlJDEoaywgLjEpKTtcblx0XHR9LFxuXHRcdGlzR3JlYXRlck9yRXF1YWwoaykge1xuXHRcdFx0cmV0dXJuIG1hdGNoKFwibWluXCIsIGdldFZhbHVlJDEoaykpO1xuXHRcdH0sXG5cdFx0aXNTbWFsbGVyKGspIHtcblx0XHRcdHJldHVybiBtYXRjaChcIm1heFwiLCBnZXRWYWx1ZSQxKGssIC0uMSkpO1xuXHRcdH0sXG5cdFx0aXNTbWFsbGVyT3JFcXVhbChrKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtYXhcIiwgZ2V0VmFsdWUkMShrKSk7XG5cdFx0fSxcblx0XHRpc0luQmV0d2VlbihhLCBiKSB7XG5cdFx0XHRyZXR1cm4gbWF0Y2goXCJtaW5cIiwgZ2V0VmFsdWUkMShhKSkgJiYgbWF0Y2goXCJtYXhcIiwgZ2V0VmFsdWUkMShiLCAtLjEpKTtcblx0XHR9LFxuXHRcdGN1cnJlbnQsXG5cdFx0YWN0aXZlKCkge1xuXHRcdFx0Y29uc3QgYnBzID0gY3VycmVudCgpO1xuXHRcdFx0cmV0dXJuIGNvbXB1dGVkKCgpID0+IGJwcy52YWx1ZS5sZW5ndGggPT09IDAgPyBcIlwiIDogYnBzLnZhbHVlLmF0KHN0cmF0ZWd5ID09PSBcIm1pbi13aWR0aFwiID8gLTEgOiAwKSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQnJvYWRjYXN0Q2hhbm5lbC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIEJyb2FkY2FzdENoYW5uZWxcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQnJvYWRjYXN0Q2hhbm5lbFxuKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ccm9hZGNhc3RDaGFubmVsXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qL1xuZnVuY3Rpb24gdXNlQnJvYWRjYXN0Q2hhbm5lbChvcHRpb25zKSB7XG5cdGNvbnN0IHsgbmFtZSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIkJyb2FkY2FzdENoYW5uZWxcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IGlzQ2xvc2VkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGNoYW5uZWwgPSByZWYoKTtcblx0Y29uc3QgZGF0YSA9IHJlZigpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHBvc3QgPSAoZGF0YSQxKSA9PiB7XG5cdFx0aWYgKGNoYW5uZWwudmFsdWUpIGNoYW5uZWwudmFsdWUucG9zdE1lc3NhZ2UoZGF0YSQxKTtcblx0fTtcblx0Y29uc3QgY2xvc2UgPSAoKSA9PiB7XG5cdFx0aWYgKGNoYW5uZWwudmFsdWUpIGNoYW5uZWwudmFsdWUuY2xvc2UoKTtcblx0XHRpc0Nsb3NlZC52YWx1ZSA9IHRydWU7XG5cdH07XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgdHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHRlcnJvci52YWx1ZSA9IG51bGw7XG5cdFx0Y2hhbm5lbC52YWx1ZSA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKG5hbWUpO1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoY2hhbm5lbCwgXCJtZXNzYWdlXCIsIChlKSA9PiB7XG5cdFx0XHRkYXRhLnZhbHVlID0gZS5kYXRhO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihjaGFubmVsLCBcIm1lc3NhZ2VlcnJvclwiLCAoZSkgPT4ge1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBlO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihjaGFubmVsLCBcImNsb3NlXCIsICgpID0+IHtcblx0XHRcdGlzQ2xvc2VkLnZhbHVlID0gdHJ1ZTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdGNsb3NlKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGNoYW5uZWwsXG5cdFx0ZGF0YSxcblx0XHRwb3N0LFxuXHRcdGNsb3NlLFxuXHRcdGVycm9yLFxuXHRcdGlzQ2xvc2VkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUJyb3dzZXJMb2NhdGlvbi9pbmRleC50c1xuY29uc3QgV1JJVEFCTEVfUFJPUEVSVElFUyA9IFtcblx0XCJoYXNoXCIsXG5cdFwiaG9zdFwiLFxuXHRcImhvc3RuYW1lXCIsXG5cdFwiaHJlZlwiLFxuXHRcInBhdGhuYW1lXCIsXG5cdFwicG9ydFwiLFxuXHRcInByb3RvY29sXCIsXG5cdFwic2VhcmNoXCJcbl07XG4vKipcbiogUmVhY3RpdmUgYnJvd3NlciBsb2NhdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQnJvd3NlckxvY2F0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQnJvd3NlckxvY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCByZWZzID0gT2JqZWN0LmZyb21FbnRyaWVzKFdSSVRBQkxFX1BST1BFUlRJRVMubWFwKChrZXkpID0+IFtrZXksIHJlZigpXSkpO1xuXHRmb3IgKGNvbnN0IFtrZXksIHJlZiQxXSBvZiBvYmplY3RFbnRyaWVzKHJlZnMpKSB3YXRjaChyZWYkMSwgKHZhbHVlKSA9PiB7XG5cdFx0aWYgKCEod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLmxvY2F0aW9uKSB8fCB3aW5kb3ckMS5sb2NhdGlvbltrZXldID09PSB2YWx1ZSkgcmV0dXJuO1xuXHRcdHdpbmRvdyQxLmxvY2F0aW9uW2tleV0gPSB2YWx1ZTtcblx0fSk7XG5cdGNvbnN0IGJ1aWxkU3RhdGUgPSAodHJpZ2dlcikgPT4ge1xuXHRcdHZhciBfd2luZG93JGxvY2F0aW9uO1xuXHRcdGNvbnN0IHsgc3RhdGU6IHN0YXRlJDEsIGxlbmd0aCB9ID0gKHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5oaXN0b3J5KSB8fCB7fTtcblx0XHRjb25zdCB7IG9yaWdpbiB9ID0gKHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5sb2NhdGlvbikgfHwge307XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgV1JJVEFCTEVfUFJPUEVSVElFUykgcmVmc1trZXldLnZhbHVlID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCB8fCAoX3dpbmRvdyRsb2NhdGlvbiA9IHdpbmRvdyQxLmxvY2F0aW9uKSA9PT0gbnVsbCB8fCBfd2luZG93JGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGxvY2F0aW9uW2tleV07XG5cdFx0cmV0dXJuIHJlYWN0aXZlKHtcblx0XHRcdHRyaWdnZXIsXG5cdFx0XHRzdGF0ZTogc3RhdGUkMSxcblx0XHRcdGxlbmd0aCxcblx0XHRcdG9yaWdpbixcblx0XHRcdC4uLnJlZnNcblx0XHR9KTtcblx0fTtcblx0Y29uc3Qgc3RhdGUgPSByZWYoYnVpbGRTdGF0ZShcImxvYWRcIikpO1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInBvcHN0YXRlXCIsICgpID0+IHN0YXRlLnZhbHVlID0gYnVpbGRTdGF0ZShcInBvcHN0YXRlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiaGFzaGNoYW5nZVwiLCAoKSA9PiBzdGF0ZS52YWx1ZSA9IGJ1aWxkU3RhdGUoXCJoYXNoY2hhbmdlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ2FjaGVkL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDYWNoZWQocmVmVmFsdWUsIGNvbXBhcmF0b3IgPSAoYSwgYikgPT4gYSA9PT0gYiwgb3B0aW9ucykge1xuXHRjb25zdCB7IGRlZXBSZWZzID0gdHJ1ZSwuLi53YXRjaE9wdGlvbnMgfSA9IG9wdGlvbnMgfHwge307XG5cdGNvbnN0IGNhY2hlZFZhbHVlID0gY3JlYXRlUmVmKHJlZlZhbHVlLnZhbHVlLCBkZWVwUmVmcyk7XG5cdHdhdGNoKCgpID0+IHJlZlZhbHVlLnZhbHVlLCAodmFsdWUpID0+IHtcblx0XHRpZiAoIWNvbXBhcmF0b3IodmFsdWUsIGNhY2hlZFZhbHVlLnZhbHVlKSkgY2FjaGVkVmFsdWUudmFsdWUgPSB2YWx1ZTtcblx0fSwgd2F0Y2hPcHRpb25zKTtcblx0cmV0dXJuIGNhY2hlZFZhbHVlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQZXJtaXNzaW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgUGVybWlzc2lvbnMgQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQZXJtaXNzaW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlUGVybWlzc2lvbihwZXJtaXNzaW9uRGVzYywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgY29udHJvbHMgPSBmYWxzZSwgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcInBlcm1pc3Npb25zXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBwZXJtaXNzaW9uU3RhdHVzID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBkZXNjID0gdHlwZW9mIHBlcm1pc3Npb25EZXNjID09PSBcInN0cmluZ1wiID8geyBuYW1lOiBwZXJtaXNzaW9uRGVzYyB9IDogcGVybWlzc2lvbkRlc2M7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG5cdFx0dmFyIF9wZXJtaXNzaW9uU3RhdHVzJHZhbCwgX3Blcm1pc3Npb25TdGF0dXMkdmFsMjtcblx0XHRzdGF0ZS52YWx1ZSA9IChfcGVybWlzc2lvblN0YXR1cyR2YWwgPSAoX3Blcm1pc3Npb25TdGF0dXMkdmFsMiA9IHBlcm1pc3Npb25TdGF0dXMudmFsdWUpID09PSBudWxsIHx8IF9wZXJtaXNzaW9uU3RhdHVzJHZhbDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9wZXJtaXNzaW9uU3RhdHVzJHZhbDIuc3RhdGUpICE9PSBudWxsICYmIF9wZXJtaXNzaW9uU3RhdHVzJHZhbCAhPT0gdm9pZCAwID8gX3Blcm1pc3Npb25TdGF0dXMkdmFsIDogXCJwcm9tcHRcIjtcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcihwZXJtaXNzaW9uU3RhdHVzLCBcImNoYW5nZVwiLCB1cGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0Y29uc3QgcXVlcnkgPSBjcmVhdGVTaW5nbGV0b25Qcm9taXNlKGFzeW5jICgpID0+IHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCFwZXJtaXNzaW9uU3RhdHVzLnZhbHVlKSB0cnkge1xuXHRcdFx0cGVybWlzc2lvblN0YXR1cy52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvciQxLnBlcm1pc3Npb25zLnF1ZXJ5KGRlc2MpO1xuXHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdHBlcm1pc3Npb25TdGF0dXMudmFsdWUgPSB2b2lkIDA7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHVwZGF0ZSgpO1xuXHRcdH1cblx0XHRpZiAoY29udHJvbHMpIHJldHVybiB0b1JhdyhwZXJtaXNzaW9uU3RhdHVzLnZhbHVlKTtcblx0fSk7XG5cdHF1ZXJ5KCk7XG5cdGlmIChjb250cm9scykgcmV0dXJuIHtcblx0XHRzdGF0ZSxcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRxdWVyeVxuXHR9O1xuXHRlbHNlIHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ2xpcGJvYXJkL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VDbGlwYm9hcmQob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIHJlYWQgPSBmYWxzZSwgc291cmNlLCBjb3BpZWREdXJpbmcgPSAxNTAwLCBsZWdhY3kgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNDbGlwYm9hcmRBcGlTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiY2xpcGJvYXJkXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBwZXJtaXNzaW9uUmVhZCA9IHVzZVBlcm1pc3Npb24oXCJjbGlwYm9hcmQtcmVhZFwiKTtcblx0Y29uc3QgcGVybWlzc2lvbldyaXRlID0gdXNlUGVybWlzc2lvbihcImNsaXBib2FyZC13cml0ZVwiKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSBjb21wdXRlZCgoKSA9PiBpc0NsaXBib2FyZEFwaVN1cHBvcnRlZC52YWx1ZSB8fCBsZWdhY3kpO1xuXHRjb25zdCB0ZXh0ID0gc2hhbGxvd1JlZihcIlwiKTtcblx0Y29uc3QgY29waWVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHRpbWVvdXQgPSB1c2VUaW1lb3V0Rm4oKCkgPT4gY29waWVkLnZhbHVlID0gZmFsc2UsIGNvcGllZER1cmluZywgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xuXHRhc3luYyBmdW5jdGlvbiB1cGRhdGVUZXh0KCkge1xuXHRcdGxldCB1c2VMZWdhY3kgPSAhKGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlICYmIGlzQWxsb3dlZChwZXJtaXNzaW9uUmVhZC52YWx1ZSkpO1xuXHRcdGlmICghdXNlTGVnYWN5KSB0cnkge1xuXHRcdFx0dGV4dC52YWx1ZSA9IGF3YWl0IG5hdmlnYXRvciQxLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuXHRcdH0gY2F0Y2ggKF91bnVzZWQpIHtcblx0XHRcdHVzZUxlZ2FjeSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmICh1c2VMZWdhY3kpIHRleHQudmFsdWUgPSBsZWdhY3lSZWFkKCk7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHJlYWQpIHVzZUV2ZW50TGlzdGVuZXIoW1wiY29weVwiLCBcImN1dFwiXSwgdXBkYXRlVGV4dCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRhc3luYyBmdW5jdGlvbiBjb3B5KHZhbHVlID0gdG9WYWx1ZShzb3VyY2UpKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGxldCB1c2VMZWdhY3kgPSAhKGlzQ2xpcGJvYXJkQXBpU3VwcG9ydGVkLnZhbHVlICYmIGlzQWxsb3dlZChwZXJtaXNzaW9uV3JpdGUudmFsdWUpKTtcblx0XHRcdGlmICghdXNlTGVnYWN5KSB0cnkge1xuXHRcdFx0XHRhd2FpdCBuYXZpZ2F0b3IkMS5jbGlwYm9hcmQud3JpdGVUZXh0KHZhbHVlKTtcblx0XHRcdH0gY2F0Y2ggKF91bnVzZWQyKSB7XG5cdFx0XHRcdHVzZUxlZ2FjeSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAodXNlTGVnYWN5KSBsZWdhY3lDb3B5KHZhbHVlKTtcblx0XHRcdHRleHQudmFsdWUgPSB2YWx1ZTtcblx0XHRcdGNvcGllZC52YWx1ZSA9IHRydWU7XG5cdFx0XHR0aW1lb3V0LnN0YXJ0KCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIGxlZ2FjeUNvcHkodmFsdWUpIHtcblx0XHRjb25zdCB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcblx0XHR0YS52YWx1ZSA9IHZhbHVlO1xuXHRcdHRhLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHRcdHRhLnN0eWxlLm9wYWNpdHkgPSBcIjBcIjtcblx0XHR0YS5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLCBcIlwiKTtcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhKTtcblx0XHR0YS5zZWxlY3QoKTtcblx0XHRkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XG5cdFx0dGEucmVtb3ZlKCk7XG5cdH1cblx0ZnVuY3Rpb24gbGVnYWN5UmVhZCgpIHtcblx0XHR2YXIgX2RvY3VtZW50JGdldFNlbGVjdGlvLCBfZG9jdW1lbnQsIF9kb2N1bWVudCRnZXRTZWxlY3RpbzI7XG5cdFx0cmV0dXJuIChfZG9jdW1lbnQkZ2V0U2VsZWN0aW8gPSAoX2RvY3VtZW50ID0gZG9jdW1lbnQpID09PSBudWxsIHx8IF9kb2N1bWVudCA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yID0gX2RvY3VtZW50LmdldFNlbGVjdGlvbikgPT09IG51bGwgfHwgX2RvY3VtZW50JGdldFNlbGVjdGlvMiA9PT0gdm9pZCAwIHx8IChfZG9jdW1lbnQkZ2V0U2VsZWN0aW8yID0gX2RvY3VtZW50JGdldFNlbGVjdGlvMi5jYWxsKF9kb2N1bWVudCkpID09PSBudWxsIHx8IF9kb2N1bWVudCRnZXRTZWxlY3RpbzIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kb2N1bWVudCRnZXRTZWxlY3RpbzIudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2RvY3VtZW50JGdldFNlbGVjdGlvICE9PSB2b2lkIDAgPyBfZG9jdW1lbnQkZ2V0U2VsZWN0aW8gOiBcIlwiO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQWxsb3dlZChzdGF0dXMpIHtcblx0XHRyZXR1cm4gc3RhdHVzID09PSBcImdyYW50ZWRcIiB8fCBzdGF0dXMgPT09IFwicHJvbXB0XCI7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHR0ZXh0OiByZWFkb25seSh0ZXh0KSxcblx0XHRjb3BpZWQ6IHJlYWRvbmx5KGNvcGllZCksXG5cdFx0Y29weVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDbGlwYm9hcmRJdGVtcy9pbmRleC50c1xuZnVuY3Rpb24gdXNlQ2xpcGJvYXJkSXRlbXMob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIHJlYWQgPSBmYWxzZSwgc291cmNlLCBjb3BpZWREdXJpbmcgPSAxNTAwIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJjbGlwYm9hcmRcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IGNvbnRlbnQgPSByZWYoW10pO1xuXHRjb25zdCBjb3BpZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgdGltZW91dCA9IHVzZVRpbWVvdXRGbigoKSA9PiBjb3BpZWQudmFsdWUgPSBmYWxzZSwgY29waWVkRHVyaW5nLCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZUNvbnRlbnQoKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS5jbGlwYm9hcmQucmVhZCgpLnRoZW4oKGl0ZW1zKSA9PiB7XG5cdFx0XHRjb250ZW50LnZhbHVlID0gaXRlbXM7XG5cdFx0fSk7XG5cdH1cblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHJlYWQpIHVzZUV2ZW50TGlzdGVuZXIoW1wiY29weVwiLCBcImN1dFwiXSwgdXBkYXRlQ29udGVudCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRhc3luYyBmdW5jdGlvbiBjb3B5KHZhbHVlID0gdG9WYWx1ZShzb3VyY2UpKSB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHZhbHVlICE9IG51bGwpIHtcblx0XHRcdGF3YWl0IG5hdmlnYXRvciQxLmNsaXBib2FyZC53cml0ZSh2YWx1ZSk7XG5cdFx0XHRjb250ZW50LnZhbHVlID0gdmFsdWU7XG5cdFx0XHRjb3BpZWQudmFsdWUgPSB0cnVlO1xuXHRcdFx0dGltZW91dC5zdGFydCgpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGNvbnRlbnQ6IHNoYWxsb3dSZWFkb25seShjb250ZW50KSxcblx0XHRjb3BpZWQ6IHJlYWRvbmx5KGNvcGllZCksXG5cdFx0Y29weSxcblx0XHRyZWFkOiB1cGRhdGVDb250ZW50XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNsb25lZC9pbmRleC50c1xuZnVuY3Rpb24gY2xvbmVGbkpTT04oc291cmNlKSB7XG5cdHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNvdXJjZSkpO1xufVxuZnVuY3Rpb24gdXNlQ2xvbmVkKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGNsb25lZCA9IHJlZih7fSk7XG5cdGNvbnN0IGlzTW9kaWZpZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IF9sYXN0U3luYyA9IGZhbHNlO1xuXHRjb25zdCB7IG1hbnVhbCwgY2xvbmUgPSBjbG9uZUZuSlNPTiwgZGVlcCA9IHRydWUsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdHdhdGNoKGNsb25lZCwgKCkgPT4ge1xuXHRcdGlmIChfbGFzdFN5bmMpIHtcblx0XHRcdF9sYXN0U3luYyA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpc01vZGlmaWVkLnZhbHVlID0gdHJ1ZTtcblx0fSwge1xuXHRcdGRlZXA6IHRydWUsXG5cdFx0Zmx1c2g6IFwic3luY1wiXG5cdH0pO1xuXHRmdW5jdGlvbiBzeW5jKCkge1xuXHRcdF9sYXN0U3luYyA9IHRydWU7XG5cdFx0aXNNb2RpZmllZC52YWx1ZSA9IGZhbHNlO1xuXHRcdGNsb25lZC52YWx1ZSA9IGNsb25lKHRvVmFsdWUoc291cmNlKSk7XG5cdH1cblx0aWYgKCFtYW51YWwgJiYgKGlzUmVmKHNvdXJjZSkgfHwgdHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiKSkgd2F0Y2goc291cmNlLCBzeW5jLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRkZWVwLFxuXHRcdGltbWVkaWF0ZVxuXHR9KTtcblx0ZWxzZSBzeW5jKCk7XG5cdHJldHVybiB7XG5cdFx0Y2xvbmVkLFxuXHRcdGlzTW9kaWZpZWQsXG5cdFx0c3luY1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzc3ItaGFuZGxlcnMudHNcbmNvbnN0IF9nbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHt9O1xuY29uc3QgZ2xvYmFsS2V5ID0gXCJfX3Z1ZXVzZV9zc3JfaGFuZGxlcnNfX1wiO1xuY29uc3QgaGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gZ2V0SGFuZGxlcnMoKTtcbmZ1bmN0aW9uIGdldEhhbmRsZXJzKCkge1xuXHRpZiAoIShnbG9iYWxLZXkgaW4gX2dsb2JhbCkpIF9nbG9iYWxbZ2xvYmFsS2V5XSA9IF9nbG9iYWxbZ2xvYmFsS2V5XSB8fCB7fTtcblx0cmV0dXJuIF9nbG9iYWxbZ2xvYmFsS2V5XTtcbn1cbmZ1bmN0aW9uIGdldFNTUkhhbmRsZXIoa2V5LCBmYWxsYmFjaykge1xuXHRyZXR1cm4gaGFuZGxlcnNba2V5XSB8fCBmYWxsYmFjaztcbn1cbmZ1bmN0aW9uIHNldFNTUkhhbmRsZXIoa2V5LCBmbikge1xuXHRoYW5kbGVyc1trZXldID0gZm47XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZERhcmsvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBkYXJrIHRoZW1lIHByZWZlcmVuY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZERhcmtcbiogQHBhcmFtIFtvcHRpb25zXVxuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVByZWZlcnJlZERhcmsob3B0aW9ucykge1xuXHRyZXR1cm4gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIiwgb3B0aW9ucyk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN0b3JhZ2UvZ3Vlc3MudHNcbmZ1bmN0aW9uIGd1ZXNzU2VyaWFsaXplclR5cGUocmF3SW5pdCkge1xuXHRyZXR1cm4gcmF3SW5pdCA9PSBudWxsID8gXCJhbnlcIiA6IHJhd0luaXQgaW5zdGFuY2VvZiBTZXQgPyBcInNldFwiIDogcmF3SW5pdCBpbnN0YW5jZW9mIE1hcCA/IFwibWFwXCIgOiByYXdJbml0IGluc3RhbmNlb2YgRGF0ZSA/IFwiZGF0ZVwiIDogdHlwZW9mIHJhd0luaXQgPT09IFwiYm9vbGVhblwiID8gXCJib29sZWFuXCIgOiB0eXBlb2YgcmF3SW5pdCA9PT0gXCJzdHJpbmdcIiA/IFwic3RyaW5nXCIgOiB0eXBlb2YgcmF3SW5pdCA9PT0gXCJvYmplY3RcIiA/IFwib2JqZWN0XCIgOiAhTnVtYmVyLmlzTmFOKHJhd0luaXQpID8gXCJudW1iZXJcIiA6IFwiYW55XCI7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN0b3JhZ2UvaW5kZXgudHNcbmNvbnN0IFN0b3JhZ2VTZXJpYWxpemVycyA9IHtcblx0Ym9vbGVhbjoge1xuXHRcdHJlYWQ6ICh2KSA9PiB2ID09PSBcInRydWVcIixcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRvYmplY3Q6IHtcblx0XHRyZWFkOiAodikgPT4gSlNPTi5wYXJzZSh2KSxcblx0XHR3cml0ZTogKHYpID0+IEpTT04uc3RyaW5naWZ5KHYpXG5cdH0sXG5cdG51bWJlcjoge1xuXHRcdHJlYWQ6ICh2KSA9PiBOdW1iZXIucGFyc2VGbG9hdCh2KSxcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRhbnk6IHtcblx0XHRyZWFkOiAodikgPT4gdixcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRzdHJpbmc6IHtcblx0XHRyZWFkOiAodikgPT4gdixcblx0XHR3cml0ZTogKHYpID0+IFN0cmluZyh2KVxuXHR9LFxuXHRtYXA6IHtcblx0XHRyZWFkOiAodikgPT4gbmV3IE1hcChKU09OLnBhcnNlKHYpKSxcblx0XHR3cml0ZTogKHYpID0+IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odi5lbnRyaWVzKCkpKVxuXHR9LFxuXHRzZXQ6IHtcblx0XHRyZWFkOiAodikgPT4gbmV3IFNldChKU09OLnBhcnNlKHYpKSxcblx0XHR3cml0ZTogKHYpID0+IEpTT04uc3RyaW5naWZ5KEFycmF5LmZyb20odikpXG5cdH0sXG5cdGRhdGU6IHtcblx0XHRyZWFkOiAodikgPT4gbmV3IERhdGUodiksXG5cdFx0d3JpdGU6ICh2KSA9PiB2LnRvSVNPU3RyaW5nKClcblx0fVxufTtcbmNvbnN0IGN1c3RvbVN0b3JhZ2VFdmVudE5hbWUgPSBcInZ1ZXVzZS1zdG9yYWdlXCI7XG4vKipcbiogUmVhY3RpdmUgTG9jYWxTdG9yYWdlL1Nlc3Npb25TdG9yYWdlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTdG9yYWdlXG4qL1xuZnVuY3Rpb24gdXNlU3RvcmFnZShrZXksIGRlZmF1bHRzJDEsIHN0b3JhZ2UsIG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkc2VyaWFsaXplcjtcblx0Y29uc3QgeyBmbHVzaCA9IFwicHJlXCIsIGRlZXAgPSB0cnVlLCBsaXN0ZW5Ub1N0b3JhZ2VDaGFuZ2VzID0gdHJ1ZSwgd3JpdGVEZWZhdWx0cyA9IHRydWUsIG1lcmdlRGVmYXVsdHMgPSBmYWxzZSwgc2hhbGxvdywgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGV2ZW50RmlsdGVyLCBvbkVycm9yID0gKGUpID0+IHtcblx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHR9LCBpbml0T25Nb3VudGVkIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkYXRhID0gKHNoYWxsb3cgPyBzaGFsbG93UmVmIDogcmVmKSh0eXBlb2YgZGVmYXVsdHMkMSA9PT0gXCJmdW5jdGlvblwiID8gZGVmYXVsdHMkMSgpIDogZGVmYXVsdHMkMSk7XG5cdGNvbnN0IGtleUNvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShrZXkpKTtcblx0aWYgKCFzdG9yYWdlKSB0cnkge1xuXHRcdHN0b3JhZ2UgPSBnZXRTU1JIYW5kbGVyKFwiZ2V0RGVmYXVsdFN0b3JhZ2VcIiwgKCkgPT4gZGVmYXVsdFdpbmRvdyA9PT0gbnVsbCB8fCBkZWZhdWx0V2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0V2luZG93LmxvY2FsU3RvcmFnZSkoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdG9uRXJyb3IoZSk7XG5cdH1cblx0aWYgKCFzdG9yYWdlKSByZXR1cm4gZGF0YTtcblx0Y29uc3QgcmF3SW5pdCA9IHRvVmFsdWUoZGVmYXVsdHMkMSk7XG5cdGNvbnN0IHR5cGUgPSBndWVzc1NlcmlhbGl6ZXJUeXBlKHJhd0luaXQpO1xuXHRjb25zdCBzZXJpYWxpemVyID0gKF9vcHRpb25zJHNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXIpICE9PSBudWxsICYmIF9vcHRpb25zJHNlcmlhbGl6ZXIgIT09IHZvaWQgMCA/IF9vcHRpb25zJHNlcmlhbGl6ZXIgOiBTdG9yYWdlU2VyaWFsaXplcnNbdHlwZV07XG5cdGNvbnN0IHsgcGF1c2U6IHBhdXNlV2F0Y2gsIHJlc3VtZTogcmVzdW1lV2F0Y2ggfSA9IHdhdGNoUGF1c2FibGUoZGF0YSwgKG5ld1ZhbHVlKSA9PiB3cml0ZShuZXdWYWx1ZSksIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGV2ZW50RmlsdGVyXG5cdH0pO1xuXHR3YXRjaChrZXlDb21wdXRlZCwgKCkgPT4gdXBkYXRlKCksIHsgZmx1c2ggfSk7XG5cdGxldCBmaXJzdE1vdW50ZWQgPSBmYWxzZTtcblx0Y29uc3Qgb25TdG9yYWdlRXZlbnQgPSAoZXYpID0+IHtcblx0XHRpZiAoaW5pdE9uTW91bnRlZCAmJiAhZmlyc3RNb3VudGVkKSByZXR1cm47XG5cdFx0dXBkYXRlKGV2KTtcblx0fTtcblx0Y29uc3Qgb25TdG9yYWdlQ3VzdG9tRXZlbnQgPSAoZXYpID0+IHtcblx0XHRpZiAoaW5pdE9uTW91bnRlZCAmJiAhZmlyc3RNb3VudGVkKSByZXR1cm47XG5cdFx0dXBkYXRlRnJvbUN1c3RvbUV2ZW50KGV2KTtcblx0fTtcblx0LyoqXG5cdCogVGhlIGN1c3RvbSBldmVudCBpcyBuZWVkZWQgZm9yIHNhbWUtZG9jdW1lbnQgc3luY2luZyB3aGVuIHVzaW5nIGN1c3RvbVxuXHQqIHN0b3JhZ2UgYmFja2VuZHMsIGJ1dCBpdCBkb2Vzbid0IHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudHMuXG5cdCpcblx0KiBUT0RPOiBDb25zaWRlciBpbXBsZW1lbnRpbmcgYSBCcm9hZGNhc3RDaGFubmVsLWJhc2VkIHNvbHV0aW9uIHRoYXQgZml4ZXMgdGhpcy5cblx0Ki9cblx0aWYgKHdpbmRvdyQxICYmIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMpIGlmIChzdG9yYWdlIGluc3RhbmNlb2YgU3RvcmFnZSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJzdG9yYWdlXCIsIG9uU3RvcmFnZUV2ZW50LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGVsc2UgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgY3VzdG9tU3RvcmFnZUV2ZW50TmFtZSwgb25TdG9yYWdlQ3VzdG9tRXZlbnQpO1xuXHRpZiAoaW5pdE9uTW91bnRlZCkgdHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHRmaXJzdE1vdW50ZWQgPSB0cnVlO1xuXHRcdHVwZGF0ZSgpO1xuXHR9KTtcblx0ZWxzZSB1cGRhdGUoKTtcblx0ZnVuY3Rpb24gZGlzcGF0Y2hXcml0ZUV2ZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuXHRcdGlmICh3aW5kb3ckMSkge1xuXHRcdFx0Y29uc3QgcGF5bG9hZCA9IHtcblx0XHRcdFx0a2V5OiBrZXlDb21wdXRlZC52YWx1ZSxcblx0XHRcdFx0b2xkVmFsdWUsXG5cdFx0XHRcdG5ld1ZhbHVlLFxuXHRcdFx0XHRzdG9yYWdlQXJlYTogc3RvcmFnZVxuXHRcdFx0fTtcblx0XHRcdHdpbmRvdyQxLmRpc3BhdGNoRXZlbnQoc3RvcmFnZSBpbnN0YW5jZW9mIFN0b3JhZ2UgPyBuZXcgU3RvcmFnZUV2ZW50KFwic3RvcmFnZVwiLCBwYXlsb2FkKSA6IG5ldyBDdXN0b21FdmVudChjdXN0b21TdG9yYWdlRXZlbnROYW1lLCB7IGRldGFpbDogcGF5bG9hZCB9KSk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHdyaXRlKHYpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb2xkVmFsdWUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5Q29tcHV0ZWQudmFsdWUpO1xuXHRcdFx0aWYgKHYgPT0gbnVsbCkge1xuXHRcdFx0XHRkaXNwYXRjaFdyaXRlRXZlbnQob2xkVmFsdWUsIG51bGwpO1xuXHRcdFx0XHRzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5Q29tcHV0ZWQudmFsdWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZXIud3JpdGUodik7XG5cdFx0XHRcdGlmIChvbGRWYWx1ZSAhPT0gc2VyaWFsaXplZCkge1xuXHRcdFx0XHRcdHN0b3JhZ2Uuc2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSwgc2VyaWFsaXplZCk7XG5cdFx0XHRcdFx0ZGlzcGF0Y2hXcml0ZUV2ZW50KG9sZFZhbHVlLCBzZXJpYWxpemVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9uRXJyb3IoZSk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcblx0XHRjb25zdCByYXdWYWx1ZSA9IGV2ZW50ID8gZXZlbnQubmV3VmFsdWUgOiBzdG9yYWdlLmdldEl0ZW0oa2V5Q29tcHV0ZWQudmFsdWUpO1xuXHRcdGlmIChyYXdWYWx1ZSA9PSBudWxsKSB7XG5cdFx0XHRpZiAod3JpdGVEZWZhdWx0cyAmJiByYXdJbml0ICE9IG51bGwpIHN0b3JhZ2Uuc2V0SXRlbShrZXlDb21wdXRlZC52YWx1ZSwgc2VyaWFsaXplci53cml0ZShyYXdJbml0KSk7XG5cdFx0XHRyZXR1cm4gcmF3SW5pdDtcblx0XHR9IGVsc2UgaWYgKCFldmVudCAmJiBtZXJnZURlZmF1bHRzKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHNlcmlhbGl6ZXIucmVhZChyYXdWYWx1ZSk7XG5cdFx0XHRpZiAodHlwZW9mIG1lcmdlRGVmYXVsdHMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG1lcmdlRGVmYXVsdHModmFsdWUsIHJhd0luaXQpO1xuXHRcdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7XG5cdFx0XHRcdC4uLnJhd0luaXQsXG5cdFx0XHRcdC4uLnZhbHVlXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHJhd1ZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gcmF3VmFsdWU7XG5cdFx0ZWxzZSByZXR1cm4gc2VyaWFsaXplci5yZWFkKHJhd1ZhbHVlKTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGUoZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQgJiYgZXZlbnQuc3RvcmFnZUFyZWEgIT09IHN0b3JhZ2UpIHJldHVybjtcblx0XHRpZiAoZXZlbnQgJiYgZXZlbnQua2V5ID09IG51bGwpIHtcblx0XHRcdGRhdGEudmFsdWUgPSByYXdJbml0O1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZXZlbnQgJiYgZXZlbnQua2V5ICE9PSBrZXlDb21wdXRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdHBhdXNlV2F0Y2goKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc2VyaWFsaXplZERhdGEgPSBzZXJpYWxpemVyLndyaXRlKGRhdGEudmFsdWUpO1xuXHRcdFx0aWYgKGV2ZW50ID09PSB2b2lkIDAgfHwgKGV2ZW50ID09PSBudWxsIHx8IGV2ZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBldmVudC5uZXdWYWx1ZSkgIT09IHNlcmlhbGl6ZWREYXRhKSBkYXRhLnZhbHVlID0gcmVhZChldmVudCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKGV2ZW50KSBuZXh0VGljayhyZXN1bWVXYXRjaCk7XG5cdFx0XHRlbHNlIHJlc3VtZVdhdGNoKCk7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZUZyb21DdXN0b21FdmVudChldmVudCkge1xuXHRcdHVwZGF0ZShldmVudC5kZXRhaWwpO1xuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDb2xvck1vZGUvaW5kZXgudHNcbmNvbnN0IENTU19ESVNBQkxFX1RSQU5TID0gXCIqLCo6OmJlZm9yZSwqOjphZnRlcnstd2Via2l0LXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7LW1vei10cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50Oy1vLXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7LW1zLXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7dHJhbnNpdGlvbjpub25lIWltcG9ydGFudH1cIjtcbi8qKlxuKiBSZWFjdGl2ZSBjb2xvciBtb2RlIHdpdGggYXV0byBkYXRhIHBlcnNpc3RlbmNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDb2xvck1vZGVcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VDb2xvck1vZGUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgc2VsZWN0b3IgPSBcImh0bWxcIiwgYXR0cmlidXRlID0gXCJjbGFzc1wiLCBpbml0aWFsVmFsdWUgPSBcImF1dG9cIiwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHN0b3JhZ2UsIHN0b3JhZ2VLZXkgPSBcInZ1ZXVzZS1jb2xvci1zY2hlbWVcIiwgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcyA9IHRydWUsIHN0b3JhZ2VSZWYsIGVtaXRBdXRvLCBkaXNhYmxlVHJhbnNpdGlvbiA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG1vZGVzID0ge1xuXHRcdGF1dG86IFwiXCIsXG5cdFx0bGlnaHQ6IFwibGlnaHRcIixcblx0XHRkYXJrOiBcImRhcmtcIixcblx0XHQuLi5vcHRpb25zLm1vZGVzIHx8IHt9XG5cdH07XG5cdGNvbnN0IHByZWZlcnJlZERhcmsgPSB1c2VQcmVmZXJyZWREYXJrKHsgd2luZG93OiB3aW5kb3ckMSB9KTtcblx0Y29uc3Qgc3lzdGVtID0gY29tcHV0ZWQoKCkgPT4gcHJlZmVycmVkRGFyay52YWx1ZSA/IFwiZGFya1wiIDogXCJsaWdodFwiKTtcblx0Y29uc3Qgc3RvcmUgPSBzdG9yYWdlUmVmIHx8IChzdG9yYWdlS2V5ID09IG51bGwgPyB0b1JlZihpbml0aWFsVmFsdWUpIDogdXNlU3RvcmFnZShzdG9yYWdlS2V5LCBpbml0aWFsVmFsdWUsIHN0b3JhZ2UsIHtcblx0XHR3aW5kb3c6IHdpbmRvdyQxLFxuXHRcdGxpc3RlblRvU3RvcmFnZUNoYW5nZXNcblx0fSkpO1xuXHRjb25zdCBzdGF0ZSA9IGNvbXB1dGVkKCgpID0+IHN0b3JlLnZhbHVlID09PSBcImF1dG9cIiA/IHN5c3RlbS52YWx1ZSA6IHN0b3JlLnZhbHVlKTtcblx0Y29uc3QgdXBkYXRlSFRNTEF0dHJzID0gZ2V0U1NSSGFuZGxlcihcInVwZGF0ZUhUTUxBdHRyc1wiLCAoc2VsZWN0b3IkMSwgYXR0cmlidXRlJDEsIHZhbHVlKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0eXBlb2Ygc2VsZWN0b3IkMSA9PT0gXCJzdHJpbmdcIiA/IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yJDEpIDogdW5yZWZFbGVtZW50KHNlbGVjdG9yJDEpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRjb25zdCBjbGFzc2VzVG9BZGQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdGNvbnN0IGNsYXNzZXNUb1JlbW92ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdFx0bGV0IGF0dHJpYnV0ZVRvQ2hhbmdlID0gbnVsbDtcblx0XHRpZiAoYXR0cmlidXRlJDEgPT09IFwiY2xhc3NcIikge1xuXHRcdFx0Y29uc3QgY3VycmVudCA9IHZhbHVlLnNwbGl0KC9cXHMvZyk7XG5cdFx0XHRPYmplY3QudmFsdWVzKG1vZGVzKS5mbGF0TWFwKChpKSA9PiAoaSB8fCBcIlwiKS5zcGxpdCgvXFxzL2cpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgodikgPT4ge1xuXHRcdFx0XHRpZiAoY3VycmVudC5pbmNsdWRlcyh2KSkgY2xhc3Nlc1RvQWRkLmFkZCh2KTtcblx0XHRcdFx0ZWxzZSBjbGFzc2VzVG9SZW1vdmUuYWRkKHYpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGF0dHJpYnV0ZVRvQ2hhbmdlID0ge1xuXHRcdFx0a2V5OiBhdHRyaWJ1dGUkMSxcblx0XHRcdHZhbHVlXG5cdFx0fTtcblx0XHRpZiAoY2xhc3Nlc1RvQWRkLnNpemUgPT09IDAgJiYgY2xhc3Nlc1RvUmVtb3ZlLnNpemUgPT09IDAgJiYgYXR0cmlidXRlVG9DaGFuZ2UgPT09IG51bGwpIHJldHVybjtcblx0XHRsZXQgc3R5bGU7XG5cdFx0aWYgKGRpc2FibGVUcmFuc2l0aW9uKSB7XG5cdFx0XHRzdHlsZSA9IHdpbmRvdyQxLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRcdHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKENTU19ESVNBQkxFX1RSQU5TKSk7XG5cdFx0XHR3aW5kb3ckMS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBjIG9mIGNsYXNzZXNUb0FkZCkgZWwuY2xhc3NMaXN0LmFkZChjKTtcblx0XHRmb3IgKGNvbnN0IGMgb2YgY2xhc3Nlc1RvUmVtb3ZlKSBlbC5jbGFzc0xpc3QucmVtb3ZlKGMpO1xuXHRcdGlmIChhdHRyaWJ1dGVUb0NoYW5nZSkgZWwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZVRvQ2hhbmdlLmtleSwgYXR0cmlidXRlVG9DaGFuZ2UudmFsdWUpO1xuXHRcdGlmIChkaXNhYmxlVHJhbnNpdGlvbikge1xuXHRcdFx0d2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZShzdHlsZSkub3BhY2l0eTtcblx0XHRcdGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0fSk7XG5cdGZ1bmN0aW9uIGRlZmF1bHRPbkNoYW5nZWQobW9kZSkge1xuXHRcdHZhciBfbW9kZXMkbW9kZTtcblx0XHR1cGRhdGVIVE1MQXR0cnMoc2VsZWN0b3IsIGF0dHJpYnV0ZSwgKF9tb2RlcyRtb2RlID0gbW9kZXNbbW9kZV0pICE9PSBudWxsICYmIF9tb2RlcyRtb2RlICE9PSB2b2lkIDAgPyBfbW9kZXMkbW9kZSA6IG1vZGUpO1xuXHR9XG5cdGZ1bmN0aW9uIG9uQ2hhbmdlZChtb2RlKSB7XG5cdFx0aWYgKG9wdGlvbnMub25DaGFuZ2VkKSBvcHRpb25zLm9uQ2hhbmdlZChtb2RlLCBkZWZhdWx0T25DaGFuZ2VkKTtcblx0XHRlbHNlIGRlZmF1bHRPbkNoYW5nZWQobW9kZSk7XG5cdH1cblx0d2F0Y2goc3RhdGUsIG9uQ2hhbmdlZCwge1xuXHRcdGZsdXNoOiBcInBvc3RcIixcblx0XHRpbW1lZGlhdGU6IHRydWVcblx0fSk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiBvbkNoYW5nZWQoc3RhdGUudmFsdWUpKTtcblx0Y29uc3QgYXV0byA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZW1pdEF1dG8gPyBzdG9yZS52YWx1ZSA6IHN0YXRlLnZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHN0b3JlLnZhbHVlID0gdjtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbihhdXRvLCB7XG5cdFx0c3RvcmUsXG5cdFx0c3lzdGVtLFxuXHRcdHN0YXRlXG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDb25maXJtRGlhbG9nL2luZGV4LnRzXG4vKipcbiogSG9va3MgZm9yIGNyZWF0aW5nIGNvbmZpcm0gZGlhbG9ncy4gVXNlZnVsIGZvciBtb2RhbCB3aW5kb3dzLCBwb3B1cHMgYW5kIGxvZ2lucy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ29uZmlybURpYWxvZy9cbiogQHBhcmFtIHJldmVhbGVkIGBib29sZWFuYCBgcmVmYCB0aGF0IGhhbmRsZXMgYSBtb2RhbCB3aW5kb3dcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VDb25maXJtRGlhbG9nKHJldmVhbGVkID0gc2hhbGxvd1JlZihmYWxzZSkpIHtcblx0Y29uc3QgY29uZmlybUhvb2sgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgY2FuY2VsSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCByZXZlYWxIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGxldCBfcmVzb2x2ZSA9IG5vb3A7XG5cdGNvbnN0IHJldmVhbCA9IChkYXRhKSA9PiB7XG5cdFx0cmV2ZWFsSG9vay50cmlnZ2VyKGRhdGEpO1xuXHRcdHJldmVhbGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdF9yZXNvbHZlID0gcmVzb2x2ZTtcblx0XHR9KTtcblx0fTtcblx0Y29uc3QgY29uZmlybSA9IChkYXRhKSA9PiB7XG5cdFx0cmV2ZWFsZWQudmFsdWUgPSBmYWxzZTtcblx0XHRjb25maXJtSG9vay50cmlnZ2VyKGRhdGEpO1xuXHRcdF9yZXNvbHZlKHtcblx0XHRcdGRhdGEsXG5cdFx0XHRpc0NhbmNlbGVkOiBmYWxzZVxuXHRcdH0pO1xuXHR9O1xuXHRjb25zdCBjYW5jZWwgPSAoZGF0YSkgPT4ge1xuXHRcdHJldmVhbGVkLnZhbHVlID0gZmFsc2U7XG5cdFx0Y2FuY2VsSG9vay50cmlnZ2VyKGRhdGEpO1xuXHRcdF9yZXNvbHZlKHtcblx0XHRcdGRhdGEsXG5cdFx0XHRpc0NhbmNlbGVkOiB0cnVlXG5cdFx0fSk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0aXNSZXZlYWxlZDogY29tcHV0ZWQoKCkgPT4gcmV2ZWFsZWQudmFsdWUpLFxuXHRcdHJldmVhbCxcblx0XHRjb25maXJtLFxuXHRcdGNhbmNlbCxcblx0XHRvblJldmVhbDogcmV2ZWFsSG9vay5vbixcblx0XHRvbkNvbmZpcm06IGNvbmZpcm1Ib29rLm9uLFxuXHRcdG9uQ2FuY2VsOiBjYW5jZWxIb29rLm9uXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUNvdW50ZG93bi9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ4KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSAxZTMsIGltbWVkaWF0ZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0fVxuXHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCAxZTMsIHsgaW1tZWRpYXRlOiBmYWxzZSB9KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBjb3VudGRvd24gdGltZXIgaW4gc2Vjb25kcy5cbipcbiogQHBhcmFtIGluaXRpYWxDb3VudGRvd25cbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlQ291bnRkb3duXG4qL1xuZnVuY3Rpb24gdXNlQ291bnRkb3duKGluaXRpYWxDb3VudGRvd24sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCByZW1haW5pbmcgPSBzaGFsbG93UmVmKHRvVmFsdWUoaW5pdGlhbENvdW50ZG93bikpO1xuXHRjb25zdCB7IHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkOChvcHRpb25zKSwgb25UaWNrLCBvbkNvbXBsZXRlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjb250cm9scyA9IHNjaGVkdWxlcigoKSA9PiB7XG5cdFx0Y29uc3QgdmFsdWUgPSByZW1haW5pbmcudmFsdWUgLSAxO1xuXHRcdHJlbWFpbmluZy52YWx1ZSA9IHZhbHVlIDwgMCA/IDAgOiB2YWx1ZTtcblx0XHRvblRpY2sgPT09IG51bGwgfHwgb25UaWNrID09PSB2b2lkIDAgfHwgb25UaWNrKCk7XG5cdFx0aWYgKHJlbWFpbmluZy52YWx1ZSA8PSAwKSB7XG5cdFx0XHRjb250cm9scy5wYXVzZSgpO1xuXHRcdFx0b25Db21wbGV0ZSA9PT0gbnVsbCB8fCBvbkNvbXBsZXRlID09PSB2b2lkIDAgfHwgb25Db21wbGV0ZSgpO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHJlc2V0ID0gKGNvdW50ZG93bikgPT4ge1xuXHRcdHZhciBfdG9WYWx1ZTtcblx0XHRyZW1haW5pbmcudmFsdWUgPSAoX3RvVmFsdWUgPSB0b1ZhbHVlKGNvdW50ZG93bikpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHRvVmFsdWUoaW5pdGlhbENvdW50ZG93bik7XG5cdH07XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0Y29udHJvbHMucGF1c2UoKTtcblx0XHRyZXNldCgpO1xuXHR9O1xuXHRjb25zdCByZXN1bWUgPSAoKSA9PiB7XG5cdFx0aWYgKCFjb250cm9scy5pc0FjdGl2ZS52YWx1ZSkge1xuXHRcdFx0aWYgKHJlbWFpbmluZy52YWx1ZSA+IDApIGNvbnRyb2xzLnJlc3VtZSgpO1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc3RhcnQgPSAoY291bnRkb3duKSA9PiB7XG5cdFx0cmVzZXQoY291bnRkb3duKTtcblx0XHRjb250cm9scy5yZXN1bWUoKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRyZW1haW5pbmcsXG5cdFx0cmVzZXQsXG5cdFx0c3RvcCxcblx0XHRzdGFydCxcblx0XHRwYXVzZTogY29udHJvbHMucGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGlzQWN0aXZlOiBjb250cm9scy5pc0FjdGl2ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDc3NTdXBwb3J0cy9pbmRleC50c1xuZnVuY3Rpb24gdXNlQ3NzU3VwcG9ydHMoLi4uYXJncykge1xuXHRsZXQgb3B0aW9ucyA9IHt9O1xuXHRpZiAodHlwZW9mIHRvVmFsdWUoYXJncy5hdCgtMSkpID09PSBcIm9iamVjdFwiKSBvcHRpb25zID0gYXJncy5wb3AoKTtcblx0Y29uc3QgW3Byb3AsIHZhbHVlXSA9IGFyZ3M7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHNzclZhbHVlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzTW91bnRlZCA9IHVzZU1vdW50ZWQoKTtcblx0cmV0dXJuIHsgaXNTdXBwb3J0ZWQ6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpc01vdW50ZWQudmFsdWU7XG5cdFx0aWYgKCFpc0NsaWVudCkgcmV0dXJuIHNzclZhbHVlO1xuXHRcdHJldHVybiBhcmdzLmxlbmd0aCA9PT0gMiA/IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5DU1Muc3VwcG9ydHModG9WYWx1ZShwcm9wKSwgdG9WYWx1ZSh2YWx1ZSkpIDogd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLkNTUy5zdXBwb3J0cyh0b1ZhbHVlKHByb3ApKTtcblx0fSkgfTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlQ3NzVmFyL2luZGV4LnRzXG4vKipcbiogTWFuaXB1bGF0ZSBDU1MgdmFyaWFibGVzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VDc3NWYXJcbiogQHBhcmFtIHByb3BcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUNzc1Zhcihwcm9wLCB0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBpbml0aWFsVmFsdWUsIG9ic2VydmUgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgdmFyaWFibGUgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IGVsUmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfd2luZG93JGRvY3VtZW50O1xuXHRcdHJldHVybiB1bnJlZkVsZW1lbnQodGFyZ2V0KSB8fCAod2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCB8fCAoX3dpbmRvdyRkb2N1bWVudCA9IHdpbmRvdyQxLmRvY3VtZW50KSA9PT0gbnVsbCB8fCBfd2luZG93JGRvY3VtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfd2luZG93JGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG5cdH0pO1xuXHRmdW5jdGlvbiB1cGRhdGVDc3NWYXIoKSB7XG5cdFx0Y29uc3Qga2V5ID0gdG9WYWx1ZShwcm9wKTtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUoZWxSZWYpO1xuXHRcdGlmIChlbCAmJiB3aW5kb3ckMSAmJiBrZXkpIHtcblx0XHRcdHZhciBfd2luZG93JGdldENvbXB1dGVkU3Q7XG5cdFx0XHR2YXJpYWJsZS52YWx1ZSA9ICgoX3dpbmRvdyRnZXRDb21wdXRlZFN0ID0gd2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZShlbCkuZ2V0UHJvcGVydHlWYWx1ZShrZXkpKSA9PT0gbnVsbCB8fCBfd2luZG93JGdldENvbXB1dGVkU3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckZ2V0Q29tcHV0ZWRTdC50cmltKCkpIHx8IHZhcmlhYmxlLnZhbHVlIHx8IGluaXRpYWxWYWx1ZTtcblx0XHR9XG5cdH1cblx0aWYgKG9ic2VydmUpIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZWxSZWYsIHVwZGF0ZUNzc1Zhciwge1xuXHRcdGF0dHJpYnV0ZUZpbHRlcjogW1wic3R5bGVcIiwgXCJjbGFzc1wiXSxcblx0XHR3aW5kb3c6IHdpbmRvdyQxXG5cdH0pO1xuXHR3YXRjaChbZWxSZWYsICgpID0+IHRvVmFsdWUocHJvcCldLCAoXywgb2xkKSA9PiB7XG5cdFx0aWYgKG9sZFswXSAmJiBvbGRbMV0pIG9sZFswXS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShvbGRbMV0pO1xuXHRcdHVwZGF0ZUNzc1ZhcigpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0d2F0Y2goW3ZhcmlhYmxlLCBlbFJlZl0sIChbdmFsLCBlbF0pID0+IHtcblx0XHRjb25zdCByYXdfcHJvcCA9IHRvVmFsdWUocHJvcCk7XG5cdFx0aWYgKChlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWwuc3R5bGUpICYmIHJhd19wcm9wKSBpZiAodmFsID09IG51bGwpIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KHJhd19wcm9wKTtcblx0XHRlbHNlIGVsLnN0eWxlLnNldFByb3BlcnR5KHJhd19wcm9wLCB2YWwpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHZhcmlhYmxlO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VDdXJyZW50RWxlbWVudC9pbmRleC50c1xuZnVuY3Rpb24gdXNlQ3VycmVudEVsZW1lbnQocm9vdENvbXBvbmVudCkge1xuXHRjb25zdCB2bSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuXHRjb25zdCBjdXJyZW50RWxlbWVudCA9IGNvbXB1dGVkV2l0aENvbnRyb2woKCkgPT4gbnVsbCwgKCkgPT4gcm9vdENvbXBvbmVudCA/IHVucmVmRWxlbWVudChyb290Q29tcG9uZW50KSA6IHZtLnByb3h5LiRlbCk7XG5cdG9uVXBkYXRlZChjdXJyZW50RWxlbWVudC50cmlnZ2VyKTtcblx0b25Nb3VudGVkKGN1cnJlbnRFbGVtZW50LnRyaWdnZXIpO1xuXHRyZXR1cm4gY3VycmVudEVsZW1lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUN5Y2xlTGlzdC9pbmRleC50c1xuLyoqXG4qIEN5Y2xlIHRocm91Z2ggYSBsaXN0IG9mIGl0ZW1zXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUN5Y2xlTGlzdFxuKi9cbmZ1bmN0aW9uIHVzZUN5Y2xlTGlzdChsaXN0LCBvcHRpb25zKSB7XG5cdGNvbnN0IHN0YXRlID0gc2hhbGxvd1JlZihnZXRJbml0aWFsVmFsdWUoKSk7XG5cdGNvbnN0IGxpc3RSZWYgPSB0b1JlZihsaXN0KTtcblx0Y29uc3QgaW5kZXggPSBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0dmFyIF9vcHRpb25zJGZhbGxiYWNrSW5kZTtcblx0XHRcdGNvbnN0IHRhcmdldExpc3QgPSBsaXN0UmVmLnZhbHVlO1xuXHRcdFx0bGV0IGluZGV4JDEgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmdldEluZGV4T2YpID8gb3B0aW9ucy5nZXRJbmRleE9mKHN0YXRlLnZhbHVlLCB0YXJnZXRMaXN0KSA6IHRhcmdldExpc3QuaW5kZXhPZihzdGF0ZS52YWx1ZSk7XG5cdFx0XHRpZiAoaW5kZXgkMSA8IDApIGluZGV4JDEgPSAoX29wdGlvbnMkZmFsbGJhY2tJbmRlID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZhbGxiYWNrSW5kZXgpICE9PSBudWxsICYmIF9vcHRpb25zJGZhbGxiYWNrSW5kZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkZmFsbGJhY2tJbmRlIDogMDtcblx0XHRcdHJldHVybiBpbmRleCQxO1xuXHRcdH0sXG5cdFx0c2V0KHYpIHtcblx0XHRcdHNldCh2KTtcblx0XHR9XG5cdH0pO1xuXHRmdW5jdGlvbiBzZXQoaSkge1xuXHRcdGNvbnN0IHRhcmdldExpc3QgPSBsaXN0UmVmLnZhbHVlO1xuXHRcdGNvbnN0IGxlbmd0aCA9IHRhcmdldExpc3QubGVuZ3RoO1xuXHRcdGNvbnN0IHZhbHVlID0gdGFyZ2V0TGlzdFsoaSAlIGxlbmd0aCArIGxlbmd0aCkgJSBsZW5ndGhdO1xuXHRcdHN0YXRlLnZhbHVlID0gdmFsdWU7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIHNoaWZ0KGRlbHRhID0gMSkge1xuXHRcdHJldHVybiBzZXQoaW5kZXgudmFsdWUgKyBkZWx0YSk7XG5cdH1cblx0ZnVuY3Rpb24gbmV4dChuID0gMSkge1xuXHRcdHJldHVybiBzaGlmdChuKTtcblx0fVxuXHRmdW5jdGlvbiBwcmV2KG4gPSAxKSB7XG5cdFx0cmV0dXJuIHNoaWZ0KC1uKTtcblx0fVxuXHRmdW5jdGlvbiBnZXRJbml0aWFsVmFsdWUoKSB7XG5cdFx0dmFyIF90b1ZhbHVlLCBfb3B0aW9ucyRpbml0aWFsVmFsdWU7XG5cdFx0cmV0dXJuIChfdG9WYWx1ZSA9IHRvVmFsdWUoKF9vcHRpb25zJGluaXRpYWxWYWx1ZSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbml0aWFsVmFsdWUpICE9PSBudWxsICYmIF9vcHRpb25zJGluaXRpYWxWYWx1ZSAhPT0gdm9pZCAwID8gX29wdGlvbnMkaW5pdGlhbFZhbHVlIDogdG9WYWx1ZShsaXN0KVswXSkpICE9PSBudWxsICYmIF90b1ZhbHVlICE9PSB2b2lkIDAgPyBfdG9WYWx1ZSA6IHZvaWQgMDtcblx0fVxuXHR3YXRjaChsaXN0UmVmLCAoKSA9PiBzZXQoaW5kZXgudmFsdWUpKTtcblx0cmV0dXJuIHtcblx0XHRzdGF0ZSxcblx0XHRpbmRleCxcblx0XHRuZXh0LFxuXHRcdHByZXYsXG5cdFx0Z286IHNldFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEYXJrL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgZGFyayBtb2RlIHdpdGggYXV0byBkYXRhIHBlcnNpc3RlbmNlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEYXJrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGFyayhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB2YWx1ZURhcmsgPSBcImRhcmtcIiwgdmFsdWVMaWdodCA9IFwiXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG1vZGUgPSB1c2VDb2xvck1vZGUoe1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0b25DaGFuZ2VkOiAobW9kZSQxLCBkZWZhdWx0SGFuZGxlcikgPT4ge1xuXHRcdFx0dmFyIF9vcHRpb25zJG9uQ2hhbmdlZDtcblx0XHRcdGlmIChvcHRpb25zLm9uQ2hhbmdlZCkgKF9vcHRpb25zJG9uQ2hhbmdlZCA9IG9wdGlvbnMub25DaGFuZ2VkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkNoYW5nZWQgPT09IHZvaWQgMCB8fCBfb3B0aW9ucyRvbkNoYW5nZWQuY2FsbChvcHRpb25zLCBtb2RlJDEgPT09IFwiZGFya1wiLCBkZWZhdWx0SGFuZGxlciwgbW9kZSQxKTtcblx0XHRcdGVsc2UgZGVmYXVsdEhhbmRsZXIobW9kZSQxKTtcblx0XHR9LFxuXHRcdG1vZGVzOiB7XG5cdFx0XHRkYXJrOiB2YWx1ZURhcmssXG5cdFx0XHRsaWdodDogdmFsdWVMaWdodFxuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHN5c3RlbSA9IGNvbXB1dGVkKCgpID0+IG1vZGUuc3lzdGVtLnZhbHVlKTtcblx0cmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gbW9kZS52YWx1ZSA9PT0gXCJkYXJrXCI7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0Y29uc3QgbW9kZVZhbCA9IHYgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcblx0XHRcdGlmIChzeXN0ZW0udmFsdWUgPT09IG1vZGVWYWwpIG1vZGUudmFsdWUgPSBcImF1dG9cIjtcblx0XHRcdGVsc2UgbW9kZS52YWx1ZSA9IG1vZGVWYWw7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTWFudWFsUmVmSGlzdG9yeS9pbmRleC50c1xuZnVuY3Rpb24gZm5CeXBhc3Modikge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIGZuU2V0U291cmNlKHNvdXJjZSwgdmFsdWUpIHtcblx0cmV0dXJuIHNvdXJjZS52YWx1ZSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gZGVmYXVsdER1bXAoY2xvbmUpIHtcblx0cmV0dXJuIGNsb25lID8gdHlwZW9mIGNsb25lID09PSBcImZ1bmN0aW9uXCIgPyBjbG9uZSA6IGNsb25lRm5KU09OIDogZm5CeXBhc3M7XG59XG5mdW5jdGlvbiBkZWZhdWx0UGFyc2UoY2xvbmUpIHtcblx0cmV0dXJuIGNsb25lID8gdHlwZW9mIGNsb25lID09PSBcImZ1bmN0aW9uXCIgPyBjbG9uZSA6IGNsb25lRm5KU09OIDogZm5CeXBhc3M7XG59XG4vKipcbiogVHJhY2sgdGhlIGNoYW5nZSBoaXN0b3J5IG9mIGEgcmVmLCBhbHNvIHByb3ZpZGVzIHVuZG8gYW5kIHJlZG8gZnVuY3Rpb25hbGl0eS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTWFudWFsUmVmSGlzdG9yeVxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTWFudWFsUmVmSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNsb25lID0gZmFsc2UsIGR1bXAgPSBkZWZhdWx0RHVtcChjbG9uZSksIHBhcnNlID0gZGVmYXVsdFBhcnNlKGNsb25lKSwgc2V0U291cmNlID0gZm5TZXRTb3VyY2UgfSA9IG9wdGlvbnM7XG5cdGZ1bmN0aW9uIF9jcmVhdGVIaXN0b3J5UmVjb3JkKCkge1xuXHRcdHJldHVybiBtYXJrUmF3KHtcblx0XHRcdHNuYXBzaG90OiBkdW1wKHNvdXJjZS52YWx1ZSksXG5cdFx0XHR0aW1lc3RhbXA6IHRpbWVzdGFtcCgpXG5cdFx0fSk7XG5cdH1cblx0Y29uc3QgbGFzdCA9IHJlZihfY3JlYXRlSGlzdG9yeVJlY29yZCgpKTtcblx0Y29uc3QgdW5kb1N0YWNrID0gcmVmKFtdKTtcblx0Y29uc3QgcmVkb1N0YWNrID0gcmVmKFtdKTtcblx0Y29uc3QgX3NldFNvdXJjZSA9IChyZWNvcmQpID0+IHtcblx0XHRzZXRTb3VyY2Uoc291cmNlLCBwYXJzZShyZWNvcmQuc25hcHNob3QpKTtcblx0XHRsYXN0LnZhbHVlID0gcmVjb3JkO1xuXHR9O1xuXHRjb25zdCBjb21taXQgPSAoKSA9PiB7XG5cdFx0dW5kb1N0YWNrLnZhbHVlLnVuc2hpZnQobGFzdC52YWx1ZSk7XG5cdFx0bGFzdC52YWx1ZSA9IF9jcmVhdGVIaXN0b3J5UmVjb3JkKCk7XG5cdFx0aWYgKG9wdGlvbnMuY2FwYWNpdHkgJiYgdW5kb1N0YWNrLnZhbHVlLmxlbmd0aCA+IG9wdGlvbnMuY2FwYWNpdHkpIHVuZG9TdGFjay52YWx1ZS5zcGxpY2Uob3B0aW9ucy5jYXBhY2l0eSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblx0XHRpZiAocmVkb1N0YWNrLnZhbHVlLmxlbmd0aCkgcmVkb1N0YWNrLnZhbHVlLnNwbGljZSgwLCByZWRvU3RhY2sudmFsdWUubGVuZ3RoKTtcblx0fTtcblx0Y29uc3QgY2xlYXIgPSAoKSA9PiB7XG5cdFx0dW5kb1N0YWNrLnZhbHVlLnNwbGljZSgwLCB1bmRvU3RhY2sudmFsdWUubGVuZ3RoKTtcblx0XHRyZWRvU3RhY2sudmFsdWUuc3BsaWNlKDAsIHJlZG9TdGFjay52YWx1ZS5sZW5ndGgpO1xuXHR9O1xuXHRjb25zdCB1bmRvID0gKCkgPT4ge1xuXHRcdGNvbnN0IHN0YXRlID0gdW5kb1N0YWNrLnZhbHVlLnNoaWZ0KCk7XG5cdFx0aWYgKHN0YXRlKSB7XG5cdFx0XHRyZWRvU3RhY2sudmFsdWUudW5zaGlmdChsYXN0LnZhbHVlKTtcblx0XHRcdF9zZXRTb3VyY2Uoc3RhdGUpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgcmVkbyA9ICgpID0+IHtcblx0XHRjb25zdCBzdGF0ZSA9IHJlZG9TdGFjay52YWx1ZS5zaGlmdCgpO1xuXHRcdGlmIChzdGF0ZSkge1xuXHRcdFx0dW5kb1N0YWNrLnZhbHVlLnVuc2hpZnQobGFzdC52YWx1ZSk7XG5cdFx0XHRfc2V0U291cmNlKHN0YXRlKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuXHRcdF9zZXRTb3VyY2UobGFzdC52YWx1ZSk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0c291cmNlLFxuXHRcdHVuZG9TdGFjayxcblx0XHRyZWRvU3RhY2ssXG5cdFx0bGFzdCxcblx0XHRoaXN0b3J5OiBjb21wdXRlZCgoKSA9PiBbbGFzdC52YWx1ZSwgLi4udW5kb1N0YWNrLnZhbHVlXSksXG5cdFx0Y2FuVW5kbzogY29tcHV0ZWQoKCkgPT4gdW5kb1N0YWNrLnZhbHVlLmxlbmd0aCA+IDApLFxuXHRcdGNhblJlZG86IGNvbXB1dGVkKCgpID0+IHJlZG9TdGFjay52YWx1ZS5sZW5ndGggPiAwKSxcblx0XHRjbGVhcixcblx0XHRjb21taXQsXG5cdFx0cmVzZXQsXG5cdFx0dW5kbyxcblx0XHRyZWRvXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVJlZkhpc3RvcnkvaW5kZXgudHNcbi8qKlxuKiBUcmFjayB0aGUgY2hhbmdlIGhpc3Rvcnkgb2YgYSByZWYsIGFsc28gcHJvdmlkZXMgdW5kbyBhbmQgcmVkbyBmdW5jdGlvbmFsaXR5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VSZWZIaXN0b3J5XG4qIEBwYXJhbSBzb3VyY2VcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VSZWZIaXN0b3J5KHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZGVlcCA9IGZhbHNlLCBmbHVzaCA9IFwicHJlXCIsIGV2ZW50RmlsdGVyLCBzaG91bGRDb21taXQgPSAoKSA9PiB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCB7IGV2ZW50RmlsdGVyOiBjb21wb3NlZEZpbHRlciwgcGF1c2UsIHJlc3VtZTogcmVzdW1lVHJhY2tpbmcsIGlzQWN0aXZlOiBpc1RyYWNraW5nIH0gPSBwYXVzYWJsZUZpbHRlcihldmVudEZpbHRlcik7XG5cdGxldCBsYXN0UmF3VmFsdWUgPSBzb3VyY2UudmFsdWU7XG5cdGNvbnN0IHsgaWdub3JlVXBkYXRlcywgaWdub3JlUHJldkFzeW5jVXBkYXRlcywgc3RvcCB9ID0gd2F0Y2hJZ25vcmFibGUoc291cmNlLCBjb21taXQsIHtcblx0XHRkZWVwLFxuXHRcdGZsdXNoLFxuXHRcdGV2ZW50RmlsdGVyOiBjb21wb3NlZEZpbHRlclxuXHR9KTtcblx0ZnVuY3Rpb24gc2V0U291cmNlKHNvdXJjZSQxLCB2YWx1ZSkge1xuXHRcdGlnbm9yZVByZXZBc3luY1VwZGF0ZXMoKTtcblx0XHRpZ25vcmVVcGRhdGVzKCgpID0+IHtcblx0XHRcdHNvdXJjZSQxLnZhbHVlID0gdmFsdWU7XG5cdFx0XHRsYXN0UmF3VmFsdWUgPSB2YWx1ZTtcblx0XHR9KTtcblx0fVxuXHRjb25zdCBtYW51YWxIaXN0b3J5ID0gdXNlTWFudWFsUmVmSGlzdG9yeShzb3VyY2UsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdGNsb25lOiBvcHRpb25zLmNsb25lIHx8IGRlZXAsXG5cdFx0c2V0U291cmNlXG5cdH0pO1xuXHRjb25zdCB7IGNsZWFyLCBjb21taXQ6IG1hbnVhbENvbW1pdCB9ID0gbWFudWFsSGlzdG9yeTtcblx0ZnVuY3Rpb24gY29tbWl0KCkge1xuXHRcdGlnbm9yZVByZXZBc3luY1VwZGF0ZXMoKTtcblx0XHRpZiAoIXNob3VsZENvbW1pdChsYXN0UmF3VmFsdWUsIHNvdXJjZS52YWx1ZSkpIHJldHVybjtcblx0XHRsYXN0UmF3VmFsdWUgPSBzb3VyY2UudmFsdWU7XG5cdFx0bWFudWFsQ29tbWl0KCk7XG5cdH1cblx0ZnVuY3Rpb24gcmVzdW1lKGNvbW1pdE5vdykge1xuXHRcdHJlc3VtZVRyYWNraW5nKCk7XG5cdFx0aWYgKGNvbW1pdE5vdykgY29tbWl0KCk7XG5cdH1cblx0ZnVuY3Rpb24gYmF0Y2goZm4pIHtcblx0XHRsZXQgY2FuY2VsZWQgPSBmYWxzZTtcblx0XHRjb25zdCBjYW5jZWwgPSAoKSA9PiBjYW5jZWxlZCA9IHRydWU7XG5cdFx0aWdub3JlVXBkYXRlcygoKSA9PiB7XG5cdFx0XHRmbihjYW5jZWwpO1xuXHRcdH0pO1xuXHRcdGlmICghY2FuY2VsZWQpIGNvbW1pdCgpO1xuXHR9XG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cdFx0c3RvcCgpO1xuXHRcdGNsZWFyKCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHQuLi5tYW51YWxIaXN0b3J5LFxuXHRcdGlzVHJhY2tpbmcsXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lLFxuXHRcdGNvbW1pdCxcblx0XHRiYXRjaCxcblx0XHRkaXNwb3NlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURlYm91bmNlZFJlZkhpc3RvcnkvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIFt1c2VSZWZIaXN0b3J5XShodHRwczovL3Z1ZXVzZS5vcmcvdXNlUmVmSGlzdG9yeSkgd2l0aCBkZWJvdW5jZSBmaWx0ZXIuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURlYm91bmNlZFJlZkhpc3RvcnlcbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZURlYm91bmNlZFJlZkhpc3Rvcnkoc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgZmlsdGVyID0gb3B0aW9ucy5kZWJvdW5jZSA/IGRlYm91bmNlRmlsdGVyKG9wdGlvbnMuZGVib3VuY2UpIDogdm9pZCAwO1xuXHRyZXR1cm4geyAuLi51c2VSZWZIaXN0b3J5KHNvdXJjZSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0ZXZlbnRGaWx0ZXI6IGZpbHRlclxuXHR9KSB9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEZXZpY2VNb3Rpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBEZXZpY2VNb3Rpb25FdmVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlTW90aW9uXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGV2aWNlTW90aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCByZXF1ZXN0UGVybWlzc2lvbnMgPSBmYWxzZSwgZXZlbnRGaWx0ZXIgPSBieXBhc3NGaWx0ZXIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB0eXBlb2YgRGV2aWNlTW90aW9uRXZlbnQgIT09IFwidW5kZWZpbmVkXCIpO1xuXHRjb25zdCByZXF1aXJlUGVybWlzc2lvbnMgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IGlzU3VwcG9ydGVkLnZhbHVlICYmIFwicmVxdWVzdFBlcm1pc3Npb25cIiBpbiBEZXZpY2VNb3Rpb25FdmVudCAmJiB0eXBlb2YgRGV2aWNlTW90aW9uRXZlbnQucmVxdWVzdFBlcm1pc3Npb24gPT09IFwiZnVuY3Rpb25cIik7XG5cdGNvbnN0IHBlcm1pc3Npb25HcmFudGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGFjY2VsZXJhdGlvbiA9IHJlZih7XG5cdFx0eDogbnVsbCxcblx0XHR5OiBudWxsLFxuXHRcdHo6IG51bGxcblx0fSk7XG5cdGNvbnN0IHJvdGF0aW9uUmF0ZSA9IHJlZih7XG5cdFx0YWxwaGE6IG51bGwsXG5cdFx0YmV0YTogbnVsbCxcblx0XHRnYW1tYTogbnVsbFxuXHR9KTtcblx0Y29uc3QgaW50ZXJ2YWwgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5ID0gcmVmKHtcblx0XHR4OiBudWxsLFxuXHRcdHk6IG51bGwsXG5cdFx0ejogbnVsbFxuXHR9KTtcblx0ZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRpZiAod2luZG93JDEpIHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZGV2aWNlbW90aW9uXCIsIGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsIChldmVudCkgPT4ge1xuXHRcdFx0dmFyIF9ldmVudCRhY2NlbGVyYXRpb24sIF9ldmVudCRhY2NlbGVyYXRpb24yLCBfZXZlbnQkYWNjZWxlcmF0aW9uMywgX2V2ZW50JGFjY2VsZXJhdGlvbkluLCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4yLCBfZXZlbnQkYWNjZWxlcmF0aW9uSW4zLCBfZXZlbnQkcm90YXRpb25SYXRlLCBfZXZlbnQkcm90YXRpb25SYXRlMiwgX2V2ZW50JHJvdGF0aW9uUmF0ZTM7XG5cdFx0XHRhY2NlbGVyYXRpb24udmFsdWUgPSB7XG5cdFx0XHRcdHg6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbiA9IGV2ZW50LmFjY2VsZXJhdGlvbikgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbi54KSB8fCBudWxsLFxuXHRcdFx0XHR5OiAoKF9ldmVudCRhY2NlbGVyYXRpb24yID0gZXZlbnQuYWNjZWxlcmF0aW9uKSA9PT0gbnVsbCB8fCBfZXZlbnQkYWNjZWxlcmF0aW9uMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbjIueSkgfHwgbnVsbCxcblx0XHRcdFx0ejogKChfZXZlbnQkYWNjZWxlcmF0aW9uMyA9IGV2ZW50LmFjY2VsZXJhdGlvbikgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbjMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRhY2NlbGVyYXRpb24zLnopIHx8IG51bGxcblx0XHRcdH07XG5cdFx0XHRhY2NlbGVyYXRpb25JbmNsdWRpbmdHcmF2aXR5LnZhbHVlID0ge1xuXHRcdFx0XHR4OiAoKF9ldmVudCRhY2NlbGVyYXRpb25JbiA9IGV2ZW50LmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkpID09PSBudWxsIHx8IF9ldmVudCRhY2NlbGVyYXRpb25JbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbkluLngpIHx8IG51bGwsXG5cdFx0XHRcdHk6ICgoX2V2ZW50JGFjY2VsZXJhdGlvbkluMiA9IGV2ZW50LmFjY2VsZXJhdGlvbkluY2x1ZGluZ0dyYXZpdHkpID09PSBudWxsIHx8IF9ldmVudCRhY2NlbGVyYXRpb25JbjIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRhY2NlbGVyYXRpb25JbjIueSkgfHwgbnVsbCxcblx0XHRcdFx0ejogKChfZXZlbnQkYWNjZWxlcmF0aW9uSW4zID0gZXZlbnQuYWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSkgPT09IG51bGwgfHwgX2V2ZW50JGFjY2VsZXJhdGlvbkluMyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JGFjY2VsZXJhdGlvbkluMy56KSB8fCBudWxsXG5cdFx0XHR9O1xuXHRcdFx0cm90YXRpb25SYXRlLnZhbHVlID0ge1xuXHRcdFx0XHRhbHBoYTogKChfZXZlbnQkcm90YXRpb25SYXRlID0gZXZlbnQucm90YXRpb25SYXRlKSA9PT0gbnVsbCB8fCBfZXZlbnQkcm90YXRpb25SYXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkcm90YXRpb25SYXRlLmFscGhhKSB8fCBudWxsLFxuXHRcdFx0XHRiZXRhOiAoKF9ldmVudCRyb3RhdGlvblJhdGUyID0gZXZlbnQucm90YXRpb25SYXRlKSA9PT0gbnVsbCB8fCBfZXZlbnQkcm90YXRpb25SYXRlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2V2ZW50JHJvdGF0aW9uUmF0ZTIuYmV0YSkgfHwgbnVsbCxcblx0XHRcdFx0Z2FtbWE6ICgoX2V2ZW50JHJvdGF0aW9uUmF0ZTMgPSBldmVudC5yb3RhdGlvblJhdGUpID09PSBudWxsIHx8IF9ldmVudCRyb3RhdGlvblJhdGUzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkcm90YXRpb25SYXRlMy5nYW1tYSkgfHwgbnVsbFxuXHRcdFx0fTtcblx0XHRcdGludGVydmFsLnZhbHVlID0gZXZlbnQuaW50ZXJ2YWw7XG5cdFx0fSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fVxuXHRjb25zdCBlbnN1cmVQZXJtaXNzaW9ucyA9IGFzeW5jICgpID0+IHtcblx0XHRpZiAoIXJlcXVpcmVQZXJtaXNzaW9ucy52YWx1ZSkgcGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSB0cnVlO1xuXHRcdGlmIChwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChyZXF1aXJlUGVybWlzc2lvbnMudmFsdWUpIHtcblx0XHRcdGNvbnN0IHJlcXVlc3RQZXJtaXNzaW9uID0gRGV2aWNlTW90aW9uRXZlbnQucmVxdWVzdFBlcm1pc3Npb247XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoYXdhaXQgcmVxdWVzdFBlcm1pc3Npb24oKSA9PT0gXCJncmFudGVkXCIpIHtcblx0XHRcdFx0XHRwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0XHRcdFx0aW5pdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgaWYgKHJlcXVlc3RQZXJtaXNzaW9ucyAmJiByZXF1aXJlUGVybWlzc2lvbnMudmFsdWUpIGVuc3VyZVBlcm1pc3Npb25zKCkudGhlbigoKSA9PiBpbml0KCkpO1xuXHRlbHNlIGluaXQoKTtcblx0cmV0dXJuIHtcblx0XHRhY2NlbGVyYXRpb24sXG5cdFx0YWNjZWxlcmF0aW9uSW5jbHVkaW5nR3Jhdml0eSxcblx0XHRyb3RhdGlvblJhdGUsXG5cdFx0aW50ZXJ2YWwsXG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0cmVxdWlyZVBlcm1pc3Npb25zLFxuXHRcdGVuc3VyZVBlcm1pc3Npb25zLFxuXHRcdHBlcm1pc3Npb25HcmFudGVkXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZU9yaWVudGF0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgRGV2aWNlT3JpZW50YXRpb25FdmVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlRGV2aWNlT3JpZW50YXRpb25cbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VPcmllbnRhdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiRGV2aWNlT3JpZW50YXRpb25FdmVudFwiIGluIHdpbmRvdyQxKTtcblx0Y29uc3QgaXNBYnNvbHV0ZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBhbHBoYSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGJldGEgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBnYW1tYSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGlmICh3aW5kb3ckMSAmJiBpc1N1cHBvcnRlZC52YWx1ZSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJkZXZpY2VvcmllbnRhdGlvblwiLCAoZXZlbnQpID0+IHtcblx0XHRpc0Fic29sdXRlLnZhbHVlID0gZXZlbnQuYWJzb2x1dGU7XG5cdFx0YWxwaGEudmFsdWUgPSBldmVudC5hbHBoYTtcblx0XHRiZXRhLnZhbHVlID0gZXZlbnQuYmV0YTtcblx0XHRnYW1tYS52YWx1ZSA9IGV2ZW50LmdhbW1hO1xuXHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNBYnNvbHV0ZSxcblx0XHRhbHBoYSxcblx0XHRiZXRhLFxuXHRcdGdhbW1hXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZVBpeGVsUmF0aW8vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIGB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb2AuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURldmljZVBpeGVsUmF0aW9cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEZXZpY2VQaXhlbFJhdGlvKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBwaXhlbFJhdGlvID0gc2hhbGxvd1JlZigxKTtcblx0Y29uc3QgcXVlcnkgPSB1c2VNZWRpYVF1ZXJ5KCgpID0+IGAocmVzb2x1dGlvbjogJHtwaXhlbFJhdGlvLnZhbHVlfWRwcHgpYCwgb3B0aW9ucyk7XG5cdGxldCBzdG9wID0gbm9vcDtcblx0aWYgKHdpbmRvdyQxKSBzdG9wID0gd2F0Y2hJbW1lZGlhdGUocXVlcnksICgpID0+IHBpeGVsUmF0aW8udmFsdWUgPSB3aW5kb3ckMS5kZXZpY2VQaXhlbFJhdGlvKTtcblx0cmV0dXJuIHtcblx0XHRwaXhlbFJhdGlvOiByZWFkb25seShwaXhlbFJhdGlvKSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURldmljZXNMaXN0L2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYGVudW1lcmF0ZURldmljZXNgIGxpc3RpbmcgYXZhaWxhYmxlIGlucHV0L291dHB1dCBkZXZpY2VzXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURldmljZXNMaXN0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRGV2aWNlc0xpc3Qob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIHJlcXVlc3RQZXJtaXNzaW9ucyA9IGZhbHNlLCBjb25zdHJhaW50cyA9IHtcblx0XHRhdWRpbzogdHJ1ZSxcblx0XHR2aWRlbzogdHJ1ZVxuXHR9LCBvblVwZGF0ZWQ6IG9uVXBkYXRlZCQxIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkZXZpY2VzID0gcmVmKFtdKTtcblx0Y29uc3QgdmlkZW9JbnB1dHMgPSBjb21wdXRlZCgoKSA9PiBkZXZpY2VzLnZhbHVlLmZpbHRlcigoaSkgPT4gaS5raW5kID09PSBcInZpZGVvaW5wdXRcIikpO1xuXHRjb25zdCBhdWRpb0lucHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwiYXVkaW9pbnB1dFwiKSk7XG5cdGNvbnN0IGF1ZGlvT3V0cHV0cyA9IGNvbXB1dGVkKCgpID0+IGRldmljZXMudmFsdWUuZmlsdGVyKChpKSA9PiBpLmtpbmQgPT09IFwiYXVkaW9vdXRwdXRcIikpO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKTtcblx0Y29uc3QgcGVybWlzc2lvbkdyYW50ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0bGV0IHN0cmVhbTtcblx0YXN5bmMgZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUpIHJldHVybjtcblx0XHRkZXZpY2VzLnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKTtcblx0XHRvblVwZGF0ZWQkMSA9PT0gbnVsbCB8fCBvblVwZGF0ZWQkMSA9PT0gdm9pZCAwIHx8IG9uVXBkYXRlZCQxKGRldmljZXMudmFsdWUpO1xuXHRcdGlmIChzdHJlYW0pIHtcblx0XHRcdHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG5cdFx0XHRzdHJlYW0gPSBudWxsO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmdW5jdGlvbiBlbnN1cmVQZXJtaXNzaW9ucygpIHtcblx0XHRjb25zdCBkZXZpY2VOYW1lID0gY29uc3RyYWludHMudmlkZW8gPyBcImNhbWVyYVwiIDogXCJtaWNyb3Bob25lXCI7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuXHRcdGlmIChwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSkgcmV0dXJuIHRydWU7XG5cdFx0Y29uc3QgeyBzdGF0ZSwgcXVlcnkgfSA9IHVzZVBlcm1pc3Npb24oZGV2aWNlTmFtZSwgeyBjb250cm9sczogdHJ1ZSB9KTtcblx0XHRhd2FpdCBxdWVyeSgpO1xuXHRcdGlmIChzdGF0ZS52YWx1ZSAhPT0gXCJncmFudGVkXCIpIHtcblx0XHRcdGxldCBncmFudGVkID0gdHJ1ZTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGFsbERldmljZXMgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpO1xuXHRcdFx0XHRjb25zdCBoYXNDYW1lcmEgPSBhbGxEZXZpY2VzLnNvbWUoKGRldmljZSkgPT4gZGV2aWNlLmtpbmQgPT09IFwidmlkZW9pbnB1dFwiKTtcblx0XHRcdFx0Y29uc3QgaGFzTWljcm9waG9uZSA9IGFsbERldmljZXMuc29tZSgoZGV2aWNlKSA9PiBkZXZpY2Uua2luZCA9PT0gXCJhdWRpb2lucHV0XCIgfHwgZGV2aWNlLmtpbmQgPT09IFwiYXVkaW9vdXRwdXRcIik7XG5cdFx0XHRcdGNvbnN0cmFpbnRzLnZpZGVvID0gaGFzQ2FtZXJhID8gY29uc3RyYWludHMudmlkZW8gOiBmYWxzZTtcblx0XHRcdFx0Y29uc3RyYWludHMuYXVkaW8gPSBoYXNNaWNyb3Bob25lID8gY29uc3RyYWludHMuYXVkaW8gOiBmYWxzZTtcblx0XHRcdFx0c3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShjb25zdHJhaW50cyk7XG5cdFx0XHR9IGNhdGNoIChfdW51c2VkKSB7XG5cdFx0XHRcdHN0cmVhbSA9IG51bGw7XG5cdFx0XHRcdGdyYW50ZWQgPSBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHVwZGF0ZSgpO1xuXHRcdFx0cGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSBncmFudGVkO1xuXHRcdH0gZWxzZSBwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0cmV0dXJuIHBlcm1pc3Npb25HcmFudGVkLnZhbHVlO1xuXHR9XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGlmIChyZXF1ZXN0UGVybWlzc2lvbnMpIGVuc3VyZVBlcm1pc3Npb25zKCk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMsIFwiZGV2aWNlY2hhbmdlXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRcdHVwZGF0ZSgpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0ZGV2aWNlcyxcblx0XHRlbnN1cmVQZXJtaXNzaW9ucyxcblx0XHRwZXJtaXNzaW9uR3JhbnRlZCxcblx0XHR2aWRlb0lucHV0cyxcblx0XHRhdWRpb0lucHV0cyxcblx0XHRhdWRpb091dHB1dHMsXG5cdFx0aXNTdXBwb3J0ZWRcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRGlzcGxheU1lZGlhL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgYG1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWFgIHN0cmVhbWluZ1xuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEaXNwbGF5TWVkaWFcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VEaXNwbGF5TWVkaWEob3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRlbmFibGVkO1xuXHRjb25zdCBlbmFibGVkID0gc2hhbGxvd1JlZigoX29wdGlvbnMkZW5hYmxlZCA9IG9wdGlvbnMuZW5hYmxlZCkgIT09IG51bGwgJiYgX29wdGlvbnMkZW5hYmxlZCAhPT0gdm9pZCAwID8gX29wdGlvbnMkZW5hYmxlZCA6IGZhbHNlKTtcblx0Y29uc3QgdmlkZW8gPSBvcHRpb25zLnZpZGVvO1xuXHRjb25zdCBhdWRpbyA9IG9wdGlvbnMuYXVkaW87XG5cdGNvbnN0IHsgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB7XG5cdFx0dmFyIF9uYXZpZ2F0b3IkbWVkaWFEZXZpYztcblx0XHRyZXR1cm4gbmF2aWdhdG9yJDEgPT09IG51bGwgfHwgbmF2aWdhdG9yJDEgPT09IHZvaWQgMCB8fCAoX25hdmlnYXRvciRtZWRpYURldmljID0gbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzKSA9PT0gbnVsbCB8fCBfbmF2aWdhdG9yJG1lZGlhRGV2aWMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9uYXZpZ2F0b3IkbWVkaWFEZXZpYy5nZXREaXNwbGF5TWVkaWE7XG5cdH0pO1xuXHRjb25zdCBjb25zdHJhaW50ID0ge1xuXHRcdGF1ZGlvLFxuXHRcdHZpZGVvXG5cdH07XG5cdGNvbnN0IHN0cmVhbSA9IHNoYWxsb3dSZWYoKTtcblx0YXN5bmMgZnVuY3Rpb24gX3N0YXJ0KCkge1xuXHRcdHZhciBfc3RyZWFtJHZhbHVlO1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgc3RyZWFtLnZhbHVlKSByZXR1cm47XG5cdFx0c3RyZWFtLnZhbHVlID0gYXdhaXQgbmF2aWdhdG9yJDEubWVkaWFEZXZpY2VzLmdldERpc3BsYXlNZWRpYShjb25zdHJhaW50KTtcblx0XHQoX3N0cmVhbSR2YWx1ZSA9IHN0cmVhbS52YWx1ZSkgPT09IG51bGwgfHwgX3N0cmVhbSR2YWx1ZSA9PT0gdm9pZCAwIHx8IF9zdHJlYW0kdmFsdWUuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdXNlRXZlbnRMaXN0ZW5lcih0LCBcImVuZGVkXCIsIHN0b3AsIHsgcGFzc2l2ZTogdHJ1ZSB9KSk7XG5cdFx0cmV0dXJuIHN0cmVhbS52YWx1ZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBfc3RvcCgpIHtcblx0XHR2YXIgX3N0cmVhbSR2YWx1ZTI7XG5cdFx0KF9zdHJlYW0kdmFsdWUyID0gc3RyZWFtLnZhbHVlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJHZhbHVlMiA9PT0gdm9pZCAwIHx8IF9zdHJlYW0kdmFsdWUyLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcblx0XHRzdHJlYW0udmFsdWUgPSB2b2lkIDA7XG5cdH1cblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRfc3RvcCgpO1xuXHRcdGVuYWJsZWQudmFsdWUgPSBmYWxzZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBzdGFydCgpIHtcblx0XHRhd2FpdCBfc3RhcnQoKTtcblx0XHRpZiAoc3RyZWFtLnZhbHVlKSBlbmFibGVkLnZhbHVlID0gdHJ1ZTtcblx0XHRyZXR1cm4gc3RyZWFtLnZhbHVlO1xuXHR9XG5cdHdhdGNoKGVuYWJsZWQsICh2KSA9PiB7XG5cdFx0aWYgKHYpIF9zdGFydCgpO1xuXHRcdGVsc2UgX3N0b3AoKTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RyZWFtLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3AsXG5cdFx0ZW5hYmxlZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VEb2N1bWVudFZpc2liaWxpdHkvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIGBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVgLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VEb2N1bWVudFZpc2liaWxpdHlcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VEb2N1bWVudFZpc2liaWxpdHkob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IG9wdGlvbnM7XG5cdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuIHNoYWxsb3dSZWYoXCJ2aXNpYmxlXCIpO1xuXHRjb25zdCB2aXNpYmlsaXR5ID0gc2hhbGxvd1JlZihkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsICgpID0+IHtcblx0XHR2aXNpYmlsaXR5LnZhbHVlID0gZG9jdW1lbnQkMS52aXNpYmlsaXR5U3RhdGU7XG5cdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHZpc2liaWxpdHk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZURyYWdnYWJsZS9pbmRleC50c1xuY29uc3QgZGVmYXVsdFNjcm9sbENvbmZpZyA9IHtcblx0c3BlZWQ6IDIsXG5cdG1hcmdpbjogMzAsXG5cdGRpcmVjdGlvbjogXCJib3RoXCJcbn07XG5mdW5jdGlvbiBjbGFtcENvbnRhaW5lclNjcm9sbChjb250YWluZXIpIHtcblx0aWYgKGNvbnRhaW5lci5zY3JvbGxMZWZ0ID4gY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gY29udGFpbmVyLmNsaWVudFdpZHRoKSBjb250YWluZXIuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lci5zY3JvbGxXaWR0aCAtIGNvbnRhaW5lci5jbGllbnRXaWR0aCk7XG5cdGlmIChjb250YWluZXIuc2Nyb2xsVG9wID4gY29udGFpbmVyLnNjcm9sbEhlaWdodCAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQpIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLmNsaWVudEhlaWdodCk7XG59XG4vKipcbiogTWFrZSBlbGVtZW50cyBkcmFnZ2FibGUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZURyYWdnYWJsZVxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlRHJhZ2dhYmxlKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfdG9WYWx1ZSwgX3RvVmFsdWUyLCBfdG9WYWx1ZTMsIF9zY3JvbGxDb25maWckZGlyZWN0aTtcblx0Y29uc3QgeyBwb2ludGVyVHlwZXMsIHByZXZlbnREZWZhdWx0OiBwcmV2ZW50RGVmYXVsdCQxLCBzdG9wUHJvcGFnYXRpb24sIGV4YWN0LCBvbk1vdmUsIG9uRW5kLCBvblN0YXJ0LCBpbml0aWFsVmFsdWUsIGF4aXMgPSBcImJvdGhcIiwgZHJhZ2dpbmdFbGVtZW50ID0gZGVmYXVsdFdpbmRvdywgY29udGFpbmVyRWxlbWVudCwgaGFuZGxlOiBkcmFnZ2luZ0hhbmRsZSA9IHRhcmdldCwgYnV0dG9ucyA9IFswXSwgcmVzdHJpY3RJblZpZXcsIGF1dG9TY3JvbGwgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgcG9zaXRpb24gPSByZWYoKF90b1ZhbHVlID0gdG9WYWx1ZShpbml0aWFsVmFsdWUpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZSAhPT0gdm9pZCAwID8gX3RvVmFsdWUgOiB7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCBwcmVzc2VkRGVsdGEgPSByZWYoKTtcblx0Y29uc3QgZmlsdGVyRXZlbnQgPSAoZSkgPT4ge1xuXHRcdGlmIChwb2ludGVyVHlwZXMpIHJldHVybiBwb2ludGVyVHlwZXMuaW5jbHVkZXMoZS5wb2ludGVyVHlwZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IGhhbmRsZUV2ZW50ID0gKGUpID0+IHtcblx0XHRpZiAodG9WYWx1ZShwcmV2ZW50RGVmYXVsdCQxKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGlmICh0b1ZhbHVlKHN0b3BQcm9wYWdhdGlvbikpIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH07XG5cdGNvbnN0IHNjcm9sbENvbmZpZyA9IHRvVmFsdWUoYXV0b1Njcm9sbCk7XG5cdGNvbnN0IHNjcm9sbFNldHRpbmdzID0gdHlwZW9mIHNjcm9sbENvbmZpZyA9PT0gXCJvYmplY3RcIiA/IHtcblx0XHRzcGVlZDogKF90b1ZhbHVlMiA9IHRvVmFsdWUoc2Nyb2xsQ29uZmlnLnNwZWVkKSkgIT09IG51bGwgJiYgX3RvVmFsdWUyICE9PSB2b2lkIDAgPyBfdG9WYWx1ZTIgOiBkZWZhdWx0U2Nyb2xsQ29uZmlnLnNwZWVkLFxuXHRcdG1hcmdpbjogKF90b1ZhbHVlMyA9IHRvVmFsdWUoc2Nyb2xsQ29uZmlnLm1hcmdpbikpICE9PSBudWxsICYmIF90b1ZhbHVlMyAhPT0gdm9pZCAwID8gX3RvVmFsdWUzIDogZGVmYXVsdFNjcm9sbENvbmZpZy5tYXJnaW4sXG5cdFx0ZGlyZWN0aW9uOiAoX3Njcm9sbENvbmZpZyRkaXJlY3RpID0gc2Nyb2xsQ29uZmlnLmRpcmVjdGlvbikgIT09IG51bGwgJiYgX3Njcm9sbENvbmZpZyRkaXJlY3RpICE9PSB2b2lkIDAgPyBfc2Nyb2xsQ29uZmlnJGRpcmVjdGkgOiBkZWZhdWx0U2Nyb2xsQ29uZmlnLmRpcmVjdGlvblxuXHR9IDogZGVmYXVsdFNjcm9sbENvbmZpZztcblx0Y29uc3QgZ2V0U2Nyb2xsQXhpc1ZhbHVlcyA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gW3ZhbHVlLCB2YWx1ZV0gOiBbdmFsdWUueCwgdmFsdWUueV07XG5cdGNvbnN0IGhhbmRsZUF1dG9TY3JvbGwgPSAoY29udGFpbmVyLCB0YXJnZXRSZWN0LCBwb3NpdGlvbiQxKSA9PiB7XG5cdFx0Y29uc3QgeyBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0LCBzY3JvbGxMZWZ0LCBzY3JvbGxUb3AsIHNjcm9sbFdpZHRoLCBzY3JvbGxIZWlnaHQgfSA9IGNvbnRhaW5lcjtcblx0XHRjb25zdCBbbWFyZ2luWCwgbWFyZ2luWV0gPSBnZXRTY3JvbGxBeGlzVmFsdWVzKHNjcm9sbFNldHRpbmdzLm1hcmdpbik7XG5cdFx0Y29uc3QgW3NwZWVkWCwgc3BlZWRZXSA9IGdldFNjcm9sbEF4aXNWYWx1ZXMoc2Nyb2xsU2V0dGluZ3Muc3BlZWQpO1xuXHRcdGxldCBkZWx0YVggPSAwO1xuXHRcdGxldCBkZWx0YVkgPSAwO1xuXHRcdGlmIChzY3JvbGxTZXR0aW5ncy5kaXJlY3Rpb24gPT09IFwieFwiIHx8IHNjcm9sbFNldHRpbmdzLmRpcmVjdGlvbiA9PT0gXCJib3RoXCIpIHtcblx0XHRcdGlmIChwb3NpdGlvbiQxLnggPCBtYXJnaW5YICYmIHNjcm9sbExlZnQgPiAwKSBkZWx0YVggPSAtc3BlZWRYO1xuXHRcdFx0ZWxzZSBpZiAocG9zaXRpb24kMS54ICsgdGFyZ2V0UmVjdC53aWR0aCA+IGNsaWVudFdpZHRoIC0gbWFyZ2luWCAmJiBzY3JvbGxMZWZ0IDwgc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkgZGVsdGFYID0gc3BlZWRYO1xuXHRcdH1cblx0XHRpZiAoc2Nyb2xsU2V0dGluZ3MuZGlyZWN0aW9uID09PSBcInlcIiB8fCBzY3JvbGxTZXR0aW5ncy5kaXJlY3Rpb24gPT09IFwiYm90aFwiKSB7XG5cdFx0XHRpZiAocG9zaXRpb24kMS55IDwgbWFyZ2luWSAmJiBzY3JvbGxUb3AgPiAwKSBkZWx0YVkgPSAtc3BlZWRZO1xuXHRcdFx0ZWxzZSBpZiAocG9zaXRpb24kMS55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgPiBjbGllbnRIZWlnaHQgLSBtYXJnaW5ZICYmIHNjcm9sbFRvcCA8IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodCkgZGVsdGFZID0gc3BlZWRZO1xuXHRcdH1cblx0XHRpZiAoZGVsdGFYIHx8IGRlbHRhWSkgY29udGFpbmVyLnNjcm9sbEJ5KHtcblx0XHRcdGxlZnQ6IGRlbHRhWCxcblx0XHRcdHRvcDogZGVsdGFZLFxuXHRcdFx0YmVoYXZpb3I6IFwiYXV0b1wiXG5cdFx0fSk7XG5cdH07XG5cdGxldCBhdXRvU2Nyb2xsSW50ZXJ2YWwgPSBudWxsO1xuXHRjb25zdCBzdGFydEF1dG9TY3JvbGwgPSAoKSA9PiB7XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcblx0XHRpZiAoY29udGFpbmVyICYmICFhdXRvU2Nyb2xsSW50ZXJ2YWwpIGF1dG9TY3JvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdGNvbnN0IHRhcmdldFJlY3QgPSB0b1ZhbHVlKHRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRjb25zdCB7IHgsIHkgfSA9IHBvc2l0aW9uLnZhbHVlO1xuXHRcdFx0Y29uc3QgcmVsYXRpdmVQb3NpdGlvbiA9IHtcblx0XHRcdFx0eDogeCAtIGNvbnRhaW5lci5zY3JvbGxMZWZ0LFxuXHRcdFx0XHR5OiB5IC0gY29udGFpbmVyLnNjcm9sbFRvcFxuXHRcdFx0fTtcblx0XHRcdGlmIChyZWxhdGl2ZVBvc2l0aW9uLnggPj0gMCAmJiByZWxhdGl2ZVBvc2l0aW9uLnkgPj0gMCkge1xuXHRcdFx0XHRoYW5kbGVBdXRvU2Nyb2xsKGNvbnRhaW5lciwgdGFyZ2V0UmVjdCwgcmVsYXRpdmVQb3NpdGlvbik7XG5cdFx0XHRcdHJlbGF0aXZlUG9zaXRpb24ueCArPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdFx0cmVsYXRpdmVQb3NpdGlvbi55ICs9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG5cdFx0XHRcdHBvc2l0aW9uLnZhbHVlID0gcmVsYXRpdmVQb3NpdGlvbjtcblx0XHRcdH1cblx0XHR9LCAxZTMgLyA2MCk7XG5cdH07XG5cdGNvbnN0IHN0b3BBdXRvU2Nyb2xsID0gKCkgPT4ge1xuXHRcdGlmIChhdXRvU2Nyb2xsSW50ZXJ2YWwpIHtcblx0XHRcdGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbEludGVydmFsKTtcblx0XHRcdGF1dG9TY3JvbGxJbnRlcnZhbCA9IG51bGw7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBpc1BvaW50ZXJOZWFyRWRnZSA9IChwb2ludGVyLCBjb250YWluZXIsIG1hcmdpbiwgdGFyZ2V0UmVjdCkgPT4ge1xuXHRcdGNvbnN0IFttYXJnaW5YLCBtYXJnaW5ZXSA9IHR5cGVvZiBtYXJnaW4gPT09IFwibnVtYmVyXCIgPyBbbWFyZ2luLCBtYXJnaW5dIDogW21hcmdpbi54LCBtYXJnaW4ueV07XG5cdFx0Y29uc3QgeyBjbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXI7XG5cdFx0cmV0dXJuIHBvaW50ZXIueCA8IG1hcmdpblggfHwgcG9pbnRlci54ICsgdGFyZ2V0UmVjdC53aWR0aCA+IGNsaWVudFdpZHRoIC0gbWFyZ2luWCB8fCBwb2ludGVyLnkgPCBtYXJnaW5ZIHx8IHBvaW50ZXIueSArIHRhcmdldFJlY3QuaGVpZ2h0ID4gY2xpZW50SGVpZ2h0IC0gbWFyZ2luWTtcblx0fTtcblx0Y29uc3QgY2hlY2tBdXRvU2Nyb2xsID0gKCkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpIHx8ICFwcmVzc2VkRGVsdGEudmFsdWUpIHJldHVybjtcblx0XHRjb25zdCBjb250YWluZXIgPSB0b1ZhbHVlKGNvbnRhaW5lckVsZW1lbnQpO1xuXHRcdGlmICghY29udGFpbmVyKSByZXR1cm47XG5cdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRjb25zdCB7IHgsIHkgfSA9IHBvc2l0aW9uLnZhbHVlO1xuXHRcdGlmIChpc1BvaW50ZXJOZWFyRWRnZSh7XG5cdFx0XHR4OiB4IC0gY29udGFpbmVyLnNjcm9sbExlZnQsXG5cdFx0XHR5OiB5IC0gY29udGFpbmVyLnNjcm9sbFRvcFxuXHRcdH0sIGNvbnRhaW5lciwgc2Nyb2xsU2V0dGluZ3MubWFyZ2luLCB0YXJnZXRSZWN0KSkgc3RhcnRBdXRvU2Nyb2xsKCk7XG5cdFx0ZWxzZSBzdG9wQXV0b1Njcm9sbCgpO1xuXHR9O1xuXHRpZiAodG9WYWx1ZShhdXRvU2Nyb2xsKSkgd2F0Y2gocG9zaXRpb24sIGNoZWNrQXV0b1Njcm9sbCk7XG5cdGNvbnN0IHN0YXJ0ID0gKGUpID0+IHtcblx0XHR2YXIgX2NvbnRhaW5lciRnZXRCb3VuZGluO1xuXHRcdGlmICghdG9WYWx1ZShidXR0b25zKS5pbmNsdWRlcyhlLmJ1dHRvbikpIHJldHVybjtcblx0XHRpZiAodG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSB8fCAhZmlsdGVyRXZlbnQoZSkpIHJldHVybjtcblx0XHRpZiAodG9WYWx1ZShleGFjdCkgJiYgZS50YXJnZXQgIT09IHRvVmFsdWUodGFyZ2V0KSkgcmV0dXJuO1xuXHRcdGNvbnN0IGNvbnRhaW5lciA9IHRvVmFsdWUoY29udGFpbmVyRWxlbWVudCk7XG5cdFx0Y29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lciA9PT0gbnVsbCB8fCBjb250YWluZXIgPT09IHZvaWQgMCB8fCAoX2NvbnRhaW5lciRnZXRCb3VuZGluID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgPT09IG51bGwgfHwgX2NvbnRhaW5lciRnZXRCb3VuZGluID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGFpbmVyJGdldEJvdW5kaW4uY2FsbChjb250YWluZXIpO1xuXHRcdGNvbnN0IHRhcmdldFJlY3QgPSB0b1ZhbHVlKHRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0Y29uc3QgcG9zID0ge1xuXHRcdFx0eDogZS5jbGllbnRYIC0gKGNvbnRhaW5lciA/IHRhcmdldFJlY3QubGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdCArIChhdXRvU2Nyb2xsID8gMCA6IGNvbnRhaW5lci5zY3JvbGxMZWZ0KSA6IHRhcmdldFJlY3QubGVmdCksXG5cdFx0XHR5OiBlLmNsaWVudFkgLSAoY29udGFpbmVyID8gdGFyZ2V0UmVjdC50b3AgLSBjb250YWluZXJSZWN0LnRvcCArIChhdXRvU2Nyb2xsID8gMCA6IGNvbnRhaW5lci5zY3JvbGxUb3ApIDogdGFyZ2V0UmVjdC50b3ApXG5cdFx0fTtcblx0XHRpZiAoKG9uU3RhcnQgPT09IG51bGwgfHwgb25TdGFydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TdGFydChwb3MsIGUpKSA9PT0gZmFsc2UpIHJldHVybjtcblx0XHRwcmVzc2VkRGVsdGEudmFsdWUgPSBwb3M7XG5cdFx0aGFuZGxlRXZlbnQoZSk7XG5cdH07XG5cdGNvbnN0IG1vdmUgPSAoZSkgPT4ge1xuXHRcdGlmICh0b1ZhbHVlKG9wdGlvbnMuZGlzYWJsZWQpIHx8ICFmaWx0ZXJFdmVudChlKSkgcmV0dXJuO1xuXHRcdGlmICghcHJlc3NlZERlbHRhLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgY29udGFpbmVyID0gdG9WYWx1ZShjb250YWluZXJFbGVtZW50KTtcblx0XHRpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIGNsYW1wQ29udGFpbmVyU2Nyb2xsKGNvbnRhaW5lcik7XG5cdFx0Y29uc3QgdGFyZ2V0UmVjdCA9IHRvVmFsdWUodGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRsZXQgeyB4LCB5IH0gPSBwb3NpdGlvbi52YWx1ZTtcblx0XHRpZiAoYXhpcyA9PT0gXCJ4XCIgfHwgYXhpcyA9PT0gXCJib3RoXCIpIHtcblx0XHRcdHggPSBlLmNsaWVudFggLSBwcmVzc2VkRGVsdGEudmFsdWUueDtcblx0XHRcdGlmIChjb250YWluZXIpIHggPSBNYXRoLm1pbihNYXRoLm1heCgwLCB4KSwgY29udGFpbmVyLnNjcm9sbFdpZHRoIC0gdGFyZ2V0UmVjdC53aWR0aCk7XG5cdFx0fVxuXHRcdGlmIChheGlzID09PSBcInlcIiB8fCBheGlzID09PSBcImJvdGhcIikge1xuXHRcdFx0eSA9IGUuY2xpZW50WSAtIHByZXNzZWREZWx0YS52YWx1ZS55O1xuXHRcdFx0aWYgKGNvbnRhaW5lcikgeSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHkpLCBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gdGFyZ2V0UmVjdC5oZWlnaHQpO1xuXHRcdH1cblx0XHRpZiAodG9WYWx1ZShhdXRvU2Nyb2xsKSAmJiBjb250YWluZXIpIHtcblx0XHRcdGlmIChhdXRvU2Nyb2xsSW50ZXJ2YWwgPT09IG51bGwpIGhhbmRsZUF1dG9TY3JvbGwoY29udGFpbmVyLCB0YXJnZXRSZWN0LCB7XG5cdFx0XHRcdHgsXG5cdFx0XHRcdHlcblx0XHRcdH0pO1xuXHRcdFx0eCArPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcblx0XHRcdHkgKz0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHR9XG5cdFx0aWYgKGNvbnRhaW5lciAmJiAocmVzdHJpY3RJblZpZXcgfHwgYXV0b1Njcm9sbCkpIHtcblx0XHRcdGlmIChheGlzICE9PSBcInlcIikge1xuXHRcdFx0XHRjb25zdCByZWxhdGl2ZVggPSB4IC0gY29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0XHRcdGlmIChyZWxhdGl2ZVggPCAwKSB4ID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0XHRcdGVsc2UgaWYgKHJlbGF0aXZlWCA+IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHRhcmdldFJlY3Qud2lkdGgpIHggPSBjb250YWluZXIuY2xpZW50V2lkdGggLSB0YXJnZXRSZWN0LndpZHRoICsgY29udGFpbmVyLnNjcm9sbExlZnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoYXhpcyAhPT0gXCJ4XCIpIHtcblx0XHRcdFx0Y29uc3QgcmVsYXRpdmVZID0geSAtIGNvbnRhaW5lci5zY3JvbGxUb3A7XG5cdFx0XHRcdGlmIChyZWxhdGl2ZVkgPCAwKSB5ID0gY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdFx0ZWxzZSBpZiAocmVsYXRpdmVZID4gY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHRhcmdldFJlY3QuaGVpZ2h0KSB5ID0gY29udGFpbmVyLmNsaWVudEhlaWdodCAtIHRhcmdldFJlY3QuaGVpZ2h0ICsgY29udGFpbmVyLnNjcm9sbFRvcDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cG9zaXRpb24udmFsdWUgPSB7XG5cdFx0XHR4LFxuXHRcdFx0eVxuXHRcdH07XG5cdFx0b25Nb3ZlID09PSBudWxsIHx8IG9uTW92ZSA9PT0gdm9pZCAwIHx8IG9uTW92ZShwb3NpdGlvbi52YWx1ZSwgZSk7XG5cdFx0aGFuZGxlRXZlbnQoZSk7XG5cdH07XG5cdGNvbnN0IGVuZCA9IChlKSA9PiB7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkgfHwgIWZpbHRlckV2ZW50KGUpKSByZXR1cm47XG5cdFx0aWYgKCFwcmVzc2VkRGVsdGEudmFsdWUpIHJldHVybjtcblx0XHRwcmVzc2VkRGVsdGEudmFsdWUgPSB2b2lkIDA7XG5cdFx0aWYgKGF1dG9TY3JvbGwpIHN0b3BBdXRvU2Nyb2xsKCk7XG5cdFx0b25FbmQgPT09IG51bGwgfHwgb25FbmQgPT09IHZvaWQgMCB8fCBvbkVuZChwb3NpdGlvbi52YWx1ZSwgZSk7XG5cdFx0aGFuZGxlRXZlbnQoZSk7XG5cdH07XG5cdGlmIChpc0NsaWVudCkge1xuXHRcdGNvbnN0IGNvbmZpZyA9ICgpID0+IHtcblx0XHRcdHZhciBfb3B0aW9ucyRjYXB0dXJlO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y2FwdHVyZTogKF9vcHRpb25zJGNhcHR1cmUgPSBvcHRpb25zLmNhcHR1cmUpICE9PSBudWxsICYmIF9vcHRpb25zJGNhcHR1cmUgIT09IHZvaWQgMCA/IF9vcHRpb25zJGNhcHR1cmUgOiB0cnVlLFxuXHRcdFx0XHRwYXNzaXZlOiAhdG9WYWx1ZShwcmV2ZW50RGVmYXVsdCQxKVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZHJhZ2dpbmdIYW5kbGUsIFwicG9pbnRlcmRvd25cIiwgc3RhcnQsIGNvbmZpZyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkcmFnZ2luZ0VsZW1lbnQsIFwicG9pbnRlcm1vdmVcIiwgbW92ZSwgY29uZmlnKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGRyYWdnaW5nRWxlbWVudCwgXCJwb2ludGVydXBcIiwgZW5kLCBjb25maWcpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0Li4udG9SZWZzKHBvc2l0aW9uKSxcblx0XHRwb3NpdGlvbixcblx0XHRpc0RyYWdnaW5nOiBjb21wdXRlZCgoKSA9PiAhIXByZXNzZWREZWx0YS52YWx1ZSksXG5cdFx0c3R5bGU6IGNvbXB1dGVkKCgpID0+IGBcbiAgICAgIGxlZnQ6ICR7cG9zaXRpb24udmFsdWUueH1weDtcbiAgICAgIHRvcDogJHtwb3NpdGlvbi52YWx1ZS55fXB4O1xuICAgICAgJHthdXRvU2Nyb2xsID8gXCJ0ZXh0LXdyYXA6IG5vd3JhcDtcIiA6IFwiXCJ9XG4gICAgYClcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRHJvcFpvbmUvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZURyb3Bab25lKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGlzT3ZlckRyb3Bab25lID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGZpbGVzID0gc2hhbGxvd1JlZihudWxsKTtcblx0bGV0IGNvdW50ZXIgPSAwO1xuXHRsZXQgaXNWYWxpZCA9IHRydWU7XG5cdGlmIChpc0NsaWVudCkge1xuXHRcdHZhciBfb3B0aW9ucyRtdWx0aXBsZSwgX29wdGlvbnMkcHJldmVudERlZmF1O1xuXHRcdGNvbnN0IF9vcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IHsgb25Ecm9wOiBvcHRpb25zIH0gOiBvcHRpb25zO1xuXHRcdGNvbnN0IG11bHRpcGxlID0gKF9vcHRpb25zJG11bHRpcGxlID0gX29wdGlvbnMubXVsdGlwbGUpICE9PSBudWxsICYmIF9vcHRpb25zJG11bHRpcGxlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRtdWx0aXBsZSA6IHRydWU7XG5cdFx0Y29uc3QgcHJldmVudERlZmF1bHRGb3JVbmhhbmRsZWQgPSAoX29wdGlvbnMkcHJldmVudERlZmF1ID0gX29wdGlvbnMucHJldmVudERlZmF1bHRGb3JVbmhhbmRsZWQpICE9PSBudWxsICYmIF9vcHRpb25zJHByZXZlbnREZWZhdSAhPT0gdm9pZCAwID8gX29wdGlvbnMkcHJldmVudERlZmF1IDogZmFsc2U7XG5cdFx0Y29uc3QgZ2V0RmlsZXMgPSAoZXZlbnQpID0+IHtcblx0XHRcdHZhciBfZXZlbnQkZGF0YVRyYW5zZmVyJGYsIF9ldmVudCRkYXRhVHJhbnNmZXI7XG5cdFx0XHRjb25zdCBsaXN0ID0gQXJyYXkuZnJvbSgoX2V2ZW50JGRhdGFUcmFuc2ZlciRmID0gKF9ldmVudCRkYXRhVHJhbnNmZXIgPSBldmVudC5kYXRhVHJhbnNmZXIpID09PSBudWxsIHx8IF9ldmVudCRkYXRhVHJhbnNmZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9ldmVudCRkYXRhVHJhbnNmZXIuZmlsZXMpICE9PSBudWxsICYmIF9ldmVudCRkYXRhVHJhbnNmZXIkZiAhPT0gdm9pZCAwID8gX2V2ZW50JGRhdGFUcmFuc2ZlciRmIDogW10pO1xuXHRcdFx0cmV0dXJuIGxpc3QubGVuZ3RoID09PSAwID8gbnVsbCA6IG11bHRpcGxlID8gbGlzdCA6IFtsaXN0WzBdXTtcblx0XHR9O1xuXHRcdGNvbnN0IGNoZWNrRGF0YVR5cGVzID0gKHR5cGVzKSA9PiB7XG5cdFx0XHRjb25zdCBkYXRhVHlwZXMgPSB1bnJlZihfb3B0aW9ucy5kYXRhVHlwZXMpO1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhVHlwZXMgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGRhdGFUeXBlcyh0eXBlcyk7XG5cdFx0XHRpZiAoIShkYXRhVHlwZXMgPT09IG51bGwgfHwgZGF0YVR5cGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkYXRhVHlwZXMubGVuZ3RoKSkgcmV0dXJuIHRydWU7XG5cdFx0XHRpZiAodHlwZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cdFx0XHRyZXR1cm4gdHlwZXMuZXZlcnkoKHR5cGUpID0+IGRhdGFUeXBlcy5zb21lKChhbGxvd2VkVHlwZSkgPT4gdHlwZS5pbmNsdWRlcyhhbGxvd2VkVHlwZSkpKTtcblx0XHR9O1xuXHRcdGNvbnN0IGNoZWNrVmFsaWRpdHkgPSAoaXRlbXMpID0+IHtcblx0XHRcdGlmIChfb3B0aW9ucy5jaGVja1ZhbGlkaXR5KSByZXR1cm4gX29wdGlvbnMuY2hlY2tWYWxpZGl0eShpdGVtcyk7XG5cdFx0XHRjb25zdCBkYXRhVHlwZXNWYWxpZCA9IGNoZWNrRGF0YVR5cGVzKEFycmF5LmZyb20oaXRlbXMgIT09IG51bGwgJiYgaXRlbXMgIT09IHZvaWQgMCA/IGl0ZW1zIDogW10pLm1hcCgoaXRlbSkgPT4gaXRlbS50eXBlKSk7XG5cdFx0XHRjb25zdCBtdWx0aXBsZUZpbGVzVmFsaWQgPSBtdWx0aXBsZSB8fCBpdGVtcy5sZW5ndGggPD0gMTtcblx0XHRcdHJldHVybiBkYXRhVHlwZXNWYWxpZCAmJiBtdWx0aXBsZUZpbGVzVmFsaWQ7XG5cdFx0fTtcblx0XHRjb25zdCBpc1NhZmFyaSA9ICgpID0+IC9eKD86KD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhKFwiY2hyb21lXCIgaW4gd2luZG93KTtcblx0XHRjb25zdCBoYW5kbGVEcmFnRXZlbnQgPSAoZXZlbnQsIGV2ZW50VHlwZSkgPT4ge1xuXHRcdFx0dmFyIF9ldmVudCRkYXRhVHJhbnNmZXIyLCBfcmVmO1xuXHRcdFx0Y29uc3QgZGF0YVRyYW5zZmVySXRlbUxpc3QgPSAoX2V2ZW50JGRhdGFUcmFuc2ZlcjIgPSBldmVudC5kYXRhVHJhbnNmZXIpID09PSBudWxsIHx8IF9ldmVudCRkYXRhVHJhbnNmZXIyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZXZlbnQkZGF0YVRyYW5zZmVyMi5pdGVtcztcblx0XHRcdGlzVmFsaWQgPSAoX3JlZiA9IGRhdGFUcmFuc2Zlckl0ZW1MaXN0ICYmIGNoZWNrVmFsaWRpdHkoZGF0YVRyYW5zZmVySXRlbUxpc3QpKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB2b2lkIDAgPyBfcmVmIDogZmFsc2U7XG5cdFx0XHRpZiAocHJldmVudERlZmF1bHRGb3JVbmhhbmRsZWQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRpZiAoIWlzU2FmYXJpKCkgJiYgIWlzVmFsaWQpIHtcblx0XHRcdFx0aWYgKGV2ZW50LmRhdGFUcmFuc2ZlcikgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcIm5vbmVcIjtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmIChldmVudC5kYXRhVHJhbnNmZXIpIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJjb3B5XCI7XG5cdFx0XHRjb25zdCBjdXJyZW50RmlsZXMgPSBnZXRGaWxlcyhldmVudCk7XG5cdFx0XHRzd2l0Y2ggKGV2ZW50VHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiZW50ZXJcIjpcblx0XHRcdFx0XHR2YXIgX29wdGlvbnMkb25FbnRlcjtcblx0XHRcdFx0XHRjb3VudGVyICs9IDE7XG5cdFx0XHRcdFx0aXNPdmVyRHJvcFpvbmUudmFsdWUgPSB0cnVlO1xuXHRcdFx0XHRcdChfb3B0aW9ucyRvbkVudGVyID0gX29wdGlvbnMub25FbnRlcikgPT09IG51bGwgfHwgX29wdGlvbnMkb25FbnRlciA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uRW50ZXIuY2FsbChfb3B0aW9ucywgbnVsbCwgZXZlbnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwib3ZlclwiOlxuXHRcdFx0XHRcdHZhciBfb3B0aW9ucyRvbk92ZXI7XG5cdFx0XHRcdFx0KF9vcHRpb25zJG9uT3ZlciA9IF9vcHRpb25zLm9uT3ZlcikgPT09IG51bGwgfHwgX29wdGlvbnMkb25PdmVyID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25PdmVyLmNhbGwoX29wdGlvbnMsIG51bGwsIGV2ZW50KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcImxlYXZlXCI6XG5cdFx0XHRcdFx0dmFyIF9vcHRpb25zJG9uTGVhdmU7XG5cdFx0XHRcdFx0Y291bnRlciAtPSAxO1xuXHRcdFx0XHRcdGlmIChjb3VudGVyID09PSAwKSBpc092ZXJEcm9wWm9uZS52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdChfb3B0aW9ucyRvbkxlYXZlID0gX29wdGlvbnMub25MZWF2ZSkgPT09IG51bGwgfHwgX29wdGlvbnMkb25MZWF2ZSA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uTGVhdmUuY2FsbChfb3B0aW9ucywgbnVsbCwgZXZlbnQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiZHJvcFwiOlxuXHRcdFx0XHRcdGNvdW50ZXIgPSAwO1xuXHRcdFx0XHRcdGlzT3ZlckRyb3Bab25lLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKGlzVmFsaWQpIHtcblx0XHRcdFx0XHRcdHZhciBfb3B0aW9ucyRvbkRyb3A7XG5cdFx0XHRcdFx0XHRmaWxlcy52YWx1ZSA9IGN1cnJlbnRGaWxlcztcblx0XHRcdFx0XHRcdChfb3B0aW9ucyRvbkRyb3AgPSBfb3B0aW9ucy5vbkRyb3ApID09PSBudWxsIHx8IF9vcHRpb25zJG9uRHJvcCA9PT0gdm9pZCAwIHx8IF9vcHRpb25zJG9uRHJvcC5jYWxsKF9vcHRpb25zLCBjdXJyZW50RmlsZXMsIGV2ZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJkcmFnZW50ZXJcIiwgKGV2ZW50KSA9PiBoYW5kbGVEcmFnRXZlbnQoZXZlbnQsIFwiZW50ZXJcIikpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdvdmVyXCIsIChldmVudCkgPT4gaGFuZGxlRHJhZ0V2ZW50KGV2ZW50LCBcIm92ZXJcIikpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImRyYWdsZWF2ZVwiLCAoZXZlbnQpID0+IGhhbmRsZURyYWdFdmVudChldmVudCwgXCJsZWF2ZVwiKSk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJvcFwiLCAoZXZlbnQpID0+IGhhbmRsZURyYWdFdmVudChldmVudCwgXCJkcm9wXCIpKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGZpbGVzLFxuXHRcdGlzT3ZlckRyb3Bab25lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVJlc2l6ZU9ic2VydmVyL2luZGV4LnRzXG4vKipcbiogUmVwb3J0cyBjaGFuZ2VzIHRvIHRoZSBkaW1lbnNpb25zIG9mIGFuIEVsZW1lbnQncyBjb250ZW50IG9yIHRoZSBib3JkZXItYm94XG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJlc2l6ZU9ic2VydmVyXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIGNhbGxiYWNrXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUmVzaXplT2JzZXJ2ZXIodGFyZ2V0LCBjYWxsYmFjaywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csLi4ub2JzZXJ2ZXJPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRsZXQgb2JzZXJ2ZXI7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuXHRcdGlmIChvYnNlcnZlcikge1xuXHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0b2JzZXJ2ZXIgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBzdG9wV2F0Y2ggPSB3YXRjaChjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgX3RhcmdldHMgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkoX3RhcmdldHMpID8gX3RhcmdldHMubWFwKChlbCkgPT4gdW5yZWZFbGVtZW50KGVsKSkgOiBbdW5yZWZFbGVtZW50KF90YXJnZXRzKV07XG5cdH0pLCAoZWxzKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSAmJiB3aW5kb3ckMSkge1xuXHRcdFx0b2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoY2FsbGJhY2spO1xuXHRcdFx0Zm9yIChjb25zdCBfZWwgb2YgZWxzKSBpZiAoX2VsKSBvYnNlcnZlci5vYnNlcnZlKF9lbCwgb2JzZXJ2ZXJPcHRpb25zKTtcblx0XHR9XG5cdH0sIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0Zmx1c2g6IFwicG9zdFwiXG5cdH0pO1xuXHRjb25zdCBzdG9wID0gKCkgPT4ge1xuXHRcdGNsZWFudXAoKTtcblx0XHRzdG9wV2F0Y2goKTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50Qm91bmRpbmcvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBib3VuZGluZyBib3ggb2YgYW4gSFRNTCBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50Qm91bmRpbmdcbiogQHBhcmFtIHRhcmdldFxuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRCb3VuZGluZyh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHJlc2V0ID0gdHJ1ZSwgd2luZG93UmVzaXplID0gdHJ1ZSwgd2luZG93U2Nyb2xsID0gdHJ1ZSwgaW1tZWRpYXRlID0gdHJ1ZSwgdXBkYXRlVGltaW5nID0gXCJzeW5jXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGhlaWdodCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGJvdHRvbSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGxlZnQgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCByaWdodCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHRvcCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHdpZHRoID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgeCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHkgPSBzaGFsbG93UmVmKDApO1xuXHRmdW5jdGlvbiByZWNhbGN1bGF0ZSgpIHtcblx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHtcblx0XHRcdGlmIChyZXNldCkge1xuXHRcdFx0XHRoZWlnaHQudmFsdWUgPSAwO1xuXHRcdFx0XHRib3R0b20udmFsdWUgPSAwO1xuXHRcdFx0XHRsZWZ0LnZhbHVlID0gMDtcblx0XHRcdFx0cmlnaHQudmFsdWUgPSAwO1xuXHRcdFx0XHR0b3AudmFsdWUgPSAwO1xuXHRcdFx0XHR3aWR0aC52YWx1ZSA9IDA7XG5cdFx0XHRcdHgudmFsdWUgPSAwO1xuXHRcdFx0XHR5LnZhbHVlID0gMDtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGhlaWdodC52YWx1ZSA9IHJlY3QuaGVpZ2h0O1xuXHRcdGJvdHRvbS52YWx1ZSA9IHJlY3QuYm90dG9tO1xuXHRcdGxlZnQudmFsdWUgPSByZWN0LmxlZnQ7XG5cdFx0cmlnaHQudmFsdWUgPSByZWN0LnJpZ2h0O1xuXHRcdHRvcC52YWx1ZSA9IHJlY3QudG9wO1xuXHRcdHdpZHRoLnZhbHVlID0gcmVjdC53aWR0aDtcblx0XHR4LnZhbHVlID0gcmVjdC54O1xuXHRcdHkudmFsdWUgPSByZWN0Lnk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdGlmICh1cGRhdGVUaW1pbmcgPT09IFwic3luY1wiKSByZWNhbGN1bGF0ZSgpO1xuXHRcdGVsc2UgaWYgKHVwZGF0ZVRpbWluZyA9PT0gXCJuZXh0LWZyYW1lXCIpIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZWNhbGN1bGF0ZSgpKTtcblx0fVxuXHR1c2VSZXNpemVPYnNlcnZlcih0YXJnZXQsIHVwZGF0ZSk7XG5cdHdhdGNoKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLCAoZWxlKSA9PiAhZWxlICYmIHVwZGF0ZSgpKTtcblx0dXNlTXV0YXRpb25PYnNlcnZlcih0YXJnZXQsIHVwZGF0ZSwgeyBhdHRyaWJ1dGVGaWx0ZXI6IFtcInN0eWxlXCIsIFwiY2xhc3NcIl0gfSk7XG5cdGlmICh3aW5kb3dTY3JvbGwpIHVzZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlLCB7XG5cdFx0Y2FwdHVyZTogdHJ1ZSxcblx0XHRwYXNzaXZlOiB0cnVlXG5cdH0pO1xuXHRpZiAod2luZG93UmVzaXplKSB1c2VFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGlmIChpbW1lZGlhdGUpIHVwZGF0ZSgpO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRoZWlnaHQsXG5cdFx0Ym90dG9tLFxuXHRcdGxlZnQsXG5cdFx0cmlnaHQsXG5cdFx0dG9wLFxuXHRcdHdpZHRoLFxuXHRcdHgsXG5cdFx0eSxcblx0XHR1cGRhdGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRWxlbWVudEJ5UG9pbnQvaW5kZXgudHNcbmZ1bmN0aW9uIGdldERlZmF1bHRTY2hlZHVsZXIkNyhvcHRpb25zKSB7XG5cdGlmIChcImludGVydmFsXCIgaW4gb3B0aW9ucyB8fCBcImltbWVkaWF0ZVwiIGluIG9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGludGVydmFsID0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiwgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gaW50ZXJ2YWwgPT09IFwicmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIgPyAoY2IpID0+IHVzZVJhZkZuKGNiLCB7IGltbWVkaWF0ZSB9KSA6IChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHsgaW1tZWRpYXRlIH0pO1xuXHR9XG5cdHJldHVybiB1c2VSYWZGbjtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBlbGVtZW50IGJ5IHBvaW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50QnlQb2ludFxuKiBAcGFyYW0gb3B0aW9ucyAtIFVzZUVsZW1lbnRCeVBvaW50T3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRCeVBvaW50KG9wdGlvbnMpIHtcblx0Y29uc3QgeyB4LCB5LCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgbXVsdGlwbGUsIHNjaGVkdWxlciA9IGdldERlZmF1bHRTY2hlZHVsZXIkNyhvcHRpb25zKSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHtcblx0XHRpZiAodG9WYWx1ZShtdWx0aXBsZSkpIHJldHVybiBkb2N1bWVudCQxICYmIFwiZWxlbWVudHNGcm9tUG9pbnRcIiBpbiBkb2N1bWVudCQxO1xuXHRcdHJldHVybiBkb2N1bWVudCQxICYmIFwiZWxlbWVudEZyb21Qb2ludFwiIGluIGRvY3VtZW50JDE7XG5cdH0pO1xuXHRjb25zdCBlbGVtZW50ID0gc2hhbGxvd1JlZihudWxsKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRlbGVtZW50LFxuXHRcdC4uLnNjaGVkdWxlcigoKSA9PiB7XG5cdFx0XHR2YXIgX2RvY3VtZW50JGVsZW1lbnRzRnJvLCBfZG9jdW1lbnQkZWxlbWVudEZyb207XG5cdFx0XHRlbGVtZW50LnZhbHVlID0gdG9WYWx1ZShtdWx0aXBsZSkgPyAoX2RvY3VtZW50JGVsZW1lbnRzRnJvID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmVsZW1lbnRzRnJvbVBvaW50KHRvVmFsdWUoeCksIHRvVmFsdWUoeSkpKSAhPT0gbnVsbCAmJiBfZG9jdW1lbnQkZWxlbWVudHNGcm8gIT09IHZvaWQgMCA/IF9kb2N1bWVudCRlbGVtZW50c0ZybyA6IFtdIDogKF9kb2N1bWVudCRlbGVtZW50RnJvbSA9IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS5lbGVtZW50RnJvbVBvaW50KHRvVmFsdWUoeCksIHRvVmFsdWUoeSkpKSAhPT0gbnVsbCAmJiBfZG9jdW1lbnQkZWxlbWVudEZyb20gIT09IHZvaWQgMCA/IF9kb2N1bWVudCRlbGVtZW50RnJvbSA6IG51bGw7XG5cdFx0fSlcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRWxlbWVudEhvdmVyL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VFbGVtZW50SG92ZXIoZWwsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRlbGF5RW50ZXIgPSAwLCBkZWxheUxlYXZlID0gMCwgdHJpZ2dlck9uUmVtb3ZhbCA9IGZhbHNlLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNIb3ZlcmVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGxldCB0aW1lcjtcblx0Y29uc3QgdG9nZ2xlID0gKGVudGVyaW5nKSA9PiB7XG5cdFx0Y29uc3QgZGVsYXkgPSBlbnRlcmluZyA/IGRlbGF5RW50ZXIgOiBkZWxheUxlYXZlO1xuXHRcdGlmICh0aW1lcikge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRcdHRpbWVyID0gdm9pZCAwO1xuXHRcdH1cblx0XHRpZiAoZGVsYXkpIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBpc0hvdmVyZWQudmFsdWUgPSBlbnRlcmluZywgZGVsYXkpO1xuXHRcdGVsc2UgaXNIb3ZlcmVkLnZhbHVlID0gZW50ZXJpbmc7XG5cdH07XG5cdGlmICghd2luZG93JDEpIHJldHVybiBpc0hvdmVyZWQ7XG5cdHVzZUV2ZW50TGlzdGVuZXIoZWwsIFwibW91c2VlbnRlclwiLCAoKSA9PiB0b2dnbGUodHJ1ZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0dXNlRXZlbnRMaXN0ZW5lcihlbCwgXCJtb3VzZWxlYXZlXCIsICgpID0+IHRvZ2dsZShmYWxzZSksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0aWYgKHRyaWdnZXJPblJlbW92YWwpIG9uRWxlbWVudFJlbW92YWwoY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KGVsKSksICgpID0+IHRvZ2dsZShmYWxzZSkpO1xuXHRyZXR1cm4gaXNIb3ZlcmVkO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFbGVtZW50U2l6ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHNpemUgb2YgYW4gSFRNTCBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50U2l6ZVxuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRTaXplKHRhcmdldCwgaW5pdGlhbFNpemUgPSB7XG5cdHdpZHRoOiAwLFxuXHRoZWlnaHQ6IDBcbn0sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBib3ggPSBcImNvbnRlbnQtYm94XCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU1ZHID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdHJldHVybiAoX3VucmVmRWxlbWVudCA9IHVucmVmRWxlbWVudCh0YXJnZXQpKSA9PT0gbnVsbCB8fCBfdW5yZWZFbGVtZW50ID09PSB2b2lkIDAgfHwgKF91bnJlZkVsZW1lbnQgPSBfdW5yZWZFbGVtZW50Lm5hbWVzcGFjZVVSSSkgPT09IG51bGwgfHwgX3VucmVmRWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3VucmVmRWxlbWVudC5pbmNsdWRlcyhcInN2Z1wiKTtcblx0fSk7XG5cdGNvbnN0IHdpZHRoID0gc2hhbGxvd1JlZihpbml0aWFsU2l6ZS53aWR0aCk7XG5cdGNvbnN0IGhlaWdodCA9IHNoYWxsb3dSZWYoaW5pdGlhbFNpemUuaGVpZ2h0KTtcblx0Y29uc3QgeyBzdG9wOiBzdG9wMSB9ID0gdXNlUmVzaXplT2JzZXJ2ZXIodGFyZ2V0LCAoW2VudHJ5XSkgPT4ge1xuXHRcdGNvbnN0IGJveFNpemUgPSBib3ggPT09IFwiYm9yZGVyLWJveFwiID8gZW50cnkuYm9yZGVyQm94U2l6ZSA6IGJveCA9PT0gXCJjb250ZW50LWJveFwiID8gZW50cnkuY29udGVudEJveFNpemUgOiBlbnRyeS5kZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplO1xuXHRcdGlmICh3aW5kb3ckMSAmJiBpc1NWRy52YWx1ZSkge1xuXHRcdFx0Y29uc3QgJGVsZW0gPSB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRcdGlmICgkZWxlbSkge1xuXHRcdFx0XHRjb25zdCByZWN0ID0gJGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRcdHdpZHRoLnZhbHVlID0gcmVjdC53aWR0aDtcblx0XHRcdFx0aGVpZ2h0LnZhbHVlID0gcmVjdC5oZWlnaHQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChib3hTaXplKSB7XG5cdFx0XHRjb25zdCBmb3JtYXRCb3hTaXplID0gdG9BcnJheShib3hTaXplKTtcblx0XHRcdHdpZHRoLnZhbHVlID0gZm9ybWF0Qm94U2l6ZS5yZWR1Y2UoKGFjYywgeyBpbmxpbmVTaXplIH0pID0+IGFjYyArIGlubGluZVNpemUsIDApO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gZm9ybWF0Qm94U2l6ZS5yZWR1Y2UoKGFjYywgeyBibG9ja1NpemUgfSkgPT4gYWNjICsgYmxvY2tTaXplLCAwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2lkdGgudmFsdWUgPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aDtcblx0XHRcdGhlaWdodC52YWx1ZSA9IGVudHJ5LmNvbnRlbnRSZWN0LmhlaWdodDtcblx0XHR9XG5cdH0sIG9wdGlvbnMpO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGVsZSA9IHVucmVmRWxlbWVudCh0YXJnZXQpO1xuXHRcdGlmIChlbGUpIHtcblx0XHRcdHdpZHRoLnZhbHVlID0gXCJvZmZzZXRXaWR0aFwiIGluIGVsZSA/IGVsZS5vZmZzZXRXaWR0aCA6IGluaXRpYWxTaXplLndpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gXCJvZmZzZXRIZWlnaHRcIiBpbiBlbGUgPyBlbGUub2Zmc2V0SGVpZ2h0IDogaW5pdGlhbFNpemUuaGVpZ2h0O1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHN0b3AyID0gd2F0Y2goKCkgPT4gdW5yZWZFbGVtZW50KHRhcmdldCksIChlbGUpID0+IHtcblx0XHR3aWR0aC52YWx1ZSA9IGVsZSA/IGluaXRpYWxTaXplLndpZHRoIDogMDtcblx0XHRoZWlnaHQudmFsdWUgPSBlbGUgPyBpbml0aWFsU2l6ZS5oZWlnaHQgOiAwO1xuXHR9KTtcblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRzdG9wMSgpO1xuXHRcdHN0b3AyKCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR3aWR0aCxcblx0XHRoZWlnaHQsXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlci9pbmRleC50c1xuLyoqXG4qIERldGVjdHMgdGhhdCBhIHRhcmdldCBlbGVtZW50J3MgdmlzaWJpbGl0eS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gY2FsbGJhY2tcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlcih0YXJnZXQsIGNhbGxiYWNrLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyByb290LCByb290TWFyZ2luLCB0aHJlc2hvbGQgPSAwLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgaW1tZWRpYXRlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHdpbmRvdyQxICYmIFwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcIiBpbiB3aW5kb3ckMSk7XG5cdGNvbnN0IHRhcmdldHMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIHRvQXJyYXkodG9WYWx1ZSh0YXJnZXQpKS5tYXAodW5yZWZFbGVtZW50KS5maWx0ZXIobm90TnVsbGlzaCk7XG5cdH0pO1xuXHRsZXQgY2xlYW51cCA9IG5vb3A7XG5cdGNvbnN0IGlzQWN0aXZlID0gc2hhbGxvd1JlZihpbW1lZGlhdGUpO1xuXHRjb25zdCBzdG9wV2F0Y2ggPSBpc1N1cHBvcnRlZC52YWx1ZSA/IHdhdGNoKCgpID0+IFtcblx0XHR0YXJnZXRzLnZhbHVlLFxuXHRcdHVucmVmRWxlbWVudChyb290KSxcblx0XHR0b1ZhbHVlKHJvb3RNYXJnaW4pLFxuXHRcdGlzQWN0aXZlLnZhbHVlXG5cdF0sIChbdGFyZ2V0cyQxLCByb290JDEsIHJvb3RNYXJnaW4kMV0pID0+IHtcblx0XHRjbGVhbnVwKCk7XG5cdFx0aWYgKCFpc0FjdGl2ZS52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmICghdGFyZ2V0cyQxLmxlbmd0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGNhbGxiYWNrLCB7XG5cdFx0XHRyb290OiB1bnJlZkVsZW1lbnQocm9vdCQxKSxcblx0XHRcdHJvb3RNYXJnaW46IHJvb3RNYXJnaW4kMSxcblx0XHRcdHRocmVzaG9sZFxuXHRcdH0pO1xuXHRcdHRhcmdldHMkMS5mb3JFYWNoKChlbCkgPT4gZWwgJiYgb2JzZXJ2ZXIub2JzZXJ2ZShlbCkpO1xuXHRcdGNsZWFudXAgPSAoKSA9PiB7XG5cdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdFx0XHRjbGVhbnVwID0gbm9vcDtcblx0XHR9O1xuXHR9LCB7XG5cdFx0aW1tZWRpYXRlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KSA6IG5vb3A7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0Y2xlYW51cCgpO1xuXHRcdHN0b3BXYXRjaCgpO1xuXHRcdGlzQWN0aXZlLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHN0b3ApO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzQWN0aXZlLFxuXHRcdHBhdXNlKCkge1xuXHRcdFx0Y2xlYW51cCgpO1xuXHRcdFx0aXNBY3RpdmUudmFsdWUgPSBmYWxzZTtcblx0XHR9LFxuXHRcdHJlc3VtZSgpIHtcblx0XHRcdGlzQWN0aXZlLnZhbHVlID0gdHJ1ZTtcblx0XHR9LFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRWxlbWVudFZpc2liaWxpdHkvaW5kZXgudHNcbi8qKlxuKiBUcmFja3MgdGhlIHZpc2liaWxpdHkgb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VFbGVtZW50VmlzaWJpbGl0eVxuKi9cbmZ1bmN0aW9uIHVzZUVsZW1lbnRWaXNpYmlsaXR5KGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBzY3JvbGxUYXJnZXQsIHRocmVzaG9sZCA9IDAsIHJvb3RNYXJnaW4sIG9uY2UgPSBmYWxzZSwgaW5pdGlhbFZhbHVlID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHsgc3RvcCB9ID0gdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZWxlbWVudCwgKGludGVyc2VjdGlvbk9ic2VydmVyRW50cmllcykgPT4ge1xuXHRcdGxldCBpc0ludGVyc2VjdGluZyA9IGVsZW1lbnRJc1Zpc2libGUudmFsdWU7XG5cdFx0bGV0IGxhdGVzdFRpbWUgPSAwO1xuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyaWVzKSBpZiAoZW50cnkudGltZSA+PSBsYXRlc3RUaW1lKSB7XG5cdFx0XHRsYXRlc3RUaW1lID0gZW50cnkudGltZTtcblx0XHRcdGlzSW50ZXJzZWN0aW5nID0gZW50cnkuaXNJbnRlcnNlY3Rpbmc7XG5cdFx0fVxuXHRcdGVsZW1lbnRJc1Zpc2libGUudmFsdWUgPSBpc0ludGVyc2VjdGluZztcblx0XHRpZiAob25jZSkgd2F0Y2hPbmNlKGVsZW1lbnRJc1Zpc2libGUsICgpID0+IHtcblx0XHRcdHN0b3AoKTtcblx0XHR9KTtcblx0fSwge1xuXHRcdHJvb3Q6IHNjcm9sbFRhcmdldCxcblx0XHR3aW5kb3c6IHdpbmRvdyQxLFxuXHRcdHRocmVzaG9sZCxcblx0XHRyb290TWFyZ2luXG5cdH0pO1xuXHRyZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRXZlbnRCdXMvaW50ZXJuYWwudHNcbmNvbnN0IGV2ZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUV2ZW50QnVzL2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlRXZlbnRCdXMoa2V5KSB7XG5cdGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudFNjb3BlKCk7XG5cdGZ1bmN0aW9uIG9uKGxpc3RlbmVyKSB7XG5cdFx0dmFyIF9zY29wZSRjbGVhbnVwcztcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSBldmVudHMuZ2V0KGtleSkgfHwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0XHRsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcblx0XHRldmVudHMuc2V0KGtleSwgbGlzdGVuZXJzKTtcblx0XHRjb25zdCBfb2ZmID0gKCkgPT4gb2ZmKGxpc3RlbmVyKTtcblx0XHRzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdm9pZCAwIHx8IChfc2NvcGUkY2xlYW51cHMgPSBzY29wZS5jbGVhbnVwcykgPT09IG51bGwgfHwgX3Njb3BlJGNsZWFudXBzID09PSB2b2lkIDAgfHwgX3Njb3BlJGNsZWFudXBzLnB1c2goX29mZik7XG5cdFx0cmV0dXJuIF9vZmY7XG5cdH1cblx0ZnVuY3Rpb24gb25jZShsaXN0ZW5lcikge1xuXHRcdGZ1bmN0aW9uIF9saXN0ZW5lciguLi5hcmdzKSB7XG5cdFx0XHRvZmYoX2xpc3RlbmVyKTtcblx0XHRcdGxpc3RlbmVyKC4uLmFyZ3MpO1xuXHRcdH1cblx0XHRyZXR1cm4gb24oX2xpc3RlbmVyKTtcblx0fVxuXHRmdW5jdGlvbiBvZmYobGlzdGVuZXIpIHtcblx0XHRjb25zdCBsaXN0ZW5lcnMgPSBldmVudHMuZ2V0KGtleSk7XG5cdFx0aWYgKCFsaXN0ZW5lcnMpIHJldHVybjtcblx0XHRsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcblx0XHRpZiAoIWxpc3RlbmVycy5zaXplKSByZXNldCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXHRcdGV2ZW50cy5kZWxldGUoa2V5KTtcblx0fVxuXHRmdW5jdGlvbiBlbWl0KGV2ZW50LCBwYXlsb2FkKSB7XG5cdFx0dmFyIF9ldmVudHMkZ2V0O1xuXHRcdChfZXZlbnRzJGdldCA9IGV2ZW50cy5nZXQoa2V5KSkgPT09IG51bGwgfHwgX2V2ZW50cyRnZXQgPT09IHZvaWQgMCB8fCBfZXZlbnRzJGdldC5mb3JFYWNoKCh2KSA9PiB2KGV2ZW50LCBwYXlsb2FkKSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRvbixcblx0XHRvbmNlLFxuXHRcdG9mZixcblx0XHRlbWl0LFxuXHRcdHJlc2V0XG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUV2ZW50U291cmNlL2luZGV4LnRzXG5mdW5jdGlvbiByZXNvbHZlTmVzdGVkT3B0aW9ucyQxKG9wdGlvbnMpIHtcblx0aWYgKG9wdGlvbnMgPT09IHRydWUpIHJldHVybiB7fTtcblx0cmV0dXJuIG9wdGlvbnM7XG59XG4vKipcbiogUmVhY3RpdmUgd3JhcHBlciBmb3IgRXZlbnRTb3VyY2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUV2ZW50U291cmNlXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50U291cmNlL0V2ZW50U291cmNlIEV2ZW50U291cmNlXG4qIEBwYXJhbSB1cmxcbiogQHBhcmFtIGV2ZW50c1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUV2ZW50U291cmNlKHVybCwgZXZlbnRzJDEgPSBbXSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGV2ZW50ID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZGF0YSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IHN0YXR1cyA9IHNoYWxsb3dSZWYoXCJDT05ORUNUSU5HXCIpO1xuXHRjb25zdCBldmVudFNvdXJjZSA9IHJlZihudWxsKTtcblx0Y29uc3QgZXJyb3IgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCB1cmxSZWYgPSB0b1JlZih1cmwpO1xuXHRjb25zdCBsYXN0RXZlbnRJZCA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGxldCBleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG5cdGxldCByZXRyaWVkID0gMDtcblx0Y29uc3QgeyB3aXRoQ3JlZGVudGlhbHMgPSBmYWxzZSwgaW1tZWRpYXRlID0gdHJ1ZSwgYXV0b0Nvbm5lY3QgPSB0cnVlLCBhdXRvUmVjb25uZWN0LCBzZXJpYWxpemVyID0geyByZWFkOiAodikgPT4gdiB9IH0gPSBvcHRpb25zO1xuXHRjb25zdCBjbG9zZSA9ICgpID0+IHtcblx0XHRpZiAoaXNDbGllbnQgJiYgZXZlbnRTb3VyY2UudmFsdWUpIHtcblx0XHRcdGV2ZW50U291cmNlLnZhbHVlLmNsb3NlKCk7XG5cdFx0XHRldmVudFNvdXJjZS52YWx1ZSA9IG51bGw7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcIkNMT1NFRFwiO1xuXHRcdFx0ZXhwbGljaXRseUNsb3NlZCA9IHRydWU7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBfaW5pdCA9ICgpID0+IHtcblx0XHRpZiAoZXhwbGljaXRseUNsb3NlZCB8fCB0eXBlb2YgdXJsUmVmLnZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG5cdFx0Y29uc3QgZXMgPSBuZXcgRXZlbnRTb3VyY2UodXJsUmVmLnZhbHVlLCB7IHdpdGhDcmVkZW50aWFscyB9KTtcblx0XHRzdGF0dXMudmFsdWUgPSBcIkNPTk5FQ1RJTkdcIjtcblx0XHRldmVudFNvdXJjZS52YWx1ZSA9IGVzO1xuXHRcdGVzLm9ub3BlbiA9ICgpID0+IHtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiT1BFTlwiO1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBudWxsO1xuXHRcdH07XG5cdFx0ZXMub25lcnJvciA9IChlKSA9PiB7XG5cdFx0XHRzdGF0dXMudmFsdWUgPSBcIkNMT1NFRFwiO1xuXHRcdFx0ZXJyb3IudmFsdWUgPSBlO1xuXHRcdFx0aWYgKGVzLnJlYWR5U3RhdGUgPT09IDIgJiYgIWV4cGxpY2l0bHlDbG9zZWQgJiYgYXV0b1JlY29ubmVjdCkge1xuXHRcdFx0XHRlcy5jbG9zZSgpO1xuXHRcdFx0XHRjb25zdCB7IHJldHJpZXMgPSAtMSwgZGVsYXkgPSAxZTMsIG9uRmFpbGVkIH0gPSByZXNvbHZlTmVzdGVkT3B0aW9ucyQxKGF1dG9SZWNvbm5lY3QpO1xuXHRcdFx0XHRyZXRyaWVkICs9IDE7XG5cdFx0XHRcdGlmICh0eXBlb2YgcmV0cmllcyA9PT0gXCJudW1iZXJcIiAmJiAocmV0cmllcyA8IDAgfHwgcmV0cmllZCA8IHJldHJpZXMpKSBzZXRUaW1lb3V0KF9pbml0LCBkZWxheSk7XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiByZXRyaWVzID09PSBcImZ1bmN0aW9uXCIgJiYgcmV0cmllcygpKSBzZXRUaW1lb3V0KF9pbml0LCBkZWxheSk7XG5cdFx0XHRcdGVsc2Ugb25GYWlsZWQgPT09IG51bGwgfHwgb25GYWlsZWQgPT09IHZvaWQgMCB8fCBvbkZhaWxlZCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0ZXMub25tZXNzYWdlID0gKGUpID0+IHtcblx0XHRcdHZhciBfc2VyaWFsaXplciRyZWFkO1xuXHRcdFx0ZXZlbnQudmFsdWUgPSBudWxsO1xuXHRcdFx0ZGF0YS52YWx1ZSA9IChfc2VyaWFsaXplciRyZWFkID0gc2VyaWFsaXplci5yZWFkKGUuZGF0YSkpICE9PSBudWxsICYmIF9zZXJpYWxpemVyJHJlYWQgIT09IHZvaWQgMCA/IF9zZXJpYWxpemVyJHJlYWQgOiBudWxsO1xuXHRcdFx0bGFzdEV2ZW50SWQudmFsdWUgPSBlLmxhc3RFdmVudElkO1xuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBldmVudF9uYW1lIG9mIGV2ZW50cyQxKSB1c2VFdmVudExpc3RlbmVyKGVzLCBldmVudF9uYW1lLCAoZSkgPT4ge1xuXHRcdFx0dmFyIF9zZXJpYWxpemVyJHJlYWQyLCBfZSRsYXN0RXZlbnRJZDtcblx0XHRcdGV2ZW50LnZhbHVlID0gZXZlbnRfbmFtZTtcblx0XHRcdGRhdGEudmFsdWUgPSAoX3NlcmlhbGl6ZXIkcmVhZDIgPSBzZXJpYWxpemVyLnJlYWQoZS5kYXRhKSkgIT09IG51bGwgJiYgX3NlcmlhbGl6ZXIkcmVhZDIgIT09IHZvaWQgMCA/IF9zZXJpYWxpemVyJHJlYWQyIDogbnVsbDtcblx0XHRcdGxhc3RFdmVudElkLnZhbHVlID0gKF9lJGxhc3RFdmVudElkID0gZS5sYXN0RXZlbnRJZCkgIT09IG51bGwgJiYgX2UkbGFzdEV2ZW50SWQgIT09IHZvaWQgMCA/IF9lJGxhc3RFdmVudElkIDogbnVsbDtcblx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdH07XG5cdGNvbnN0IG9wZW4gPSAoKSA9PiB7XG5cdFx0aWYgKCFpc0NsaWVudCkgcmV0dXJuO1xuXHRcdGNsb3NlKCk7XG5cdFx0ZXhwbGljaXRseUNsb3NlZCA9IGZhbHNlO1xuXHRcdHJldHJpZWQgPSAwO1xuXHRcdF9pbml0KCk7XG5cdH07XG5cdGlmIChpbW1lZGlhdGUpIG9wZW4oKTtcblx0aWYgKGF1dG9Db25uZWN0KSB3YXRjaCh1cmxSZWYsIG9wZW4pO1xuXHR0cnlPblNjb3BlRGlzcG9zZShjbG9zZSk7XG5cdHJldHVybiB7XG5cdFx0ZXZlbnRTb3VyY2UsXG5cdFx0ZXZlbnQsXG5cdFx0ZGF0YSxcblx0XHRzdGF0dXMsXG5cdFx0ZXJyb3IsXG5cdFx0b3Blbixcblx0XHRjbG9zZSxcblx0XHRsYXN0RXZlbnRJZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VFeWVEcm9wcGVyL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgW0V5ZURyb3BwZXIgQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXllRHJvcHBlcl9BUEkpXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUV5ZURyb3BwZXJcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VFeWVEcm9wcGVyKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxWYWx1ZSA9IFwiXCIgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIFwiRXllRHJvcHBlclwiIGluIHdpbmRvdyk7XG5cdGNvbnN0IHNSR0JIZXggPSBzaGFsbG93UmVmKGluaXRpYWxWYWx1ZSk7XG5cdGFzeW5jIGZ1bmN0aW9uIG9wZW4ob3Blbk9wdGlvbnMpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IHdpbmRvdy5FeWVEcm9wcGVyKCkub3BlbihvcGVuT3B0aW9ucyk7XG5cdFx0c1JHQkhleC52YWx1ZSA9IHJlc3VsdC5zUkdCSGV4O1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzUkdCSGV4LFxuXHRcdG9wZW5cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmF2aWNvbi9pbmRleC50c1xuZnVuY3Rpb24gdXNlRmF2aWNvbihuZXdJY29uID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgYmFzZVVybCA9IFwiXCIsIHJlbCA9IFwiaWNvblwiLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0Y29uc3QgZmF2aWNvbiA9IHRvUmVmKG5ld0ljb24pO1xuXHRjb25zdCBhcHBseUljb24gPSAoaWNvbikgPT4ge1xuXHRcdGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmhlYWQucXVlcnlTZWxlY3RvckFsbChgbGlua1tyZWwqPVwiJHtyZWx9XCJdYCk7XG5cdFx0aWYgKCFlbGVtZW50cyB8fCBlbGVtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnN0IGxpbmsgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG5cdFx0XHRpZiAobGluaykge1xuXHRcdFx0XHRsaW5rLnJlbCA9IHJlbDtcblx0XHRcdFx0bGluay5ocmVmID0gYCR7YmFzZVVybH0ke2ljb259YDtcblx0XHRcdFx0bGluay50eXBlID0gYGltYWdlLyR7aWNvbi5zcGxpdChcIi5cIikucG9wKCl9YDtcblx0XHRcdFx0ZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgfHwgZG9jdW1lbnQkMS5oZWFkLmFwcGVuZChsaW5rKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZWxlbWVudHMgPT09IG51bGwgfHwgZWxlbWVudHMgPT09IHZvaWQgMCB8fCBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4gZWwuaHJlZiA9IGAke2Jhc2VVcmx9JHtpY29ufWApO1xuXHR9O1xuXHR3YXRjaChmYXZpY29uLCAoaSwgbykgPT4ge1xuXHRcdGlmICh0eXBlb2YgaSA9PT0gXCJzdHJpbmdcIiAmJiBpICE9PSBvKSBhcHBseUljb24oaSk7XG5cdH0sIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHRyZXR1cm4gZmF2aWNvbjtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmV0Y2gvaW5kZXgudHNcbmNvbnN0IHBheWxvYWRNYXBwaW5nID0ge1xuXHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb25cIixcblx0dGV4dDogXCJ0ZXh0L3BsYWluXCJcbn07XG4vKipcbiogISEhSU1QT1JUQU5UISEhXG4qXG4qIElmIHlvdSB1cGRhdGUgdGhlIFVzZUZldGNoT3B0aW9ucyBpbnRlcmZhY2UsIGJlIHN1cmUgdG8gdXBkYXRlIHRoaXMgb2JqZWN0XG4qIHRvIGluY2x1ZGUgdGhlIG5ldyBvcHRpb25zXG4qL1xuZnVuY3Rpb24gaXNGZXRjaE9wdGlvbnMob2JqKSB7XG5cdHJldHVybiBvYmogJiYgY29udGFpbnNQcm9wKG9iaiwgXCJpbW1lZGlhdGVcIiwgXCJyZWZldGNoXCIsIFwiaW5pdGlhbERhdGFcIiwgXCJ0aW1lb3V0XCIsIFwiYmVmb3JlRmV0Y2hcIiwgXCJhZnRlckZldGNoXCIsIFwib25GZXRjaEVycm9yXCIsIFwiZmV0Y2hcIiwgXCJ1cGRhdGVEYXRhT25FcnJvclwiKTtcbn1cbmNvbnN0IHJlQWJzb2x1dGUgPSAvXig/OlthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaTtcbmZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG5cdHJldHVybiByZUFic29sdXRlLnRlc3QodXJsKTtcbn1cbmZ1bmN0aW9uIGhlYWRlcnNUb09iamVjdChoZWFkZXJzKSB7XG5cdGlmICh0eXBlb2YgSGVhZGVycyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBoZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhoZWFkZXJzLmVudHJpZXMoKSk7XG5cdHJldHVybiBoZWFkZXJzO1xufVxuZnVuY3Rpb24gY29tYmluZUNhbGxiYWNrcyhjb21iaW5hdGlvbiwgLi4uY2FsbGJhY2tzKSB7XG5cdGlmIChjb21iaW5hdGlvbiA9PT0gXCJvdmVyd3JpdGVcIikgcmV0dXJuIGFzeW5jIChjdHgpID0+IHtcblx0XHRsZXQgY2FsbGJhY2s7XG5cdFx0Zm9yIChsZXQgaSA9IGNhbGxiYWNrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGNhbGxiYWNrc1tpXSAhPSBudWxsKSB7XG5cdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrc1tpXTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoY2FsbGJhY2spIHJldHVybiB7XG5cdFx0XHQuLi5jdHgsXG5cdFx0XHQuLi5hd2FpdCBjYWxsYmFjayhjdHgpXG5cdFx0fTtcblx0XHRyZXR1cm4gY3R4O1xuXHR9O1xuXHRlbHNlIHJldHVybiBhc3luYyAoY3R4KSA9PiB7XG5cdFx0Zm9yIChjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIGlmIChjYWxsYmFjaykgY3R4ID0ge1xuXHRcdFx0Li4uY3R4LFxuXHRcdFx0Li4uYXdhaXQgY2FsbGJhY2soY3R4KVxuXHRcdH07XG5cdFx0cmV0dXJuIGN0eDtcblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZldGNoKGNvbmZpZyA9IHt9KSB7XG5cdGNvbnN0IF9jb21iaW5hdGlvbiA9IGNvbmZpZy5jb21iaW5hdGlvbiB8fCBcImNoYWluXCI7XG5cdGNvbnN0IF9vcHRpb25zID0gY29uZmlnLm9wdGlvbnMgfHwge307XG5cdGNvbnN0IF9mZXRjaE9wdGlvbnMgPSBjb25maWcuZmV0Y2hPcHRpb25zIHx8IHt9O1xuXHRmdW5jdGlvbiB1c2VGYWN0b3J5RmV0Y2godXJsLCAuLi5hcmdzKSB7XG5cdFx0Y29uc3QgY29tcHV0ZWRVcmwgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHRjb25zdCBiYXNlVXJsID0gdG9WYWx1ZShjb25maWcuYmFzZVVybCk7XG5cdFx0XHRjb25zdCB0YXJnZXRVcmwgPSB0b1ZhbHVlKHVybCk7XG5cdFx0XHRyZXR1cm4gYmFzZVVybCAmJiAhaXNBYnNvbHV0ZVVSTCh0YXJnZXRVcmwpID8gam9pblBhdGhzKGJhc2VVcmwsIHRhcmdldFVybCkgOiB0YXJnZXRVcmw7XG5cdFx0fSk7XG5cdFx0bGV0IG9wdGlvbnMgPSBfb3B0aW9ucztcblx0XHRsZXQgZmV0Y2hPcHRpb25zID0gX2ZldGNoT3B0aW9ucztcblx0XHRpZiAoYXJncy5sZW5ndGggPiAwKSBpZiAoaXNGZXRjaE9wdGlvbnMoYXJnc1swXSkpIG9wdGlvbnMgPSB7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0Li4uYXJnc1swXSxcblx0XHRcdGJlZm9yZUZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYmVmb3JlRmV0Y2gsIGFyZ3NbMF0uYmVmb3JlRmV0Y2gpLFxuXHRcdFx0YWZ0ZXJGZXRjaDogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLmFmdGVyRmV0Y2gsIGFyZ3NbMF0uYWZ0ZXJGZXRjaCksXG5cdFx0XHRvbkZldGNoRXJyb3I6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5vbkZldGNoRXJyb3IsIGFyZ3NbMF0ub25GZXRjaEVycm9yKVxuXHRcdH07XG5cdFx0ZWxzZSBmZXRjaE9wdGlvbnMgPSB7XG5cdFx0XHQuLi5mZXRjaE9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzBdLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoZmV0Y2hPcHRpb25zLmhlYWRlcnMpIHx8IHt9LFxuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoYXJnc1swXS5oZWFkZXJzKSB8fCB7fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKGFyZ3MubGVuZ3RoID4gMSAmJiBpc0ZldGNoT3B0aW9ucyhhcmdzWzFdKSkgb3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzFdLFxuXHRcdFx0YmVmb3JlRmV0Y2g6IGNvbWJpbmVDYWxsYmFja3MoX2NvbWJpbmF0aW9uLCBfb3B0aW9ucy5iZWZvcmVGZXRjaCwgYXJnc1sxXS5iZWZvcmVGZXRjaCksXG5cdFx0XHRhZnRlckZldGNoOiBjb21iaW5lQ2FsbGJhY2tzKF9jb21iaW5hdGlvbiwgX29wdGlvbnMuYWZ0ZXJGZXRjaCwgYXJnc1sxXS5hZnRlckZldGNoKSxcblx0XHRcdG9uRmV0Y2hFcnJvcjogY29tYmluZUNhbGxiYWNrcyhfY29tYmluYXRpb24sIF9vcHRpb25zLm9uRmV0Y2hFcnJvciwgYXJnc1sxXS5vbkZldGNoRXJyb3IpXG5cdFx0fTtcblx0XHRyZXR1cm4gdXNlRmV0Y2goY29tcHV0ZWRVcmwsIGZldGNoT3B0aW9ucywgb3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHVzZUZhY3RvcnlGZXRjaDtcbn1cbmZ1bmN0aW9uIHVzZUZldGNoKHVybCwgLi4uYXJncykge1xuXHR2YXIgX2RlZmF1bHRXaW5kb3ckZmV0Y2gsIF9nbG9iYWxUaGlzO1xuXHRjb25zdCBzdXBwb3J0c0Fib3J0ID0gdHlwZW9mIEFib3J0Q29udHJvbGxlciA9PT0gXCJmdW5jdGlvblwiO1xuXHRsZXQgZmV0Y2hPcHRpb25zID0ge307XG5cdGxldCBvcHRpb25zID0ge1xuXHRcdGltbWVkaWF0ZTogdHJ1ZSxcblx0XHRyZWZldGNoOiBmYWxzZSxcblx0XHR0aW1lb3V0OiAwLFxuXHRcdHVwZGF0ZURhdGFPbkVycm9yOiBmYWxzZVxuXHR9O1xuXHRjb25zdCBjb25maWcgPSB7XG5cdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdHBheWxvYWQ6IHZvaWQgMFxuXHR9O1xuXHRpZiAoYXJncy5sZW5ndGggPiAwKSBpZiAoaXNGZXRjaE9wdGlvbnMoYXJnc1swXSkpIG9wdGlvbnMgPSB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHQuLi5hcmdzWzBdXG5cdH07XG5cdGVsc2UgZmV0Y2hPcHRpb25zID0gYXJnc1swXTtcblx0aWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuXHRcdGlmIChpc0ZldGNoT3B0aW9ucyhhcmdzWzFdKSkgb3B0aW9ucyA9IHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5hcmdzWzFdXG5cdFx0fTtcblx0fVxuXHRjb25zdCB7IGZldGNoID0gKF9kZWZhdWx0V2luZG93JGZldGNoID0gZGVmYXVsdFdpbmRvdyA9PT0gbnVsbCB8fCBkZWZhdWx0V2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0V2luZG93LmZldGNoKSAhPT0gbnVsbCAmJiBfZGVmYXVsdFdpbmRvdyRmZXRjaCAhPT0gdm9pZCAwID8gX2RlZmF1bHRXaW5kb3ckZmV0Y2ggOiAoX2dsb2JhbFRoaXMgPSBnbG9iYWxUaGlzKSA9PT0gbnVsbCB8fCBfZ2xvYmFsVGhpcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2dsb2JhbFRoaXMuZmV0Y2gsIGluaXRpYWxEYXRhLCB0aW1lb3V0IH0gPSBvcHRpb25zO1xuXHRjb25zdCByZXNwb25zZUV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IGVycm9yRXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgZmluYWxseUV2ZW50ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IGlzRmluaXNoZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgaXNGZXRjaGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBhYm9ydGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHN0YXR1c0NvZGUgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCByZXNwb25zZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZihudWxsKTtcblx0Y29uc3QgZGF0YSA9IHNoYWxsb3dSZWYoaW5pdGlhbERhdGEgfHwgbnVsbCk7XG5cdGNvbnN0IGNhbkFib3J0ID0gY29tcHV0ZWQoKCkgPT4gc3VwcG9ydHNBYm9ydCAmJiBpc0ZldGNoaW5nLnZhbHVlKTtcblx0bGV0IGNvbnRyb2xsZXI7XG5cdGxldCB0aW1lcjtcblx0Y29uc3QgYWJvcnQgPSAocmVhc29uKSA9PiB7XG5cdFx0aWYgKHN1cHBvcnRzQWJvcnQpIHtcblx0XHRcdGNvbnRyb2xsZXIgPT09IG51bGwgfHwgY29udHJvbGxlciA9PT0gdm9pZCAwIHx8IGNvbnRyb2xsZXIuYWJvcnQocmVhc29uKTtcblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyLnNpZ25hbC5vbmFib3J0ID0gKCkgPT4gYWJvcnRlZC52YWx1ZSA9IHRydWU7XG5cdFx0XHRmZXRjaE9wdGlvbnMgPSB7XG5cdFx0XHRcdC4uLmZldGNoT3B0aW9ucyxcblx0XHRcdFx0c2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuXHRcdFx0fTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IGxvYWRpbmcgPSAoaXNMb2FkaW5nKSA9PiB7XG5cdFx0aXNGZXRjaGluZy52YWx1ZSA9IGlzTG9hZGluZztcblx0XHRpc0ZpbmlzaGVkLnZhbHVlID0gIWlzTG9hZGluZztcblx0fTtcblx0aWYgKHRpbWVvdXQpIHRpbWVyID0gdXNlVGltZW91dEZuKGFib3J0LCB0aW1lb3V0LCB7IGltbWVkaWF0ZTogZmFsc2UgfSk7XG5cdGxldCBleGVjdXRlQ291bnRlciA9IDA7XG5cdGNvbnN0IGV4ZWN1dGUgPSBhc3luYyAodGhyb3dPbkZhaWxlZCA9IGZhbHNlKSA9PiB7XG5cdFx0dmFyIF9jb250ZXh0JG9wdGlvbnM7XG5cdFx0YWJvcnQoKTtcblx0XHRsb2FkaW5nKHRydWUpO1xuXHRcdGVycm9yLnZhbHVlID0gbnVsbDtcblx0XHRzdGF0dXNDb2RlLnZhbHVlID0gbnVsbDtcblx0XHRhYm9ydGVkLnZhbHVlID0gZmFsc2U7XG5cdFx0ZXhlY3V0ZUNvdW50ZXIgKz0gMTtcblx0XHRjb25zdCBjdXJyZW50RXhlY3V0ZUNvdW50ZXIgPSBleGVjdXRlQ291bnRlcjtcblx0XHRjb25zdCBkZWZhdWx0RmV0Y2hPcHRpb25zID0ge1xuXHRcdFx0bWV0aG9kOiBjb25maWcubWV0aG9kLFxuXHRcdFx0aGVhZGVyczoge31cblx0XHR9O1xuXHRcdGNvbnN0IHBheWxvYWQgPSB0b1ZhbHVlKGNvbmZpZy5wYXlsb2FkKTtcblx0XHRpZiAocGF5bG9hZCkge1xuXHRcdFx0dmFyIF9wYXlsb2FkTWFwcGluZyRjb25maTtcblx0XHRcdGNvbnN0IGhlYWRlcnMgPSBoZWFkZXJzVG9PYmplY3QoZGVmYXVsdEZldGNoT3B0aW9ucy5oZWFkZXJzKTtcblx0XHRcdGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBheWxvYWQpO1xuXHRcdFx0aWYgKCFjb25maWcucGF5bG9hZFR5cGUgJiYgcGF5bG9hZCAmJiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgQXJyYXkuaXNBcnJheShwcm90bykpICYmICEocGF5bG9hZCBpbnN0YW5jZW9mIEZvcm1EYXRhKSkgY29uZmlnLnBheWxvYWRUeXBlID0gXCJqc29uXCI7XG5cdFx0XHRpZiAoY29uZmlnLnBheWxvYWRUeXBlKSBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gKF9wYXlsb2FkTWFwcGluZyRjb25maSA9IHBheWxvYWRNYXBwaW5nW2NvbmZpZy5wYXlsb2FkVHlwZV0pICE9PSBudWxsICYmIF9wYXlsb2FkTWFwcGluZyRjb25maSAhPT0gdm9pZCAwID8gX3BheWxvYWRNYXBwaW5nJGNvbmZpIDogY29uZmlnLnBheWxvYWRUeXBlO1xuXHRcdFx0ZGVmYXVsdEZldGNoT3B0aW9ucy5ib2R5ID0gY29uZmlnLnBheWxvYWRUeXBlID09PSBcImpzb25cIiA/IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpIDogcGF5bG9hZDtcblx0XHR9XG5cdFx0bGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcblx0XHRjb25zdCBjb250ZXh0ID0ge1xuXHRcdFx0dXJsOiB0b1ZhbHVlKHVybCksXG5cdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdC4uLmRlZmF1bHRGZXRjaE9wdGlvbnMsXG5cdFx0XHRcdC4uLmZldGNoT3B0aW9uc1xuXHRcdFx0fSxcblx0XHRcdGNhbmNlbDogKCkgPT4ge1xuXHRcdFx0XHRpc0NhbmNlbGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGlmIChvcHRpb25zLmJlZm9yZUZldGNoKSBPYmplY3QuYXNzaWduKGNvbnRleHQsIGF3YWl0IG9wdGlvbnMuYmVmb3JlRmV0Y2goY29udGV4dCkpO1xuXHRcdGlmIChpc0NhbmNlbGVkIHx8ICFmZXRjaCkge1xuXHRcdFx0bG9hZGluZyhmYWxzZSk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdH1cblx0XHRsZXQgcmVzcG9uc2VEYXRhID0gbnVsbDtcblx0XHRpZiAodGltZXIpIHRpbWVyLnN0YXJ0KCk7XG5cdFx0cmV0dXJuIGZldGNoKGNvbnRleHQudXJsLCB7XG5cdFx0XHQuLi5kZWZhdWx0RmV0Y2hPcHRpb25zLFxuXHRcdFx0Li4uY29udGV4dC5vcHRpb25zLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHQuLi5oZWFkZXJzVG9PYmplY3QoZGVmYXVsdEZldGNoT3B0aW9ucy5oZWFkZXJzKSxcblx0XHRcdFx0Li4uaGVhZGVyc1RvT2JqZWN0KChfY29udGV4dCRvcHRpb25zID0gY29udGV4dC5vcHRpb25zKSA9PT0gbnVsbCB8fCBfY29udGV4dCRvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY29udGV4dCRvcHRpb25zLmhlYWRlcnMpXG5cdFx0XHR9XG5cdFx0fSkudGhlbihhc3luYyAoZmV0Y2hSZXNwb25zZSkgPT4ge1xuXHRcdFx0cmVzcG9uc2UudmFsdWUgPSBmZXRjaFJlc3BvbnNlO1xuXHRcdFx0c3RhdHVzQ29kZS52YWx1ZSA9IGZldGNoUmVzcG9uc2Uuc3RhdHVzO1xuXHRcdFx0cmVzcG9uc2VEYXRhID0gYXdhaXQgZmV0Y2hSZXNwb25zZS5jbG9uZSgpW2NvbmZpZy50eXBlXSgpO1xuXHRcdFx0aWYgKCFmZXRjaFJlc3BvbnNlLm9rKSB7XG5cdFx0XHRcdGRhdGEudmFsdWUgPSBpbml0aWFsRGF0YSB8fCBudWxsO1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoZmV0Y2hSZXNwb25zZS5zdGF0dXNUZXh0KTtcblx0XHRcdH1cblx0XHRcdGlmIChvcHRpb25zLmFmdGVyRmV0Y2gpICh7ZGF0YTogcmVzcG9uc2VEYXRhfSA9IGF3YWl0IG9wdGlvbnMuYWZ0ZXJGZXRjaCh7XG5cdFx0XHRcdGRhdGE6IHJlc3BvbnNlRGF0YSxcblx0XHRcdFx0cmVzcG9uc2U6IGZldGNoUmVzcG9uc2UsXG5cdFx0XHRcdGNvbnRleHQsXG5cdFx0XHRcdGV4ZWN1dGVcblx0XHRcdH0pKTtcblx0XHRcdGRhdGEudmFsdWUgPSByZXNwb25zZURhdGE7XG5cdFx0XHRyZXNwb25zZUV2ZW50LnRyaWdnZXIoZmV0Y2hSZXNwb25zZSk7XG5cdFx0XHRyZXR1cm4gZmV0Y2hSZXNwb25zZTtcblx0XHR9KS5jYXRjaChhc3luYyAoZmV0Y2hFcnJvcikgPT4ge1xuXHRcdFx0bGV0IGVycm9yRGF0YSA9IGZldGNoRXJyb3IubWVzc2FnZSB8fCBmZXRjaEVycm9yLm5hbWU7XG5cdFx0XHRpZiAob3B0aW9ucy5vbkZldGNoRXJyb3IpICh7ZXJyb3I6IGVycm9yRGF0YSwgZGF0YTogcmVzcG9uc2VEYXRhfSA9IGF3YWl0IG9wdGlvbnMub25GZXRjaEVycm9yKHtcblx0XHRcdFx0ZGF0YTogcmVzcG9uc2VEYXRhLFxuXHRcdFx0XHRlcnJvcjogZmV0Y2hFcnJvcixcblx0XHRcdFx0cmVzcG9uc2U6IHJlc3BvbnNlLnZhbHVlLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRleGVjdXRlXG5cdFx0XHR9KSk7XG5cdFx0XHRlcnJvci52YWx1ZSA9IGVycm9yRGF0YTtcblx0XHRcdGlmIChvcHRpb25zLnVwZGF0ZURhdGFPbkVycm9yKSBkYXRhLnZhbHVlID0gcmVzcG9uc2VEYXRhO1xuXHRcdFx0ZXJyb3JFdmVudC50cmlnZ2VyKGZldGNoRXJyb3IpO1xuXHRcdFx0aWYgKHRocm93T25GYWlsZWQpIHRocm93IGZldGNoRXJyb3I7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9KS5maW5hbGx5KCgpID0+IHtcblx0XHRcdGlmIChjdXJyZW50RXhlY3V0ZUNvdW50ZXIgPT09IGV4ZWN1dGVDb3VudGVyKSBsb2FkaW5nKGZhbHNlKTtcblx0XHRcdGlmICh0aW1lcikgdGltZXIuc3RvcCgpO1xuXHRcdFx0ZmluYWxseUV2ZW50LnRyaWdnZXIobnVsbCk7XG5cdFx0fSk7XG5cdH07XG5cdGNvbnN0IHJlZmV0Y2ggPSB0b1JlZihvcHRpb25zLnJlZmV0Y2gpO1xuXHR3YXRjaChbcmVmZXRjaCwgdG9SZWYodXJsKV0sIChbcmVmZXRjaCQxXSkgPT4gcmVmZXRjaCQxICYmIGV4ZWN1dGUoKSwgeyBkZWVwOiB0cnVlIH0pO1xuXHRjb25zdCBzaGVsbCA9IHtcblx0XHRpc0ZpbmlzaGVkOiByZWFkb25seShpc0ZpbmlzaGVkKSxcblx0XHRpc0ZldGNoaW5nOiByZWFkb25seShpc0ZldGNoaW5nKSxcblx0XHRzdGF0dXNDb2RlLFxuXHRcdHJlc3BvbnNlLFxuXHRcdGVycm9yLFxuXHRcdGRhdGEsXG5cdFx0Y2FuQWJvcnQsXG5cdFx0YWJvcnRlZCxcblx0XHRhYm9ydCxcblx0XHRleGVjdXRlLFxuXHRcdG9uRmV0Y2hSZXNwb25zZTogcmVzcG9uc2VFdmVudC5vbixcblx0XHRvbkZldGNoRXJyb3I6IGVycm9yRXZlbnQub24sXG5cdFx0b25GZXRjaEZpbmFsbHk6IGZpbmFsbHlFdmVudC5vbixcblx0XHRnZXQ6IHNldE1ldGhvZChcIkdFVFwiKSxcblx0XHRwdXQ6IHNldE1ldGhvZChcIlBVVFwiKSxcblx0XHRwb3N0OiBzZXRNZXRob2QoXCJQT1NUXCIpLFxuXHRcdGRlbGV0ZTogc2V0TWV0aG9kKFwiREVMRVRFXCIpLFxuXHRcdHBhdGNoOiBzZXRNZXRob2QoXCJQQVRDSFwiKSxcblx0XHRoZWFkOiBzZXRNZXRob2QoXCJIRUFEXCIpLFxuXHRcdG9wdGlvbnM6IHNldE1ldGhvZChcIk9QVElPTlNcIiksXG5cdFx0anNvbjogc2V0VHlwZShcImpzb25cIiksXG5cdFx0dGV4dDogc2V0VHlwZShcInRleHRcIiksXG5cdFx0YmxvYjogc2V0VHlwZShcImJsb2JcIiksXG5cdFx0YXJyYXlCdWZmZXI6IHNldFR5cGUoXCJhcnJheUJ1ZmZlclwiKSxcblx0XHRmb3JtRGF0YTogc2V0VHlwZShcImZvcm1EYXRhXCIpXG5cdH07XG5cdGZ1bmN0aW9uIHNldE1ldGhvZChtZXRob2QpIHtcblx0XHRyZXR1cm4gKHBheWxvYWQsIHBheWxvYWRUeXBlKSA9PiB7XG5cdFx0XHRpZiAoIWlzRmV0Y2hpbmcudmFsdWUpIHtcblx0XHRcdFx0Y29uZmlnLm1ldGhvZCA9IG1ldGhvZDtcblx0XHRcdFx0Y29uZmlnLnBheWxvYWQgPSBwYXlsb2FkO1xuXHRcdFx0XHRjb25maWcucGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTtcblx0XHRcdFx0aWYgKGlzUmVmKGNvbmZpZy5wYXlsb2FkKSkgd2F0Y2goW3JlZmV0Y2gsIHRvUmVmKGNvbmZpZy5wYXlsb2FkKV0sIChbcmVmZXRjaCQxXSkgPT4gcmVmZXRjaCQxICYmIGV4ZWN1dGUoKSwgeyBkZWVwOiB0cnVlIH0pO1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdC4uLnNoZWxsLFxuXHRcdFx0XHRcdHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB3YWl0VW50aWxGaW5pc2hlZCgpLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdGZ1bmN0aW9uIHdhaXRVbnRpbEZpbmlzaGVkKCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR1bnRpbChpc0ZpbmlzaGVkKS50b0JlKHRydWUpLnRoZW4oKCkgPT4gcmVzb2x2ZShzaGVsbCkpLmNhdGNoKHJlamVjdCk7XG5cdFx0fSk7XG5cdH1cblx0ZnVuY3Rpb24gc2V0VHlwZSh0eXBlKSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGlmICghaXNGZXRjaGluZy52YWx1ZSkge1xuXHRcdFx0XHRjb25maWcudHlwZSA9IHR5cGU7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Li4uc2hlbGwsXG5cdFx0XHRcdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0aWYgKG9wdGlvbnMuaW1tZWRpYXRlKSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IGV4ZWN1dGUoKSk7XG5cdHJldHVybiB7XG5cdFx0Li4uc2hlbGwsXG5cdFx0dGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuXHRcdFx0cmV0dXJuIHdhaXRVbnRpbEZpbmlzaGVkKCkudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gam9pblBhdGhzKHN0YXJ0LCBlbmQpIHtcblx0aWYgKCFzdGFydC5lbmRzV2l0aChcIi9cIikgJiYgIWVuZC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIGAke3N0YXJ0fS8ke2VuZH1gO1xuXHRpZiAoc3RhcnQuZW5kc1dpdGgoXCIvXCIpICYmIGVuZC5zdGFydHNXaXRoKFwiL1wiKSkgcmV0dXJuIGAke3N0YXJ0LnNsaWNlKDAsIC0xKX0ke2VuZH1gO1xuXHRyZXR1cm4gYCR7c3RhcnR9JHtlbmR9YDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmlsZURpYWxvZy9pbmRleC50c1xuY29uc3QgREVGQVVMVF9PUFRJT05TID0ge1xuXHRtdWx0aXBsZTogdHJ1ZSxcblx0YWNjZXB0OiBcIipcIixcblx0cmVzZXQ6IGZhbHNlLFxuXHRkaXJlY3Rvcnk6IGZhbHNlXG59O1xuZnVuY3Rpb24gcHJlcGFyZUluaXRpYWxGaWxlcyhmaWxlcykge1xuXHRpZiAoIWZpbGVzKSByZXR1cm4gbnVsbDtcblx0aWYgKGZpbGVzIGluc3RhbmNlb2YgRmlsZUxpc3QpIHJldHVybiBmaWxlcztcblx0Y29uc3QgZHQgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG5cdGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgZHQuaXRlbXMuYWRkKGZpbGUpO1xuXHRyZXR1cm4gZHQuZmlsZXM7XG59XG4vKipcbiogT3BlbiBmaWxlIGRpYWxvZyB3aXRoIGVhc2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZpbGVEaWFsb2dcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VGaWxlRGlhbG9nKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBmaWxlcyA9IHJlZihwcmVwYXJlSW5pdGlhbEZpbGVzKG9wdGlvbnMuaW5pdGlhbEZpbGVzKSk7XG5cdGNvbnN0IHsgb246IG9uQ2hhbmdlLCB0cmlnZ2VyOiBjaGFuZ2VUcmlnZ2VyIH0gPSBjcmVhdGVFdmVudEhvb2soKTtcblx0Y29uc3QgeyBvbjogb25DYW5jZWwsIHRyaWdnZXI6IGNhbmNlbFRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBpbnB1dFJlZiA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX3VucmVmRWxlbWVudDtcblx0XHRjb25zdCBpbnB1dCA9IChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KG9wdGlvbnMuaW5wdXQpKSAhPT0gbnVsbCAmJiBfdW5yZWZFbGVtZW50ICE9PSB2b2lkIDAgPyBfdW5yZWZFbGVtZW50IDogZG9jdW1lbnQkMSA/IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChcImlucHV0XCIpIDogdm9pZCAwO1xuXHRcdGlmIChpbnB1dCkge1xuXHRcdFx0aW5wdXQudHlwZSA9IFwiZmlsZVwiO1xuXHRcdFx0aW5wdXQub25jaGFuZ2UgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0ZmlsZXMudmFsdWUgPSBldmVudC50YXJnZXQuZmlsZXM7XG5cdFx0XHRcdGNoYW5nZVRyaWdnZXIoZmlsZXMudmFsdWUpO1xuXHRcdFx0fTtcblx0XHRcdGlucHV0Lm9uY2FuY2VsID0gKCkgPT4ge1xuXHRcdFx0XHRjYW5jZWxUcmlnZ2VyKCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH0pO1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHRmaWxlcy52YWx1ZSA9IG51bGw7XG5cdFx0aWYgKGlucHV0UmVmLnZhbHVlICYmIGlucHV0UmVmLnZhbHVlLnZhbHVlKSB7XG5cdFx0XHRpbnB1dFJlZi52YWx1ZS52YWx1ZSA9IFwiXCI7XG5cdFx0XHRjaGFuZ2VUcmlnZ2VyKG51bGwpO1xuXHRcdH1cblx0fTtcblx0Y29uc3QgYXBwbHlPcHRpb25zID0gKG9wdGlvbnMkMSkgPT4ge1xuXHRcdGNvbnN0IGVsID0gaW5wdXRSZWYudmFsdWU7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLm11bHRpcGxlID0gdG9WYWx1ZShvcHRpb25zJDEubXVsdGlwbGUpO1xuXHRcdGVsLmFjY2VwdCA9IHRvVmFsdWUob3B0aW9ucyQxLmFjY2VwdCk7XG5cdFx0ZWwud2Via2l0ZGlyZWN0b3J5ID0gdG9WYWx1ZShvcHRpb25zJDEuZGlyZWN0b3J5KTtcblx0XHRpZiAoaGFzT3duKG9wdGlvbnMkMSwgXCJjYXB0dXJlXCIpKSBlbC5jYXB0dXJlID0gdG9WYWx1ZShvcHRpb25zJDEuY2FwdHVyZSk7XG5cdH07XG5cdGNvbnN0IG9wZW4gPSAobG9jYWxPcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSBpbnB1dFJlZi52YWx1ZTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0Y29uc3QgbWVyZ2VkT3B0aW9ucyA9IHtcblx0XHRcdC4uLkRFRkFVTFRfT1BUSU9OUyxcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHQuLi5sb2NhbE9wdGlvbnNcblx0XHR9O1xuXHRcdGFwcGx5T3B0aW9ucyhtZXJnZWRPcHRpb25zKTtcblx0XHRpZiAodG9WYWx1ZShtZXJnZWRPcHRpb25zLnJlc2V0KSkgcmVzZXQoKTtcblx0XHRlbC5jbGljaygpO1xuXHR9O1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0YXBwbHlPcHRpb25zKG9wdGlvbnMpO1xuXHR9KTtcblx0cmV0dXJuIHtcblx0XHRmaWxlczogcmVhZG9ubHkoZmlsZXMpLFxuXHRcdG9wZW4sXG5cdFx0cmVzZXQsXG5cdFx0b25DYW5jZWwsXG5cdFx0b25DaGFuZ2Vcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRmlsZVN5c3RlbUFjY2Vzcy9pbmRleC50c1xuZnVuY3Rpb24gdXNlRmlsZVN5c3RlbUFjY2VzcyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IF93aW5kb3cgPSBkZWZhdWx0V2luZG93LCBkYXRhVHlwZSA9IFwiVGV4dFwiIH0gPSBvcHRpb25zO1xuXHRjb25zdCB3aW5kb3ckMSA9IF93aW5kb3c7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcInNob3dTYXZlRmlsZVBpY2tlclwiIGluIHdpbmRvdyQxICYmIFwic2hvd09wZW5GaWxlUGlja2VyXCIgaW4gd2luZG93JDEpO1xuXHRjb25zdCBmaWxlSGFuZGxlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBkYXRhID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBmaWxlID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCBmaWxlTmFtZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkbmFtZSwgX2ZpbGUkdmFsdWU7XG5cdFx0cmV0dXJuIChfZmlsZSR2YWx1ZSRuYW1lID0gKF9maWxlJHZhbHVlID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlLm5hbWUpICE9PSBudWxsICYmIF9maWxlJHZhbHVlJG5hbWUgIT09IHZvaWQgMCA/IF9maWxlJHZhbHVlJG5hbWUgOiBcIlwiO1xuXHR9KTtcblx0Y29uc3QgZmlsZU1JTUUgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF9maWxlJHZhbHVlJHR5cGUsIF9maWxlJHZhbHVlMjtcblx0XHRyZXR1cm4gKF9maWxlJHZhbHVlJHR5cGUgPSAoX2ZpbGUkdmFsdWUyID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWUyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZSR2YWx1ZTIudHlwZSkgIT09IG51bGwgJiYgX2ZpbGUkdmFsdWUkdHlwZSAhPT0gdm9pZCAwID8gX2ZpbGUkdmFsdWUkdHlwZSA6IFwiXCI7XG5cdH0pO1xuXHRjb25zdCBmaWxlU2l6ZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHR2YXIgX2ZpbGUkdmFsdWUkc2l6ZSwgX2ZpbGUkdmFsdWUzO1xuXHRcdHJldHVybiAoX2ZpbGUkdmFsdWUkc2l6ZSA9IChfZmlsZSR2YWx1ZTMgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlMy5zaXplKSAhPT0gbnVsbCAmJiBfZmlsZSR2YWx1ZSRzaXplICE9PSB2b2lkIDAgPyBfZmlsZSR2YWx1ZSRzaXplIDogMDtcblx0fSk7XG5cdGNvbnN0IGZpbGVMYXN0TW9kaWZpZWQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF9maWxlJHZhbHVlJGxhc3RNb2RpZiwgX2ZpbGUkdmFsdWU0O1xuXHRcdHJldHVybiAoX2ZpbGUkdmFsdWUkbGFzdE1vZGlmID0gKF9maWxlJHZhbHVlNCA9IGZpbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlJHZhbHVlNCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ZpbGUkdmFsdWU0Lmxhc3RNb2RpZmllZCkgIT09IG51bGwgJiYgX2ZpbGUkdmFsdWUkbGFzdE1vZGlmICE9PSB2b2lkIDAgPyBfZmlsZSR2YWx1ZSRsYXN0TW9kaWYgOiAwO1xuXHR9KTtcblx0YXN5bmMgZnVuY3Rpb24gb3Blbihfb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGNvbnN0IFtoYW5kbGVdID0gYXdhaXQgd2luZG93JDEuc2hvd09wZW5GaWxlUGlja2VyKHtcblx0XHRcdC4uLnRvVmFsdWUob3B0aW9ucyksXG5cdFx0XHQuLi5fb3B0aW9uc1xuXHRcdH0pO1xuXHRcdGZpbGVIYW5kbGUudmFsdWUgPSBoYW5kbGU7XG5cdFx0YXdhaXQgdXBkYXRlRGF0YSgpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZShfb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGZpbGVIYW5kbGUudmFsdWUgPSBhd2FpdCB3aW5kb3ckMS5zaG93U2F2ZUZpbGVQaWNrZXIoe1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdC4uLl9vcHRpb25zXG5cdFx0fSk7XG5cdFx0ZGF0YS52YWx1ZSA9IHZvaWQgMDtcblx0XHRhd2FpdCB1cGRhdGVEYXRhKCk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gc2F2ZShfb3B0aW9ucyA9IHt9KSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmICghZmlsZUhhbmRsZS52YWx1ZSkgcmV0dXJuIHNhdmVBcyhfb3B0aW9ucyk7XG5cdFx0aWYgKGRhdGEudmFsdWUpIHtcblx0XHRcdGNvbnN0IHdyaXRhYmxlU3RyZWFtID0gYXdhaXQgZmlsZUhhbmRsZS52YWx1ZS5jcmVhdGVXcml0YWJsZSgpO1xuXHRcdFx0YXdhaXQgd3JpdGFibGVTdHJlYW0ud3JpdGUoZGF0YS52YWx1ZSk7XG5cdFx0XHRhd2FpdCB3cml0YWJsZVN0cmVhbS5jbG9zZSgpO1xuXHRcdH1cblx0XHRhd2FpdCB1cGRhdGVGaWxlKCk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gc2F2ZUFzKF9vcHRpb25zID0ge30pIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0ZmlsZUhhbmRsZS52YWx1ZSA9IGF3YWl0IHdpbmRvdyQxLnNob3dTYXZlRmlsZVBpY2tlcih7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0Li4uX29wdGlvbnNcblx0XHR9KTtcblx0XHRpZiAoZGF0YS52YWx1ZSkge1xuXHRcdFx0Y29uc3Qgd3JpdGFibGVTdHJlYW0gPSBhd2FpdCBmaWxlSGFuZGxlLnZhbHVlLmNyZWF0ZVdyaXRhYmxlKCk7XG5cdFx0XHRhd2FpdCB3cml0YWJsZVN0cmVhbS53cml0ZShkYXRhLnZhbHVlKTtcblx0XHRcdGF3YWl0IHdyaXRhYmxlU3RyZWFtLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHVwZGF0ZUZpbGUoKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlKCkge1xuXHRcdHZhciBfZmlsZUhhbmRsZSR2YWx1ZTtcblx0XHRmaWxlLnZhbHVlID0gYXdhaXQgKChfZmlsZUhhbmRsZSR2YWx1ZSA9IGZpbGVIYW5kbGUudmFsdWUpID09PSBudWxsIHx8IF9maWxlSGFuZGxlJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZUhhbmRsZSR2YWx1ZS5nZXRGaWxlKCkpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURhdGEoKSB7XG5cdFx0dmFyIF9maWxlJHZhbHVlNSwgX2ZpbGUkdmFsdWU2O1xuXHRcdGF3YWl0IHVwZGF0ZUZpbGUoKTtcblx0XHRjb25zdCB0eXBlID0gdG9WYWx1ZShkYXRhVHlwZSk7XG5cdFx0aWYgKHR5cGUgPT09IFwiVGV4dFwiKSBkYXRhLnZhbHVlID0gYXdhaXQgKChfZmlsZSR2YWx1ZTUgPSBmaWxlLnZhbHVlKSA9PT0gbnVsbCB8fCBfZmlsZSR2YWx1ZTUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxlJHZhbHVlNS50ZXh0KCkpO1xuXHRcdGVsc2UgaWYgKHR5cGUgPT09IFwiQXJyYXlCdWZmZXJcIikgZGF0YS52YWx1ZSA9IGF3YWl0ICgoX2ZpbGUkdmFsdWU2ID0gZmlsZS52YWx1ZSkgPT09IG51bGwgfHwgX2ZpbGUkdmFsdWU2ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZmlsZSR2YWx1ZTYuYXJyYXlCdWZmZXIoKSk7XG5cdFx0ZWxzZSBpZiAodHlwZSA9PT0gXCJCbG9iXCIpIGRhdGEudmFsdWUgPSBmaWxlLnZhbHVlO1xuXHR9XG5cdHdhdGNoKCgpID0+IHRvVmFsdWUoZGF0YVR5cGUpLCB1cGRhdGVEYXRhKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRkYXRhLFxuXHRcdGZpbGUsXG5cdFx0ZmlsZU5hbWUsXG5cdFx0ZmlsZU1JTUUsXG5cdFx0ZmlsZVNpemUsXG5cdFx0ZmlsZUxhc3RNb2RpZmllZCxcblx0XHRvcGVuLFxuXHRcdGNyZWF0ZSxcblx0XHRzYXZlLFxuXHRcdHNhdmVBcyxcblx0XHR1cGRhdGVEYXRhXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUZvY3VzL2luZGV4LnRzXG4vKipcbiogVHJhY2sgb3Igc2V0IHRoZSBmb2N1cyBzdGF0ZSBvZiBhIERPTSBlbGVtZW50LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VGb2N1c1xuKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGZvY3VzIGFuZCBibHVyIGV2ZW50cy5cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VGb2N1cyh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxWYWx1ZSA9IGZhbHNlLCBmb2N1c1Zpc2libGUgPSBmYWxzZSwgcHJldmVudFNjcm9sbCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpbm5lckZvY3VzZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgdGFyZ2V0RWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgXCJmb2N1c1wiLCAoZXZlbnQpID0+IHtcblx0XHR2YXIgX21hdGNoZXMsIF9yZWY7XG5cdFx0aWYgKCFmb2N1c1Zpc2libGUgfHwgKChfbWF0Y2hlcyA9IChfcmVmID0gZXZlbnQudGFyZ2V0KS5tYXRjaGVzKSA9PT0gbnVsbCB8fCBfbWF0Y2hlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX21hdGNoZXMuY2FsbChfcmVmLCBcIjpmb2N1cy12aXNpYmxlXCIpKSkgaW5uZXJGb2N1c2VkLnZhbHVlID0gdHJ1ZTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBcImJsdXJcIiwgKCkgPT4gaW5uZXJGb2N1c2VkLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGNvbnN0IGZvY3VzZWQgPSBjb21wdXRlZCh7XG5cdFx0Z2V0OiAoKSA9PiBpbm5lckZvY3VzZWQudmFsdWUsXG5cdFx0c2V0KHZhbHVlKSB7XG5cdFx0XHR2YXIgX3RhcmdldEVsZW1lbnQkdmFsdWUsIF90YXJnZXRFbGVtZW50JHZhbHVlMjtcblx0XHRcdGlmICghdmFsdWUgJiYgaW5uZXJGb2N1c2VkLnZhbHVlKSAoX3RhcmdldEVsZW1lbnQkdmFsdWUgPSB0YXJnZXRFbGVtZW50LnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZSA9PT0gdm9pZCAwIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlLmJsdXIoKTtcblx0XHRcdGVsc2UgaWYgKHZhbHVlICYmICFpbm5lckZvY3VzZWQudmFsdWUpIChfdGFyZ2V0RWxlbWVudCR2YWx1ZTIgPSB0YXJnZXRFbGVtZW50LnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZTIgPT09IHZvaWQgMCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZTIuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsIH0pO1xuXHRcdH1cblx0fSk7XG5cdHdhdGNoKHRhcmdldEVsZW1lbnQsICgpID0+IHtcblx0XHRmb2N1c2VkLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHR9LCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KTtcblx0cmV0dXJuIHsgZm9jdXNlZCB9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VGb2N1c1dpdGhpbi9pbmRleC50c1xuY29uc3QgRVZFTlRfRk9DVVNfSU4gPSBcImZvY3VzaW5cIjtcbmNvbnN0IEVWRU5UX0ZPQ1VTX09VVCA9IFwiZm9jdXNvdXRcIjtcbmNvbnN0IFBTRVVET19DTEFTU19GT0NVU19XSVRISU4gPSBcIjpmb2N1cy13aXRoaW5cIjtcbi8qKlxuKiBUcmFjayBpZiBmb2N1cyBpcyBjb250YWluZWQgd2l0aGluIHRoZSB0YXJnZXQgZWxlbWVudFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VGb2N1c1dpdGhpblxuKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudCB0byB0cmFja1xuKiBAcGFyYW0gb3B0aW9ucyBGb2N1cyB3aXRoaW4gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZvY3VzV2l0aGluKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHRhcmdldEVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB1bnJlZkVsZW1lbnQodGFyZ2V0KSk7XG5cdGNvbnN0IF9mb2N1c2VkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGZvY3VzZWQgPSBjb21wdXRlZCgoKSA9PiBfZm9jdXNlZC52YWx1ZSk7XG5cdGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB1c2VBY3RpdmVFbGVtZW50KG9wdGlvbnMpO1xuXHRpZiAoIXdpbmRvdyQxIHx8ICFhY3RpdmVFbGVtZW50LnZhbHVlKSByZXR1cm4geyBmb2N1c2VkIH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIEVWRU5UX0ZPQ1VTX0lOLCAoKSA9PiBfZm9jdXNlZC52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0RWxlbWVudCwgRVZFTlRfRk9DVVNfT1VULCAoKSA9PiB7XG5cdFx0dmFyIF90YXJnZXRFbGVtZW50JHZhbHVlJCwgX3RhcmdldEVsZW1lbnQkdmFsdWUsIF90YXJnZXRFbGVtZW50JHZhbHVlJDI7XG5cdFx0cmV0dXJuIF9mb2N1c2VkLnZhbHVlID0gKF90YXJnZXRFbGVtZW50JHZhbHVlJCA9IChfdGFyZ2V0RWxlbWVudCR2YWx1ZSA9IHRhcmdldEVsZW1lbnQudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRFbGVtZW50JHZhbHVlID09PSB2b2lkIDAgfHwgKF90YXJnZXRFbGVtZW50JHZhbHVlJDIgPSBfdGFyZ2V0RWxlbWVudCR2YWx1ZS5tYXRjaGVzKSA9PT0gbnVsbCB8fCBfdGFyZ2V0RWxlbWVudCR2YWx1ZSQyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdGFyZ2V0RWxlbWVudCR2YWx1ZSQyLmNhbGwoX3RhcmdldEVsZW1lbnQkdmFsdWUsIFBTRVVET19DTEFTU19GT0NVU19XSVRISU4pKSAhPT0gbnVsbCAmJiBfdGFyZ2V0RWxlbWVudCR2YWx1ZSQgIT09IHZvaWQgMCA/IF90YXJnZXRFbGVtZW50JHZhbHVlJCA6IGZhbHNlO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRyZXR1cm4geyBmb2N1c2VkIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUZwcy9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZUZwcyhvcHRpb25zKSB7XG5cdHZhciBfb3B0aW9ucyRldmVyeTtcblx0Y29uc3QgZnBzID0gc2hhbGxvd1JlZigwKTtcblx0aWYgKHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZwcztcblx0Y29uc3QgZXZlcnkgPSAoX29wdGlvbnMkZXZlcnkgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZXZlcnkpICE9PSBudWxsICYmIF9vcHRpb25zJGV2ZXJ5ICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRldmVyeSA6IDEwO1xuXHRsZXQgbGFzdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXHRsZXQgdGlja3MgPSAwO1xuXHR1c2VSYWZGbigoKSA9PiB7XG5cdFx0dGlja3MgKz0gMTtcblx0XHRpZiAodGlja3MgPj0gZXZlcnkpIHtcblx0XHRcdGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXHRcdFx0Y29uc3QgZGlmZiA9IG5vdyAtIGxhc3Q7XG5cdFx0XHRmcHMudmFsdWUgPSBNYXRoLnJvdW5kKDFlMyAvIChkaWZmIC8gdGlja3MpKTtcblx0XHRcdGxhc3QgPSBub3c7XG5cdFx0XHR0aWNrcyA9IDA7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZwcztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlRnVsbHNjcmVlbi9pbmRleC50c1xuY29uc3QgZXZlbnRIYW5kbGVycyA9IFtcblx0XCJmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZVwiLFxuXHRcIndlYmtpdGVuZGZ1bGxzY3JlZW5cIixcblx0XCJtb3pmdWxsc2NyZWVuY2hhbmdlXCIsXG5cdFwiTVNGdWxsc2NyZWVuQ2hhbmdlXCJcbl07XG4vKipcbiogUmVhY3RpdmUgRnVsbHNjcmVlbiBBUEkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUZ1bGxzY3JlZW5cbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUZ1bGxzY3JlZW4odGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgYXV0b0V4aXQgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgdGFyZ2V0UmVmID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHZhciBfdW5yZWZFbGVtZW50O1xuXHRcdHJldHVybiAoX3VucmVmRWxlbWVudCA9IHVucmVmRWxlbWVudCh0YXJnZXQpKSAhPT0gbnVsbCAmJiBfdW5yZWZFbGVtZW50ICE9PSB2b2lkIDAgPyBfdW5yZWZFbGVtZW50IDogZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLmRvY3VtZW50RWxlbWVudDtcblx0fSk7XG5cdGNvbnN0IGlzRnVsbHNjcmVlbiA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCByZXF1ZXN0TWV0aG9kID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdHJldHVybiBbXG5cdFx0XHRcInJlcXVlc3RGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuXCIsXG5cdFx0XHRcIndlYmtpdEVudGVyRnVsbHNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRFbnRlckZ1bGxTY3JlZW5cIixcblx0XHRcdFwid2Via2l0UmVxdWVzdEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibW96UmVxdWVzdEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibXNSZXF1ZXN0RnVsbHNjcmVlblwiXG5cdFx0XS5maW5kKChtKSA9PiBkb2N1bWVudCQxICYmIG0gaW4gZG9jdW1lbnQkMSB8fCB0YXJnZXRSZWYudmFsdWUgJiYgbSBpbiB0YXJnZXRSZWYudmFsdWUpO1xuXHR9KTtcblx0Y29uc3QgZXhpdE1ldGhvZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0XCJleGl0RnVsbHNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRFeGl0RnVsbHNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRFeGl0RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRDYW5jZWxGdWxsU2NyZWVuXCIsXG5cdFx0XHRcIm1vekNhbmNlbEZ1bGxTY3JlZW5cIixcblx0XHRcdFwibXNFeGl0RnVsbHNjcmVlblwiXG5cdFx0XS5maW5kKChtKSA9PiBkb2N1bWVudCQxICYmIG0gaW4gZG9jdW1lbnQkMSB8fCB0YXJnZXRSZWYudmFsdWUgJiYgbSBpbiB0YXJnZXRSZWYudmFsdWUpO1xuXHR9KTtcblx0Y29uc3QgZnVsbHNjcmVlbkVuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdFwiZnVsbFNjcmVlblwiLFxuXHRcdFx0XCJ3ZWJraXRJc0Z1bGxTY3JlZW5cIixcblx0XHRcdFwid2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW5cIixcblx0XHRcdFwibW96RnVsbFNjcmVlblwiLFxuXHRcdFx0XCJtc0Z1bGxzY3JlZW5FbGVtZW50XCJcblx0XHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxIHx8IHRhcmdldFJlZi52YWx1ZSAmJiBtIGluIHRhcmdldFJlZi52YWx1ZSk7XG5cdH0pO1xuXHRjb25zdCBmdWxsc2NyZWVuRWxlbWVudE1ldGhvZCA9IFtcblx0XHRcImZ1bGxzY3JlZW5FbGVtZW50XCIsXG5cdFx0XCJ3ZWJraXRGdWxsc2NyZWVuRWxlbWVudFwiLFxuXHRcdFwibW96RnVsbFNjcmVlbkVsZW1lbnRcIixcblx0XHRcIm1zRnVsbHNjcmVlbkVsZW1lbnRcIlxuXHRdLmZpbmQoKG0pID0+IGRvY3VtZW50JDEgJiYgbSBpbiBkb2N1bWVudCQxKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHRhcmdldFJlZi52YWx1ZSAmJiBkb2N1bWVudCQxICYmIHJlcXVlc3RNZXRob2QudmFsdWUgIT09IHZvaWQgMCAmJiBleGl0TWV0aG9kLnZhbHVlICE9PSB2b2lkIDAgJiYgZnVsbHNjcmVlbkVuYWJsZWQudmFsdWUgIT09IHZvaWQgMCk7XG5cdGNvbnN0IGlzQ3VycmVudEVsZW1lbnRGdWxsU2NyZWVuID0gKCkgPT4ge1xuXHRcdGlmIChmdWxsc2NyZWVuRWxlbWVudE1ldGhvZCkgcmV0dXJuIChkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDFbZnVsbHNjcmVlbkVsZW1lbnRNZXRob2RdKSA9PT0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblx0Y29uc3QgaXNFbGVtZW50RnVsbFNjcmVlbiA9ICgpID0+IHtcblx0XHRpZiAoZnVsbHNjcmVlbkVuYWJsZWQudmFsdWUpIGlmIChkb2N1bWVudCQxICYmIGRvY3VtZW50JDFbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdICE9IG51bGwpIHJldHVybiBkb2N1bWVudCQxW2Z1bGxzY3JlZW5FbmFibGVkLnZhbHVlXTtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHRhcmdldCQxID0gdGFyZ2V0UmVmLnZhbHVlO1xuXHRcdFx0aWYgKCh0YXJnZXQkMSA9PT0gbnVsbCB8fCB0YXJnZXQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0JDFbZnVsbHNjcmVlbkVuYWJsZWQudmFsdWVdKSAhPSBudWxsKSByZXR1cm4gQm9vbGVhbih0YXJnZXQkMVtmdWxsc2NyZWVuRW5hYmxlZC52YWx1ZV0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cdGFzeW5jIGZ1bmN0aW9uIGV4aXQoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCAhaXNGdWxsc2NyZWVuLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGV4aXRNZXRob2QudmFsdWUpIGlmICgoZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxW2V4aXRNZXRob2QudmFsdWVdKSAhPSBudWxsKSBhd2FpdCBkb2N1bWVudCQxW2V4aXRNZXRob2QudmFsdWVdKCk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCB0YXJnZXQkMSA9IHRhcmdldFJlZi52YWx1ZTtcblx0XHRcdGlmICgodGFyZ2V0JDEgPT09IG51bGwgfHwgdGFyZ2V0JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldCQxW2V4aXRNZXRob2QudmFsdWVdKSAhPSBudWxsKSBhd2FpdCB0YXJnZXQkMVtleGl0TWV0aG9kLnZhbHVlXSgpO1xuXHRcdH1cblx0XHRpc0Z1bGxzY3JlZW4udmFsdWUgPSBmYWxzZTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBlbnRlcigpIHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlIHx8IGlzRnVsbHNjcmVlbi52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChpc0VsZW1lbnRGdWxsU2NyZWVuKCkpIGF3YWl0IGV4aXQoKTtcblx0XHRjb25zdCB0YXJnZXQkMSA9IHRhcmdldFJlZi52YWx1ZTtcblx0XHRpZiAocmVxdWVzdE1ldGhvZC52YWx1ZSAmJiAodGFyZ2V0JDEgPT09IG51bGwgfHwgdGFyZ2V0JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldCQxW3JlcXVlc3RNZXRob2QudmFsdWVdKSAhPSBudWxsKSB7XG5cdFx0XHRhd2FpdCB0YXJnZXQkMVtyZXF1ZXN0TWV0aG9kLnZhbHVlXSgpO1xuXHRcdFx0aXNGdWxsc2NyZWVuLnZhbHVlID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHRcdGF3YWl0IChpc0Z1bGxzY3JlZW4udmFsdWUgPyBleGl0KCkgOiBlbnRlcigpKTtcblx0fVxuXHRjb25zdCBoYW5kbGVyQ2FsbGJhY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlID0gaXNFbGVtZW50RnVsbFNjcmVlbigpO1xuXHRcdGlmICghaXNFbGVtZW50RnVsbFNjcmVlblZhbHVlIHx8IGlzRWxlbWVudEZ1bGxTY3JlZW5WYWx1ZSAmJiBpc0N1cnJlbnRFbGVtZW50RnVsbFNjcmVlbigpKSBpc0Z1bGxzY3JlZW4udmFsdWUgPSBpc0VsZW1lbnRGdWxsU2NyZWVuVmFsdWU7XG5cdH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRjYXB0dXJlOiBmYWxzZSxcblx0XHRwYXNzaXZlOiB0cnVlXG5cdH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgZXZlbnRIYW5kbGVycywgaGFuZGxlckNhbGxiYWNrLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKCgpID0+IHVucmVmRWxlbWVudCh0YXJnZXRSZWYpLCBldmVudEhhbmRsZXJzLCBoYW5kbGVyQ2FsbGJhY2ssIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZChoYW5kbGVyQ2FsbGJhY2ssIGZhbHNlKTtcblx0aWYgKGF1dG9FeGl0KSB0cnlPblNjb3BlRGlzcG9zZShleGl0KTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc0Z1bGxzY3JlZW4sXG5cdFx0ZW50ZXIsXG5cdFx0ZXhpdCxcblx0XHR0b2dnbGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlR2FtZXBhZC9pbmRleC50c1xuLyoqXG4qIE1hcHMgYSBzdGFuZGFyZCBzdGFuZGFyZCBnYW1lcGFkIHRvIGFuIFhib3ggMzYwIENvbnRyb2xsZXIuXG4qL1xuZnVuY3Rpb24gbWFwR2FtZXBhZFRvWGJveDM2MENvbnRyb2xsZXIoZ2FtZXBhZCkge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChnYW1lcGFkLnZhbHVlKSByZXR1cm4ge1xuXHRcdFx0YnV0dG9uczoge1xuXHRcdFx0XHRhOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbMF0sXG5cdFx0XHRcdGI6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1sxXSxcblx0XHRcdFx0eDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzJdLFxuXHRcdFx0XHR5OiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbM11cblx0XHRcdH0sXG5cdFx0XHRidW1wZXI6IHtcblx0XHRcdFx0bGVmdDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzRdLFxuXHRcdFx0XHRyaWdodDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzVdXG5cdFx0XHR9LFxuXHRcdFx0dHJpZ2dlcnM6IHtcblx0XHRcdFx0bGVmdDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzZdLFxuXHRcdFx0XHRyaWdodDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzddXG5cdFx0XHR9LFxuXHRcdFx0c3RpY2s6IHtcblx0XHRcdFx0bGVmdDoge1xuXHRcdFx0XHRcdGhvcml6b250YWw6IGdhbWVwYWQudmFsdWUuYXhlc1swXSxcblx0XHRcdFx0XHR2ZXJ0aWNhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzFdLFxuXHRcdFx0XHRcdGJ1dHRvbjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzEwXVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyaWdodDoge1xuXHRcdFx0XHRcdGhvcml6b250YWw6IGdhbWVwYWQudmFsdWUuYXhlc1syXSxcblx0XHRcdFx0XHR2ZXJ0aWNhbDogZ2FtZXBhZC52YWx1ZS5heGVzWzNdLFxuXHRcdFx0XHRcdGJ1dHRvbjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzExXVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZHBhZDoge1xuXHRcdFx0XHR1cDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzEyXSxcblx0XHRcdFx0ZG93bjogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzEzXSxcblx0XHRcdFx0bGVmdDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzE0XSxcblx0XHRcdFx0cmlnaHQ6IGdhbWVwYWQudmFsdWUuYnV0dG9uc1sxNV1cblx0XHRcdH0sXG5cdFx0XHRiYWNrOiBnYW1lcGFkLnZhbHVlLmJ1dHRvbnNbOF0sXG5cdFx0XHRzdGFydDogZ2FtZXBhZC52YWx1ZS5idXR0b25zWzldXG5cdFx0fTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fSk7XG59XG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlR2FtZXBhZChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiZ2V0R2FtZXBhZHNcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IGdhbWVwYWRzID0gcmVmKFtdKTtcblx0Y29uc3Qgb25Db25uZWN0ZWRIb29rID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IG9uRGlzY29ubmVjdGVkSG9vayA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBzdGF0ZUZyb21HYW1lcGFkID0gKGdhbWVwYWQpID0+IHtcblx0XHRjb25zdCBoYXB0aWNBY3R1YXRvcnMgPSBbXTtcblx0XHRjb25zdCB2aWJyYXRpb25BY3R1YXRvciA9IFwidmlicmF0aW9uQWN0dWF0b3JcIiBpbiBnYW1lcGFkID8gZ2FtZXBhZC52aWJyYXRpb25BY3R1YXRvciA6IG51bGw7XG5cdFx0aWYgKHZpYnJhdGlvbkFjdHVhdG9yKSBoYXB0aWNBY3R1YXRvcnMucHVzaCh2aWJyYXRpb25BY3R1YXRvcik7XG5cdFx0aWYgKGdhbWVwYWQuaGFwdGljQWN0dWF0b3JzKSBoYXB0aWNBY3R1YXRvcnMucHVzaCguLi5nYW1lcGFkLmhhcHRpY0FjdHVhdG9ycyk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBnYW1lcGFkLmlkLFxuXHRcdFx0aW5kZXg6IGdhbWVwYWQuaW5kZXgsXG5cdFx0XHRjb25uZWN0ZWQ6IGdhbWVwYWQuY29ubmVjdGVkLFxuXHRcdFx0bWFwcGluZzogZ2FtZXBhZC5tYXBwaW5nLFxuXHRcdFx0dGltZXN0YW1wOiBnYW1lcGFkLnRpbWVzdGFtcCxcblx0XHRcdHZpYnJhdGlvbkFjdHVhdG9yOiBnYW1lcGFkLnZpYnJhdGlvbkFjdHVhdG9yLFxuXHRcdFx0aGFwdGljQWN0dWF0b3JzLFxuXHRcdFx0YXhlczogZ2FtZXBhZC5heGVzLm1hcCgoYXhlcykgPT4gYXhlcyksXG5cdFx0XHRidXR0b25zOiBnYW1lcGFkLmJ1dHRvbnMubWFwKChidXR0b24pID0+ICh7XG5cdFx0XHRcdHByZXNzZWQ6IGJ1dHRvbi5wcmVzc2VkLFxuXHRcdFx0XHR0b3VjaGVkOiBidXR0b24udG91Y2hlZCxcblx0XHRcdFx0dmFsdWU6IGJ1dHRvbi52YWx1ZVxuXHRcdFx0fSkpXG5cdFx0fTtcblx0fTtcblx0Y29uc3QgdXBkYXRlR2FtZXBhZFN0YXRlID0gKCkgPT4ge1xuXHRcdGNvbnN0IF9nYW1lcGFkcyA9IChuYXZpZ2F0b3IkMSA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yJDEuZ2V0R2FtZXBhZHMoKSkgfHwgW107XG5cdFx0Zm9yIChjb25zdCBnYW1lcGFkIG9mIF9nYW1lcGFkcykgaWYgKGdhbWVwYWQgJiYgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0pIGdhbWVwYWRzLnZhbHVlW2dhbWVwYWQuaW5kZXhdID0gc3RhdGVGcm9tR2FtZXBhZChnYW1lcGFkKTtcblx0fTtcblx0Y29uc3QgeyBpc0FjdGl2ZSwgcGF1c2UsIHJlc3VtZSB9ID0gdXNlUmFmRm4odXBkYXRlR2FtZXBhZFN0YXRlKTtcblx0Y29uc3Qgb25HYW1lcGFkQ29ubmVjdGVkID0gKGdhbWVwYWQpID0+IHtcblx0XHRpZiAoIWdhbWVwYWRzLnZhbHVlLnNvbWUoKHsgaW5kZXggfSkgPT4gaW5kZXggPT09IGdhbWVwYWQuaW5kZXgpKSB7XG5cdFx0XHRnYW1lcGFkcy52YWx1ZS5wdXNoKHN0YXRlRnJvbUdhbWVwYWQoZ2FtZXBhZCkpO1xuXHRcdFx0b25Db25uZWN0ZWRIb29rLnRyaWdnZXIoZ2FtZXBhZC5pbmRleCk7XG5cdFx0fVxuXHRcdHJlc3VtZSgpO1xuXHR9O1xuXHRjb25zdCBvbkdhbWVwYWREaXNjb25uZWN0ZWQgPSAoZ2FtZXBhZCkgPT4ge1xuXHRcdGdhbWVwYWRzLnZhbHVlID0gZ2FtZXBhZHMudmFsdWUuZmlsdGVyKCh4KSA9PiB4LmluZGV4ICE9PSBnYW1lcGFkLmluZGV4KTtcblx0XHRvbkRpc2Nvbm5lY3RlZEhvb2sudHJpZ2dlcihnYW1lcGFkLmluZGV4KTtcblx0fTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJnYW1lcGFkY29ubmVjdGVkXCIsIChlKSA9PiBvbkdhbWVwYWRDb25uZWN0ZWQoZS5nYW1lcGFkKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcihcImdhbWVwYWRkaXNjb25uZWN0ZWRcIiwgKGUpID0+IG9uR2FtZXBhZERpc2Nvbm5lY3RlZChlLmdhbWVwYWQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR0cnlPbk1vdW50ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IF9nYW1lcGFkcyA9IChuYXZpZ2F0b3IkMSA9PT0gbnVsbCB8fCBuYXZpZ2F0b3IkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yJDEuZ2V0R2FtZXBhZHMoKSkgfHwgW107XG5cdFx0Zm9yIChjb25zdCBnYW1lcGFkIG9mIF9nYW1lcGFkcykgaWYgKGdhbWVwYWQgJiYgZ2FtZXBhZHMudmFsdWVbZ2FtZXBhZC5pbmRleF0pIG9uR2FtZXBhZENvbm5lY3RlZChnYW1lcGFkKTtcblx0fSk7XG5cdHBhdXNlKCk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0b25Db25uZWN0ZWQ6IG9uQ29ubmVjdGVkSG9vay5vbixcblx0XHRvbkRpc2Nvbm5lY3RlZDogb25EaXNjb25uZWN0ZWRIb29rLm9uLFxuXHRcdGdhbWVwYWRzLFxuXHRcdHBhdXNlLFxuXHRcdHJlc3VtZSxcblx0XHRpc0FjdGl2ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VHZW9sb2NhdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIEdlb2xvY2F0aW9uIEFQSS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlR2VvbG9jYXRpb25cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VHZW9sb2NhdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBlbmFibGVIaWdoQWNjdXJhY3kgPSB0cnVlLCBtYXhpbXVtQWdlID0gM2U0LCB0aW1lb3V0ID0gMjdlMywgbmF2aWdhdG9yOiBuYXZpZ2F0b3IkMSA9IGRlZmF1bHROYXZpZ2F0b3IsIGltbWVkaWF0ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBuYXZpZ2F0b3IkMSAmJiBcImdlb2xvY2F0aW9uXCIgaW4gbmF2aWdhdG9yJDEpO1xuXHRjb25zdCBsb2NhdGVkQXQgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBlcnJvciA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGNvb3JkcyA9IHJlZih7XG5cdFx0YWNjdXJhY3k6IDAsXG5cdFx0bGF0aXR1ZGU6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcblx0XHRsb25naXR1ZGU6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcblx0XHRhbHRpdHVkZTogbnVsbCxcblx0XHRhbHRpdHVkZUFjY3VyYWN5OiBudWxsLFxuXHRcdGhlYWRpbmc6IG51bGwsXG5cdFx0c3BlZWQ6IG51bGxcblx0fSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG5cdFx0bG9jYXRlZEF0LnZhbHVlID0gcG9zaXRpb24udGltZXN0YW1wO1xuXHRcdGNvb3Jkcy52YWx1ZSA9IHBvc2l0aW9uLmNvb3Jkcztcblx0XHRlcnJvci52YWx1ZSA9IG51bGw7XG5cdH1cblx0bGV0IHdhdGNoZXI7XG5cdGZ1bmN0aW9uIHJlc3VtZSgpIHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHdhdGNoZXIgPSBuYXZpZ2F0b3IkMS5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKHVwZGF0ZVBvc2l0aW9uLCAoZXJyKSA9PiBlcnJvci52YWx1ZSA9IGVyciwge1xuXHRcdFx0ZW5hYmxlSGlnaEFjY3VyYWN5LFxuXHRcdFx0bWF4aW11bUFnZSxcblx0XHRcdHRpbWVvdXRcblx0XHR9KTtcblx0fVxuXHRpZiAoaW1tZWRpYXRlKSByZXN1bWUoKTtcblx0ZnVuY3Rpb24gcGF1c2UoKSB7XG5cdFx0aWYgKHdhdGNoZXIgJiYgbmF2aWdhdG9yJDEpIG5hdmlnYXRvciQxLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2god2F0Y2hlcik7XG5cdH1cblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHBhdXNlKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGNvb3Jkcyxcblx0XHRsb2NhdGVkQXQsXG5cdFx0ZXJyb3IsXG5cdFx0cmVzdW1lLFxuXHRcdHBhdXNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZUlkbGUvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRFdmVudHMkMSA9IFtcblx0XCJtb3VzZW1vdmVcIixcblx0XCJtb3VzZWRvd25cIixcblx0XCJyZXNpemVcIixcblx0XCJrZXlkb3duXCIsXG5cdFwidG91Y2hzdGFydFwiLFxuXHRcIndoZWVsXCJcbl07XG5jb25zdCBvbmVNaW51dGUgPSA2ZTQ7XG4vKipcbiogVHJhY2tzIHdoZXRoZXIgdGhlIHVzZXIgaXMgYmVpbmcgaW5hY3RpdmUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUlkbGVcbiogQHBhcmFtIHRpbWVvdXQgZGVmYXVsdCB0byAxIG1pbnV0ZVxuKiBAcGFyYW0gb3B0aW9ucyBJZGxlT3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUlkbGUodGltZW91dCA9IG9uZU1pbnV0ZSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW5pdGlhbFN0YXRlID0gZmFsc2UsIGxpc3RlbkZvclZpc2liaWxpdHlDaGFuZ2UgPSB0cnVlLCBldmVudHM6IGV2ZW50cyQxID0gZGVmYXVsdEV2ZW50cyQxLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZXZlbnRGaWx0ZXIgPSB0aHJvdHRsZUZpbHRlcig1MCkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlkbGUgPSBzaGFsbG93UmVmKGluaXRpYWxTdGF0ZSk7XG5cdGNvbnN0IGxhc3RBY3RpdmUgPSBzaGFsbG93UmVmKHRpbWVzdGFtcCgpKTtcblx0Y29uc3QgaXNQZW5kaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGxldCB0aW1lcjtcblx0Y29uc3QgcmVzZXQgPSAoKSA9PiB7XG5cdFx0aWRsZS52YWx1ZSA9IGZhbHNlO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lcik7XG5cdFx0dGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGlkbGUudmFsdWUgPSB0cnVlLCB0aW1lb3V0KTtcblx0fTtcblx0Y29uc3Qgb25FdmVudCA9IGNyZWF0ZUZpbHRlcldyYXBwZXIoZXZlbnRGaWx0ZXIsICgpID0+IHtcblx0XHRsYXN0QWN0aXZlLnZhbHVlID0gdGltZXN0YW1wKCk7XG5cdFx0cmVzZXQoKTtcblx0fSk7XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IGRvY3VtZW50JDEgPSB3aW5kb3ckMS5kb2N1bWVudDtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHRmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cyQxKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBldmVudCwgKCkgPT4ge1xuXHRcdFx0aWYgKCFpc1BlbmRpbmcudmFsdWUpIHJldHVybjtcblx0XHRcdG9uRXZlbnQoKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGlmIChsaXN0ZW5Gb3JWaXNpYmlsaXR5Q2hhbmdlKSB1c2VFdmVudExpc3RlbmVyKGRvY3VtZW50JDEsIFwidmlzaWJpbGl0eWNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0XHRpZiAoZG9jdW1lbnQkMS5oaWRkZW4gfHwgIWlzUGVuZGluZy52YWx1ZSkgcmV0dXJuO1xuXHRcdFx0b25FdmVudCgpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0c3RhcnQoKTtcblx0fVxuXHRmdW5jdGlvbiBzdGFydCgpIHtcblx0XHRpZiAoaXNQZW5kaW5nLnZhbHVlKSByZXR1cm47XG5cdFx0aXNQZW5kaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRpZiAoIWluaXRpYWxTdGF0ZSkgcmVzZXQoKTtcblx0fVxuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdGlkbGUudmFsdWUgPSBpbml0aWFsU3RhdGU7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHRpc1BlbmRpbmcudmFsdWUgPSBmYWxzZTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdGlkbGUsXG5cdFx0bGFzdEFjdGl2ZSxcblx0XHRyZXNldCxcblx0XHRzdG9wLFxuXHRcdHN0YXJ0LFxuXHRcdGlzUGVuZGluZzogc2hhbGxvd1JlYWRvbmx5KGlzUGVuZGluZylcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlSW1hZ2UvaW5kZXgudHNcbmFzeW5jIGZ1bmN0aW9uIGxvYWRJbWFnZShvcHRpb25zKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG5cdFx0Y29uc3QgeyBzcmMsIHNyY3NldCwgc2l6ZXMsIGNsYXNzOiBjbGF6eiwgbG9hZGluZywgY3Jvc3NvcmlnaW4sIHJlZmVycmVyUG9saWN5LCB3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZywgZmV0Y2hQcmlvcml0eSwgaXNtYXAsIHVzZW1hcCB9ID0gb3B0aW9ucztcblx0XHRpbWcuc3JjID0gc3JjO1xuXHRcdGlmIChzcmNzZXQgIT0gbnVsbCkgaW1nLnNyY3NldCA9IHNyY3NldDtcblx0XHRpZiAoc2l6ZXMgIT0gbnVsbCkgaW1nLnNpemVzID0gc2l6ZXM7XG5cdFx0aWYgKGNsYXp6ICE9IG51bGwpIGltZy5jbGFzc05hbWUgPSBjbGF6ejtcblx0XHRpZiAobG9hZGluZyAhPSBudWxsKSBpbWcubG9hZGluZyA9IGxvYWRpbmc7XG5cdFx0aWYgKGNyb3Nzb3JpZ2luICE9IG51bGwpIGltZy5jcm9zc09yaWdpbiA9IGNyb3Nzb3JpZ2luO1xuXHRcdGlmIChyZWZlcnJlclBvbGljeSAhPSBudWxsKSBpbWcucmVmZXJyZXJQb2xpY3kgPSByZWZlcnJlclBvbGljeTtcblx0XHRpZiAod2lkdGggIT0gbnVsbCkgaW1nLndpZHRoID0gd2lkdGg7XG5cdFx0aWYgKGhlaWdodCAhPSBudWxsKSBpbWcuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdGlmIChkZWNvZGluZyAhPSBudWxsKSBpbWcuZGVjb2RpbmcgPSBkZWNvZGluZztcblx0XHRpZiAoZmV0Y2hQcmlvcml0eSAhPSBudWxsKSBpbWcuZmV0Y2hQcmlvcml0eSA9IGZldGNoUHJpb3JpdHk7XG5cdFx0aWYgKGlzbWFwICE9IG51bGwpIGltZy5pc01hcCA9IGlzbWFwO1xuXHRcdGlmICh1c2VtYXAgIT0gbnVsbCkgaW1nLnVzZU1hcCA9IHVzZW1hcDtcblx0XHRpbWcub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWcpO1xuXHRcdGltZy5vbmVycm9yID0gcmVqZWN0O1xuXHR9KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSBsb2FkIGFuIGltYWdlIGluIHRoZSBicm93c2VyLCB5b3UgY2FuIHdhaXQgdGhlIHJlc3VsdCB0byBkaXNwbGF5IGl0IG9yIHNob3cgYSBmYWxsYmFjay5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW1hZ2VcbiogQHBhcmFtIG9wdGlvbnMgSW1hZ2UgYXR0cmlidXRlcywgYXMgdXNlZCBpbiB0aGUgPGltZz4gdGFnXG4qIEBwYXJhbSBhc3luY1N0YXRlT3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZUltYWdlKG9wdGlvbnMsIGFzeW5jU3RhdGVPcHRpb25zID0ge30pIHtcblx0Y29uc3Qgc3RhdGUgPSB1c2VBc3luY1N0YXRlKCgpID0+IGxvYWRJbWFnZSh0b1ZhbHVlKG9wdGlvbnMpKSwgdm9pZCAwLCB7XG5cdFx0cmVzZXRPbkV4ZWN1dGU6IHRydWUsXG5cdFx0Li4uYXN5bmNTdGF0ZU9wdGlvbnNcblx0fSk7XG5cdHdhdGNoKCgpID0+IHRvVmFsdWUob3B0aW9ucyksICgpID0+IHN0YXRlLmV4ZWN1dGUoYXN5bmNTdGF0ZU9wdGlvbnMuZGVsYXkpLCB7IGRlZXA6IHRydWUgfSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gX3Jlc29sdmUtZWxlbWVudC50c1xuLyoqXG4qIFJlc29sdmVzIGFuIGVsZW1lbnQgZnJvbSBhIGdpdmVuIGVsZW1lbnQsIHdpbmRvdywgb3IgZG9jdW1lbnQuXG4qXG4qIEBpbnRlcm5hbFxuKi9cbmZ1bmN0aW9uIHJlc29sdmVFbGVtZW50KGVsKSB7XG5cdGlmICh0eXBlb2YgV2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIGVsIGluc3RhbmNlb2YgV2luZG93KSByZXR1cm4gZWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRpZiAodHlwZW9mIERvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGVsIGluc3RhbmNlb2YgRG9jdW1lbnQpIHJldHVybiBlbC5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBlbDtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2Nyb2xsL2luZGV4LnRzXG4vKipcbiogV2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgc2Nyb2xsIGFtb3VudCBpcyBjbG9zZSBlbm91Z2ggdG8gc29tZSB0aHJlc2hvbGQgaW4gb3JkZXIgdG9cbiogbW9yZSBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhcnJpdmVkU3RhdGUuIFRoaXMgaXMgYmVjYXVzZSBzY3JvbGxUb3Avc2Nyb2xsTGVmdCBhcmUgbm9uLXJvdW5kZWRcbiogbnVtYmVycywgd2hpbGUgc2Nyb2xsSGVpZ2h0L3Njcm9sbFdpZHRoIGFuZCBjbGllbnRIZWlnaHQvY2xpZW50V2lkdGggYXJlIHJvdW5kZWQuXG4qIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3Njcm9sbEhlaWdodCNkZXRlcm1pbmVfaWZfYW5fZWxlbWVudF9oYXNfYmVlbl90b3RhbGx5X3Njcm9sbGVkXG4qL1xuY29uc3QgQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTID0gMTtcbi8qKlxuKiBSZWFjdGl2ZSBzY3JvbGwuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcm9sbFxuKiBAcGFyYW0gZWxlbWVudFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVNjcm9sbChlbGVtZW50LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0aHJvdHRsZSA9IDAsIGlkbGUgPSAyMDAsIG9uU3RvcCA9IG5vb3AsIG9uU2Nyb2xsID0gbm9vcCwgb2Zmc2V0ID0ge1xuXHRcdGxlZnQ6IDAsXG5cdFx0cmlnaHQ6IDAsXG5cdFx0dG9wOiAwLFxuXHRcdGJvdHRvbTogMFxuXHR9LCBvYnNlcnZlOiBfb2JzZXJ2ZSA9IHsgbXV0YXRpb246IGZhbHNlIH0sIGV2ZW50TGlzdGVuZXJPcHRpb25zID0ge1xuXHRcdGNhcHR1cmU6IGZhbHNlLFxuXHRcdHBhc3NpdmU6IHRydWVcblx0fSwgYmVoYXZpb3IgPSBcImF1dG9cIiwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG9ic2VydmUgPSB0eXBlb2YgX29ic2VydmUgPT09IFwiYm9vbGVhblwiID8geyBtdXRhdGlvbjogX29ic2VydmUgfSA6IF9vYnNlcnZlO1xuXHRjb25zdCBpbnRlcm5hbFggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBpbnRlcm5hbFkgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCB4ID0gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpbnRlcm5hbFgudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQoeCQxKSB7XG5cdFx0XHRzY3JvbGxUbyh4JDEsIHZvaWQgMCk7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgeSA9IGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gaW50ZXJuYWxZLnZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHkkMSkge1xuXHRcdFx0c2Nyb2xsVG8odm9pZCAwLCB5JDEpO1xuXHRcdH1cblx0fSk7XG5cdGZ1bmN0aW9uIHNjcm9sbFRvKF94LCBfeSkge1xuXHRcdHZhciBfcmVmLCBfdG9WYWx1ZSwgX3RvVmFsdWUyLCBfZG9jdW1lbnQ7XG5cdFx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRpZiAoIV9lbGVtZW50KSByZXR1cm47XG5cdFx0KF9yZWYgPSBfZWxlbWVudCBpbnN0YW5jZW9mIERvY3VtZW50ID8gd2luZG93JDEuZG9jdW1lbnQuYm9keSA6IF9lbGVtZW50KSA9PT0gbnVsbCB8fCBfcmVmID09PSB2b2lkIDAgfHwgX3JlZi5zY3JvbGxUbyh7XG5cdFx0XHR0b3A6IChfdG9WYWx1ZSA9IHRvVmFsdWUoX3kpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZSAhPT0gdm9pZCAwID8gX3RvVmFsdWUgOiB5LnZhbHVlLFxuXHRcdFx0bGVmdDogKF90b1ZhbHVlMiA9IHRvVmFsdWUoX3gpKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZTIgIT09IHZvaWQgMCA/IF90b1ZhbHVlMiA6IHgudmFsdWUsXG5cdFx0XHRiZWhhdmlvcjogdG9WYWx1ZShiZWhhdmlvcilcblx0XHR9KTtcblx0XHRjb25zdCBzY3JvbGxDb250YWluZXIgPSAoX2VsZW1lbnQgPT09IG51bGwgfHwgX2VsZW1lbnQgPT09IHZvaWQgMCB8fCAoX2RvY3VtZW50ID0gX2VsZW1lbnQuZG9jdW1lbnQpID09PSBudWxsIHx8IF9kb2N1bWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgKF9lbGVtZW50ID09PSBudWxsIHx8IF9lbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZWxlbWVudC5kb2N1bWVudEVsZW1lbnQpIHx8IF9lbGVtZW50O1xuXHRcdGlmICh4ICE9IG51bGwpIGludGVybmFsWC52YWx1ZSA9IHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0O1xuXHRcdGlmICh5ICE9IG51bGwpIGludGVybmFsWS52YWx1ZSA9IHNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3A7XG5cdH1cblx0Y29uc3QgaXNTY3JvbGxpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgYXJyaXZlZFN0YXRlID0gcmVhY3RpdmUoe1xuXHRcdGxlZnQ6IHRydWUsXG5cdFx0cmlnaHQ6IGZhbHNlLFxuXHRcdHRvcDogdHJ1ZSxcblx0XHRib3R0b206IGZhbHNlXG5cdH0pO1xuXHRjb25zdCBkaXJlY3Rpb25zID0gcmVhY3RpdmUoe1xuXHRcdGxlZnQ6IGZhbHNlLFxuXHRcdHJpZ2h0OiBmYWxzZSxcblx0XHR0b3A6IGZhbHNlLFxuXHRcdGJvdHRvbTogZmFsc2Vcblx0fSk7XG5cdGNvbnN0IG9uU2Nyb2xsRW5kID0gKGUpID0+IHtcblx0XHRpZiAoIWlzU2Nyb2xsaW5nLnZhbHVlKSByZXR1cm47XG5cdFx0aXNTY3JvbGxpbmcudmFsdWUgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLmxlZnQgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLnJpZ2h0ID0gZmFsc2U7XG5cdFx0ZGlyZWN0aW9ucy50b3AgPSBmYWxzZTtcblx0XHRkaXJlY3Rpb25zLmJvdHRvbSA9IGZhbHNlO1xuXHRcdG9uU3RvcChlKTtcblx0fTtcblx0Y29uc3Qgb25TY3JvbGxFbmREZWJvdW5jZWQgPSB1c2VEZWJvdW5jZUZuKG9uU2Nyb2xsRW5kLCB0aHJvdHRsZSArIGlkbGUpO1xuXHRjb25zdCBzZXRBcnJpdmVkU3RhdGUgPSAodGFyZ2V0KSA9PiB7XG5cdFx0dmFyIF9kb2N1bWVudDI7XG5cdFx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuO1xuXHRcdGNvbnN0IGVsID0gKHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCB8fCAoX2RvY3VtZW50MiA9IHRhcmdldC5kb2N1bWVudCkgPT09IG51bGwgfHwgX2RvY3VtZW50MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50Mi5kb2N1bWVudEVsZW1lbnQpIHx8ICh0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQuZG9jdW1lbnRFbGVtZW50KSB8fCB1bnJlZkVsZW1lbnQodGFyZ2V0KTtcblx0XHRjb25zdCB7IGRpc3BsYXksIGZsZXhEaXJlY3Rpb24sIGRpcmVjdGlvbiB9ID0gd2luZG93JDEuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG5cdFx0Y29uc3QgZGlyZWN0aW9uTXVsdGlwbGVyID0gZGlyZWN0aW9uID09PSBcInJ0bFwiID8gLTEgOiAxO1xuXHRcdGNvbnN0IHNjcm9sbExlZnQgPSBlbC5zY3JvbGxMZWZ0O1xuXHRcdGRpcmVjdGlvbnMubGVmdCA9IHNjcm9sbExlZnQgPCBpbnRlcm5hbFgudmFsdWU7XG5cdFx0ZGlyZWN0aW9ucy5yaWdodCA9IHNjcm9sbExlZnQgPiBpbnRlcm5hbFgudmFsdWU7XG5cdFx0Y29uc3QgbGVmdCA9IE1hdGguYWJzKHNjcm9sbExlZnQgKiBkaXJlY3Rpb25NdWx0aXBsZXIpIDw9IChvZmZzZXQubGVmdCB8fCAwKTtcblx0XHRjb25zdCByaWdodCA9IE1hdGguYWJzKHNjcm9sbExlZnQgKiBkaXJlY3Rpb25NdWx0aXBsZXIpICsgZWwuY2xpZW50V2lkdGggPj0gZWwuc2Nyb2xsV2lkdGggLSAob2Zmc2V0LnJpZ2h0IHx8IDApIC0gQVJSSVZFRF9TVEFURV9USFJFU0hPTERfUElYRUxTO1xuXHRcdGlmIChkaXNwbGF5ID09PSBcImZsZXhcIiAmJiBmbGV4RGlyZWN0aW9uID09PSBcInJvdy1yZXZlcnNlXCIpIHtcblx0XHRcdGFycml2ZWRTdGF0ZS5sZWZ0ID0gcmlnaHQ7XG5cdFx0XHRhcnJpdmVkU3RhdGUucmlnaHQgPSBsZWZ0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhcnJpdmVkU3RhdGUubGVmdCA9IGxlZnQ7XG5cdFx0XHRhcnJpdmVkU3RhdGUucmlnaHQgPSByaWdodDtcblx0XHR9XG5cdFx0aW50ZXJuYWxYLnZhbHVlID0gc2Nyb2xsTGVmdDtcblx0XHRsZXQgc2Nyb2xsVG9wID0gZWwuc2Nyb2xsVG9wO1xuXHRcdGlmICh0YXJnZXQgPT09IHdpbmRvdyQxLmRvY3VtZW50ICYmICFzY3JvbGxUb3ApIHNjcm9sbFRvcCA9IHdpbmRvdyQxLmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuXHRcdGRpcmVjdGlvbnMudG9wID0gc2Nyb2xsVG9wIDwgaW50ZXJuYWxZLnZhbHVlO1xuXHRcdGRpcmVjdGlvbnMuYm90dG9tID0gc2Nyb2xsVG9wID4gaW50ZXJuYWxZLnZhbHVlO1xuXHRcdGNvbnN0IHRvcCA9IE1hdGguYWJzKHNjcm9sbFRvcCkgPD0gKG9mZnNldC50b3AgfHwgMCk7XG5cdFx0Y29uc3QgYm90dG9tID0gTWF0aC5hYnMoc2Nyb2xsVG9wKSArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSAob2Zmc2V0LmJvdHRvbSB8fCAwKSAtIEFSUklWRURfU1RBVEVfVEhSRVNIT0xEX1BJWEVMUztcblx0XHQvKipcblx0XHQqIHJldmVyc2UgY29sdW1ucyBhbmQgcm93cyBiZWhhdmUgZXhhY3RseSB0aGUgb3RoZXIgd2F5IGFyb3VuZCxcblx0XHQqIGJvdHRvbSBpcyB0cmVhdGVkIGFzIHRvcCBhbmQgdG9wIGlzIHRyZWF0ZWQgYXMgdGhlIG5lZ2F0aXZlIHZlcnNpb24gb2YgYm90dG9tXG5cdFx0Ki9cblx0XHRpZiAoZGlzcGxheSA9PT0gXCJmbGV4XCIgJiYgZmxleERpcmVjdGlvbiA9PT0gXCJjb2x1bW4tcmV2ZXJzZVwiKSB7XG5cdFx0XHRhcnJpdmVkU3RhdGUudG9wID0gYm90dG9tO1xuXHRcdFx0YXJyaXZlZFN0YXRlLmJvdHRvbSA9IHRvcDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YXJyaXZlZFN0YXRlLnRvcCA9IHRvcDtcblx0XHRcdGFycml2ZWRTdGF0ZS5ib3R0b20gPSBib3R0b207XG5cdFx0fVxuXHRcdGludGVybmFsWS52YWx1ZSA9IHNjcm9sbFRvcDtcblx0fTtcblx0Y29uc3Qgb25TY3JvbGxIYW5kbGVyID0gKGUpID0+IHtcblx0XHR2YXIgX2RvY3VtZW50RWxlbWVudDtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0c2V0QXJyaXZlZFN0YXRlKChfZG9jdW1lbnRFbGVtZW50ID0gZS50YXJnZXQuZG9jdW1lbnRFbGVtZW50KSAhPT0gbnVsbCAmJiBfZG9jdW1lbnRFbGVtZW50ICE9PSB2b2lkIDAgPyBfZG9jdW1lbnRFbGVtZW50IDogZS50YXJnZXQpO1xuXHRcdGlzU2Nyb2xsaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRvblNjcm9sbEVuZERlYm91bmNlZChlKTtcblx0XHRvblNjcm9sbChlKTtcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBcInNjcm9sbFwiLCB0aHJvdHRsZSA/IHVzZVRocm90dGxlRm4ob25TY3JvbGxIYW5kbGVyLCB0aHJvdHRsZSwgdHJ1ZSwgZmFsc2UpIDogb25TY3JvbGxIYW5kbGVyLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XG5cdHRyeU9uTW91bnRlZCgoKSA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IF9lbGVtZW50ID0gdG9WYWx1ZShlbGVtZW50KTtcblx0XHRcdGlmICghX2VsZW1lbnQpIHJldHVybjtcblx0XHRcdHNldEFycml2ZWRTdGF0ZShfZWxlbWVudCk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH0pO1xuXHRpZiAoKG9ic2VydmUgPT09IG51bGwgfHwgb2JzZXJ2ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JzZXJ2ZS5tdXRhdGlvbikgJiYgZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQgIT09IHdpbmRvdyQxICYmIGVsZW1lbnQgIT09IGRvY3VtZW50KSB1c2VNdXRhdGlvbk9ic2VydmVyKGVsZW1lbnQsICgpID0+IHtcblx0XHRjb25zdCBfZWxlbWVudCA9IHRvVmFsdWUoZWxlbWVudCk7XG5cdFx0aWYgKCFfZWxlbWVudCkgcmV0dXJuO1xuXHRcdHNldEFycml2ZWRTdGF0ZShfZWxlbWVudCk7XG5cdH0sIHtcblx0XHRhdHRyaWJ1dGVzOiB0cnVlLFxuXHRcdGNoaWxkTGlzdDogdHJ1ZSxcblx0XHRzdWJ0cmVlOiB0cnVlXG5cdH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKGVsZW1lbnQsIFwic2Nyb2xsZW5kXCIsIG9uU2Nyb2xsRW5kLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XG5cdHJldHVybiB7XG5cdFx0eCxcblx0XHR5LFxuXHRcdGlzU2Nyb2xsaW5nLFxuXHRcdGFycml2ZWRTdGF0ZSxcblx0XHRkaXJlY3Rpb25zLFxuXHRcdG1lYXN1cmUoKSB7XG5cdFx0XHRjb25zdCBfZWxlbWVudCA9IHRvVmFsdWUoZWxlbWVudCk7XG5cdFx0XHRpZiAod2luZG93JDEgJiYgX2VsZW1lbnQpIHNldEFycml2ZWRTdGF0ZShfZWxlbWVudCk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VJbmZpbml0ZVNjcm9sbC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGluZmluaXRlIHNjcm9sbC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlSW5maW5pdGVTY3JvbGxcbiovXG5mdW5jdGlvbiB1c2VJbmZpbml0ZVNjcm9sbChlbGVtZW50LCBvbkxvYWRNb3JlLCBvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGRpc3RhbmNlO1xuXHRjb25zdCB7IGRpcmVjdGlvbiA9IFwiYm90dG9tXCIsIGludGVydmFsID0gMTAwLCBjYW5Mb2FkTW9yZSA9ICgpID0+IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHN0YXRlID0gcmVhY3RpdmUodXNlU2Nyb2xsKGVsZW1lbnQsIHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdG9mZnNldDoge1xuXHRcdFx0W2RpcmVjdGlvbl06IChfb3B0aW9ucyRkaXN0YW5jZSA9IG9wdGlvbnMuZGlzdGFuY2UpICE9PSBudWxsICYmIF9vcHRpb25zJGRpc3RhbmNlICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRkaXN0YW5jZSA6IDAsXG5cdFx0XHQuLi5vcHRpb25zLm9mZnNldFxuXHRcdH1cblx0fSkpO1xuXHRjb25zdCBwcm9taXNlID0gcmVmKCk7XG5cdGNvbnN0IGlzTG9hZGluZyA9IGNvbXB1dGVkKCgpID0+ICEhcHJvbWlzZS52YWx1ZSk7XG5cdGNvbnN0IG9ic2VydmVkRWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4gcmVzb2x2ZUVsZW1lbnQodG9WYWx1ZShlbGVtZW50KSk7XG5cdH0pO1xuXHRjb25zdCBpc0VsZW1lbnRWaXNpYmxlID0gdXNlRWxlbWVudFZpc2liaWxpdHkob2JzZXJ2ZWRFbGVtZW50KTtcblx0Y29uc3QgY2FuTG9hZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRpZiAoIW9ic2VydmVkRWxlbWVudC52YWx1ZSkgcmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBjYW5Mb2FkTW9yZShvYnNlcnZlZEVsZW1lbnQudmFsdWUpO1xuXHR9KTtcblx0ZnVuY3Rpb24gY2hlY2tBbmRMb2FkKCkge1xuXHRcdHN0YXRlLm1lYXN1cmUoKTtcblx0XHRpZiAoIW9ic2VydmVkRWxlbWVudC52YWx1ZSB8fCAhaXNFbGVtZW50VmlzaWJsZS52YWx1ZSB8fCAhY2FuTG9hZC52YWx1ZSB8fCBwcm9taXNlLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgeyBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCwgc2Nyb2xsV2lkdGgsIGNsaWVudFdpZHRoIH0gPSBvYnNlcnZlZEVsZW1lbnQudmFsdWU7XG5cdFx0Y29uc3QgaXNOYXJyb3dlciA9IGRpcmVjdGlvbiA9PT0gXCJib3R0b21cIiB8fCBkaXJlY3Rpb24gPT09IFwidG9wXCIgPyBzY3JvbGxIZWlnaHQgPD0gY2xpZW50SGVpZ2h0IDogc2Nyb2xsV2lkdGggPD0gY2xpZW50V2lkdGg7XG5cdFx0aWYgKHN0YXRlLmFycml2ZWRTdGF0ZVtkaXJlY3Rpb25dIHx8IGlzTmFycm93ZXIpIHByb21pc2UudmFsdWUgPSBQcm9taXNlLmFsbChbb25Mb2FkTW9yZShzdGF0ZSksIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGludGVydmFsKSldKS5maW5hbGx5KCgpID0+IHtcblx0XHRcdHByb21pc2UudmFsdWUgPSBudWxsO1xuXHRcdFx0bmV4dFRpY2soKCkgPT4gY2hlY2tBbmRMb2FkKCkpO1xuXHRcdH0pO1xuXHR9XG5cdHRyeU9uVW5tb3VudGVkKHdhdGNoKCgpID0+IFtcblx0XHRzdGF0ZS5hcnJpdmVkU3RhdGVbZGlyZWN0aW9uXSxcblx0XHRpc0VsZW1lbnRWaXNpYmxlLnZhbHVlLFxuXHRcdGNhbkxvYWQudmFsdWVcblx0XSwgY2hlY2tBbmRMb2FkLCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGZsdXNoOiBcInBvc3RcIlxuXHR9KSk7XG5cdHJldHVybiB7XG5cdFx0aXNMb2FkaW5nLFxuXHRcdHJlc2V0KCkge1xuXHRcdFx0bmV4dFRpY2soKCkgPT4gY2hlY2tBbmRMb2FkKCkpO1xuXHRcdH1cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlS2V5TW9kaWZpZXIvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRFdmVudHMgPSBbXG5cdFwibW91c2Vkb3duXCIsXG5cdFwibW91c2V1cFwiLFxuXHRcImtleWRvd25cIixcblx0XCJrZXl1cFwiXG5dO1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZUtleU1vZGlmaWVyKG1vZGlmaWVyLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBldmVudHM6IGV2ZW50cyQxID0gZGVmYXVsdEV2ZW50cywgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIGluaXRpYWwgPSBudWxsIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzdGF0ZSA9IHNoYWxsb3dSZWYoaW5pdGlhbCk7XG5cdGlmIChkb2N1bWVudCQxKSBldmVudHMkMS5mb3JFYWNoKChsaXN0ZW5lckV2ZW50KSA9PiB7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcihkb2N1bWVudCQxLCBsaXN0ZW5lckV2ZW50LCAoZXZ0KSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIGV2dC5nZXRNb2RpZmllclN0YXRlID09PSBcImZ1bmN0aW9uXCIpIHN0YXRlLnZhbHVlID0gZXZ0LmdldE1vZGlmaWVyU3RhdGUobW9kaWZpZXIpO1xuXHRcdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0fSk7XG5cdHJldHVybiBzdGF0ZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTG9jYWxTdG9yYWdlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgTG9jYWxTdG9yYWdlLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VMb2NhbFN0b3JhZ2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlTG9jYWxTdG9yYWdlKGtleSwgaW5pdGlhbFZhbHVlLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0cmV0dXJuIHVzZVN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5sb2NhbFN0b3JhZ2UsIG9wdGlvbnMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNYWdpY0tleXMvYWxpYXNNYXAudHNcbmNvbnN0IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCA9IHtcblx0Y3RybDogXCJjb250cm9sXCIsXG5cdGNvbW1hbmQ6IFwibWV0YVwiLFxuXHRjbWQ6IFwibWV0YVwiLFxuXHRvcHRpb246IFwiYWx0XCIsXG5cdHVwOiBcImFycm93dXBcIixcblx0ZG93bjogXCJhcnJvd2Rvd25cIixcblx0bGVmdDogXCJhcnJvd2xlZnRcIixcblx0cmlnaHQ6IFwiYXJyb3dyaWdodFwiXG59O1xuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNYWdpY0tleXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBrZXlzIHByZXNzZWQgc3RhdGUsIHdpdGggbWFnaWNhbCBrZXlzIGNvbWJpbmF0aW9uIHN1cHBvcnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1hZ2ljS2V5c1xuKi9cbmZ1bmN0aW9uIHVzZU1hZ2ljS2V5cyhvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyByZWFjdGl2ZTogdXNlUmVhY3RpdmUgPSBmYWxzZSwgdGFyZ2V0ID0gZGVmYXVsdFdpbmRvdywgYWxpYXNNYXAgPSBEZWZhdWx0TWFnaWNLZXlzQWxpYXNNYXAsIHBhc3NpdmUgPSB0cnVlLCBvbkV2ZW50RmlyZWQgPSBub29wIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjdXJyZW50ID0gcmVhY3RpdmUoLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7XG5cdGNvbnN0IG9iaiA9IHtcblx0XHR0b0pTT04oKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fSxcblx0XHRjdXJyZW50XG5cdH07XG5cdGNvbnN0IHJlZnMgPSB1c2VSZWFjdGl2ZSA/IHJlYWN0aXZlKG9iaikgOiBvYmo7XG5cdGNvbnN0IG1ldGFEZXBzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcblx0Y29uc3QgZGVwc01hcCA9IG5ldyBNYXAoW1xuXHRcdFtcIk1ldGFcIiwgbWV0YURlcHNdLFxuXHRcdFtcIlNoaWZ0XCIsIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCldLFxuXHRcdFtcIkFsdFwiLCAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXVxuXHRdKTtcblx0Y29uc3QgdXNlZEtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRmdW5jdGlvbiBzZXRSZWZzKGtleSwgdmFsdWUpIHtcblx0XHRpZiAoa2V5IGluIHJlZnMpIGlmICh1c2VSZWFjdGl2ZSkgcmVmc1trZXldID0gdmFsdWU7XG5cdFx0ZWxzZSByZWZzW2tleV0udmFsdWUgPSB2YWx1ZTtcblx0fVxuXHRmdW5jdGlvbiByZXNldCgpIHtcblx0XHRjdXJyZW50LmNsZWFyKCk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgdXNlZEtleXMpIHNldFJlZnMoa2V5LCBmYWxzZSk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlRGVwcyh2YWx1ZSwgZSwga2V5cyQxKSB7XG5cdFx0aWYgKCF2YWx1ZSB8fCB0eXBlb2YgZS5nZXRNb2RpZmllclN0YXRlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IFttb2RpZmllciwgZGVwc1NldF0gb2YgZGVwc01hcCkgaWYgKGUuZ2V0TW9kaWZpZXJTdGF0ZShtb2RpZmllcikpIHtcblx0XHRcdGtleXMkMS5mb3JFYWNoKChrZXkpID0+IGRlcHNTZXQuYWRkKGtleSkpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cdGZ1bmN0aW9uIGNsZWFyRGVwcyh2YWx1ZSwga2V5KSB7XG5cdFx0aWYgKHZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3QgZGVwc01hcEtleSA9IGAke2tleVswXS50b1VwcGVyQ2FzZSgpfSR7a2V5LnNsaWNlKDEpfWA7XG5cdFx0Y29uc3QgZGVwcyA9IGRlcHNNYXAuZ2V0KGRlcHNNYXBLZXkpO1xuXHRcdGlmICghW1wic2hpZnRcIiwgXCJhbHRcIl0uaW5jbHVkZXMoa2V5KSB8fCAhZGVwcykgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHNBcnJheSA9IEFycmF5LmZyb20oZGVwcyk7XG5cdFx0Y29uc3QgZGVwc0luZGV4ID0gZGVwc0FycmF5LmluZGV4T2Yoa2V5KTtcblx0XHRkZXBzQXJyYXkuZm9yRWFjaCgoa2V5JDEsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggPj0gZGVwc0luZGV4KSB7XG5cdFx0XHRcdGN1cnJlbnQuZGVsZXRlKGtleSQxKTtcblx0XHRcdFx0c2V0UmVmcyhrZXkkMSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGRlcHMuY2xlYXIoKTtcblx0fVxuXHRmdW5jdGlvbiB1cGRhdGVSZWZzKGUsIHZhbHVlKSB7XG5cdFx0dmFyIF9lJGtleSwgX2UkY29kZTtcblx0XHRjb25zdCBrZXkgPSAoX2Uka2V5ID0gZS5rZXkpID09PSBudWxsIHx8IF9lJGtleSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Uka2V5LnRvTG93ZXJDYXNlKCk7XG5cdFx0Y29uc3QgdmFsdWVzID0gWyhfZSRjb2RlID0gZS5jb2RlKSA9PT0gbnVsbCB8fCBfZSRjb2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZSRjb2RlLnRvTG93ZXJDYXNlKCksIGtleV0uZmlsdGVyKEJvb2xlYW4pO1xuXHRcdGlmICgha2V5KSByZXR1cm47XG5cdFx0aWYgKGtleSkgaWYgKHZhbHVlKSBjdXJyZW50LmFkZChrZXkpO1xuXHRcdGVsc2UgY3VycmVudC5kZWxldGUoa2V5KTtcblx0XHRmb3IgKGNvbnN0IGtleSQxIG9mIHZhbHVlcykge1xuXHRcdFx0dXNlZEtleXMuYWRkKGtleSQxKTtcblx0XHRcdHNldFJlZnMoa2V5JDEsIHZhbHVlKTtcblx0XHR9XG5cdFx0dXBkYXRlRGVwcyh2YWx1ZSwgZSwgWy4uLmN1cnJlbnQsIC4uLnZhbHVlc10pO1xuXHRcdGNsZWFyRGVwcyh2YWx1ZSwga2V5KTtcblx0XHRpZiAoa2V5ID09PSBcIm1ldGFcIiAmJiAhdmFsdWUpIHtcblx0XHRcdG1ldGFEZXBzLmZvckVhY2goKGtleSQxKSA9PiB7XG5cdFx0XHRcdGN1cnJlbnQuZGVsZXRlKGtleSQxKTtcblx0XHRcdFx0c2V0UmVmcyhrZXkkMSwgZmFsc2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRtZXRhRGVwcy5jbGVhcigpO1xuXHRcdH1cblx0fVxuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJrZXlkb3duXCIsIChlKSA9PiB7XG5cdFx0dXBkYXRlUmVmcyhlLCB0cnVlKTtcblx0XHRyZXR1cm4gb25FdmVudEZpcmVkKGUpO1xuXHR9LCB7IHBhc3NpdmUgfSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImtleXVwXCIsIChlKSA9PiB7XG5cdFx0dXBkYXRlUmVmcyhlLCBmYWxzZSk7XG5cdFx0cmV0dXJuIG9uRXZlbnRGaXJlZChlKTtcblx0fSwgeyBwYXNzaXZlIH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKFwiYmx1clwiLCByZXNldCwgeyBwYXNzaXZlIH0pO1xuXHR1c2VFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgcmVzZXQsIHsgcGFzc2l2ZSB9KTtcblx0Y29uc3QgcHJveHkgPSBuZXcgUHJveHkocmVmcywgeyBnZXQodGFyZ2V0JDEsIHByb3AsIHJlYykge1xuXHRcdGlmICh0eXBlb2YgcHJvcCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCQxLCBwcm9wLCByZWMpO1xuXHRcdHByb3AgPSBwcm9wLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKHByb3AgaW4gYWxpYXNNYXApIHByb3AgPSBhbGlhc01hcFtwcm9wXTtcblx0XHRpZiAoIShwcm9wIGluIHJlZnMpKSBpZiAoL1srXy1dLy50ZXN0KHByb3ApKSB7XG5cdFx0XHRjb25zdCBrZXlzJDEgPSBwcm9wLnNwbGl0KC9bK18tXS9nKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0XHRcdHJlZnNbcHJvcF0gPSBjb21wdXRlZCgoKSA9PiBrZXlzJDEubWFwKChrZXkpID0+IHRvVmFsdWUocHJveHlba2V5XSkpLmV2ZXJ5KEJvb2xlYW4pKTtcblx0XHR9IGVsc2UgcmVmc1twcm9wXSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRcdGNvbnN0IHIgPSBSZWZsZWN0LmdldCh0YXJnZXQkMSwgcHJvcCwgcmVjKTtcblx0XHRyZXR1cm4gdXNlUmVhY3RpdmUgPyB0b1ZhbHVlKHIpIDogcjtcblx0fSB9KTtcblx0cmV0dXJuIHByb3h5O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNZWRpYUNvbnRyb2xzL2luZGV4LnRzXG4vKipcbiogQXV0b21hdGljYWxseSBjaGVjayBpZiB0aGUgcmVmIGV4aXN0cyBhbmQgaWYgaXQgZG9lcyBydW4gdGhlIGNiIGZuXG4qL1xuZnVuY3Rpb24gdXNpbmdFbFJlZihzb3VyY2UsIGNiKSB7XG5cdGlmICh0b1ZhbHVlKHNvdXJjZSkpIGNiKHRvVmFsdWUoc291cmNlKSk7XG59XG4vKipcbiogQ29udmVydHMgYSBUaW1lUmFuZ2Ugb2JqZWN0IHRvIGFuIGFycmF5XG4qL1xuZnVuY3Rpb24gdGltZVJhbmdlVG9BcnJheSh0aW1lUmFuZ2VzKSB7XG5cdGxldCByYW5nZXMgPSBbXTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aW1lUmFuZ2VzLmxlbmd0aDsgKytpKSByYW5nZXMgPSBbLi4ucmFuZ2VzLCBbdGltZVJhbmdlcy5zdGFydChpKSwgdGltZVJhbmdlcy5lbmQoaSldXTtcblx0cmV0dXJuIHJhbmdlcztcbn1cbi8qKlxuKiBDb252ZXJ0cyBhIFRleHRUcmFja0xpc3Qgb2JqZWN0IHRvIGFuIGFycmF5IG9mIGBVc2VNZWRpYVRleHRUcmFja2BcbiovXG5mdW5jdGlvbiB0cmFja3NUb0FycmF5KHRyYWNrcykge1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh0cmFja3MpLm1hcCgoeyBsYWJlbCwga2luZCwgbGFuZ3VhZ2UsIG1vZGUsIGFjdGl2ZUN1ZXMsIGN1ZXMsIGluQmFuZE1ldGFkYXRhVHJhY2tEaXNwYXRjaFR5cGUgfSwgaWQpID0+ICh7XG5cdFx0aWQsXG5cdFx0bGFiZWwsXG5cdFx0a2luZCxcblx0XHRsYW5ndWFnZSxcblx0XHRtb2RlLFxuXHRcdGFjdGl2ZUN1ZXMsXG5cdFx0Y3Vlcyxcblx0XHRpbkJhbmRNZXRhZGF0YVRyYWNrRGlzcGF0Y2hUeXBlXG5cdH0pKTtcbn1cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuXHRzcmM6IFwiXCIsXG5cdHRyYWNrczogW11cbn07XG5mdW5jdGlvbiB1c2VNZWRpYUNvbnRyb2xzKHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdHRhcmdldCA9IHRvUmVmKHRhcmdldCk7XG5cdG9wdGlvbnMgPSB7XG5cdFx0Li4uZGVmYXVsdE9wdGlvbnMsXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0Y29uc3QgY3VycmVudFRpbWUgPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBkdXJhdGlvbiA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IHNlZWtpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgdm9sdW1lID0gc2hhbGxvd1JlZigxKTtcblx0Y29uc3Qgd2FpdGluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBlbmRlZCA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBwbGF5aW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHJhdGUgPSBzaGFsbG93UmVmKDEpO1xuXHRjb25zdCBzdGFsbGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGJ1ZmZlcmVkID0gcmVmKFtdKTtcblx0Y29uc3QgdHJhY2tzID0gcmVmKFtdKTtcblx0Y29uc3Qgc2VsZWN0ZWRUcmFjayA9IHNoYWxsb3dSZWYoLTEpO1xuXHRjb25zdCBpc1BpY3R1cmVJblBpY3R1cmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgbXV0ZWQgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3VwcG9ydHNQaWN0dXJlSW5QaWN0dXJlID0gQm9vbGVhbihkb2N1bWVudCQxICYmIFwicGljdHVyZUluUGljdHVyZUVuYWJsZWRcIiBpbiBkb2N1bWVudCQxKTtcblx0Y29uc3Qgc291cmNlRXJyb3JFdmVudCA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBwbGF5YmFja0Vycm9yRXZlbnQgPSBjcmVhdGVFdmVudEhvb2soKTtcblx0LyoqXG5cdCogRGlzYWJsZXMgdGhlIHNwZWNpZmllZCB0cmFjay4gSWYgbm8gdHJhY2sgaXMgc3BlY2lmaWVkIHRoZW5cblx0KiBhbGwgdHJhY2tzIHdpbGwgYmUgZGlzYWJsZWRcblx0KlxuXHQqIEBwYXJhbSB0cmFjayBUaGUgaWQgb2YgdGhlIHRyYWNrIHRvIGRpc2FibGVcblx0Ki9cblx0Y29uc3QgZGlzYWJsZVRyYWNrID0gKHRyYWNrKSA9PiB7XG5cdFx0dXNpbmdFbFJlZih0YXJnZXQsIChlbCkgPT4ge1xuXHRcdFx0aWYgKHRyYWNrKSB7XG5cdFx0XHRcdGNvbnN0IGlkID0gdHlwZW9mIHRyYWNrID09PSBcIm51bWJlclwiID8gdHJhY2sgOiB0cmFjay5pZDtcblx0XHRcdFx0ZWwudGV4dFRyYWNrc1tpZF0ubW9kZSA9IFwiZGlzYWJsZWRcIjtcblx0XHRcdH0gZWxzZSBmb3IgKGxldCBpID0gMDsgaSA8IGVsLnRleHRUcmFja3MubGVuZ3RoOyArK2kpIGVsLnRleHRUcmFja3NbaV0ubW9kZSA9IFwiZGlzYWJsZWRcIjtcblx0XHRcdHNlbGVjdGVkVHJhY2sudmFsdWUgPSAtMTtcblx0XHR9KTtcblx0fTtcblx0LyoqXG5cdCogRW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRyYWNrIGFuZCBkaXNhYmxlcyB0aGVcblx0KiBvdGhlciB0cmFja3MgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWRcblx0KlxuXHQqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgb2YgdGhlIGlkIG9mIHRoZSB0cmFjayB0byBlbmFibGVcblx0KiBAcGFyYW0gZGlzYWJsZVRyYWNrcyBEaXNhYmxlIGFsbCBvdGhlciB0cmFja3Ncblx0Ki9cblx0Y29uc3QgZW5hYmxlVHJhY2sgPSAodHJhY2ssIGRpc2FibGVUcmFja3MgPSB0cnVlKSA9PiB7XG5cdFx0dXNpbmdFbFJlZih0YXJnZXQsIChlbCkgPT4ge1xuXHRcdFx0Y29uc3QgaWQgPSB0eXBlb2YgdHJhY2sgPT09IFwibnVtYmVyXCIgPyB0cmFjayA6IHRyYWNrLmlkO1xuXHRcdFx0aWYgKGRpc2FibGVUcmFja3MpIGRpc2FibGVUcmFjaygpO1xuXHRcdFx0ZWwudGV4dFRyYWNrc1tpZF0ubW9kZSA9IFwic2hvd2luZ1wiO1xuXHRcdFx0c2VsZWN0ZWRUcmFjay52YWx1ZSA9IGlkO1xuXHRcdH0pO1xuXHR9O1xuXHQvKipcblx0KiBUb2dnbGUgcGljdHVyZSBpbiBwaWN0dXJlIG1vZGUgZm9yIHRoZSBwbGF5ZXIuXG5cdCovXG5cdGNvbnN0IHRvZ2dsZVBpY3R1cmVJblBpY3R1cmUgPSAoKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHVzaW5nRWxSZWYodGFyZ2V0LCBhc3luYyAoZWwpID0+IHtcblx0XHRcdFx0aWYgKHN1cHBvcnRzUGljdHVyZUluUGljdHVyZSkgaWYgKCFpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUpIGVsLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHRlbHNlIGRvY3VtZW50JDEuZXhpdFBpY3R1cmVJblBpY3R1cmUoKS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fTtcblx0LyoqXG5cdCogVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgaW5qZWN0IHNvdXJjZXMgdG8gdGhlIG1lZGlhIGVsZW1lbnQuIFRoZSBzb3VyY2VzIHdpbGwgYmVcblx0KiBhcHBlbmRlZCBhcyBjaGlsZHJlbiB0byB0aGUgbWVkaWEgZWxlbWVudCBhcyBgPHNvdXJjZT5gIGVsZW1lbnRzLlxuXHQqL1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGNvbnN0IHNyYyA9IHRvVmFsdWUob3B0aW9ucy5zcmMpO1xuXHRcdGxldCBzb3VyY2VzID0gW107XG5cdFx0aWYgKCFzcmMpIHJldHVybjtcblx0XHRpZiAodHlwZW9mIHNyYyA9PT0gXCJzdHJpbmdcIikgc291cmNlcyA9IFt7IHNyYyB9XTtcblx0XHRlbHNlIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHNvdXJjZXMgPSBzcmM7XG5cdFx0ZWxzZSBpZiAoaXNPYmplY3Qoc3JjKSkgc291cmNlcyA9IFtzcmNdO1xuXHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJzb3VyY2VcIikuZm9yRWFjaCgoZSkgPT4ge1xuXHRcdFx0ZS5yZW1vdmUoKTtcblx0XHR9KTtcblx0XHRzb3VyY2VzLmZvckVhY2goKHsgc3JjOiBzcmMkMSwgdHlwZSwgbWVkaWEgfSkgPT4ge1xuXHRcdFx0Y29uc3Qgc291cmNlID0gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwic291cmNlXCIpO1xuXHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZShcInNyY1wiLCBzcmMkMSk7XG5cdFx0XHRzb3VyY2Uuc2V0QXR0cmlidXRlKFwidHlwZVwiLCB0eXBlIHx8IFwiXCIpO1xuXHRcdFx0c291cmNlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhIHx8IFwiXCIpO1xuXHRcdFx0dXNlRXZlbnRMaXN0ZW5lcihzb3VyY2UsIFwiZXJyb3JcIiwgc291cmNlRXJyb3JFdmVudC50cmlnZ2VyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoc291cmNlKTtcblx0XHR9KTtcblx0XHRlbC5sb2FkKCk7XG5cdH0pO1xuXHQvKipcblx0KiBBcHBseSBjb21wb3NhYmxlIHN0YXRlIHRvIHRoZSBlbGVtZW50LCBhbHNvIHdoZW4gZWxlbWVudCBpcyBjaGFuZ2VkXG5cdCovXG5cdHdhdGNoKFt0YXJnZXQsIHZvbHVtZV0sICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0ZWwudm9sdW1lID0gdm9sdW1lLnZhbHVlO1xuXHR9KTtcblx0d2F0Y2goW3RhcmdldCwgbXV0ZWRdLCAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLm11dGVkID0gbXV0ZWQudmFsdWU7XG5cdH0pO1xuXHR3YXRjaChbdGFyZ2V0LCByYXRlXSwgKCkgPT4ge1xuXHRcdGNvbnN0IGVsID0gdG9WYWx1ZSh0YXJnZXQpO1xuXHRcdGlmICghZWwpIHJldHVybjtcblx0XHRlbC5wbGF5YmFja1JhdGUgPSByYXRlLnZhbHVlO1xuXHR9KTtcblx0LyoqXG5cdCogTG9hZCBUcmFja3Ncblx0Ki9cblx0d2F0Y2hFZmZlY3QoKCkgPT4ge1xuXHRcdGlmICghZG9jdW1lbnQkMSkgcmV0dXJuO1xuXHRcdGNvbnN0IHRleHRUcmFja3MgPSB0b1ZhbHVlKG9wdGlvbnMudHJhY2tzKTtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIXRleHRUcmFja3MgfHwgIXRleHRUcmFja3MubGVuZ3RoIHx8ICFlbCkgcmV0dXJuO1xuXHRcdC8qKlxuXHRcdCogVGhlIE1lZGlhQVBJIHByb3ZpZGVzIGFuIEFQSSBmb3IgYWRkaW5nIHRleHQgdHJhY2tzLCBidXQgdGhleSBkb24ndCBjdXJyZW50bHlcblx0XHQqIGhhdmUgYW4gQVBJIGZvciByZW1vdmluZyB0ZXh0IHRyYWNrcywgc28gaW5zdGVhZCB3ZSB3aWxsIGp1c3QgY3JlYXRlIGFuZCByZW1vdmVcblx0XHQqIHRoZSB0cmFja3MgbWFudWFsbHkgdXNpbmcgdGhlIEhUTUwgYXBpLlxuXHRcdCovXG5cdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcInRyYWNrXCIpLmZvckVhY2goKGUpID0+IGUucmVtb3ZlKCkpO1xuXHRcdHRleHRUcmFja3MuZm9yRWFjaCgoeyBkZWZhdWx0OiBpc0RlZmF1bHQsIGtpbmQsIGxhYmVsLCBzcmMsIHNyY0xhbmcgfSwgaSkgPT4ge1xuXHRcdFx0Y29uc3QgdHJhY2sgPSBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJ0cmFja1wiKTtcblx0XHRcdHRyYWNrLmRlZmF1bHQgPSBpc0RlZmF1bHQgfHwgZmFsc2U7XG5cdFx0XHR0cmFjay5raW5kID0ga2luZDtcblx0XHRcdHRyYWNrLmxhYmVsID0gbGFiZWw7XG5cdFx0XHR0cmFjay5zcmMgPSBzcmM7XG5cdFx0XHR0cmFjay5zcmNsYW5nID0gc3JjTGFuZztcblx0XHRcdGlmICh0cmFjay5kZWZhdWx0KSBzZWxlY3RlZFRyYWNrLnZhbHVlID0gaTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKHRyYWNrKTtcblx0XHR9KTtcblx0fSk7XG5cdC8qKlxuXHQqIFRoaXMgd2lsbCBhbGxvdyB1cyB0byB1cGRhdGUgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZSB0aW1ldXBkYXRlIGV2ZW50XG5cdCogd2l0aG91dCBzZXR0aW5nIHRoZSBtZWRpYXMgY3VycmVudCBwb3NpdGlvbiwgYnV0IGlmIHRoZSB1c2VyIGNoYW5nZXMgdGhlXG5cdCogY3VycmVudCB0aW1lIHZpYSB0aGUgcmVmLCB0aGVuIHRoZSBtZWRpYSB3aWxsIHNlZWsuXG5cdCpcblx0KiBJZiB3ZSBkaWQgbm90IHVzZSBhbiBpZ25vcmFibGUgd2F0Y2gsIHRoZW4gdGhlIGN1cnJlbnQgdGltZSB1cGRhdGUgZnJvbVxuXHQqIHRoZSB0aW1ldXBkYXRlIGV2ZW50IHdvdWxkIGNhdXNlIHRoZSBtZWRpYSB0byBzdHV0dGVyLlxuXHQqL1xuXHRjb25zdCB7IGlnbm9yZVVwZGF0ZXM6IGlnbm9yZUN1cnJlbnRUaW1lVXBkYXRlcyB9ID0gd2F0Y2hJZ25vcmFibGUoY3VycmVudFRpbWUsICh0aW1lKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGVsLmN1cnJlbnRUaW1lID0gdGltZTtcblx0fSk7XG5cdC8qKlxuXHQqIFVzaW5nIGFuIGlnbm9yYWJsZSB3YXRjaCBzbyB3ZSBjYW4gY29udHJvbCB0aGUgcGxheSBzdGF0ZSB1c2luZyBhIHJlZiBhbmQgbm90XG5cdCogYSBmdW5jdGlvblxuXHQqL1xuXHRjb25zdCB7IGlnbm9yZVVwZGF0ZXM6IGlnbm9yZVBsYXlpbmdVcGRhdGVzIH0gPSB3YXRjaElnbm9yYWJsZShwbGF5aW5nLCAoaXNQbGF5aW5nKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdGlmIChpc1BsYXlpbmcpIGVsLnBsYXkoKS5jYXRjaCgoZSkgPT4ge1xuXHRcdFx0cGxheWJhY2tFcnJvckV2ZW50LnRyaWdnZXIoZSk7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH0pO1xuXHRcdGVsc2UgZWwucGF1c2UoKTtcblx0fSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRpbWV1cGRhdGVcIiwgKCkgPT4gaWdub3JlQ3VycmVudFRpbWVVcGRhdGVzKCgpID0+IGN1cnJlbnRUaW1lLnZhbHVlID0gdG9WYWx1ZSh0YXJnZXQpLmN1cnJlbnRUaW1lKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHVyYXRpb25jaGFuZ2VcIiwgKCkgPT4gZHVyYXRpb24udmFsdWUgPSB0b1ZhbHVlKHRhcmdldCkuZHVyYXRpb24sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInByb2dyZXNzXCIsICgpID0+IGJ1ZmZlcmVkLnZhbHVlID0gdGltZVJhbmdlVG9BcnJheSh0b1ZhbHVlKHRhcmdldCkuYnVmZmVyZWQpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJzZWVraW5nXCIsICgpID0+IHNlZWtpbmcudmFsdWUgPSB0cnVlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJzZWVrZWRcIiwgKCkgPT4gc2Vla2luZy52YWx1ZSA9IGZhbHNlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1wid2FpdGluZ1wiLCBcImxvYWRzdGFydFwiXSwgKCkgPT4ge1xuXHRcdHdhaXRpbmcudmFsdWUgPSB0cnVlO1xuXHRcdGlnbm9yZVBsYXlpbmdVcGRhdGVzKCgpID0+IHBsYXlpbmcudmFsdWUgPSBmYWxzZSk7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImxvYWRlZGRhdGFcIiwgKCkgPT4gd2FpdGluZy52YWx1ZSA9IGZhbHNlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwbGF5aW5nXCIsICgpID0+IHtcblx0XHR3YWl0aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0ZW5kZWQudmFsdWUgPSBmYWxzZTtcblx0XHRpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gdHJ1ZSk7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInJhdGVjaGFuZ2VcIiwgKCkgPT4gcmF0ZS52YWx1ZSA9IHRvVmFsdWUodGFyZ2V0KS5wbGF5YmFja1JhdGUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInN0YWxsZWRcIiwgKCkgPT4gc3RhbGxlZC52YWx1ZSA9IHRydWUsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImVuZGVkXCIsICgpID0+IGVuZGVkLnZhbHVlID0gdHJ1ZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicGF1c2VcIiwgKCkgPT4gaWdub3JlUGxheWluZ1VwZGF0ZXMoKCkgPT4gcGxheWluZy52YWx1ZSA9IGZhbHNlKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicGxheVwiLCAoKSA9PiBpZ25vcmVQbGF5aW5nVXBkYXRlcygoKSA9PiBwbGF5aW5nLnZhbHVlID0gdHJ1ZSksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcImVudGVycGljdHVyZWlucGljdHVyZVwiLCAoKSA9PiBpc1BpY3R1cmVJblBpY3R1cmUudmFsdWUgPSB0cnVlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJsZWF2ZXBpY3R1cmVpbnBpY3R1cmVcIiwgKCkgPT4gaXNQaWN0dXJlSW5QaWN0dXJlLnZhbHVlID0gZmFsc2UsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInZvbHVtZWNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSB0b1ZhbHVlKHRhcmdldCk7XG5cdFx0aWYgKCFlbCkgcmV0dXJuO1xuXHRcdHZvbHVtZS52YWx1ZSA9IGVsLnZvbHVtZTtcblx0XHRtdXRlZC52YWx1ZSA9IGVsLm11dGVkO1xuXHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHQvKipcblx0KiBUaGUgZm9sbG93aW5nIGxpc3RlbmVycyBuZWVkIHRvIGxpc3RlbiB0byBhIG5lc3RlZFxuXHQqIG9iamVjdCBvbiB0aGUgdGFyZ2V0LCBzbyB3ZSB3aWxsIGhhdmUgdG8gdXNlIGEgbmVzdGVkXG5cdCogd2F0Y2ggYW5kIG1hbnVhbGx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzXG5cdCovXG5cdGNvbnN0IGxpc3RlbmVycyA9IFtdO1xuXHRjb25zdCBzdG9wID0gd2F0Y2goW3RhcmdldF0sICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHRvVmFsdWUodGFyZ2V0KTtcblx0XHRpZiAoIWVsKSByZXR1cm47XG5cdFx0c3RvcCgpO1xuXHRcdGxpc3RlbmVyc1swXSA9IHVzZUV2ZW50TGlzdGVuZXIoZWwudGV4dFRyYWNrcywgXCJhZGR0cmFja1wiLCAoKSA9PiB0cmFja3MudmFsdWUgPSB0cmFja3NUb0FycmF5KGVsLnRleHRUcmFja3MpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGxpc3RlbmVyc1sxXSA9IHVzZUV2ZW50TGlzdGVuZXIoZWwudGV4dFRyYWNrcywgXCJyZW1vdmV0cmFja1wiLCAoKSA9PiB0cmFja3MudmFsdWUgPSB0cmFja3NUb0FycmF5KGVsLnRleHRUcmFja3MpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGxpc3RlbmVyc1syXSA9IHVzZUV2ZW50TGlzdGVuZXIoZWwudGV4dFRyYWNrcywgXCJjaGFuZ2VcIiwgKCkgPT4gdHJhY2tzLnZhbHVlID0gdHJhY2tzVG9BcnJheShlbC50ZXh0VHJhY2tzKSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoKSkpO1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnRUaW1lLFxuXHRcdGR1cmF0aW9uLFxuXHRcdHdhaXRpbmcsXG5cdFx0c2Vla2luZyxcblx0XHRlbmRlZCxcblx0XHRzdGFsbGVkLFxuXHRcdGJ1ZmZlcmVkLFxuXHRcdHBsYXlpbmcsXG5cdFx0cmF0ZSxcblx0XHR2b2x1bWUsXG5cdFx0bXV0ZWQsXG5cdFx0dHJhY2tzLFxuXHRcdHNlbGVjdGVkVHJhY2ssXG5cdFx0ZW5hYmxlVHJhY2ssXG5cdFx0ZGlzYWJsZVRyYWNrLFxuXHRcdHN1cHBvcnRzUGljdHVyZUluUGljdHVyZSxcblx0XHR0b2dnbGVQaWN0dXJlSW5QaWN0dXJlLFxuXHRcdGlzUGljdHVyZUluUGljdHVyZSxcblx0XHRvblNvdXJjZUVycm9yOiBzb3VyY2VFcnJvckV2ZW50Lm9uLFxuXHRcdG9uUGxheWJhY2tFcnJvcjogcGxheWJhY2tFcnJvckV2ZW50Lm9uXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lbW9pemUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBmdW5jdGlvbiByZXN1bHQgY2FjaGUgYmFzZWQgb24gYXJndW1lbnRzXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTWVtb2l6ZShyZXNvbHZlciwgb3B0aW9ucykge1xuXHRjb25zdCBpbml0Q2FjaGUgPSAoKSA9PiB7XG5cdFx0aWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jYWNoZSkgcmV0dXJuIHNoYWxsb3dSZWFjdGl2ZShvcHRpb25zLmNhY2hlKTtcblx0XHRyZXR1cm4gc2hhbGxvd1JlYWN0aXZlKC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCkpO1xuXHR9O1xuXHRjb25zdCBjYWNoZSA9IGluaXRDYWNoZSgpO1xuXHQvKipcblx0KiBHZW5lcmF0ZSBrZXkgZnJvbSBhcmdzXG5cdCovXG5cdGNvbnN0IGdlbmVyYXRlS2V5ID0gKC4uLmFyZ3MpID0+IChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuZ2V0S2V5KSA/IG9wdGlvbnMuZ2V0S2V5KC4uLmFyZ3MpIDogSlNPTi5zdHJpbmdpZnkoYXJncyk7XG5cdC8qKlxuXHQqIExvYWQgZGF0YSBhbmQgc2F2ZSBpbiBjYWNoZVxuXHQqL1xuXHRjb25zdCBfbG9hZERhdGEgPSAoa2V5LCAuLi5hcmdzKSA9PiB7XG5cdFx0Y2FjaGUuc2V0KGtleSwgcmVzb2x2ZXIoLi4uYXJncykpO1xuXHRcdHJldHVybiBjYWNoZS5nZXQoa2V5KTtcblx0fTtcblx0Y29uc3QgbG9hZERhdGEgPSAoLi4uYXJncykgPT4gX2xvYWREYXRhKGdlbmVyYXRlS2V5KC4uLmFyZ3MpLCAuLi5hcmdzKTtcblx0LyoqXG5cdCogRGVsZXRlIGtleSBmcm9tIGNhY2hlXG5cdCovXG5cdGNvbnN0IGRlbGV0ZURhdGEgPSAoLi4uYXJncykgPT4ge1xuXHRcdGNhY2hlLmRlbGV0ZShnZW5lcmF0ZUtleSguLi5hcmdzKSk7XG5cdH07XG5cdC8qKlxuXHQqIENsZWFyIGNhY2hlZCBkYXRhXG5cdCovXG5cdGNvbnN0IGNsZWFyRGF0YSA9ICgpID0+IHtcblx0XHRjYWNoZS5jbGVhcigpO1xuXHR9O1xuXHRjb25zdCBtZW1vaXplZCA9ICguLi5hcmdzKSA9PiB7XG5cdFx0Y29uc3Qga2V5ID0gZ2VuZXJhdGVLZXkoLi4uYXJncyk7XG5cdFx0aWYgKGNhY2hlLmhhcyhrZXkpKSByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG5cdFx0cmV0dXJuIF9sb2FkRGF0YShrZXksIC4uLmFyZ3MpO1xuXHR9O1xuXHRtZW1vaXplZC5sb2FkID0gbG9hZERhdGE7XG5cdG1lbW9pemVkLmRlbGV0ZSA9IGRlbGV0ZURhdGE7XG5cdG1lbW9pemVkLmNsZWFyID0gY2xlYXJEYXRhO1xuXHRtZW1vaXplZC5nZW5lcmF0ZUtleSA9IGdlbmVyYXRlS2V5O1xuXHRtZW1vaXplZC5jYWNoZSA9IGNhY2hlO1xuXHRyZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU1lbW9yeS9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ2KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucyB8fCBcImltbWVkaWF0ZUNhbGxiYWNrXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSAxZTMsIGltbWVkaWF0ZSwgaW1tZWRpYXRlQ2FsbGJhY2sgfSA9IG9wdGlvbnM7XG5cdFx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgaW50ZXJ2YWwsIHtcblx0XHRcdGltbWVkaWF0ZSxcblx0XHRcdGltbWVkaWF0ZUNhbGxiYWNrXG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHVzZUludGVydmFsRm47XG59XG4vKipcbiogUmVhY3RpdmUgTWVtb3J5IEluZm8uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1lbW9yeVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU1lbW9yeShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgbWVtb3J5ID0gcmVmKCk7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB0eXBlb2YgcGVyZm9ybWFuY2UgIT09IFwidW5kZWZpbmVkXCIgJiYgXCJtZW1vcnlcIiBpbiBwZXJmb3JtYW5jZSk7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGNvbnN0IHsgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQ2IH0gPSBvcHRpb25zO1xuXHRcdHNjaGVkdWxlcigoKSA9PiB7XG5cdFx0XHRtZW1vcnkudmFsdWUgPSBwZXJmb3JtYW5jZS5tZW1vcnk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRtZW1vcnlcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTW91c2UvaW5kZXgudHNcbmNvbnN0IFVzZU1vdXNlQnVpbHRpbkV4dHJhY3RvcnMgPSB7XG5cdHBhZ2U6IChldmVudCkgPT4gW2V2ZW50LnBhZ2VYLCBldmVudC5wYWdlWV0sXG5cdGNsaWVudDogKGV2ZW50KSA9PiBbZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WV0sXG5cdHNjcmVlbjogKGV2ZW50KSA9PiBbZXZlbnQuc2NyZWVuWCwgZXZlbnQuc2NyZWVuWV0sXG5cdG1vdmVtZW50OiAoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCA/IFtldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WV0gOiBudWxsXG59O1xuLyoqXG4qIFJlYWN0aXZlIG1vdXNlIHBvc2l0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VNb3VzZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZU1vdXNlKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHR5cGUgPSBcInBhZ2VcIiwgdG91Y2ggPSB0cnVlLCByZXNldE9uVG91Y2hFbmRzID0gZmFsc2UsIGluaXRpYWxWYWx1ZSA9IHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIHRhcmdldCA9IHdpbmRvdyQxLCBzY3JvbGwgPSB0cnVlLCBldmVudEZpbHRlciB9ID0gb3B0aW9ucztcblx0bGV0IF9wcmV2TW91c2VFdmVudCA9IG51bGw7XG5cdGxldCBfcHJldlNjcm9sbFggPSAwO1xuXHRsZXQgX3ByZXZTY3JvbGxZID0gMDtcblx0Y29uc3QgeCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlLngpO1xuXHRjb25zdCB5ID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUueSk7XG5cdGNvbnN0IHNvdXJjZVR5cGUgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBleHRyYWN0b3IgPSB0eXBlb2YgdHlwZSA9PT0gXCJmdW5jdGlvblwiID8gdHlwZSA6IFVzZU1vdXNlQnVpbHRpbkV4dHJhY3RvcnNbdHlwZV07XG5cdGNvbnN0IG1vdXNlSGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RvcihldmVudCk7XG5cdFx0X3ByZXZNb3VzZUV2ZW50ID0gZXZlbnQ7XG5cdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0W3gudmFsdWUsIHkudmFsdWVdID0gcmVzdWx0O1xuXHRcdFx0c291cmNlVHlwZS52YWx1ZSA9IFwibW91c2VcIjtcblx0XHR9XG5cdFx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0XHRfcHJldlNjcm9sbFggPSB3aW5kb3ckMS5zY3JvbGxYO1xuXHRcdFx0X3ByZXZTY3JvbGxZID0gd2luZG93JDEuc2Nyb2xsWTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHRvdWNoSGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RvcihldmVudC50b3VjaGVzWzBdKTtcblx0XHRcdGlmIChyZXN1bHQpIHtcblx0XHRcdFx0W3gudmFsdWUsIHkudmFsdWVdID0gcmVzdWx0O1xuXHRcdFx0XHRzb3VyY2VUeXBlLnZhbHVlID0gXCJ0b3VjaFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0Y29uc3Qgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcblx0XHRpZiAoIV9wcmV2TW91c2VFdmVudCB8fCAhd2luZG93JDEpIHJldHVybjtcblx0XHRjb25zdCBwb3MgPSBleHRyYWN0b3IoX3ByZXZNb3VzZUV2ZW50KTtcblx0XHRpZiAoX3ByZXZNb3VzZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiBwb3MpIHtcblx0XHRcdHgudmFsdWUgPSBwb3NbMF0gKyB3aW5kb3ckMS5zY3JvbGxYIC0gX3ByZXZTY3JvbGxYO1xuXHRcdFx0eS52YWx1ZSA9IHBvc1sxXSArIHdpbmRvdyQxLnNjcm9sbFkgLSBfcHJldlNjcm9sbFk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZXNldCA9ICgpID0+IHtcblx0XHR4LnZhbHVlID0gaW5pdGlhbFZhbHVlLng7XG5cdFx0eS52YWx1ZSA9IGluaXRpYWxWYWx1ZS55O1xuXHR9O1xuXHRjb25zdCBtb3VzZUhhbmRsZXJXcmFwcGVyID0gZXZlbnRGaWx0ZXIgPyAoZXZlbnQpID0+IGV2ZW50RmlsdGVyKCgpID0+IG1vdXNlSGFuZGxlcihldmVudCksIHt9KSA6IChldmVudCkgPT4gbW91c2VIYW5kbGVyKGV2ZW50KTtcblx0Y29uc3QgdG91Y2hIYW5kbGVyV3JhcHBlciA9IGV2ZW50RmlsdGVyID8gKGV2ZW50KSA9PiBldmVudEZpbHRlcigoKSA9PiB0b3VjaEhhbmRsZXIoZXZlbnQpLCB7fSkgOiAoZXZlbnQpID0+IHRvdWNoSGFuZGxlcihldmVudCk7XG5cdGNvbnN0IHNjcm9sbEhhbmRsZXJXcmFwcGVyID0gZXZlbnRGaWx0ZXIgPyAoKSA9PiBldmVudEZpbHRlcigoKSA9PiBzY3JvbGxIYW5kbGVyKCksIHt9KSA6ICgpID0+IHNjcm9sbEhhbmRsZXIoKTtcblx0aWYgKHRhcmdldCkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXCJtb3VzZW1vdmVcIiwgXCJkcmFnb3ZlclwiXSwgbW91c2VIYW5kbGVyV3JhcHBlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHRpZiAodG91Y2ggJiYgdHlwZSAhPT0gXCJtb3ZlbWVudFwiKSB7XG5cdFx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgW1widG91Y2hzdGFydFwiLCBcInRvdWNobW92ZVwiXSwgdG91Y2hIYW5kbGVyV3JhcHBlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHRcdGlmIChyZXNldE9uVG91Y2hFbmRzKSB1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJ0b3VjaGVuZFwiLCByZXNldCwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR9XG5cdFx0aWYgKHNjcm9sbCAmJiB0eXBlID09PSBcInBhZ2VcIikgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJzY3JvbGxcIiwgc2Nyb2xsSGFuZGxlcldyYXBwZXIsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR4LFxuXHRcdHksXG5cdFx0c291cmNlVHlwZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VNb3VzZUluRWxlbWVudC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIG1vdXNlIHBvc2l0aW9uIHJlbGF0ZWQgdG8gYW4gZWxlbWVudC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTW91c2VJbkVsZW1lbnRcbiogQHBhcmFtIHRhcmdldFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZU1vdXNlSW5FbGVtZW50KHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93UmVzaXplID0gdHJ1ZSwgd2luZG93U2Nyb2xsID0gdHJ1ZSwgaGFuZGxlT3V0c2lkZSA9IHRydWUsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCB0eXBlID0gb3B0aW9ucy50eXBlIHx8IFwicGFnZVwiO1xuXHRjb25zdCB7IHgsIHksIHNvdXJjZVR5cGUgfSA9IHVzZU1vdXNlKG9wdGlvbnMpO1xuXHRjb25zdCB0YXJnZXRSZWYgPSBzaGFsbG93UmVmKHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5kb2N1bWVudC5ib2R5KTtcblx0Y29uc3QgZWxlbWVudFggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBlbGVtZW50WSA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRQb3NpdGlvblggPSBzaGFsbG93UmVmKDApO1xuXHRjb25zdCBlbGVtZW50UG9zaXRpb25ZID0gc2hhbGxvd1JlZigwKTtcblx0Y29uc3QgZWxlbWVudEhlaWdodCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGVsZW1lbnRXaWR0aCA9IHNoYWxsb3dSZWYoMCk7XG5cdGNvbnN0IGlzT3V0c2lkZSA9IHNoYWxsb3dSZWYodHJ1ZSk7XG5cdGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSB1bnJlZkVsZW1lbnQodGFyZ2V0UmVmKTtcblx0XHRpZiAoIWVsIHx8ICEoZWwgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgcmVjdCBvZiBlbC5nZXRDbGllbnRSZWN0cygpKSB7XG5cdFx0XHRjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gcmVjdDtcblx0XHRcdGVsZW1lbnRQb3NpdGlvblgudmFsdWUgPSBsZWZ0ICsgKHR5cGUgPT09IFwicGFnZVwiID8gd2luZG93JDEucGFnZVhPZmZzZXQgOiAwKTtcblx0XHRcdGVsZW1lbnRQb3NpdGlvblkudmFsdWUgPSB0b3AgKyAodHlwZSA9PT0gXCJwYWdlXCIgPyB3aW5kb3ckMS5wYWdlWU9mZnNldCA6IDApO1xuXHRcdFx0ZWxlbWVudEhlaWdodC52YWx1ZSA9IGhlaWdodDtcblx0XHRcdGVsZW1lbnRXaWR0aC52YWx1ZSA9IHdpZHRoO1xuXHRcdFx0Y29uc3QgZWxYID0geC52YWx1ZSAtIGVsZW1lbnRQb3NpdGlvblgudmFsdWU7XG5cdFx0XHRjb25zdCBlbFkgPSB5LnZhbHVlIC0gZWxlbWVudFBvc2l0aW9uWS52YWx1ZTtcblx0XHRcdGlzT3V0c2lkZS52YWx1ZSA9IHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCB8fCBlbFggPCAwIHx8IGVsWSA8IDAgfHwgZWxYID4gd2lkdGggfHwgZWxZID4gaGVpZ2h0O1xuXHRcdFx0aWYgKGhhbmRsZU91dHNpZGUgfHwgIWlzT3V0c2lkZS52YWx1ZSkge1xuXHRcdFx0XHRlbGVtZW50WC52YWx1ZSA9IGVsWDtcblx0XHRcdFx0ZWxlbWVudFkudmFsdWUgPSBlbFk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWlzT3V0c2lkZS52YWx1ZSkgYnJlYWs7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0b3BGbkxpc3QgPSBbXTtcblx0ZnVuY3Rpb24gc3RvcCgpIHtcblx0XHRzdG9wRm5MaXN0LmZvckVhY2goKGZuKSA9PiBmbigpKTtcblx0XHRzdG9wRm5MaXN0Lmxlbmd0aCA9IDA7XG5cdH1cblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR1cGRhdGUoKTtcblx0fSk7XG5cdGlmICh3aW5kb3ckMSkge1xuXHRcdGNvbnN0IHsgc3RvcDogc3RvcFJlc2l6ZU9ic2VydmVyIH0gPSB1c2VSZXNpemVPYnNlcnZlcih0YXJnZXRSZWYsIHVwZGF0ZSk7XG5cdFx0Y29uc3QgeyBzdG9wOiBzdG9wTXV0YXRpb25PYnNlcnZlciB9ID0gdXNlTXV0YXRpb25PYnNlcnZlcih0YXJnZXRSZWYsIHVwZGF0ZSwgeyBhdHRyaWJ1dGVGaWx0ZXI6IFtcInN0eWxlXCIsIFwiY2xhc3NcIl0gfSk7XG5cdFx0Y29uc3Qgc3RvcFdhdGNoID0gd2F0Y2goW1xuXHRcdFx0dGFyZ2V0UmVmLFxuXHRcdFx0eCxcblx0XHRcdHlcblx0XHRdLCB1cGRhdGUpO1xuXHRcdHN0b3BGbkxpc3QucHVzaChzdG9wUmVzaXplT2JzZXJ2ZXIsIHN0b3BNdXRhdGlvbk9ic2VydmVyLCBzdG9wV2F0Y2gpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwibW91c2VsZWF2ZVwiLCAoKSA9PiBpc091dHNpZGUudmFsdWUgPSB0cnVlLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0aWYgKHdpbmRvd1Njcm9sbCkgc3RvcEZuTGlzdC5wdXNoKHVzZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlLCB7XG5cdFx0XHRjYXB0dXJlOiB0cnVlLFxuXHRcdFx0cGFzc2l2ZTogdHJ1ZVxuXHRcdH0pKTtcblx0XHRpZiAod2luZG93UmVzaXplKSBzdG9wRm5MaXN0LnB1c2godXNlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR4LFxuXHRcdHksXG5cdFx0c291cmNlVHlwZSxcblx0XHRlbGVtZW50WCxcblx0XHRlbGVtZW50WSxcblx0XHRlbGVtZW50UG9zaXRpb25YLFxuXHRcdGVsZW1lbnRQb3NpdGlvblksXG5cdFx0ZWxlbWVudEhlaWdodCxcblx0XHRlbGVtZW50V2lkdGgsXG5cdFx0aXNPdXRzaWRlLFxuXHRcdHN0b3Bcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlTW91c2VQcmVzc2VkL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgbW91c2UgcHJlc3Npbmcgc3RhdGUuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU1vdXNlUHJlc3NlZFxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZU1vdXNlUHJlc3NlZChvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0b3VjaCA9IHRydWUsIGRyYWcgPSB0cnVlLCBjYXB0dXJlID0gZmFsc2UsIGluaXRpYWxWYWx1ZSA9IGZhbHNlLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgcHJlc3NlZCA9IHNoYWxsb3dSZWYoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3Qgc291cmNlVHlwZSA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGlmICghd2luZG93JDEpIHJldHVybiB7XG5cdFx0cHJlc3NlZCxcblx0XHRzb3VyY2VUeXBlXG5cdH07XG5cdGNvbnN0IG9uUHJlc3NlZCA9IChzcmNUeXBlKSA9PiAoZXZlbnQpID0+IHtcblx0XHR2YXIgX29wdGlvbnMkb25QcmVzc2VkO1xuXHRcdHByZXNzZWQudmFsdWUgPSB0cnVlO1xuXHRcdHNvdXJjZVR5cGUudmFsdWUgPSBzcmNUeXBlO1xuXHRcdChfb3B0aW9ucyRvblByZXNzZWQgPSBvcHRpb25zLm9uUHJlc3NlZCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25QcmVzc2VkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25QcmVzc2VkLmNhbGwob3B0aW9ucywgZXZlbnQpO1xuXHR9O1xuXHRjb25zdCBvblJlbGVhc2VkID0gKGV2ZW50KSA9PiB7XG5cdFx0dmFyIF9vcHRpb25zJG9uUmVsZWFzZWQ7XG5cdFx0cHJlc3NlZC52YWx1ZSA9IGZhbHNlO1xuXHRcdHNvdXJjZVR5cGUudmFsdWUgPSBudWxsO1xuXHRcdChfb3B0aW9ucyRvblJlbGVhc2VkID0gb3B0aW9ucy5vblJlbGVhc2VkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvblJlbGVhc2VkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25SZWxlYXNlZC5jYWxsKG9wdGlvbnMsIGV2ZW50KTtcblx0fTtcblx0Y29uc3QgdGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdW5yZWZFbGVtZW50KG9wdGlvbnMudGFyZ2V0KSB8fCB3aW5kb3ckMSk7XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRwYXNzaXZlOiB0cnVlLFxuXHRcdGNhcHR1cmVcblx0fTtcblx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwibW91c2Vkb3duXCIsIG9uUHJlc3NlZChcIm1vdXNlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm1vdXNlbGVhdmVcIiwgb25SZWxlYXNlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJtb3VzZXVwXCIsIG9uUmVsZWFzZWQsIGxpc3RlbmVyT3B0aW9ucyk7XG5cdGlmIChkcmFnKSB7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwiZHJhZ3N0YXJ0XCIsIG9uUHJlc3NlZChcIm1vdXNlXCIpLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZHJvcFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwiZHJhZ2VuZFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdGlmICh0b3VjaCkge1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBcInRvdWNoc3RhcnRcIiwgb25QcmVzc2VkKFwidG91Y2hcIiksIGxpc3RlbmVyT3B0aW9ucyk7XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJ0b3VjaGVuZFwiLCBvblJlbGVhc2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwidG91Y2hjYW5jZWxcIiwgb25SZWxlYXNlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHByZXNzZWQsXG5cdFx0c291cmNlVHlwZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VOYXZpZ2F0b3JMYW5ndWFnZS9pbmRleC50c1xuLyoqXG4qXG4qIFJlYWN0aXZlIHVzZU5hdmlnYXRvckxhbmd1YWdlXG4qXG4qIERldGVjdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB1c2VyIGxhbmd1YWdlIGFuZCByZXR1cm5zIGEgcmVhY3RpdmUgbGFuZ3VhZ2VcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTmF2aWdhdG9yTGFuZ3VhZ2VcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VOYXZpZ2F0b3JMYW5ndWFnZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgbmF2aWdhdG9yJDEgPSB3aW5kb3ckMSA9PT0gbnVsbCB8fCB3aW5kb3ckMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2luZG93JDEubmF2aWdhdG9yO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJsYW5ndWFnZVwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgbGFuZ3VhZ2UgPSBzaGFsbG93UmVmKG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuYXZpZ2F0b3IkMS5sYW5ndWFnZSk7XG5cdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEsIFwibGFuZ3VhZ2VjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdGlmIChuYXZpZ2F0b3IkMSkgbGFuZ3VhZ2UudmFsdWUgPSBuYXZpZ2F0b3IkMS5sYW5ndWFnZTtcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGxhbmd1YWdlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU5ldHdvcmsvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBOZXR3b3JrIHN0YXR1cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTmV0d29ya1xuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZU5ldHdvcmsob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG5hdmlnYXRvciQxID0gd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLm5hdmlnYXRvcjtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IG5hdmlnYXRvciQxICYmIFwiY29ubmVjdGlvblwiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgaXNPbmxpbmUgPSBzaGFsbG93UmVmKHRydWUpO1xuXHRjb25zdCBzYXZlRGF0YSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBvZmZsaW5lQXQgPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IG9ubGluZUF0ID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCBkb3dubGluayA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgZG93bmxpbmtNYXggPSBzaGFsbG93UmVmKHZvaWQgMCk7XG5cdGNvbnN0IHJ0dCA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgZWZmZWN0aXZlVHlwZSA9IHNoYWxsb3dSZWYodm9pZCAwKTtcblx0Y29uc3QgdHlwZSA9IHNoYWxsb3dSZWYoXCJ1bmtub3duXCIpO1xuXHRjb25zdCBjb25uZWN0aW9uID0gaXNTdXBwb3J0ZWQudmFsdWUgJiYgbmF2aWdhdG9yJDEuY29ubmVjdGlvbjtcblx0ZnVuY3Rpb24gdXBkYXRlTmV0d29ya0luZm9ybWF0aW9uKCkge1xuXHRcdGlmICghbmF2aWdhdG9yJDEpIHJldHVybjtcblx0XHRpc09ubGluZS52YWx1ZSA9IG5hdmlnYXRvciQxLm9uTGluZTtcblx0XHRvZmZsaW5lQXQudmFsdWUgPSBpc09ubGluZS52YWx1ZSA/IHZvaWQgMCA6IERhdGUubm93KCk7XG5cdFx0b25saW5lQXQudmFsdWUgPSBpc09ubGluZS52YWx1ZSA/IERhdGUubm93KCkgOiB2b2lkIDA7XG5cdFx0aWYgKGNvbm5lY3Rpb24pIHtcblx0XHRcdGRvd25saW5rLnZhbHVlID0gY29ubmVjdGlvbi5kb3dubGluaztcblx0XHRcdGRvd25saW5rTWF4LnZhbHVlID0gY29ubmVjdGlvbi5kb3dubGlua01heDtcblx0XHRcdGVmZmVjdGl2ZVR5cGUudmFsdWUgPSBjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGU7XG5cdFx0XHRydHQudmFsdWUgPSBjb25uZWN0aW9uLnJ0dDtcblx0XHRcdHNhdmVEYXRhLnZhbHVlID0gY29ubmVjdGlvbi5zYXZlRGF0YTtcblx0XHRcdHR5cGUudmFsdWUgPSBjb25uZWN0aW9uLnR5cGU7XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm9mZmxpbmVcIiwgKCkgPT4ge1xuXHRcdFx0aXNPbmxpbmUudmFsdWUgPSBmYWxzZTtcblx0XHRcdG9mZmxpbmVBdC52YWx1ZSA9IERhdGUubm93KCk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcIm9ubGluZVwiLCAoKSA9PiB7XG5cdFx0XHRpc09ubGluZS52YWx1ZSA9IHRydWU7XG5cdFx0XHRvbmxpbmVBdC52YWx1ZSA9IERhdGUubm93KCk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRpZiAoY29ubmVjdGlvbikgdXNlRXZlbnRMaXN0ZW5lcihjb25uZWN0aW9uLCBcImNoYW5nZVwiLCB1cGRhdGVOZXR3b3JrSW5mb3JtYXRpb24sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHVwZGF0ZU5ldHdvcmtJbmZvcm1hdGlvbigpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzT25saW5lOiByZWFkb25seShpc09ubGluZSksXG5cdFx0c2F2ZURhdGE6IHJlYWRvbmx5KHNhdmVEYXRhKSxcblx0XHRvZmZsaW5lQXQ6IHJlYWRvbmx5KG9mZmxpbmVBdCksXG5cdFx0b25saW5lQXQ6IHJlYWRvbmx5KG9ubGluZUF0KSxcblx0XHRkb3dubGluazogcmVhZG9ubHkoZG93bmxpbmspLFxuXHRcdGRvd25saW5rTWF4OiByZWFkb25seShkb3dubGlua01heCksXG5cdFx0ZWZmZWN0aXZlVHlwZTogcmVhZG9ubHkoZWZmZWN0aXZlVHlwZSksXG5cdFx0cnR0OiByZWFkb25seShydHQpLFxuXHRcdHR5cGU6IHJlYWRvbmx5KHR5cGUpXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU5vdy9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ1KG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IChmbikgPT4gdXNlUmFmRm4oZm4sIHsgaW1tZWRpYXRlIH0pIDogKGZuKSA9PiB1c2VJbnRlcnZhbEZuKGZuLCBpbnRlcnZhbCwgb3B0aW9ucyk7XG5cdH1cblx0cmV0dXJuIHVzZVJhZkZuO1xufVxuLyoqXG4qIFJlYWN0aXZlIGN1cnJlbnQgRGF0ZSBpbnN0YW5jZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlTm93XG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlTm93KG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDUob3B0aW9ucykgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG5vdyA9IHJlZigvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoKSk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IG5vdy52YWx1ZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpO1xuXHRjb25zdCBjb250cm9scyA9IHNjaGVkdWxlcih1cGRhdGUpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0bm93LFxuXHRcdC4uLmNvbnRyb2xzXG5cdH07XG5cdGVsc2UgcmV0dXJuIG5vdztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlT2JqZWN0VXJsL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgVVJMIHJlcHJlc2VudGluZyBhbiBvYmplY3QuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZU9iamVjdFVybFxuKiBAcGFyYW0gb2JqZWN0XG4qL1xuZnVuY3Rpb24gdXNlT2JqZWN0VXJsKG9iamVjdCkge1xuXHRjb25zdCB1cmwgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG5cdFx0aWYgKHVybC52YWx1ZSkgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwudmFsdWUpO1xuXHRcdHVybC52YWx1ZSA9IHZvaWQgMDtcblx0fTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShvYmplY3QpLCAobmV3T2JqZWN0KSA9PiB7XG5cdFx0cmVsZWFzZSgpO1xuXHRcdGlmIChuZXdPYmplY3QpIHVybC52YWx1ZSA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3T2JqZWN0KTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHJlbGVhc2UpO1xuXHRyZXR1cm4gcmVhZG9ubHkodXJsKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vbWF0aC91c2VDbGFtcC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlbHkgY2xhbXAgYSB2YWx1ZSBiZXR3ZWVuIHR3byBvdGhlciB2YWx1ZXMuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZUNsYW1wXG4qIEBwYXJhbSB2YWx1ZSBudW1iZXJcbiogQHBhcmFtIG1pblxuKiBAcGFyYW0gbWF4XG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlQ2xhbXAodmFsdWUsIG1pbiwgbWF4KSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1JlYWRvbmx5KHZhbHVlKSkgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGNsYW1wKHRvVmFsdWUodmFsdWUpLCB0b1ZhbHVlKG1pbiksIHRvVmFsdWUobWF4KSkpO1xuXHRjb25zdCBfdmFsdWUgPSByZWYodmFsdWUpO1xuXHRyZXR1cm4gY29tcHV0ZWQoe1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBfdmFsdWUudmFsdWUgPSBjbGFtcChfdmFsdWUudmFsdWUsIHRvVmFsdWUobWluKSwgdG9WYWx1ZShtYXgpKTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSQxKSB7XG5cdFx0XHRfdmFsdWUudmFsdWUgPSBjbGFtcCh2YWx1ZSQxLCB0b1ZhbHVlKG1pbiksIHRvVmFsdWUobWF4KSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlT2Zmc2V0UGFnaW5hdGlvbi9pbmRleC50c1xuZnVuY3Rpb24gdXNlT2Zmc2V0UGFnaW5hdGlvbihvcHRpb25zKSB7XG5cdGNvbnN0IHsgdG90YWwgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHBhZ2VTaXplID0gMTAsIHBhZ2UgPSAxLCBvblBhZ2VDaGFuZ2UgPSBub29wLCBvblBhZ2VTaXplQ2hhbmdlID0gbm9vcCwgb25QYWdlQ291bnRDaGFuZ2UgPSBub29wIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjdXJyZW50UGFnZVNpemUgPSB1c2VDbGFtcChwYWdlU2l6ZSwgMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcblx0Y29uc3QgcGFnZUNvdW50ID0gY29tcHV0ZWQoKCkgPT4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvVmFsdWUodG90YWwpIC8gdG9WYWx1ZShjdXJyZW50UGFnZVNpemUpKSkpO1xuXHRjb25zdCBjdXJyZW50UGFnZSA9IHVzZUNsYW1wKHBhZ2UsIDEsIHBhZ2VDb3VudCk7XG5cdGNvbnN0IGlzRmlyc3RQYWdlID0gY29tcHV0ZWQoKCkgPT4gY3VycmVudFBhZ2UudmFsdWUgPT09IDEpO1xuXHRjb25zdCBpc0xhc3RQYWdlID0gY29tcHV0ZWQoKCkgPT4gY3VycmVudFBhZ2UudmFsdWUgPT09IHBhZ2VDb3VudC52YWx1ZSk7XG5cdGlmIChpc1JlZihwYWdlKSkgc3luY1JlZihwYWdlLCBjdXJyZW50UGFnZSwgeyBkaXJlY3Rpb246IGlzUmVhZG9ubHkocGFnZSkgPyBcImx0clwiIDogXCJib3RoXCIgfSk7XG5cdGlmIChpc1JlZihwYWdlU2l6ZSkpIHN5bmNSZWYocGFnZVNpemUsIGN1cnJlbnRQYWdlU2l6ZSwgeyBkaXJlY3Rpb246IGlzUmVhZG9ubHkocGFnZVNpemUpID8gXCJsdHJcIiA6IFwiYm90aFwiIH0pO1xuXHRmdW5jdGlvbiBwcmV2KCkge1xuXHRcdGN1cnJlbnRQYWdlLnZhbHVlLS07XG5cdH1cblx0ZnVuY3Rpb24gbmV4dCgpIHtcblx0XHRjdXJyZW50UGFnZS52YWx1ZSsrO1xuXHR9XG5cdGNvbnN0IHJldHVyblZhbHVlID0ge1xuXHRcdGN1cnJlbnRQYWdlLFxuXHRcdGN1cnJlbnRQYWdlU2l6ZSxcblx0XHRwYWdlQ291bnQsXG5cdFx0aXNGaXJzdFBhZ2UsXG5cdFx0aXNMYXN0UGFnZSxcblx0XHRwcmV2LFxuXHRcdG5leHRcblx0fTtcblx0d2F0Y2goY3VycmVudFBhZ2UsICgpID0+IHtcblx0XHRvblBhZ2VDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcblx0fSk7XG5cdHdhdGNoKGN1cnJlbnRQYWdlU2l6ZSwgKCkgPT4ge1xuXHRcdG9uUGFnZVNpemVDaGFuZ2UocmVhY3RpdmUocmV0dXJuVmFsdWUpKTtcblx0fSk7XG5cdHdhdGNoKHBhZ2VDb3VudCwgKCkgPT4ge1xuXHRcdG9uUGFnZUNvdW50Q2hhbmdlKHJlYWN0aXZlKHJldHVyblZhbHVlKSk7XG5cdH0pO1xuXHRyZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZU9ubGluZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIG9ubGluZSBzdGF0ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlT25saW5lXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlT25saW5lKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGlzT25saW5lIH0gPSB1c2VOZXR3b3JrKG9wdGlvbnMpO1xuXHRyZXR1cm4gaXNPbmxpbmU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBhZ2VMZWF2ZS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHN0YXRlIHRvIHNob3cgd2hldGhlciBtb3VzZSBsZWF2ZXMgdGhlIHBhZ2UuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBhZ2VMZWF2ZVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVBhZ2VMZWF2ZShvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNMZWZ0ID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAoIXdpbmRvdyQxKSByZXR1cm47XG5cdFx0ZXZlbnQgPSBldmVudCB8fCB3aW5kb3ckMS5ldmVudDtcblx0XHRpc0xlZnQudmFsdWUgPSAhKGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQudG9FbGVtZW50KTtcblx0fTtcblx0aWYgKHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJtb3VzZW91dFwiLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEuZG9jdW1lbnQsIFwibW91c2VsZWF2ZVwiLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIod2luZG93JDEuZG9jdW1lbnQsIFwibW91c2VlbnRlclwiLCBoYW5kbGVyLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHR9XG5cdHJldHVybiBpc0xlZnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNjcmVlbk9yaWVudGF0aW9uL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc2NyZWVuIG9yaWVudGF0aW9uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcmVlbk9yaWVudGF0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlU2NyZWVuT3JpZW50YXRpb24ob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB3aW5kb3ckMSAmJiBcInNjcmVlblwiIGluIHdpbmRvdyQxICYmIFwib3JpZW50YXRpb25cIiBpbiB3aW5kb3ckMS5zY3JlZW4pO1xuXHRjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IGlzU3VwcG9ydGVkLnZhbHVlID8gd2luZG93JDEuc2NyZWVuLm9yaWVudGF0aW9uIDoge307XG5cdGNvbnN0IG9yaWVudGF0aW9uID0gcmVmKHNjcmVlbk9yaWVudGF0aW9uLnR5cGUpO1xuXHRjb25zdCBhbmdsZSA9IHNoYWxsb3dSZWYoc2NyZWVuT3JpZW50YXRpb24uYW5nbGUgfHwgMCk7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJvcmllbnRhdGlvbmNoYW5nZVwiLCAoKSA9PiB7XG5cdFx0b3JpZW50YXRpb24udmFsdWUgPSBzY3JlZW5PcmllbnRhdGlvbi50eXBlO1xuXHRcdGFuZ2xlLnZhbHVlID0gc2NyZWVuT3JpZW50YXRpb24uYW5nbGU7XG5cdH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0Y29uc3QgbG9ja09yaWVudGF0aW9uID0gKHR5cGUpID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUgJiYgdHlwZW9mIHNjcmVlbk9yaWVudGF0aW9uLmxvY2sgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHNjcmVlbk9yaWVudGF0aW9uLmxvY2sodHlwZSk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KC8qIEBfX1BVUkVfXyAqLyBuZXcgRXJyb3IoXCJOb3Qgc3VwcG9ydGVkXCIpKTtcblx0fTtcblx0Y29uc3QgdW5sb2NrT3JpZW50YXRpb24gPSAoKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHR5cGVvZiBzY3JlZW5PcmllbnRhdGlvbi51bmxvY2sgPT09IFwiZnVuY3Rpb25cIikgc2NyZWVuT3JpZW50YXRpb24udW5sb2NrKCk7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0b3JpZW50YXRpb24sXG5cdFx0YW5nbGUsXG5cdFx0bG9ja09yaWVudGF0aW9uLFxuXHRcdHVubG9ja09yaWVudGF0aW9uXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBhcmFsbGF4L2luZGV4LnRzXG4vKipcbiogQ3JlYXRlIHBhcmFsbGF4IGVmZmVjdCBlYXNpbHkuIEl0IHVzZXMgYHVzZURldmljZU9yaWVudGF0aW9uYCBhbmQgZmFsbGJhY2sgdG8gYHVzZU1vdXNlYFxuKiBpZiBvcmllbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLlxuKlxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlUGFyYWxsYXgodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkZXZpY2VPcmllbnRhdGlvblRpbHRBZGp1c3QgPSAoaSkgPT4gaSwgZGV2aWNlT3JpZW50YXRpb25Sb2xsQWRqdXN0ID0gKGkpID0+IGksIG1vdXNlVGlsdEFkanVzdCA9IChpKSA9PiBpLCBtb3VzZVJvbGxBZGp1c3QgPSAoaSkgPT4gaSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IG9yaWVudGF0aW9uID0gcmVhY3RpdmUodXNlRGV2aWNlT3JpZW50YXRpb24oeyB3aW5kb3c6IHdpbmRvdyQxIH0pKTtcblx0Y29uc3Qgc2NyZWVuT3JpZW50YXRpb24gPSByZWFjdGl2ZSh1c2VTY3JlZW5PcmllbnRhdGlvbih7IHdpbmRvdzogd2luZG93JDEgfSkpO1xuXHRjb25zdCB7IGVsZW1lbnRYOiB4LCBlbGVtZW50WTogeSwgZWxlbWVudFdpZHRoOiB3aWR0aCwgZWxlbWVudEhlaWdodDogaGVpZ2h0IH0gPSB1c2VNb3VzZUluRWxlbWVudCh0YXJnZXQsIHtcblx0XHRoYW5kbGVPdXRzaWRlOiBmYWxzZSxcblx0XHR3aW5kb3c6IHdpbmRvdyQxXG5cdH0pO1xuXHRjb25zdCBzb3VyY2UgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aWYgKG9yaWVudGF0aW9uLmlzU3VwcG9ydGVkICYmIChvcmllbnRhdGlvbi5hbHBoYSAhPSBudWxsICYmIG9yaWVudGF0aW9uLmFscGhhICE9PSAwIHx8IG9yaWVudGF0aW9uLmdhbW1hICE9IG51bGwgJiYgb3JpZW50YXRpb24uZ2FtbWEgIT09IDApKSByZXR1cm4gXCJkZXZpY2VPcmllbnRhdGlvblwiO1xuXHRcdHJldHVybiBcIm1vdXNlXCI7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdHJvbGw6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGlmIChzb3VyY2UudmFsdWUgPT09IFwiZGV2aWNlT3JpZW50YXRpb25cIikge1xuXHRcdFx0XHRsZXQgdmFsdWU7XG5cdFx0XHRcdHN3aXRjaCAoc2NyZWVuT3JpZW50YXRpb24ub3JpZW50YXRpb24pIHtcblx0XHRcdFx0XHRjYXNlIFwibGFuZHNjYXBlLXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uZ2FtbWEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJsYW5kc2NhcGUtc2Vjb25kYXJ5XCI6XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IC1vcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcInBvcnRyYWl0LXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmJldGEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJwb3J0cmFpdC1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogdmFsdWUgPSAtb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBkZXZpY2VPcmllbnRhdGlvblJvbGxBZGp1c3QodmFsdWUpO1xuXHRcdFx0fSBlbHNlIHJldHVybiBtb3VzZVJvbGxBZGp1c3QoLSh5LnZhbHVlIC0gaGVpZ2h0LnZhbHVlIC8gMikgLyBoZWlnaHQudmFsdWUpO1xuXHRcdH0pLFxuXHRcdHRpbHQ6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGlmIChzb3VyY2UudmFsdWUgPT09IFwiZGV2aWNlT3JpZW50YXRpb25cIikge1xuXHRcdFx0XHRsZXQgdmFsdWU7XG5cdFx0XHRcdHN3aXRjaCAoc2NyZWVuT3JpZW50YXRpb24ub3JpZW50YXRpb24pIHtcblx0XHRcdFx0XHRjYXNlIFwibGFuZHNjYXBlLXByaW1hcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gb3JpZW50YXRpb24uYmV0YSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcImxhbmRzY2FwZS1zZWNvbmRhcnlcIjpcblx0XHRcdFx0XHRcdHZhbHVlID0gLW9yaWVudGF0aW9uLmJldGEgLyA5MDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJwb3J0cmFpdC1wcmltYXJ5XCI6XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IG9yaWVudGF0aW9uLmdhbW1hIC8gOTA7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlIFwicG9ydHJhaXQtc2Vjb25kYXJ5XCI6XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IC1vcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDogdmFsdWUgPSBvcmllbnRhdGlvbi5nYW1tYSAvIDkwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBkZXZpY2VPcmllbnRhdGlvblRpbHRBZGp1c3QodmFsdWUpO1xuXHRcdFx0fSBlbHNlIHJldHVybiBtb3VzZVRpbHRBZGp1c3QoKHgudmFsdWUgLSB3aWR0aC52YWx1ZSAvIDIpIC8gd2lkdGgudmFsdWUpO1xuXHRcdH0pLFxuXHRcdHNvdXJjZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQYXJlbnRFbGVtZW50L2luZGV4LnRzXG5mdW5jdGlvbiB1c2VQYXJlbnRFbGVtZW50KGVsZW1lbnQgPSB1c2VDdXJyZW50RWxlbWVudCgpKSB7XG5cdGNvbnN0IHBhcmVudEVsZW1lbnQgPSBzaGFsbG93UmVmKCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHRjb25zdCBlbCA9IHVucmVmRWxlbWVudChlbGVtZW50KTtcblx0XHRpZiAoZWwpIHBhcmVudEVsZW1lbnQudmFsdWUgPSBlbC5wYXJlbnRFbGVtZW50O1xuXHR9O1xuXHR0cnlPbk1vdW50ZWQodXBkYXRlKTtcblx0d2F0Y2goKCkgPT4gdG9WYWx1ZShlbGVtZW50KSwgdXBkYXRlKTtcblx0cmV0dXJuIHBhcmVudEVsZW1lbnQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBlcmZvcm1hbmNlT2JzZXJ2ZXIvaW5kZXgudHNcbi8qKlxuKiBPYnNlcnZlIHBlcmZvcm1hbmNlIG1ldHJpY3MuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBlcmZvcm1hbmNlT2JzZXJ2ZXJcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VQZXJmb3JtYW5jZU9ic2VydmVyKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGltbWVkaWF0ZSA9IHRydWUsLi4ucGVyZm9ybWFuY2VPcHRpb25zIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gd2luZG93JDEgJiYgXCJQZXJmb3JtYW5jZU9ic2VydmVyXCIgaW4gd2luZG93JDEpO1xuXHRsZXQgb2JzZXJ2ZXI7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0b2JzZXJ2ZXIgPT09IG51bGwgfHwgb2JzZXJ2ZXIgPT09IHZvaWQgMCB8fCBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdH07XG5cdGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuXHRcdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdFx0c3RvcCgpO1xuXHRcdFx0b2JzZXJ2ZXIgPSBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihjYWxsYmFjayk7XG5cdFx0XHRvYnNlcnZlci5vYnNlcnZlKHBlcmZvcm1hbmNlT3B0aW9ucyk7XG5cdFx0fVxuXHR9O1xuXHR0cnlPblNjb3BlRGlzcG9zZShzdG9wKTtcblx0aWYgKGltbWVkaWF0ZSkgc3RhcnQoKTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRzdGFydCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVBvaW50ZXIvaW5kZXgudHNcbmNvbnN0IGRlZmF1bHRTdGF0ZSA9IHtcblx0eDogMCxcblx0eTogMCxcblx0cG9pbnRlcklkOiAwLFxuXHRwcmVzc3VyZTogMCxcblx0dGlsdFg6IDAsXG5cdHRpbHRZOiAwLFxuXHR3aWR0aDogMCxcblx0aGVpZ2h0OiAwLFxuXHR0d2lzdDogMCxcblx0cG9pbnRlclR5cGU6IG51bGxcbn07XG5jb25zdCBrZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5rZXlzKGRlZmF1bHRTdGF0ZSk7XG4vKipcbiogUmVhY3RpdmUgcG9pbnRlciBzdGF0ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUG9pbnRlclxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVBvaW50ZXIob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgdGFyZ2V0ID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgaXNJbnNpZGUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3RhdGUgPSBzaGFsbG93UmVmKG9wdGlvbnMuaW5pdGlhbFZhbHVlIHx8IHt9KTtcblx0T2JqZWN0LmFzc2lnbihzdGF0ZS52YWx1ZSwgZGVmYXVsdFN0YXRlLCBzdGF0ZS52YWx1ZSk7XG5cdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRpc0luc2lkZS52YWx1ZSA9IHRydWU7XG5cdFx0aWYgKG9wdGlvbnMucG9pbnRlclR5cGVzICYmICFvcHRpb25zLnBvaW50ZXJUeXBlcy5pbmNsdWRlcyhldmVudC5wb2ludGVyVHlwZSkpIHJldHVybjtcblx0XHRzdGF0ZS52YWx1ZSA9IG9iamVjdFBpY2soZXZlbnQsIGtleXMsIGZhbHNlKTtcblx0fTtcblx0aWYgKHRhcmdldCkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIodGFyZ2V0LCBbXG5cdFx0XHRcInBvaW50ZXJkb3duXCIsXG5cdFx0XHRcInBvaW50ZXJtb3ZlXCIsXG5cdFx0XHRcInBvaW50ZXJ1cFwiXG5cdFx0XSwgaGFuZGxlciwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVybGVhdmVcIiwgKCkgPT4gaXNJbnNpZGUudmFsdWUgPSBmYWxzZSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdC4uLnRvUmVmcyhzdGF0ZSksXG5cdFx0aXNJbnNpZGVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlUG9pbnRlckxvY2svaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwb2ludGVyIGxvY2suXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVBvaW50ZXJMb2NrXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQb2ludGVyTG9jayh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRvY3VtZW50OiBkb2N1bWVudCQxID0gZGVmYXVsdERvY3VtZW50IH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gZG9jdW1lbnQkMSAmJiBcInBvaW50ZXJMb2NrRWxlbWVudFwiIGluIGRvY3VtZW50JDEpO1xuXHRjb25zdCBlbGVtZW50ID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHNoYWxsb3dSZWYoKTtcblx0bGV0IHRhcmdldEVsZW1lbnQ7XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJwb2ludGVybG9ja2NoYW5nZVwiLCAoKSA9PiB7XG5cdFx0XHR2YXIgX3BvaW50ZXJMb2NrRWxlbWVudDtcblx0XHRcdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gKF9wb2ludGVyTG9ja0VsZW1lbnQgPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudCkgIT09IG51bGwgJiYgX3BvaW50ZXJMb2NrRWxlbWVudCAhPT0gdm9pZCAwID8gX3BvaW50ZXJMb2NrRWxlbWVudCA6IGVsZW1lbnQudmFsdWU7XG5cdFx0XHRpZiAodGFyZ2V0RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCA9PT0gdGFyZ2V0RWxlbWVudCkge1xuXHRcdFx0XHRlbGVtZW50LnZhbHVlID0gZG9jdW1lbnQkMS5wb2ludGVyTG9ja0VsZW1lbnQ7XG5cdFx0XHRcdGlmICghZWxlbWVudC52YWx1ZSkgdGFyZ2V0RWxlbWVudCA9IHRyaWdnZXJFbGVtZW50LnZhbHVlID0gbnVsbDtcblx0XHRcdH1cblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJwb2ludGVybG9ja2Vycm9yXCIsICgpID0+IHtcblx0XHRcdHZhciBfcG9pbnRlckxvY2tFbGVtZW50Mjtcblx0XHRcdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gKF9wb2ludGVyTG9ja0VsZW1lbnQyID0gZG9jdW1lbnQkMS5wb2ludGVyTG9ja0VsZW1lbnQpICE9PSBudWxsICYmIF9wb2ludGVyTG9ja0VsZW1lbnQyICE9PSB2b2lkIDAgPyBfcG9pbnRlckxvY2tFbGVtZW50MiA6IGVsZW1lbnQudmFsdWU7XG5cdFx0XHRpZiAodGFyZ2V0RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCA9PT0gdGFyZ2V0RWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBkb2N1bWVudCQxLnBvaW50ZXJMb2NrRWxlbWVudCA/IFwicmVsZWFzZVwiIDogXCJhY3F1aXJlXCI7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvICR7YWN0aW9ufSBwb2ludGVyIGxvY2suYCk7XG5cdFx0XHR9XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBsb2NrKGUpIHtcblx0XHR2YXIgX3VucmVmRWxlbWVudDtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoXCJQb2ludGVyIExvY2sgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgeW91ciBicm93c2VyLlwiKTtcblx0XHR0cmlnZ2VyRWxlbWVudC52YWx1ZSA9IGUgaW5zdGFuY2VvZiBFdmVudCA/IGUuY3VycmVudFRhcmdldCA6IG51bGw7XG5cdFx0dGFyZ2V0RWxlbWVudCA9IGUgaW5zdGFuY2VvZiBFdmVudCA/IChfdW5yZWZFbGVtZW50ID0gdW5yZWZFbGVtZW50KHRhcmdldCkpICE9PSBudWxsICYmIF91bnJlZkVsZW1lbnQgIT09IHZvaWQgMCA/IF91bnJlZkVsZW1lbnQgOiB0cmlnZ2VyRWxlbWVudC52YWx1ZSA6IHVucmVmRWxlbWVudChlKTtcblx0XHRpZiAoIXRhcmdldEVsZW1lbnQpIHRocm93IG5ldyBFcnJvcihcIlRhcmdldCBlbGVtZW50IHVuZGVmaW5lZC5cIik7XG5cdFx0dGFyZ2V0RWxlbWVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcblx0XHRyZXR1cm4gYXdhaXQgdW50aWwoZWxlbWVudCkudG9CZSh0YXJnZXRFbGVtZW50KTtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiB1bmxvY2soKSB7XG5cdFx0aWYgKCFlbGVtZW50LnZhbHVlKSByZXR1cm4gZmFsc2U7XG5cdFx0ZG9jdW1lbnQkMS5leGl0UG9pbnRlckxvY2soKTtcblx0XHRhd2FpdCB1bnRpbChlbGVtZW50KS50b0JlTnVsbCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0ZWxlbWVudCxcblx0XHR0cmlnZ2VyRWxlbWVudCxcblx0XHRsb2NrLFxuXHRcdHVubG9ja1xuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQb2ludGVyU3dpcGUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBzd2lwZSBkZXRlY3Rpb24gYmFzZWQgb24gUG9pbnRlckV2ZW50cy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlUG9pbnRlclN3aXBlXG4qIEBwYXJhbSB0YXJnZXRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VQb2ludGVyU3dpcGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgdGFyZ2V0UmVmID0gdG9SZWYodGFyZ2V0KTtcblx0Y29uc3QgeyB0aHJlc2hvbGQgPSA1MCwgb25Td2lwZSwgb25Td2lwZUVuZCwgb25Td2lwZVN0YXJ0LCBkaXNhYmxlVGV4dFNlbGVjdCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBwb3NTdGFydCA9IHJlYWN0aXZlKHtcblx0XHR4OiAwLFxuXHRcdHk6IDBcblx0fSk7XG5cdGNvbnN0IHVwZGF0ZVBvc1N0YXJ0ID0gKHgsIHkpID0+IHtcblx0XHRwb3NTdGFydC54ID0geDtcblx0XHRwb3NTdGFydC55ID0geTtcblx0fTtcblx0Y29uc3QgcG9zRW5kID0gcmVhY3RpdmUoe1xuXHRcdHg6IDAsXG5cdFx0eTogMFxuXHR9KTtcblx0Y29uc3QgdXBkYXRlUG9zRW5kID0gKHgsIHkpID0+IHtcblx0XHRwb3NFbmQueCA9IHg7XG5cdFx0cG9zRW5kLnkgPSB5O1xuXHR9O1xuXHRjb25zdCBkaXN0YW5jZVggPSBjb21wdXRlZCgoKSA9PiBwb3NTdGFydC54IC0gcG9zRW5kLngpO1xuXHRjb25zdCBkaXN0YW5jZVkgPSBjb21wdXRlZCgoKSA9PiBwb3NTdGFydC55IC0gcG9zRW5kLnkpO1xuXHRjb25zdCB7IG1heCwgYWJzIH0gPSBNYXRoO1xuXHRjb25zdCBpc1RocmVzaG9sZEV4Y2VlZGVkID0gY29tcHV0ZWQoKCkgPT4gbWF4KGFicyhkaXN0YW5jZVgudmFsdWUpLCBhYnMoZGlzdGFuY2VZLnZhbHVlKSkgPj0gdGhyZXNob2xkKTtcblx0Y29uc3QgaXNTd2lwaW5nID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IGlzUG9pbnRlckRvd24gPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZGlyZWN0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICghaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgcmV0dXJuIFwibm9uZVwiO1xuXHRcdGlmIChhYnMoZGlzdGFuY2VYLnZhbHVlKSA+IGFicyhkaXN0YW5jZVkudmFsdWUpKSByZXR1cm4gZGlzdGFuY2VYLnZhbHVlID4gMCA/IFwibGVmdFwiIDogXCJyaWdodFwiO1xuXHRcdGVsc2UgcmV0dXJuIGRpc3RhbmNlWS52YWx1ZSA+IDAgPyBcInVwXCIgOiBcImRvd25cIjtcblx0fSk7XG5cdGNvbnN0IGV2ZW50SXNBbGxvd2VkID0gKGUpID0+IHtcblx0XHR2YXIgX3JlZiwgX29wdGlvbnMkcG9pbnRlclR5cGVzLCBfb3B0aW9ucyRwb2ludGVyVHlwZXMyO1xuXHRcdGNvbnN0IGlzUmVsZWFzaW5nQnV0dG9uID0gZS5idXR0b25zID09PSAwO1xuXHRcdGNvbnN0IGlzUHJpbWFyeUJ1dHRvbiA9IGUuYnV0dG9ucyA9PT0gMTtcblx0XHRyZXR1cm4gKF9yZWYgPSAoX29wdGlvbnMkcG9pbnRlclR5cGVzID0gKF9vcHRpb25zJHBvaW50ZXJUeXBlczIgPSBvcHRpb25zLnBvaW50ZXJUeXBlcykgPT09IG51bGwgfHwgX29wdGlvbnMkcG9pbnRlclR5cGVzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkcG9pbnRlclR5cGVzMi5pbmNsdWRlcyhlLnBvaW50ZXJUeXBlKSkgIT09IG51bGwgJiYgX29wdGlvbnMkcG9pbnRlclR5cGVzICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRwb2ludGVyVHlwZXMgOiBpc1JlbGVhc2luZ0J1dHRvbiB8fCBpc1ByaW1hcnlCdXR0b24pICE9PSBudWxsICYmIF9yZWYgIT09IHZvaWQgMCA/IF9yZWYgOiB0cnVlO1xuXHR9O1xuXHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0Y29uc3Qgc3RvcHMgPSBbXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicG9pbnRlcmRvd25cIiwgKGUpID0+IHtcblx0XHRcdGlmICghZXZlbnRJc0FsbG93ZWQoZSkpIHJldHVybjtcblx0XHRcdGlzUG9pbnRlckRvd24udmFsdWUgPSB0cnVlO1xuXHRcdFx0Y29uc3QgZXZlbnRUYXJnZXQgPSBlLnRhcmdldDtcblx0XHRcdGV2ZW50VGFyZ2V0ID09PSBudWxsIHx8IGV2ZW50VGFyZ2V0ID09PSB2b2lkIDAgfHwgZXZlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuXHRcdFx0Y29uc3QgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0gPSBlO1xuXHRcdFx0dXBkYXRlUG9zU3RhcnQoeCwgeSk7XG5cdFx0XHR1cGRhdGVQb3NFbmQoeCwgeSk7XG5cdFx0XHRvblN3aXBlU3RhcnQgPT09IG51bGwgfHwgb25Td2lwZVN0YXJ0ID09PSB2b2lkIDAgfHwgb25Td2lwZVN0YXJ0KGUpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyksXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwicG9pbnRlcm1vdmVcIiwgKGUpID0+IHtcblx0XHRcdGlmICghZXZlbnRJc0FsbG93ZWQoZSkpIHJldHVybjtcblx0XHRcdGlmICghaXNQb2ludGVyRG93bi52YWx1ZSkgcmV0dXJuO1xuXHRcdFx0Y29uc3QgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0gPSBlO1xuXHRcdFx0dXBkYXRlUG9zRW5kKHgsIHkpO1xuXHRcdFx0aWYgKCFpc1N3aXBpbmcudmFsdWUgJiYgaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgaXNTd2lwaW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGUgPT09IG51bGwgfHwgb25Td2lwZSA9PT0gdm9pZCAwIHx8IG9uU3dpcGUoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJwb2ludGVydXBcIiwgKGUpID0+IHtcblx0XHRcdGlmICghZXZlbnRJc0FsbG93ZWQoZSkpIHJldHVybjtcblx0XHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGVFbmQgPT09IG51bGwgfHwgb25Td2lwZUVuZCA9PT0gdm9pZCAwIHx8IG9uU3dpcGVFbmQoZSwgZGlyZWN0aW9uLnZhbHVlKTtcblx0XHRcdGlzUG9pbnRlckRvd24udmFsdWUgPSBmYWxzZTtcblx0XHRcdGlzU3dpcGluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucylcblx0XTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IHtcblx0XHR2YXIgX3RhcmdldFJlZiR2YWx1ZTtcblx0XHQoX3RhcmdldFJlZiR2YWx1ZSA9IHRhcmdldFJlZi52YWx1ZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZSA9PT0gdm9pZCAwIHx8IChfdGFyZ2V0UmVmJHZhbHVlID0gX3RhcmdldFJlZiR2YWx1ZS5zdHlsZSkgPT09IG51bGwgfHwgX3RhcmdldFJlZiR2YWx1ZSA9PT0gdm9pZCAwIHx8IF90YXJnZXRSZWYkdmFsdWUuc2V0UHJvcGVydHkoXCJ0b3VjaC1hY3Rpb25cIiwgXCJwYW4teVwiKTtcblx0XHRpZiAoZGlzYWJsZVRleHRTZWxlY3QpIHtcblx0XHRcdHZhciBfdGFyZ2V0UmVmJHZhbHVlMiwgX3RhcmdldFJlZiR2YWx1ZTMsIF90YXJnZXRSZWYkdmFsdWU0O1xuXHRcdFx0KF90YXJnZXRSZWYkdmFsdWUyID0gdGFyZ2V0UmVmLnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlMiA9PT0gdm9pZCAwIHx8IChfdGFyZ2V0UmVmJHZhbHVlMiA9IF90YXJnZXRSZWYkdmFsdWUyLnN0eWxlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlMiA9PT0gdm9pZCAwIHx8IF90YXJnZXRSZWYkdmFsdWUyLnNldFByb3BlcnR5KFwiLXdlYmtpdC11c2VyLXNlbGVjdFwiLCBcIm5vbmVcIik7XG5cdFx0XHQoX3RhcmdldFJlZiR2YWx1ZTMgPSB0YXJnZXRSZWYudmFsdWUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUzID09PSB2b2lkIDAgfHwgKF90YXJnZXRSZWYkdmFsdWUzID0gX3RhcmdldFJlZiR2YWx1ZTMuc3R5bGUpID09PSBudWxsIHx8IF90YXJnZXRSZWYkdmFsdWUzID09PSB2b2lkIDAgfHwgX3RhcmdldFJlZiR2YWx1ZTMuc2V0UHJvcGVydHkoXCItbXMtdXNlci1zZWxlY3RcIiwgXCJub25lXCIpO1xuXHRcdFx0KF90YXJnZXRSZWYkdmFsdWU0ID0gdGFyZ2V0UmVmLnZhbHVlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlNCA9PT0gdm9pZCAwIHx8IChfdGFyZ2V0UmVmJHZhbHVlNCA9IF90YXJnZXRSZWYkdmFsdWU0LnN0eWxlKSA9PT0gbnVsbCB8fCBfdGFyZ2V0UmVmJHZhbHVlNCA9PT0gdm9pZCAwIHx8IF90YXJnZXRSZWYkdmFsdWU0LnNldFByb3BlcnR5KFwidXNlci1zZWxlY3RcIiwgXCJub25lXCIpO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiBzdG9wcy5mb3JFYWNoKChzKSA9PiBzKCkpO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3dpcGluZzogcmVhZG9ubHkoaXNTd2lwaW5nKSxcblx0XHRkaXJlY3Rpb246IHJlYWRvbmx5KGRpcmVjdGlvbiksXG5cdFx0cG9zU3RhcnQ6IHJlYWRvbmx5KHBvc1N0YXJ0KSxcblx0XHRwb3NFbmQ6IHJlYWRvbmx5KHBvc0VuZCksXG5cdFx0ZGlzdGFuY2VYLFxuXHRcdGRpc3RhbmNlWSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZENvbG9yU2NoZW1lL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgcHJlZmVycy1jb2xvci1zY2hlbWUgbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZENvbG9yU2NoZW1lXG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRDb2xvclNjaGVtZShvcHRpb25zKSB7XG5cdGNvbnN0IGlzTGlnaHQgPSB1c2VNZWRpYVF1ZXJ5KFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodClcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGlzRGFyayA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc0RhcmsudmFsdWUpIHJldHVybiBcImRhcmtcIjtcblx0XHRpZiAoaXNMaWdodC52YWx1ZSkgcmV0dXJuIFwibGlnaHRcIjtcblx0XHRyZXR1cm4gXCJuby1wcmVmZXJlbmNlXCI7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQcmVmZXJyZWRDb250cmFzdC9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHByZWZlcnMtY29udHJhc3QgbWVkaWEgcXVlcnkuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVByZWZlcnJlZENvbnRyYXN0XG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRDb250cmFzdChvcHRpb25zKSB7XG5cdGNvbnN0IGlzTW9yZSA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb250cmFzdDogbW9yZSlcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGlzTGVzcyA9IHVzZU1lZGlhUXVlcnkoXCIocHJlZmVycy1jb250cmFzdDogbGVzcylcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGlzQ3VzdG9tID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLWNvbnRyYXN0OiBjdXN0b20pXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc01vcmUudmFsdWUpIHJldHVybiBcIm1vcmVcIjtcblx0XHRpZiAoaXNMZXNzLnZhbHVlKSByZXR1cm4gXCJsZXNzXCI7XG5cdFx0aWYgKGlzQ3VzdG9tLnZhbHVlKSByZXR1cm4gXCJjdXN0b21cIjtcblx0XHRyZXR1cm4gXCJuby1wcmVmZXJlbmNlXCI7XG5cdH0pO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VQcmVmZXJyZWRMYW5ndWFnZXMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBOYXZpZ2F0b3IgTGFuZ3VhZ2VzLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQcmVmZXJyZWRMYW5ndWFnZXNcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRMYW5ndWFnZXMob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGlmICghd2luZG93JDEpIHJldHVybiBzaGFsbG93UmVmKFtcImVuXCJdKTtcblx0Y29uc3QgbmF2aWdhdG9yJDEgPSB3aW5kb3ckMS5uYXZpZ2F0b3I7XG5cdGNvbnN0IHZhbHVlID0gc2hhbGxvd1JlZihuYXZpZ2F0b3IkMS5sYW5ndWFnZXMpO1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImxhbmd1YWdlY2hhbmdlXCIsICgpID0+IHtcblx0XHR2YWx1ZS52YWx1ZSA9IG5hdmlnYXRvciQxLmxhbmd1YWdlcztcblx0fSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZFJlZHVjZWRNb3Rpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwcmVmZXJzLXJlZHVjZWQtbW90aW9uIG1lZGlhIHF1ZXJ5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uXG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRSZWR1Y2VkTW90aW9uKG9wdGlvbnMpIHtcblx0Y29uc3QgaXNSZWR1Y2VkID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc1JlZHVjZWQudmFsdWUpIHJldHVybiBcInJlZHVjZVwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZWZlcnJlZFJlZHVjZWRUcmFuc3BhcmVuY3kvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBwcmVmZXJzLXJlZHVjZWQtdHJhbnNwYXJlbmN5IG1lZGlhIHF1ZXJ5LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VQcmVmZXJyZWRSZWR1Y2VkVHJhbnNwYXJlbmN5XG4qIEBwYXJhbSBbb3B0aW9uc11cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VQcmVmZXJyZWRSZWR1Y2VkVHJhbnNwYXJlbmN5KG9wdGlvbnMpIHtcblx0Y29uc3QgaXNSZWR1Y2VkID0gdXNlTWVkaWFRdWVyeShcIihwcmVmZXJzLXJlZHVjZWQtdHJhbnNwYXJlbmN5OiByZWR1Y2UpXCIsIG9wdGlvbnMpO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmIChpc1JlZHVjZWQudmFsdWUpIHJldHVybiBcInJlZHVjZVwiO1xuXHRcdHJldHVybiBcIm5vLXByZWZlcmVuY2VcIjtcblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVByZXZpb3VzL2luZGV4LnRzXG5mdW5jdGlvbiB1c2VQcmV2aW91cyh2YWx1ZSwgaW5pdGlhbFZhbHVlKSB7XG5cdGNvbnN0IHByZXZpb3VzID0gc2hhbGxvd1JlZihpbml0aWFsVmFsdWUpO1xuXHR3YXRjaCh0b1JlZih2YWx1ZSksIChfLCBvbGRWYWx1ZSkgPT4ge1xuXHRcdHByZXZpb3VzLnZhbHVlID0gb2xkVmFsdWU7XG5cdH0sIHsgZmx1c2g6IFwic3luY1wiIH0pO1xuXHRyZXR1cm4gcmVhZG9ubHkocHJldmlvdXMpO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JlZW5TYWZlQXJlYS9pbmRleC50c1xuY29uc3QgdG9wVmFyTmFtZSA9IFwiLS12dWV1c2Utc2FmZS1hcmVhLXRvcFwiO1xuY29uc3QgcmlnaHRWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtcmlnaHRcIjtcbmNvbnN0IGJvdHRvbVZhck5hbWUgPSBcIi0tdnVldXNlLXNhZmUtYXJlYS1ib3R0b21cIjtcbmNvbnN0IGxlZnRWYXJOYW1lID0gXCItLXZ1ZXVzZS1zYWZlLWFyZWEtbGVmdFwiO1xuLyoqXG4qIFJlYWN0aXZlIGBlbnYoc2FmZS1hcmVhLWluc2V0LSopYFxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTY3JlZW5TYWZlQXJlYVxuKi9cbmZ1bmN0aW9uIHVzZVNjcmVlblNhZmVBcmVhKCkge1xuXHRjb25zdCB0b3AgPSBzaGFsbG93UmVmKFwiXCIpO1xuXHRjb25zdCByaWdodCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IGJvdHRvbSA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IGxlZnQgPSBzaGFsbG93UmVmKFwiXCIpO1xuXHRpZiAoaXNDbGllbnQpIHtcblx0XHRjb25zdCB0b3BDc3NWYXIgPSB1c2VDc3NWYXIodG9wVmFyTmFtZSk7XG5cdFx0Y29uc3QgcmlnaHRDc3NWYXIgPSB1c2VDc3NWYXIocmlnaHRWYXJOYW1lKTtcblx0XHRjb25zdCBib3R0b21Dc3NWYXIgPSB1c2VDc3NWYXIoYm90dG9tVmFyTmFtZSk7XG5cdFx0Y29uc3QgbGVmdENzc1ZhciA9IHVzZUNzc1ZhcihsZWZ0VmFyTmFtZSk7XG5cdFx0dG9wQ3NzVmFyLnZhbHVlID0gXCJlbnYoc2FmZS1hcmVhLWluc2V0LXRvcCwgMHB4KVwiO1xuXHRcdHJpZ2h0Q3NzVmFyLnZhbHVlID0gXCJlbnYoc2FmZS1hcmVhLWluc2V0LXJpZ2h0LCAwcHgpXCI7XG5cdFx0Ym90dG9tQ3NzVmFyLnZhbHVlID0gXCJlbnYoc2FmZS1hcmVhLWluc2V0LWJvdHRvbSwgMHB4KVwiO1xuXHRcdGxlZnRDc3NWYXIudmFsdWUgPSBcImVudihzYWZlLWFyZWEtaW5zZXQtbGVmdCwgMHB4KVwiO1xuXHRcdHRyeU9uTW91bnRlZCh1cGRhdGUpO1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXNlRGVib3VuY2VGbih1cGRhdGUpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdHRvcC52YWx1ZSA9IGdldFZhbHVlKHRvcFZhck5hbWUpO1xuXHRcdHJpZ2h0LnZhbHVlID0gZ2V0VmFsdWUocmlnaHRWYXJOYW1lKTtcblx0XHRib3R0b20udmFsdWUgPSBnZXRWYWx1ZShib3R0b21WYXJOYW1lKTtcblx0XHRsZWZ0LnZhbHVlID0gZ2V0VmFsdWUobGVmdFZhck5hbWUpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0dG9wLFxuXHRcdHJpZ2h0LFxuXHRcdGJvdHRvbSxcblx0XHRsZWZ0LFxuXHRcdHVwZGF0ZVxuXHR9O1xufVxuZnVuY3Rpb24gZ2V0VmFsdWUocG9zaXRpb24pIHtcblx0cmV0dXJuIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHBvc2l0aW9uKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2NyaXB0VGFnL2luZGV4LnRzXG4vKipcbiogQXN5bmMgc2NyaXB0IHRhZyBsb2FkaW5nLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTY3JpcHRUYWdcbiogQHBhcmFtIHNyY1xuKiBAcGFyYW0gb25Mb2FkZWRcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTY3JpcHRUYWcoc3JjLCBvbkxvYWRlZCA9IG5vb3AsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGltbWVkaWF0ZSA9IHRydWUsIG1hbnVhbCA9IGZhbHNlLCB0eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIiwgYXN5bmMgPSB0cnVlLCBjcm9zc09yaWdpbiwgcmVmZXJyZXJQb2xpY3ksIG5vTW9kdWxlLCBkZWZlciwgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIGF0dHJzID0ge30sIG5vbmNlID0gdm9pZCAwIH0gPSBvcHRpb25zO1xuXHRjb25zdCBzY3JpcHRUYWcgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRsZXQgX3Byb21pc2UgPSBudWxsO1xuXHQvKipcblx0KiBMb2FkIHRoZSBzY3JpcHQgc3BlY2lmaWVkIHZpYSBgc3JjYC5cblx0KlxuXHQqIEBwYXJhbSB3YWl0Rm9yU2NyaXB0TG9hZCBXaGV0aGVyIGlmIHRoZSBQcm9taXNlIHNob3VsZCByZXNvbHZlIG9uY2UgdGhlIFwibG9hZFwiIGV2ZW50IGlzIGVtaXR0ZWQgYnkgdGhlIDxzY3JpcHQ+IGF0dHJpYnV0ZSwgb3IgcmlnaHQgYWZ0ZXIgYXBwZW5kaW5nIGl0IHRvIHRoZSBET00uXG5cdCogQHJldHVybnMgUHJvbWlzZTxIVE1MU2NyaXB0RWxlbWVudD5cblx0Ki9cblx0Y29uc3QgbG9hZFNjcmlwdCA9ICh3YWl0Rm9yU2NyaXB0TG9hZCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHJlc29sdmVXaXRoRWxlbWVudCA9IChlbCQxKSA9PiB7XG5cdFx0XHRzY3JpcHRUYWcudmFsdWUgPSBlbCQxO1xuXHRcdFx0cmVzb2x2ZShlbCQxKTtcblx0XHRcdHJldHVybiBlbCQxO1xuXHRcdH07XG5cdFx0aWYgKCFkb2N1bWVudCQxKSB7XG5cdFx0XHRyZXNvbHZlKGZhbHNlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHNob3VsZEFwcGVuZCA9IGZhbHNlO1xuXHRcdGxldCBlbCA9IGRvY3VtZW50JDEucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7dG9WYWx1ZShzcmMpfVwiXWApO1xuXHRcdGlmICghZWwpIHtcblx0XHRcdGVsID0gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuXHRcdFx0ZWwudHlwZSA9IHR5cGU7XG5cdFx0XHRlbC5hc3luYyA9IGFzeW5jO1xuXHRcdFx0ZWwuc3JjID0gdG9WYWx1ZShzcmMpO1xuXHRcdFx0aWYgKGRlZmVyKSBlbC5kZWZlciA9IGRlZmVyO1xuXHRcdFx0aWYgKGNyb3NzT3JpZ2luKSBlbC5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuXHRcdFx0aWYgKG5vTW9kdWxlKSBlbC5ub01vZHVsZSA9IG5vTW9kdWxlO1xuXHRcdFx0aWYgKHJlZmVycmVyUG9saWN5KSBlbC5yZWZlcnJlclBvbGljeSA9IHJlZmVycmVyUG9saWN5O1xuXHRcdFx0aWYgKG5vbmNlKSBlbC5ub25jZSA9IG5vbmNlO1xuXHRcdFx0T2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtuYW1lLCB2YWx1ZV0pID0+IGVsID09PSBudWxsIHx8IGVsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTtcblx0XHRcdHNob3VsZEFwcGVuZCA9IHRydWU7XG5cdFx0fSBlbHNlIGlmIChlbC5oYXNBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiKSkgcmVzb2x2ZVdpdGhFbGVtZW50KGVsKTtcblx0XHRjb25zdCBsaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsLCBcImVycm9yXCIsIChldmVudCkgPT4gcmVqZWN0KGV2ZW50KSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsLCBcImFib3J0XCIsIChldmVudCkgPT4gcmVqZWN0KGV2ZW50KSwgbGlzdGVuZXJPcHRpb25zKTtcblx0XHR1c2VFdmVudExpc3RlbmVyKGVsLCBcImxvYWRcIiwgKCkgPT4ge1xuXHRcdFx0ZWwuc2V0QXR0cmlidXRlKFwiZGF0YS1sb2FkZWRcIiwgXCJ0cnVlXCIpO1xuXHRcdFx0b25Mb2FkZWQoZWwpO1xuXHRcdFx0cmVzb2x2ZVdpdGhFbGVtZW50KGVsKTtcblx0XHR9LCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRcdGlmIChzaG91bGRBcHBlbmQpIGVsID0gZG9jdW1lbnQkMS5oZWFkLmFwcGVuZENoaWxkKGVsKTtcblx0XHRpZiAoIXdhaXRGb3JTY3JpcHRMb2FkKSByZXNvbHZlV2l0aEVsZW1lbnQoZWwpO1xuXHR9KTtcblx0LyoqXG5cdCogRXhwb3NlZCBzaW5nbGV0b24gd3JhcHBlciBmb3IgYGxvYWRTY3JpcHRgLCBhdm9pZGluZyBjYWxsaW5nIGl0IHR3aWNlLlxuXHQqXG5cdCogQHBhcmFtIHdhaXRGb3JTY3JpcHRMb2FkIFdoZXRoZXIgaWYgdGhlIFByb21pc2Ugc2hvdWxkIHJlc29sdmUgb25jZSB0aGUgXCJsb2FkXCIgZXZlbnQgaXMgZW1pdHRlZCBieSB0aGUgPHNjcmlwdD4gYXR0cmlidXRlLCBvciByaWdodCBhZnRlciBhcHBlbmRpbmcgaXQgdG8gdGhlIERPTS5cblx0KiBAcmV0dXJucyBQcm9taXNlPEhUTUxTY3JpcHRFbGVtZW50PlxuXHQqL1xuXHRjb25zdCBsb2FkID0gKHdhaXRGb3JTY3JpcHRMb2FkID0gdHJ1ZSkgPT4ge1xuXHRcdGlmICghX3Byb21pc2UpIF9wcm9taXNlID0gbG9hZFNjcmlwdCh3YWl0Rm9yU2NyaXB0TG9hZCk7XG5cdFx0cmV0dXJuIF9wcm9taXNlO1xuXHR9O1xuXHQvKipcblx0KiBVbmxvYWQgdGhlIHNjcmlwdCBzcGVjaWZpZWQgYnkgYHNyY2AuXG5cdCovXG5cdGNvbnN0IHVubG9hZCA9ICgpID0+IHtcblx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRfcHJvbWlzZSA9IG51bGw7XG5cdFx0aWYgKHNjcmlwdFRhZy52YWx1ZSkgc2NyaXB0VGFnLnZhbHVlID0gbnVsbDtcblx0XHRjb25zdCBlbCA9IGRvY3VtZW50JDEucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7dG9WYWx1ZShzcmMpfVwiXWApO1xuXHRcdGlmIChlbCkgZG9jdW1lbnQkMS5oZWFkLnJlbW92ZUNoaWxkKGVsKTtcblx0fTtcblx0aWYgKGltbWVkaWF0ZSAmJiAhbWFudWFsKSB0cnlPbk1vdW50ZWQobG9hZCk7XG5cdGlmICghbWFudWFsKSB0cnlPblVubW91bnRlZCh1bmxvYWQpO1xuXHRyZXR1cm4ge1xuXHRcdHNjcmlwdFRhZyxcblx0XHRsb2FkLFxuXHRcdHVubG9hZFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTY3JvbGxMb2NrL2luZGV4LnRzXG5mdW5jdGlvbiBjaGVja092ZXJmbG93U2Nyb2xsKGVsZSkge1xuXHRjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZSk7XG5cdGlmIChzdHlsZS5vdmVyZmxvd1ggPT09IFwic2Nyb2xsXCIgfHwgc3R5bGUub3ZlcmZsb3dZID09PSBcInNjcm9sbFwiIHx8IHN0eWxlLm92ZXJmbG93WCA9PT0gXCJhdXRvXCIgJiYgZWxlLmNsaWVudFdpZHRoIDwgZWxlLnNjcm9sbFdpZHRoIHx8IHN0eWxlLm92ZXJmbG93WSA9PT0gXCJhdXRvXCIgJiYgZWxlLmNsaWVudEhlaWdodCA8IGVsZS5zY3JvbGxIZWlnaHQpIHJldHVybiB0cnVlO1xuXHRlbHNlIHtcblx0XHRjb25zdCBwYXJlbnQgPSBlbGUucGFyZW50Tm9kZTtcblx0XHRpZiAoIXBhcmVudCB8fCBwYXJlbnQudGFnTmFtZSA9PT0gXCJCT0RZXCIpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gY2hlY2tPdmVyZmxvd1Njcm9sbChwYXJlbnQpO1xuXHR9XG59XG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChyYXdFdmVudCkge1xuXHRjb25zdCBlID0gcmF3RXZlbnQgfHwgd2luZG93LmV2ZW50O1xuXHRjb25zdCBfdGFyZ2V0ID0gZS50YXJnZXQ7XG5cdGlmIChjaGVja092ZXJmbG93U2Nyb2xsKF90YXJnZXQpKSByZXR1cm4gZmFsc2U7XG5cdGlmIChlLnRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuIHRydWU7XG5cdGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdHJldHVybiBmYWxzZTtcbn1cbmNvbnN0IGVsSW5pdGlhbE92ZXJmbG93ID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4vKipcbiogTG9jayBzY3JvbGxpbmcgb2YgdGhlIGVsZW1lbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVNjcm9sbExvY2tcbiogQHBhcmFtIGVsZW1lbnRcbiovXG5mdW5jdGlvbiB1c2VTY3JvbGxMb2NrKGVsZW1lbnQsIGluaXRpYWxTdGF0ZSA9IGZhbHNlKSB7XG5cdGNvbnN0IGlzTG9ja2VkID0gc2hhbGxvd1JlZihpbml0aWFsU3RhdGUpO1xuXHRsZXQgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID0gbnVsbDtcblx0bGV0IGluaXRpYWxPdmVyZmxvdyA9IFwiXCI7XG5cdHdhdGNoKHRvUmVmKGVsZW1lbnQpLCAoZWwpID0+IHtcblx0XHRjb25zdCB0YXJnZXQgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsKSk7XG5cdFx0aWYgKHRhcmdldCkge1xuXHRcdFx0Y29uc3QgZWxlID0gdGFyZ2V0O1xuXHRcdFx0aWYgKCFlbEluaXRpYWxPdmVyZmxvdy5nZXQoZWxlKSkgZWxJbml0aWFsT3ZlcmZsb3cuc2V0KGVsZSwgZWxlLnN0eWxlLm92ZXJmbG93KTtcblx0XHRcdGlmIChlbGUuc3R5bGUub3ZlcmZsb3cgIT09IFwiaGlkZGVuXCIpIGluaXRpYWxPdmVyZmxvdyA9IGVsZS5zdHlsZS5vdmVyZmxvdztcblx0XHRcdGlmIChlbGUuc3R5bGUub3ZlcmZsb3cgPT09IFwiaGlkZGVuXCIpIHJldHVybiBpc0xvY2tlZC52YWx1ZSA9IHRydWU7XG5cdFx0XHRpZiAoaXNMb2NrZWQudmFsdWUpIHJldHVybiBlbGUuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdH1cblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdGNvbnN0IGxvY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcblx0XHRpZiAoIWVsIHx8IGlzTG9ja2VkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKGlzSU9TKSBzdG9wVG91Y2hNb3ZlTGlzdGVuZXIgPSB1c2VFdmVudExpc3RlbmVyKGVsLCBcInRvdWNobW92ZVwiLCAoZSkgPT4ge1xuXHRcdFx0cHJldmVudERlZmF1bHQoZSk7XG5cdFx0fSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblx0XHRlbC5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0aXNMb2NrZWQudmFsdWUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCB1bmxvY2sgPSAoKSA9PiB7XG5cdFx0Y29uc3QgZWwgPSByZXNvbHZlRWxlbWVudCh0b1ZhbHVlKGVsZW1lbnQpKTtcblx0XHRpZiAoIWVsIHx8ICFpc0xvY2tlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdGlmIChpc0lPUykgc3RvcFRvdWNoTW92ZUxpc3RlbmVyID09PSBudWxsIHx8IHN0b3BUb3VjaE1vdmVMaXN0ZW5lciA9PT0gdm9pZCAwIHx8IHN0b3BUb3VjaE1vdmVMaXN0ZW5lcigpO1xuXHRcdGVsLnN0eWxlLm92ZXJmbG93ID0gaW5pdGlhbE92ZXJmbG93O1xuXHRcdGVsSW5pdGlhbE92ZXJmbG93LmRlbGV0ZShlbCk7XG5cdFx0aXNMb2NrZWQudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0dHJ5T25TY29wZURpc3Bvc2UodW5sb2NrKTtcblx0cmV0dXJuIGNvbXB1dGVkKHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gaXNMb2NrZWQudmFsdWU7XG5cdFx0fSxcblx0XHRzZXQodikge1xuXHRcdFx0aWYgKHYpIGxvY2soKTtcblx0XHRcdGVsc2UgdW5sb2NrKCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2Vzc2lvblN0b3JhZ2UvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBTZXNzaW9uU3RvcmFnZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU2Vzc2lvblN0b3JhZ2VcbiogQHBhcmFtIGtleVxuKiBAcGFyYW0gaW5pdGlhbFZhbHVlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU2Vzc2lvblN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRyZXR1cm4gdXNlU3RvcmFnZShrZXksIGluaXRpYWxWYWx1ZSwgd2luZG93JDEgPT09IG51bGwgfHwgd2luZG93JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHdpbmRvdyQxLnNlc3Npb25TdG9yYWdlLCBvcHRpb25zKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU2hhcmUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBXZWIgU2hhcmUgQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTaGFyZVxuKiBAcGFyYW0gc2hhcmVPcHRpb25zXG4qIEBwYXJhbSBvcHRpb25zXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlU2hhcmUoc2hhcmVPcHRpb25zID0ge30sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBfbmF2aWdhdG9yID0gbmF2aWdhdG9yJDE7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiBfbmF2aWdhdG9yICYmIFwiY2FuU2hhcmVcIiBpbiBfbmF2aWdhdG9yKTtcblx0Y29uc3Qgc2hhcmUgPSBhc3luYyAob3ZlcnJpZGVPcHRpb25zID0ge30pID0+IHtcblx0XHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcblx0XHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRcdC4uLnRvVmFsdWUoc2hhcmVPcHRpb25zKSxcblx0XHRcdFx0Li4udG9WYWx1ZShvdmVycmlkZU9wdGlvbnMpXG5cdFx0XHR9O1xuXHRcdFx0bGV0IGdyYW50ZWQgPSBmYWxzZTtcblx0XHRcdGlmIChfbmF2aWdhdG9yLmNhblNoYXJlKSBncmFudGVkID0gX25hdmlnYXRvci5jYW5TaGFyZShkYXRhKTtcblx0XHRcdGlmIChncmFudGVkKSByZXR1cm4gX25hdmlnYXRvci5zaGFyZShkYXRhKTtcblx0XHR9XG5cdH07XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c2hhcmVcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU29ydGVkL2luZGV4LnRzXG5jb25zdCBkZWZhdWx0U29ydEZuID0gKHNvdXJjZSwgY29tcGFyZUZuKSA9PiBzb3VyY2Uuc29ydChjb21wYXJlRm4pO1xuY29uc3QgZGVmYXVsdENvbXBhcmUgPSAoYSwgYikgPT4gYSAtIGI7XG5mdW5jdGlvbiB1c2VTb3J0ZWQoLi4uYXJncykge1xuXHRjb25zdCBbc291cmNlXSA9IGFyZ3M7XG5cdGxldCBjb21wYXJlRm4gPSBkZWZhdWx0Q29tcGFyZTtcblx0bGV0IG9wdGlvbnMgPSB7fTtcblx0aWYgKGFyZ3MubGVuZ3RoID09PSAyKSBpZiAodHlwZW9mIGFyZ3NbMV0gPT09IFwib2JqZWN0XCIpIHtcblx0XHR2YXIgX29wdGlvbnMkY29tcGFyZUZuO1xuXHRcdG9wdGlvbnMgPSBhcmdzWzFdO1xuXHRcdGNvbXBhcmVGbiA9IChfb3B0aW9ucyRjb21wYXJlRm4gPSBvcHRpb25zLmNvbXBhcmVGbikgIT09IG51bGwgJiYgX29wdGlvbnMkY29tcGFyZUZuICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRjb21wYXJlRm4gOiBkZWZhdWx0Q29tcGFyZTtcblx0fSBlbHNlIHtcblx0XHR2YXIgX2FyZ3MkO1xuXHRcdGNvbXBhcmVGbiA9IChfYXJncyQgPSBhcmdzWzFdKSAhPT0gbnVsbCAmJiBfYXJncyQgIT09IHZvaWQgMCA/IF9hcmdzJCA6IGRlZmF1bHRDb21wYXJlO1xuXHR9XG5cdGVsc2UgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuXHRcdHZhciBfYXJncyQyLCBfYXJncyQzO1xuXHRcdGNvbXBhcmVGbiA9IChfYXJncyQyID0gYXJnc1sxXSkgIT09IG51bGwgJiYgX2FyZ3MkMiAhPT0gdm9pZCAwID8gX2FyZ3MkMiA6IGRlZmF1bHRDb21wYXJlO1xuXHRcdG9wdGlvbnMgPSAoX2FyZ3MkMyA9IGFyZ3NbMl0pICE9PSBudWxsICYmIF9hcmdzJDMgIT09IHZvaWQgMCA/IF9hcmdzJDMgOiB7fTtcblx0fVxuXHRjb25zdCB7IGRpcnR5ID0gZmFsc2UsIHNvcnRGbiA9IGRlZmF1bHRTb3J0Rm4gfSA9IG9wdGlvbnM7XG5cdGlmICghZGlydHkpIHJldHVybiBjb21wdXRlZCgoKSA9PiBzb3J0Rm4oWy4uLnRvVmFsdWUoc291cmNlKV0sIGNvbXBhcmVGbikpO1xuXHR3YXRjaEVmZmVjdCgoKSA9PiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gc29ydEZuKHRvVmFsdWUoc291cmNlKSwgY29tcGFyZUZuKTtcblx0XHRpZiAoaXNSZWYoc291cmNlKSkgc291cmNlLnZhbHVlID0gcmVzdWx0O1xuXHRcdGVsc2Ugc291cmNlLnNwbGljZSgwLCBzb3VyY2UubGVuZ3RoLCAuLi5yZXN1bHQpO1xuXHR9KTtcblx0cmV0dXJuIHNvdXJjZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3BlZWNoUmVjb2duaXRpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBTcGVlY2hSZWNvZ25pdGlvbi5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3BlZWNoUmVjb2duaXRpb25cbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU3BlZWNoUmVjb2duaXRpb24gU3BlZWNoUmVjb2duaXRpb25cbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VTcGVlY2hSZWNvZ25pdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBpbnRlcmltUmVzdWx0cyA9IHRydWUsIGNvbnRpbnVvdXMgPSB0cnVlLCBtYXhBbHRlcm5hdGl2ZXMgPSAxLCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3QgbGFuZyA9IHRvUmVmKG9wdGlvbnMubGFuZyB8fCBcImVuLVVTXCIpO1xuXHRjb25zdCBpc0xpc3RlbmluZyA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBpc0ZpbmFsID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHJlc3VsdCA9IHNoYWxsb3dSZWYoXCJcIik7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRsZXQgcmVjb2duaXRpb247XG5cdGNvbnN0IHN0YXJ0ID0gKCkgPT4ge1xuXHRcdGlzTGlzdGVuaW5nLnZhbHVlID0gdHJ1ZTtcblx0fTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHtcblx0XHRpc0xpc3RlbmluZy52YWx1ZSA9IGZhbHNlO1xuXHR9O1xuXHRjb25zdCB0b2dnbGUgPSAodmFsdWUgPSAhaXNMaXN0ZW5pbmcudmFsdWUpID0+IHtcblx0XHRpZiAodmFsdWUpIHN0YXJ0KCk7XG5cdFx0ZWxzZSBzdG9wKCk7XG5cdH07XG5cdGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID0gd2luZG93JDEgJiYgKHdpbmRvdyQxLlNwZWVjaFJlY29nbml0aW9uIHx8IHdpbmRvdyQxLndlYmtpdFNwZWVjaFJlY29nbml0aW9uKTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IFNwZWVjaFJlY29nbml0aW9uKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSB7XG5cdFx0cmVjb2duaXRpb24gPSBuZXcgU3BlZWNoUmVjb2duaXRpb24oKTtcblx0XHRyZWNvZ25pdGlvbi5jb250aW51b3VzID0gY29udGludW91cztcblx0XHRyZWNvZ25pdGlvbi5pbnRlcmltUmVzdWx0cyA9IGludGVyaW1SZXN1bHRzO1xuXHRcdHJlY29nbml0aW9uLmxhbmcgPSB0b1ZhbHVlKGxhbmcpO1xuXHRcdHJlY29nbml0aW9uLm1heEFsdGVybmF0aXZlcyA9IG1heEFsdGVybmF0aXZlcztcblx0XHRyZWNvZ25pdGlvbi5vbnN0YXJ0ID0gKCkgPT4ge1xuXHRcdFx0aXNMaXN0ZW5pbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0aXNGaW5hbC52YWx1ZSA9IGZhbHNlO1xuXHRcdH07XG5cdFx0d2F0Y2gobGFuZywgKGxhbmckMSkgPT4ge1xuXHRcdFx0aWYgKHJlY29nbml0aW9uICYmICFpc0xpc3RlbmluZy52YWx1ZSkgcmVjb2duaXRpb24ubGFuZyA9IGxhbmckMTtcblx0XHR9KTtcblx0XHRyZWNvZ25pdGlvbi5vbnJlc3VsdCA9IChldmVudCkgPT4ge1xuXHRcdFx0Y29uc3QgY3VycmVudFJlc3VsdCA9IGV2ZW50LnJlc3VsdHNbZXZlbnQucmVzdWx0SW5kZXhdO1xuXHRcdFx0Y29uc3QgeyB0cmFuc2NyaXB0IH0gPSBjdXJyZW50UmVzdWx0WzBdO1xuXHRcdFx0aXNGaW5hbC52YWx1ZSA9IGN1cnJlbnRSZXN1bHQuaXNGaW5hbDtcblx0XHRcdHJlc3VsdC52YWx1ZSA9IHRyYW5zY3JpcHQ7XG5cdFx0XHRlcnJvci52YWx1ZSA9IHZvaWQgMDtcblx0XHR9O1xuXHRcdHJlY29nbml0aW9uLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcblx0XHRcdGVycm9yLnZhbHVlID0gZXZlbnQ7XG5cdFx0fTtcblx0XHRyZWNvZ25pdGlvbi5vbmVuZCA9ICgpID0+IHtcblx0XHRcdGlzTGlzdGVuaW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRyZWNvZ25pdGlvbi5sYW5nID0gdG9WYWx1ZShsYW5nKTtcblx0XHR9O1xuXHRcdHdhdGNoKGlzTGlzdGVuaW5nLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XG5cdFx0XHRpZiAobmV3VmFsdWUgPT09IG9sZFZhbHVlKSByZXR1cm47XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAobmV3VmFsdWUpIHJlY29nbml0aW9uLnN0YXJ0KCk7XG5cdFx0XHRcdGVsc2UgcmVjb2duaXRpb24uc3RvcCgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdGVycm9yLnZhbHVlID0gZXJyO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRzdG9wKCk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdGlzU3VwcG9ydGVkLFxuXHRcdGlzTGlzdGVuaW5nLFxuXHRcdGlzRmluYWwsXG5cdFx0cmVjb2duaXRpb24sXG5cdFx0cmVzdWx0LFxuXHRcdGVycm9yLFxuXHRcdHRvZ2dsZSxcblx0XHRzdGFydCxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVNwZWVjaFN5bnRoZXNpcy9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNwZWVjaFN5bnRoZXNpcy5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3BlZWNoU3ludGhlc2lzXG4qIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NwZWVjaFN5bnRoZXNpcyBTcGVlY2hTeW50aGVzaXNcbiovXG5mdW5jdGlvbiB1c2VTcGVlY2hTeW50aGVzaXModGV4dCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgcGl0Y2ggPSAxLCByYXRlID0gMSwgdm9sdW1lID0gMSwgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIG9uQm91bmRhcnkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHN5bnRoID0gd2luZG93JDEgJiYgd2luZG93JDEuc3BlZWNoU3ludGhlc2lzO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gc3ludGgpO1xuXHRjb25zdCBpc1BsYXlpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3Qgc3RhdHVzID0gc2hhbGxvd1JlZihcImluaXRcIik7XG5cdGNvbnN0IHNwb2tlblRleHQgPSB0b1JlZih0ZXh0IHx8IFwiXCIpO1xuXHRjb25zdCBsYW5nID0gdG9SZWYob3B0aW9ucy5sYW5nIHx8IFwiZW4tVVNcIik7XG5cdGNvbnN0IGVycm9yID0gc2hhbGxvd1JlZih2b2lkIDApO1xuXHRjb25zdCB0b2dnbGUgPSAodmFsdWUgPSAhaXNQbGF5aW5nLnZhbHVlKSA9PiB7XG5cdFx0aXNQbGF5aW5nLnZhbHVlID0gdmFsdWU7XG5cdH07XG5cdGNvbnN0IGJpbmRFdmVudHNGb3JVdHRlcmFuY2UgPSAodXR0ZXJhbmNlJDEpID0+IHtcblx0XHR1dHRlcmFuY2UkMS5sYW5nID0gdG9WYWx1ZShsYW5nKTtcblx0XHR1dHRlcmFuY2UkMS52b2ljZSA9IHRvVmFsdWUob3B0aW9ucy52b2ljZSkgfHwgbnVsbDtcblx0XHR1dHRlcmFuY2UkMS5waXRjaCA9IHRvVmFsdWUocGl0Y2gpO1xuXHRcdHV0dGVyYW5jZSQxLnJhdGUgPSB0b1ZhbHVlKHJhdGUpO1xuXHRcdHV0dGVyYW5jZSQxLnZvbHVtZSA9IHRvVmFsdWUodm9sdW1lKTtcblx0XHR1dHRlcmFuY2UkMS5vbnN0YXJ0ID0gKCkgPT4ge1xuXHRcdFx0aXNQbGF5aW5nLnZhbHVlID0gdHJ1ZTtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwicGxheVwiO1xuXHRcdH07XG5cdFx0dXR0ZXJhbmNlJDEub25wYXVzZSA9ICgpID0+IHtcblx0XHRcdGlzUGxheWluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJwYXVzZVwiO1xuXHRcdH07XG5cdFx0dXR0ZXJhbmNlJDEub25yZXN1bWUgPSAoKSA9PiB7XG5cdFx0XHRpc1BsYXlpbmcudmFsdWUgPSB0cnVlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJwbGF5XCI7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbmVuZCA9ICgpID0+IHtcblx0XHRcdGlzUGxheWluZy52YWx1ZSA9IGZhbHNlO1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJlbmRcIjtcblx0XHR9O1xuXHRcdHV0dGVyYW5jZSQxLm9uZXJyb3IgPSAoZXZlbnQpID0+IHtcblx0XHRcdGVycm9yLnZhbHVlID0gZXZlbnQ7XG5cdFx0fTtcblx0XHR1dHRlcmFuY2UkMS5vbmJvdW5kYXJ5ID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRvbkJvdW5kYXJ5ID09PSBudWxsIHx8IG9uQm91bmRhcnkgPT09IHZvaWQgMCB8fCBvbkJvdW5kYXJ5KGV2ZW50KTtcblx0XHR9O1xuXHR9O1xuXHRjb25zdCB1dHRlcmFuY2UgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdFx0c3RhdHVzLnZhbHVlID0gXCJpbml0XCI7XG5cdFx0Y29uc3QgbmV3VXR0ZXJhbmNlID0gbmV3IFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZShzcG9rZW5UZXh0LnZhbHVlKTtcblx0XHRiaW5kRXZlbnRzRm9yVXR0ZXJhbmNlKG5ld1V0dGVyYW5jZSk7XG5cdFx0cmV0dXJuIG5ld1V0dGVyYW5jZTtcblx0fSk7XG5cdGNvbnN0IHNwZWFrID0gKCkgPT4ge1xuXHRcdHN5bnRoLmNhbmNlbCgpO1xuXHRcdGlmICh1dHRlcmFuY2UpIHN5bnRoLnNwZWFrKHV0dGVyYW5jZS52YWx1ZSk7XG5cdH07XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0c3ludGguY2FuY2VsKCk7XG5cdFx0aXNQbGF5aW5nLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdGlmIChpc1N1cHBvcnRlZC52YWx1ZSkge1xuXHRcdGJpbmRFdmVudHNGb3JVdHRlcmFuY2UodXR0ZXJhbmNlLnZhbHVlKTtcblx0XHR3YXRjaChsYW5nLCAobGFuZyQxKSA9PiB7XG5cdFx0XHRpZiAodXR0ZXJhbmNlLnZhbHVlICYmICFpc1BsYXlpbmcudmFsdWUpIHV0dGVyYW5jZS52YWx1ZS5sYW5nID0gbGFuZyQxO1xuXHRcdH0pO1xuXHRcdGlmIChvcHRpb25zLnZvaWNlKSB3YXRjaChvcHRpb25zLnZvaWNlLCAoKSA9PiB7XG5cdFx0XHRzeW50aC5jYW5jZWwoKTtcblx0XHR9KTtcblx0XHR3YXRjaChpc1BsYXlpbmcsICgpID0+IHtcblx0XHRcdGlmIChpc1BsYXlpbmcudmFsdWUpIHN5bnRoLnJlc3VtZSgpO1xuXHRcdFx0ZWxzZSBzeW50aC5wYXVzZSgpO1xuXHRcdH0pO1xuXHR9XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRpc1BsYXlpbmcudmFsdWUgPSBmYWxzZTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0aXNQbGF5aW5nLFxuXHRcdHN0YXR1cyxcblx0XHR1dHRlcmFuY2UsXG5cdFx0ZXJyb3IsXG5cdFx0c3RvcCxcblx0XHR0b2dnbGUsXG5cdFx0c3BlYWtcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3RlcHBlci9pbmRleC50c1xuLyogQF9fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmZ1bmN0aW9uIHVzZVN0ZXBwZXIoc3RlcHMsIGluaXRpYWxTdGVwKSB7XG5cdGNvbnN0IHN0ZXBzUmVmID0gcmVmKHN0ZXBzKTtcblx0Y29uc3Qgc3RlcE5hbWVzID0gY29tcHV0ZWQoKCkgPT4gQXJyYXkuaXNBcnJheShzdGVwc1JlZi52YWx1ZSkgPyBzdGVwc1JlZi52YWx1ZSA6IE9iamVjdC5rZXlzKHN0ZXBzUmVmLnZhbHVlKSk7XG5cdGNvbnN0IGluZGV4ID0gcmVmKHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKGluaXRpYWxTdGVwICE9PSBudWxsICYmIGluaXRpYWxTdGVwICE9PSB2b2lkIDAgPyBpbml0aWFsU3RlcCA6IHN0ZXBOYW1lcy52YWx1ZVswXSkpO1xuXHRjb25zdCBjdXJyZW50ID0gY29tcHV0ZWQoKCkgPT4gYXQoaW5kZXgudmFsdWUpKTtcblx0Y29uc3QgaXNGaXJzdCA9IGNvbXB1dGVkKCgpID0+IGluZGV4LnZhbHVlID09PSAwKTtcblx0Y29uc3QgaXNMYXN0ID0gY29tcHV0ZWQoKCkgPT4gaW5kZXgudmFsdWUgPT09IHN0ZXBOYW1lcy52YWx1ZS5sZW5ndGggLSAxKTtcblx0Y29uc3QgbmV4dCA9IGNvbXB1dGVkKCgpID0+IHN0ZXBOYW1lcy52YWx1ZVtpbmRleC52YWx1ZSArIDFdKTtcblx0Y29uc3QgcHJldmlvdXMgPSBjb21wdXRlZCgoKSA9PiBzdGVwTmFtZXMudmFsdWVbaW5kZXgudmFsdWUgLSAxXSk7XG5cdGZ1bmN0aW9uIGF0KGluZGV4JDEpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShzdGVwc1JlZi52YWx1ZSkpIHJldHVybiBzdGVwc1JlZi52YWx1ZVtpbmRleCQxXTtcblx0XHRyZXR1cm4gc3RlcHNSZWYudmFsdWVbc3RlcE5hbWVzLnZhbHVlW2luZGV4JDFdXTtcblx0fVxuXHRmdW5jdGlvbiBnZXQoc3RlcCkge1xuXHRcdGlmICghc3RlcE5hbWVzLnZhbHVlLmluY2x1ZGVzKHN0ZXApKSByZXR1cm47XG5cdFx0cmV0dXJuIGF0KHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApKTtcblx0fVxuXHRmdW5jdGlvbiBnb1RvKHN0ZXApIHtcblx0XHRpZiAoc3RlcE5hbWVzLnZhbHVlLmluY2x1ZGVzKHN0ZXApKSBpbmRleC52YWx1ZSA9IHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApO1xuXHR9XG5cdGZ1bmN0aW9uIGdvVG9OZXh0KCkge1xuXHRcdGlmIChpc0xhc3QudmFsdWUpIHJldHVybjtcblx0XHRpbmRleC52YWx1ZSsrO1xuXHR9XG5cdGZ1bmN0aW9uIGdvVG9QcmV2aW91cygpIHtcblx0XHRpZiAoaXNGaXJzdC52YWx1ZSkgcmV0dXJuO1xuXHRcdGluZGV4LnZhbHVlLS07XG5cdH1cblx0ZnVuY3Rpb24gZ29CYWNrVG8oc3RlcCkge1xuXHRcdGlmIChpc0FmdGVyKHN0ZXApKSBnb1RvKHN0ZXApO1xuXHR9XG5cdGZ1bmN0aW9uIGlzTmV4dChzdGVwKSB7XG5cdFx0cmV0dXJuIHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApID09PSBpbmRleC52YWx1ZSArIDE7XG5cdH1cblx0ZnVuY3Rpb24gaXNQcmV2aW91cyhzdGVwKSB7XG5cdFx0cmV0dXJuIHN0ZXBOYW1lcy52YWx1ZS5pbmRleE9mKHN0ZXApID09PSBpbmRleC52YWx1ZSAtIDE7XG5cdH1cblx0ZnVuY3Rpb24gaXNDdXJyZW50KHN0ZXApIHtcblx0XHRyZXR1cm4gc3RlcE5hbWVzLnZhbHVlLmluZGV4T2Yoc3RlcCkgPT09IGluZGV4LnZhbHVlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQmVmb3JlKHN0ZXApIHtcblx0XHRyZXR1cm4gaW5kZXgudmFsdWUgPCBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKTtcblx0fVxuXHRmdW5jdGlvbiBpc0FmdGVyKHN0ZXApIHtcblx0XHRyZXR1cm4gaW5kZXgudmFsdWUgPiBzdGVwTmFtZXMudmFsdWUuaW5kZXhPZihzdGVwKTtcblx0fVxuXHRyZXR1cm4ge1xuXHRcdHN0ZXBzOiBzdGVwc1JlZixcblx0XHRzdGVwTmFtZXMsXG5cdFx0aW5kZXgsXG5cdFx0Y3VycmVudCxcblx0XHRuZXh0LFxuXHRcdHByZXZpb3VzLFxuXHRcdGlzRmlyc3QsXG5cdFx0aXNMYXN0LFxuXHRcdGF0LFxuXHRcdGdldCxcblx0XHRnb1RvLFxuXHRcdGdvVG9OZXh0LFxuXHRcdGdvVG9QcmV2aW91cyxcblx0XHRnb0JhY2tUbyxcblx0XHRpc05leHQsXG5cdFx0aXNQcmV2aW91cyxcblx0XHRpc0N1cnJlbnQsXG5cdFx0aXNCZWZvcmUsXG5cdFx0aXNBZnRlclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VTdG9yYWdlQXN5bmMvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBTdG9yYWdlIGluIHdpdGggYXN5bmMgc3VwcG9ydC5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3RvcmFnZUFzeW5jXG4qIEBwYXJhbSBrZXlcbiogQHBhcmFtIGluaXRpYWxWYWx1ZVxuKiBAcGFyYW0gc3RvcmFnZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVN0b3JhZ2VBc3luYyhrZXksIGluaXRpYWxWYWx1ZSwgc3RvcmFnZSwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfb3B0aW9ucyRzZXJpYWxpemVyO1xuXHRjb25zdCB7IGZsdXNoID0gXCJwcmVcIiwgZGVlcCA9IHRydWUsIGxpc3RlblRvU3RvcmFnZUNoYW5nZXMgPSB0cnVlLCB3cml0ZURlZmF1bHRzID0gdHJ1ZSwgbWVyZ2VEZWZhdWx0cyA9IGZhbHNlLCBzaGFsbG93LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZXZlbnRGaWx0ZXIsIG9uRXJyb3IgPSAoZSkgPT4ge1xuXHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdH0sIG9uUmVhZHkgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJhd0luaXQgPSB0b1ZhbHVlKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHR5cGUgPSBndWVzc1NlcmlhbGl6ZXJUeXBlKHJhd0luaXQpO1xuXHRjb25zdCBkYXRhID0gKHNoYWxsb3cgPyBzaGFsbG93UmVmIDogcmVmKSh0b1ZhbHVlKGluaXRpYWxWYWx1ZSkpO1xuXHRjb25zdCBzZXJpYWxpemVyID0gKF9vcHRpb25zJHNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXIpICE9PSBudWxsICYmIF9vcHRpb25zJHNlcmlhbGl6ZXIgIT09IHZvaWQgMCA/IF9vcHRpb25zJHNlcmlhbGl6ZXIgOiBTdG9yYWdlU2VyaWFsaXplcnNbdHlwZV07XG5cdGlmICghc3RvcmFnZSkgdHJ5IHtcblx0XHRzdG9yYWdlID0gZ2V0U1NSSGFuZGxlcihcImdldERlZmF1bHRTdG9yYWdlQXN5bmNcIiwgKCkgPT4gZGVmYXVsdFdpbmRvdyA9PT0gbnVsbCB8fCBkZWZhdWx0V2luZG93ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0V2luZG93LmxvY2FsU3RvcmFnZSkoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdG9uRXJyb3IoZSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVhZChldmVudCkge1xuXHRcdGlmICghc3RvcmFnZSB8fCBldmVudCAmJiBldmVudC5rZXkgIT09IGtleSkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByYXdWYWx1ZSA9IGV2ZW50ID8gZXZlbnQubmV3VmFsdWUgOiBhd2FpdCBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcblx0XHRcdGlmIChyYXdWYWx1ZSA9PSBudWxsKSB7XG5cdFx0XHRcdGRhdGEudmFsdWUgPSByYXdJbml0O1xuXHRcdFx0XHRpZiAod3JpdGVEZWZhdWx0cyAmJiByYXdJbml0ICE9PSBudWxsKSBhd2FpdCBzdG9yYWdlLnNldEl0ZW0oa2V5LCBhd2FpdCBzZXJpYWxpemVyLndyaXRlKHJhd0luaXQpKTtcblx0XHRcdH0gZWxzZSBpZiAobWVyZ2VEZWZhdWx0cykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IHNlcmlhbGl6ZXIucmVhZChyYXdWYWx1ZSk7XG5cdFx0XHRcdGlmICh0eXBlb2YgbWVyZ2VEZWZhdWx0cyA9PT0gXCJmdW5jdGlvblwiKSBkYXRhLnZhbHVlID0gbWVyZ2VEZWZhdWx0cyh2YWx1ZSwgcmF3SW5pdCk7XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSBkYXRhLnZhbHVlID0ge1xuXHRcdFx0XHRcdC4uLnJhd0luaXQsXG5cdFx0XHRcdFx0Li4udmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdFx0ZWxzZSBkYXRhLnZhbHVlID0gdmFsdWU7XG5cdFx0XHR9IGVsc2UgZGF0YS52YWx1ZSA9IGF3YWl0IHNlcmlhbGl6ZXIucmVhZChyYXdWYWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH1cblx0Y29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0cmVhZCgpLnRoZW4oKCkgPT4ge1xuXHRcdFx0b25SZWFkeSA9PT0gbnVsbCB8fCBvblJlYWR5ID09PSB2b2lkIDAgfHwgb25SZWFkeShkYXRhLnZhbHVlKTtcblx0XHRcdHJlc29sdmUoZGF0YSk7XG5cdFx0fSk7XG5cdH0pO1xuXHRpZiAod2luZG93JDEgJiYgbGlzdGVuVG9TdG9yYWdlQ2hhbmdlcykgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJzdG9yYWdlXCIsIChlKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHJlYWQoZSkpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdGlmIChzdG9yYWdlKSB3YXRjaFdpdGhGaWx0ZXIoZGF0YSwgYXN5bmMgKCkgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoZGF0YS52YWx1ZSA9PSBudWxsKSBhd2FpdCBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcblx0XHRcdGVsc2UgYXdhaXQgc3RvcmFnZS5zZXRJdGVtKGtleSwgYXdhaXQgc2VyaWFsaXplci53cml0ZShkYXRhLnZhbHVlKSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b25FcnJvcihlKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmbHVzaCxcblx0XHRkZWVwLFxuXHRcdGV2ZW50RmlsdGVyXG5cdH0pO1xuXHRPYmplY3QuYXNzaWduKGRhdGEsIHtcblx0XHR0aGVuOiBwcm9taXNlLnRoZW4uYmluZChwcm9taXNlKSxcblx0XHRjYXRjaDogcHJvbWlzZS5jYXRjaC5iaW5kKHByb21pc2UpXG5cdH0pO1xuXHRyZXR1cm4gZGF0YTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlU3R5bGVUYWcvaW5kZXgudHNcbmxldCBfaWQgPSAwO1xuLyoqXG4qIEluamVjdCA8c3R5bGU+IGVsZW1lbnQgaW4gaGVhZC5cbipcbiogT3ZlcmxvYWQ6IE9taXR0ZWQgaWRcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlU3R5bGVUYWdcbiogQHBhcmFtIGNzc1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVN0eWxlVGFnKGNzcywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGlzTG9hZGVkID0gc2hhbGxvd1JlZihmYWxzZSk7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIGltbWVkaWF0ZSA9IHRydWUsIG1hbnVhbCA9IGZhbHNlLCBpZCA9IGB2dWV1c2Vfc3R5bGV0YWdfJHsrK19pZH1gIH0gPSBvcHRpb25zO1xuXHRjb25zdCBjc3NSZWYgPSBzaGFsbG93UmVmKGNzcyk7XG5cdGxldCBzdG9wID0gKCkgPT4ge307XG5cdGNvbnN0IGxvYWQgPSAoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxKSByZXR1cm47XG5cdFx0Y29uc3QgZWwgPSBkb2N1bWVudCQxLmdldEVsZW1lbnRCeUlkKGlkKSB8fCBkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRpZiAoIWVsLmlzQ29ubmVjdGVkKSB7XG5cdFx0XHRlbC5pZCA9IGlkO1xuXHRcdFx0aWYgKG9wdGlvbnMubm9uY2UpIGVsLm5vbmNlID0gb3B0aW9ucy5ub25jZTtcblx0XHRcdGlmIChvcHRpb25zLm1lZGlhKSBlbC5tZWRpYSA9IG9wdGlvbnMubWVkaWE7XG5cdFx0XHRkb2N1bWVudCQxLmhlYWQuYXBwZW5kQ2hpbGQoZWwpO1xuXHRcdH1cblx0XHRpZiAoaXNMb2FkZWQudmFsdWUpIHJldHVybjtcblx0XHRzdG9wID0gd2F0Y2goY3NzUmVmLCAodmFsdWUpID0+IHtcblx0XHRcdGVsLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdFx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdFx0aXNMb2FkZWQudmFsdWUgPSB0cnVlO1xuXHR9O1xuXHRjb25zdCB1bmxvYWQgPSAoKSA9PiB7XG5cdFx0aWYgKCFkb2N1bWVudCQxIHx8ICFpc0xvYWRlZC52YWx1ZSkgcmV0dXJuO1xuXHRcdHN0b3AoKTtcblx0XHRkb2N1bWVudCQxLmhlYWQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQkMS5nZXRFbGVtZW50QnlJZChpZCkpO1xuXHRcdGlzTG9hZGVkLnZhbHVlID0gZmFsc2U7XG5cdH07XG5cdGlmIChpbW1lZGlhdGUgJiYgIW1hbnVhbCkgdHJ5T25Nb3VudGVkKGxvYWQpO1xuXHRpZiAoIW1hbnVhbCkgdHJ5T25TY29wZURpc3Bvc2UodW5sb2FkKTtcblx0cmV0dXJuIHtcblx0XHRpZCxcblx0XHRjc3M6IGNzc1JlZixcblx0XHR1bmxvYWQsXG5cdFx0bG9hZCxcblx0XHRpc0xvYWRlZDogcmVhZG9ubHkoaXNMb2FkZWQpXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVN3aXBlL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgc3dpcGUgZGV0ZWN0aW9uLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VTd2lwZVxuKiBAcGFyYW0gdGFyZ2V0XG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlU3dpcGUodGFyZ2V0LCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyB0aHJlc2hvbGQgPSA1MCwgb25Td2lwZSwgb25Td2lwZUVuZCwgb25Td2lwZVN0YXJ0LCBwYXNzaXZlID0gdHJ1ZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgY29vcmRzU3RhcnQgPSByZWFjdGl2ZSh7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCBjb29yZHNFbmQgPSByZWFjdGl2ZSh7XG5cdFx0eDogMCxcblx0XHR5OiAwXG5cdH0pO1xuXHRjb25zdCBkaWZmWCA9IGNvbXB1dGVkKCgpID0+IGNvb3Jkc1N0YXJ0LnggLSBjb29yZHNFbmQueCk7XG5cdGNvbnN0IGRpZmZZID0gY29tcHV0ZWQoKCkgPT4gY29vcmRzU3RhcnQueSAtIGNvb3Jkc0VuZC55KTtcblx0Y29uc3QgeyBtYXgsIGFicyB9ID0gTWF0aDtcblx0Y29uc3QgaXNUaHJlc2hvbGRFeGNlZWRlZCA9IGNvbXB1dGVkKCgpID0+IG1heChhYnMoZGlmZlgudmFsdWUpLCBhYnMoZGlmZlkudmFsdWUpKSA+PSB0aHJlc2hvbGQpO1xuXHRjb25zdCBpc1N3aXBpbmcgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZGlyZWN0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICghaXNUaHJlc2hvbGRFeGNlZWRlZC52YWx1ZSkgcmV0dXJuIFwibm9uZVwiO1xuXHRcdGlmIChhYnMoZGlmZlgudmFsdWUpID4gYWJzKGRpZmZZLnZhbHVlKSkgcmV0dXJuIGRpZmZYLnZhbHVlID4gMCA/IFwibGVmdFwiIDogXCJyaWdodFwiO1xuXHRcdGVsc2UgcmV0dXJuIGRpZmZZLnZhbHVlID4gMCA/IFwidXBcIiA6IFwiZG93blwiO1xuXHR9KTtcblx0Y29uc3QgZ2V0VG91Y2hFdmVudENvb3JkcyA9IChlKSA9PiBbZS50b3VjaGVzWzBdLmNsaWVudFgsIGUudG91Y2hlc1swXS5jbGllbnRZXTtcblx0Y29uc3QgdXBkYXRlQ29vcmRzU3RhcnQgPSAoeCwgeSkgPT4ge1xuXHRcdGNvb3Jkc1N0YXJ0LnggPSB4O1xuXHRcdGNvb3Jkc1N0YXJ0LnkgPSB5O1xuXHR9O1xuXHRjb25zdCB1cGRhdGVDb29yZHNFbmQgPSAoeCwgeSkgPT4ge1xuXHRcdGNvb3Jkc0VuZC54ID0geDtcblx0XHRjb29yZHNFbmQueSA9IHk7XG5cdH07XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHtcblx0XHRwYXNzaXZlLFxuXHRcdGNhcHR1cmU6ICFwYXNzaXZlXG5cdH07XG5cdGNvbnN0IG9uVG91Y2hFbmQgPSAoZSkgPT4ge1xuXHRcdGlmIChpc1N3aXBpbmcudmFsdWUpIG9uU3dpcGVFbmQgPT09IG51bGwgfHwgb25Td2lwZUVuZCA9PT0gdm9pZCAwIHx8IG9uU3dpcGVFbmQoZSwgZGlyZWN0aW9uLnZhbHVlKTtcblx0XHRpc1N3aXBpbmcudmFsdWUgPSBmYWxzZTtcblx0fTtcblx0Y29uc3Qgc3RvcHMgPSBbXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFwidG91Y2hzdGFydFwiLCAoZSkgPT4ge1xuXHRcdFx0aWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDEpIHJldHVybjtcblx0XHRcdGNvbnN0IFt4LCB5XSA9IGdldFRvdWNoRXZlbnRDb29yZHMoZSk7XG5cdFx0XHR1cGRhdGVDb29yZHNTdGFydCh4LCB5KTtcblx0XHRcdHVwZGF0ZUNvb3Jkc0VuZCh4LCB5KTtcblx0XHRcdG9uU3dpcGVTdGFydCA9PT0gbnVsbCB8fCBvblN3aXBlU3RhcnQgPT09IHZvaWQgMCB8fCBvblN3aXBlU3RhcnQoZSk7XG5cdFx0fSwgbGlzdGVuZXJPcHRpb25zKSxcblx0XHR1c2VFdmVudExpc3RlbmVyKHRhcmdldCwgXCJ0b3VjaG1vdmVcIiwgKGUpID0+IHtcblx0XHRcdGlmIChlLnRvdWNoZXMubGVuZ3RoICE9PSAxKSByZXR1cm47XG5cdFx0XHRjb25zdCBbeCwgeV0gPSBnZXRUb3VjaEV2ZW50Q29vcmRzKGUpO1xuXHRcdFx0dXBkYXRlQ29vcmRzRW5kKHgsIHkpO1xuXHRcdFx0aWYgKGxpc3RlbmVyT3B0aW9ucy5jYXB0dXJlICYmICFsaXN0ZW5lck9wdGlvbnMucGFzc2l2ZSAmJiBNYXRoLmFicyhkaWZmWC52YWx1ZSkgPiBNYXRoLmFicyhkaWZmWS52YWx1ZSkpIGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGlmICghaXNTd2lwaW5nLnZhbHVlICYmIGlzVGhyZXNob2xkRXhjZWVkZWQudmFsdWUpIGlzU3dpcGluZy52YWx1ZSA9IHRydWU7XG5cdFx0XHRpZiAoaXNTd2lwaW5nLnZhbHVlKSBvblN3aXBlID09PSBudWxsIHx8IG9uU3dpcGUgPT09IHZvaWQgMCB8fCBvblN3aXBlKGUpO1xuXHRcdH0sIGxpc3RlbmVyT3B0aW9ucyksXG5cdFx0dXNlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIFtcInRvdWNoZW5kXCIsIFwidG91Y2hjYW5jZWxcIl0sIG9uVG91Y2hFbmQsIGxpc3RlbmVyT3B0aW9ucylcblx0XTtcblx0Y29uc3Qgc3RvcCA9ICgpID0+IHN0b3BzLmZvckVhY2goKHMpID0+IHMoKSk7XG5cdHJldHVybiB7XG5cdFx0aXNTd2lwaW5nLFxuXHRcdGRpcmVjdGlvbixcblx0XHRjb29yZHNTdGFydCxcblx0XHRjb29yZHNFbmQsXG5cdFx0bGVuZ3RoWDogZGlmZlgsXG5cdFx0bGVuZ3RoWTogZGlmZlksXG5cdFx0c3RvcFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUZW1wbGF0ZVJlZnNMaXN0L2luZGV4LnRzXG4vKiBAX19OT19TSURFX0VGRkVDVFNfXyAqL1xuZnVuY3Rpb24gdXNlVGVtcGxhdGVSZWZzTGlzdCgpIHtcblx0Y29uc3QgcmVmcyA9IHJlZihbXSk7XG5cdHJlZnMudmFsdWUuc2V0ID0gKGVsKSA9PiB7XG5cdFx0aWYgKGVsKSByZWZzLnZhbHVlLnB1c2goZWwpO1xuXHR9O1xuXHRvbkJlZm9yZVVwZGF0ZSgoKSA9PiB7XG5cdFx0cmVmcy52YWx1ZS5sZW5ndGggPSAwO1xuXHR9KTtcblx0cmV0dXJuIHJlZnM7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRleHREaXJlY3Rpb24vaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSBkaXIgb2YgdGhlIGVsZW1lbnQncyB0ZXh0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VUZXh0RGlyZWN0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVGV4dERpcmVjdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgeyBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCwgc2VsZWN0b3IgPSBcImh0bWxcIiwgb2JzZXJ2ZSA9IGZhbHNlLCBpbml0aWFsVmFsdWUgPSBcImx0clwiIH0gPSBvcHRpb25zO1xuXHRmdW5jdGlvbiBnZXRWYWx1ZSQxKCkge1xuXHRcdHZhciBfcmVmLCBfZG9jdW1lbnQkcXVlcnlTZWxlY3Q7XG5cdFx0cmV0dXJuIChfcmVmID0gZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgfHwgKF9kb2N1bWVudCRxdWVyeVNlbGVjdCA9IGRvY3VtZW50JDEucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpID09PSBudWxsIHx8IF9kb2N1bWVudCRxdWVyeVNlbGVjdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2RvY3VtZW50JHF1ZXJ5U2VsZWN0LmdldEF0dHJpYnV0ZShcImRpclwiKSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IGluaXRpYWxWYWx1ZTtcblx0fVxuXHRjb25zdCBkaXIgPSByZWYoZ2V0VmFsdWUkMSgpKTtcblx0dHJ5T25Nb3VudGVkKCgpID0+IGRpci52YWx1ZSA9IGdldFZhbHVlJDEoKSk7XG5cdGlmIChvYnNlcnZlICYmIGRvY3VtZW50JDEpIHVzZU11dGF0aW9uT2JzZXJ2ZXIoZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSwgKCkgPT4gZGlyLnZhbHVlID0gZ2V0VmFsdWUkMSgpLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG5cdHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGRpci52YWx1ZTtcblx0XHR9LFxuXHRcdHNldCh2KSB7XG5cdFx0XHR2YXIgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0MiwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0Mztcblx0XHRcdGRpci52YWx1ZSA9IHY7XG5cdFx0XHRpZiAoIWRvY3VtZW50JDEpIHJldHVybjtcblx0XHRcdGlmIChkaXIudmFsdWUpIChfZG9jdW1lbnQkcXVlcnlTZWxlY3QyID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT09IG51bGwgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0MiA9PT0gdm9pZCAwIHx8IF9kb2N1bWVudCRxdWVyeVNlbGVjdDIuc2V0QXR0cmlidXRlKFwiZGlyXCIsIGRpci52YWx1ZSk7XG5cdFx0XHRlbHNlIChfZG9jdW1lbnQkcXVlcnlTZWxlY3QzID0gZG9jdW1lbnQkMS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgPT09IG51bGwgfHwgX2RvY3VtZW50JHF1ZXJ5U2VsZWN0MyA9PT0gdm9pZCAwIHx8IF9kb2N1bWVudCRxdWVyeVNlbGVjdDMucmVtb3ZlQXR0cmlidXRlKFwiZGlyXCIpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRleHRTZWxlY3Rpb24vaW5kZXgudHNcbmZ1bmN0aW9uIGdldFJhbmdlc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKSB7XG5cdHZhciBfc2VsZWN0aW9uJHJhbmdlQ291bnQ7XG5cdGNvbnN0IHJhbmdlQ291bnQgPSAoX3NlbGVjdGlvbiRyYW5nZUNvdW50ID0gc2VsZWN0aW9uLnJhbmdlQ291bnQpICE9PSBudWxsICYmIF9zZWxlY3Rpb24kcmFuZ2VDb3VudCAhPT0gdm9pZCAwID8gX3NlbGVjdGlvbiRyYW5nZUNvdW50IDogMDtcblx0cmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHJhbmdlQ291bnQgfSwgKF8sIGkpID0+IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpKTtcbn1cbi8qKlxuKiBSZWFjdGl2ZWx5IHRyYWNrIHVzZXIgdGV4dCBzZWxlY3Rpb24gYmFzZWQgb24gW2BXaW5kb3cuZ2V0U2VsZWN0aW9uYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9nZXRTZWxlY3Rpb24pLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VUZXh0U2VsZWN0aW9uXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlVGV4dFNlbGVjdGlvbihvcHRpb25zID0ge30pIHtcblx0dmFyIF93aW5kb3ckZ2V0U2VsZWN0aW9uO1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93IH0gPSBvcHRpb25zO1xuXHRjb25zdCBzZWxlY3Rpb24gPSBzaGFsbG93UmVmKChfd2luZG93JGdldFNlbGVjdGlvbiA9IHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aW5kb3ckMS5nZXRTZWxlY3Rpb24oKSkgIT09IG51bGwgJiYgX3dpbmRvdyRnZXRTZWxlY3Rpb24gIT09IHZvaWQgMCA/IF93aW5kb3ckZ2V0U2VsZWN0aW9uIDogbnVsbCk7XG5cdGNvbnN0IHRleHQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0dmFyIF9zZWxlY3Rpb24kdmFsdWUkdG9TdCwgX3NlbGVjdGlvbiR2YWx1ZTtcblx0XHRyZXR1cm4gKF9zZWxlY3Rpb24kdmFsdWUkdG9TdCA9IChfc2VsZWN0aW9uJHZhbHVlID0gc2VsZWN0aW9uLnZhbHVlKSA9PT0gbnVsbCB8fCBfc2VsZWN0aW9uJHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfc2VsZWN0aW9uJHZhbHVlLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9zZWxlY3Rpb24kdmFsdWUkdG9TdCAhPT0gdm9pZCAwID8gX3NlbGVjdGlvbiR2YWx1ZSR0b1N0IDogXCJcIjtcblx0fSk7XG5cdGNvbnN0IHJhbmdlcyA9IGNvbXB1dGVkKCgpID0+IHNlbGVjdGlvbi52YWx1ZSA/IGdldFJhbmdlc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uLnZhbHVlKSA6IFtdKTtcblx0Y29uc3QgcmVjdHMgPSBjb21wdXRlZCgoKSA9PiByYW5nZXMudmFsdWUubWFwKChyYW5nZSkgPT4gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKTtcblx0ZnVuY3Rpb24gb25TZWxlY3Rpb25DaGFuZ2UoKSB7XG5cdFx0c2VsZWN0aW9uLnZhbHVlID0gbnVsbDtcblx0XHRpZiAod2luZG93JDEpIHNlbGVjdGlvbi52YWx1ZSA9IHdpbmRvdyQxLmdldFNlbGVjdGlvbigpO1xuXHR9XG5cdGlmICh3aW5kb3ckMSkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS5kb2N1bWVudCwgXCJzZWxlY3Rpb25jaGFuZ2VcIiwgb25TZWxlY3Rpb25DaGFuZ2UsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblx0cmV0dXJuIHtcblx0XHR0ZXh0LFxuXHRcdHJlY3RzLFxuXHRcdHJhbmdlcyxcblx0XHRzZWxlY3Rpb25cblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGV4dGFyZWFBdXRvc2l6ZS9pbmRleC50c1xuLyoqXG4qIENhbGwgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgpLCBpZiBub3QgYXZhaWxhYmxlLCBqdXN0IGNhbGwgdGhlIGZ1bmN0aW9uXG4qXG4qIEBwYXJhbSB3aW5kb3dcbiogQHBhcmFtIGZuXG4qL1xuZnVuY3Rpb24gdHJ5UmVxdWVzdEFuaW1hdGlvbkZyYW1lKHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdywgZm4pIHtcblx0aWYgKHdpbmRvdyQxICYmIHR5cGVvZiB3aW5kb3ckMS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09IFwiZnVuY3Rpb25cIikgd2luZG93JDEucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcblx0ZWxzZSBmbigpO1xufVxuZnVuY3Rpb24gdXNlVGV4dGFyZWFBdXRvc2l6ZShvcHRpb25zID0ge30pIHtcblx0dmFyIF9vcHRpb25zJGlucHV0LCBfb3B0aW9ucyRzdHlsZVByb3A7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHRleHRhcmVhID0gdG9SZWYob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmVsZW1lbnQpO1xuXHRjb25zdCBpbnB1dCA9IHRvUmVmKChfb3B0aW9ucyRpbnB1dCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5pbnB1dCkgIT09IG51bGwgJiYgX29wdGlvbnMkaW5wdXQgIT09IHZvaWQgMCA/IF9vcHRpb25zJGlucHV0IDogXCJcIik7XG5cdGNvbnN0IHN0eWxlUHJvcCA9IChfb3B0aW9ucyRzdHlsZVByb3AgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuc3R5bGVQcm9wKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRzdHlsZVByb3AgIT09IHZvaWQgMCA/IF9vcHRpb25zJHN0eWxlUHJvcCA6IFwiaGVpZ2h0XCI7XG5cdGNvbnN0IHRleHRhcmVhU2Nyb2xsSGVpZ2h0ID0gc2hhbGxvd1JlZigxKTtcblx0Y29uc3QgdGV4dGFyZWFPbGRXaWR0aCA9IHNoYWxsb3dSZWYoMCk7XG5cdGZ1bmN0aW9uIHRyaWdnZXJSZXNpemUoKSB7XG5cdFx0dmFyIF90ZXh0YXJlYSR2YWx1ZTtcblx0XHRpZiAoIXRleHRhcmVhLnZhbHVlKSByZXR1cm47XG5cdFx0bGV0IGhlaWdodCA9IFwiXCI7XG5cdFx0dGV4dGFyZWEudmFsdWUuc3R5bGVbc3R5bGVQcm9wXSA9IFwiMXB4XCI7XG5cdFx0dGV4dGFyZWFTY3JvbGxIZWlnaHQudmFsdWUgPSAoX3RleHRhcmVhJHZhbHVlID0gdGV4dGFyZWEudmFsdWUpID09PSBudWxsIHx8IF90ZXh0YXJlYSR2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3RleHRhcmVhJHZhbHVlLnNjcm9sbEhlaWdodDtcblx0XHRjb25zdCBfc3R5bGVUYXJnZXQgPSB0b1ZhbHVlKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zdHlsZVRhcmdldCk7XG5cdFx0aWYgKF9zdHlsZVRhcmdldCkgX3N0eWxlVGFyZ2V0LnN0eWxlW3N0eWxlUHJvcF0gPSBgJHt0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZX1weGA7XG5cdFx0ZWxzZSBoZWlnaHQgPSBgJHt0ZXh0YXJlYVNjcm9sbEhlaWdodC52YWx1ZX1weGA7XG5cdFx0dGV4dGFyZWEudmFsdWUuc3R5bGVbc3R5bGVQcm9wXSA9IGhlaWdodDtcblx0fVxuXHR3YXRjaChbaW5wdXQsIHRleHRhcmVhXSwgKCkgPT4gbmV4dFRpY2sodHJpZ2dlclJlc2l6ZSksIHsgaW1tZWRpYXRlOiB0cnVlIH0pO1xuXHR3YXRjaCh0ZXh0YXJlYVNjcm9sbEhlaWdodCwgKCkgPT4ge1xuXHRcdHZhciBfb3B0aW9ucyRvblJlc2l6ZTtcblx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgfHwgKF9vcHRpb25zJG9uUmVzaXplID0gb3B0aW9ucy5vblJlc2l6ZSkgPT09IG51bGwgfHwgX29wdGlvbnMkb25SZXNpemUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJG9uUmVzaXplLmNhbGwob3B0aW9ucyk7XG5cdH0pO1xuXHR1c2VSZXNpemVPYnNlcnZlcih0ZXh0YXJlYSwgKFt7IGNvbnRlbnRSZWN0IH1dKSA9PiB7XG5cdFx0aWYgKHRleHRhcmVhT2xkV2lkdGgudmFsdWUgPT09IGNvbnRlbnRSZWN0LndpZHRoKSByZXR1cm47XG5cdFx0dHJ5UmVxdWVzdEFuaW1hdGlvbkZyYW1lKHdpbmRvdyQxLCAoKSA9PiB7XG5cdFx0XHR0ZXh0YXJlYU9sZFdpZHRoLnZhbHVlID0gY29udGVudFJlY3Qud2lkdGg7XG5cdFx0XHR0cmlnZ2VyUmVzaXplKCk7XG5cdFx0fSk7XG5cdH0pO1xuXHRpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLndhdGNoKSB3YXRjaChvcHRpb25zLndhdGNoLCB0cmlnZ2VyUmVzaXplLCB7XG5cdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdGRlZXA6IHRydWVcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0dGV4dGFyZWEsXG5cdFx0aW5wdXQsXG5cdFx0dHJpZ2dlclJlc2l6ZVxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5L2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciBbdXNlUmVmSGlzdG9yeV0oaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVJlZkhpc3RvcnkpIHdpdGggdGhyb3R0bGVkIGZpbHRlci5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVGhyb3R0bGVkUmVmSGlzdG9yeVxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVGhyb3R0bGVkUmVmSGlzdG9yeShzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHRocm90dGxlID0gMjAwLCB0cmFpbGluZyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGZpbHRlciA9IHRocm90dGxlRmlsdGVyKHRocm90dGxlLCB0cmFpbGluZyk7XG5cdHJldHVybiB7IC4uLnVzZVJlZkhpc3Rvcnkoc291cmNlLCB7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRldmVudEZpbHRlcjogZmlsdGVyXG5cdH0pIH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVBZ28vaW5kZXgudHNcbmNvbnN0IERFRkFVTFRfVU5JVFMgPSBbXG5cdHtcblx0XHRtYXg6IDZlNCxcblx0XHR2YWx1ZTogMWUzLFxuXHRcdG5hbWU6IFwic2Vjb25kXCJcblx0fSxcblx0e1xuXHRcdG1heDogMjc2ZTQsXG5cdFx0dmFsdWU6IDZlNCxcblx0XHRuYW1lOiBcIm1pbnV0ZVwiXG5cdH0sXG5cdHtcblx0XHRtYXg6IDcyZTYsXG5cdFx0dmFsdWU6IDM2ZTUsXG5cdFx0bmFtZTogXCJob3VyXCJcblx0fSxcblx0e1xuXHRcdG1heDogNTE4NGU1LFxuXHRcdHZhbHVlOiA4NjRlNSxcblx0XHRuYW1lOiBcImRheVwiXG5cdH0sXG5cdHtcblx0XHRtYXg6IDI0MTkyZTUsXG5cdFx0dmFsdWU6IDYwNDhlNSxcblx0XHRuYW1lOiBcIndlZWtcIlxuXHR9LFxuXHR7XG5cdFx0bWF4OiAyODUxMmU2LFxuXHRcdHZhbHVlOiAyNTkyZTYsXG5cdFx0bmFtZTogXCJtb250aFwiXG5cdH0sXG5cdHtcblx0XHRtYXg6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcblx0XHR2YWx1ZTogMzE1MzZlNixcblx0XHRuYW1lOiBcInllYXJcIlxuXHR9XG5dO1xuY29uc3QgREVGQVVMVF9NRVNTQUdFUyA9IHtcblx0anVzdE5vdzogXCJqdXN0IG5vd1wiLFxuXHRwYXN0OiAobikgPT4gbi5tYXRjaCgvXFxkLykgPyBgJHtufSBhZ29gIDogbixcblx0ZnV0dXJlOiAobikgPT4gbi5tYXRjaCgvXFxkLykgPyBgaW4gJHtufWAgOiBuLFxuXHRtb250aDogKG4sIHBhc3QpID0+IG4gPT09IDEgPyBwYXN0ID8gXCJsYXN0IG1vbnRoXCIgOiBcIm5leHQgbW9udGhcIiA6IGAke259IG1vbnRoJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHR5ZWFyOiAobiwgcGFzdCkgPT4gbiA9PT0gMSA/IHBhc3QgPyBcImxhc3QgeWVhclwiIDogXCJuZXh0IHllYXJcIiA6IGAke259IHllYXIke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdGRheTogKG4sIHBhc3QpID0+IG4gPT09IDEgPyBwYXN0ID8gXCJ5ZXN0ZXJkYXlcIiA6IFwidG9tb3Jyb3dcIiA6IGAke259IGRheSR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0d2VlazogKG4sIHBhc3QpID0+IG4gPT09IDEgPyBwYXN0ID8gXCJsYXN0IHdlZWtcIiA6IFwibmV4dCB3ZWVrXCIgOiBgJHtufSB3ZWVrJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHRob3VyOiAobikgPT4gYCR7bn0gaG91ciR7biA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcblx0bWludXRlOiAobikgPT4gYCR7bn0gbWludXRlJHtuID4gMSA/IFwic1wiIDogXCJcIn1gLFxuXHRzZWNvbmQ6IChuKSA9PiBgJHtufSBzZWNvbmQke24gPiAxID8gXCJzXCIgOiBcIlwifWAsXG5cdGludmFsaWQ6IFwiXCJcbn07XG5mdW5jdGlvbiBERUZBVUxUX0ZPUk1BVFRFUihkYXRlKSB7XG5cdHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQ0KG9wdGlvbnMpIHtcblx0aWYgKFwidXBkYXRlSW50ZXJ2YWxcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyB1cGRhdGVJbnRlcnZhbCA9IDNlNCB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCB1cGRhdGVJbnRlcnZhbCk7XG5cdH1cblx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgM2U0KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSB0aW1lIGFnbyBmb3JtYXR0ZXIuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRpbWVBZ29cbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VUaW1lQWdvKHRpbWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDQob3B0aW9ucykgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgbm93LC4uLmNvbnRyb2xzIH0gPSB1c2VOb3coe1xuXHRcdHNjaGVkdWxlcixcblx0XHRjb250cm9sczogdHJ1ZVxuXHR9KTtcblx0Y29uc3QgdGltZUFnbyA9IGNvbXB1dGVkKCgpID0+IGZvcm1hdFRpbWVBZ28obmV3IERhdGUodG9WYWx1ZSh0aW1lKSksIG9wdGlvbnMsIHRvVmFsdWUobm93KSkpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0dGltZUFnbyxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiB0aW1lQWdvO1xufVxuZnVuY3Rpb24gZm9ybWF0VGltZUFnbyhmcm9tLCBvcHRpb25zID0ge30sIG5vdyA9IERhdGUubm93KCkpIHtcblx0Y29uc3QgeyBtYXgsIG1lc3NhZ2VzID0gREVGQVVMVF9NRVNTQUdFUywgZnVsbERhdGVGb3JtYXR0ZXIgPSBERUZBVUxUX0ZPUk1BVFRFUiwgdW5pdHMgPSBERUZBVUxUX1VOSVRTLCBzaG93U2Vjb25kID0gZmFsc2UsIHJvdW5kaW5nID0gXCJyb3VuZFwiIH0gPSBvcHRpb25zO1xuXHRjb25zdCByb3VuZEZuID0gdHlwZW9mIHJvdW5kaW5nID09PSBcIm51bWJlclwiID8gKG4pID0+ICtuLnRvRml4ZWQocm91bmRpbmcpIDogTWF0aFtyb3VuZGluZ107XG5cdGNvbnN0IGRpZmYgPSArbm93IC0gK2Zyb207XG5cdGNvbnN0IGFic0RpZmYgPSBNYXRoLmFicyhkaWZmKTtcblx0ZnVuY3Rpb24gZ2V0VmFsdWUkMShkaWZmJDEsIHVuaXQpIHtcblx0XHRyZXR1cm4gcm91bmRGbihNYXRoLmFicyhkaWZmJDEpIC8gdW5pdC52YWx1ZSk7XG5cdH1cblx0ZnVuY3Rpb24gZm9ybWF0KGRpZmYkMSwgdW5pdCkge1xuXHRcdGNvbnN0IHZhbCA9IGdldFZhbHVlJDEoZGlmZiQxLCB1bml0KTtcblx0XHRjb25zdCBwYXN0ID0gZGlmZiQxID4gMDtcblx0XHRjb25zdCBzdHIgPSBhcHBseUZvcm1hdCh1bml0Lm5hbWUsIHZhbCwgcGFzdCk7XG5cdFx0cmV0dXJuIGFwcGx5Rm9ybWF0KHBhc3QgPyBcInBhc3RcIiA6IFwiZnV0dXJlXCIsIHN0ciwgcGFzdCk7XG5cdH1cblx0ZnVuY3Rpb24gYXBwbHlGb3JtYXQobmFtZSwgdmFsLCBpc1Bhc3QpIHtcblx0XHRjb25zdCBmb3JtYXR0ZXIgPSBtZXNzYWdlc1tuYW1lXTtcblx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZm9ybWF0dGVyKHZhbCwgaXNQYXN0KTtcblx0XHRyZXR1cm4gZm9ybWF0dGVyLnJlcGxhY2UoXCJ7MH1cIiwgdmFsLnRvU3RyaW5nKCkpO1xuXHR9XG5cdGlmIChhYnNEaWZmIDwgNmU0ICYmICFzaG93U2Vjb25kKSByZXR1cm4gbWVzc2FnZXMuanVzdE5vdztcblx0aWYgKHR5cGVvZiBtYXggPT09IFwibnVtYmVyXCIgJiYgYWJzRGlmZiA+IG1heCkgcmV0dXJuIGZ1bGxEYXRlRm9ybWF0dGVyKG5ldyBEYXRlKGZyb20pKTtcblx0aWYgKHR5cGVvZiBtYXggPT09IFwic3RyaW5nXCIpIHtcblx0XHR2YXIgX3VuaXRzJGZpbmQ7XG5cdFx0Y29uc3QgdW5pdE1heCA9IChfdW5pdHMkZmluZCA9IHVuaXRzLmZpbmQoKGkpID0+IGkubmFtZSA9PT0gbWF4KSkgPT09IG51bGwgfHwgX3VuaXRzJGZpbmQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF91bml0cyRmaW5kLm1heDtcblx0XHRpZiAodW5pdE1heCAmJiBhYnNEaWZmID4gdW5pdE1heCkgcmV0dXJuIGZ1bGxEYXRlRm9ybWF0dGVyKG5ldyBEYXRlKGZyb20pKTtcblx0fVxuXHRmb3IgKGNvbnN0IFtpZHgsIHVuaXRdIG9mIHVuaXRzLmVudHJpZXMoKSkge1xuXHRcdGlmIChnZXRWYWx1ZSQxKGRpZmYsIHVuaXQpIDw9IDAgJiYgdW5pdHNbaWR4IC0gMV0pIHJldHVybiBmb3JtYXQoZGlmZiwgdW5pdHNbaWR4IC0gMV0pO1xuXHRcdGlmIChhYnNEaWZmIDwgdW5pdC5tYXgpIHJldHVybiBmb3JtYXQoZGlmZiwgdW5pdCk7XG5cdH1cblx0cmV0dXJuIG1lc3NhZ2VzLmludmFsaWQ7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVBZ29JbnRsL2luZGV4LnRzXG5jb25zdCBVTklUUyA9IFtcblx0e1xuXHRcdG5hbWU6IFwieWVhclwiLFxuXHRcdG1zOiAzMTUzNmU2XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcIm1vbnRoXCIsXG5cdFx0bXM6IDI1OTJlNlxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJ3ZWVrXCIsXG5cdFx0bXM6IDYwNDhlNVxuXHR9LFxuXHR7XG5cdFx0bmFtZTogXCJkYXlcIixcblx0XHRtczogODY0ZTVcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwiaG91clwiLFxuXHRcdG1zOiAzNmU1XG5cdH0sXG5cdHtcblx0XHRuYW1lOiBcIm1pbnV0ZVwiLFxuXHRcdG1zOiA2ZTRcblx0fSxcblx0e1xuXHRcdG5hbWU6IFwic2Vjb25kXCIsXG5cdFx0bXM6IDFlM1xuXHR9XG5dO1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQzKG9wdGlvbnMpIHtcblx0aWYgKFwidXBkYXRlSW50ZXJ2YWxcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyB1cGRhdGVJbnRlcnZhbCA9IDNlNCB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCB1cGRhdGVJbnRlcnZhbCk7XG5cdH1cblx0cmV0dXJuIChjYikgPT4gdXNlSW50ZXJ2YWxGbihjYiwgM2U0KTtcbn1cbmZ1bmN0aW9uIHVzZVRpbWVBZ29JbnRsKHRpbWUsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDMob3B0aW9ucykgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHsgbm93LC4uLmNvbnRyb2xzIH0gPSB1c2VOb3coe1xuXHRcdHNjaGVkdWxlcixcblx0XHRjb250cm9sczogdHJ1ZVxuXHR9KTtcblx0Y29uc3QgcmVzdWx0ID0gY29tcHV0ZWQoKCkgPT4gZ2V0VGltZUFnb0ludGxSZXN1bHQobmV3IERhdGUodG9WYWx1ZSh0aW1lKSksIG9wdGlvbnMsIHRvVmFsdWUobm93KSkpO1xuXHRjb25zdCBwYXJ0cyA9IGNvbXB1dGVkKCgpID0+IHJlc3VsdC52YWx1ZS5wYXJ0cyk7XG5cdGNvbnN0IHRpbWVBZ29JbnRsID0gY29tcHV0ZWQoKCkgPT4gZm9ybWF0VGltZUFnb0ludGxQYXJ0cyhwYXJ0cy52YWx1ZSwge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0bG9jYWxlOiByZXN1bHQudmFsdWUucmVzb2x2ZWRMb2NhbGVcblx0fSkpO1xuXHRyZXR1cm4gZXhwb3NlQ29udHJvbHMgPyB7XG5cdFx0dGltZUFnb0ludGwsXG5cdFx0cGFydHMsXG5cdFx0Li4uY29udHJvbHNcblx0fSA6IHRpbWVBZ29JbnRsO1xufVxuLyoqXG4qIE5vbi1yZWFjdGl2ZSB2ZXJzaW9uIG9mIHVzZVRpbWVBZ29JbnRsXG4qL1xuZnVuY3Rpb24gZm9ybWF0VGltZUFnb0ludGwoZnJvbSwgb3B0aW9ucyA9IHt9LCBub3cgPSBEYXRlLm5vdygpKSB7XG5cdGNvbnN0IHsgcGFydHMsIHJlc29sdmVkTG9jYWxlIH0gPSBnZXRUaW1lQWdvSW50bFJlc3VsdChmcm9tLCBvcHRpb25zLCBub3cpO1xuXHRyZXR1cm4gZm9ybWF0VGltZUFnb0ludGxQYXJ0cyhwYXJ0cywge1xuXHRcdC4uLm9wdGlvbnMsXG5cdFx0bG9jYWxlOiByZXNvbHZlZExvY2FsZVxuXHR9KTtcbn1cbi8qKlxuKiBHZXQgcGFydHMgZnJvbSBgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQuZm9ybWF0VG9QYXJ0c2AuXG4qL1xuZnVuY3Rpb24gZ2V0VGltZUFnb0ludGxSZXN1bHQoZnJvbSwgb3B0aW9ucyA9IHt9LCBub3cgPSBEYXRlLm5vdygpKSB7XG5cdHZhciBfb3B0aW9ucyR1bml0cztcblx0Y29uc3QgeyBsb2NhbGUsIHJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG51bWVyaWM6IFwiYXV0b1wiIH0gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHJ0ZiA9IG5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChsb2NhbGUsIHJlbGF0aXZlVGltZUZvcm1hdE9wdGlvbnMpO1xuXHRjb25zdCB7IGxvY2FsZTogcmVzb2x2ZWRMb2NhbGUgfSA9IHJ0Zi5yZXNvbHZlZE9wdGlvbnMoKTtcblx0Y29uc3QgZGlmZiA9ICtmcm9tIC0gK25vdztcblx0Y29uc3QgYWJzRGlmZiA9IE1hdGguYWJzKGRpZmYpO1xuXHRjb25zdCB1bml0cyA9IChfb3B0aW9ucyR1bml0cyA9IG9wdGlvbnMudW5pdHMpICE9PSBudWxsICYmIF9vcHRpb25zJHVuaXRzICE9PSB2b2lkIDAgPyBfb3B0aW9ucyR1bml0cyA6IFVOSVRTO1xuXHRmb3IgKGNvbnN0IHsgbmFtZSwgbXMgfSBvZiB1bml0cykgaWYgKGFic0RpZmYgPj0gbXMpIHJldHVybiB7XG5cdFx0cmVzb2x2ZWRMb2NhbGUsXG5cdFx0cGFydHM6IHJ0Zi5mb3JtYXRUb1BhcnRzKE1hdGgucm91bmQoZGlmZiAvIG1zKSwgbmFtZSlcblx0fTtcblx0cmV0dXJuIHtcblx0XHRyZXNvbHZlZExvY2FsZSxcblx0XHRwYXJ0czogcnRmLmZvcm1hdFRvUGFydHMoMCwgdW5pdHNbdW5pdHMubGVuZ3RoIC0gMV0ubmFtZSlcblx0fTtcbn1cbi8qKlxuKiBGb3JtYXQgcGFydHMgaW50byBhIHN0cmluZ1xuKi9cbmZ1bmN0aW9uIGZvcm1hdFRpbWVBZ29JbnRsUGFydHMocGFydHMsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluc2VydFNwYWNlID0gdHJ1ZSwgam9pblBhcnRzLCBsb2NhbGUgfSA9IG9wdGlvbnM7XG5cdGlmICh0eXBlb2Ygam9pblBhcnRzID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBqb2luUGFydHMocGFydHMsIGxvY2FsZSk7XG5cdGlmICghaW5zZXJ0U3BhY2UpIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpLmpvaW4oXCJcIik7XG5cdHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUudHJpbSgpKS5qb2luKFwiIFwiKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGltZW91dFBvbGwvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVRpbWVvdXRQb2xsKGZuLCBpbnRlcnZhbCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgaW1tZWRpYXRlID0gdHJ1ZSwgaW1tZWRpYXRlQ2FsbGJhY2sgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0Y29uc3QgeyBzdGFydCB9ID0gdXNlVGltZW91dEZuKGxvb3AsIGludGVydmFsLCB7IGltbWVkaWF0ZSB9KTtcblx0Y29uc3QgaXNBY3RpdmUgPSBzaGFsbG93UmVmKGZhbHNlKTtcblx0YXN5bmMgZnVuY3Rpb24gbG9vcCgpIHtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlKSByZXR1cm47XG5cdFx0YXdhaXQgZm4oKTtcblx0XHRzdGFydCgpO1xuXHR9XG5cdGZ1bmN0aW9uIHJlc3VtZSgpIHtcblx0XHRpZiAoIWlzQWN0aXZlLnZhbHVlKSB7XG5cdFx0XHRpc0FjdGl2ZS52YWx1ZSA9IHRydWU7XG5cdFx0XHRpZiAoaW1tZWRpYXRlQ2FsbGJhY2spIGZuKCk7XG5cdFx0XHRzdGFydCgpO1xuXHRcdH1cblx0fVxuXHRmdW5jdGlvbiBwYXVzZSgpIHtcblx0XHRpc0FjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGlmIChpbW1lZGlhdGUgJiYgaXNDbGllbnQpIHJlc3VtZSgpO1xuXHR0cnlPblNjb3BlRGlzcG9zZShwYXVzZSk7XG5cdHJldHVybiB7XG5cdFx0aXNBY3RpdmUsXG5cdFx0cGF1c2UsXG5cdFx0cmVzdW1lXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVRpbWVzdGFtcC9pbmRleC50c1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNjaGVkdWxlciQyKG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zIHx8IFwiaW1tZWRpYXRlXCIgaW4gb3B0aW9ucykge1xuXHRcdGNvbnN0IHsgaW50ZXJ2YWwgPSBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLCBpbW1lZGlhdGUgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRcdHJldHVybiBpbnRlcnZhbCA9PT0gXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIiA/IChjYikgPT4gdXNlUmFmRm4oY2IsIHsgaW1tZWRpYXRlIH0pIDogKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGUgfSk7XG5cdH1cblx0cmV0dXJuIHVzZVJhZkZuO1xufVxuZnVuY3Rpb24gdXNlVGltZXN0YW1wKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGNvbnRyb2xzOiBleHBvc2VDb250cm9scyA9IGZhbHNlLCBvZmZzZXQgPSAwLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyJDIob3B0aW9ucyksIGNhbGxiYWNrIH0gPSBvcHRpb25zO1xuXHRjb25zdCB0cyA9IHNoYWxsb3dSZWYodGltZXN0YW1wKCkgKyBvZmZzZXQpO1xuXHRjb25zdCB1cGRhdGUgPSAoKSA9PiB0cy52YWx1ZSA9IHRpbWVzdGFtcCgpICsgb2Zmc2V0O1xuXHRjb25zdCBjb250cm9scyA9IHNjaGVkdWxlcihjYWxsYmFjayA/ICgpID0+IHtcblx0XHR1cGRhdGUoKTtcblx0XHRjYWxsYmFjayh0cy52YWx1ZSk7XG5cdH0gOiB1cGRhdGUpO1xuXHRpZiAoZXhwb3NlQ29udHJvbHMpIHJldHVybiB7XG5cdFx0dGltZXN0YW1wOiB0cyxcblx0XHQuLi5jb250cm9sc1xuXHR9O1xuXHRlbHNlIHJldHVybiB0cztcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVGl0bGUvaW5kZXgudHNcbmZ1bmN0aW9uIHVzZVRpdGxlKG5ld1RpdGxlID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfZG9jdW1lbnQkdGl0bGUsIF9yZWY7XG5cdGNvbnN0IHsgZG9jdW1lbnQ6IGRvY3VtZW50JDEgPSBkZWZhdWx0RG9jdW1lbnQsIHJlc3RvcmVPblVubW91bnQgPSAodCkgPT4gdCB9ID0gb3B0aW9ucztcblx0Y29uc3Qgb3JpZ2luYWxUaXRsZSA9IChfZG9jdW1lbnQkdGl0bGUgPSBkb2N1bWVudCQxID09PSBudWxsIHx8IGRvY3VtZW50JDEgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50JDEudGl0bGUpICE9PSBudWxsICYmIF9kb2N1bWVudCR0aXRsZSAhPT0gdm9pZCAwID8gX2RvY3VtZW50JHRpdGxlIDogXCJcIjtcblx0Y29uc3QgdGl0bGUgPSB0b1JlZigoX3JlZiA9IG5ld1RpdGxlICE9PSBudWxsICYmIG5ld1RpdGxlICE9PSB2b2lkIDAgPyBuZXdUaXRsZSA6IGRvY3VtZW50JDEgPT09IG51bGwgfHwgZG9jdW1lbnQkMSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jdW1lbnQkMS50aXRsZSkgIT09IG51bGwgJiYgX3JlZiAhPT0gdm9pZCAwID8gX3JlZiA6IG51bGwpO1xuXHRjb25zdCBpc1JlYWRvbmx5JDEgPSAhIShuZXdUaXRsZSAmJiB0eXBlb2YgbmV3VGl0bGUgPT09IFwiZnVuY3Rpb25cIik7XG5cdGZ1bmN0aW9uIGZvcm1hdCh0KSB7XG5cdFx0aWYgKCEoXCJ0aXRsZVRlbXBsYXRlXCIgaW4gb3B0aW9ucykpIHJldHVybiB0O1xuXHRcdGNvbnN0IHRlbXBsYXRlID0gb3B0aW9ucy50aXRsZVRlbXBsYXRlIHx8IFwiJXNcIjtcblx0XHRyZXR1cm4gdHlwZW9mIHRlbXBsYXRlID09PSBcImZ1bmN0aW9uXCIgPyB0ZW1wbGF0ZSh0KSA6IHRvVmFsdWUodGVtcGxhdGUpLnJlcGxhY2UoLyVzL2csIHQpO1xuXHR9XG5cdHdhdGNoKHRpdGxlLCAobmV3VmFsdWUsIG9sZFZhbHVlKSA9PiB7XG5cdFx0aWYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSAmJiBkb2N1bWVudCQxKSBkb2N1bWVudCQxLnRpdGxlID0gZm9ybWF0KG5ld1ZhbHVlICE9PSBudWxsICYmIG5ld1ZhbHVlICE9PSB2b2lkIDAgPyBuZXdWYWx1ZSA6IFwiXCIpO1xuXHR9LCB7IGltbWVkaWF0ZTogdHJ1ZSB9KTtcblx0aWYgKG9wdGlvbnMub2JzZXJ2ZSAmJiAhb3B0aW9ucy50aXRsZVRlbXBsYXRlICYmIGRvY3VtZW50JDEgJiYgIWlzUmVhZG9ubHkkMSkge1xuXHRcdHZhciBfZG9jdW1lbnQkaGVhZDtcblx0XHR1c2VNdXRhdGlvbk9ic2VydmVyKChfZG9jdW1lbnQkaGVhZCA9IGRvY3VtZW50JDEuaGVhZCkgPT09IG51bGwgfHwgX2RvY3VtZW50JGhlYWQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kb2N1bWVudCRoZWFkLnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKSwgKCkgPT4ge1xuXHRcdFx0aWYgKGRvY3VtZW50JDEgJiYgZG9jdW1lbnQkMS50aXRsZSAhPT0gdGl0bGUudmFsdWUpIHRpdGxlLnZhbHVlID0gZm9ybWF0KGRvY3VtZW50JDEudGl0bGUpO1xuXHRcdH0sIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuXHR9XG5cdHRyeU9uU2NvcGVEaXNwb3NlKCgpID0+IHtcblx0XHRpZiAocmVzdG9yZU9uVW5tb3VudCkge1xuXHRcdFx0Y29uc3QgcmVzdG9yZWRUaXRsZSA9IHJlc3RvcmVPblVubW91bnQob3JpZ2luYWxUaXRsZSwgdGl0bGUudmFsdWUgfHwgXCJcIik7XG5cdFx0XHRpZiAocmVzdG9yZWRUaXRsZSAhPSBudWxsICYmIGRvY3VtZW50JDEpIGRvY3VtZW50JDEudGl0bGUgPSByZXN0b3JlZFRpdGxlO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiB0aXRsZTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVHJhbnNpdGlvbi9pbmRleC50c1xuY29uc3QgX1RyYW5zaXRpb25QcmVzZXRzID0ge1xuXHRlYXNlSW5TaW5lOiBbXG5cdFx0LjEyLFxuXHRcdDAsXG5cdFx0LjM5LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFNpbmU6IFtcblx0XHQuNjEsXG5cdFx0MSxcblx0XHQuODgsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRTaW5lOiBbXG5cdFx0LjM3LFxuXHRcdDAsXG5cdFx0LjYzLFxuXHRcdDFcblx0XSxcblx0ZWFzZUluUXVhZDogW1xuXHRcdC4xMSxcblx0XHQwLFxuXHRcdC41LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dFF1YWQ6IFtcblx0XHQuNSxcblx0XHQxLFxuXHRcdC44OSxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dFF1YWQ6IFtcblx0XHQuNDUsXG5cdFx0MCxcblx0XHQuNTUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5DdWJpYzogW1xuXHRcdC4zMixcblx0XHQwLFxuXHRcdC42Nyxcblx0XHQwXG5cdF0sXG5cdGVhc2VPdXRDdWJpYzogW1xuXHRcdC4zMyxcblx0XHQxLFxuXHRcdC42OCxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dEN1YmljOiBbXG5cdFx0LjY1LFxuXHRcdDAsXG5cdFx0LjM1LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluUXVhcnQ6IFtcblx0XHQuNSxcblx0XHQwLFxuXHRcdC43NSxcblx0XHQwXG5cdF0sXG5cdGVhc2VPdXRRdWFydDogW1xuXHRcdC4yNSxcblx0XHQxLFxuXHRcdC41LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0UXVhcnQ6IFtcblx0XHQuNzYsXG5cdFx0MCxcblx0XHQuMjQsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5RdWludDogW1xuXHRcdC42NCxcblx0XHQwLFxuXHRcdC43OCxcblx0XHQwXG5cdF0sXG5cdGVhc2VPdXRRdWludDogW1xuXHRcdC4yMixcblx0XHQxLFxuXHRcdC4zNixcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dFF1aW50OiBbXG5cdFx0LjgzLFxuXHRcdDAsXG5cdFx0LjE3LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluRXhwbzogW1xuXHRcdC43LFxuXHRcdDAsXG5cdFx0Ljg0LFxuXHRcdDBcblx0XSxcblx0ZWFzZU91dEV4cG86IFtcblx0XHQuMTYsXG5cdFx0MSxcblx0XHQuMyxcblx0XHQxXG5cdF0sXG5cdGVhc2VJbk91dEV4cG86IFtcblx0XHQuODcsXG5cdFx0MCxcblx0XHQuMTMsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5DaXJjOiBbXG5cdFx0LjU1LFxuXHRcdDAsXG5cdFx0MSxcblx0XHQuNDVcblx0XSxcblx0ZWFzZU91dENpcmM6IFtcblx0XHQwLFxuXHRcdC41NSxcblx0XHQuNDUsXG5cdFx0MVxuXHRdLFxuXHRlYXNlSW5PdXRDaXJjOiBbXG5cdFx0Ljg1LFxuXHRcdDAsXG5cdFx0LjE1LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluQmFjazogW1xuXHRcdC4zNixcblx0XHQwLFxuXHRcdC42Nixcblx0XHQtLjU2XG5cdF0sXG5cdGVhc2VPdXRCYWNrOiBbXG5cdFx0LjM0LFxuXHRcdDEuNTYsXG5cdFx0LjY0LFxuXHRcdDFcblx0XSxcblx0ZWFzZUluT3V0QmFjazogW1xuXHRcdC42OCxcblx0XHQtLjYsXG5cdFx0LjMyLFxuXHRcdDEuNlxuXHRdXG59O1xuLyoqXG4qIENvbW1vbiB0cmFuc2l0aW9uc1xuKlxuKiBAc2VlIGh0dHBzOi8vZWFzaW5ncy5uZXRcbiovXG5jb25zdCBUcmFuc2l0aW9uUHJlc2V0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuYXNzaWduKHt9LCB7IGxpbmVhcjogaWRlbnRpdHkgfSwgX1RyYW5zaXRpb25QcmVzZXRzKTtcbi8qKlxuKiBDcmVhdGUgYW4gZWFzaW5nIGZ1bmN0aW9uIGZyb20gY3ViaWMgYmV6aWVyIHBvaW50cy5cbiovXG5mdW5jdGlvbiBjcmVhdGVFYXNpbmdGdW5jdGlvbihbcDAsIHAxLCBwMiwgcDNdKSB7XG5cdGNvbnN0IGEgPSAoYTEsIGEyKSA9PiAxIC0gMyAqIGEyICsgMyAqIGExO1xuXHRjb25zdCBiID0gKGExLCBhMikgPT4gMyAqIGEyIC0gNiAqIGExO1xuXHRjb25zdCBjID0gKGExKSA9PiAzICogYTE7XG5cdGNvbnN0IGNhbGNCZXppZXIgPSAodCwgYTEsIGEyKSA9PiAoKGEoYTEsIGEyKSAqIHQgKyBiKGExLCBhMikpICogdCArIGMoYTEpKSAqIHQ7XG5cdGNvbnN0IGdldFNsb3BlID0gKHQsIGExLCBhMikgPT4gMyAqIGEoYTEsIGEyKSAqIHQgKiB0ICsgMiAqIGIoYTEsIGEyKSAqIHQgKyBjKGExKTtcblx0Y29uc3QgZ2V0VGZvclggPSAoeCkgPT4ge1xuXHRcdGxldCBhR3Vlc3NUID0geDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuXHRcdFx0Y29uc3QgY3VycmVudFNsb3BlID0gZ2V0U2xvcGUoYUd1ZXNzVCwgcDAsIHAyKTtcblx0XHRcdGlmIChjdXJyZW50U2xvcGUgPT09IDApIHJldHVybiBhR3Vlc3NUO1xuXHRcdFx0Y29uc3QgY3VycmVudFggPSBjYWxjQmV6aWVyKGFHdWVzc1QsIHAwLCBwMikgLSB4O1xuXHRcdFx0YUd1ZXNzVCAtPSBjdXJyZW50WCAvIGN1cnJlbnRTbG9wZTtcblx0XHR9XG5cdFx0cmV0dXJuIGFHdWVzc1Q7XG5cdH07XG5cdHJldHVybiAoeCkgPT4gcDAgPT09IHAxICYmIHAyID09PSBwMyA/IHggOiBjYWxjQmV6aWVyKGdldFRmb3JYKHgpLCBwMSwgcDMpO1xufVxuZnVuY3Rpb24gbGVycChhLCBiLCBhbHBoYSkge1xuXHRyZXR1cm4gYSArIGFscGhhICogKGIgLSBhKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRJbnRlcnBvbGF0aW9uKGEsIGIsIHQpIHtcblx0Y29uc3QgYVZhbCA9IHRvVmFsdWUoYSk7XG5cdGNvbnN0IGJWYWwgPSB0b1ZhbHVlKGIpO1xuXHRpZiAodHlwZW9mIGFWYWwgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwibnVtYmVyXCIpIHJldHVybiBsZXJwKGFWYWwsIGJWYWwsIHQpO1xuXHRpZiAoQXJyYXkuaXNBcnJheShhVmFsKSAmJiBBcnJheS5pc0FycmF5KGJWYWwpKSByZXR1cm4gYVZhbC5tYXAoKHYsIGkpID0+IGxlcnAodiwgdG9WYWx1ZShiVmFsW2ldKSwgdCkpO1xuXHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biB0cmFuc2l0aW9uIHR5cGUsIHNwZWNpZnkgYW4gaW50ZXJwb2xhdGlvbiBmdW5jdGlvbi5cIik7XG59XG5mdW5jdGlvbiBub3JtYWxpemVFYXNpbmcoZWFzaW5nKSB7XG5cdHZhciBfdG9WYWx1ZTtcblx0cmV0dXJuIHR5cGVvZiBlYXNpbmcgPT09IFwiZnVuY3Rpb25cIiA/IGVhc2luZyA6IChfdG9WYWx1ZSA9IHRvVmFsdWUoZWFzaW5nKSkgIT09IG51bGwgJiYgX3RvVmFsdWUgIT09IHZvaWQgMCA/IF90b1ZhbHVlIDogaWRlbnRpdHk7XG59XG4vKipcbiogVHJhbnNpdGlvbiBmcm9tIG9uZSB2YWx1ZSB0byBhbm90aGVyLlxuKlxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBmcm9tXG4qIEBwYXJhbSB0b1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHRyYW5zaXRpb24oc291cmNlLCBmcm9tLCB0bywgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfdG9WYWx1ZTI7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGZyb21WYWwgPSB0b1ZhbHVlKGZyb20pO1xuXHRjb25zdCB0b1ZhbCA9IHRvVmFsdWUodG8pO1xuXHRjb25zdCBkdXJhdGlvbiA9IChfdG9WYWx1ZTIgPSB0b1ZhbHVlKG9wdGlvbnMuZHVyYXRpb24pKSAhPT0gbnVsbCAmJiBfdG9WYWx1ZTIgIT09IHZvaWQgMCA/IF90b1ZhbHVlMiA6IDFlMztcblx0Y29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblx0Y29uc3QgZW5kQXQgPSBEYXRlLm5vdygpICsgZHVyYXRpb247XG5cdGNvbnN0IGludGVycG9sYXRpb24gPSB0eXBlb2Ygb3B0aW9ucy5pbnRlcnBvbGF0aW9uID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLmludGVycG9sYXRpb24gOiBkZWZhdWx0SW50ZXJwb2xhdGlvbjtcblx0Y29uc3QgdHJhbnMgPSB0eXBlb2Ygb3B0aW9ucy5lYXNpbmcgIT09IFwidW5kZWZpbmVkXCIgPyBub3JtYWxpemVFYXNpbmcob3B0aW9ucy5lYXNpbmcpIDogbm9ybWFsaXplRWFzaW5nKG9wdGlvbnMudHJhbnNpdGlvbik7XG5cdGNvbnN0IGVhc2UgPSB0eXBlb2YgdHJhbnMgPT09IFwiZnVuY3Rpb25cIiA/IHRyYW5zIDogY3JlYXRlRWFzaW5nRnVuY3Rpb24odHJhbnMpO1xuXHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRzb3VyY2UudmFsdWUgPSBmcm9tVmFsO1xuXHRcdGNvbnN0IHRpY2sgPSAoKSA9PiB7XG5cdFx0XHR2YXIgX29wdGlvbnMkYWJvcnQ7XG5cdFx0XHRpZiAoKF9vcHRpb25zJGFib3J0ID0gb3B0aW9ucy5hYm9ydCkgPT09IG51bGwgfHwgX29wdGlvbnMkYWJvcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9vcHRpb25zJGFib3J0LmNhbGwob3B0aW9ucykpIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRcdFx0c291cmNlLnZhbHVlID0gaW50ZXJwb2xhdGlvbihmcm9tVmFsLCB0b1ZhbCwgZWFzZSgobm93IC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uKSk7XG5cdFx0XHRpZiAobm93IDwgZW5kQXQpIHdpbmRvdyQxID09PSBudWxsIHx8IHdpbmRvdyQxID09PSB2b2lkIDAgfHwgd2luZG93JDEucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHNvdXJjZS52YWx1ZSA9IHRvVmFsO1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0aWNrKCk7XG5cdH0pO1xufVxuLyoqXG4qIFRyYW5zaXRpb24gZnJvbSBvbmUgdmFsdWUgdG8gYW5vdGhlci5cbiogQGRlcHJlY2F0ZWQgVGhlIGBleGVjdXRlVHJhbnNpdGlvbmAgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgdXNlIGB0cmFuc2l0aW9uYCBpbnN0ZWFkLlxuKlxuKiBAcGFyYW0gc291cmNlXG4qIEBwYXJhbSBmcm9tXG4qIEBwYXJhbSB0b1xuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIGV4ZWN1dGVUcmFuc2l0aW9uKHNvdXJjZSwgZnJvbSwgdG8sIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gdHJhbnNpdGlvbihzb3VyY2UsIGZyb20sIHRvLCBvcHRpb25zKTtcbn1cbi8qKlxuKiBGb2xsb3cgdmFsdWUgd2l0aCBhIHRyYW5zaXRpb24uXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVRyYW5zaXRpb25cbiogQHBhcmFtIHNvdXJjZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb24oc291cmNlLCBvcHRpb25zID0ge30pIHtcblx0bGV0IGN1cnJlbnRJZCA9IDA7XG5cdGNvbnN0IHNvdXJjZVZhbCA9ICgpID0+IHtcblx0XHRjb25zdCB2ID0gdG9WYWx1ZShzb3VyY2UpO1xuXHRcdHJldHVybiB0eXBlb2Ygb3B0aW9ucy5pbnRlcnBvbGF0aW9uID09PSBcInVuZGVmaW5lZFwiICYmIEFycmF5LmlzQXJyYXkodikgPyB2Lm1hcCh0b1ZhbHVlKSA6IHY7XG5cdH07XG5cdGNvbnN0IG91dHB1dFJlZiA9IHNoYWxsb3dSZWYoc291cmNlVmFsKCkpO1xuXHR3YXRjaChzb3VyY2VWYWwsIGFzeW5jICh0bykgPT4ge1xuXHRcdHZhciBfb3B0aW9ucyRvblN0YXJ0ZWQsIF9vcHRpb25zJG9uRmluaXNoZWQ7XG5cdFx0aWYgKHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCkpIHJldHVybjtcblx0XHRjb25zdCBpZCA9ICsrY3VycmVudElkO1xuXHRcdGlmIChvcHRpb25zLmRlbGF5KSBhd2FpdCBwcm9taXNlVGltZW91dCh0b1ZhbHVlKG9wdGlvbnMuZGVsYXkpKTtcblx0XHRpZiAoaWQgIT09IGN1cnJlbnRJZCkgcmV0dXJuO1xuXHRcdChfb3B0aW9ucyRvblN0YXJ0ZWQgPSBvcHRpb25zLm9uU3RhcnRlZCkgPT09IG51bGwgfHwgX29wdGlvbnMkb25TdGFydGVkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25TdGFydGVkLmNhbGwob3B0aW9ucyk7XG5cdFx0YXdhaXQgdHJhbnNpdGlvbihvdXRwdXRSZWYsIG91dHB1dFJlZi52YWx1ZSwgdG8sIHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRhYm9ydDogKCkgPT4ge1xuXHRcdFx0XHR2YXIgX29wdGlvbnMkYWJvcnQyO1xuXHRcdFx0XHRyZXR1cm4gaWQgIT09IGN1cnJlbnRJZCB8fCAoKF9vcHRpb25zJGFib3J0MiA9IG9wdGlvbnMuYWJvcnQpID09PSBudWxsIHx8IF9vcHRpb25zJGFib3J0MiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX29wdGlvbnMkYWJvcnQyLmNhbGwob3B0aW9ucykpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdChfb3B0aW9ucyRvbkZpbmlzaGVkID0gb3B0aW9ucy5vbkZpbmlzaGVkKSA9PT0gbnVsbCB8fCBfb3B0aW9ucyRvbkZpbmlzaGVkID09PSB2b2lkIDAgfHwgX29wdGlvbnMkb25GaW5pc2hlZC5jYWxsKG9wdGlvbnMpO1xuXHR9LCB7IGRlZXA6IHRydWUgfSk7XG5cdHdhdGNoKCgpID0+IHRvVmFsdWUob3B0aW9ucy5kaXNhYmxlZCksIChkaXNhYmxlZCkgPT4ge1xuXHRcdGlmIChkaXNhYmxlZCkge1xuXHRcdFx0Y3VycmVudElkKys7XG5cdFx0XHRvdXRwdXRSZWYudmFsdWUgPSBzb3VyY2VWYWwoKTtcblx0XHR9XG5cdH0pO1xuXHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0Y3VycmVudElkKys7XG5cdH0pO1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4gdG9WYWx1ZShvcHRpb25zLmRpc2FibGVkKSA/IHNvdXJjZVZhbCgpIDogb3V0cHV0UmVmLnZhbHVlKTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVXJsU2VhcmNoUGFyYW1zL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmUgVVJMU2VhcmNoUGFyYW1zXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVVybFNlYXJjaFBhcmFtc1xuKiBAcGFyYW0gbW9kZVxuKiBAcGFyYW0gb3B0aW9uc1xuKi9cbmZ1bmN0aW9uIHVzZVVybFNlYXJjaFBhcmFtcyhtb2RlID0gXCJoaXN0b3J5XCIsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGluaXRpYWxWYWx1ZSA9IHt9LCByZW1vdmVOdWxsaXNoVmFsdWVzID0gdHJ1ZSwgcmVtb3ZlRmFsc3lWYWx1ZXMgPSBmYWxzZSwgd3JpdGU6IGVuYWJsZVdyaXRlID0gdHJ1ZSwgd3JpdGVNb2RlID0gXCJyZXBsYWNlXCIsIHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCBzdHJpbmdpZnkgPSAocGFyYW1zKSA9PiBwYXJhbXMudG9TdHJpbmcoKSB9ID0gb3B0aW9ucztcblx0aWYgKCF3aW5kb3ckMSkgcmV0dXJuIHJlYWN0aXZlKGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IHN0YXRlID0gcmVhY3RpdmUoe30pO1xuXHRmdW5jdGlvbiBnZXRSYXdQYXJhbXMoKSB7XG5cdFx0aWYgKG1vZGUgPT09IFwiaGlzdG9yeVwiKSByZXR1cm4gd2luZG93JDEubG9jYXRpb24uc2VhcmNoIHx8IFwiXCI7XG5cdFx0ZWxzZSBpZiAobW9kZSA9PT0gXCJoYXNoXCIpIHtcblx0XHRcdGNvbnN0IGhhc2ggPSB3aW5kb3ckMS5sb2NhdGlvbi5oYXNoIHx8IFwiXCI7XG5cdFx0XHRjb25zdCBpbmRleCA9IGhhc2guaW5kZXhPZihcIj9cIik7XG5cdFx0XHRyZXR1cm4gaW5kZXggPiAwID8gaGFzaC5zbGljZShpbmRleCkgOiBcIlwiO1xuXHRcdH0gZWxzZSByZXR1cm4gKHdpbmRvdyQxLmxvY2F0aW9uLmhhc2ggfHwgXCJcIikucmVwbGFjZSgvXiMvLCBcIlwiKTtcblx0fVxuXHRmdW5jdGlvbiBjb25zdHJ1Y3RRdWVyeShwYXJhbXMpIHtcblx0XHRjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeShwYXJhbXMpO1xuXHRcdGlmIChtb2RlID09PSBcImhpc3RvcnlcIikgcmV0dXJuIGAke3N0cmluZ2lmaWVkID8gYD8ke3N0cmluZ2lmaWVkfWAgOiBcIlwifSR7d2luZG93JDEubG9jYXRpb24uaGFzaCB8fCBcIlwifWA7XG5cdFx0aWYgKG1vZGUgPT09IFwiaGFzaC1wYXJhbXNcIikgcmV0dXJuIGAke3dpbmRvdyQxLmxvY2F0aW9uLnNlYXJjaCB8fCBcIlwifSR7c3RyaW5naWZpZWQgPyBgIyR7c3RyaW5naWZpZWR9YCA6IFwiXCJ9YDtcblx0XHRjb25zdCBoYXNoID0gd2luZG93JDEubG9jYXRpb24uaGFzaCB8fCBcIiNcIjtcblx0XHRjb25zdCBpbmRleCA9IGhhc2guaW5kZXhPZihcIj9cIik7XG5cdFx0aWYgKGluZGV4ID4gMCkgcmV0dXJuIGAke3dpbmRvdyQxLmxvY2F0aW9uLnNlYXJjaCB8fCBcIlwifSR7aGFzaC5zbGljZSgwLCBpbmRleCl9JHtzdHJpbmdpZmllZCA/IGA/JHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuXHRcdHJldHVybiBgJHt3aW5kb3ckMS5sb2NhdGlvbi5zZWFyY2ggfHwgXCJcIn0ke2hhc2h9JHtzdHJpbmdpZmllZCA/IGA/JHtzdHJpbmdpZmllZH1gIDogXCJcIn1gO1xuXHR9XG5cdGZ1bmN0aW9uIHJlYWQoKSB7XG5cdFx0cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoZ2V0UmF3UGFyYW1zKCkpO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVN0YXRlKHBhcmFtcykge1xuXHRcdGNvbnN0IHVudXNlZEtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHN0YXRlKSk7XG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgcGFyYW1zLmtleXMoKSkge1xuXHRcdFx0Y29uc3QgcGFyYW1zRm9yS2V5ID0gcGFyYW1zLmdldEFsbChrZXkpO1xuXHRcdFx0c3RhdGVba2V5XSA9IHBhcmFtc0ZvcktleS5sZW5ndGggPiAxID8gcGFyYW1zRm9yS2V5IDogcGFyYW1zLmdldChrZXkpIHx8IFwiXCI7XG5cdFx0XHR1bnVzZWRLZXlzLmRlbGV0ZShrZXkpO1xuXHRcdH1cblx0XHRBcnJheS5mcm9tKHVudXNlZEtleXMpLmZvckVhY2goKGtleSkgPT4gZGVsZXRlIHN0YXRlW2tleV0pO1xuXHR9XG5cdGNvbnN0IHsgcGF1c2UsIHJlc3VtZSB9ID0gd2F0Y2hQYXVzYWJsZShzdGF0ZSwgKCkgPT4ge1xuXHRcdGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoXCJcIik7XG5cdFx0T2JqZWN0LmtleXMoc3RhdGUpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgbWFwRW50cnkgPSBzdGF0ZVtrZXldO1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkobWFwRW50cnkpKSBtYXBFbnRyeS5mb3JFYWNoKCh2YWx1ZSkgPT4gcGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKSk7XG5cdFx0XHRlbHNlIGlmIChyZW1vdmVOdWxsaXNoVmFsdWVzICYmIG1hcEVudHJ5ID09IG51bGwpIHBhcmFtcy5kZWxldGUoa2V5KTtcblx0XHRcdGVsc2UgaWYgKHJlbW92ZUZhbHN5VmFsdWVzICYmICFtYXBFbnRyeSkgcGFyYW1zLmRlbGV0ZShrZXkpO1xuXHRcdFx0ZWxzZSBwYXJhbXMuc2V0KGtleSwgbWFwRW50cnkpO1xuXHRcdH0pO1xuXHRcdHdyaXRlKHBhcmFtcywgZmFsc2UpO1xuXHR9LCB7IGRlZXA6IHRydWUgfSk7XG5cdGZ1bmN0aW9uIHdyaXRlKHBhcmFtcywgc2hvdWxkVXBkYXRlLCBzaG91bGRXcml0ZUhpc3RvcnkgPSB0cnVlKSB7XG5cdFx0cGF1c2UoKTtcblx0XHRpZiAoc2hvdWxkVXBkYXRlKSB1cGRhdGVTdGF0ZShwYXJhbXMpO1xuXHRcdGlmICh3cml0ZU1vZGUgPT09IFwicmVwbGFjZVwiKSB3aW5kb3ckMS5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh3aW5kb3ckMS5oaXN0b3J5LnN0YXRlLCB3aW5kb3ckMS5kb2N1bWVudC50aXRsZSwgd2luZG93JDEubG9jYXRpb24ucGF0aG5hbWUgKyBjb25zdHJ1Y3RRdWVyeShwYXJhbXMpKTtcblx0XHRlbHNlIGlmIChzaG91bGRXcml0ZUhpc3RvcnkpIHdpbmRvdyQxLmhpc3RvcnkucHVzaFN0YXRlKHdpbmRvdyQxLmhpc3Rvcnkuc3RhdGUsIHdpbmRvdyQxLmRvY3VtZW50LnRpdGxlLCB3aW5kb3ckMS5sb2NhdGlvbi5wYXRobmFtZSArIGNvbnN0cnVjdFF1ZXJ5KHBhcmFtcykpO1xuXHRcdG5leHRUaWNrKCgpID0+IHJlc3VtZSgpKTtcblx0fVxuXHRmdW5jdGlvbiBvbkNoYW5nZWQoKSB7XG5cdFx0aWYgKCFlbmFibGVXcml0ZSkgcmV0dXJuO1xuXHRcdHdyaXRlKHJlYWQoKSwgdHJ1ZSwgZmFsc2UpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcInBvcHN0YXRlXCIsIG9uQ2hhbmdlZCwgbGlzdGVuZXJPcHRpb25zKTtcblx0aWYgKG1vZGUgIT09IFwiaGlzdG9yeVwiKSB1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImhhc2hjaGFuZ2VcIiwgb25DaGFuZ2VkLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRjb25zdCBpbml0aWFsID0gcmVhZCgpO1xuXHRpZiAoaW5pdGlhbC5rZXlzKCkubmV4dCgpLnZhbHVlKSB1cGRhdGVTdGF0ZShpbml0aWFsKTtcblx0ZWxzZSBPYmplY3QuYXNzaWduKHN0YXRlLCBpbml0aWFsVmFsdWUpO1xuXHRyZXR1cm4gc3RhdGU7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVVzZXJNZWRpYS9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIGBtZWRpYURldmljZXMuZ2V0VXNlck1lZGlhYCBzdHJlYW1pbmdcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVXNlck1lZGlhXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlVXNlck1lZGlhKG9wdGlvbnMgPSB7fSkge1xuXHR2YXIgX29wdGlvbnMkZW5hYmxlZCwgX29wdGlvbnMkYXV0b1N3aXRjaDtcblx0Y29uc3QgZW5hYmxlZCA9IHNoYWxsb3dSZWYoKF9vcHRpb25zJGVuYWJsZWQgPSBvcHRpb25zLmVuYWJsZWQpICE9PSBudWxsICYmIF9vcHRpb25zJGVuYWJsZWQgIT09IHZvaWQgMCA/IF9vcHRpb25zJGVuYWJsZWQgOiBmYWxzZSk7XG5cdGNvbnN0IGF1dG9Td2l0Y2ggPSBzaGFsbG93UmVmKChfb3B0aW9ucyRhdXRvU3dpdGNoID0gb3B0aW9ucy5hdXRvU3dpdGNoKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyRhdXRvU3dpdGNoICE9PSB2b2lkIDAgPyBfb3B0aW9ucyRhdXRvU3dpdGNoIDogdHJ1ZSk7XG5cdGNvbnN0IGNvbnN0cmFpbnRzID0gcmVmKG9wdGlvbnMuY29uc3RyYWludHMpO1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yIH0gPSBvcHRpb25zO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4ge1xuXHRcdHZhciBfbmF2aWdhdG9yJG1lZGlhRGV2aWM7XG5cdFx0cmV0dXJuIG5hdmlnYXRvciQxID09PSBudWxsIHx8IG5hdmlnYXRvciQxID09PSB2b2lkIDAgfHwgKF9uYXZpZ2F0b3IkbWVkaWFEZXZpYyA9IG5hdmlnYXRvciQxLm1lZGlhRGV2aWNlcykgPT09IG51bGwgfHwgX25hdmlnYXRvciRtZWRpYURldmljID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfbmF2aWdhdG9yJG1lZGlhRGV2aWMuZ2V0VXNlck1lZGlhO1xuXHR9KTtcblx0Y29uc3Qgc3RyZWFtID0gc2hhbGxvd1JlZigpO1xuXHRmdW5jdGlvbiBnZXREZXZpY2VPcHRpb25zKHR5cGUpIHtcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0XHRpZiAoY29uc3RyYWludHMudmFsdWUpIHJldHVybiBjb25zdHJhaW50cy52YWx1ZS52aWRlbyB8fCBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiYXVkaW9cIjpcblx0XHRcdFx0aWYgKGNvbnN0cmFpbnRzLnZhbHVlKSByZXR1cm4gY29uc3RyYWludHMudmFsdWUuYXVkaW8gfHwgZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXHRhc3luYyBmdW5jdGlvbiBfc3RhcnQoKSB7XG5cdFx0aWYgKCFpc1N1cHBvcnRlZC52YWx1ZSB8fCBzdHJlYW0udmFsdWUpIHJldHVybjtcblx0XHRzdHJlYW0udmFsdWUgPSBhd2FpdCBuYXZpZ2F0b3IkMS5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcblx0XHRcdHZpZGVvOiBnZXREZXZpY2VPcHRpb25zKFwidmlkZW9cIiksXG5cdFx0XHRhdWRpbzogZ2V0RGV2aWNlT3B0aW9ucyhcImF1ZGlvXCIpXG5cdFx0fSk7XG5cdFx0cmV0dXJuIHN0cmVhbS52YWx1ZTtcblx0fVxuXHRmdW5jdGlvbiBfc3RvcCgpIHtcblx0XHR2YXIgX3N0cmVhbSR2YWx1ZTtcblx0XHQoX3N0cmVhbSR2YWx1ZSA9IHN0cmVhbS52YWx1ZSkgPT09IG51bGwgfHwgX3N0cmVhbSR2YWx1ZSA9PT0gdm9pZCAwIHx8IF9zdHJlYW0kdmFsdWUuZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuXHRcdHN0cmVhbS52YWx1ZSA9IHZvaWQgMDtcblx0fVxuXHRmdW5jdGlvbiBzdG9wKCkge1xuXHRcdF9zdG9wKCk7XG5cdFx0ZW5hYmxlZC52YWx1ZSA9IGZhbHNlO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuXHRcdGF3YWl0IF9zdGFydCgpO1xuXHRcdGlmIChzdHJlYW0udmFsdWUpIGVuYWJsZWQudmFsdWUgPSB0cnVlO1xuXHRcdHJldHVybiBzdHJlYW0udmFsdWU7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVzdGFydCgpIHtcblx0XHRfc3RvcCgpO1xuXHRcdHJldHVybiBhd2FpdCBzdGFydCgpO1xuXHR9XG5cdHdhdGNoKGVuYWJsZWQsICh2KSA9PiB7XG5cdFx0aWYgKHYpIF9zdGFydCgpO1xuXHRcdGVsc2UgX3N0b3AoKTtcblx0fSwgeyBpbW1lZGlhdGU6IHRydWUgfSk7XG5cdHdhdGNoKGNvbnN0cmFpbnRzLCAoKSA9PiB7XG5cdFx0aWYgKGF1dG9Td2l0Y2gudmFsdWUgJiYgc3RyZWFtLnZhbHVlKSByZXN0YXJ0KCk7XG5cdH0sIHtcblx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0ZGVlcDogdHJ1ZVxuXHR9KTtcblx0dHJ5T25TY29wZURpc3Bvc2UoKCkgPT4ge1xuXHRcdHN0b3AoKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0c3RyZWFtLFxuXHRcdHN0YXJ0LFxuXHRcdHN0b3AsXG5cdFx0cmVzdGFydCxcblx0XHRjb25zdHJhaW50cyxcblx0XHRlbmFibGVkLFxuXHRcdGF1dG9Td2l0Y2hcblx0fTtcbn1cblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlVk1vZGVsL2luZGV4LnRzXG4vKipcbiogU2hvcnRoYW5kIGZvciB2LW1vZGVsIGJpbmRpbmcsIHByb3BzICsgZW1pdCAtPiByZWZcbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlVk1vZGVsXG4qIEBwYXJhbSBwcm9wc1xuKiBAcGFyYW0ga2V5IChkZWZhdWx0ICdtb2RlbFZhbHVlJylcbiogQHBhcmFtIGVtaXRcbiogQHBhcmFtIG9wdGlvbnNcbipcbiogQF9fTk9fU0lERV9FRkZFQ1RTX19cbiovXG5mdW5jdGlvbiB1c2VWTW9kZWwocHJvcHMsIGtleSwgZW1pdCwgb3B0aW9ucyA9IHt9KSB7XG5cdHZhciBfdm0kJGVtaXQsIF92bSRwcm94eTtcblx0Y29uc3QgeyBjbG9uZSA9IGZhbHNlLCBwYXNzaXZlID0gZmFsc2UsIGV2ZW50TmFtZSwgZGVlcCA9IGZhbHNlLCBkZWZhdWx0VmFsdWUsIHNob3VsZEVtaXQgfSA9IG9wdGlvbnM7XG5cdGNvbnN0IHZtID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG5cdGNvbnN0IF9lbWl0ID0gZW1pdCB8fCAodm0gPT09IG51bGwgfHwgdm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZtLmVtaXQpIHx8ICh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwIHx8IChfdm0kJGVtaXQgPSB2bS4kZW1pdCkgPT09IG51bGwgfHwgX3ZtJCRlbWl0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdm0kJGVtaXQuYmluZCh2bSkpIHx8ICh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwIHx8IChfdm0kcHJveHkgPSB2bS5wcm94eSkgPT09IG51bGwgfHwgX3ZtJHByb3h5ID09PSB2b2lkIDAgfHwgKF92bSRwcm94eSA9IF92bSRwcm94eS4kZW1pdCkgPT09IG51bGwgfHwgX3ZtJHByb3h5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfdm0kcHJveHkuYmluZCh2bSA9PT0gbnVsbCB8fCB2bSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdm0ucHJveHkpKTtcblx0bGV0IGV2ZW50ID0gZXZlbnROYW1lO1xuXHRpZiAoIWtleSkga2V5ID0gXCJtb2RlbFZhbHVlXCI7XG5cdGV2ZW50ID0gZXZlbnQgfHwgYHVwZGF0ZToke2tleS50b1N0cmluZygpfWA7XG5cdGNvbnN0IGNsb25lRm4gPSAodmFsKSA9PiAhY2xvbmUgPyB2YWwgOiB0eXBlb2YgY2xvbmUgPT09IFwiZnVuY3Rpb25cIiA/IGNsb25lKHZhbCkgOiBjbG9uZUZuSlNPTih2YWwpO1xuXHRjb25zdCBnZXRWYWx1ZSQxID0gKCkgPT4gaXNEZWYocHJvcHNba2V5XSkgPyBjbG9uZUZuKHByb3BzW2tleV0pIDogZGVmYXVsdFZhbHVlO1xuXHRjb25zdCB0cmlnZ2VyRW1pdCA9ICh2YWx1ZSkgPT4ge1xuXHRcdGlmIChzaG91bGRFbWl0KSB7XG5cdFx0XHRpZiAoc2hvdWxkRW1pdCh2YWx1ZSkpIF9lbWl0KGV2ZW50LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIF9lbWl0KGV2ZW50LCB2YWx1ZSk7XG5cdH07XG5cdGlmIChwYXNzaXZlKSB7XG5cdFx0Y29uc3QgcHJveHkgPSByZWYoZ2V0VmFsdWUkMSgpKTtcblx0XHRsZXQgaXNVcGRhdGluZyA9IGZhbHNlO1xuXHRcdHdhdGNoKCgpID0+IHByb3BzW2tleV0sICh2KSA9PiB7XG5cdFx0XHRpZiAoIWlzVXBkYXRpbmcpIHtcblx0XHRcdFx0aXNVcGRhdGluZyA9IHRydWU7XG5cdFx0XHRcdHByb3h5LnZhbHVlID0gY2xvbmVGbih2KTtcblx0XHRcdFx0bmV4dFRpY2soKCkgPT4gaXNVcGRhdGluZyA9IGZhbHNlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHR3YXRjaChwcm94eSwgKHYpID0+IHtcblx0XHRcdGlmICghaXNVcGRhdGluZyAmJiAodiAhPT0gcHJvcHNba2V5XSB8fCBkZWVwKSkgdHJpZ2dlckVtaXQodik7XG5cdFx0fSwgeyBkZWVwIH0pO1xuXHRcdHJldHVybiBwcm94eTtcblx0fSBlbHNlIHJldHVybiBjb21wdXRlZCh7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGdldFZhbHVlJDEoKTtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0dHJpZ2dlckVtaXQodmFsdWUpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVZNb2RlbHMvaW5kZXgudHNcbi8qKlxuKiBTaG9ydGhhbmQgZm9yIHByb3BzIHYtbW9kZWwgYmluZGluZy4gVGhpbmsgbGlrZSBgdG9SZWZzKHByb3BzKWAgYnV0IGNoYW5nZXMgd2lsbCBhbHNvIGVtaXQgb3V0LlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VWTW9kZWxzXG4qIEBwYXJhbSBwcm9wc1xuKiBAcGFyYW0gZW1pdFxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVZNb2RlbHMocHJvcHMsIGVtaXQsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCByZXQgPSB7fTtcblx0Zm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHJldFtrZXldID0gdXNlVk1vZGVsKHByb3BzLCBrZXksIGVtaXQsIG9wdGlvbnMpO1xuXHRyZXR1cm4gcmV0O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VWaWJyYXRlL2luZGV4LnRzXG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyJDEob3B0aW9ucyA9IHsgaW50ZXJ2YWw6IDAgfSkge1xuXHRjb25zdCB7IGludGVydmFsIH0gPSBvcHRpb25zO1xuXHRpZiAoaW50ZXJ2YWwgPT09IDApIHJldHVybjtcblx0cmV0dXJuIChmbikgPT4gdXNlSW50ZXJ2YWxGbihmbiwgaW50ZXJ2YWwsIHtcblx0XHRpbW1lZGlhdGU6IGZhbHNlLFxuXHRcdGltbWVkaWF0ZUNhbGxiYWNrOiBmYWxzZVxuXHR9KTtcbn1cbi8qKlxuKiBSZWFjdGl2ZSB2aWJyYXRlXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVZpYnJhdGVcbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVmlicmF0aW9uX0FQSVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVZpYnJhdGUob3B0aW9ucykge1xuXHRjb25zdCB7IHBhdHRlcm4gPSBbXSwgc2NoZWR1bGVyID0gZ2V0RGVmYXVsdFNjaGVkdWxlciQxKG9wdGlvbnMpLCBuYXZpZ2F0b3I6IG5hdmlnYXRvciQxID0gZGVmYXVsdE5hdmlnYXRvciB9ID0gb3B0aW9ucyB8fCB7fTtcblx0Y29uc3QgaXNTdXBwb3J0ZWQgPSAvKiBAX19QVVJFX18gKi8gdXNlU3VwcG9ydGVkKCgpID0+IHR5cGVvZiBuYXZpZ2F0b3IkMSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBcInZpYnJhdGVcIiBpbiBuYXZpZ2F0b3IkMSk7XG5cdGNvbnN0IHBhdHRlcm5SZWYgPSB0b1JlZihwYXR0ZXJuKTtcblx0Y29uc3QgdmlicmF0ZSA9IChwYXR0ZXJuJDEgPSBwYXR0ZXJuUmVmLnZhbHVlKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS52aWJyYXRlKHBhdHRlcm4kMSk7XG5cdH07XG5cdGNvbnN0IGludGVydmFsQ29udHJvbHMgPSBzY2hlZHVsZXIgPT09IG51bGwgfHwgc2NoZWR1bGVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY2hlZHVsZXIodmlicmF0ZSk7XG5cdGNvbnN0IHN0b3AgPSAoKSA9PiB7XG5cdFx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlKSBuYXZpZ2F0b3IkMS52aWJyYXRlKDApO1xuXHRcdGludGVydmFsQ29udHJvbHMgPT09IG51bGwgfHwgaW50ZXJ2YWxDb250cm9scyA9PT0gdm9pZCAwIHx8IGludGVydmFsQ29udHJvbHMucGF1c2UoKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRwYXR0ZXJuLFxuXHRcdGludGVydmFsQ29udHJvbHMsXG5cdFx0dmlicmF0ZSxcblx0XHRzdG9wXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVZpcnR1YWxMaXN0L2luZGV4LnRzXG4vKipcbiogUGxlYXNlIGNvbnNpZGVyIHVzaW5nIFtgdnVlLXZpcnR1YWwtc2Nyb2xsZXJgXShodHRwczovL2dpdGh1Yi5jb20vQWtyeXVtL3Z1ZS12aXJ0dWFsLXNjcm9sbGVyKSBpZiB5b3UgYXJlIGxvb2tpbmcgZm9yIG1vcmUgZmVhdHVyZXMuXG4qL1xuZnVuY3Rpb24gdXNlVmlydHVhbExpc3QobGlzdCwgb3B0aW9ucykge1xuXHRjb25zdCB7IGNvbnRhaW5lclN0eWxlLCB3cmFwcGVyUHJvcHMsIHNjcm9sbFRvLCBjYWxjdWxhdGVSYW5nZSwgY3VycmVudExpc3QsIGNvbnRhaW5lclJlZiB9ID0gXCJpdGVtSGVpZ2h0XCIgaW4gb3B0aW9ucyA/IHVzZVZlcnRpY2FsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCkgOiB1c2VIb3Jpem9udGFsVmlydHVhbExpc3Qob3B0aW9ucywgbGlzdCk7XG5cdHJldHVybiB7XG5cdFx0bGlzdDogY3VycmVudExpc3QsXG5cdFx0c2Nyb2xsVG8sXG5cdFx0Y29udGFpbmVyUHJvcHM6IHtcblx0XHRcdHJlZjogY29udGFpbmVyUmVmLFxuXHRcdFx0b25TY3JvbGw6ICgpID0+IHtcblx0XHRcdFx0Y2FsY3VsYXRlUmFuZ2UoKTtcblx0XHRcdH0sXG5cdFx0XHRzdHlsZTogY29udGFpbmVyU3R5bGVcblx0XHR9LFxuXHRcdHdyYXBwZXJQcm9wc1xuXHR9O1xufVxuZnVuY3Rpb24gdXNlVmlydHVhbExpc3RSZXNvdXJjZXMobGlzdCkge1xuXHRjb25zdCBjb250YWluZXJSZWYgPSBzaGFsbG93UmVmKG51bGwpO1xuXHRjb25zdCBzaXplID0gdXNlRWxlbWVudFNpemUoY29udGFpbmVyUmVmKTtcblx0Y29uc3QgY3VycmVudExpc3QgPSByZWYoW10pO1xuXHRjb25zdCBzb3VyY2UgPSBzaGFsbG93UmVmKGxpc3QpO1xuXHRyZXR1cm4ge1xuXHRcdHN0YXRlOiByZWYoe1xuXHRcdFx0c3RhcnQ6IDAsXG5cdFx0XHRlbmQ6IDEwXG5cdFx0fSksXG5cdFx0c291cmNlLFxuXHRcdGN1cnJlbnRMaXN0LFxuXHRcdHNpemUsXG5cdFx0Y29udGFpbmVyUmVmXG5cdH07XG59XG5mdW5jdGlvbiBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbVNpemUpIHtcblx0cmV0dXJuIChjb250YWluZXJTaXplKSA9PiB7XG5cdFx0aWYgKHR5cGVvZiBpdGVtU2l6ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuXHRcdGNvbnN0IHsgc3RhcnQgPSAwIH0gPSBzdGF0ZS52YWx1ZTtcblx0XHRsZXQgc3VtID0gMDtcblx0XHRsZXQgY2FwYWNpdHkgPSAwO1xuXHRcdGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHNvdXJjZS52YWx1ZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc2l6ZSA9IGl0ZW1TaXplKGkpO1xuXHRcdFx0c3VtICs9IHNpemU7XG5cdFx0XHRjYXBhY2l0eSA9IGk7XG5cdFx0XHRpZiAoc3VtID4gY29udGFpbmVyU2l6ZSkgYnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBjYXBhY2l0eSAtIHN0YXJ0O1xuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlR2V0T2Zmc2V0KHNvdXJjZSwgaXRlbVNpemUpIHtcblx0cmV0dXJuIChzY3JvbGxEaXJlY3Rpb24pID0+IHtcblx0XHRpZiAodHlwZW9mIGl0ZW1TaXplID09PSBcIm51bWJlclwiKSByZXR1cm4gTWF0aC5mbG9vcihzY3JvbGxEaXJlY3Rpb24gLyBpdGVtU2l6ZSkgKyAxO1xuXHRcdGxldCBzdW0gPSAwO1xuXHRcdGxldCBvZmZzZXQgPSAwO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzaXplID0gaXRlbVNpemUoaSk7XG5cdFx0XHRzdW0gKz0gc2l6ZTtcblx0XHRcdGlmIChzdW0gPj0gc2Nyb2xsRGlyZWN0aW9uKSB7XG5cdFx0XHRcdG9mZnNldCA9IGk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb2Zmc2V0ICsgMTtcblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNhbGN1bGF0ZVJhbmdlKHR5cGUsIG92ZXJzY2FuLCBnZXRPZmZzZXQsIGdldFZpZXdDYXBhY2l0eSwgeyBjb250YWluZXJSZWYsIHN0YXRlLCBjdXJyZW50TGlzdCwgc291cmNlIH0pIHtcblx0cmV0dXJuICgpID0+IHtcblx0XHRjb25zdCBlbGVtZW50ID0gY29udGFpbmVyUmVmLnZhbHVlO1xuXHRcdGlmIChlbGVtZW50KSB7XG5cdFx0XHRjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXQodHlwZSA9PT0gXCJ2ZXJ0aWNhbFwiID8gZWxlbWVudC5zY3JvbGxUb3AgOiBlbGVtZW50LnNjcm9sbExlZnQpO1xuXHRcdFx0Y29uc3Qgdmlld0NhcGFjaXR5ID0gZ2V0Vmlld0NhcGFjaXR5KHR5cGUgPT09IFwidmVydGljYWxcIiA/IGVsZW1lbnQuY2xpZW50SGVpZ2h0IDogZWxlbWVudC5jbGllbnRXaWR0aCk7XG5cdFx0XHRjb25zdCBmcm9tID0gb2Zmc2V0IC0gb3ZlcnNjYW47XG5cdFx0XHRjb25zdCB0byA9IG9mZnNldCArIHZpZXdDYXBhY2l0eSArIG92ZXJzY2FuO1xuXHRcdFx0c3RhdGUudmFsdWUgPSB7XG5cdFx0XHRcdHN0YXJ0OiBmcm9tIDwgMCA/IDAgOiBmcm9tLFxuXHRcdFx0XHRlbmQ6IHRvID4gc291cmNlLnZhbHVlLmxlbmd0aCA/IHNvdXJjZS52YWx1ZS5sZW5ndGggOiB0b1xuXHRcdFx0fTtcblx0XHRcdGN1cnJlbnRMaXN0LnZhbHVlID0gc291cmNlLnZhbHVlLnNsaWNlKHN0YXRlLnZhbHVlLnN0YXJ0LCBzdGF0ZS52YWx1ZS5lbmQpLm1hcCgoZWxlLCBpbmRleCkgPT4gKHtcblx0XHRcdFx0ZGF0YTogZWxlLFxuXHRcdFx0XHRpbmRleDogaW5kZXggKyBzdGF0ZS52YWx1ZS5zdGFydFxuXHRcdFx0fSkpO1xuXHRcdH1cblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUdldERpc3RhbmNlKGl0ZW1TaXplLCBzb3VyY2UpIHtcblx0cmV0dXJuIChpbmRleCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgaXRlbVNpemUgPT09IFwibnVtYmVyXCIpIHJldHVybiBpbmRleCAqIGl0ZW1TaXplO1xuXHRcdHJldHVybiBzb3VyY2UudmFsdWUuc2xpY2UoMCwgaW5kZXgpLnJlZHVjZSgoc3VtLCBfLCBpKSA9PiBzdW0gKyBpdGVtU2l6ZShpKSwgMCk7XG5cdH07XG59XG5mdW5jdGlvbiB1c2VXYXRjaEZvclNpemVzKHNpemUsIGxpc3QsIGNvbnRhaW5lclJlZiwgY2FsY3VsYXRlUmFuZ2UpIHtcblx0d2F0Y2goW1xuXHRcdHNpemUud2lkdGgsXG5cdFx0c2l6ZS5oZWlnaHQsXG5cdFx0KCkgPT4gdG9WYWx1ZShsaXN0KSxcblx0XHRjb250YWluZXJSZWZcblx0XSwgKCkgPT4ge1xuXHRcdGNhbGN1bGF0ZVJhbmdlKCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRUb3RhbFNpemUoaXRlbVNpemUsIHNvdXJjZSkge1xuXHRyZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgaXRlbVNpemUgPT09IFwibnVtYmVyXCIpIHJldHVybiBzb3VyY2UudmFsdWUubGVuZ3RoICogaXRlbVNpemU7XG5cdFx0cmV0dXJuIHNvdXJjZS52YWx1ZS5yZWR1Y2UoKHN1bSwgXywgaW5kZXgpID0+IHN1bSArIGl0ZW1TaXplKGluZGV4KSwgMCk7XG5cdH0pO1xufVxuY29uc3Qgc2Nyb2xsVG9EaWN0aW9uYXJ5Rm9yRWxlbWVudFNjcm9sbEtleSA9IHtcblx0aG9yaXpvbnRhbDogXCJzY3JvbGxMZWZ0XCIsXG5cdHZlcnRpY2FsOiBcInNjcm9sbFRvcFwiXG59O1xuZnVuY3Rpb24gY3JlYXRlU2Nyb2xsVG8odHlwZSwgY2FsY3VsYXRlUmFuZ2UsIGdldERpc3RhbmNlLCBjb250YWluZXJSZWYpIHtcblx0cmV0dXJuIChpbmRleCkgPT4ge1xuXHRcdGlmIChjb250YWluZXJSZWYudmFsdWUpIHtcblx0XHRcdGNvbnRhaW5lclJlZi52YWx1ZVtzY3JvbGxUb0RpY3Rpb25hcnlGb3JFbGVtZW50U2Nyb2xsS2V5W3R5cGVdXSA9IGdldERpc3RhbmNlKGluZGV4KTtcblx0XHRcdGNhbGN1bGF0ZVJhbmdlKCk7XG5cdFx0fVxuXHR9O1xufVxuZnVuY3Rpb24gdXNlSG9yaXpvbnRhbFZpcnR1YWxMaXN0KG9wdGlvbnMsIGxpc3QpIHtcblx0Y29uc3QgcmVzb3VyY2VzID0gdXNlVmlydHVhbExpc3RSZXNvdXJjZXMobGlzdCk7XG5cdGNvbnN0IHsgc3RhdGUsIHNvdXJjZSwgY3VycmVudExpc3QsIHNpemUsIGNvbnRhaW5lclJlZiB9ID0gcmVzb3VyY2VzO1xuXHRjb25zdCBjb250YWluZXJTdHlsZSA9IHsgb3ZlcmZsb3dYOiBcImF1dG9cIiB9O1xuXHRjb25zdCB7IGl0ZW1XaWR0aCwgb3ZlcnNjYW4gPSA1IH0gPSBvcHRpb25zO1xuXHRjb25zdCBnZXRWaWV3Q2FwYWNpdHkgPSBjcmVhdGVHZXRWaWV3Q2FwYWNpdHkoc3RhdGUsIHNvdXJjZSwgaXRlbVdpZHRoKTtcblx0Y29uc3QgY2FsY3VsYXRlUmFuZ2UgPSBjcmVhdGVDYWxjdWxhdGVSYW5nZShcImhvcml6b250YWxcIiwgb3ZlcnNjYW4sIGNyZWF0ZUdldE9mZnNldChzb3VyY2UsIGl0ZW1XaWR0aCksIGdldFZpZXdDYXBhY2l0eSwgcmVzb3VyY2VzKTtcblx0Y29uc3QgZ2V0RGlzdGFuY2VMZWZ0ID0gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbVdpZHRoLCBzb3VyY2UpO1xuXHRjb25zdCBvZmZzZXRMZWZ0ID0gY29tcHV0ZWQoKCkgPT4gZ2V0RGlzdGFuY2VMZWZ0KHN0YXRlLnZhbHVlLnN0YXJ0KSk7XG5cdGNvbnN0IHRvdGFsV2lkdGggPSBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtV2lkdGgsIHNvdXJjZSk7XG5cdHVzZVdhdGNoRm9yU2l6ZXMoc2l6ZSwgbGlzdCwgY29udGFpbmVyUmVmLCBjYWxjdWxhdGVSYW5nZSk7XG5cdHJldHVybiB7XG5cdFx0c2Nyb2xsVG86IGNyZWF0ZVNjcm9sbFRvKFwiaG9yaXpvbnRhbFwiLCBjYWxjdWxhdGVSYW5nZSwgZ2V0RGlzdGFuY2VMZWZ0LCBjb250YWluZXJSZWYpLFxuXHRcdGNhbGN1bGF0ZVJhbmdlLFxuXHRcdHdyYXBwZXJQcm9wczogY29tcHV0ZWQoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHsgc3R5bGU6IHtcblx0XHRcdFx0aGVpZ2h0OiBcIjEwMCVcIixcblx0XHRcdFx0d2lkdGg6IGAke3RvdGFsV2lkdGgudmFsdWUgLSBvZmZzZXRMZWZ0LnZhbHVlfXB4YCxcblx0XHRcdFx0bWFyZ2luTGVmdDogYCR7b2Zmc2V0TGVmdC52YWx1ZX1weGAsXG5cdFx0XHRcdGRpc3BsYXk6IFwiZmxleFwiXG5cdFx0XHR9IH07XG5cdFx0fSksXG5cdFx0Y29udGFpbmVyU3R5bGUsXG5cdFx0Y3VycmVudExpc3QsXG5cdFx0Y29udGFpbmVyUmVmXG5cdH07XG59XG5mdW5jdGlvbiB1c2VWZXJ0aWNhbFZpcnR1YWxMaXN0KG9wdGlvbnMsIGxpc3QpIHtcblx0Y29uc3QgcmVzb3VyY2VzID0gdXNlVmlydHVhbExpc3RSZXNvdXJjZXMobGlzdCk7XG5cdGNvbnN0IHsgc3RhdGUsIHNvdXJjZSwgY3VycmVudExpc3QsIHNpemUsIGNvbnRhaW5lclJlZiB9ID0gcmVzb3VyY2VzO1xuXHRjb25zdCBjb250YWluZXJTdHlsZSA9IHsgb3ZlcmZsb3dZOiBcImF1dG9cIiB9O1xuXHRjb25zdCB7IGl0ZW1IZWlnaHQsIG92ZXJzY2FuID0gNSB9ID0gb3B0aW9ucztcblx0Y29uc3QgZ2V0Vmlld0NhcGFjaXR5ID0gY3JlYXRlR2V0Vmlld0NhcGFjaXR5KHN0YXRlLCBzb3VyY2UsIGl0ZW1IZWlnaHQpO1xuXHRjb25zdCBjYWxjdWxhdGVSYW5nZSA9IGNyZWF0ZUNhbGN1bGF0ZVJhbmdlKFwidmVydGljYWxcIiwgb3ZlcnNjYW4sIGNyZWF0ZUdldE9mZnNldChzb3VyY2UsIGl0ZW1IZWlnaHQpLCBnZXRWaWV3Q2FwYWNpdHksIHJlc291cmNlcyk7XG5cdGNvbnN0IGdldERpc3RhbmNlVG9wID0gY3JlYXRlR2V0RGlzdGFuY2UoaXRlbUhlaWdodCwgc291cmNlKTtcblx0Y29uc3Qgb2Zmc2V0VG9wID0gY29tcHV0ZWQoKCkgPT4gZ2V0RGlzdGFuY2VUb3Aoc3RhdGUudmFsdWUuc3RhcnQpKTtcblx0Y29uc3QgdG90YWxIZWlnaHQgPSBjcmVhdGVDb21wdXRlZFRvdGFsU2l6ZShpdGVtSGVpZ2h0LCBzb3VyY2UpO1xuXHR1c2VXYXRjaEZvclNpemVzKHNpemUsIGxpc3QsIGNvbnRhaW5lclJlZiwgY2FsY3VsYXRlUmFuZ2UpO1xuXHRyZXR1cm4ge1xuXHRcdGNhbGN1bGF0ZVJhbmdlLFxuXHRcdHNjcm9sbFRvOiBjcmVhdGVTY3JvbGxUbyhcInZlcnRpY2FsXCIsIGNhbGN1bGF0ZVJhbmdlLCBnZXREaXN0YW5jZVRvcCwgY29udGFpbmVyUmVmKSxcblx0XHRjb250YWluZXJTdHlsZSxcblx0XHR3cmFwcGVyUHJvcHM6IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdHJldHVybiB7IHN0eWxlOiB7XG5cdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0aGVpZ2h0OiBgJHt0b3RhbEhlaWdodC52YWx1ZSAtIG9mZnNldFRvcC52YWx1ZX1weGAsXG5cdFx0XHRcdG1hcmdpblRvcDogYCR7b2Zmc2V0VG9wLnZhbHVlfXB4YFxuXHRcdFx0fSB9O1xuXHRcdH0pLFxuXHRcdGN1cnJlbnRMaXN0LFxuXHRcdGNvbnRhaW5lclJlZlxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXYWtlTG9jay9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIFNjcmVlbiBXYWtlIExvY2sgQVBJLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXYWtlTG9ja1xuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVdha2VMb2NrKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IG5hdmlnYXRvcjogbmF2aWdhdG9yJDEgPSBkZWZhdWx0TmF2aWdhdG9yLCBkb2N1bWVudDogZG9jdW1lbnQkMSA9IGRlZmF1bHREb2N1bWVudCB9ID0gb3B0aW9ucztcblx0Y29uc3QgcmVxdWVzdGVkVHlwZSA9IHNoYWxsb3dSZWYoZmFsc2UpO1xuXHRjb25zdCBzZW50aW5lbCA9IHNoYWxsb3dSZWYobnVsbCk7XG5cdGNvbnN0IGRvY3VtZW50VmlzaWJpbGl0eSA9IHVzZURvY3VtZW50VmlzaWJpbGl0eSh7IGRvY3VtZW50OiBkb2N1bWVudCQxIH0pO1xuXHRjb25zdCBpc1N1cHBvcnRlZCA9IC8qIEBfX1BVUkVfXyAqLyB1c2VTdXBwb3J0ZWQoKCkgPT4gbmF2aWdhdG9yJDEgJiYgXCJ3YWtlTG9ja1wiIGluIG5hdmlnYXRvciQxKTtcblx0Y29uc3QgaXNBY3RpdmUgPSBjb21wdXRlZCgoKSA9PiAhIXNlbnRpbmVsLnZhbHVlICYmIGRvY3VtZW50VmlzaWJpbGl0eS52YWx1ZSA9PT0gXCJ2aXNpYmxlXCIpO1xuXHRpZiAoaXNTdXBwb3J0ZWQudmFsdWUpIHtcblx0XHR1c2VFdmVudExpc3RlbmVyKHNlbnRpbmVsLCBcInJlbGVhc2VcIiwgKCkgPT4ge1xuXHRcdFx0dmFyIF9zZW50aW5lbCR2YWx1ZSR0eXBlLCBfc2VudGluZWwkdmFsdWU7XG5cdFx0XHRyZXF1ZXN0ZWRUeXBlLnZhbHVlID0gKF9zZW50aW5lbCR2YWx1ZSR0eXBlID0gKF9zZW50aW5lbCR2YWx1ZSA9IHNlbnRpbmVsLnZhbHVlKSA9PT0gbnVsbCB8fCBfc2VudGluZWwkdmFsdWUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9zZW50aW5lbCR2YWx1ZS50eXBlKSAhPT0gbnVsbCAmJiBfc2VudGluZWwkdmFsdWUkdHlwZSAhPT0gdm9pZCAwID8gX3NlbnRpbmVsJHZhbHVlJHR5cGUgOiBmYWxzZTtcblx0XHR9LCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0d2hlbmV2ZXIoKCkgPT4gZG9jdW1lbnRWaXNpYmlsaXR5LnZhbHVlID09PSBcInZpc2libGVcIiAmJiAoZG9jdW1lbnQkMSA9PT0gbnVsbCB8fCBkb2N1bWVudCQxID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudCQxLnZpc2liaWxpdHlTdGF0ZSkgPT09IFwidmlzaWJsZVwiICYmIHJlcXVlc3RlZFR5cGUudmFsdWUsICh0eXBlKSA9PiB7XG5cdFx0XHRyZXF1ZXN0ZWRUeXBlLnZhbHVlID0gZmFsc2U7XG5cdFx0XHRmb3JjZVJlcXVlc3QodHlwZSk7XG5cdFx0fSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gZm9yY2VSZXF1ZXN0KHR5cGUpIHtcblx0XHR2YXIgX3NlbnRpbmVsJHZhbHVlMjtcblx0XHRhd2FpdCAoKF9zZW50aW5lbCR2YWx1ZTIgPSBzZW50aW5lbC52YWx1ZSkgPT09IG51bGwgfHwgX3NlbnRpbmVsJHZhbHVlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3NlbnRpbmVsJHZhbHVlMi5yZWxlYXNlKCkpO1xuXHRcdHNlbnRpbmVsLnZhbHVlID0gaXNTdXBwb3J0ZWQudmFsdWUgPyBhd2FpdCBuYXZpZ2F0b3IkMS53YWtlTG9jay5yZXF1ZXN0KHR5cGUpIDogbnVsbDtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiByZXF1ZXN0KHR5cGUpIHtcblx0XHRpZiAoZG9jdW1lbnRWaXNpYmlsaXR5LnZhbHVlID09PSBcInZpc2libGVcIikgYXdhaXQgZm9yY2VSZXF1ZXN0KHR5cGUpO1xuXHRcdGVsc2UgcmVxdWVzdGVkVHlwZS52YWx1ZSA9IHR5cGU7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVsZWFzZSgpIHtcblx0XHRyZXF1ZXN0ZWRUeXBlLnZhbHVlID0gZmFsc2U7XG5cdFx0Y29uc3QgcyA9IHNlbnRpbmVsLnZhbHVlO1xuXHRcdHNlbnRpbmVsLnZhbHVlID0gbnVsbDtcblx0XHRhd2FpdCAocyA9PT0gbnVsbCB8fCBzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzLnJlbGVhc2UoKSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZW50aW5lbCxcblx0XHRpc1N1cHBvcnRlZCxcblx0XHRpc0FjdGl2ZSxcblx0XHRyZXF1ZXN0LFxuXHRcdGZvcmNlUmVxdWVzdCxcblx0XHRyZWxlYXNlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYk5vdGlmaWNhdGlvbi9pbmRleC50c1xuLyoqXG4qIFJlYWN0aXZlIHVzZVdlYk5vdGlmaWNhdGlvblxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXZWJOb3RpZmljYXRpb25cbiogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvbm90aWZpY2F0aW9uXG4qL1xuZnVuY3Rpb24gdXNlV2ViTm90aWZpY2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IHdpbmRvdzogd2luZG93JDEgPSBkZWZhdWx0V2luZG93LCByZXF1ZXN0UGVybWlzc2lvbnM6IF9yZXF1ZXN0Rm9yUGVybWlzc2lvbnMgPSB0cnVlIH0gPSBvcHRpb25zO1xuXHRjb25zdCBkZWZhdWx0V2ViTm90aWZpY2F0aW9uT3B0aW9ucyA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzU3VwcG9ydGVkID0gLyogQF9fUFVSRV9fICovIHVzZVN1cHBvcnRlZCgoKSA9PiB7XG5cdFx0aWYgKCF3aW5kb3ckMSB8fCAhKFwiTm90aWZpY2F0aW9uXCIgaW4gd2luZG93JDEpKSByZXR1cm4gZmFsc2U7XG5cdFx0aWYgKE5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uID09PSBcImdyYW50ZWRcIikgcmV0dXJuIHRydWU7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG5vdGlmaWNhdGlvbiQxID0gbmV3IE5vdGlmaWNhdGlvbihcIlwiKTtcblx0XHRcdG5vdGlmaWNhdGlvbiQxLm9uc2hvdyA9ICgpID0+IHtcblx0XHRcdFx0bm90aWZpY2F0aW9uJDEuY2xvc2UoKTtcblx0XHRcdH07XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0aWYgKGUubmFtZSA9PT0gXCJUeXBlRXJyb3JcIikgcmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSk7XG5cdGNvbnN0IHBlcm1pc3Npb25HcmFudGVkID0gc2hhbGxvd1JlZihpc1N1cHBvcnRlZC52YWx1ZSAmJiBcInBlcm1pc3Npb25cIiBpbiBOb3RpZmljYXRpb24gJiYgTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gPT09IFwiZ3JhbnRlZFwiKTtcblx0Y29uc3Qgbm90aWZpY2F0aW9uID0gcmVmKG51bGwpO1xuXHRjb25zdCBlbnN1cmVQZXJtaXNzaW9ucyA9IGFzeW5jICgpID0+IHtcblx0XHRpZiAoIWlzU3VwcG9ydGVkLnZhbHVlKSByZXR1cm47XG5cdFx0aWYgKCFwZXJtaXNzaW9uR3JhbnRlZC52YWx1ZSAmJiBOb3RpZmljYXRpb24ucGVybWlzc2lvbiAhPT0gXCJkZW5pZWRcIikge1xuXHRcdFx0aWYgKGF3YWl0IE5vdGlmaWNhdGlvbi5yZXF1ZXN0UGVybWlzc2lvbigpID09PSBcImdyYW50ZWRcIikgcGVybWlzc2lvbkdyYW50ZWQudmFsdWUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gcGVybWlzc2lvbkdyYW50ZWQudmFsdWU7XG5cdH07XG5cdGNvbnN0IHsgb246IG9uQ2xpY2ssIHRyaWdnZXI6IGNsaWNrVHJpZ2dlciB9ID0gY3JlYXRlRXZlbnRIb29rKCk7XG5cdGNvbnN0IHsgb246IG9uU2hvdywgdHJpZ2dlcjogc2hvd1RyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCB7IG9uOiBvbkVycm9yLCB0cmlnZ2VyOiBlcnJvclRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCB7IG9uOiBvbkNsb3NlLCB0cmlnZ2VyOiBjbG9zZVRyaWdnZXIgfSA9IGNyZWF0ZUV2ZW50SG9vaygpO1xuXHRjb25zdCBzaG93ID0gYXN5bmMgKG92ZXJyaWRlcykgPT4ge1xuXHRcdGlmICghaXNTdXBwb3J0ZWQudmFsdWUgfHwgIXBlcm1pc3Npb25HcmFudGVkLnZhbHVlKSByZXR1cm47XG5cdFx0Y29uc3Qgb3B0aW9ucyQxID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFdlYk5vdGlmaWNhdGlvbk9wdGlvbnMsIG92ZXJyaWRlcyk7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlID0gbmV3IE5vdGlmaWNhdGlvbihvcHRpb25zJDEudGl0bGUgfHwgXCJcIiwgb3B0aW9ucyQxKTtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25jbGljayA9IGNsaWNrVHJpZ2dlcjtcblx0XHRub3RpZmljYXRpb24udmFsdWUub25zaG93ID0gc2hvd1RyaWdnZXI7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlLm9uZXJyb3IgPSBlcnJvclRyaWdnZXI7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlLm9uY2xvc2UgPSBjbG9zZVRyaWdnZXI7XG5cdFx0cmV0dXJuIG5vdGlmaWNhdGlvbi52YWx1ZTtcblx0fTtcblx0Y29uc3QgY2xvc2UgPSAoKSA9PiB7XG5cdFx0aWYgKG5vdGlmaWNhdGlvbi52YWx1ZSkgbm90aWZpY2F0aW9uLnZhbHVlLmNsb3NlKCk7XG5cdFx0bm90aWZpY2F0aW9uLnZhbHVlID0gbnVsbDtcblx0fTtcblx0aWYgKF9yZXF1ZXN0Rm9yUGVybWlzc2lvbnMpIHRyeU9uTW91bnRlZChlbnN1cmVQZXJtaXNzaW9ucyk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKGNsb3NlKTtcblx0aWYgKGlzU3VwcG9ydGVkLnZhbHVlICYmIHdpbmRvdyQxKSB7XG5cdFx0Y29uc3QgZG9jdW1lbnQkMSA9IHdpbmRvdyQxLmRvY3VtZW50O1xuXHRcdHVzZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQkMSwgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIChlKSA9PiB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRpZiAoZG9jdW1lbnQkMS52aXNpYmlsaXR5U3RhdGUgPT09IFwidmlzaWJsZVwiKSBjbG9zZSgpO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0aXNTdXBwb3J0ZWQsXG5cdFx0bm90aWZpY2F0aW9uLFxuXHRcdGVuc3VyZVBlcm1pc3Npb25zLFxuXHRcdHBlcm1pc3Npb25HcmFudGVkLFxuXHRcdHNob3csXG5cdFx0Y2xvc2UsXG5cdFx0b25DbGljayxcblx0XHRvblNob3csXG5cdFx0b25FcnJvcixcblx0XHRvbkNsb3NlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYlNvY2tldC9pbmRleC50c1xuY29uc3QgREVGQVVMVF9QSU5HX01FU1NBR0UgPSBcInBpbmdcIjtcbmZ1bmN0aW9uIHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMpIHtcblx0aWYgKG9wdGlvbnMgPT09IHRydWUpIHJldHVybiB7fTtcblx0cmV0dXJuIG9wdGlvbnM7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0U2NoZWR1bGVyKG9wdGlvbnMpIHtcblx0aWYgKFwiaW50ZXJ2YWxcIiBpbiBvcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBpbnRlcnZhbCA9IDFlMyB9ID0gb3B0aW9ucztcblx0XHRyZXR1cm4gKGNiKSA9PiB1c2VJbnRlcnZhbEZuKGNiLCBpbnRlcnZhbCwgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xuXHR9XG5cdHJldHVybiAoY2IpID0+IHVzZUludGVydmFsRm4oY2IsIDFlMywgeyBpbW1lZGlhdGU6IGZhbHNlIH0pO1xufVxuLyoqXG4qIFJlYWN0aXZlIFdlYlNvY2tldCBjbGllbnQuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdlYlNvY2tldFxuKiBAcGFyYW0gdXJsXG4qL1xuZnVuY3Rpb24gdXNlV2ViU29ja2V0KHVybCwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgb25Db25uZWN0ZWQsIG9uRGlzY29ubmVjdGVkLCBvbkVycm9yLCBvbk1lc3NhZ2UsIGltbWVkaWF0ZSA9IHRydWUsIGF1dG9Db25uZWN0ID0gdHJ1ZSwgYXV0b0Nsb3NlID0gdHJ1ZSwgcHJvdG9jb2xzID0gW10gfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGRhdGEgPSByZWYobnVsbCk7XG5cdGNvbnN0IHN0YXR1cyA9IHNoYWxsb3dSZWYoXCJDTE9TRURcIik7XG5cdGNvbnN0IHdzUmVmID0gcmVmKCk7XG5cdGNvbnN0IHVybFJlZiA9IHRvUmVmKHVybCk7XG5cdGxldCBoZWFydGJlYXRQYXVzZTtcblx0bGV0IGhlYXJ0YmVhdFJlc3VtZTtcblx0bGV0IGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0bGV0IHJldHJpZWQgPSAwO1xuXHRsZXQgYnVmZmVyZWREYXRhID0gW107XG5cdGxldCByZXRyeVRpbWVvdXQ7XG5cdGxldCBwb25nVGltZW91dFdhaXQ7XG5cdGNvbnN0IF9zZW5kQnVmZmVyID0gKCkgPT4ge1xuXHRcdGlmIChidWZmZXJlZERhdGEubGVuZ3RoICYmIHdzUmVmLnZhbHVlICYmIHN0YXR1cy52YWx1ZSA9PT0gXCJPUEVOXCIpIHtcblx0XHRcdGZvciAoY29uc3QgYnVmZmVyIG9mIGJ1ZmZlcmVkRGF0YSkgd3NSZWYudmFsdWUuc2VuZChidWZmZXIpO1xuXHRcdFx0YnVmZmVyZWREYXRhID0gW107XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZXNldFJldHJ5ID0gKCkgPT4ge1xuXHRcdGlmIChyZXRyeVRpbWVvdXQgIT0gbnVsbCkge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHJldHJ5VGltZW91dCk7XG5cdFx0XHRyZXRyeVRpbWVvdXQgPSB2b2lkIDA7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZXNldEhlYXJ0YmVhdCA9ICgpID0+IHtcblx0XHRjbGVhclRpbWVvdXQocG9uZ1RpbWVvdXRXYWl0KTtcblx0XHRwb25nVGltZW91dFdhaXQgPSB2b2lkIDA7XG5cdH07XG5cdGNvbnN0IGNsb3NlID0gKGNvZGUgPSAxZTMsIHJlYXNvbikgPT4ge1xuXHRcdHJlc2V0UmV0cnkoKTtcblx0XHRpZiAoIWlzQ2xpZW50ICYmICFpc1dvcmtlciB8fCAhd3NSZWYudmFsdWUpIHJldHVybjtcblx0XHRleHBsaWNpdGx5Q2xvc2VkID0gdHJ1ZTtcblx0XHRyZXNldEhlYXJ0YmVhdCgpO1xuXHRcdGhlYXJ0YmVhdFBhdXNlID09PSBudWxsIHx8IGhlYXJ0YmVhdFBhdXNlID09PSB2b2lkIDAgfHwgaGVhcnRiZWF0UGF1c2UoKTtcblx0XHR3c1JlZi52YWx1ZS5jbG9zZShjb2RlLCByZWFzb24pO1xuXHRcdHdzUmVmLnZhbHVlID0gdm9pZCAwO1xuXHR9O1xuXHRjb25zdCBzZW5kID0gKGRhdGEkMSwgdXNlQnVmZmVyID0gdHJ1ZSkgPT4ge1xuXHRcdGlmICghd3NSZWYudmFsdWUgfHwgc3RhdHVzLnZhbHVlICE9PSBcIk9QRU5cIikge1xuXHRcdFx0aWYgKHVzZUJ1ZmZlcikgYnVmZmVyZWREYXRhLnB1c2goZGF0YSQxKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0X3NlbmRCdWZmZXIoKTtcblx0XHR3c1JlZi52YWx1ZS5zZW5kKGRhdGEkMSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH07XG5cdGNvbnN0IF9pbml0ID0gKCkgPT4ge1xuXHRcdGlmIChleHBsaWNpdGx5Q2xvc2VkIHx8IHR5cGVvZiB1cmxSZWYudmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcblx0XHRjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodXJsUmVmLnZhbHVlLCBwcm90b2NvbHMpO1xuXHRcdHdzUmVmLnZhbHVlID0gd3M7XG5cdFx0c3RhdHVzLnZhbHVlID0gXCJDT05ORUNUSU5HXCI7XG5cdFx0d3Mub25vcGVuID0gKCkgPT4ge1xuXHRcdFx0c3RhdHVzLnZhbHVlID0gXCJPUEVOXCI7XG5cdFx0XHRyZXRyaWVkID0gMDtcblx0XHRcdG9uQ29ubmVjdGVkID09PSBudWxsIHx8IG9uQ29ubmVjdGVkID09PSB2b2lkIDAgfHwgb25Db25uZWN0ZWQod3MpO1xuXHRcdFx0aGVhcnRiZWF0UmVzdW1lID09PSBudWxsIHx8IGhlYXJ0YmVhdFJlc3VtZSA9PT0gdm9pZCAwIHx8IGhlYXJ0YmVhdFJlc3VtZSgpO1xuXHRcdFx0X3NlbmRCdWZmZXIoKTtcblx0XHR9O1xuXHRcdHdzLm9uY2xvc2UgPSAoZXYpID0+IHtcblx0XHRcdHN0YXR1cy52YWx1ZSA9IFwiQ0xPU0VEXCI7XG5cdFx0XHRyZXNldEhlYXJ0YmVhdCgpO1xuXHRcdFx0aGVhcnRiZWF0UGF1c2UgPT09IG51bGwgfHwgaGVhcnRiZWF0UGF1c2UgPT09IHZvaWQgMCB8fCBoZWFydGJlYXRQYXVzZSgpO1xuXHRcdFx0b25EaXNjb25uZWN0ZWQgPT09IG51bGwgfHwgb25EaXNjb25uZWN0ZWQgPT09IHZvaWQgMCB8fCBvbkRpc2Nvbm5lY3RlZCh3cywgZXYpO1xuXHRcdFx0aWYgKCFleHBsaWNpdGx5Q2xvc2VkICYmIG9wdGlvbnMuYXV0b1JlY29ubmVjdCAmJiAod3NSZWYudmFsdWUgPT0gbnVsbCB8fCB3cyA9PT0gd3NSZWYudmFsdWUpKSB7XG5cdFx0XHRcdGNvbnN0IHsgcmV0cmllcyA9IC0xLCBkZWxheSA9IDFlMywgb25GYWlsZWQgfSA9IHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuYXV0b1JlY29ubmVjdCk7XG5cdFx0XHRcdGlmICgodHlwZW9mIHJldHJpZXMgPT09IFwiZnVuY3Rpb25cIiA/IHJldHJpZXMgOiAoKSA9PiB0eXBlb2YgcmV0cmllcyA9PT0gXCJudW1iZXJcIiAmJiAocmV0cmllcyA8IDAgfHwgcmV0cmllZCA8IHJldHJpZXMpKShyZXRyaWVkKSkge1xuXHRcdFx0XHRcdHJldHJpZWQgKz0gMTtcblx0XHRcdFx0XHRjb25zdCBkZWxheVRpbWUgPSB0eXBlb2YgZGVsYXkgPT09IFwiZnVuY3Rpb25cIiA/IGRlbGF5KHJldHJpZWQpIDogZGVsYXk7XG5cdFx0XHRcdFx0cmV0cnlUaW1lb3V0ID0gc2V0VGltZW91dChfaW5pdCwgZGVsYXlUaW1lKTtcblx0XHRcdFx0fSBlbHNlIG9uRmFpbGVkID09PSBudWxsIHx8IG9uRmFpbGVkID09PSB2b2lkIDAgfHwgb25GYWlsZWQoKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHdzLm9uZXJyb3IgPSAoZSkgPT4ge1xuXHRcdFx0b25FcnJvciA9PT0gbnVsbCB8fCBvbkVycm9yID09PSB2b2lkIDAgfHwgb25FcnJvcih3cywgZSk7XG5cdFx0fTtcblx0XHR3cy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0aWYgKG9wdGlvbnMuaGVhcnRiZWF0KSB7XG5cdFx0XHRcdHJlc2V0SGVhcnRiZWF0KCk7XG5cdFx0XHRcdGNvbnN0IHsgbWVzc2FnZSA9IERFRkFVTFRfUElOR19NRVNTQUdFLCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlIH0gPSByZXNvbHZlTmVzdGVkT3B0aW9ucyhvcHRpb25zLmhlYXJ0YmVhdCk7XG5cdFx0XHRcdGlmIChlLmRhdGEgPT09IHRvVmFsdWUocmVzcG9uc2VNZXNzYWdlKSkgcmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0ZGF0YS52YWx1ZSA9IGUuZGF0YTtcblx0XHRcdG9uTWVzc2FnZSA9PT0gbnVsbCB8fCBvbk1lc3NhZ2UgPT09IHZvaWQgMCB8fCBvbk1lc3NhZ2Uod3MsIGUpO1xuXHRcdH07XG5cdH07XG5cdGlmIChvcHRpb25zLmhlYXJ0YmVhdCkge1xuXHRcdGNvbnN0IHsgbWVzc2FnZSA9IERFRkFVTFRfUElOR19NRVNTQUdFLCBzY2hlZHVsZXIgPSBnZXREZWZhdWx0U2NoZWR1bGVyKHJlc29sdmVOZXN0ZWRPcHRpb25zKG9wdGlvbnMuaGVhcnRiZWF0KSksIHBvbmdUaW1lb3V0ID0gMWUzIH0gPSByZXNvbHZlTmVzdGVkT3B0aW9ucyhvcHRpb25zLmhlYXJ0YmVhdCk7XG5cdFx0Y29uc3QgeyBwYXVzZSwgcmVzdW1lIH0gPSBzY2hlZHVsZXIoKCkgPT4ge1xuXHRcdFx0c2VuZCh0b1ZhbHVlKG1lc3NhZ2UpLCBmYWxzZSk7XG5cdFx0XHRpZiAocG9uZ1RpbWVvdXRXYWl0ICE9IG51bGwpIHJldHVybjtcblx0XHRcdHBvbmdUaW1lb3V0V2FpdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRjbG9zZSgpO1xuXHRcdFx0XHRleHBsaWNpdGx5Q2xvc2VkID0gZmFsc2U7XG5cdFx0XHR9LCBwb25nVGltZW91dCk7XG5cdFx0fSk7XG5cdFx0aGVhcnRiZWF0UGF1c2UgPSBwYXVzZTtcblx0XHRoZWFydGJlYXRSZXN1bWUgPSByZXN1bWU7XG5cdH1cblx0aWYgKGF1dG9DbG9zZSkge1xuXHRcdGlmIChpc0NsaWVudCkgdXNlRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCAoKSA9PiBjbG9zZSgpLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0dHJ5T25TY29wZURpc3Bvc2UoY2xvc2UpO1xuXHR9XG5cdGNvbnN0IG9wZW4gPSAoKSA9PiB7XG5cdFx0aWYgKCFpc0NsaWVudCAmJiAhaXNXb3JrZXIpIHJldHVybjtcblx0XHRjbG9zZSgpO1xuXHRcdGV4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcblx0XHRyZXRyaWVkID0gMDtcblx0XHRfaW5pdCgpO1xuXHR9O1xuXHRpZiAoaW1tZWRpYXRlKSBvcGVuKCk7XG5cdGlmIChhdXRvQ29ubmVjdCkgd2F0Y2godXJsUmVmLCBvcGVuKTtcblx0cmV0dXJuIHtcblx0XHRkYXRhLFxuXHRcdHN0YXR1cyxcblx0XHRjbG9zZSxcblx0XHRzZW5kLFxuXHRcdG9wZW4sXG5cdFx0d3M6IHdzUmVmXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdlYldvcmtlci9pbmRleC50c1xuZnVuY3Rpb24gdXNlV2ViV29ya2VyKGFyZzAsIHdvcmtlck9wdGlvbnMsIG9wdGlvbnMpIHtcblx0Y29uc3QgeyB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG5cdGNvbnN0IGRhdGEgPSByZWYobnVsbCk7XG5cdGNvbnN0IHdvcmtlciA9IHNoYWxsb3dSZWYoKTtcblx0Y29uc3QgcG9zdCA9ICguLi5hcmdzKSA9PiB7XG5cdFx0aWYgKCF3b3JrZXIudmFsdWUpIHJldHVybjtcblx0XHR3b3JrZXIudmFsdWUucG9zdE1lc3NhZ2UoLi4uYXJncyk7XG5cdH07XG5cdGNvbnN0IHRlcm1pbmF0ZSA9IGZ1bmN0aW9uIHRlcm1pbmF0ZSQxKCkge1xuXHRcdGlmICghd29ya2VyLnZhbHVlKSByZXR1cm47XG5cdFx0d29ya2VyLnZhbHVlLnRlcm1pbmF0ZSgpO1xuXHR9O1xuXHRpZiAod2luZG93JDEpIHtcblx0XHRpZiAodHlwZW9mIGFyZzAgPT09IFwic3RyaW5nXCIpIHdvcmtlci52YWx1ZSA9IG5ldyBXb3JrZXIoYXJnMCwgd29ya2VyT3B0aW9ucyk7XG5cdFx0ZWxzZSBpZiAodHlwZW9mIGFyZzAgPT09IFwiZnVuY3Rpb25cIikgd29ya2VyLnZhbHVlID0gYXJnMCgpO1xuXHRcdGVsc2Ugd29ya2VyLnZhbHVlID0gYXJnMDtcblx0XHR3b3JrZXIudmFsdWUub25tZXNzYWdlID0gKGUpID0+IHtcblx0XHRcdGRhdGEudmFsdWUgPSBlLmRhdGE7XG5cdFx0fTtcblx0XHR0cnlPblNjb3BlRGlzcG9zZSgoKSA9PiB7XG5cdFx0XHRpZiAod29ya2VyLnZhbHVlKSB3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRkYXRhLFxuXHRcdHBvc3QsXG5cdFx0dGVybWluYXRlLFxuXHRcdHdvcmtlclxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXZWJXb3JrZXJGbi9saWIvZGVwc1BhcnNlci50c1xuLyoqXG4qXG4qIENvbmNhdGVuYXRlcyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nLlxuKiB0aGlzIHN0cmluZyB3aWxsIHRoZW4gYmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBcImltcG9ydFNjcmlwdHNcIiBmdW5jdGlvblxuKlxuKiBAcGFyYW0gZGVwcyBhcnJheSBvZiBzdHJpbmdcbiogQHBhcmFtIGxvY2FsRGVwcyBhcnJheSBvZiBmdW5jdGlvblxuKiBAcmV0dXJucyBhIHN0cmluZyBjb21wb3NlZCBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgYXJyYXlcbiogZWxlbWVudHMgXCJkZXBzXCIgYW5kIFwiaW1wb3J0U2NyaXB0c1wiLlxuKlxuKiBAZXhhbXBsZVxuKiBkZXBzUGFyc2VyKFsnZGVtbzEnLCAnZGVtbzInXSkgLy8gcmV0dXJuIGltcG9ydFNjcmlwdHMoJ2RlbW8xJywgJ2RlbW8yJylcbiovXG5mdW5jdGlvbiBkZXBzUGFyc2VyKGRlcHMsIGxvY2FsRGVwcykge1xuXHRpZiAoZGVwcy5sZW5ndGggPT09IDAgJiYgbG9jYWxEZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCI7XG5cdGNvbnN0IGRlcHNTdHJpbmcgPSBkZXBzLm1hcCgoZGVwKSA9PiBgJyR7ZGVwfSdgKS50b1N0cmluZygpO1xuXHRjb25zdCBkZXBzRnVuY3Rpb25TdHJpbmcgPSBsb2NhbERlcHMuZmlsdGVyKChkZXApID0+IHR5cGVvZiBkZXAgPT09IFwiZnVuY3Rpb25cIikubWFwKChmbikgPT4ge1xuXHRcdGNvbnN0IHN0ciA9IGZuLnRvU3RyaW5nKCk7XG5cdFx0aWYgKHN0ci50cmltKCkuc3RhcnRzV2l0aChcImZ1bmN0aW9uXCIpKSByZXR1cm4gc3RyO1xuXHRcdGVsc2UgcmV0dXJuIGBjb25zdCAke2ZuLm5hbWV9ID0gJHtzdHJ9YDtcblx0fSkuam9pbihcIjtcIik7XG5cdGNvbnN0IGltcG9ydFN0cmluZyA9IGBpbXBvcnRTY3JpcHRzKCR7ZGVwc1N0cmluZ30pO2A7XG5cdHJldHVybiBgJHtkZXBzU3RyaW5nLnRyaW0oKSA9PT0gXCJcIiA/IFwiXCIgOiBpbXBvcnRTdHJpbmd9ICR7ZGVwc0Z1bmN0aW9uU3RyaW5nfWA7XG59XG52YXIgZGVwc1BhcnNlcl9kZWZhdWx0ID0gZGVwc1BhcnNlcjtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyRm4vbGliL2pvYlJ1bm5lci50c1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhcyBhIHBhcmFtZXRlciBhIGZ1bmN0aW9uIFwidXNlckZ1bmNcIlxuKiBBbmQgYXMgYSByZXN1bHQgcmV0dXJucyBhbiBhbm9ueW1vdXMgZnVuY3Rpb24uXG4qIFRoaXMgYW5vbnltb3VzIGZ1bmN0aW9uLCBhY2NlcHRzIGFzIGFyZ3VtZW50cyxcbiogdGhlIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gXCJ1c2VBcmdzXCIgYW5kIHJldHVybnMgYSBQcm9taXNlXG4qIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSB3cmFwcGVyLCBvbmx5IGluc2lkZSBhIFdvcmtlclxuKiBiZWNhdXNlIGl0IGRlcGVuZHMgYnkgXCJwb3N0TWVzc2FnZVwiLlxuKlxuKiBAcGFyYW0gdXNlckZ1bmMge0Z1bmN0aW9ufSBmbiB0aGUgZnVuY3Rpb24gdG8gcnVuIHdpdGggd2ViIHdvcmtlclxuKlxuKiBAcmV0dXJucyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHRoZSBwYXJhbWV0ZXJzXG4qIHRvIGJlIHBhc3NlZCB0byB0aGUgXCJ1c2VyRnVuY1wiIGZ1bmN0aW9uXG4qL1xuZnVuY3Rpb24gam9iUnVubmVyKHVzZXJGdW5jKSB7XG5cdHJldHVybiAoZSkgPT4ge1xuXHRcdGNvbnN0IHVzZXJGdW5jQXJncyA9IGUuZGF0YVswXTtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXJGdW5jLmFwcGx5KHZvaWQgMCwgdXNlckZ1bmNBcmdzKSkudGhlbigocmVzdWx0KSA9PiB7XG5cdFx0XHRwb3N0TWVzc2FnZShbXCJTVUNDRVNTXCIsIHJlc3VsdF0pO1xuXHRcdH0pLmNhdGNoKChlcnJvcikgPT4ge1xuXHRcdFx0cG9zdE1lc3NhZ2UoW1wiRVJST1JcIiwgZXJyb3JdKTtcblx0XHR9KTtcblx0fTtcbn1cbnZhciBqb2JSdW5uZXJfZGVmYXVsdCA9IGpvYlJ1bm5lcjtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyRm4vbGliL2NyZWF0ZVdvcmtlckJsb2JVcmwudHNcbi8qKlxuKiBDb252ZXJ0cyB0aGUgXCJmblwiIGZ1bmN0aW9uIGludG8gdGhlIHN5bnRheCBuZWVkZWQgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIGEgd2ViIHdvcmtlclxuKlxuKiBAcGFyYW0gZm4gdGhlIGZ1bmN0aW9uIHRvIHJ1biB3aXRoIHdlYiB3b3JrZXJcbiogQHBhcmFtIGRlcHMgYXJyYXkgb2Ygc3RyaW5ncywgaW1wb3J0ZWQgaW50byB0aGUgd29ya2VyIHRocm91Z2ggXCJpbXBvcnRTY3JpcHRzXCJcbiogQHBhcmFtIGxvY2FsRGVwcyBhcnJheSBvZiBmdW5jdGlvbiwgbG9jYWwgZGVwZW5kZW5jaWVzXG4qXG4qIEByZXR1cm5zIGEgYmxvYiB1cmwsIGNvbnRhaW5pbmcgdGhlIGNvZGUgb2YgXCJmblwiIGFzIGEgc3RyaW5nXG4qXG4qIEBleGFtcGxlXG4qIGNyZWF0ZVdvcmtlckJsb2JVcmwoKGEsYikgPT4gYStiLCBbXSlcbiogLy8gcmV0dXJuIFwib25tZXNzYWdlPXJldHVybiBQcm9taXNlLnJlc29sdmUoKGEsYikgPT4gYSArIGIpXG4qIC50aGVuKHBvc3RNZXNzYWdlKFsnU1VDQ0VTUycsIHJlc3VsdF0pKVxuKiAuY2F0Y2gocG9zdE1lc3NhZ2UoWydFUlJPUicsIGVycm9yXSlcIlxuKi9cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtlckJsb2JVcmwoZm4sIGRlcHMsIGxvY2FsRGVwcykge1xuXHRjb25zdCBibG9iQ29kZSA9IGAke2RlcHNQYXJzZXJfZGVmYXVsdChkZXBzLCBsb2NhbERlcHMpfTsgb25tZXNzYWdlPSgke2pvYlJ1bm5lcl9kZWZhdWx0fSkoJHtmbn0pYDtcblx0Y29uc3QgYmxvYiA9IG5ldyBCbG9iKFtibG9iQ29kZV0sIHsgdHlwZTogXCJ0ZXh0L2phdmFzY3JpcHRcIiB9KTtcblx0cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG59XG52YXIgY3JlYXRlV29ya2VyQmxvYlVybF9kZWZhdWx0ID0gY3JlYXRlV29ya2VyQmxvYlVybDtcblxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gdXNlV2ViV29ya2VyRm4vaW5kZXgudHNcbi8qKlxuKiBSdW4gZXhwZW5zaXZlIGZ1bmN0aW9uIHdpdGhvdXQgYmxvY2tpbmcgdGhlIFVJLCB1c2luZyBhIHNpbXBsZSBzeW50YXggdGhhdCBtYWtlcyB1c2Ugb2YgUHJvbWlzZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2ViV29ya2VyRm5cbiogQHBhcmFtIGZuXG4qIEBwYXJhbSBvcHRpb25zXG4qL1xuZnVuY3Rpb24gdXNlV2ViV29ya2VyRm4oZm4sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCB7IGRlcGVuZGVuY2llcyA9IFtdLCBsb2NhbERlcGVuZGVuY2llcyA9IFtdLCB0aW1lb3V0LCB3aW5kb3c6IHdpbmRvdyQxID0gZGVmYXVsdFdpbmRvdyB9ID0gb3B0aW9ucztcblx0Y29uc3Qgd29ya2VyID0gcmVmKCk7XG5cdGNvbnN0IHdvcmtlclN0YXR1cyA9IHNoYWxsb3dSZWYoXCJQRU5ESU5HXCIpO1xuXHRjb25zdCBwcm9taXNlID0gcmVmKHt9KTtcblx0Y29uc3QgdGltZW91dElkID0gc2hhbGxvd1JlZigpO1xuXHRjb25zdCB3b3JrZXJUZXJtaW5hdGUgPSAoc3RhdHVzID0gXCJQRU5ESU5HXCIpID0+IHtcblx0XHRpZiAod29ya2VyLnZhbHVlICYmIHdvcmtlci52YWx1ZS5fdXJsICYmIHdpbmRvdyQxKSB7XG5cdFx0XHR3b3JrZXIudmFsdWUudGVybWluYXRlKCk7XG5cdFx0XHRVUkwucmV2b2tlT2JqZWN0VVJMKHdvcmtlci52YWx1ZS5fdXJsKTtcblx0XHRcdHByb21pc2UudmFsdWUgPSB7fTtcblx0XHRcdHdvcmtlci52YWx1ZSA9IHZvaWQgMDtcblx0XHRcdHdpbmRvdyQxLmNsZWFyVGltZW91dCh0aW1lb3V0SWQudmFsdWUpO1xuXHRcdFx0d29ya2VyU3RhdHVzLnZhbHVlID0gc3RhdHVzO1xuXHRcdH1cblx0fTtcblx0d29ya2VyVGVybWluYXRlKCk7XG5cdHRyeU9uU2NvcGVEaXNwb3NlKHdvcmtlclRlcm1pbmF0ZSk7XG5cdGNvbnN0IGdlbmVyYXRlV29ya2VyID0gKCkgPT4ge1xuXHRcdGNvbnN0IGJsb2JVcmwgPSBjcmVhdGVXb3JrZXJCbG9iVXJsX2RlZmF1bHQoZm4sIGRlcGVuZGVuY2llcywgbG9jYWxEZXBlbmRlbmNpZXMpO1xuXHRcdGNvbnN0IG5ld1dvcmtlciA9IG5ldyBXb3JrZXIoYmxvYlVybCk7XG5cdFx0bmV3V29ya2VyLl91cmwgPSBibG9iVXJsO1xuXHRcdG5ld1dvcmtlci5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xuXHRcdFx0Y29uc3QgeyByZXNvbHZlID0gKCkgPT4ge30sIHJlamVjdCA9ICgpID0+IHt9IH0gPSBwcm9taXNlLnZhbHVlO1xuXHRcdFx0Y29uc3QgW3N0YXR1cywgcmVzdWx0XSA9IGUuZGF0YTtcblx0XHRcdHN3aXRjaCAoc3RhdHVzKSB7XG5cdFx0XHRcdGNhc2UgXCJTVUNDRVNTXCI6XG5cdFx0XHRcdFx0cmVzb2x2ZShyZXN1bHQpO1xuXHRcdFx0XHRcdHdvcmtlclRlcm1pbmF0ZShzdGF0dXMpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHJlamVjdChyZXN1bHQpO1xuXHRcdFx0XHRcdHdvcmtlclRlcm1pbmF0ZShcIkVSUk9SXCIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0bmV3V29ya2VyLm9uZXJyb3IgPSAoZSkgPT4ge1xuXHRcdFx0Y29uc3QgeyByZWplY3QgPSAoKSA9PiB7fSB9ID0gcHJvbWlzZS52YWx1ZTtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdHJlamVjdChlKTtcblx0XHRcdHdvcmtlclRlcm1pbmF0ZShcIkVSUk9SXCIpO1xuXHRcdH07XG5cdFx0aWYgKHRpbWVvdXQpIHRpbWVvdXRJZC52YWx1ZSA9IHNldFRpbWVvdXQoKCkgPT4gd29ya2VyVGVybWluYXRlKFwiVElNRU9VVF9FWFBJUkVEXCIpLCB0aW1lb3V0KTtcblx0XHRyZXR1cm4gbmV3V29ya2VyO1xuXHR9O1xuXHRjb25zdCBjYWxsV29ya2VyID0gKC4uLmZuQXJncykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdHZhciBfd29ya2VyJHZhbHVlO1xuXHRcdHByb21pc2UudmFsdWUgPSB7XG5cdFx0XHRyZXNvbHZlLFxuXHRcdFx0cmVqZWN0XG5cdFx0fTtcblx0XHQoX3dvcmtlciR2YWx1ZSA9IHdvcmtlci52YWx1ZSkgPT09IG51bGwgfHwgX3dvcmtlciR2YWx1ZSA9PT0gdm9pZCAwIHx8IF93b3JrZXIkdmFsdWUucG9zdE1lc3NhZ2UoW1suLi5mbkFyZ3NdXSk7XG5cdFx0d29ya2VyU3RhdHVzLnZhbHVlID0gXCJSVU5OSU5HXCI7XG5cdH0pO1xuXHRjb25zdCB3b3JrZXJGbiA9ICguLi5mbkFyZ3MpID0+IHtcblx0XHRpZiAod29ya2VyU3RhdHVzLnZhbHVlID09PSBcIlJVTk5JTkdcIikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIlt1c2VXZWJXb3JrZXJGbl0gWW91IGNhbiBvbmx5IHJ1biBvbmUgaW5zdGFuY2Ugb2YgdGhlIHdvcmtlciBhdCBhIHRpbWUuXCIpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG5cdFx0fVxuXHRcdHdvcmtlci52YWx1ZSA9IGdlbmVyYXRlV29ya2VyKCk7XG5cdFx0cmV0dXJuIGNhbGxXb3JrZXIoLi4uZm5BcmdzKTtcblx0fTtcblx0cmV0dXJuIHtcblx0XHR3b3JrZXJGbixcblx0XHR3b3JrZXJTdGF0dXMsXG5cdFx0d29ya2VyVGVybWluYXRlXG5cdH07XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdpbmRvd0ZvY3VzL2luZGV4LnRzXG4vKipcbiogUmVhY3RpdmVseSB0cmFjayB3aW5kb3cgZm9jdXMgd2l0aCBgd2luZG93Lm9uZm9jdXNgIGFuZCBgd2luZG93Lm9uYmx1cmAuXG4qXG4qIEBzZWUgaHR0cHM6Ly92dWV1c2Uub3JnL3VzZVdpbmRvd0ZvY3VzXG4qXG4qIEBfX05PX1NJREVfRUZGRUNUU19fXG4qL1xuZnVuY3Rpb24gdXNlV2luZG93Rm9jdXMob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3cgfSA9IG9wdGlvbnM7XG5cdGlmICghd2luZG93JDEpIHJldHVybiBzaGFsbG93UmVmKGZhbHNlKTtcblx0Y29uc3QgZm9jdXNlZCA9IHNoYWxsb3dSZWYod2luZG93JDEuZG9jdW1lbnQuaGFzRm9jdXMoKSk7XG5cdGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IHsgcGFzc2l2ZTogdHJ1ZSB9O1xuXHR1c2VFdmVudExpc3RlbmVyKHdpbmRvdyQxLCBcImJsdXJcIiwgKCkgPT4ge1xuXHRcdGZvY3VzZWQudmFsdWUgPSBmYWxzZTtcblx0fSwgbGlzdGVuZXJPcHRpb25zKTtcblx0dXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMSwgXCJmb2N1c1wiLCAoKSA9PiB7XG5cdFx0Zm9jdXNlZC52YWx1ZSA9IHRydWU7XG5cdH0sIGxpc3RlbmVyT3B0aW9ucyk7XG5cdHJldHVybiBmb2N1c2VkO1xufVxuXG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiB1c2VXaW5kb3dTY3JvbGwvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSB3aW5kb3cgc2Nyb2xsLlxuKlxuKiBAc2VlIGh0dHBzOi8vdnVldXNlLm9yZy91c2VXaW5kb3dTY3JvbGxcbiogQHBhcmFtIG9wdGlvbnNcbiovXG5mdW5jdGlvbiB1c2VXaW5kb3dTY3JvbGwob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csLi4ucmVzdCB9ID0gb3B0aW9ucztcblx0cmV0dXJuIHVzZVNjcm9sbCh3aW5kb3ckMSwgcmVzdCk7XG59XG5cbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIHVzZVdpbmRvd1NpemUvaW5kZXgudHNcbi8qKlxuKiBSZWFjdGl2ZSB3aW5kb3cgc2l6ZS5cbipcbiogQHNlZSBodHRwczovL3Z1ZXVzZS5vcmcvdXNlV2luZG93U2l6ZVxuKiBAcGFyYW0gb3B0aW9uc1xuKlxuKiBAX19OT19TSURFX0VGRkVDVFNfX1xuKi9cbmZ1bmN0aW9uIHVzZVdpbmRvd1NpemUob3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHsgd2luZG93OiB3aW5kb3ckMSA9IGRlZmF1bHRXaW5kb3csIGluaXRpYWxXaWR0aCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgaW5pdGlhbEhlaWdodCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgbGlzdGVuT3JpZW50YXRpb24gPSB0cnVlLCBpbmNsdWRlU2Nyb2xsYmFyID0gdHJ1ZSwgdHlwZSA9IFwiaW5uZXJcIiB9ID0gb3B0aW9ucztcblx0Y29uc3Qgd2lkdGggPSBzaGFsbG93UmVmKGluaXRpYWxXaWR0aCk7XG5cdGNvbnN0IGhlaWdodCA9IHNoYWxsb3dSZWYoaW5pdGlhbEhlaWdodCk7XG5cdGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcblx0XHRpZiAod2luZG93JDEpIGlmICh0eXBlID09PSBcIm91dGVyXCIpIHtcblx0XHRcdHdpZHRoLnZhbHVlID0gd2luZG93JDEub3V0ZXJXaWR0aDtcblx0XHRcdGhlaWdodC52YWx1ZSA9IHdpbmRvdyQxLm91dGVySGVpZ2h0O1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJ2aXN1YWxcIiAmJiB3aW5kb3ckMS52aXN1YWxWaWV3cG9ydCkge1xuXHRcdFx0Y29uc3QgeyB3aWR0aDogdmlzdWFsVmlld3BvcnRXaWR0aCwgaGVpZ2h0OiB2aXN1YWxWaWV3cG9ydEhlaWdodCwgc2NhbGUgfSA9IHdpbmRvdyQxLnZpc3VhbFZpZXdwb3J0O1xuXHRcdFx0d2lkdGgudmFsdWUgPSBNYXRoLnJvdW5kKHZpc3VhbFZpZXdwb3J0V2lkdGggKiBzY2FsZSk7XG5cdFx0XHRoZWlnaHQudmFsdWUgPSBNYXRoLnJvdW5kKHZpc3VhbFZpZXdwb3J0SGVpZ2h0ICogc2NhbGUpO1xuXHRcdH0gZWxzZSBpZiAoaW5jbHVkZVNjcm9sbGJhcikge1xuXHRcdFx0d2lkdGgudmFsdWUgPSB3aW5kb3ckMS5pbm5lcldpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gd2luZG93JDEuaW5uZXJIZWlnaHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpZHRoLnZhbHVlID0gd2luZG93JDEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuXHRcdFx0aGVpZ2h0LnZhbHVlID0gd2luZG93JDEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblx0XHR9XG5cdH07XG5cdHVwZGF0ZSgpO1xuXHR0cnlPbk1vdW50ZWQodXBkYXRlKTtcblx0Y29uc3QgbGlzdGVuZXJPcHRpb25zID0geyBwYXNzaXZlOiB0cnVlIH07XG5cdHVzZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRpZiAod2luZG93JDEgJiYgdHlwZSA9PT0gXCJ2aXN1YWxcIiAmJiB3aW5kb3ckMS52aXN1YWxWaWV3cG9ydCkgdXNlRXZlbnRMaXN0ZW5lcih3aW5kb3ckMS52aXN1YWxWaWV3cG9ydCwgXCJyZXNpemVcIiwgdXBkYXRlLCBsaXN0ZW5lck9wdGlvbnMpO1xuXHRpZiAobGlzdGVuT3JpZW50YXRpb24pIHdhdGNoKHVzZU1lZGlhUXVlcnkoXCIob3JpZW50YXRpb246IHBvcnRyYWl0KVwiKSwgKCkgPT4gdXBkYXRlKCkpO1xuXHRyZXR1cm4ge1xuXHRcdHdpZHRoLFxuXHRcdGhlaWdodFxuXHR9O1xufVxuXG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IERlZmF1bHRNYWdpY0tleXNBbGlhc01hcCwgU3RvcmFnZVNlcmlhbGl6ZXJzLCBUcmFuc2l0aW9uUHJlc2V0cywgYXN5bmNDb21wdXRlZCwgYnJlYWtwb2ludHNBbnREZXNpZ24sIGJyZWFrcG9pbnRzQm9vdHN0cmFwVjUsIGJyZWFrcG9pbnRzRWxlbWVudCwgYnJlYWtwb2ludHNNYXN0ZXJDc3MsIGJyZWFrcG9pbnRzUHJpbWVGbGV4LCBicmVha3BvaW50c1F1YXNhciwgYnJlYWtwb2ludHNTZW1hdGljLCBicmVha3BvaW50c1RhaWx3aW5kLCBicmVha3BvaW50c1Z1ZXRpZnksIGJyZWFrcG9pbnRzVnVldGlmeVYyLCBicmVha3BvaW50c1Z1ZXRpZnlWMywgY2xvbmVGbkpTT04sIGNvbXB1dGVkQXN5bmMsIGNvbXB1dGVkSW5qZWN0LCBjcmVhdGVGZXRjaCwgY3JlYXRlUmV1c2FibGVUZW1wbGF0ZSwgY3JlYXRlVGVtcGxhdGVQcm9taXNlLCBjcmVhdGVVbnJlZkZuLCBjdXN0b21TdG9yYWdlRXZlbnROYW1lLCBkZWZhdWx0RG9jdW1lbnQsIGRlZmF1bHRMb2NhdGlvbiwgZGVmYXVsdE5hdmlnYXRvciwgZGVmYXVsdFdpbmRvdywgZXhlY3V0ZVRyYW5zaXRpb24sIGZvcm1hdFRpbWVBZ28sIGZvcm1hdFRpbWVBZ29JbnRsLCBmb3JtYXRUaW1lQWdvSW50bFBhcnRzLCBnZXRTU1JIYW5kbGVyLCBtYXBHYW1lcGFkVG9YYm94MzYwQ29udHJvbGxlciwgb25DbGlja091dHNpZGUsIG9uRWxlbWVudFJlbW92YWwsIG9uS2V5RG93biwgb25LZXlQcmVzc2VkLCBvbktleVN0cm9rZSwgb25LZXlVcCwgb25Mb25nUHJlc3MsIG9uU3RhcnRUeXBpbmcsIHByb3ZpZGVTU1JXaWR0aCwgc2V0U1NSSGFuZGxlciwgdGVtcGxhdGVSZWYsIHRyYW5zaXRpb24sIHVucmVmRWxlbWVudCwgdXNlQWN0aXZlRWxlbWVudCwgdXNlQW5pbWF0ZSwgdXNlQXN5bmNRdWV1ZSwgdXNlQXN5bmNTdGF0ZSwgdXNlQmFzZTY0LCB1c2VCYXR0ZXJ5LCB1c2VCbHVldG9vdGgsIHVzZUJyZWFrcG9pbnRzLCB1c2VCcm9hZGNhc3RDaGFubmVsLCB1c2VCcm93c2VyTG9jYXRpb24sIHVzZUNhY2hlZCwgdXNlQ2xpcGJvYXJkLCB1c2VDbGlwYm9hcmRJdGVtcywgdXNlQ2xvbmVkLCB1c2VDb2xvck1vZGUsIHVzZUNvbmZpcm1EaWFsb2csIHVzZUNvdW50ZG93biwgdXNlQ3NzU3VwcG9ydHMsIHVzZUNzc1ZhciwgdXNlQ3VycmVudEVsZW1lbnQsIHVzZUN5Y2xlTGlzdCwgdXNlRGFyaywgdXNlRGVib3VuY2VkUmVmSGlzdG9yeSwgdXNlRGV2aWNlTW90aW9uLCB1c2VEZXZpY2VPcmllbnRhdGlvbiwgdXNlRGV2aWNlUGl4ZWxSYXRpbywgdXNlRGV2aWNlc0xpc3QsIHVzZURpc3BsYXlNZWRpYSwgdXNlRG9jdW1lbnRWaXNpYmlsaXR5LCB1c2VEcmFnZ2FibGUsIHVzZURyb3Bab25lLCB1c2VFbGVtZW50Qm91bmRpbmcsIHVzZUVsZW1lbnRCeVBvaW50LCB1c2VFbGVtZW50SG92ZXIsIHVzZUVsZW1lbnRTaXplLCB1c2VFbGVtZW50VmlzaWJpbGl0eSwgdXNlRXZlbnRCdXMsIHVzZUV2ZW50TGlzdGVuZXIsIHVzZUV2ZW50U291cmNlLCB1c2VFeWVEcm9wcGVyLCB1c2VGYXZpY29uLCB1c2VGZXRjaCwgdXNlRmlsZURpYWxvZywgdXNlRmlsZVN5c3RlbUFjY2VzcywgdXNlRm9jdXMsIHVzZUZvY3VzV2l0aGluLCB1c2VGcHMsIHVzZUZ1bGxzY3JlZW4sIHVzZUdhbWVwYWQsIHVzZUdlb2xvY2F0aW9uLCB1c2VJZGxlLCB1c2VJbWFnZSwgdXNlSW5maW5pdGVTY3JvbGwsIHVzZUludGVyc2VjdGlvbk9ic2VydmVyLCB1c2VLZXlNb2RpZmllciwgdXNlTG9jYWxTdG9yYWdlLCB1c2VNYWdpY0tleXMsIHVzZU1hbnVhbFJlZkhpc3RvcnksIHVzZU1lZGlhQ29udHJvbHMsIHVzZU1lZGlhUXVlcnksIHVzZU1lbW9pemUsIHVzZU1lbW9yeSwgdXNlTW91bnRlZCwgdXNlTW91c2UsIHVzZU1vdXNlSW5FbGVtZW50LCB1c2VNb3VzZVByZXNzZWQsIHVzZU11dGF0aW9uT2JzZXJ2ZXIsIHVzZU5hdmlnYXRvckxhbmd1YWdlLCB1c2VOZXR3b3JrLCB1c2VOb3csIHVzZU9iamVjdFVybCwgdXNlT2Zmc2V0UGFnaW5hdGlvbiwgdXNlT25saW5lLCB1c2VQYWdlTGVhdmUsIHVzZVBhcmFsbGF4LCB1c2VQYXJlbnRFbGVtZW50LCB1c2VQZXJmb3JtYW5jZU9ic2VydmVyLCB1c2VQZXJtaXNzaW9uLCB1c2VQb2ludGVyLCB1c2VQb2ludGVyTG9jaywgdXNlUG9pbnRlclN3aXBlLCB1c2VQcmVmZXJyZWRDb2xvclNjaGVtZSwgdXNlUHJlZmVycmVkQ29udHJhc3QsIHVzZVByZWZlcnJlZERhcmssIHVzZVByZWZlcnJlZExhbmd1YWdlcywgdXNlUHJlZmVycmVkUmVkdWNlZE1vdGlvbiwgdXNlUHJlZmVycmVkUmVkdWNlZFRyYW5zcGFyZW5jeSwgdXNlUHJldmlvdXMsIHVzZVJhZkZuLCB1c2VSZWZIaXN0b3J5LCB1c2VSZXNpemVPYnNlcnZlciwgdXNlU1NSV2lkdGgsIHVzZVNjcmVlbk9yaWVudGF0aW9uLCB1c2VTY3JlZW5TYWZlQXJlYSwgdXNlU2NyaXB0VGFnLCB1c2VTY3JvbGwsIHVzZVNjcm9sbExvY2ssIHVzZVNlc3Npb25TdG9yYWdlLCB1c2VTaGFyZSwgdXNlU29ydGVkLCB1c2VTcGVlY2hSZWNvZ25pdGlvbiwgdXNlU3BlZWNoU3ludGhlc2lzLCB1c2VTdGVwcGVyLCB1c2VTdG9yYWdlLCB1c2VTdG9yYWdlQXN5bmMsIHVzZVN0eWxlVGFnLCB1c2VTdXBwb3J0ZWQsIHVzZVN3aXBlLCB1c2VUZW1wbGF0ZVJlZnNMaXN0LCB1c2VUZXh0RGlyZWN0aW9uLCB1c2VUZXh0U2VsZWN0aW9uLCB1c2VUZXh0YXJlYUF1dG9zaXplLCB1c2VUaHJvdHRsZWRSZWZIaXN0b3J5LCB1c2VUaW1lQWdvLCB1c2VUaW1lQWdvSW50bCwgdXNlVGltZW91dFBvbGwsIHVzZVRpbWVzdGFtcCwgdXNlVGl0bGUsIHVzZVRyYW5zaXRpb24sIHVzZVVybFNlYXJjaFBhcmFtcywgdXNlVXNlck1lZGlhLCB1c2VWTW9kZWwsIHVzZVZNb2RlbHMsIHVzZVZpYnJhdGUsIHVzZVZpcnR1YWxMaXN0LCB1c2VXYWtlTG9jaywgdXNlV2ViTm90aWZpY2F0aW9uLCB1c2VXZWJTb2NrZXQsIHVzZVdlYldvcmtlciwgdXNlV2ViV29ya2VyRm4sIHVzZVdpbmRvd0ZvY3VzLCB1c2VXaW5kb3dTY3JvbGwsIHVzZVdpbmRvd1NpemUgfTsiLCJpbXBvcnQgeyBicmVha3BvaW50c1RhaWx3aW5kLCB1c2VCcmVha3BvaW50cyBhcyBjb3JlVXNlQnJlYWtwb2ludHMgfSBmcm9tICdAdnVldXNlL2NvcmUnXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VCcmVha3BvaW50cygpIHtcbiAgICByZXR1cm4gY29yZVVzZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzVGFpbHdpbmQpXG59XG4iLCJpbXBvcnQgeyByZWYsIHRvVmFsdWUsIGlzUmVmLCBjb21wdXRlZCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICd2dWUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUkdCIHtcbiAgICByOiBudW1iZXJcbiAgICBnOiBudW1iZXJcbiAgICBiOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSR0JBIGV4dGVuZHMgUkdCIHtcbiAgICBhOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIU0wge1xuICAgIGg6IG51bWJlclxuICAgIHM6IG51bWJlclxuICAgIGw6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9LTENIIHtcbiAgICBsOiBudW1iZXJcbiAgICBjOiBudW1iZXJcbiAgICBoOiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY1JHQihjb2xvcjogc3RyaW5nKTogUkdCIHtcbiAgICBjb25zdCByZ2JNYXRjaCA9IC9yZ2JhP1xcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKykoPzosXFxzKltcXGQuXSspP1xcKS8uZXhlYyhjb2xvcilcblxuICAgIGlmICghcmdiTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFJHQiBjb2xvciBmb3JtYXQ6ICcgKyBjb2xvcilcbiAgICB9ICAgIFxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IHBhcnNlSW50KHJnYk1hdGNoWzFdKSxcbiAgICAgICAgZzogcGFyc2VJbnQocmdiTWF0Y2hbMl0pLFxuICAgICAgICBiOiBwYXJzZUludChyZ2JNYXRjaFszXSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UkdCQShjb2xvcjogc3RyaW5nKTogUkdCQSB7XG4gICAgY29uc3QgcmdiYU1hdGNoID0gL3JnYmFcXCgoXFxkKyksXFxzKihcXGQrKSxcXHMqKFxcZCspLFxccyooW1xcZC5dKylcXCkvLmV4ZWMoY29sb3IpXG4gICAgaWYgKCFyZ2JhTWF0Y2gpIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gcmdiIHdpdGggYWxwaGEgMVxuICAgICAgICBjb25zdCByZ2IgPSBleHRyYWNSR0IoY29sb3IpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZ2IsXG4gICAgICAgICAgICBhOiAxIFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IHBhcnNlSW50KHJnYmFNYXRjaFsxXSksXG4gICAgICAgIGc6IHBhcnNlSW50KHJnYmFNYXRjaFsyXSksXG4gICAgICAgIGI6IHBhcnNlSW50KHJnYmFNYXRjaFszXSksXG4gICAgICAgIGE6IHBhcnNlRmxvYXQocmdiYU1hdGNoWzRdKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvUkdCKGhleDogc3RyaW5nKTogUkdCIHtcbiAgICBjb25zdCBoZXhNYXRjaCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpXG5cbiAgICBpZiAoIWhleE1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIRVggY29sb3IgZm9ybWF0OiAnICsgaGV4KVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IHBhcnNlSW50KGhleE1hdGNoWzFdLCAxNiksXG4gICAgICAgIGc6IHBhcnNlSW50KGhleE1hdGNoWzJdLCAxNiksXG4gICAgICAgIGI6IHBhcnNlSW50KGhleE1hdGNoWzNdLCAxNilcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb1JnYihoc2w6IHN0cmluZyk6IFJHQiB7XG4gICAgY29uc3QgaHNsTWF0Y2ggPSAvaHNsYT9cXCgoXFxkKyksXFxzKihcXGQrKSUsXFxzKihcXGQrKSUoPzosXFxzKltcXGQuXSspP1xcKS8uZXhlYyhoc2wpXG5cbiAgICBpZiAoIWhzbE1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIU0wgY29sb3IgZm9ybWF0OiAnICsgaHNsKVxuICAgIH1cblxuICAgIGNvbnN0IGggPSBwYXJzZUludChoc2xNYXRjaFsxXSkgLyAzNjBcbiAgICBjb25zdCBzID0gcGFyc2VJbnQoaHNsTWF0Y2hbMl0pIC8gMTAwXG4gICAgY29uc3QgbCA9IHBhcnNlSW50KGhzbE1hdGNoWzNdKSAvIDEwMFxuXG4gICAgbGV0IHI6IG51bWJlclxuICAgIGxldCBnOiBudW1iZXJcbiAgICBsZXQgYjogbnVtYmVyXG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgICByID0gZyA9IGIgPSBsXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaHVlMnJnYiA9IChwOiBudW1iZXIsIHE6IG51bWJlciwgdDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodCA8IDApIHQgKz0gMVxuICAgICAgICAgICAgaWYgKHQgPiAxKSB0IC09IDFcbiAgICAgICAgICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0XG4gICAgICAgICAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcVxuICAgICAgICAgICAgaWYgKHQgPCAyIC8gMykgcmV0dXJuIHAgKyAocSAtIHApICogKDIgLyAzIC0gdCkgKiA2XG4gICAgICAgICAgICByZXR1cm4gcFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHNcbiAgICAgICAgY29uc3QgcCA9IDIgKiBsIC0gcVxuXG4gICAgICAgIHIgPSBodWUycmdiKHAsIHEsIGggKyAxIC8gMylcbiAgICAgICAgZyA9IGh1ZTJyZ2IocCwgcSwgaClcbiAgICAgICAgYiA9IGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHI6IE1hdGgucm91bmQociAqIDI1NSksXG4gICAgICAgIGc6IE1hdGgucm91bmQoZyAqIDI1NSksXG4gICAgICAgIGI6IE1hdGgucm91bmQoYiAqIDI1NSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JUb0hzbChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogSFNMIHtcbiAgICByIC89IDI1NVxuICAgIGcgLz0gMjU1XG4gICAgYiAvPSAyNTVcblxuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpXG4gICAgY29uc3QgbWluID0gTWF0aC5taW4ociwgZywgYilcbiAgICBjb25zdCBsID0gKG1heCArIG1pbikgLyAyXG5cbiAgICBpZiAobWF4ID09PSBtaW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGg6IDAsXG4gICAgICAgICAgICBzOiAwLFxuICAgICAgICAgICAgbDogTWF0aC5yb3VuZChsICogMTAwKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZCA9IG1heCAtIG1pblxuICAgIGNvbnN0IHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKVxuICAgIGxldCBoID0gMFxuXG4gICAgc3dpdGNoIChtYXgpIHtcbiAgICBjYXNlIHI6XG4gICAgICAgIGggPSAoKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCkpICogNjBcbiAgICAgICAgYnJlYWtcbiAgICBjYXNlIGc6XG4gICAgICAgIGggPSAoKGIgLSByKSAvIGQgKyAyKSAqIDYwXG4gICAgICAgIGJyZWFrXG4gICAgY2FzZSBiOlxuICAgICAgICBoID0gKChyIC0gZykgLyBkICsgNCkgKiA2MFxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGg6IE1hdGgucm91bmQoaCksXG4gICAgICAgIHM6IE1hdGgucm91bmQocyAqIDEwMCksXG4gICAgICAgIGw6IE1hdGgucm91bmQobCAqIDEwMClcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JUb0hleChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b0hleCA9IChuOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgaGV4ID0gbi50b1N0cmluZygxNilcbiAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyAnMCcgKyBoZXggOiBoZXhcbiAgICB9XG5cbiAgICByZXR1cm4gYCMke3RvSGV4KHIpfSR7dG9IZXgoZyl9JHt0b0hleChiKX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2JhVG9TdHJpbmcocmdiYTogUkdCQSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZ2JhKCR7cmdiYS5yfSwgJHtyZ2JhLmd9LCAke3JnYmEuYn0sICR7cmdiYS5hfSlgXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0T0tMQ0goY29sb3I6IHN0cmluZyk6IE9LTENIIHtcbiAgICBjb25zdCBva2xjaE1hdGNoID0gL29rbGNoXFwoKFtcXGQuXSspXFxzKyhbXFxkLl0rKVxccysoW1xcZC5dKylcXCkvLmV4ZWMoY29sb3IpXG5cbiAgICBpZiAoIW9rbGNoTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE9LTENIIGNvbG9yIGZvcm1hdDogJyArIGNvbG9yKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGw6IHBhcnNlRmxvYXQob2tsY2hNYXRjaFsxXSksXG4gICAgICAgIGM6IHBhcnNlRmxvYXQob2tsY2hNYXRjaFsyXSksXG4gICAgICAgIGg6IHBhcnNlRmxvYXQob2tsY2hNYXRjaFszXSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBva2xjaFRvUmdiKGNvbG9yOiBzdHJpbmcpOiBSR0Ige1xuICAgIGNvbnN0IG9rbGNoID0gZXh0cmFjdE9LTENIKGNvbG9yKVxuICAgIGNvbnN0IHsgbCwgYywgaCB9ID0gb2tsY2hcbiAgICBcbiAgICBjb25zdCBoUmFkID0gKGggKiBNYXRoLlBJKSAvIDE4MFxuICAgIGNvbnN0IGEgPSBjICogTWF0aC5jb3MoaFJhZClcbiAgICBjb25zdCBiID0gYyAqIE1hdGguc2luKGhSYWQpXG4gICAgXG4gICAgY29uc3QgbF8gPSBsICsgMC4zOTYzMzc3Nzc0ICogYSArIDAuMjE1ODAzNzU3MyAqIGJcbiAgICBjb25zdCBtXyA9IGwgLSAwLjEwNTU2MTM0NTggKiBhIC0gMC4wNjM4NTQxNzI4ICogYlxuICAgIGNvbnN0IHNfID0gbCAtIDAuMDg5NDg0MTc3NSAqIGEgLSAxLjI5MTQ4NTU0ODAgKiBiXG4gICAgXG4gICAgY29uc3QgbDMgPSBsXyAqIGxfICogbF9cbiAgICBjb25zdCBtMyA9IG1fICogbV8gKiBtX1xuICAgIGNvbnN0IHMzID0gc18gKiBzXyAqIHNfXG4gICAgXG4gICAgbGV0IHIgPSArNC4wNzY3NDE2NjIxICogbDMgLSAzLjMwNzcxMTU5MTMgKiBtMyArIDAuMjMwOTY5OTI5MiAqIHMzXG4gICAgbGV0IGcgPSAtMS4yNjg0MzgwMDQ2ICogbDMgKyAyLjYwOTc1NzQwMTEgKiBtMyAtIDAuMzQxMzE5Mzk2NSAqIHMzXG4gICAgbGV0IGJsdWUgPSAtMC4wMDQxOTYwODYzICogbDMgLSAwLjcwMzQxODYxNDcgKiBtMyArIDEuNzA3NjE0NzAxMCAqIHMzXG4gICAgXG4gICAgY29uc3QgZ2FtbWFDb3JyZWN0ID0gKHZhbDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgaWYgKHZhbCA+PSAwLjAwMzEzMDgpIHtcbiAgICAgICAgICAgIHJldHVybiAxLjA1NSAqIE1hdGgucG93KHZhbCwgMSAvIDIuNCkgLSAwLjA1NVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gMTIuOTIgKiB2YWxcbiAgICB9XG4gICAgXG4gICAgciA9IGdhbW1hQ29ycmVjdChyKVxuICAgIGcgPSBnYW1tYUNvcnJlY3QoZylcbiAgICBibHVlID0gZ2FtbWFDb3JyZWN0KGJsdWUpXG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcjogTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbigxLCByKSkgKiAyNTUpLFxuICAgICAgICBnOiBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGcpKSAqIDI1NSksXG4gICAgICAgIGI6IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYmx1ZSkpICogMjU1KVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvT2tsY2gocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IE9LTENIIHtcbiAgICByID0gciAvIDI1NVxuICAgIGcgPSBnIC8gMjU1XG4gICAgYiA9IGIgLyAyNTVcbiAgICBcbiAgICBjb25zdCBnYW1tYUV4cGFuZCA9ICh2YWw6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgIGlmICh2YWwgPj0gMC4wNDA0NSkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KCh2YWwgKyAwLjA1NSkgLyAxLjA1NSwgMi40KVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdmFsIC8gMTIuOTJcbiAgICB9XG4gICAgXG4gICAgciA9IGdhbW1hRXhwYW5kKHIpXG4gICAgZyA9IGdhbW1hRXhwYW5kKGcpXG4gICAgYiA9IGdhbW1hRXhwYW5kKGIpXG4gICAgXG4gICAgY29uc3QgbCA9IDAuNDEyMjIxNDcwOCAqIHIgKyAwLjUzNjMzMjUzNjMgKiBnICsgMC4wNTE0NDU5OTI5ICogYlxuICAgIGNvbnN0IG0gPSAwLjIxMTkwMzQ5ODIgKiByICsgMC42ODA2OTk1NDUxICogZyArIDAuMTA3Mzk2OTU2NiAqIGJcbiAgICBjb25zdCBzID0gMC4wODgzMDI0NjE5ICogciArIDAuMjgxNzE4ODM3NiAqIGcgKyAwLjYyOTk3ODcwMDUgKiBiXG4gICAgXG4gICAgY29uc3QgbF8gPSBNYXRoLmNicnQobClcbiAgICBjb25zdCBtXyA9IE1hdGguY2JydChtKVxuICAgIGNvbnN0IHNfID0gTWF0aC5jYnJ0KHMpXG4gICAgXG4gICAgY29uc3QgTCA9IDAuMjEwNDU0MjU1MyAqIGxfICsgMC43OTM2MTc3ODUwICogbV8gLSAwLjAwNDA3MjA0NjggKiBzX1xuICAgIGNvbnN0IGEgPSAxLjk3Nzk5ODQ5NTEgKiBsXyAtIDIuNDI4NTkyMjA1MCAqIG1fICsgMC40NTA1OTM3MDk5ICogc19cbiAgICBjb25zdCBiXyA9IDAuMDI1OTA0MDM3MSAqIGxfICsgMC43ODI3NzE3NjYyICogbV8gLSAwLjgwODY3NTc2NjAgKiBzX1xuICAgIFxuICAgIGNvbnN0IEMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiXyAqIGJfKVxuICAgIGxldCBIID0gTWF0aC5hdGFuMihiXywgYSkgKiAoMTgwIC8gTWF0aC5QSSlcbiAgICBcbiAgICBpZiAoSCA8IDApIHtcbiAgICAgICAgSCArPSAzNjBcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogTWF0aC5yb3VuZChMICogMTAwMCkgLyAxMDAwLFxuICAgICAgICBjOiBNYXRoLnJvdW5kKEMgKiAxMDAwKSAvIDEwMDAsXG4gICAgICAgIGg6IE1hdGgucm91bmQoSCAqIDEwMDApIC8gMTAwMFxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbG9yVHlwZShwYXlsb2FkPzogTWF5YmVSZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjb2xvciA9IGlzUmVmKHBheWxvYWQpID8gcGF5bG9hZCA6IHJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPih0b1ZhbHVlKHBheWxvYWQpKVxuICAgIFxuICAgIHJldHVybiBjb21wdXRlZDxzdHJpbmcgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sb3IudmFsdWUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoZXgnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXnJnYmEvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyZ2JhJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoL15yZ2IvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyZ2InXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXm9rbGNoLy50ZXN0KGNvbG9yLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnb2tsY2gnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgvXmhzbGEvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoc2xhJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoL15oc2wvLnRlc3QoY29sb3IudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdoc2wnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAndW5rbm93bidcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHR5cGUpIHtcbiAgICAgICAgICAgIGlmICghY29sb3IudmFsdWUgfHwgIXR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY3VycmVudFJnYiA9IHVzZVJHQihjb2xvcikudmFsdWVcblxuICAgICAgICAgICAgaWYgKCFjdXJyZW50UmdiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnaGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gcmdiVG9IZXgoY3VycmVudFJnYi5yLCBjdXJyZW50UmdiLmcsIGN1cnJlbnRSZ2IuYilcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiKCR7Y3VycmVudFJnYi5yfSwgJHtjdXJyZW50UmdiLmd9LCAke2N1cnJlbnRSZ2IuYn0pYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3JnYmEnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiYSgke2N1cnJlbnRSZ2Iucn0sICR7Y3VycmVudFJnYi5nfSwgJHtjdXJyZW50UmdiLmJ9LCAxKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaHNsID0gcmdiVG9Ic2woY3VycmVudFJnYi5yLCBjdXJyZW50UmdiLmcsIGN1cnJlbnRSZ2IuYilcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2woJHtoc2wuaH0sICR7aHNsLnN9JSwgJHtoc2wubH0lKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdoc2xhJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhzbCA9IHJnYlRvSHNsKGN1cnJlbnRSZ2IuciwgY3VycmVudFJnYi5nLCBjdXJyZW50UmdiLmIpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgaHNsYSgke2hzbC5ofSwgJHtoc2wuc30lLCAke2hzbC5sfSUpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9rbGNoID0gcmdiVG9Pa2xjaChjdXJyZW50UmdiLnIsIGN1cnJlbnRSZ2IuZywgY3VycmVudFJnYi5iKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYG9rbGNoKCR7b2tsY2gubH0gJHtva2xjaC5jfSAke29rbGNoLmh9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSR0IocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuXG4gICAgcmV0dXJuIGNvbXB1dGVkPFJHQiB8IG51bGw+KHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgaWYgKCFjb2xvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2JhID0gZXh0cmFjdFJHQkEoY29sb3IudmFsdWUpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByOiByZ2JhLnIsXG4gICAgICAgICAgICAgICAgICAgIGc6IHJnYmEuZyxcbiAgICAgICAgICAgICAgICAgICAgYjogcmdiYS5iIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY1JHQihjb2xvci52YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoZXgnICYmIGNvbG9yLnZhbHVlLmxlbmd0aCA9PT0gNykge1xuICAgICAgICAgICAgICAgIHJldHVybiBoZXhUb1JHQihjb2xvci52YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhzbFRvUmdiKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBva2xjaFRvUmdiKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQoKXtcbiAgICAgICAgICAgIGlmICghY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2InKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmdiID0gZXh0cmFjUkdCKGNvbG9yLnZhbHVlKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2JhID0gZXh0cmFjdFJHQkEoY29sb3IudmFsdWUpXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgcmdiYSgke3JnYmEucn0sICR7cmdiYS5nfSwgJHtyZ2JhLmJ9LCAke3JnYmEuYX0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJHQkEocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcblxuICAgIHJldHVybiBjb21wdXRlZDxSR0JBIHwgbnVsbD4oe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoIXJnYi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiYScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdFJHQkEoY29sb3IudmFsdWUhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnJnYi52YWx1ZSxcbiAgICAgICAgICAgICAgICBhOiAxXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCAhY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdyZ2JhJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYmEoJHt2YWx1ZS5yfSwgJHt2YWx1ZS5nfSwgJHt2YWx1ZS5ifSwgJHt2YWx1ZS5hfSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAncmdiJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3ZhbHVlLnJ9LCAke3ZhbHVlLmd9LCAke3ZhbHVlLmJ9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VIU0wocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcblxuICAgIHJldHVybiBjb21wdXRlZDxIU0wgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJnYlRvSHNsKHJnYi52YWx1ZS5yLCByZ2IudmFsdWUuZywgcmdiLnZhbHVlLmIpXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCAhY29sb3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoc2wnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSBgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnaHNsYScpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGBoc2xhKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlLnZhbHVlID09PSAnaGV4Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJnYiA9IGhzbFRvUmdiKGBoc2woJHt2YWx1ZS5ofSwgJHt2YWx1ZS5zfSUsICR7dmFsdWUubH0lKWApXG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSByZ2JUb0hleChyZ2IuciwgcmdiLmcsIHJnYi5iKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYmEnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmdiID0gaHNsVG9SZ2IoYGhzbCgke3ZhbHVlLmh9LCAke3ZhbHVlLnN9JSwgJHt2YWx1ZS5sfSUpYClcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2JhKCR7cmdiLnJ9LCAke3JnYi5nfSwgJHtyZ2IuYn0sIDEpYFxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBoc2xUb1JnYihgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYHJnYigke3JnYi5yfSwgJHtyZ2IuZ30sICR7cmdiLmJ9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdva2xjaCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZ2IgPSBoc2xUb1JnYihgaHNsKCR7dmFsdWUuaH0sICR7dmFsdWUuc30lLCAke3ZhbHVlLmx9JSlgKVxuICAgICAgICAgICAgICAgIGNvbnN0IG9rbGNoID0gcmdiVG9Pa2xjaChyZ2IuciwgcmdiLmcsIHJnYi5iKVxuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYG9rbGNoKCR7b2tsY2gubH0gJHtva2xjaC5jfSAke29rbGNoLmh9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VIZXgocGF5bG9hZD86IE1heWJlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBpc1JlZihwYXlsb2FkKSA/IHBheWxvYWQgOiByZWY8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4odG9WYWx1ZShwYXlsb2FkKSlcbiAgICBcbiAgICBjb25zdCB0eXBlID0gdXNlQ29sb3JUeXBlKGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcblxuICAgIHJldHVybiBjb21wdXRlZDxzdHJpbmcgfCBudWxsPih7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIGlmICghcmdiLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJnYlRvSGV4KHJnYi52YWx1ZS5yLCByZ2IudmFsdWUuZywgcmdiLnZhbHVlLmIpXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ2hleCcpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSA/IHZhbHVlIDogYCMke3ZhbHVlfWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbG9yKHBheWxvYWQ/OiBNYXliZVJlZjxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPikge1xuICAgIGNvbnN0IGNvbG9yID0gaXNSZWYocGF5bG9hZCkgPyBwYXlsb2FkIDogcmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KHRvVmFsdWUocGF5bG9hZCkpICAgIFxuICAgIGNvbnN0IHR5cGUgPSB1c2VDb2xvclR5cGUoY29sb3IpXG4gICAgY29uc3QgaGV4ID0gdXNlSGV4KGNvbG9yKVxuICAgIGNvbnN0IHJnYiA9IHVzZVJHQihjb2xvcilcbiAgICBjb25zdCByZ2JhID0gdXNlUkdCQShjb2xvcilcbiAgICBjb25zdCBoc2wgPSB1c2VIU0woY29sb3IpXG5cbiAgICBcbiAgICBjb25zdCBva2xjaCA9IGNvbXB1dGVkPE9LTENIIHwgbnVsbD4oe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBpZiAoIXJnYi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZ2JUb09rbGNoKHJnYi52YWx1ZS5yLCByZ2IudmFsdWUuZywgcmdiLnZhbHVlLmIpXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ29rbGNoJykge1xuICAgICAgICAgICAgICAgIGNvbG9yLnZhbHVlID0gYG9rbGNoKCR7dmFsdWUubH0gJHt2YWx1ZS5jfSAke3ZhbHVlLmh9KWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmdiID0gb2tsY2hUb1JnYihgb2tsY2goJHt2YWx1ZS5sfSAke3ZhbHVlLmN9ICR7dmFsdWUuaH0pYClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGUudmFsdWUgPT09ICdoZXgnKSB7XG4gICAgICAgICAgICAgICAgY29sb3IudmFsdWUgPSByZ2JUb0hleChyZ2IuciwgcmdiLmcsIHJnYi5iKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZS52YWx1ZSA9PT0gJ3JnYicpIHtcbiAgICAgICAgICAgICAgICBjb2xvci52YWx1ZSA9IGByZ2IoJHtyZ2Iucn0sICR7cmdiLmd9LCAke3JnYi5ifSlgXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGhleCxcbiAgICAgICAgcmdiLFxuICAgICAgICBoc2wsXG4gICAgICAgIG9rbGNoLFxuICAgICAgICByZ2JhXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgaW5qZWN0LCBwcm92aWRlIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSBEYXNoYm9hcmRFbnRpdHkgZnJvbSAnI2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmQudHMnXG5cbmNvbnN0IERBU0hCT0FSRF9LRVkgPSBTeW1ib2woJ2Rhc2hib2FyZCcpXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGFzaGJvYXJkKGVudGl0eTogUmVmPERhc2hib2FyZEVudGl0eT4pIHtcbiAgICBwcm92aWRlKERBU0hCT0FSRF9LRVksIGVudGl0eSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZURhc2hib2FyZCgpIHtcbiAgICBjb25zdCBlbnRpdHkgPSBpbmplY3Q8UmVmPERhc2hib2FyZEVudGl0eSB8IHVuZGVmaW5lZD4+KERBU0hCT0FSRF9LRVkpXG5cbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZURhc2hib2FyZCBtdXN0IGJlIHVzZWQgaW5zaWRlIGEgY29tcG9uZW50IHRoYXQgY2FsbHMgcHJvdmlkZURhc2hib2FyZCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBSZWY8RGFzaGJvYXJkRW50aXR5PlxufVxuIiwiaW1wb3J0IHsgaW5qZWN0LCBwcm92aWRlIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSBEYXNoYm9hcmRXaWRnZXQgZnJvbSAnI2NsaWVudC9lbnRpdGllcy9EYXNoYm9hcmRXaWRnZXQudHMnXG5cbmNvbnN0IEtFWSA9IFN5bWJvbCgnZGFzaGJvYXJkLXdpZGdldCcpXG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlRGFzaGJvYXJkV2lkZ2V0KGVudGl0eTogUmVmPERhc2hib2FyZFdpZGdldD4pIHtcbiAgICBwcm92aWRlKEtFWSwgZW50aXR5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRGFzaGJvYXJkV2lkZ2V0KCkge1xuICAgIGNvbnN0IGVudGl0eSA9IGluamVjdChLRVkpXG5cbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZURhc2hib2FyZFdpZGdldCBtdXN0IGJlIHVzZWQgaW5zaWRlIGEgY29tcG9uZW50IHRoYXQgY2FsbHMgcHJvdmlkZURhc2hib2FyZFdpZGdldCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBSZWY8RGFzaGJvYXJkV2lkZ2V0PlxufVxuIiwiaW1wb3J0IHsgcmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnXG5pbXBvcnQgZGkgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcblxuZXhwb3J0IGludGVyZmFjZSBVc2VTdGF0ZU9wdGlvbnMge1xuICAgIGRlZmF1bHQ/OiAoKSA9PiBhbnlcbiAgICB0cmFuc2Zvcm0/OiAodmFsdWU6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGF0ZTxUPihrZXk6IHN0cmluZywgb3B0aW9ucz86IFVzZVN0YXRlT3B0aW9ucyk6IFJlZjxUPiB7XG4gICAgY29uc3QgcmVmcyA9IGRpLmdldDxSZWNvcmQ8c3RyaW5nLCBhbnk+Pignc3RhdGUnKVxuXG4gICAgbGV0IHZhbHVlID0gcmVmc1trZXldXG5cbiAgICBpZiAoIXZhbHVlICYmIG9wdGlvbnM/LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IG9wdGlvbnMuZGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIG9wdGlvbnM/LnRyYW5zZm9ybSkge1xuICAgICAgICB2YWx1ZSA9IG9wdGlvbnMudHJhbnNmb3JtKHZhbHVlKVxuICAgIH1cbiAgICBcbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgY29uc3Qgc3RhdGUgPSByZWY8VD4odmFsdWUpXG5cbiAgICBjb25zdCB1cGRhdGUgPSAobmV3VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICByZWZzW2tleV0gPSBuZXdWYWx1ZVxuICAgICAgICBcbiAgICAgICAgZGkuc2V0KCdzdGF0ZScsIHJlZnMpXG4gICAgfVxuICAgIFxuICAgIHdhdGNoKHN0YXRlLCB1cGRhdGUsIHsgZGVlcDogdHJ1ZSB9KVxuXG4gICAgLy8gTG9naWMgdG8gaW5pdGlhbGl6ZSBhbmQgbWFuYWdlIHN0YXRlXG4gICAgcmV0dXJuIGNvbXB1dGVkPFQ+KHtcbiAgICAgICAgZ2V0OiAoKSA9PiBzdGF0ZS52YWx1ZSxcbiAgICAgICAgc2V0OiAobmV3VmFsdWU6IFQpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnZhbHVlID0gbmV3VmFsdWVcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdXBkYXRlKG5ld1ZhbHVlKVxuICAgICAgICB9XG4gICAgfSlcbn1cbiIsImltcG9ydCB7IGNvbXB1dGVkLCByZWYsIHRvUmVmLCB3YXRjaCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYsIFJlZiB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IHdhdGNoRGVib3VuY2VkIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJ1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICcuL3VzZVN0YXRlLnRzJ1xuaW1wb3J0IHR5cGUgUGFnaW5hdGlvbiBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMnXG5pbXBvcnQgJGZldGNoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZUZldGNoUGFnaW5hdGlvbk9wdGlvbnMge1xuICAgIGtleT86IHN0cmluZ1xuICAgIHF1ZXJ5PzogTWF5YmVSZWY8UmVjb3JkPHN0cmluZywgYW55Pj5cbiAgICBwYWdlPzogTWF5YmVSZWY8bnVtYmVyPlxuICAgIHNlcmlhbGl6ZT86IChpdGVtOiBhbnkpID0+IGFueVxuICAgIHJlZmluZT86IChpdGVtczogYW55W10pID0+IGFueVtdXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsXG4gICAgb3JkZXJEaXJlY3Rpb24/OiAnYXNjJyB8ICdkZXNjJyB8ICgnYXNjJyB8ICdkZXNjJylbXSB8IG51bGxcbiAgICBkZWJvdW5jZT86IG51bWJlclxuICAgIGltbWVkaWF0ZT86IGJvb2xlYW5cbn1cblxuY29uc3QgaHlkcmF0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlRmV0Y2hQYWdpbmF0aW9uPFQgPSBhbnk+KHVybDogc3RyaW5nLCBvcHRpb25zOiBVc2VGZXRjaFBhZ2luYXRpb25PcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleSB8fCB1cmxcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gdXNlU3RhdGU8UGFnaW5hdGlvbj4oa2V5LCB7XG4gICAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgdG90YWw6IDAsXG4gICAgICAgICAgICB0b3RhbF9wYWdlczogMSxcbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgY29uc3QgbG9hZGluZyA9IHJlZihmYWxzZSlcblxuICAgIGNvbnN0IHBhZ2UgPSB0b1JlZihvcHRpb25zLnBhZ2UgfHwgMSkgYXMgUmVmPG51bWJlcj5cbiAgICBjb25zdCBxdWVyeSA9IHRvUmVmKG9wdGlvbnMucXVlcnkgfHwge30pIGFzIFJlZjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgIGNvbnN0IGxpbWl0ID0gdG9SZWYob3B0aW9ucy5saW1pdCB8fCAxMCkgYXMgUmVmPG51bWJlcj5cbiAgICBjb25zdCBvcmRlckJ5ID0gdG9SZWYob3B0aW9ucy5vcmRlckJ5IHx8IG51bGwpIGFzIFJlZjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+XG4gICAgY29uc3Qgb3JkZXJEaXJlY3Rpb24gPSB0b1JlZihvcHRpb25zLm9yZGVyRGlyZWN0aW9uIHx8IG51bGwpIGFzIFJlZjwnYXNjJyB8ICdkZXNjJyB8ICgnYXNjJyB8ICdkZXNjJylbXSB8IG51bGw+XG5cbiAgICBjb25zdCB0b3RhbCA9IGNvbXB1dGVkKCgpID0+IHJlc3BvbnNlLnZhbHVlLnRvdGFsKVxuICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBjb21wdXRlZCgoKSA9PiByZXNwb25zZS52YWx1ZS50b3RhbF9wYWdlcylcbiAgICBjb25zdCBpdGVtcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgbGV0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS52YWx1ZS5pdGVtcykgPyByZXNwb25zZS52YWx1ZS5pdGVtcyA6IFtdXG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVmaW5lKSB7XG4gICAgICAgICAgICBpdGVtcyA9IG9wdGlvbnMucmVmaW5lKGl0ZW1zKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWFsaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbXMubWFwKGkgPT4gb3B0aW9ucy5zZXJpYWxpemUhKGkpKSBhcyBUW11cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtcyBhcyBUW11cbiAgICB9KVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZCgpIHtcbiAgICAgICAgaWYgKGxvYWRpbmcudmFsdWUpIHJldHVyblxuXG4gICAgICAgIGxvYWRpbmcudmFsdWUgPSB0cnVlXG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAuLi5xdWVyeS52YWx1ZSxcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UudmFsdWUsXG4gICAgICAgICAgICBsaW1pdDogbGltaXQudmFsdWUsXG4gICAgICAgICAgICBvcmRlckJ5OiBvcmRlckJ5LnZhbHVlID8gb3JkZXJCeS52YWx1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9yZGVyRGlyZWN0aW9uOiBvcmRlckRpcmVjdGlvbi52YWx1ZSA/IG9yZGVyRGlyZWN0aW9uLnZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICB9KSlcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdF0gPSBhd2FpdCAkZmV0Y2gudHJ5PFBhZ2luYXRpb24+KHVybCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHF1ZXJ5OiBwYXJhbXNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2UudmFsdWUgPSByZXN1bHRcblxuICAgICAgICBpZiAoaW1wb3J0Lm1ldGEuZW52LlNTUikge1xuICAgICAgICAgICAgbG9hZGluZy52YWx1ZSA9IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA4MDApKVxuXG4gICAgICAgIGxvYWRpbmcudmFsdWUgPSBmYWxzZVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgICBpZiAocGFnZS52YWx1ZSA9PT0gMSkge1xuICAgICAgICAgICAgYXdhaXQgbG9hZCgpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2UudmFsdWUgPSAxXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25RdWVyeUNoYW5nZShuZXdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBvbGREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnN0IGlzRXF1YWwgPSBKU09OLnN0cmluZ2lmeShuZXdEYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkob2xkRGF0YSlcblxuICAgICAgICBpZiAoIWlzRXF1YWwpIHtcbiAgICAgICAgICAgIHJlc2V0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdhdGNoKFtwYWdlLCBsaW1pdF0sIGxvYWQpXG4gICAgd2F0Y2goW29yZGVyQnksIG9yZGVyRGlyZWN0aW9uXSwgcmVzZXQsIHsgZGVlcDogdHJ1ZSB9KVxuXG4gICAgd2F0Y2hEZWJvdW5jZWQoXG4gICAgICAgICgpID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocXVlcnkudmFsdWUpKSxcbiAgICAgICAgb25RdWVyeUNoYW5nZSxcbiAgICAgICAge1xuICAgICAgICAgICAgZGVib3VuY2U6IG9wdGlvbnMuZGVib3VuY2UgfHwgMTAwMFxuICAgICAgICB9XG4gICAgKVxuXG5cbiAgICBhc3luYyBmdW5jdGlvbiBoeWRyYXRlKCkge1xuICAgICAgICBpZiAoIWh5ZHJhdGVkLmhhcyhrZXkpICYmIGl0ZW1zLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgaHlkcmF0ZWQuYWRkKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaHlkcmF0ZWQuYWRkKGtleSlcblxuICAgICAgICBhd2FpdCBsb2FkKClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwYWdlLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb3JkZXJCeSxcbiAgICAgICAgb3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIHRvdGFsLFxuICAgICAgICB0b3RhbFBhZ2VzLFxuICAgICAgICBpdGVtcyxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgbG9hZCxcbiAgICAgICAgcmVzZXQsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBoeWRyYXRlXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBWYWxpYm90T2JqZWN0U2NoZW1hLCB0eXBlIFZhbGlib3RTY2hlbWEsIHR5cGUgVmFsaWRhdGVQYXlsb2FkLCB0eXBlIFZhbGlkYXRvclJlc3VsdCB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnO1xuaW1wb3J0IHsgdG9UeXBlZFNjaGVtYSBhcyAgdmVlVmFsaWRhdGVUb1R5cGVkU2NoZW1hIH0gZnJvbSAnQHZlZS12YWxpZGF0ZS92YWxpYm90JztcbmltcG9ydCB7IHVzZUZvcm0gYXMgdXNlVmVlVmFsaWRhdGVGb3JtLCB0eXBlIEZvcm1Db250ZXh0LCB0eXBlIEZvcm1PcHRpb25zLCB0eXBlIEdlbmVyaWNPYmplY3QgfSBmcm9tICd2ZWUtdmFsaWRhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlib3RGb3JtT3B0aW9uczxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA9IFZhbGlib3RTY2hlbWE+IFxuICAgIGV4dGVuZHMgT21pdDxGb3JtT3B0aW9uczxWYWxpZGF0ZVBheWxvYWQ8VD4sIFZhbGlkYXRvclJlc3VsdDxUPj4sICd2YWxpZGF0aW9uU2NoZW1hJz4ge31cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpYm90Rm9ybVJlc3VsdE9iamVjdDxUIGV4dGVuZHMgVmFsaWJvdE9iamVjdFNjaGVtYT5cbiAgICBleHRlbmRzIEdlbmVyaWNPYmplY3QsXG4gICAgRm9ybUNvbnRleHQ8VmFsaWRhdG9yUmVzdWx0PFQ+PlxuICAgIHt9XG5cbmV4cG9ydCBjb25zdCB1c2VGb3JtID0gdXNlVmFsaWJvdEZvcm07XG5cbmV4cG9ydCBjb25zdCB0b1R5cGVkU2NoZW1hID0gdmVlVmFsaWRhdGVUb1R5cGVkU2NoZW1hO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlVmFsaWJvdEZvcm08VCBleHRlbmRzIFZhbGlib3RPYmplY3RTY2hlbWEgPSBWYWxpYm90T2JqZWN0U2NoZW1hPihzY2hlbWE6IFQsIG9wdGlvbnM6IFZhbGlib3RGb3JtT3B0aW9uczxUPiA9IHt9KTogRm9ybUNvbnRleHQ8VmFsaWRhdG9yUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIHVzZVZlZVZhbGlkYXRlRm9ybSh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHZhbGlkYXRpb25TY2hlbWE6IHZlZVZhbGlkYXRlVG9UeXBlZFNjaGVtYShzY2hlbWEgYXMgYW55KSxcbiAgICB9KSBhcyBhbnlcbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCAqIGFzIFVuaGVhZFZ1ZSBmcm9tICdAdW5oZWFkL3Z1ZSdcblxuZXhwb3J0IGNvbnN0IFVOSEVBRF9WVUVfQ09OVEFJTkVSX0tFWSA9ICd1bmhlYWQtdnVlJ1xuXG5jb25zdCB1bmhlYWRWdWUgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFVuaGVhZFZ1ZT4oVU5IRUFEX1ZVRV9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB1bmhlYWRWdWVcbiIsImltcG9ydCB1bmhlYWRWdWUgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3VuaGVhZFZ1ZS50cydcblxuY29uc3QgemVuaXRoVXNlSGVhZCA9ICguLi5hcmdzOiBhbnkpID0+IHtcbiAgICByZXR1cm4gdW5oZWFkVnVlLnVzZUhlYWQoLi4uYXJncylcbn1cblxuZXhwb3J0IGNvbnN0IHVzZUhlYWQgPSB6ZW5pdGhVc2VIZWFkIGFzIHR5cGVvZiB1bmhlYWRWdWUudXNlSGVhZFxuXG4iLCJpbXBvcnQgTGF5b3V0TWFuYWdlciBmcm9tIFwiI2NsaWVudC9zZXJ2aWNlcy9MYXlvdXRTZXJ2aWNlLnRzXCI7XG5cbmNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIGFueVxuXG5jb25zdCBsYXlvdXQgPSBnLmxheW91dCB8fCBuZXcgTGF5b3V0TWFuYWdlcigpXG5cbmcubGF5b3V0ID0gbGF5b3V0XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dFxuIiwiaW1wb3J0IGVtbWl0dGVyIGZyb20gXCIjY2xpZW50L2ZhY2FkZXMvZW1taXR0ZXIudHNcIlxuaW1wb3J0IGxheW91dCBmcm9tIFwiI2NsaWVudC9mYWNhZGVzL2xheW91dC50c1wiXG5pbXBvcnQgeyByZWYgfSBmcm9tIFwidnVlXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUxheW91dE9wdGlvbnMoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHJlZihsYXlvdXQuZ2V0T3B0aW9ucygpKVxuXG4gICAgY29uc3QgcmVmcmVzaCA9ICgpID0+IHtcbiAgICAgICAgb3B0aW9ucy52YWx1ZSA9IGxheW91dC5nZXRPcHRpb25zKClcbiAgICB9XG5cbiAgICBlbW1pdHRlci5vbignbGF5b3V0OmNoYW5nZScsIHJlZnJlc2gpXG4gICAgZW1taXR0ZXIub24oJ2xheW91dDpzZXQtb3B0aW9ucycsIHJlZnJlc2gpXG5cbiAgICByZXR1cm4gb3B0aW9uc1xufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiAgfSBmcm9tICd2dWUnXG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSdcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgIHRpbWVvdXQ/OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIExvYWRpbmdSZWYgZXh0ZW5kcyBSZWY8Ym9vbGVhbj4ge1xuICAgIHNldDogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VMb2FkaW5nKGRlZmF1bHRWYWx1ZSA9IGZhbHNlLCBvcHRpb25zPzogT3B0aW9ucykge1xuICAgIGNvbnN0IHN0YXRlID0gcmVmKGRlZmF1bHRWYWx1ZSlcbiAgICBjb25zdCB0aW1lb3V0ID0gcmVmKG9wdGlvbnM/LnRpbWVvdXQgPz8gNTAwKVxuXG4gICAgZnVuY3Rpb24gc2V0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkaW5nID0gY29tcHV0ZWQoe1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUudmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS52YWx1ZSA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0KGZhbHNlKSwgdGltZW91dC52YWx1ZSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBsb2FkaW5nUmVmOiBMb2FkaW5nUmVmID0gT2JqZWN0LmFzc2lnbihsb2FkaW5nLCB7IHNldCB9KVxuXG4gICAgcmV0dXJuIGxvYWRpbmdSZWZcblxufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIHJlZiB9IGZyb20gJ3Z1ZSdcblxuZXhwb3J0IGludGVyZmFjZSBNZW51QmFzZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgb3JkZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudVNpbmdsZSAgZXh0ZW5kcyBNZW51QmFzZSB7XG4gICAgaWNvbjogc3RyaW5nO1xuICAgIHRvOiBzdHJpbmc7XG4gICAgdGFyZ2V0PzogJ19ibGFuaycgfCAnX3NlbGYnIHwgJ19wYXJlbnQnIHwgJ190b3AnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVXaXRoQ2hpbGRyZW4gZXh0ZW5kcyBNZW51QmFzZSB7XG4gICAgaWNvbjogc3RyaW5nO1xuICAgIGNoaWxkcmVuOiBPbWl0PE1lbnVTaW5nbGUsICdpY29uJz5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW51R3JvdXAgZXh0ZW5kcyBNZW51QmFzZSB7XG4gICAgZ3JvdXA6IGJvb2xlYW47XG4gICAgaXRlbXM6IE1lbnVJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW0ge1xuICAgIGlkOiBzdHJpbmdcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHRvPzogc3RyaW5nO1xuICAgIHRhcmdldD86ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJztcbiAgICBncm91cD86IHN0cmluZ1xuICAgIG9yZGVyPzogbnVtYmVyO1xuICAgIGljb24/OiBzdHJpbmdcbiAgICBwYXJlbnQ/OiBzdHJpbmdcbiAgICBsYXlvdXQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgVXNlTWVudSA9IFJldHVyblR5cGU8dHlwZW9mIHVzZU1lbnU+XG5cbmNvbnN0IGl0ZW1zID0gcmVmPE1hcDxzdHJpbmcsIE1lbnVJdGVtPj4obmV3IE1hcCgpKVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVudSgpIHtcbiAgICBmdW5jdGlvbiBhZGQoLi4uaXRlbTogTWVudUl0ZW1bXSkge1xuICAgICAgICBpdGVtLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBpZiAoIWkubGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgaS5sYXlvdXQgPSAnYWRtaW4nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGl0ZW1zLnZhbHVlLnNldChpLmlkLCBpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZShpdGVtOiBNZW51SXRlbSB8IE1lbnVJdGVtWydpZCddKSB7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaXRlbXMudmFsdWUuZGVsZXRlKGl0ZW0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVHcm91cChncm91cElkOiBzdHJpbmcpIHtcbiAgICAgICAgQXJyYXkuZnJvbShpdGVtcy52YWx1ZS52YWx1ZXMoKSlcbiAgICAgICAgICAgIC5maWx0ZXIoaSA9PiBpLmdyb3VwID09PSBncm91cElkIHx8IGkucGFyZW50ID09PSBncm91cElkKVxuICAgICAgICAgICAgLmZvckVhY2goaSA9PiBpdGVtcy52YWx1ZS5kZWxldGUoaS5pZCkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlTWFueShpdGVtSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBpdGVtSWRzLmZvckVhY2goaWQgPT4gcmVtb3ZlKGlkKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVNYW55R3JvdXAoZ3JvdXBJZHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGdyb3VwSWRzLmZvckVhY2goaWQgPT4gcmVtb3ZlR3JvdXAoaWQpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBpdGVtcy52YWx1ZS5jbGVhcigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IGNvbXB1dGVkKCgpID0+IEFycmF5LmZyb20oaXRlbXMudmFsdWUudmFsdWVzKCkpKSxcbiAgICAgICAgYWRkLFxuICAgICAgICByZW1vdmUsXG4gICAgICAgIHJlbW92ZUdyb3VwLFxuICAgICAgICByZW1vdmVNYW55LFxuICAgICAgICByZW1vdmVNYW55R3JvdXAsXG4gICAgICAgIGNsZWFyXG4gICAgfVxufSIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCB0eXBlIHsgUm91dGVMb2NhdGlvbk5vcm1hbGl6ZWRHZW5lcmljIH0gZnJvbSAndnVlLXJvdXRlcidcblxuY29uc3Qgcm91dGUgPSBjb250YWluZXIucHJveHk8Um91dGVMb2NhdGlvbk5vcm1hbGl6ZWRHZW5lcmljPigncm91dGUnKVxuXG5leHBvcnQgZGVmYXVsdCByb3V0ZVxuXG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlciB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcblxuY29uc3Qgcm91dGVyID0gY29udGFpbmVyLnByb3h5PFJvdXRlcj4oJ3JvdXRlcicpXG5cbmV4cG9ydCBkZWZhdWx0IHJvdXRlclxuIiwiaW1wb3J0IHJvdXRlIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZS50cydcbmltcG9ydCByb3V0ZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3JvdXRlci50cydcblxuaW1wb3J0IHsgdXNlUm91dGVRdWVyeSBhcyB2dWVVc2VyUm91dGVRdWVyeSB9IGZyb20gJ0B2dWV1c2Uvcm91dGVyJ1xuXG5jb25zdCB6ZW5pdGhVc2VSb3V0ZVF1ZXJ5PSAoa2V5OiBhbnksIGRlZmF1bHRWYWx1ZTogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICByZXR1cm4gdnVlVXNlclJvdXRlUXVlcnkoa2V5LCBkZWZhdWx0VmFsdWUsIHtcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1c2VSb3V0ZVF1ZXJ5ID0gemVuaXRoVXNlUm91dGVRdWVyeSBhcyB0eXBlb2YgdnVlVXNlclJvdXRlUXVlcnlcblxuIiwiaW1wb3J0IEF1dGhTZXJ2aWNlIGZyb20gJyNjbGllbnQvc2VydmljZXMvQXV0aFNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBhdXRoID0gY29udGFpbmVyLnByb3h5PEF1dGhTZXJ2aWNlPihBdXRoU2VydmljZSlcblxuaWYgKGltcG9ydC5tZXRhLmVudi5ERVYgJiYgIWltcG9ydC5tZXRhLmVudi5TU1IpIHtcbiAgICAod2luZG93IGFzIGFueSkuYXV0aCA9IGF1dGhcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXV0aFxuIiwiaW1wb3J0IHR5cGUgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBmcm9tICcjY2xpZW50L2VudGl0aWVzL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldFJlZ2lzdHJ5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeSdcbiAgICBwcml2YXRlIGRlZmluaXRpb25zOiBNYXA8c3RyaW5nLCBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uPiA9IG5ldyBNYXAoKVxuXG4gICAgcHVibGljIHJlZ2lzdGVyKC4uLmRlZmluaXRpb246IERhc2hib2FyZFdpZGdldERlZmluaXRpb25bXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiBkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluaXRpb25zLnNldChkZWYuaWQsIGRlZilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZyk6IERhc2hib2FyZFdpZGdldERlZmluaXRpb24gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbnMuZ2V0KGlkKSB8fCBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKTogRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kZWZpbml0aW9ucy52YWx1ZXMoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgRGFzaGJvYXJkV2lkZ2V0UmVnaXN0cnkgZnJvbSAnI2NsaWVudC9yZWdpc3RyeS9EYXNoYm9hcmRXaWRnZXRSZWdpc3RyeS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGRhc2hib2FyZFJlZ2lzdHJ5ID0gY29udGFpbmVyLnByb3h5PERhc2hib2FyZFdpZGdldFJlZ2lzdHJ5PihEYXNoYm9hcmRXaWRnZXRSZWdpc3RyeSlcblxuZXhwb3J0IGRlZmF1bHQgZGFzaGJvYXJkUmVnaXN0cnlcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5pbXBvcnQgTGlmZWN5Y2xlU2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL0xpZmVjeWNsZVNlcnZpY2UudHMnXG5cbmNvbnN0IGxpZmVjeWNsZSA9IGNvbnRhaW5lci5wcm94eTxMaWZlY3ljbGVTZXJ2aWNlPihMaWZlY3ljbGVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBsaWZlY3ljbGVcbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGxvZ2dlciA9IGNvbnRhaW5lci5wcm94eTxMb2dnZXJTZXJ2aWNlPihMb2dnZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXJcbiIsImltcG9ydCBNZW51U2VydmljZSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL01lbnVTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbWVudSA9IGNvbnRhaW5lci5wcm94eTxNZW51U2VydmljZT4oTWVudVNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IG1lbnVcbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2NvbnRhaW5lci50cydcbmltcG9ydCBUb2FzdFNlcnZpY2UgZnJvbSAnI2NsaWVudC9zZXJ2aWNlcy9Ub2FzdFNlcnZpY2UudHMnXG5cbmNvbnN0IHRvYXN0ID0gY29udGFpbmVyLnByb3h5PFRvYXN0U2VydmljZT4oVG9hc3RTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCB0b2FzdFxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjY2xpZW50L2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0ICogYXMgVmVlVmFsaWRhdGUgZnJvbSAndmVlLXZhbGlkYXRlJ1xuXG5leHBvcnQgY29uc3QgVkVFX1ZBTElEQVRFX0NPTlRBSU5FUl9LRVkgPSAndmVlLXZhbGlkYXRlJ1xuXG5jb25zdCB2ZWVWYWxpZGF0ZSA9IGNvbnRhaW5lci5wcm94eTx0eXBlb2YgVmVlVmFsaWRhdGU+KFZFRV9WQUxJREFURV9DT05UQUlORVJfS0VZKVxuXG5leHBvcnQgZGVmYXVsdCB2ZWVWYWxpZGF0ZVxuIiwiXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgKiBhcyBWdWUgZnJvbSAndnVlJ1xuXG5leHBvcnQgY29uc3QgVlVFX0NPTlRBSU5FUl9LRVkgPSAnVnVlJ1xuXG5jb25zdCB2dWUgPSBjb250YWluZXIucHJveHk8dHlwZW9mIFZ1ZT4oVlVFX0NPTlRBSU5FUl9LRVkpXG5cbmV4cG9ydCBkZWZhdWx0IHZ1ZVxuIiwiXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNjbGllbnQvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgKiBhcyBWdWVSb3V0ZXIgZnJvbSAndnVlLXJvdXRlcidcblxuZXhwb3J0IGNvbnN0IFZVRV9ST1VURVJfQ09OVEFJTkVSX0tFWSA9ICdWdWVSb3V0ZXInXG5cbmNvbnN0IHZ1ZVJvdXRlciA9IGNvbnRhaW5lci5wcm94eTx0eXBlb2YgVnVlUm91dGVyPihWVUVfUk9VVEVSX0NPTlRBSU5FUl9LRVkpXG5cbmV4cG9ydCBkZWZhdWx0IHZ1ZVJvdXRlclxuIiwiaW1wb3J0IHsgY3JlYXRlSWQgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2luZGV4LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZEdyaWRVbml0IHtcbiAgICBiYXNlPzogbnVtYmVyXG4gICAgc20/OiBudW1iZXJcbiAgICBtZD86IG51bWJlclxuICAgIGxnPzogbnVtYmVyXG4gICAgeGw/OiBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkV2lkZ2V0RGF0YSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlZmluaXRpb25faWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBjb2x1bW5zOiBEYXNoYm9hcmRHcmlkVW5pdCBcbiAgICBwdWJsaWMgcm93czogRGFzaGJvYXJkR3JpZFVuaXRcbiAgICBwdWJsaWMgeDogRGFzaGJvYXJkR3JpZFVuaXRcbiAgICBwdWJsaWMgeTogRGFzaGJvYXJkR3JpZFVuaXRcbiAgICBwdWJsaWMgb3JkZXI6IG51bWJlclxuICAgIHB1YmxpYyBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPERhc2hib2FyZFdpZGdldERhdGE+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcblxuICAgICAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSBjcmVhdGVJZCgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge31cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkV2lkZ2V0QWN0aW9uIHtcbiAgICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBjb21wb25lbnQ6IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgaWNvbj86IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaWQgPSAnJ1xuICAgICAgICB0aGlzLm5hbWUgPSAnJ1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gJydcbiAgICAgICAgdGhpcy5pY29uID0gJydcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50KCk6IGFueSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcHVibGljIGFjdGlvbnMoKTogRGFzaGJvYXJkV2lkZ2V0QWN0aW9uW10ge1xuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59XG4iLCJpbXBvcnQgRW1taXR0ZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHR5cGUgRGFzaGJvYXJkV2lkZ2V0RGF0YSBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERhdGEnXG5pbXBvcnQgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24nXG5pbXBvcnQgZGFzaGJvYXJkUmVnaXN0cnkgZnJvbSAnI2NsaWVudC9mYWNhZGVzL2Rhc2hib2FyZFJlZ2lzdHJ5LnRzJ1xuXG5leHBvcnQgY29uc3QgREFTSEJPQVJEX1JPV19IRUlHSFQgPSA4MFxuXG5pbnRlcmZhY2UgRGFzaGJvYXJkV2lkZ2V0T3B0aW9ucyB7XG4gICAgZGF0YTogRGFzaGJvYXJkV2lkZ2V0RGF0YVxuICAgIGRlZmluaXRpb246IERhc2hib2FyZFdpZGdldERlZmluaXRpb25cbn1cblxuaW50ZXJmYWNlIFN0eWxlc09wdGlvbnMge1xuICAgIGNvbnRpYW5lcldpZHRoOiBudW1iZXJcbiAgICBicmVha3BvaW50PzogJ2Jhc2UnIHwgJ3NtJyB8ICdtZCcgfCAneGwnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldCB7XG4gICAgcHVibGljIGRhdGE6IERhc2hib2FyZFdpZGdldERhdGFcbiAgICBwdWJsaWMgZGVmaW5pdGlvbjogRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvblxuICAgIHB1YmxpYyBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3Rvcih7IGRhdGEsIGRlZmluaXRpb24gfTogRGFzaGJvYXJkV2lkZ2V0T3B0aW9ucykge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb25cbiAgICAgICAgdGhpcy5lbW1pdHRlciA9IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbURhdGEoZGF0YTogRGFzaGJvYXJkV2lkZ2V0RGF0YSkge1xuICAgICAgICBsZXQgZGVmID0gZGFzaGJvYXJkUmVnaXN0cnkuZ2V0KGRhdGEuZGVmaW5pdGlvbl9pZClcblxuICAgICAgICBpZiAoIWRlZikge1xuICAgICAgICAgICAgZGVmID0gbmV3IERhc2hib2FyZFdpZGdldERlZmluaXRpb24oKVxuICAgICAgICAgICAgZGVmLm5hbWUgPSBgVW5rbm93bjogJHtkYXRhLmRlZmluaXRpb25faWR9YFxuICAgICAgICAgICAgZGVmLmlkID0gZGF0YS5kZWZpbml0aW9uX2lkXG5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBub3QgZm91bmQgZm9yIGlkOiAke2RhdGEuZGVmaW5pdGlvbl9pZH0uIFVzaW5nIHVua25vd24gZGVmaW5pdGlvbi5gKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRXaWRnZXQoe1xuICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgIGRlZmluaXRpb246IGRlZixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RW1taXR0ZXIoZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmVtbWl0dGVyID0gZW1taXR0ZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuaWRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5uYW1lXG4gICAgfVxuXG4gICAgcHVibGljIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy51cGRhdGUoeyBuYW1lOiB2YWx1ZSB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3B0aW9ucygpOiBEYXNoYm9hcmRXaWRnZXREYXRhWydvcHRpb25zJ10ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm9wdGlvbnMgfHwge31cbiAgICB9XG5cblxuICAgIHB1YmxpYyBnZXQgZGVmaW5pdGlvbl9pZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmRlZmluaXRpb25faWRcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uLmNvbXBvbmVudCgpXG4gICAgfVxuXG4gICAgcHVibGljIGFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluaXRpb24uYWN0aW9ucygpXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2x1bW5zKCk6IERhc2hib2FyZFdpZGdldERhdGFbJ2NvbHVtbnMnXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29sdW1ucyB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1ucyhwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWydjb2x1bW5zJ10pIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLmNvbHVtbnMgfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWydjb2x1bW5zJ11cblxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbnMsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyBjb2x1bW5zIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCk6IERhc2hib2FyZFdpZGdldERhdGFbJ3Jvd3MnXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucm93cyB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93cyhwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWydyb3dzJ10pIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnJvd3MgfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWydyb3dzJ11cblxuICAgICAgICBPYmplY3QuYXNzaWduKHJvd3MsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyByb3dzIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCB4KCk6IERhc2hib2FyZFdpZGdldERhdGFbJ3gnXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEueCB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgeChwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J10pIHtcbiAgICAgICAgY29uc3QgeCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnggfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J11cblxuICAgICAgICBPYmplY3QuYXNzaWduKHgsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyB4IH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCB5KCk6IERhc2hib2FyZFdpZGdldERhdGFbJ3knXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEueSB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgeShwYXlsb2FkOiBEYXNoYm9hcmRXaWRnZXREYXRhWyd5J10pIHtcbiAgICAgICAgY29uc3QgeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLnkgfHwge30pKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWyd5J11cblxuICAgICAgICBPYmplY3QuYXNzaWduKHksIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyB5IH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGNsYXNzZXMudmFsdWVzKCkpLmpvaW4oJyAnKVxuICAgIH1cblxuICAgIHB1YmxpYyBjb21wdXRlU3R5bGVzKG9wdGlvbnM6IFN0eWxlc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIGNvbnN0IGJyZWFrcG9pbnQgPSBvcHRpb25zLmJyZWFrcG9pbnQgPz8gJ2Jhc2UnXG5cbiAgICAgICAgY29uc3QgeCA9IHRoaXMueFticmVha3BvaW50XSA/PyAwXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLnlbYnJlYWtwb2ludF0gPz8gMFxuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5jb2x1bW5zW2JyZWFrcG9pbnRdID8/IDFcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMucm93c1ticmVha3BvaW50XSA/PyAxXG5cbiAgICAgICAgY29uc3QgY29sU2l6ZSA9IG9wdGlvbnMuY29udGlhbmVyV2lkdGggLyAxMlxuICAgICAgICBjb25zdCByb3dTaXplID0gREFTSEJPQVJEX1JPV19IRUlHSFRcblxuICAgICAgICBzdHlsZXMuc2V0KCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXG4gICAgICAgIHN0eWxlcy5zZXQoJ2xlZnQnLCBgJHt4ICogY29sU2l6ZX1weGApXG4gICAgICAgIHN0eWxlcy5zZXQoJ3RvcCcsIGAke3kgKiByb3dTaXplfXB4YClcbiAgICAgICAgc3R5bGVzLnNldCgnd2lkdGgnLCBgJHtjb2xzICogY29sU2l6ZSAtIDEwfXB4YCkgLy8gcGFkZGluZyBhbmQgc2Nyb2xsYmFyIGNvbXBlbnNhdGlvblxuICAgICAgICBzdHlsZXMuc2V0KCdoZWlnaHQnLCBgJHtyb3dzICogcm93U2l6ZX1weGApXG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc3R5bGVzLmVudHJpZXMoKSlcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHt2YWx1ZX07YClcbiAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKHBheWxvYWQ6IFBhcnRpYWw8RGFzaGJvYXJkV2lkZ2V0RGF0YT4pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRhdGEsIHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbW1pdHRlci5lbWl0KCd3aWRnZXQ6dXBkYXRlZCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldE9wdGlvbihrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEub3B0aW9ucyB8fCB7fSkpXG5cbiAgICAgICAgc2V0KG9wdGlvbnMsIGtleSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy51cGRhdGUoeyBvcHRpb25zIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHNldFgoYnJlYWtwb2ludDogJ2Jhc2UnIHwgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJywgdmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB4ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLngpKSBhcyBEYXNoYm9hcmRXaWRnZXREYXRhWyd4J11cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIHhbYnJlYWtwb2ludF1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB4W2JyZWFrcG9pbnRdID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKHsgeCB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRZKGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy55KSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsneSddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB5W2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgeVticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IHkgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29sdW1uKGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb2x1bW5zKSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsnY29sdW1ucyddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW5zW2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29sdW1uc1ticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IGNvbHVtbnMgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Um93KGJyZWFrcG9pbnQ6ICdiYXNlJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcsIHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dzKSkgYXMgRGFzaGJvYXJkV2lkZ2V0RGF0YVsncm93cyddXG5cbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSByb3dzW2JyZWFrcG9pbnRdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcm93c1ticmVha3BvaW50XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZSh7IHJvd3MgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgRW1taXR0ZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IERhc2hib2FyZFdpZGdldERhdGEgZnJvbSAnLi9EYXNoYm9hcmRXaWRnZXREYXRhJ1xuaW1wb3J0IERhc2hib2FyZFdpZGdldCBmcm9tICcuL0Rhc2hib2FyZFdpZGdldCdcbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkU2NoZW1hIH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL2Rhc2hib2FyZFNjaGVtYS50cydcblxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRPcHRpb25zIHtcbiAgICBkYXNoYm9hcmQ6IERhc2hib2FyZFNjaGVtYVxuICAgIHdpZGdldHM/OiBEYXNoYm9hcmRXaWRnZXREYXRhW11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGFzaGJvYXJkIHtcbiAgICBwdWJsaWMgbmFtZTogRGFzaGJvYXJkU2NoZW1hWyduYW1lJ10gPSAnJ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogRGFzaGJvYXJkU2NoZW1hWydkZXNjcmlwdGlvbiddID0gJydcbiAgICBwdWJsaWMgd2lkZ2V0czogRGFzaGJvYXJkV2lkZ2V0W10gPSBbXVxuICAgIHB1YmxpYyBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlXG4gICAgcHVibGljIGNvbnRhaW5lcldpZHRoOiBudW1iZXIgPSAwXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbW1pdHRlciA9IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXROYW1lKG5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbnRhaW5lcldpZHRoKHdpZHRoOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IHdpZHRoXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldFdpZGdldHMod2lkZ2V0czogRGFzaGJvYXJkV2lkZ2V0RGF0YVtdKSB7XG5cbiAgICAgICAgdGhpcy53aWRnZXRzID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHcgb2Ygd2lkZ2V0cykge1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0ID0gRGFzaGJvYXJkV2lkZ2V0LmZyb21EYXRhKHcpXG5cbiAgICAgICAgICAgIHdpZGdldC5zZXRFbW1pdHRlcih0aGlzLmVtbWl0dGVyKVxuXG4gICAgICAgICAgICB0aGlzLndpZGdldHMucHVzaCh3aWRnZXQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kTGFzdFJvdygpOiBudW1iZXIge1xuICAgICAgICBsZXQgcmVzdWx0ID0gMCBcblxuICAgICAgICBmb3IgKGNvbnN0IHdpZGdldCBvZiB0aGlzLndpZGdldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3MgPSB3aWRnZXQucm93cz8uYmFzZSA/PyAwXG4gICAgICAgICAgICBjb25zdCB5ID0gd2lkZ2V0Lnk/LmJhc2UgPz8gMFxuXG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSB5ICsgcm93c1xuXG4gICAgICAgICAgICBpZiAoYm90dG9tID4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYm90dG9tXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiByZXN1bHRcblxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRXaWRnZXQocGF5bG9hZDogUGFydGlhbDxEYXNoYm9hcmRXaWRnZXREYXRhPiA9IHt9KSB7XG4gICAgICAgIGlmICghcGF5bG9hZC5jb2x1bW5zKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmNvbHVtbnMgPSB7IGJhc2U6IDQsIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC5yb3dzKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJvd3MgPSB7IGJhc2U6IDQsIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC54KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnggPSB7IGJhc2U6IDAsIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGF5bG9hZC55KSB7XG4gICAgICAgICAgICBwYXlsb2FkLnkgPSB7IGJhc2U6IHRoaXMuZmluZExhc3RSb3coKSwgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBEYXNoYm9hcmRXaWRnZXREYXRhKHBheWxvYWQpXG5cbiAgICAgICAgY29uc3Qgd2lkZ2V0ID0gRGFzaGJvYXJkV2lkZ2V0LmZyb21EYXRhKGRhdGEpXG5cbiAgICAgICAgd2lkZ2V0LnNldEVtbWl0dGVyKHRoaXMuZW1taXR0ZXIpXG5cbiAgICAgICAgdGhpcy53aWRnZXRzLnB1c2god2lkZ2V0KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVXaWRnZXQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZGdldHMgPSB0aGlzLndpZGdldHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlV2lkZ2V0QnlJZChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud2lkZ2V0cyA9IHRoaXMud2lkZ2V0cy5maWx0ZXIoKHcpID0+IHcuaWQgIT09IGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVXaWRnZXQoaW5kZXg6IG51bWJlciwgd2lkZ2V0OiBEYXNoYm9hcmRXaWRnZXQpIHtcbiAgICAgICAgdGhpcy53aWRnZXRzID0gdGhpcy53aWRnZXRzLm1hcCgodywgaSkgPT4gaSA9PT0gaW5kZXggPyB3aWRnZXQgOiB3KVxuICAgIH1cblxuICAgIHB1YmxpYyBkdXBsaWNhdGVXaWRnZXQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjb3B5OiBEYXNoYm9hcmRXaWRnZXQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMud2lkZ2V0c1tpbmRleF0pKVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBbLi4udGhpcy53aWRnZXRzXVxuXG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKGluZGV4ICsgMSwgMCwgY29weSlcbiAgICB9XG59XG4iLCJpbXBvcnQgRGFzaGJvYXJkV2lkZ2V0RGVmaW5pdGlvbiBmcm9tICcuL0Rhc2hib2FyZFdpZGdldERlZmluaXRpb24nXG5pbXBvcnQgdHlwZSBEYXNoYm9hcmRXaWRnZXREYXRhIGZyb20gJy4vRGFzaGJvYXJkV2lkZ2V0RGF0YSdcblxuLyoqXG4gICAgKiBDb21wb25lbnQgdG8gYmUgdXNlZCBmb3IgY2hhcnQgd2lkZ2V0cyBpbiB0aGUgZGFzaGJvYXJkLlxuICAgICogUGx1Z2lucyBjYW4gZXh0ZW5kIHRoaXMgY2xhc3MgdG8gY3JlYXRlIHRoZWlyIG93biBjaGFydCB3aWRnZXRzLlxuICAgICogQGV4YW1wbGVcbiAgICAqIGNsYXNzIE15Q2hhcnRXaWRnZXQgZXh0ZW5kcyBEYXNoYm9hcmRXaWRnZXREZWZpbml0aW9uQ2hhcnQge1xuICAgICogICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICogICAgICAgICBzdXBlcigpXG4gICAgKiAgICAgICAgIHRoaXMubmFtZSA9ICdNeSBDaGFydCBXaWRnZXQnXG4gICAgKiAgICAgICAgIHRoaXMuaWQgPSAnbXktY2hhcnQtd2lkZ2V0J1xuICAgICogICAgIH1cbiAgICAqIH1cbiAgICAqL1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydCBleHRlbmRzIERhc2hib2FyZFdpZGdldERlZmluaXRpb24ge1xuICAgIHByaXZhdGUgc3RhdGljIHJlbmRlcmVyOiBhbnkgXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLm5hbWUgPSAnQ2hhcnQnXG4gICAgICAgIHRoaXMuaWQgPSAnY2hhcnQnXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXRSZW5kZXJlcihyZW5kZXJlcjogYW55KSB7XG4gICAgICAgIERhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydC5yZW5kZXJlciA9IHJlbmRlcmVyXG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIERhc2hib2FyZFdpZGdldERlZmluaXRpb25DaGFydC5yZW5kZXJlclxuICAgIH1cblxuICAgIC8vIHJldHVybiBjaGFydCBvcHRpb25zIGZvciB0aGUgY2hhcnQgd2lkZ2V0LiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBsdWdpbnMgdG8gcHJvdmlkZSBjdXN0b20gY2hhcnQgb3B0aW9ucy5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRvIGJlIGV4dGVuZGVkIGxhdGVyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBhc3luYyBjaGFydE9wdGlvbnMocGF5bG9hZDogRGFzaGJvYXJkV2lkZ2V0RGF0YVsnb3B0aW9ucyddKTogUHJvbWlzZTxhbnk+e1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgICAgIGxlZnQ6ICczJScsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICc0JScsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMyUnLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5MYWJlbDogdHJ1ZSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aXRsZTogeyB0ZXh0OiAnRUNoYXJ0cyBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZScgfSxcbiAgICAgICAgICAgIHRvb2x0aXA6IHt9LFxuICAgICAgICAgICAgeEF4aXM6IHsgZGF0YTogWydzaGlydCcsICdjYXJkaWdhbicsICdjaGlmZm9uJywgJ3BhbnRzJywgJ2hlZWxzJywgJ3NvY2tzJ10gfSxcbiAgICAgICAgICAgIHlBeGlzOiB7fSxcbiAgICAgICAgICAgIHNlcmllczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NhbGVzJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFs1LCAyMCwgMzYsIDEwLCAxMCwgMjBdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgXG59XG4iLCJpbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cydcbmltcG9ydCByb3V0ZXIgZnJvbSAnI2NsaWVudC9mYWNhZGVzL3JvdXRlci50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHR5cGUgeyBBdXRvT3B0aW9ucyB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgIHB1YmxpYyBhZGRQYWdlc0ZvbGRlcihpbXBvcnRzOiBhbnksIG9wdGlvbnM/OiBBdXRvT3B0aW9ucykge1xuICAgICAgICByb3V0ZXIuYXV0byhpbXBvcnRzLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBsb2FkIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYXV0byB9IGZyb20gJyNjbGllbnQvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgQXV0b09wdGlvbnMgfSBmcm9tICcjY2xpZW50L3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IERlZmluZUNvbXBvbmVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB0eXBlIHsgUm91dGVSZWNvcmRSYXcgfSBmcm9tICd2dWUtcm91dGVyJ1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIGF1dG8gZnJvbSBSb3V0ZXJTZXJ2aWNlIGluc3RlYWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvUm91dGVzKFxuICAgIGltcG9ydHM6IFJlY29yZDxzdHJpbmcsIERlZmluZUNvbXBvbmVudCB8ICgoKSA9PiBQcm9taXNlPERlZmluZUNvbXBvbmVudD4pPixcbiAgICBvcHRpb25zOiBBdXRvT3B0aW9ucyA9IHt9XG4pOiBSb3V0ZVJlY29yZFJhd1tdIHtcbiAgICByZXR1cm4gYXV0byhpbXBvcnRzLCBvcHRpb25zKVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVDb2x1bW48VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBsYWJlbD86IHN0cmluZ1xuICAgIGZpZWxkPzoga2V5b2YgVCB8ICgocm93OiBUKSA9PiBhbnkpIHwgKHN0cmluZyAmIHt9KVxuICAgIHNvcnRhYmxlPzogYm9vbGVhblxuICAgIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb2x1bW5zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pihjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW48VD5bXSkge1xuICAgIHJldHVybiBjb2x1bW5zXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIERlZmluZUZvcm1GaWVsZCB7XG4gICAgY29tcG9uZW50OlxuICAgICd0ZXh0LWZpZWxkJ1xuICAgIHwgJ3RleHRhcmVhJ1xuICAgIHwgJ3NlbGVjdCdcbiAgICB8ICdhdXRvY29tcGxldGUnXG4gICAgfCAnc3dpdGNoJ1xuICAgIHwgJ2ZpbGUtdXBsb2FkJ1xuICAgIHwgJ2ltYWdlLXVwbG9hZCdcbiAgICB8ICdjb2xvci1waWNrZXInXG4gICAgfCAnc3RyaW5nLWxpc3QtaW5wdXQnXG4gICAgfCAnanNvbi1pbnB1dCdcbiAgICB8ICdkYXRlLXBpY2tlcidcbiAgICB8ICdoaWRkZW4nXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVGb3JtRmllbGRzKGZpZWxkOiBSZWNvcmQ8c3RyaW5nLCBEZWZpbmVGb3JtRmllbGQ+KSB7XG4gICAgcmV0dXJuIGZpZWxkXG59XG5cbiIsImltcG9ydCAkb3JpZ2luYWwgZnJvbSBcIiNjbGllbnQvZmFjYWRlcy9mZXRjaGVyLnRzXCI7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgZmV0Y2hlciBmYWNhZGUgKi9cbmV4cG9ydCBjb25zdCAkZmV0Y2ggPSAkb3JpZ2luYWw7XG4iLCJpbXBvcnQgeyAkZmV0Y2ggfSBmcm9tICcuL2ZldGNoZXInXG5cbmludGVyZmFjZSBQaWNrT3B0aW9ucyB7XG4gICAgYWNjZXB0Pzogc3RyaW5nXG4gICAgbXVsdGlwbGU/OiBib29sZWFuXG59XG5cbnR5cGUgUGlja1Jlc3VsdDxUIGV4dGVuZHMgUGlja09wdGlvbnM+ID0gVFsnbXVsdGlwbGUnXSBleHRlbmRzIHRydWUgPyBGaWxlW10gOiBGaWxlIHwgbnVsbFxuXG5mdW5jdGlvbiBwaWNrPFQgZXh0ZW5kcyBQaWNrT3B0aW9ucz4ob3B0aW9uczogVCk6IFByb21pc2U8UGlja1Jlc3VsdDxUPj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcblxuICAgICAgICBpbnB1dC50eXBlID0gJ2ZpbGUnXG4gICAgICAgIGlucHV0LmFjY2VwdCA9IG9wdGlvbnMuYWNjZXB0IHx8ICcqLyonXG4gICAgICAgIGlucHV0Lm11bHRpcGxlID0gb3B0aW9ucy5tdWx0aXBsZSB8fCBmYWxzZVxuXG4gICAgICAgIGlucHV0Lm9uY2hhbmdlID0gKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbSh0YXJnZXQuZmlsZXMgYXMgRmlsZUxpc3QpIGFzIEZpbGVbXVxuXG4gICAgICAgICAgICByZXNvbHZlKChvcHRpb25zLm11bHRpcGxlID8gQXJyYXkuZnJvbShmaWxlcykgOiBmaWxlc1swXSkgYXMgUGlja1Jlc3VsdDxUPilcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0Lm9uY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShvcHRpb25zLm11bHRpcGxlID8gW10gOiAobnVsbCBhcyBhbnkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQuY2xpY2soKVxuICAgIH0pXG59XG5cbmZ1bmN0aW9uIHRvVWludDhBcnJheShmaWxlOiBGaWxlKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUudGFyZ2V0Py5yZXN1bHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZS50YXJnZXQucmVzdWx0KSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgZmlsZSBhcyBBcnJheUJ1ZmZlcicpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpXG4gICAgfSlcbn1cblxuaW50ZXJmYWNlIFVwbG9hZE9wdGlvbnMge1xuICAgIGRyaXZlSWQ6IHN0cmluZ1xuICAgIGZpbGU6IEZpbGVcbiAgICBkaXJlY3Rvcnk/OiBzdHJpbmdcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbnM6IFVwbG9hZE9wdGlvbnMpe1xuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICAgIFxuICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgb3B0aW9ucy5maWxlKVxuXG4gICAgaWYgKG9wdGlvbnMuZGlyZWN0b3J5KSB7XG4gICAgICAgIGZvcm0uYXBwZW5kKCdkaXJlY3RvcnknLCBvcHRpb25zLmRpcmVjdG9yeSlcbiAgICB9XG5cbiAgICByZXR1cm4gJGZldGNoKGAvYXBpL2RyaXZlcy8ke29wdGlvbnMuZHJpdmVJZH0vdXBsb2FkYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZm9ybSxcbiAgICAgICAgcXVlcnk6IHsgZGlyZWN0b3J5OiBvcHRpb25zLmRpcmVjdG9yeSwgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCAkZmlsZSA9IHtcbiAgICBwaWNrLFxuICAgIHVwbG9hZCxcbiAgICB0b1VpbnQ4QXJyYXksXG59IiwiaW1wb3J0IHJvdXRlIGZyb20gJyNjbGllbnQvZmFjYWRlcy9yb3V0ZS50cycgXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvKHRvOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0ID0gdG9cblxuICAgIC8vIHJlcGxhY2UgOnBhcmFtIHdpdGggcm91dGUgcGFyYW0gdmFsdWVcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3V0ZS5wYXJhbXMpKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtUGxhY2Vob2xkZXIgPSBgOiR7a2V5fWBcblxuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShwYXJhbVBsYWNlaG9sZGVyLCBTdHJpbmcodmFsdWUpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cblxuIiwiaW1wb3J0IHsgdG9hc3QgfSBmcm9tICd2dWUtc29ubmVyJ1xuXG5leHBvcnQgY29uc3QgJHRvYXN0ID0gdG9hc3RcbiIsIlxuaW1wb3J0IHsgY2xzeCBhcyBvcmlnaW5hbENsc3ggfSBmcm9tICdjbHN4J1xuaW1wb3J0IHR5cGUgeyBDbGFzc1ZhbHVlIH0gZnJvbSAnY2xzeCdcbmltcG9ydCB7IHR3TWVyZ2UgYXMgb3JpZ2luYWxUd01lcmdlLCB0eXBlIENsYXNzTmFtZVZhbHVlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnXG5cbmV4cG9ydCBmdW5jdGlvbiB0d01lcmdlKC4uLmlucHV0czogQ2xhc3NOYW1lVmFsdWVbXSkge1xuICAgIHJldHVybiBvcmlnaW5hbFR3TWVyZ2UoaW5wdXRzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xzeCguLi5pbnB1dHM6IENsYXNzVmFsdWVbXSkge1xuICAgIHJldHVybiBvcmlnaW5hbENsc3goaW5wdXRzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY24oLi4uaW5wdXRzOiBDbGFzc1ZhbHVlW10pIHtcbiAgICByZXR1cm4gb3JpZ2luYWxUd01lcmdlKG9yaWdpbmFsQ2xzeChpbnB1dHMpKVxufVxuIiwiaW1wb3J0IHR5cGUgeyBOYXZpZ2F0aW9uR3VhcmQsIFJvdXRlTG9jYXRpb25Ob3JtYWxpemVkIH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCBhdXRoIGZyb20gJyNjbGllbnQvZmFjYWRlcy9hdXRoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHdWFyZE9wdGlvbnMge1xuICAgIHJlZGlyZWN0OiBzdHJpbmcgfCAoKHRvOiBSb3V0ZUxvY2F0aW9uTm9ybWFsaXplZCkgPT4gc3RyaW5nKVxuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXV0aEd1YXJkKG9wdGlvbnM6IEF1dGhHdWFyZE9wdGlvbnMpOiBOYXZpZ2F0aW9uR3VhcmQge1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBvcHRpb25zLmV4Y2x1ZGUgfHwgWycvYXV0aC9sb2dpbicsICcvYXV0aC9yZWdpc3RlciddXG5cbiAgICByZXR1cm4gKHRvKSA9PiB7XG5cbiAgICAgICAgaWYgKCFhdXRoLnVzZXIgJiYgIWV4Y2x1ZGUuaW5jbHVkZXModG8ucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0UGF0aCA9IHR5cGVvZiBvcHRpb25zLnJlZGlyZWN0ID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5yZWRpcmVjdCh0bykgOiBvcHRpb25zLnJlZGlyZWN0XG5cbiAgICAgICAgICAgIHJldHVybiByZWRpcmVjdFBhdGhcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgYXV0aEd1YXJkID0gY3JlYXRlQXV0aEd1YXJkKHtcbiAgICByZWRpcmVjdDogdG8gPT4gJy9hdXRoL2xvZ2luP3JlZGlyZWN0PScgKyBlbmNvZGVVUklDb21wb25lbnQodG8uZnVsbFBhdGgpLFxufSlcblxuZXhwb3J0IGRlZmF1bHQgYXV0aEd1YXJkXG4iLCJpbXBvcnQgYXV0aCBmcm9tICcjY2xpZW50L2ZhY2FkZXMvYXV0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBHdWVzdEd1YXJkT3B0aW9ucyB7XG4gICAgcmVkaXJlY3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR3Vlc3RHdWFyZChvcHRpb25zOiBHdWVzdEd1YXJkT3B0aW9ucykge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChhdXRoLnVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJlZGlyZWN0XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGd1ZXN0R3VhcmQgPSBjcmVhdGVHdWVzdEd1YXJkKHtcbiAgICByZWRpcmVjdDogJy8nXG59KVxuXG5leHBvcnQgZGVmYXVsdCBndWVzdEd1YXJkXG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzU1LDU2XSwibWFwcGluZ3MiOiJzM0JBWUEsZUFBc0IsRUFBK0IsRUFBMkMsQ0FDNUYsR0FBSSxDQUVBLE1BQU8sQ0FBQyxLQURPLE1BQU0sR0FBTyxDQUNQLE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEVBSW5DLEVBQVMsS0FBTyxTQUEyQixFQUE2QixDQUNwRSxHQUFJLENBRUEsTUFBTyxDQUFDLEtBRE8sR0FBTyxDQUNELE9BQ2hCLEVBQU8sQ0FDWixNQUFPLENBQUMsRUFBYyxLQUFLLEdDakJuQyxJQUFxQixFQUFyQixLQUFrQyxDQUM5QixPQUFjLHNCQUF3QixlQUV0QyxNQUFnQixZQUFZLEVBQW9CLENBQzVDLEdBQUksRUFBUyxRQUFRLElBQUksZUFBZSxFQUFFLFNBQVMsT0FBTyxDQUFFLENBQ3hELElBQU0sRUFBTyxNQUFNLEVBQVMsTUFBTSxDQUM3QixXQUFhLENBQUUsUUFBUyxHQUFHLHdCQUF3QixDQUFFLEVBQUUsQ0FNNUQsT0FKSSxFQUFLLFNBQ0wsRUFBTSxNQUFNLEVBQUssUUFBUSxDQUd0QixFQUtYLE9BRkEsRUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsQ0FFakMsQ0FDSCxRQUFTLEdBQUcsd0JBQXdCLENBQ3ZDLENBR0wsU0FBbUIsRUFBYSxFQUFxQyxDQUNqRSxHQUFJLENBQUMsRUFDRCxPQUFPLEVBR1gsSUFBTSxFQUFjLEVBQUcsVUFB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