@sidekick-coder/zenith-kit 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/release.js +3 -0
- package/dist/client/index.es.js +1 -1
- package/dist/components/index.es.js +1 -1
- package/dist/server/index.d.mts +2 -1
- package/dist/server/index.mjs +2 -2
- package/dist/shared/index.d.mts +55 -55
- package/dist/shared/index.mjs +2 -2
- package/package.json +7 -8
- package/src/server/__tests__/helpers/createTestDB.ts +3 -3
- package/src/server/gateways/DatabaseGateway.ts +2 -0
- package/src/server/loaders/permissionLoader.unit.test.ts +4 -4
- package/src/server/queries/create.ts +2 -2
- package/src/server/queries/incremental.ts +9 -9
- package/src/server/queries/update.ts +2 -2
- package/src/server/services/EncryptService.unit.test.ts +5 -5
- package/src/server/services/RouterService.unit.test.ts +0 -33
- package/src/shared/services/ContainerService.ts +3 -3
- package/vitest.config.ts +1 -3
package/dist/shared/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./chunk-0Lt9GpW0.mjs";import{debounce as t,get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import*as s from"valibot";import{format as c}from"date-fns";import l from"qs";import{defineAbility as ee,subject as u}from"@casl/ability";function d(...e){return e.reduce((e,t)=>t(e),class{})}function f(e,...t){return t.reduce((e,t)=>t(e),e)}function p(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 m(e,t=2){if(e===0)return`0 Bytes`;let n=1024,r=t<0?0:t,i=[`Bytes`,`KB`,`MB`,`GB`,`TB`,`PB`],a=Math.floor(Math.log(e)/Math.log(n));return parseFloat((e/n**+a).toFixed(r))+` `+i[a]}function h(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`){h(i,e,n);continue}n[e]=i}return n}function te(e){let t={};for(let[n,r]of Object.entries(e))a(t,n,r);return t}async function g(e){try{return[null,await e()]}catch(e){return[e,null]}}g.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};function _(){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 v(e=``){return e+_()}var y=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 i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);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:n(o,e.substring(i.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={}),a(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)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return h(this.toRecord())}},b=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)}},ne=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 b(`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())}},x=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},re=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new x,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||v();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,n,r){let i=t(n,r?.debounce||300),a=this.on(e,i,r);return a&&(a.originalListener=n),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)g.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}},S=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},ie=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 x,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=i(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 g(()=>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 S;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()}},ae=class{static __container_entry_key=`TranslatorService`;entries;locale;localeLoaders;debug=!1;logger;cache;constructor(e={}){this.entries=e.entries||new Map,this.locale=e.locale||`en`,this.debug=e.debug||!1,this.cache=e.cache||new Map,this.logger=e.logger||new x,this.localeLoaders=new Map,this.debug&&this.logger.debug(`initialized in debug mode`,{locale:this.locale})}get locales(){return Array.from(this.localeLoaders.keys())}list(){let e=[];return this.entries.forEach((t,n)=>{e.push({key:n,value:t})}),e}async getEntries(e){let t=this.cache.get(e);if(t&&this.debug&&this.logger.debug(`load locale "${e}" from cache`,{locale:e,length:Object.keys(t).length}),t)return t;let n=this.localeLoaders.get(e);if(!n)return this.logger.warn(`no loader found for locale "${e}"`),{};let r=await n();return this.cache.set(e,r),this.debug&&this.logger.debug(`load locale ${e}`,{locale:e,keys:Object.keys(r).length}),r}async load(e){let t=await this.getEntries(e);this.entries=new Map(Object.entries(t)),this.locale=e}t(e,t={}){!this.entries.has(e)&&this.debug&&this.logger.debug(`missing translation for key "${e}"`,{key:e,locale:this.locale});let n=this.entries.get(e)||e;return Object.keys(t).length&&Object.entries(t).forEach(([e,t])=>{n=n.replace(`:${e}`,String(t))}),n}date(e){return new Date(e).toLocaleDateString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`})}datetime(e){return new Date(e).toLocaleString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}},oe=class{static __container_entry_key=`UploadService`;single(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}multiple(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}};const C=()=>s.pipe(s.union([s.string(),s.number()]),s.transform(Number),s.integer()),w=()=>s.pipe(s.union([s.string(),s.boolean()]),s.transform(e=>e===!0||e===`true`)),T=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e instanceof Date?e:new Date(e)),s.transform(e=>e&&c(e,`yyyy-MM-dd`))),E=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),c(e,`yyyy-MM-dd HH:mm`))))),D=(e=s.any())=>s.pipe(s.union([s.string(),s.array(s.string())]),s.transform(e=>Array.isArray(e)?e:e.split(`,`)),s.array(e)),O=()=>s.pipe(D(),s.transform(e=>e.map(Number))),k=()=>s.pipe(s.union([s.string(),s.record(s.string(),s.any())]),s.transform(e=>typeof e==`string`?l.parse(e):e),s.transform(e=>{let t={};for(let r in e)a(t,r,n(e,r));return t}));function A(){return k()}A.number=C,A.boolean=w,A.date=T,A.datetime=E,A.array=D,A.arrayNumber=O,A.object=k;const se=()=>s.pipe(s.string(),s.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`),a(r,e,n)}return r})),j=(e={})=>s.object({page:s.optional(C(),1),limit:s.optional(C(),e.maxLimit||100),orderBy:s.nullish(e.orderFields?D(s.picklist(e.orderFields)):D(s.string()),[]),orderDirection:s.nullish(D(s.union([s.literal(`asc`),s.literal(`desc`)])),[])});function M(e={}){return j(e)}M.base=j;var ce=e({array:()=>D,arrayNumber:()=>O,base:()=>j,boolean:()=>w,date:()=>T,datetime:()=>E,keyValue:()=>se,number:()=>C,object:()=>k,pagination:()=>M,url:()=>A}),N=class{static __container_entry_key=`ValidatorService`;v={...s,extras:ce};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=s.safeParse(n,e);if(!a){let e=s.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 b(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 s.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=s.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}=s.safeParse(n,e);return r}};function le(e,t){let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean);for(let e=0;e<n.length;e++){let t=n[e],i=r[e];if(t===`*`)return!0;if(e>=r.length||!t.startsWith(`:`)&&t!==i)return!1}return!(r.length>n.length)}function P(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 F(e){let t={},n=e.split(`?`)[1];return n?l.parse(n):t}function I(e){try{return JSON.parse(e)}catch(e){return console.error(`Failed to parse JSON:`,e),null}}function L(e){try{return JSON.stringify(e)}catch(e){return console.error(`Failed to stringify JSON:`,e),null}}const R=new N;function z(){return R.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}z.create=R.create(e=>e.pick(z(),[`dashboard_id`,`name`,`value`])),z.update=R.create(e=>e.partial(z.create));function B(){return R.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()))}))}B.create=R.create(e=>e.pick(B(),[`name`,`description`])),B.update=R.create(e=>e.partial(B.create));const V=s.object({id:s.number(),permission_id:s.number(),assignable_type:s.string(),assignable_id:s.string(),created_at:s.string(),updated_at:s.string()}),H=s.object({id:s.number(),name:s.nullable(s.string()),description:s.nullable(s.string()),action:s.string(),subject:s.string(),conditions:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),expires_at:s.string()}),U=s.object({id:s.number(),name:s.nullable(s.string()),type:s.string(),user_id:s.number(),token:s.string(),created_at:s.string(),updated_at:s.string(),expires_at:s.string()});function W(){return s.object({id:s.number(),name:s.optional(s.string()),email:s.pipe(s.string(),s.email()),password:s.pipe(s.string(),s.minLength(6)),username:s.pipe(s.string(),s.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),deleted_at:s.nullable(s.string())})}W.create=()=>s.omit(W(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),W.update=()=>s.partial(W.create());var ue=class extends b{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};function de(e={}){return function(t){return class extends t{static from(n){let r=new(typeof this==`function`?this:t),i={...n};return e.parse&&(i=e.parse(n)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}}function G(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}}}async function K(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function q(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 J(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 q(this,e,t)}static async emit(e,...t){return K(this,e,...t)}}}function fe(e){return class extends e{listeners;constructor(...e){super(...e),this.listeners=[]}on(e,t){this.listeners.push({event:e,listener:t})}off(e,t){let n=this.listeners.findIndex(n=>n.event===e&&n.listener===t);n!==-1&&this.listeners.splice(n,1)}emit(e,...t){let n=this.listeners.filter(t=>t.event===e);for(let e of n)e.listener(...t)}async emitAsync(e,...t){let n=this.listeners.filter(t=>t.event===e);for await(let e of n)await e.listener(...t)}}}J.emit=K,J.on=q;function Y(e){return class extends e{deleted_at=null}}function X(e){return class extends e{created_at;updated_at}}var Z=class extends d(G){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=g.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},pe=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Z.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new x().child({label:`acl`}),this.ability=ee(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=u(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=u(t,n);return this.ability.cannot(e,r)}subject(e,t){return u(e,t)}},me=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}};const Q=()=>[{id:`fs`,label:$t(`File System`),description:$t(`Store files on the local file system.`),config_fields:{directory:{component:`text-field`,label:$t(`Directory`),description:$t(`The directory path where files will be stored.`),hint:$t(`Relative to the application root or absolute path, e.g., :0 or :1`,[`/var/zenith/uploads`,`storage/uploads`])}}},{id:`s3`,label:`S3`,description:$t(`Store files on an S3-compatible service like AWS S3, DigitalOcean Spaces, etc.`),config_fields:{accessKeyId:{component:`text-field`,label:$t(`Access Key ID`),hint:$t(`Your AWS access key ID.`),type:`password`},secretAccessKey:{component:`text-field`,label:$t(`Secret Access Key`),hint:$t(`Your AWS secret access key.`),type:`password`},bucket:{component:`text-field`,label:$t(`Bucket Name`),hint:$t(`The name of the S3 bucket to store files in.`)},region:{component:`text-field`,label:$t(`Region`),hint:$t(`The AWS region where your bucket is located.`)},prefix:{component:`text-field`,label:$t(`Prefix`),hint:$t(`An optional prefix (folder path) to store files under in the bucket.`)},endpoint:{component:`text-field`,label:$t(`Endpoint URL`),hint:$t(`Optional custom endpoint URL for S3-compatible services.`)}}}];var he=class e{static get TYPES(){return Q()}id;name;type;is_default;config;constructor(e){Object.assign(this,e)}get config_fields(){let t=e.TYPES.find(e=>e.id===this.type);return t?t.config_fields:{}}},ge=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}},_e=class extends d(G,X,Y){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},ve=class extends d(G,X,Y){id;file_id;name;value},ye=class extends d(G,X,Y){id;purpose;mime_types;max_size;upload_url;create_file_url;getParsedMimeTypes(){return this.mime_types.split(`,`).map(e=>e.trim())}isAllowedMimeType(e){let t=this.getParsedMimeTypes();return t.includes(e)||t.includes(`*/*`)}isAllowedSize(e){return e<=this.max_size}},be=class{name;remote;is_current;is_remote;constructor(e){Object.assign(this,e)}},$=class{hash;short_hash;message;body;author_name;author_email;date;constructor(e){Object.assign(this,e)}},xe=class{static __container_entry_key=`HeaderMapEntity`;entries;setHeader;constructor(e){this.entries=new Map,this.setHeader=e?.setHeader,e?.headers&&this.loadFromRecord(e.headers)}loadFromRecord(e){for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){return this.entries.get(e)||t}set(e,t){if(!this.setHeader)throw new b(`setHeader function is not defined`);this.entries.set(e,t)}toRecord(){let e={},t=Array.from(this.entries.entries());for(let[n,r]of t)e[n]=r;return e}},Se=class extends d(G,p(S)){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}`}},Ce=class extends d(G){id;name;version;description;enabled;author;dependencies;build},we=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},Te=class extends d(G){id;name;version;enabled;aliases;version_channel;version_available_channels},Ee=class extends d(G,X,Y){id;name;description},De=class extends d(G,X,Y){id;email;name;username;password;verified_at;permissions;roles;get initials(){let[e,t]=this.name.split(` `);return t?e[0].toUpperCase()+t[0].toUpperCase():e[0].toUpperCase()}};export{pe as AclEntity,G as BaseEntityMixin,b as BaseException,y as ConfigService,ne as ContainerService,me as CookieMapEntity,he as DriveConfigEntity,ge as DriveEntryEntity,re as EmmitterService,_e as FileEntity,ve as FileMetaEntity,ye as FileUploadSessionEntity,be as GitBranchEntity,$ as GitCommitEntity,xe as HeaderMapEntity,fe as HooksMixin,J as HooksStatic,S as LifecycleHook,ie as LifecycleService,x as LoggerService,Se as ModuleEntity,Ce as ModuleManifestEntity,we as PaginationEntity,Z as PermissionEntity,Te as PluginEntity,Ee as RoleEntity,ue as ShellException,Y as SoftDeleteMixin,Q as TYPES,X as TimestampMixin,ae as TranslatorService,oe as UploadService,De as UserEntity,N as ValidatorService,d as compose,f as composeWith,de as createBaseEntity,v as createId,z as dashboardMetaSchema,B as dashboardSchema,K as emitHook,h as flatten,m as formatBytes,le as matchPath,p as mixin,q as onHook,P as parseUrlParams,F as parseUrlQuery,V as permissionAssignmentSchema,H as permissionSchema,I as safeJsonParse,L as safeJsonStringify,U as tokenSchema,g as tryCatch,te as unflatten,W as userSchema,R as validator};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mb3JtYXRCeXRlcy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvZmxhdHRlbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVHJhbnNsYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1VwbG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL2tleVZhbHVlVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvaW5kZXgudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL21hdGNoUGF0aHMudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3NhZmVKc29uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRNZXRhU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL2Rhc2hib2FyZFNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3Rva2VuU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3VzZXJTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvU2hlbGxFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9HaXRCcmFuY2hFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0dpdENvbW1pdEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvSGVhZGVyTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QYWdpbmF0aW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1JvbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlciwgZGVjaW1hbHMgPSAyKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZXMnXG5cbiAgICBjb25zdCBrID0gMTAyNFxuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJ11cblxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKVxuXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXIgPSA1MDBcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gJ0Jhc2VFeGNlcHRpb24nXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChwYXlsb2FkOiBFbnRyeUtleSk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvciwgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBjcmVhdGVJZCwgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy9pbmRleC50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlckxpc3RlbmVyT3B0aW9ucyB7XG4gICAgZXZlbnQ6IHN0cmluZ1xufVxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlckxpc3RlbmVyIHtcbiAgICAoZGF0YTogYW55LCBvcHRpb25zOiBFbW1pdHRlckxpc3RlbmVyT3B0aW9ucyk6IHZvaWRcbn1cblxuaW50ZXJmYWNlIEVtbWl0dGVySGFuZGxlciB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogRW1taXR0ZXJMaXN0ZW5lclxuICAgIG9yaWdpbmFsTGlzdGVuZXI/OiBFbW1pdHRlckxpc3RlbmVyXG59XG5cbmludGVyZmFjZSBPbk9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgdW5pcXVlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgT25EZWJvdW5jZU9wdGlvbnMgZXh0ZW5kcyBPbk9wdGlvbnMge1xuICAgIGRlYm91bmNlPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbW1pdHRlclNlcnZpY2U8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdFbW1pdHRlclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvciAob3B0aW9ucz86IEVtbWl0dGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnM/LmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucz8ubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtbWl0dGVyIGxvYWRlZCB3aXRoIGRlYnVnIG1vZGUgZW5hYmxlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ob3B0aW9ucz86IEVtbWl0dGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbW1pdHRlclNlcnZpY2U8RXZlbnRzPihvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2RlYnVnIG1vZGUgZW5hYmxlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBpZCA9IG9wdGlvbnM/LmlkIHx8IGNyZWF0ZUlkKClcblxuICAgICAgICBpZiAob3B0aW9ucz8udW5pcXVlKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmhhbmRsZXJzLnNvbWUoaCA9PiAoaC5ldmVudCA9PT0gZXZlbnQgJiYgaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHx8IGguaWQgPT09IGlkKVxuXG4gICAgICAgICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVyOiBFbW1pdHRlckhhbmRsZXIgPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciBhZGRlZCcsIGhhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gKGFyZ3M6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihhcmdzLCBvcHRpb25zKVxuXG4gICAgICAgICAgICB0aGlzLm9mZihldmVudCwgd3JhcHBlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyIGFzIGFueSwgb3B0aW9ucylcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkRlYm91bmNlPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbkRlYm91bmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZShsaXN0ZW5lciwgb3B0aW9ucz8uZGVib3VuY2UgfHwgMzAwKVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBkZWJvdW5jZWQgYXMgYW55LCBvcHRpb25zKVxuXG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyLm9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb25BbnlPZjxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudHM6IEtbXSwgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJbXVxuICAgIHB1YmxpYyBvbkFueU9mKGV2ZW50czogc3RyaW5nW10sIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLm9uKGV2ZW50LCBsaXN0ZW5lciBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IHtcbiAgICAgICAgICAgIGlmIChoLmV2ZW50ID09PSBldmVudCAmJiAoaC5saXN0ZW5lciA9PT0gbGlzdGVuZXIgfHwgaC5vcmlnaW5hbExpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXIgcmVtb3ZlZCcsIHsgZXZlbnQgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiB2b2lkXG4gICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbWl0dGluZyBldmVudCcsIHtcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgdHJ5Q2F0Y2guc3luYygoKSA9PiBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MsIHsgZXZlbnQgfSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSk6IFByb21pc2U8dm9pZD5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdEFuZFdhaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbWl0dGluZyBldmVudCBhbmQgd2FpdCcsIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyczogaGFuZGxlcnMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIubGlzdGVuZXIoYXJncywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnNcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdEJ5RXZlbnQoZXZlbnQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKHBheWxvYWQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gIWlkcy5pbmNsdWRlcyhoLmlkKSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXJzIHJlbW92ZWQnLCB7IGlkcyB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gW11cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FsbCBoYW5kbGVycyBjbGVhcmVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoID4gMFxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZUhvb2sge1xuICAgIHB1YmxpYyBob29rX2lkOiBzdHJpbmdcbiAgICBwdWJsaWMgaG9va19hbGlhc2VzPzogc3RyaW5nW11cbiAgICBwdWJsaWMgb3JkZXI/OiBudW1iZXJcbiAgICBwdWJsaWMgc3ViaG9va3M/OiBMaWZlY3ljbGVIb29rW11cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgcmVnaXN0ZXIgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25SZWdpc3RlcigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgbG9hZCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGJvb3QgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Cb290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBzaHV0ZG93biAqL1xuICAgIHB1YmxpYyBhc3luYyBvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcydcblxudHlwZSBMaWZlY3ljbGVNZXRob2QgPSAncmVnaXN0ZXInIHwgJ2xvYWQnIHwgJ2Jvb3QnIHwgJ3NodXRkb3duJ1xuXG5pbnRlcmZhY2UgTGlzdE9wdGlvbnMge1xuICAgIGluY2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIGV4Y2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBob29rcz86IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xpZmVjeWNsZVNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaG9va3M6IE1hcDxzdHJpbmcsIExpZmVjeWNsZUhvb2s+XG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnID8/IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5ob29rcyA9IGRhdGEuaG9va3MgPz8gbmV3IE1hcCgpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgPz8gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICBcbiAgICAgICAgaWYgKGRhdGEub25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yID0gZGF0YS5vbkVycm9yXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0T25FcnJvcihoYW5kbGVyOiBSZXF1aXJlZDxMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucz5bJ29uRXJyb3InXSkge1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBoYW5kbGVyXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgb25FcnJvcihlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjb250ZXh0IH0pXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIGhvb2sgJHtjb250ZXh0Lm1ldGhvZH0gKCR7Y29udGV4dC5ob29rSWR9KTpgLCBlcnJvcilcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFwQWxpYXNlcyhhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYWxsID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBhbGwpIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suaG9va19hbGlhc2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEFsaWFzID0gaG9vay5ob29rX2FsaWFzZXMuZmluZChhbGlhcyA9PiBhcmdzLmluY2x1ZGVzKGFsaWFzKSlcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChvcHRpb25zPzogTGlzdE9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGhvb2tzID0gQXJyYXkuZnJvbSh0aGlzLmhvb2tzLnZhbHVlcygpKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5leGNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmV4Y2x1ZGUpID8gb3B0aW9ucy5leGNsdWRlIDogW29wdGlvbnMuZXhjbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiAhaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaW5jbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlKSA/IG9wdGlvbnMuaW5jbHVkZSA6IFtvcHRpb25zLmluY2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gaWRzLmluY2x1ZGVzKGhvb2suaG9va19pZCkpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcyA9IG9yZGVyQnkoaG9va3MsIFsnb3JkZXInXSwgWydhc2MnXSlcblxuICAgICAgICByZXR1cm4gaG9va3NcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKC4uLnBheWxvYWQ6IChMaWZlY3ljbGVIb29rIHwgQ29uc3RydWN0b3I8TGlmZWN5Y2xlSG9vaz4pW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXlsb2FkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMucHVzaChuZXcgaXRlbSgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBpZiAoIWhvb2suaG9va19pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1NraXBwaW5nIGhvb2sgd2l0aG91dCBob29rX2lkOicsIGhvb2spXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ob29rcy5zZXQoaG9vay5ob29rX2lkLCBob29rKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGQgJyArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvb2suc3ViaG9va3MpIHtcbiAgICAgICAgICAgICAgICBob29rLnN1Ymhvb2tzLmZvckVhY2goc3ViaG9vayA9PiB0aGlzLmFkZChzdWJob29rKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0TWV0aG9kKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmxpc3Qob3B0aW9ucykgXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlbWl0dGluZyAke21ldGhvZH0gZm9yIGhvb2tzOmAsIHtcbiAgICAgICAgICAgICAgICBob29rczogaG9va3MubWFwKGhvb2sgPT4gaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiB0aGlzLmxpc3Qob3B0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlcjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2sucmVnaXN0ZXIoKSwgaG9vay5vblJlZ2lzdGVyKCldKSxcbiAgICAgICAgICAgICAgICBsb2FkOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5sb2FkKCksIGhvb2sub25Mb2FkKCldKSxcbiAgICAgICAgICAgICAgICBib290OiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5ib290KCksIGhvb2sub25Cb290KCldKSxcbiAgICAgICAgICAgICAgICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suc2h1dGRvd24oKSwgaG9vay5vblNodXRkb3duKCldKSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IG1hcFttZXRob2RdKCkpXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvciwgeyBob29rSWQ6IGhvb2suaG9va19pZCwgbWV0aG9kIH0pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgJHttZXRob2R9IGAgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdChwYXlsb2FkOiBMaWZlY3ljbGVNZXRob2QgfCBMaWZlY3ljbGVNZXRob2RbXSwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdE1ldGhvZChtZXRob2QsIG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb24obWV0aG9kOiBMaWZlY3ljbGVNZXRob2QsIGhhbmRsZXI6ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaCA9IG5ldyBMaWZlY3ljbGVIb29rKClcblxuICAgICAgICBoLmhvb2tfaWQgPSBgY3VzdG9tOiR7bWV0aG9kfToke0RhdGUubm93KCl9YFxuXG4gICAgICAgIGhbbWV0aG9kXSA9IGhhbmRsZXJcblxuICAgICAgICB0aGlzLmFkZChoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlcihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgncmVnaXN0ZXInLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdsb2FkJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnYm9vdCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3NodXRkb3duJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG9va3MuY2xlYXIoKVxuICAgIH1cbn1cbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4vTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhbnNsYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1RyYW5zbGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgbG9jYWxlOiBzdHJpbmdcbiAgICBwdWJsaWMgbG9jYWxlTG9hZGVyczogTWFwPHN0cmluZywgKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj5cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgY2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFRyYW5zbGF0b3JTZXJ2aWNlPiA9IHt9KSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IGRhdGEuZW50cmllcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMubG9jYWxlID0gZGF0YS5sb2NhbGUgfHwgJ2VuJ1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmNhY2hlID0gZGF0YS5jYWNoZSB8fCBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5sb2NhbGVMb2FkZXJzID0gbmV3IE1hcDxzdHJpbmcsICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4+KClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubG9jYWxlTG9hZGVycy5rZXlzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgICAgICBjb25zdCBpdGVtczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0RW50cmllcyhsb2NhbGU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGUuZ2V0KGxvY2FsZSkhXG5cbiAgICAgICAgaWYgKGNhY2hlICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkIGxvY2FsZSBcIiR7bG9jYWxlfVwiIGZyb20gY2FjaGVgLCB7XG4gICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogT2JqZWN0LmtleXMoY2FjaGUpLmxlbmd0aFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkZXIgPSB0aGlzLmxvY2FsZUxvYWRlcnMuZ2V0KGxvY2FsZSlcblxuICAgICAgICBpZiAoIWxvYWRlcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybihgbm8gbG9hZGVyIGZvdW5kIGZvciBsb2NhbGUgXCIke2xvY2FsZX1cImApXG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBsb2FkZXIoKVxuXG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGxvY2FsZSwgZW50cmllcylcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWQgbG9jYWxlICR7bG9jYWxlfWAsIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAga2V5czogT2JqZWN0LmtleXMoZW50cmllcykubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChsb2NhbGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRFbnRyaWVzKGxvY2FsZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihPYmplY3QuZW50cmllcyhlbnRyaWVzKSlcblxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZVxuICAgIH1cblxuICAgIHB1YmxpYyB0KGtleTogc3RyaW5nLCBhcmdzOiBhbnkgPSB7fSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpICYmIHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBtaXNzaW5nIHRyYW5zbGF0aW9uIGZvciBrZXkgXCIke2tleX1cImAsIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpIHx8IGtleVxuXG4gICAgICAgIGxldCB0cmFuc2xhdGlvbiA9IGVudHJ5XG5cbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYXJncykuZm9yRWFjaCgoW2FLZXksIGFWYWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb24ucmVwbGFjZShgOiR7YUtleX1gLCBTdHJpbmcoYVZhbHVlKSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25cbiAgICB9XG5cbiAgICBwdWJsaWMgZGF0ZShkYXRhOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRhKVxuXG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGRheTogJzItZGlnaXQnXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGRhdGV0aW1lKGRhdGE6IHN0cmluZyB8IG51bWJlciB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcodGhpcy5sb2NhbGUsIHtcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1VwbG9hZFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgc2luZ2xlKG5hbWU6IHN0cmluZyl7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgbXVsdGlwbGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0IHFzIGZyb20gJ3FzJ1xuXG5leHBvcnQgY29uc3QgbnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYubnVtYmVyKCldKSxcbiAgICB2LnRyYW5zZm9ybShOdW1iZXIpLFxuICAgIHYuaW50ZWdlcigpLFxuKVxuXG5leHBvcnQgY29uc3QgYm9vbGVhbiA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmJvb2xlYW4oKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA9PT0gdHJ1ZSB8fCB2ID09PSAndHJ1ZScpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiBpbnN0YW5jZW9mIERhdGUgPyB2IDogbmV3IERhdGUodikpLFxuICAgIHYudHJhbnNmb3JtKHYgPT4gdiA/IGZvcm1hdCh2LCAneXl5eS1NTS1kZCcpIDogdiksXG4pXG5cbmV4cG9ydCBjb25zdCBkYXRldGltZSA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmRhdGUoKV0pLFxuICAgIHYudHJhbnNmb3JtKHYgPT4ge1xuICAgICAgICBpZiAoIXYpIHJldHVybiB2XG5cbiAgICAgICAgaWYgKHYgPT09ICdudWxsJykgcmV0dXJuIG51bGxcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gbmV3IERhdGUodilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQodiwgJ3l5eXktTU0tZGQgSEg6bW0nKVxuICAgIH0pLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXkgPSA8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4oc2NoZW1hOiBUID0gdi5hbnkoKSBhcyBhbnkgYXMgVCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuYXJyYXkodi5zdHJpbmcoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogdmFsdWUuc3BsaXQoJywnKSksXG4gICAgdi5hcnJheShzY2hlbWEpLFxuKVxuXG5leHBvcnQgY29uc3QgYXJyYXlOdW1iZXIgPSAoKSA9PiB2LnBpcGUoXG4gICAgYXJyYXkoKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB2YWx1ZS5tYXAoTnVtYmVyKSksXG4pXG5cbmV4cG9ydCBjb25zdCBvYmplY3QgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSldKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gcXMucGFyc2UodmFsdWUpIDogdmFsdWUpLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBnZXQodmFsdWUsIGtleSkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSksXG4pXG5cbmV4cG9ydCBmdW5jdGlvbiB1cmwoKSB7XG4gICAgcmV0dXJuIG9iamVjdCgpXG59XG5cbnVybC5udW1iZXIgPSBudW1iZXJcbnVybC5ib29sZWFuID0gYm9vbGVhbiBcbnVybC5kYXRlID0gZGF0ZSBcbnVybC5kYXRldGltZSA9IGRhdGV0aW1lXG51cmwuYXJyYXkgPSBhcnJheVxudXJsLmFycmF5TnVtYmVyID0gYXJyYXlOdW1iZXJcbnVybC5vYmplY3QgPSBvYmplY3RcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCcgXG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBjb25zdCBrZXlWYWx1ZSA9ICgpID0+IHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsdWUuc3BsaXQoL1s7XFxuXS8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmZpbHRlcihsID0+IGwuaW5jbHVkZXMoJz0nKSlcbiAgICAgICAgLm1hcChsID0+IGwudHJpbSgpLnNwbGl0KCc9JykpXG5cbiAgICBjb25zdCBvYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcykgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgbGV0IHBhcnNlZFZhbHVlOiBhbnkgPSB2YWx1ZVxuXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ2Jvb2w6JywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHBhcnNlZFZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn0pKVxuIiwiaW1wb3J0IHsgbnVtYmVyLCBhcnJheSB9IGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRpb25QYXJhbXMge1xuICAgIG1heExpbWl0PzogbnVtYmVyXG4gICAgb3JkZXJGaWVsZHM/OiBzdHJpbmdbXVxufVxuXG5cbmV4cG9ydCBjb25zdCBiYXNlID0gKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkgPT4gdi5vYmplY3Qoe1xuICAgIHBhZ2U6IHYub3B0aW9uYWwobnVtYmVyKCksIDEpLFxuICAgIGxpbWl0OiB2Lm9wdGlvbmFsKG51bWJlcigpLCBvcHRpb25zLm1heExpbWl0IHx8IDEwMCksXG4gICAgb3JkZXJCeTogdi5udWxsaXNoKG9wdGlvbnMub3JkZXJGaWVsZHMgPyBhcnJheSh2LnBpY2tsaXN0KG9wdGlvbnMub3JkZXJGaWVsZHMpKSA6IGFycmF5KHYuc3RyaW5nKCkpLCBbXSksXG4gICAgb3JkZXJEaXJlY3Rpb246IHYubnVsbGlzaChhcnJheSh2LnVuaW9uKFt2LmxpdGVyYWwoJ2FzYycpLCB2LmxpdGVyYWwoJ2Rlc2MnKV0pKSwgW10pLFxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRpb24ob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSB7XG4gICAgcmV0dXJuIGJhc2Uob3B0aW9ucylcbn1cblxucGFnaW5hdGlvbi5iYXNlID0gYmFzZVxuIiwiZXhwb3J0ICogZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5leHBvcnQgKiBmcm9tICcuL2tleVZhbHVlVmFsaWRhdG9yLnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9wYWdpbmF0aW9uVmFsaWRhdG9yLnRzJ1xuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0ICogYXMgZXh0cmFzIGZyb20gJyNzaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4uL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IHR5cGUgVmFsaWJvdCA9IHR5cGVvZiB2ICYgeyBleHRyYXM6IHR5cGVvZiBleHRyYXMgfVxuXG5leHBvcnQgdHlwZSBWYWxpYm90U2NoZW1hID0gdi5CYXNlU2NoZW1hPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuZXhwb3J0IHR5cGUgVmFsaWJvdE9iamVjdFNjaGVtYSA9IHYuT2JqZWN0U2NoZW1hPGFueSwgYW55PlxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYUFzeW5jID0gdi5CYXNlU2NoZW1hQXN5bmM8dW5rbm93biwgdW5rbm93biwgdi5CYXNlSXNzdWU8dW5rbm93bj4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yQ2FsbGJhY2s8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+IHtcbiAgICAoX3Y6IFZhbGlib3QpOiBUXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VCBleHRlbmRzIFZhbGlib3RTY2hlbWFBc3luYz4gPSB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JSZXN1bHQ8VCBleHRlbmRzIHYuQmFzZVNjaGVtYTxhbnksIGFueSwgYW55Pj4gPSB2LkluZmVyT3V0cHV0PFQ+XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUGF5bG9hZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA9IFZhbGlib3RTY2hlbWE+ID0gVmFsaWRhdG9yQ2FsbGJhY2s8VD4gfCBUXG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRlUmVzdWx0PFQgZXh0ZW5kcyBWYWxpZGF0ZVBheWxvYWQ+ID1cbiAgICBUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYSA/IHYuSW5mZXJPdXRwdXQ8VD4gOlxuICAgIFQgZXh0ZW5kcyBWYWxpZGF0b3JDYWxsYmFjazxpbmZlciBVPiA/IHYuSW5mZXJPdXRwdXQ8VT4gOlxuICAgIHVua25vd25cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0b3JTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdWYWxpZGF0b3JTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHY6IFZhbGlib3QgPSB7XG4gICAgICAgIC4uLnYsXG4gICAgICAgIGV4dHJhcyxcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihjYjogVmFsaWRhdG9yQ2FsbGJhY2s8VD4pIHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMudilcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGU8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPikge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSB2LnNhZmVQYXJzZShzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ucm9vdCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4uZmxhdHRlbi5yb290KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmxhdHRlbi5uZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmbGF0dGVuLm5lc3RlZCkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkgYXMgW3N0cmluZywgc3RyaW5nW11dXG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCguLi52YWx1ZS5tYXAoKHYpID0+IGAke2tleX06ICR7dn1gKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXMubGVuZ3RoID8gbWVzc2FnZXMuam9pbignLCAnKSA6ICdWYWxpZGF0aW9uIGZhaWxlZCdcblxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCA0MjIpXG5cbiAgICAgICAgICAgIGVycm9yLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJ1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG1lc3NhZ2VzLCB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUFzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRvckNhbGxiYWNrQXN5bmM8VD4gfCBUKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgb3V0cHV0LCBpc3N1ZXMsIHN1Y2Nlc3MgfSA9IGF3YWl0IHYuc2FmZVBhcnNlQXN5bmMoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJylcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW4gPSB2LmZsYXR0ZW4oaXNzdWVzKVxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAuLi5mbGF0dGVuLnJvb3QsXG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5uZXN0ZWQsXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZGV0YWlscywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYWxpZDxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdGVQYXlsb2FkPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxufVxuXG4iLCJleHBvcnQgZnVuY3Rpb24gbWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gU3BsaXQgcGF0aHMgaW50byBzZWdtZW50c1xuICAgIGNvbnN0IHBhdHRlcm5TZWdtZW50cyA9IHBhdHRlcm4uc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICAvLyBDaGVjayBlYWNoIHNlZ21lbnRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5TZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSBwYXR0ZXJuU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSBwYXRoU2VnbWVudHNbaV1cblxuICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgd2lsZGNhcmQgKCopLCBpdCBtYXRjaGVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlJ3ZlIHJ1biBvdXQgb2YgcmVxdWVzdCBzZWdtZW50cyBidXQgc3RpbGwgaGF2ZSByb3V0ZSBzZWdtZW50cywgbm8gbWF0Y2hcbiAgICAgICAgaWYgKGkgPj0gcGF0aFNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgcGFyYW1ldGVyIChzdGFydHMgd2l0aCA6KSwgaXQgbWF0Y2hlcyBhbnkgdmFsdWVcbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIHNlZ21lbnRzIG11c3QgbWF0Y2ggZXhhY3RseVxuICAgICAgICBpZiAocm91dGVTZWdtZW50ICE9PSByZXF1ZXN0U2VnbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgcmVxdWVzdCBzZWdtZW50cyB0aGFuIHJvdXRlIHNlZ21lbnRzIChhbmQgbm8gd2lsZGNhcmQpLCBubyBtYXRjaFxuICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID4gcGF0dGVyblNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxufVxuIiwiaW1wb3J0IHFzIGZyb20gJ3FzJyBcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsUGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgIGNvbnN0IHJvdXRlU2VnbWVudHMgPSByb3V0ZVBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudCA9IHJvdXRlU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gcm91dGVTZWdtZW50LnNsaWNlKDEpIC8vIFJlbW92ZSB0aGUgJzonIHByZWZpeFxuICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCA9PT0gJyonKSB7XG4gICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSByZXF1ZXN0U2VnbWVudHMuc2xpY2UoaSlcbiAgICAgICAgICAgIHBhcmFtc1snKiddID0gcmVtYWluaW5nU2VnbWVudHMuam9pbignLycpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxRdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG5cbiAgICByZXR1cm4gcXMucGFyc2UocXVlcnlTdHJpbmcpXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc2FmZUpzb25QYXJzZTxUPihqc29uU3RyaW5nOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZykgYXMgVDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcGFyc2UgSlNPTjonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVKc29uU3RyaW5naWZ5PFQ+KHZhbHVlOiBUKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RyaW5naWZ5IEpTT046JywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCJpbXBvcnQgVmFsaWRhdG9yU2VydmljZSBmcm9tIFwiLi4vc2VydmljZXMvVmFsaWRhdG9yU2VydmljZVwiXG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yU2VydmljZSgpXG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRvclxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cblxuZXhwb3J0IHR5cGUgRGFzaGJvYXJkTWV0YVNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRNZXRhU2NoZW1hPj5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZE1ldGFTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGUodiA9PiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBkYXNoYm9hcmRfaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYuc3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLmNyZWF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBpY2soZGFzaGJvYXJkTWV0YVNjaGVtYSgpLCBbJ2Rhc2hib2FyZF9pZCcsICduYW1lJywgJ3ZhbHVlJ10pKVxuXG5kYXNoYm9hcmRNZXRhU2NoZW1hLnVwZGF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBhcnRpYWwoZGFzaGJvYXJkTWV0YVNjaGVtYS5jcmVhdGUpKVxuIiwiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JSZXN1bHQgfSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJyNzaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMnXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZFNjaGVtYSA9IFZhbGlkYXRvclJlc3VsdDxSZXR1cm5UeXBlPHR5cGVvZiBkYXNoYm9hcmRTY2hlbWE+PlxuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGJvYXJkU2NoZW1hKCkge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgbmFtZTogdi5zdHJpbmcoKSxcbiAgICAgICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG5cbiAgICAgICAgbWV0YXM6IHYub3B0aW9uYWwodi5yZWNvcmQodi5zdHJpbmcoKSwgdi5hbnkoKSkpLFxuICAgIH0pKVxufVxuXG5kYXNoYm9hcmRTY2hlbWEuY3JlYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGljayhkYXNoYm9hcmRTY2hlbWEoKSwgWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ10pKVxuXG5kYXNoYm9hcmRTY2hlbWEudXBkYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGFydGlhbChkYXNoYm9hcmRTY2hlbWEuY3JlYXRlKSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbkFzc2lnbm1lbnQgPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIHBlcm1pc3Npb25faWQ6IHYubnVtYmVyKCksXG4gICAgYXNzaWduYWJsZV90eXBlOiB2LnN0cmluZygpLFxuICAgIGFzc2lnbmFibGVfaWQ6IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgZGVzY3JpcHRpb246IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgYWN0aW9uOiB2LnN0cmluZygpLFxuICAgIHN1YmplY3Q6IHYuc3RyaW5nKCksXG4gICAgY29uZGl0aW9uczogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFRva2VuID0gdi5JbmZlck91dHB1dDx0eXBlb2YgdG9rZW5TY2hlbWE+XG5cbmV4cG9ydCBjb25zdCB0b2tlblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIHR5cGU6IHYuc3RyaW5nKCksXG4gICAgdXNlcl9pZDogdi5udW1iZXIoKSxcbiAgICB0b2tlbjogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgZXhwaXJlc19hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmZ1bmN0aW9uIHVzZXJTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgICAgIGVtYWlsOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5lbWFpbCgpKSxcbiAgICAgICAgcGFzc3dvcmQ6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCg2KSksXG4gICAgICAgIHVzZXJuYW1lOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5yZWdleCgvXlthLXpBLVowLTlfLV0rJC8pKSxcbiAgICAgICAgdmVyaWZpZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlbGV0ZWRfYXQ6IHYubnVsbGFibGUodi5zdHJpbmcoKSlcbiAgICB9KVxufVxuXG51c2VyU2NoZW1hLmNyZWF0ZSA9ICgpID0+IHYub21pdCh1c2VyU2NoZW1hKCksIFsnaWQnLCAndmVyaWZpZWRfYXQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2RlbGV0ZWRfYXQnXSlcbnVzZXJTY2hlbWEudXBkYXRlID0gKCkgPT4gdi5wYXJ0aWFsKHVzZXJTY2hlbWEuY3JlYXRlKCkpXG5cbmV4cG9ydCBkZWZhdWx0IHVzZXJTY2hlbWFcbiIsImltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJy4vQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlbGxFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgICBwdWJsaWMgb3V0cHV0OiBzdHJpbmdcbiAgICBwdWJsaWMgYmluOiBzdHJpbmcgXG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nLCBiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgNTAxKVxuXG4gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0XG4gICAgICAgIHRoaXMuYmluID0gYmluIFxuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyB7XG4gICAgcGFyc2U/OiAoZGF0YTogYW55KSA9PiBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhc2VFbnRpdHkob3B0aW9uczogQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBvcHRpb25zLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRydWN0b3I/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAodGhpcyBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5lciB7XG4gICAgZXZlbnQ6IHN0cmluZ1xuICAgIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVtaXRIb29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7ICAgICAgICAgICAgICAgIFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IGNvbnN0cnVjdG9yLmxpc3RlbmVycyB8fCBbXVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycy5maWx0ZXIoKGw6IGFueSkgPT4gbC5ldmVudCA9PT0gZXZlbnQpKSB7XG4gICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkhvb2soY29uc3RydWN0b3I6IGFueSwgZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IGNvbnN0cnVjdG9yLmxpc3RlbmVycyB8fCBbXVxuXG4gICAgY29uc3QgZXhpc3RzID0gbGlzdGVuZXJzLmZpbmQoKGw6IGFueSkgPT4gbC5ldmVudCA9PT0gZXZlbnQgJiYgbC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpXG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxpc3RlbmVycy5wdXNoKHsgXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBsaXN0ZW5lciBcbiAgICB9KVxuXG4gICAgY29uc3RydWN0b3IubGlzdGVuZXJzID0gbGlzdGVuZXJzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIb29rc1N0YXRpYzxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KS5ib290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KS5ib290LmFwcGx5KHRoaXMuY29uc3RydWN0b3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc3RhdGljIGxpc3RlbmVycyA9IFtdIGFzIEFycmF5PCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD5cblxuICAgICAgICBwdWJsaWMgc3RhdGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvbkhvb2sodGhpcywgZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1pdEhvb2sodGhpcywgZXZlbnQsIC4uLmFyZ3MpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEhvb2tzPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIHB1YmxpYyBsaXN0ZW5lcnM6IExpc3RlbmVyW11cblxuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKHsgXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgbGlzdGVuZXIgXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdGVuZXJzLmZpbmRJbmRleCgobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQgJiYgbC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpXG5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGwgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBwdWJsaWMgYXN5bmMgZW1pdEFzeW5jKGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGwgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5Ib29rc1N0YXRpYy5lbWl0ID0gZW1pdEhvb2tcbkhvb2tzU3RhdGljLm9uID0gb25Ib29rXG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBTb2Z0RGVsZXRlTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBkZWxldGVkX2F0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBUaW1lc3RhbXBNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGNyZWF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICAgICAgcHVibGljIHVwZGF0ZWRfYXQ6IERhdGUgfCBzdHJpbmdcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBvcmlnaW46IHN0cmluZ1xuICAgIHB1YmxpYyBzdWJqZWN0OiBzdHJpbmdcbiAgICBwdWJsaWMgYWN0aW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgY29uZGl0aW9uczogc3RyaW5nIHwgbnVsbCB8IFJlY29yZDxzdHJpbmcsIGFueT4gPSBudWxsXG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gPT09ICdjdXN0b20nXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJzZWRDb25kaXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gdHJ5Q2F0Y2guc3luYygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZGl0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmNvbmRpdGlvbnMgYXMgc3RyaW5nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gZXJyb3IgPyB7fSA6IGpzb25cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVBYmlsaXR5LCBzdWJqZWN0IGFzIGNyZWF0ZVN1YmplY3QgfSBmcm9tICdAY2FzbC9hYmlsaXR5J1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY2xFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0FjbEVudGl0eSdcblxuICAgIHB1YmxpYyBhYmlsaXR5OiBSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVBYmlsaXR5PlxuICAgIHB1YmxpYyBwZXJtaXNzaW9uczogUGVybWlzc2lvbltdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPEFjbEVudGl0eT4gPSB7fSkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGRhdGEucGVybWlzc2lvbnMgfHwgW11cbiAgICAgICAgY29uc3QgcGVybXMgPSBwZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IFBlcm1pc3Npb24uZnJvbShwZXJtaXNzaW9uKSlcblxuICAgICAgICBcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1zXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKS5jaGlsZCh7IGxhYmVsOiAnYWNsJyB9KVxuICAgICAgICBcbiAgICAgICAgdGhpcy5hYmlsaXR5ID0gZGVmaW5lQWJpbGl0eSgoY2FuKSA9PiB7XG4gICAgICAgICAgICBwZXJtcy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FuKHBlcm1pc3Npb24uYWN0aW9uLCBwZXJtaXNzaW9uLnN1YmplY3QsIHBlcm1pc3Npb24ucGFyc2VkQ29uZGl0aW9ucylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJywge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiB0aGlzLnBlcm1pc3Npb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW4oYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuXG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIGNhbm5vdChhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3QpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJqZWN0V2l0aE9iamVjdCA9IGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdFdpdGhPYmplY3QpXG4gICAgfVxuXG4gICAgcHVibGljIHN1YmplY3Qoc3ViamVjdDogc3RyaW5nLCBvYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVN1YmplY3Qoc3ViamVjdCwgb2JqZWN0KVxuICAgIH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ29va2llTWFwRW50aXR5T3B0aW9ucyB7XG4gICAgY29va2llcz86IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwcmVmaXg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29va2llTWFwRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb29raWVNYXBFbnRpdHknXG5cbiAgICBwdWJsaWMgY29va2llczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBwcmVmaXg6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IENvb2tpZU1hcEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb29raWVzID0gZGF0YT8uY29va2llcyB8fCBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMucHJlZml4ID0gZGF0YT8ucHJlZml4IHx8ICcnXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IE1hcDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgaWYgKGNvb2tpZXMgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb29raWVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb29raWVzW2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KGZ1bGxOYW1lKSB8fCBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2Ugd2FudCB0byBhbGxvdyBhbnkgb3B0aW9ucyB0byBiZSBwYXNzZWQgaGVyZSwgYXMgdGhleSBtYXkgYmUgdXNlZCBieSB0aGUgdW5kZXJseWluZyBjb29raWVcbiAgICAvLyAgZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgdGhpcy5jb29raWVzLnNldChmdWxsTmFtZSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh0aGlzLnByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bnByZWZpeGVkS2V5ID0ga2V5LnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aClcblxuICAgICAgICAgICAgICAgIHJlc3VsdFt1bnByZWZpeGVkS2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IFRZUEVTID0gKCkgPT4gW1xuICAgIHtcbiAgICAgICAgaWQ6ICdmcycsXG4gICAgICAgIGxhYmVsOiAkdCgnRmlsZSBTeXN0ZW0nKSxcbiAgICAgICAgZGVzY3JpcHRpb246ICR0KCdTdG9yZSBmaWxlcyBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uJyksXG4gICAgICAgIGNvbmZpZ19maWVsZHM6IHtcbiAgICAgICAgICAgIGRpcmVjdG9yeToge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnRGlyZWN0b3J5JyksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICR0KCdUaGUgZGlyZWN0b3J5IHBhdGggd2hlcmUgZmlsZXMgd2lsbCBiZSBzdG9yZWQuJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1JlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiByb290IG9yIGFic29sdXRlIHBhdGgsIGUuZy4sIDowICBvciA6MScsIFsnL3Zhci96ZW5pdGgvdXBsb2FkcycsICdzdG9yYWdlL3VwbG9hZHMnXSksXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6ICdzMycsXG4gICAgICAgIGxhYmVsOiAnUzMnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJHQoJ1N0b3JlIGZpbGVzIG9uIGFuIFMzLWNvbXBhdGlibGUgc2VydmljZSBsaWtlIEFXUyBTMywgRGlnaXRhbE9jZWFuIFNwYWNlcywgZXRjLicpLFxuICAgICAgICBjb25maWdfZmllbGRzOiB7XG4gICAgICAgICAgICBhY2Nlc3NLZXlJZDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnQWNjZXNzIEtleSBJRCcpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdZb3VyIEFXUyBhY2Nlc3Mga2V5IElELicpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdTZWNyZXQgQWNjZXNzIEtleScpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdZb3VyIEFXUyBzZWNyZXQgYWNjZXNzIGtleS4nKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJ1Y2tldDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnQnVja2V0IE5hbWUnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnVGhlIG5hbWUgb2YgdGhlIFMzIGJ1Y2tldCB0byBzdG9yZSBmaWxlcyBpbi4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWdpb246IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ1JlZ2lvbicpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdUaGUgQVdTIHJlZ2lvbiB3aGVyZSB5b3VyIGJ1Y2tldCBpcyBsb2NhdGVkLicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnUHJlZml4JyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ0FuIG9wdGlvbmFsIHByZWZpeCAoZm9sZGVyIHBhdGgpIHRvIHN0b3JlIGZpbGVzIHVuZGVyIGluIHRoZSBidWNrZXQuJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0VuZHBvaW50IFVSTCcpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdPcHRpb25hbCBjdXN0b20gZW5kcG9pbnQgVVJMIGZvciBTMy1jb21wYXRpYmxlIHNlcnZpY2VzLicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgIH1cbl1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlQ29uZmlnIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBUWVBFUygpIHtcbiAgICAgICAgcmV0dXJuIFRZUEVTKClcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHR5cGU6IHN0cmluZ1xuICAgIHB1YmxpYyBpc19kZWZhdWx0OiBib29sZWFuXG4gICAgcHVibGljIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogRHJpdmVDb25maWcpe1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb25maWdfZmllbGRzKCkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBEcml2ZUNvbmZpZy5UWVBFUy5maW5kKG9wdCA9PiBvcHQuaWQgPT09IHRoaXMudHlwZSlcblxuICAgICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLmNvbmZpZ19maWVsZHMgOiB7fVxuICAgIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUVudHJ5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHBhdGg6IHN0cmluZ1xuICAgIHB1YmxpYyB0eXBlOiAnZmlsZScgfCAnZGlyZWN0b3J5J1xuICAgIHB1YmxpYyBtZXRhczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBEcml2ZUVudHJ5KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZUVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBkcml2ZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWV0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIGNsaWVudF9uYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZmlsZW5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdWJsaWM6IGJvb2xlYW5cblxuICAgIC8vIGR5bmFtaWNcbiAgICBwdWJsaWMgdXJsPzogc3RyaW5nXG4gICAgcHVibGljIG1ldGFzPzogUmVjb3JkPHN0cmluZywgYW55PlxuXG4gICAgcHVibGljIGlzSW1hZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWV0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVNZXRhIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGZpbGVfaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyB8IG51bGxcbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGxvYWRTZXNzaW9uIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZV90eXBlczogc3RyaW5nXG4gICAgcHVibGljIG1heF9zaXplOiBudW1iZXJcblxuICAgIC8vIGR5bmFtaWMgXG4gICAgcHVibGljIHVwbG9hZF91cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgY3JlYXRlX2ZpbGVfdXJsPzogc3RyaW5nXG5cbiAgICBwdWJsaWMgZ2V0UGFyc2VkTWltZVR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZV90eXBlcy5zcGxpdCgnLCcpLm1hcCh0eXBlID0+IHR5cGUudHJpbSgpKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRNaW1lVHlwZShtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHRoaXMuZ2V0UGFyc2VkTWltZVR5cGVzKClcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5pbmNsdWRlcyhtaW1lVHlwZSkgfHwgYWxsb3dlZFR5cGVzLmluY2x1ZGVzKCcqLyonKVxuICAgIH1cblxuICAgIHB1YmxpYyBpc0FsbG93ZWRTaXplKHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc2l6ZSA8PSB0aGlzLm1heF9zaXplXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2l0QnJhbmNoRW50aXR5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHJlbW90ZTogc3RyaW5nIHwgbnVsbFxuICAgIHB1YmxpYyBpc19jdXJyZW50OiBib29sZWFuXG4gICAgcHVibGljIGlzX3JlbW90ZTogYm9vbGVhblxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogR2l0QnJhbmNoRW50aXR5KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHaXRDb21taXRFbnRpdHkge1xuICAgIHB1YmxpYyBoYXNoOiBzdHJpbmdcbiAgICBwdWJsaWMgc2hvcnRfaGFzaDogc3RyaW5nXG4gICAgcHVibGljIG1lc3NhZ2U6IHN0cmluZ1xuICAgIHB1YmxpYyBib2R5OiBzdHJpbmdcbiAgICBwdWJsaWMgYXV0aG9yX25hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBhdXRob3JfZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBkYXRlOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IEdpdENvbW1pdEVudGl0eSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIHNldEhlYWRlcj86IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGVhZGVyTWFwRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdIZWFkZXJNYXBFbnRpdHknXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgc2V0SGVhZGVyPzogKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdm9pZFxuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IEhlYWRlck1hcEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnNldEhlYWRlciA9IGRhdGE/LnNldEhlYWRlclxuXG4gICAgICAgIGlmIChkYXRhPy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRGcm9tUmVjb3JkKGRhdGEuaGVhZGVycylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KG5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXRIZWFkZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdzZXRIZWFkZXIgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQnKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChuYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmVudHJpZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgTW9kdWxlTWFuaWZlc3QgZnJvbSAnLi9Nb2R1bGVNYW5pZmVzdEVudGl0eS50cydcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5pbnRlcmZhY2UgTW9kdWxlVXBncmFkZUluZm8ge1xuICAgIHNvdXJjZTogJ2dpdCcgfCAnemlwJ1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIG1peGluKExpZmVjeWNsZUhvb2spKSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIHB1YmxpYyBidWlsZDogTW9kdWxlTWFuaWZlc3RbJ2J1aWxkJ10gPSB7fVxuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIHVwZ3JhZGVfaW5mbz86IE1vZHVsZVVwZ3JhZGVJbmZvXG5cbiAgICBwdWJsaWMgc2V0RGF0YShkYXRhOiBQYXJ0aWFsPE1vZHVsZSB8IE1vZHVsZU1hbmlmZXN0Pikge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGRhdGEpLmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZmlsdGVyZWQpXG5cbiAgICAgICAgdGhpcy5ob29rX2lkID0gYG1vZHVsZToke3RoaXMuaWR9YFxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydCB7XG4gICAgZnJvbTogc3RyaW5nXG4gICAgdG8/OiBzdHJpbmdcbiAgICB0eXBlOiAnZ2xvYmFsX2ltcG9ydCdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RCdWlsZCB7XG4gICAgaW1wb3J0cz86IE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnRbXVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGVNYW5pZmVzdCBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhdXRob3I/OiBzdHJpbmdcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBidWlsZD86IE1vZHVsZU1hbmlmZXN0QnVpbGRcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2luYXRpb25FbnRpdHk8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBwdWJsaWMgaXRlbXM6IFRbXVxuICAgIHB1YmxpYyB0b3RhbDogbnVtYmVyXG4gICAgcHVibGljIHBhZ2U6IG51bWJlclxuICAgIHB1YmxpYyBwZXJfcGFnZTogbnVtYmVyXG4gICAgcHVibGljIHRvdGFsX3BhZ2VzOiBudW1iZXJcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8UGFnaW5hdGlvbkVudGl0eT4pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPiA+KHBheWxvYWQ6IFBhcnRpYWw8UGFnaW5hdGlvbkVudGl0eTxUPj4pOiBQYWdpbmF0aW9uRW50aXR5PFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdpbmF0aW9uRW50aXR5KHBheWxvYWQgYXMgYW55KVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhblxuICAgIHB1YmxpYyBhbGlhc2VzOiBzdHJpbmdbXVxuICAgIHB1YmxpYyB2ZXJzaW9uX2NoYW5uZWw6IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJzaW9uX2F2YWlsYWJsZV9jaGFubmVsczogc3RyaW5nW11cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xufVxuIiwiaW1wb3J0IHR5cGUgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSBSb2xlIGZyb20gJy4vUm9sZUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlckVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZW1haWw6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdXNlcm5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXNzd29yZD86IHN0cmluZ1xuICAgIHB1YmxpYyB2ZXJpZmllZF9hdD86IERhdGUgfCBzdHJpbmcgfCBudWxsXG5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgcm9sZXM/OiBSb2xlW11cblxuICAgIHB1YmxpYyBnZXQgaW5pdGlhbHMoKXtcbiAgICAgICAgY29uc3QgW2ZpcnN0TmFtZSwgc2Vjb25kTmFtZV0gPSB0aGlzLm5hbWUuc3BsaXQoJyAnKVxuXG4gICAgICAgIGlmICghc2Vjb25kTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgY29uc3QgYiA9IHNlY29uZE5hbWVbMF0udG9VcHBlckNhc2Uo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
|
|
1
|
+
import{t as e}from"./chunk-0Lt9GpW0.mjs";import{debounce as t,get as n,has as r,orderBy as i,set as a,unset as o}from"lodash-es";import*as s from"valibot";import{format as c}from"date-fns";import l from"qs";import{defineAbility as ee,subject as u}from"@casl/ability";function d(...e){return e.reduce((e,t)=>t(e),class{})}function f(e,...t){return t.reduce((e,t)=>t(e),e)}function p(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 m(e,t=2){if(e===0)return`0 Bytes`;let n=1024,r=t<0?0:t,i=[`Bytes`,`KB`,`MB`,`GB`,`TB`,`PB`],a=Math.floor(Math.log(e)/Math.log(n));return parseFloat((e/n**+a).toFixed(r))+` `+i[a]}function h(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`){h(i,e,n);continue}n[e]=i}return n}function te(e){let t={};for(let[n,r]of Object.entries(e))a(t,n,r);return t}async function g(e){try{return[null,await e()]}catch(e){return[e,null]}}g.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};function _(){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 v(e=``){return e+_()}var y=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 i=n.value;return typeof i!=`object`||Array.isArray(i)?!1:r(i,e.substring(t.length+1))}get(e,t){let r=this.entries.get(e);if(r)return r.value;if(!e.includes(`.`))return t;let i=e.split(`.`)[0],a=this.entries.get(i);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:n(o,e.substring(i.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={}),a(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)||(o(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return h(this.toRecord())}},b=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)}},ne=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||e} 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 b(`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())}},x=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},re=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new x,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||v();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,n,r){let i=t(n,r?.debounce||300),a=this.on(e,i,r);return a&&(a.originalListener=n),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)g.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}},S=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},ie=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 x,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=i(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 g(()=>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 S;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()}},ae=class{static __container_entry_key=`TranslatorService`;entries;locale;localeLoaders;debug=!1;logger;cache;constructor(e={}){this.entries=e.entries||new Map,this.locale=e.locale||`en`,this.debug=e.debug||!1,this.cache=e.cache||new Map,this.logger=e.logger||new x,this.localeLoaders=new Map,this.debug&&this.logger.debug(`initialized in debug mode`,{locale:this.locale})}get locales(){return Array.from(this.localeLoaders.keys())}list(){let e=[];return this.entries.forEach((t,n)=>{e.push({key:n,value:t})}),e}async getEntries(e){let t=this.cache.get(e);if(t&&this.debug&&this.logger.debug(`load locale "${e}" from cache`,{locale:e,length:Object.keys(t).length}),t)return t;let n=this.localeLoaders.get(e);if(!n)return this.logger.warn(`no loader found for locale "${e}"`),{};let r=await n();return this.cache.set(e,r),this.debug&&this.logger.debug(`load locale ${e}`,{locale:e,keys:Object.keys(r).length}),r}async load(e){let t=await this.getEntries(e);this.entries=new Map(Object.entries(t)),this.locale=e}t(e,t={}){!this.entries.has(e)&&this.debug&&this.logger.debug(`missing translation for key "${e}"`,{key:e,locale:this.locale});let n=this.entries.get(e)||e;return Object.keys(t).length&&Object.entries(t).forEach(([e,t])=>{n=n.replace(`:${e}`,String(t))}),n}date(e){return new Date(e).toLocaleDateString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`})}datetime(e){return new Date(e).toLocaleString(this.locale,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`})}},oe=class{static __container_entry_key=`UploadService`;single(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}multiple(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{name:e}),t}};const C=()=>s.pipe(s.union([s.string(),s.number()]),s.transform(Number),s.integer()),w=()=>s.pipe(s.union([s.string(),s.boolean()]),s.transform(e=>e===!0||e===`true`)),T=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e instanceof Date?e:new Date(e)),s.transform(e=>e&&c(e,`yyyy-MM-dd`))),E=()=>s.pipe(s.union([s.string(),s.date()]),s.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),c(e,`yyyy-MM-dd HH:mm`))))),D=(e=s.any())=>s.pipe(s.union([s.string(),s.array(s.string())]),s.transform(e=>Array.isArray(e)?e:e.split(`,`)),s.array(e)),O=()=>s.pipe(D(),s.transform(e=>e.map(Number))),k=()=>s.pipe(s.union([s.string(),s.record(s.string(),s.any())]),s.transform(e=>typeof e==`string`?l.parse(e):e),s.transform(e=>{let t={};for(let r in e)a(t,r,n(e,r));return t}));function A(){return k()}A.number=C,A.boolean=w,A.date=T,A.datetime=E,A.array=D,A.arrayNumber=O,A.object=k;const se=()=>s.pipe(s.string(),s.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`),a(r,e,n)}return r})),j=(e={})=>s.object({page:s.optional(C(),1),limit:s.optional(C(),e.maxLimit||100),orderBy:s.nullish(e.orderFields?D(s.picklist(e.orderFields)):D(s.string()),[]),orderDirection:s.nullish(D(s.union([s.literal(`asc`),s.literal(`desc`)])),[])});function M(e={}){return j(e)}M.base=j;var ce=e({array:()=>D,arrayNumber:()=>O,base:()=>j,boolean:()=>w,date:()=>T,datetime:()=>E,keyValue:()=>se,number:()=>C,object:()=>k,pagination:()=>M,url:()=>A}),N=class{static __container_entry_key=`ValidatorService`;v={...s,extras:ce};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=s.safeParse(n,e);if(!a){let e=s.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 b(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 s.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=s.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}=s.safeParse(n,e);return r}};function le(e,t){let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean);for(let e=0;e<n.length;e++){let t=n[e],i=r[e];if(t===`*`)return!0;if(e>=r.length||!t.startsWith(`:`)&&t!==i)return!1}return!(r.length>n.length)}function P(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 F(e){let t={},n=e.split(`?`)[1];return n?l.parse(n):t}function I(e){try{return JSON.parse(e)}catch(e){return console.error(`Failed to parse JSON:`,e),null}}function L(e){try{return JSON.stringify(e)}catch(e){return console.error(`Failed to stringify JSON:`,e),null}}const R=new N;function z(){return R.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}z.create=R.create(e=>e.pick(z(),[`dashboard_id`,`name`,`value`])),z.update=R.create(e=>e.partial(z.create));function B(){return R.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()))}))}B.create=R.create(e=>e.pick(B(),[`name`,`description`])),B.update=R.create(e=>e.partial(B.create));const V=s.object({id:s.number(),permission_id:s.number(),assignable_type:s.string(),assignable_id:s.string(),created_at:s.string(),updated_at:s.string()}),H=s.object({id:s.number(),name:s.nullable(s.string()),description:s.nullable(s.string()),action:s.string(),subject:s.string(),conditions:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),expires_at:s.string()}),U=s.object({id:s.number(),name:s.nullable(s.string()),type:s.string(),user_id:s.number(),token:s.string(),created_at:s.string(),updated_at:s.string(),expires_at:s.string()});function W(){return s.object({id:s.number(),name:s.optional(s.string()),email:s.pipe(s.string(),s.email()),password:s.pipe(s.string(),s.minLength(6)),username:s.pipe(s.string(),s.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:s.nullable(s.string()),created_at:s.string(),updated_at:s.string(),deleted_at:s.nullable(s.string())})}W.create=()=>s.omit(W(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),W.update=()=>s.partial(W.create());var ue=class extends b{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};function de(e={}){return function(t){return class extends t{static from(n){let r=new(typeof this==`function`?this:t),i={...n};return e.parse&&(i=e.parse(n)),Object.assign(r,i),r}merge(e){return Object.assign(this,e),this}}}}function G(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}}}async function K(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function q(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 J(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 q(this,e,t)}static async emit(e,...t){return K(this,e,...t)}}}function fe(e){return class extends e{listeners;constructor(...e){super(...e),this.listeners=[]}on(e,t){this.listeners.push({event:e,listener:t})}off(e,t){let n=this.listeners.findIndex(n=>n.event===e&&n.listener===t);n!==-1&&this.listeners.splice(n,1)}emit(e,...t){let n=this.listeners.filter(t=>t.event===e);for(let e of n)e.listener(...t)}async emitAsync(e,...t){let n=this.listeners.filter(t=>t.event===e);for await(let e of n)await e.listener(...t)}}}J.emit=K,J.on=q;function Y(e){return class extends e{deleted_at=null}}function X(e){return class extends e{created_at;updated_at}}var Z=class extends d(G){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=g.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},pe=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>Z.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new x().child({label:`acl`}),this.ability=ee(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=u(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=u(t,n);return this.ability.cannot(e,r)}subject(e,t){return u(e,t)}},me=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}};const Q=()=>[{id:`fs`,label:$t(`File System`),description:$t(`Store files on the local file system.`),config_fields:{directory:{component:`text-field`,label:$t(`Directory`),description:$t(`The directory path where files will be stored.`),hint:$t(`Relative to the application root or absolute path, e.g., :0 or :1`,[`/var/zenith/uploads`,`storage/uploads`])}}},{id:`s3`,label:`S3`,description:$t(`Store files on an S3-compatible service like AWS S3, DigitalOcean Spaces, etc.`),config_fields:{accessKeyId:{component:`text-field`,label:$t(`Access Key ID`),hint:$t(`Your AWS access key ID.`),type:`password`},secretAccessKey:{component:`text-field`,label:$t(`Secret Access Key`),hint:$t(`Your AWS secret access key.`),type:`password`},bucket:{component:`text-field`,label:$t(`Bucket Name`),hint:$t(`The name of the S3 bucket to store files in.`)},region:{component:`text-field`,label:$t(`Region`),hint:$t(`The AWS region where your bucket is located.`)},prefix:{component:`text-field`,label:$t(`Prefix`),hint:$t(`An optional prefix (folder path) to store files under in the bucket.`)},endpoint:{component:`text-field`,label:$t(`Endpoint URL`),hint:$t(`Optional custom endpoint URL for S3-compatible services.`)}}}];var he=class e{static get TYPES(){return Q()}id;name;type;is_default;config;constructor(e){Object.assign(this,e)}get config_fields(){let t=e.TYPES.find(e=>e.id===this.type);return t?t.config_fields:{}}},ge=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}},_e=class extends d(G,X,Y){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},ve=class extends d(G,X,Y){id;file_id;name;value},ye=class extends d(G,X,Y){id;purpose;mime_types;max_size;upload_url;create_file_url;getParsedMimeTypes(){return this.mime_types.split(`,`).map(e=>e.trim())}isAllowedMimeType(e){let t=this.getParsedMimeTypes();return t.includes(e)||t.includes(`*/*`)}isAllowedSize(e){return e<=this.max_size}},be=class{name;remote;is_current;is_remote;constructor(e){Object.assign(this,e)}},$=class{hash;short_hash;message;body;author_name;author_email;date;constructor(e){Object.assign(this,e)}},xe=class{static __container_entry_key=`HeaderMapEntity`;entries;setHeader;constructor(e){this.entries=new Map,this.setHeader=e?.setHeader,e?.headers&&this.loadFromRecord(e.headers)}loadFromRecord(e){for(let t of Object.keys(e))this.set(t,e[t])}get(e,t=null){return this.entries.get(e)||t}set(e,t){if(!this.setHeader)throw new b(`setHeader function is not defined`);this.entries.set(e,t)}toRecord(){let e={},t=Array.from(this.entries.entries());for(let[n,r]of t)e[n]=r;return e}},Se=class extends d(G,p(S)){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}`}},Ce=class extends d(G){id;name;version;description;enabled;author;dependencies;build},we=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},Te=class extends d(G){id;name;version;enabled;aliases;version_channel;version_available_channels},Ee=class extends d(G,X,Y){id;name;description},De=class extends d(G,X,Y){id;email;name;username;password;verified_at;permissions;roles;get initials(){let[e,t]=this.name.split(` `);return t?e[0].toUpperCase()+t[0].toUpperCase():e[0].toUpperCase()}};export{pe as AclEntity,G as BaseEntityMixin,b as BaseException,y as ConfigService,ne as ContainerService,me as CookieMapEntity,he as DriveConfigEntity,ge as DriveEntryEntity,re as EmmitterService,_e as FileEntity,ve as FileMetaEntity,ye as FileUploadSessionEntity,be as GitBranchEntity,$ as GitCommitEntity,xe as HeaderMapEntity,fe as HooksMixin,J as HooksStatic,S as LifecycleHook,ie as LifecycleService,x as LoggerService,Se as ModuleEntity,Ce as ModuleManifestEntity,we as PaginationEntity,Z as PermissionEntity,Te as PluginEntity,Ee as RoleEntity,ue as ShellException,Y as SoftDeleteMixin,Q as TYPES,X as TimestampMixin,ae as TranslatorService,oe as UploadService,De as UserEntity,N as ValidatorService,d as compose,f as composeWith,de as createBaseEntity,v as createId,z as dashboardMetaSchema,B as dashboardSchema,K as emitHook,h as flatten,m as formatBytes,le as matchPath,p as mixin,q as onHook,P as parseUrlParams,F as parseUrlQuery,V as permissionAssignmentSchema,H as permissionSchema,I as safeJsonParse,L as safeJsonStringify,U as tokenSchema,g as tryCatch,te as unflatten,W as userSchema,R as validator};
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiUGVybWlzc2lvbiIsInN1YmplY3QiLCJjcmVhdGVTdWJqZWN0IiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIiwiQmFzZUVudGl0eU1peGluIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9jb21wb3NlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy9mb3JtYXRCeXRlcy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvZmxhdHRlbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbnRhaW5lclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVHJhbnNsYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1VwbG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvdXJsVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL2tleVZhbHVlVmFsaWRhdG9yLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC92YWxpZGF0b3JzL3BhZ2luYXRpb25WYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvaW5kZXgudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL21hdGNoUGF0aHMudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3BhcnNlUm91dGVVcmwudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3V0aWxzL3NhZmVKc29uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRNZXRhU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL2Rhc2hib2FyZFNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3Rva2VuU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zY2hlbWFzL3VzZXJTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2V4Y2VwdGlvbnMvU2hlbGxFeGNlcHRpb24udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1Blcm1pc3Npb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0FjbEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRmlsZU1ldGFFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVVcGxvYWRTZXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9HaXRCcmFuY2hFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0dpdENvbW1pdEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvSGVhZGVyTWFwRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QYWdpbmF0aW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1JvbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi90eXBpbmcudHMnXG5cbmV4cG9ydCB0eXBlIEFueUNsYXNzID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuZXhwb3J0IHR5cGUgTWl4aW48VD4gPSAoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPFQ+XG5cbi8qKlxuICogQ29tcG9zZXMgbXVsdGlwbGUgbWl4aW5zIGludG8gYSBzaW5nbGUgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQuXG4gKiBBbGxvd3MgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLWxpa2UgYmVoYXZpb3IgYnkgYXBwbHlpbmcgbWl4aW5zIHNlcXVlbnRpYWxseS5cbiAqIFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgaW5jbHVkZXMgYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlKFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2U8XG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3Rvcjxhbnk+KSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPiguLi5taXhpbnM6IE0pOiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGNsYXNzIHt9IGFzIGFueSkgYXMgYW55XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgY29tcG9zZSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYmFzZSBjbGFzc1xuICogXG4gKiBAcGFyYW0gYmFzZUNsYXNzIC0gVGhlIGJhc2UgY2xhc3MgdG8gc3RhcnQgd2l0aFxuICogQHBhcmFtIG1peGlucyAtIEFycmF5IG9mIG1peGluIGZ1bmN0aW9ucyB0byBhcHBseVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGV4dGVuZHMgdGhlIGJhc2UgY2xhc3Mgd2l0aCBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2VXaXRoKEJhc2VFbnRpdHksIFRpbWVzdGFtcCwgU29mdERlbGV0ZSkge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gKiAgICAgc3VwZXIoKVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VXaXRoPFxuICAgIFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3IsXG4gICAgTSBleHRlbmRzIEFycmF5PChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oXG4gICAgYmFzZUNsYXNzOiBUQmFzZSxcbiAgICAuLi5taXhpbnM6IE1cbik6IFRCYXNlICYgVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBiYXNlQ2xhc3MgYXMgYW55KSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KFNvdXJjZTogVEJhc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRUYXJnZXQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oVGFyZ2V0OiBUVGFyZ2V0KSB7XG4gICAgICAgIGNsYXNzIE1peGVkIGV4dGVuZHMgVGFyZ2V0IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncylcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3B5IG1ldGhvZHNcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgUmVmbGVjdC5vd25LZXlzKFNvdXJjZS5wcm90b3R5cGUpKSB7XG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgICAgICAgICBNaXhlZC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTb3VyY2UucHJvdG90eXBlLCBrZXkpIVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBNaXhlZCBhcyBUVGFyZ2V0ICYgVEJhc2VcbiAgICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXM6IG51bWJlciwgZGVjaW1hbHMgPSAyKSB7XG4gICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZXMnXG5cbiAgICBjb25zdCBrID0gMTAyNFxuICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJ11cblxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKVxuXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldXG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKG9iajogYW55LCBwcmVmaXggPSAnJywgcmVzOiBhbnkgPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgY29uc3QgaXNJbmRleCA9IC9eXFxkKyQvLnRlc3Qoa2V5KVxuICAgICAgICBjb25zdCBuZXdLZXkgPSBpc0luZGV4ID8gYCR7cHJlZml4fVske2tleX1dYCA6IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmbGF0dGVuKHZhbHVlLCBuZXdLZXksIHJlcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXNbbmV3S2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKG9iajogYW55KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImludGVyZmFjZSBUcnllciB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogYW55XG59XG5cbmludGVyZmFjZSBUcnllckFzeW5jIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBQcm9taXNlPGFueT4gfCBhbnlcbn1cblxudHlwZSBUcnlDYXRjaFJlc3VsdDxUIGV4dGVuZHMgVHJ5ZXI+ID0gW251bGwsIFJldHVyblR5cGU8VD5dIHwgW0Vycm9yLCBudWxsXVxuXG50eXBlIFRyeUNhdGNoQXN5bmNSZXN1bHQ8VCBleHRlbmRzIFRyeWVyQXN5bmM+ID0gW251bGwsIEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj5dIHwgW0Vycm9yLCBudWxsXVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5Q2F0Y2g8VCBleHRlbmRzIFRyeWVyQXN5bmM+KHRyeWVyOiBUKTogUHJvbWlzZTxUcnlDYXRjaEFzeW5jUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG5cbnRyeUNhdGNoLnN5bmMgPSBmdW5jdGlvbiA8VCBleHRlbmRzIFRyeWVyPih0cnllcjogVCk6IFRyeUNhdGNoUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cbiIsImZ1bmN0aW9uIHV1aWQoKXtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNyeXB0byAmJiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBjcnlwdG8ucmFuZG9tVVVJRFxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDBcbiAgICAgICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDhcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpXG4gICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkKHByZWZpeCA9ICcnKSB7XG4gICAgcmV0dXJuIHByZWZpeCArIHV1aWQoKVxufSIsImltcG9ydCB7IGdldCwgc2V0LCBoYXMsIHVuc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJ1xuXG5pbnRlcmZhY2UgRW50cnkge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NvbmZpZ1NlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRW50cnk+XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoJzpib29sZWFuJykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCc6Ym9vbGVhbicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Piwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRba2V5XSA9IGVudHJ5LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXModmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS52YWx1ZSBhcyBUXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyBlbnRyeS52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0KHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIGRlZmF1bHRWYWx1ZSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9uZTxUID0gYW55IHwgdW5kZWZpbmVkPihrZXlzOiBzdHJpbmdbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0PFQ+KGtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAncnVudGltZScpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGxldCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltYXJ5VmFsdWUgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCB2YWx1ZSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICghcHJpbWFyeVZhbHVlKSByZXR1cm5cblxuICAgICAgICBpZiAodHlwZW9mIHByaW1hcnlWYWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShwcmltYXJ5VmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHVuc2V0KHByaW1hcnlWYWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiAncnVudGltZScsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkdW1wKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLnRvUmVjb3JkKCkpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXIgPSA1MDBcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gJ0Jhc2VFeGNlcHRpb24nXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpPy5fX2NvbnRhaW5lcl9lbnRyeV9rZXkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgV2FybmluZzogVGhlIGNvbnN0cnVjdG9yICR7cGF5bG9hZD8ubmFtZSB8fCBwYXlsb2FkfSBkb2VzIG5vdCBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIuIENvbnNpZGVyIGFkZGluZyBhIHN0YXRpYyBwcm9wZXJ0eSBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgdG8gYXZvaWQgcG90ZW50aWFsIGNvbmZsaWN0cy5gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgKHBheWxvYWQgYXMgYW55KT8uX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBrZXkgPSAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleVxuXG4gICAgfVxuXG4gICAgcHVibGljIHNldChwYXlsb2FkOiBFbnRyeUtleSwgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocGF5bG9hZDogRW50cnlLZXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmhhcyhrZXkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihwYXlsb2FkOiBFbnRyeUtleSk6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRW50cnkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZCBpbiBjb250YWluZXIuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KHBheWxvYWQ6IEVudHJ5S2V5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgfVxuXG4gICAgcHVibGljIHNpbmdsZXRvbjxUPihjbGFzc0NvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPik6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSBjbGFzc0NvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgY2xhc3NDb25zdHJ1Y3RvcigpXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBuZXdJbnN0YW5jZSlcbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZW50cmllczogUmVjb3JkPGFueSwgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhlbnRyaWVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5PFQgPSB1bmtub3duPihrZXk6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbnRyeVtwcm9wXVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChlbnRyeSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlbcHJvcF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGVudHJ5W3Byb3BdID0gdmFsdWVcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pIGFzIFRcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5cygpOiBFbnRyeUtleVtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmtleXMoKSlcbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/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/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFuc2xhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVHJhbnNsYXRvclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBsb2NhbGU6IHN0cmluZ1xuICAgIHB1YmxpYyBsb2NhbGVMb2FkZXJzOiBNYXA8c3RyaW5nLCAoKSA9PiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PlxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBjYWNoZTogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8VHJhbnNsYXRvclNlcnZpY2U+ID0ge30pIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gZGF0YS5lbnRyaWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBkYXRhLmxvY2FsZSB8fCAnZW4nXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMuY2FjaGUgPSBkYXRhLmNhY2hlIHx8IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvY2FsZUxvYWRlcnMgPSBuZXcgTWFwPHN0cmluZywgKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj4oKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHsgbG9jYWxlOiB0aGlzLmxvY2FsZSB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGVzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5sb2NhbGVMb2FkZXJzLmtleXMoKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cblxuICAgIHB1YmxpYyBhc3luYyBnZXRFbnRyaWVzKGxvY2FsZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZS5nZXQobG9jYWxlKSFcblxuICAgICAgICBpZiAoY2FjaGUgJiYgdGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWQgbG9jYWxlIFwiJHtsb2NhbGV9XCIgZnJvbSBjYWNoZWAsIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBPYmplY3Qua2V5cyhjYWNoZSkubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvYWRlciA9IHRoaXMubG9jYWxlTG9hZGVycy5nZXQobG9jYWxlKVxuXG4gICAgICAgIGlmICghbG9hZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBubyBsb2FkZXIgZm91bmQgZm9yIGxvY2FsZSBcIiR7bG9jYWxlfVwiYClcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGxvYWRlcigpXG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQobG9jYWxlLCBlbnRyaWVzKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgbG9hZCBsb2NhbGUgJHtsb2NhbGV9YCwge1xuICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBrZXlzOiBPYmplY3Qua2V5cyhlbnRyaWVzKS5sZW5ndGhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cmllc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKGxvY2FsZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldEVudHJpZXMobG9jYWxlKVxuXG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKVxuXG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXG4gICAgfVxuXG4gICAgcHVibGljIHQoa2V5OiBzdHJpbmcsIGFyZ3M6IGFueSA9IHt9KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXMuaGFzKGtleSkgJiYgdGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYG1pc3NpbmcgdHJhbnNsYXRpb24gZm9yIGtleSBcIiR7a2V5fVwiYCwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSkgfHwga2V5XG5cbiAgICAgICAgbGV0IHRyYW5zbGF0aW9uID0gZW50cnlcblxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGFyZ3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5mb3JFYWNoKChbYUtleSwgYVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbi5yZXBsYWNlKGA6JHthS2V5fWAsIFN0cmluZyhhVmFsdWUpKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB0cmFuc2xhdGlvblxuICAgIH1cblxuICAgIHB1YmxpYyBkYXRlKGRhdGE6IHN0cmluZyB8IG51bWJlciB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgZGF5OiAnMi1kaWdpdCdcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZGF0ZXRpbWUoZGF0YTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0YSlcblxuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVXBsb2FkU2VydmljZSdcblxuICAgIHB1YmxpYyBzaW5nbGUobmFtZTogc3RyaW5nKXtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBtdWx0aXBsZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IG5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cbiIsImltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJ1xuaW1wb3J0IHsgZ2V0LCBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgcXMgZnJvbSAncXMnXG5cbmV4cG9ydCBjb25zdCBudW1iZXIgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5udW1iZXIoKV0pLFxuICAgIHYudHJhbnNmb3JtKE51bWJlciksXG4gICAgdi5pbnRlZ2VyKCksXG4pXG5cbmV4cG9ydCBjb25zdCBib29sZWFuID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuYm9vbGVhbigpXSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB2ID09PSB0cnVlIHx8IHYgPT09ICd0cnVlJyksXG4pXG5cbmV4cG9ydCBjb25zdCBkYXRlID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuZGF0ZSgpXSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB2IGluc3RhbmNlb2YgRGF0ZSA/IHYgOiBuZXcgRGF0ZSh2KSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB2ID8gZm9ybWF0KHYsICd5eXl5LU1NLWRkJykgOiB2KSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGV0aW1lID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYuZGF0ZSgpXSksXG4gICAgdi50cmFuc2Zvcm0odiA9PiB7XG4gICAgICAgIGlmICghdikgcmV0dXJuIHZcblxuICAgICAgICBpZiAodiA9PT0gJ251bGwnKSByZXR1cm4gbnVsbFxuXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHYgPSBuZXcgRGF0ZSh2KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdCh2LCAneXl5eS1NTS1kZCBISDptbScpXG4gICAgfSksXG4pXG5cbmV4cG9ydCBjb25zdCBhcnJheSA9IDxUIGV4dGVuZHMgdi5CYXNlU2NoZW1hPGFueSwgYW55LCBhbnk+PihzY2hlbWE6IFQgPSB2LmFueSgpIGFzIGFueSBhcyBUKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5hcnJheSh2LnN0cmluZygpKV0pLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiB2YWx1ZS5zcGxpdCgnLCcpKSxcbiAgICB2LmFycmF5KHNjaGVtYSksXG4pXG5cbmV4cG9ydCBjb25zdCBhcnJheU51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICBhcnJheSgpLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHZhbHVlLm1hcChOdW1iZXIpKSxcbilcblxuZXhwb3J0IGNvbnN0IG9iamVjdCA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LnJlY29yZCh2LnN0cmluZygpLCB2LmFueSgpKV0pLFxuICAgIHYudHJhbnNmb3JtKHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBxcy5wYXJzZSh2YWx1ZSkgOiB2YWx1ZSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBzZXQocmVzdWx0LCBrZXksIGdldCh2YWx1ZSwga2V5KSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9KSxcbilcblxuZXhwb3J0IGZ1bmN0aW9uIHVybCgpIHtcbiAgICByZXR1cm4gb2JqZWN0KClcbn1cblxudXJsLm51bWJlciA9IG51bWJlclxudXJsLmJvb2xlYW4gPSBib29sZWFuIFxudXJsLmRhdGUgPSBkYXRlIFxudXJsLmRhdGV0aW1lID0gZGF0ZXRpbWVcbnVybC5hcnJheSA9IGFycmF5XG51cmwuYXJyYXlOdW1iZXIgPSBhcnJheU51bWJlclxudXJsLm9iamVjdCA9IG9iamVjdFxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90JyBcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IGNvbnN0IGtleVZhbHVlID0gKCkgPT4gdi5waXBlKHYuc3RyaW5nKCksIHYudHJhbnNmb3JtKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGVudHJpZXMgPSB2YWx1ZS5zcGxpdCgvWztcXG5dLylcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuZmlsdGVyKGwgPT4gbC5pbmNsdWRlcygnPScpKVxuICAgICAgICAubWFwKGwgPT4gbC50cmltKCkuc3BsaXQoJz0nKSlcblxuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBsZXQgcGFyc2VkVmFsdWU6IGFueSA9IHZhbHVlXG5cbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ2Jvb2w6JykpIHtcbiAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gdmFsdWUucmVwbGFjZSgnYm9vbDonLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHNldChyZXN1bHQsIGtleSwgcGFyc2VkVmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufSkpXG4iLCJpbXBvcnQgeyBudW1iZXIsIGFycmF5IH0gZnJvbSAnLi91cmxWYWxpZGF0b3IudHMnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvblBhcmFtcyB7XG4gICAgbWF4TGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckZpZWxkcz86IHN0cmluZ1tdXG59XG5cblxuZXhwb3J0IGNvbnN0IGJhc2UgPSAob3B0aW9uczogUGFnaW5hdGlvblBhcmFtcyA9IHt9KSA9PiB2Lm9iamVjdCh7XG4gICAgcGFnZTogdi5vcHRpb25hbChudW1iZXIoKSwgMSksXG4gICAgbGltaXQ6IHYub3B0aW9uYWwobnVtYmVyKCksIG9wdGlvbnMubWF4TGltaXQgfHwgMTAwKSxcbiAgICBvcmRlckJ5OiB2Lm51bGxpc2gob3B0aW9ucy5vcmRlckZpZWxkcyA/IGFycmF5KHYucGlja2xpc3Qob3B0aW9ucy5vcmRlckZpZWxkcykpIDogYXJyYXkodi5zdHJpbmcoKSksIFtdKSxcbiAgICBvcmRlckRpcmVjdGlvbjogdi5udWxsaXNoKGFycmF5KHYudW5pb24oW3YubGl0ZXJhbCgnYXNjJyksIHYubGl0ZXJhbCgnZGVzYycpXSkpLCBbXSksXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gcGFnaW5hdGlvbihvcHRpb25zOiBQYWdpbmF0aW9uUGFyYW1zID0ge30pIHtcbiAgICByZXR1cm4gYmFzZShvcHRpb25zKVxufVxuXG5wYWdpbmF0aW9uLmJhc2UgPSBiYXNlXG4iLCJleHBvcnQgKiBmcm9tICcuL3VybFZhbGlkYXRvci50cydcbmV4cG9ydCAqIGZyb20gJy4va2V5VmFsdWVWYWxpZGF0b3IudHMnXG5leHBvcnQgKiBmcm9tICcuL3BhZ2luYXRpb25WYWxpZGF0b3IudHMnXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgKiBhcyBleHRyYXMgZnJvbSAnI3NoYXJlZC92YWxpZGF0b3JzL2luZGV4LnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5leHBvcnQgdHlwZSBWYWxpYm90ID0gdHlwZW9mIHYgJiB7IGV4dHJhczogdHlwZW9mIGV4dHJhcyB9XG5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWEgPSB2LkJhc2VTY2hlbWE8dW5rbm93biwgdW5rbm93biwgdi5CYXNlSXNzdWU8dW5rbm93bj4+XG5leHBvcnQgdHlwZSBWYWxpYm90T2JqZWN0U2NoZW1hID0gdi5PYmplY3RTY2hlbWE8YW55LCBhbnk+XG5leHBvcnQgdHlwZSBWYWxpYm90U2NoZW1hQXN5bmMgPSB2LkJhc2VTY2hlbWFBc3luYzx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3JDYWxsYmFjazxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yQ2FsbGJhY2tBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPiA9IHtcbiAgICAoX3Y6IFZhbGlib3QpOiBUXG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRvclJlc3VsdDxUIGV4dGVuZHMgdi5CYXNlU2NoZW1hPGFueSwgYW55LCBhbnk+PiA9IHYuSW5mZXJPdXRwdXQ8VD5cblxuZXhwb3J0IHR5cGUgVmFsaWRhdGVQYXlsb2FkPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hID0gVmFsaWJvdFNjaGVtYT4gPSBWYWxpZGF0b3JDYWxsYmFjazxUPiB8IFRcblxuZXhwb3J0IHR5cGUgVmFsaWRhdGVSZXN1bHQ8VCBleHRlbmRzIFZhbGlkYXRlUGF5bG9hZD4gPVxuICAgIFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hID8gdi5JbmZlck91dHB1dDxUPiA6XG4gICAgVCBleHRlbmRzIFZhbGlkYXRvckNhbGxiYWNrPGluZmVyIFU+ID8gdi5JbmZlck91dHB1dDxVPiA6XG4gICAgdW5rbm93blxuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhbGlkYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1ZhbGlkYXRvclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgdjogVmFsaWJvdCA9IHtcbiAgICAgICAgLi4udixcbiAgICAgICAgZXh0cmFzLFxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGU8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KGNiOiBWYWxpZGF0b3JDYWxsYmFjazxUPikge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52KVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdGVQYXlsb2FkPFQ+KSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYTogVCA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgb3V0cHV0LCBpc3N1ZXMsIHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW4gPSB2LmZsYXR0ZW4oaXNzdWVzKVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBbXSBhcyBzdHJpbmdbXVxuXG4gICAgICAgICAgICBpZiAoZmxhdHRlbi5yb290KSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaCguLi5mbGF0dGVuLnJvb3QpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLm5lc3RlZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZsYXR0ZW4ubmVzdGVkKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeSBhcyBbc3RyaW5nLCBzdHJpbmdbXV1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLnZhbHVlLm1hcCgodikgPT4gYCR7a2V5fTogJHt2fWApKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlcy5sZW5ndGggPyBtZXNzYWdlcy5qb2luKCcsICcpIDogJ1ZhbGlkYXRpb24gZmFpbGVkJ1xuXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBCYXNlRXhjZXB0aW9uKG1lc3NhZ2UsIDQyMilcblxuICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdWYWxpZGF0aW9uRXJyb3InXG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgbWVzc2FnZXMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXN5bmM8VCBleHRlbmRzIFZhbGlib3RTY2hlbWFBc3luYz4ocGF5bG9hZDogYW55LCBjYjogVmFsaWRhdG9yQ2FsbGJhY2tBc3luYzxUPiB8IFQpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gYXdhaXQgdi5zYWZlUGFyc2VBc3luYyhzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignVmFsaWRhdGlvbiBmYWlsZWQnKVxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ucm9vdCxcbiAgICAgICAgICAgICAgICAuLi5mbGF0dGVuLm5lc3RlZCxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBkZXRhaWxzLCB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHB1YmxpYyBpc1ZhbGlkPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBzdWNjZXNzIH0gPSB2LnNhZmVQYXJzZShzY2hlbWEsIHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NcbiAgICB9XG59XG5cbiIsImV4cG9ydCBmdW5jdGlvbiBtYXRjaFBhdGgocGF0dGVybjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBTcGxpdCBwYXRocyBpbnRvIHNlZ21lbnRzXG4gICAgY29uc3QgcGF0dGVyblNlZ21lbnRzID0gcGF0dGVybi5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IHBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcblxuICAgIC8vIENoZWNrIGVhY2ggc2VnbWVudFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlU2VnbWVudCA9IHBhdHRlcm5TZWdtZW50c1tpXVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHBhdGhTZWdtZW50c1tpXVxuXG4gICAgICAgIC8vIElmIHJvdXRlIHNlZ21lbnQgaXMgYSB3aWxkY2FyZCAoKiksIGl0IG1hdGNoZXMgZXZlcnl0aGluZyBmcm9tIHRoaXMgcG9pbnRcbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCA9PT0gJyonKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UndmUgcnVuIG91dCBvZiByZXF1ZXN0IHNlZ21lbnRzIGJ1dCBzdGlsbCBoYXZlIHJvdXRlIHNlZ21lbnRzLCBubyBtYXRjaFxuICAgICAgICBpZiAoaSA+PSBwYXRoU2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHJvdXRlIHNlZ21lbnQgaXMgYSBwYXJhbWV0ZXIgKHN0YXJ0cyB3aXRoIDopLCBpdCBtYXRjaGVzIGFueSB2YWx1ZVxuICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2VnbWVudHMgbXVzdCBtYXRjaCBleGFjdGx5XG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgIT09IHJlcXVlc3RTZWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbW9yZSByZXF1ZXN0IHNlZ21lbnRzIHRoYW4gcm91dGUgc2VnbWVudHMgKGFuZCBubyB3aWxkY2FyZCksIG5vIG1hdGNoXG4gICAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggPiBwYXR0ZXJuU2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQgcXMgZnJvbSAncXMnIFxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmxQYXJhbXMocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50cyA9IHJlcXVlc3RQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IHJlcXVlc3RTZWdtZW50XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgIC8vIENhcHR1cmUgYWxsIHJlbWFpbmluZyBzZWdtZW50cyBhcyBhIHNpbmdsZSBwYXRoXG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdTZWdtZW50cyA9IHJlcXVlc3RTZWdtZW50cy5zbGljZShpKVxuICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVybFF1ZXJ5KHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSByZXF1ZXN0UGF0aC5zcGxpdCgnPycpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBxdWVyeVxuICAgIH1cblxuICAgIHJldHVybiBxcy5wYXJzZShxdWVyeVN0cmluZylcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBzYWZlSnNvblBhcnNlPFQ+KGpzb25TdHJpbmc6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyaW5nKSBhcyBUO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBKU09OOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FmZUpzb25TdHJpbmdpZnk8VD4odmFsdWU6IFQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdHJpbmdpZnkgSlNPTjonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JTZXJ2aWNlIGZyb20gXCIuLi9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlXCJcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JTZXJ2aWNlKClcblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdG9yXG4iLCJpbXBvcnQgdHlwZSB7IFZhbGlkYXRvclJlc3VsdCB9IGZyb20gJyNzaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cydcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnI3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cydcblxuXG5leHBvcnQgdHlwZSBEYXNoYm9hcmRNZXRhU2NoZW1hID0gVmFsaWRhdG9yUmVzdWx0PFJldHVyblR5cGU8dHlwZW9mIGRhc2hib2FyZE1ldGFTY2hlbWE+PlxuXG5leHBvcnQgZnVuY3Rpb24gZGFzaGJvYXJkTWV0YVNjaGVtYSgpIHtcbiAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIGRhc2hib2FyZF9pZDogdi5udW1iZXIoKSxcbiAgICAgICAgbmFtZTogdi5zdHJpbmcoKSxcbiAgICAgICAgdmFsdWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgfSkpXG59XG5cbmRhc2hib2FyZE1ldGFTY2hlbWEuY3JlYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGljayhkYXNoYm9hcmRNZXRhU2NoZW1hKCksIFsnZGFzaGJvYXJkX2lkJywgJ25hbWUnLCAndmFsdWUnXSkpXG5cbmRhc2hib2FyZE1ldGFTY2hlbWEudXBkYXRlID0gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYucGFydGlhbChkYXNoYm9hcmRNZXRhU2NoZW1hLmNyZWF0ZSkpXG4iLCJpbXBvcnQgdHlwZSB7IFZhbGlkYXRvclJlc3VsdCB9IGZyb20gJyNzaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cydcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnI3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cydcblxuZXhwb3J0IHR5cGUgRGFzaGJvYXJkU2NoZW1hID0gVmFsaWRhdG9yUmVzdWx0PFJldHVyblR5cGU8dHlwZW9mIGRhc2hib2FyZFNjaGVtYT4+XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoYm9hcmRTY2hlbWEoKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGUodiA9PiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBuYW1lOiB2LnN0cmluZygpLFxuICAgICAgICBkZXNjcmlwdGlvbjogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICAgICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICAgICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICAgICAgZGVsZXRlZF9hdDogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcblxuICAgICAgICBtZXRhczogdi5vcHRpb25hbCh2LnJlY29yZCh2LnN0cmluZygpLCB2LmFueSgpKSksXG4gICAgfSkpXG59XG5cbmRhc2hib2FyZFNjaGVtYS5jcmVhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5waWNrKGRhc2hib2FyZFNjaGVtYSgpLCBbJ25hbWUnLCAnZGVzY3JpcHRpb24nXSkpXG5cbmRhc2hib2FyZFNjaGVtYS51cGRhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5wYXJ0aWFsKGRhc2hib2FyZFNjaGVtYS5jcmVhdGUpKVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uQXNzaWdubWVudCA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHBlcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgcGVybWlzc2lvbl9pZDogdi5udW1iZXIoKSxcbiAgICBhc3NpZ25hYmxlX3R5cGU6IHYuc3RyaW5nKCksXG4gICAgYXNzaWduYWJsZV9pZDogdi5zdHJpbmcoKSxcbiAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIHVwZGF0ZWRfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBQZXJtaXNzaW9uID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHBlcm1pc3Npb25TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBkZXNjcmlwdGlvbjogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICBhY3Rpb246IHYuc3RyaW5nKCksXG4gICAgc3ViamVjdDogdi5zdHJpbmcoKSxcbiAgICBjb25kaXRpb25zOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IHR5cGUgVG9rZW4gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiB0b2tlblNjaGVtYT5cblxuZXhwb3J0IGNvbnN0IHRva2VuU2NoZW1hID0gdi5vYmplY3Qoe1xuICAgIGlkOiB2Lm51bWJlcigpLFxuICAgIG5hbWU6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgdHlwZTogdi5zdHJpbmcoKSxcbiAgICB1c2VyX2lkOiB2Lm51bWJlcigpLFxuICAgIHRva2VuOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICBleHBpcmVzX2F0OiB2LnN0cmluZygpLFxufSlcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZnVuY3Rpb24gdXNlclNjaGVtYSgpIHtcbiAgICByZXR1cm4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgbmFtZTogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICAgICAgZW1haWw6IHYucGlwZSh2LnN0cmluZygpLCB2LmVtYWlsKCkpLFxuICAgICAgICBwYXNzd29yZDogdi5waXBlKHYuc3RyaW5nKCksIHYubWluTGVuZ3RoKDYpKSxcbiAgICAgICAgdXNlcm5hbWU6IHYucGlwZSh2LnN0cmluZygpLCB2LnJlZ2V4KC9eW2EtekEtWjAtOV8tXSskLykpLFxuICAgICAgICB2ZXJpZmllZF9hdDogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICAgICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICAgICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICAgICAgZGVsZXRlZF9hdDogdi5udWxsYWJsZSh2LnN0cmluZygpKVxuICAgIH0pXG59XG5cbnVzZXJTY2hlbWEuY3JlYXRlID0gKCkgPT4gdi5vbWl0KHVzZXJTY2hlbWEoKSwgWydpZCcsICd2ZXJpZmllZF9hdCcsICdjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnLCAnZGVsZXRlZF9hdCddKVxudXNlclNjaGVtYS51cGRhdGUgPSAoKSA9PiB2LnBhcnRpYWwodXNlclNjaGVtYS5jcmVhdGUoKSlcblxuZXhwb3J0IGRlZmF1bHQgdXNlclNjaGVtYVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnLi9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGVsbEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICAgIHB1YmxpYyBvdXRwdXQ6IHN0cmluZ1xuICAgIHB1YmxpYyBiaW46IHN0cmluZyBcbiAgICBwdWJsaWMgYXJnczogc3RyaW5nW11cblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgb3V0cHV0OiBzdHJpbmcsIGJpbjogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCA1MDEpXG5cbiAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXRcbiAgICAgICAgdGhpcy5iaW4gPSBiaW4gXG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3MgXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuaW50ZXJmYWNlIENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zIHtcbiAgICBwYXJzZT86IChkYXRhOiBhbnkpID0+IGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFzZUVudGl0eShvcHRpb25zOiBDcmVhdGVCYXNlRW50aXR5T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZyb208VD4odGhpczogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IC4uLmRhdGEgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG9wdGlvbnMucGFyc2UoZGF0YSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBCYXNlRW50aXR5PFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBCYXNlKSBhcyBhbnlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgY29udHJ1Y3RvcigpIGFzIGFueVxuXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udHJ1Y3Rvcj8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKGNvbnRydWN0b3IgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzIGFzIGFueSk/LnBhcnNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9ICh0aGlzIGFzIGFueSkucGFyc2UoZGF0YSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG1lcmdlKGRhdGE6IFBhcnRpYWw8dGhpcz4pOiB0aGlzIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RlbmVyIHtcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW1pdEhvb2soY29uc3RydWN0b3I6IGFueSwgZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHsgICAgICAgICAgICAgICAgXG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGwgb2YgbGlzdGVuZXJzLmZpbHRlcigobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCkpIHtcbiAgICAgICAgYXdhaXQgbC5saXN0ZW5lciguLi5hcmdzKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uSG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gY29uc3RydWN0b3IubGlzdGVuZXJzIHx8IFtdXG5cbiAgICBjb25zdCBleGlzdHMgPSBsaXN0ZW5lcnMuZmluZCgobDogYW55KSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyIFxuICAgIH0pXG5cbiAgICBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgPSBsaXN0ZW5lcnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEhvb2tzU3RhdGljPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnkpLmJvb3QuYXBwbHkodGhpcy5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgbGlzdGVuZXJzID0gW10gYXMgQXJyYXk8KC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPlxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uSG9vayh0aGlzLCBldmVudCwgbGlzdGVuZXIpXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0SG9vayh0aGlzLCBldmVudCwgLi4uYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gSG9va3M8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIGxpc3RlbmVyczogTGlzdGVuZXJbXVxuXG4gICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goeyBcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lciBcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5saXN0ZW5lcnMuZmluZEluZGV4KChsKSA9PiBsLmV2ZW50ID09PSBldmVudCAmJiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcilcblxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50KVxuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHB1YmxpYyBhc3luYyBlbWl0QXN5bmMoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkhvb2tzU3RhdGljLmVtaXQgPSBlbWl0SG9va1xuSG9va3NTdGF0aWMub24gPSBvbkhvb2tcbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNvZnREZWxldGVNaXhpbjxUIGV4dGVuZHMgQ29uc3RydWN0b3I+KGJhc2U6IFQpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGRlbGV0ZWRfYXQ6IERhdGUgfCBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFRpbWVzdGFtcE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgY3JlYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgICAgICBwdWJsaWMgdXBkYXRlZF9hdDogRGF0ZSB8IHN0cmluZ1xuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG9yaWdpbjogc3RyaW5nXG4gICAgcHVibGljIHN1YmplY3Q6IHN0cmluZ1xuICAgIHB1YmxpYyBhY3Rpb246IHN0cmluZ1xuICAgIHB1YmxpYyBjb25kaXRpb25zOiBzdHJpbmcgfCBudWxsIHwgUmVjb3JkPHN0cmluZywgYW55PiA9IG51bGxcblxuICAgIHB1YmxpYyBnZXQgZWRpdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiA9PT0gJ2N1c3RvbSdcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcnNlZENvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwganNvbl0gPSB0cnlDYXRjaC5zeW5jKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25kaXRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuY29uZGl0aW9ucyBhcyBzdHJpbmcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmRpdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBlcnJvciA/IHt9IDoganNvblxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZUFiaWxpdHksIHN1YmplY3QgYXMgY3JlYXRlU3ViamVjdCB9IGZyb20gJ0BjYXNsL2FiaWxpdHknXG5pbXBvcnQgUGVybWlzc2lvbiBmcm9tICcuL1Blcm1pc3Npb25FbnRpdHkudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQWNsRW50aXR5J1xuXG4gICAgcHVibGljIGFiaWxpdHk6IFJldHVyblR5cGU8dHlwZW9mIGRlZmluZUFiaWxpdHk+XG4gICAgcHVibGljIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW11cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8QWNsRW50aXR5PiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gZGF0YS5wZXJtaXNzaW9ucyB8fCBbXVxuICAgICAgICBjb25zdCBwZXJtcyA9IHBlcm1pc3Npb25zLm1hcCgocGVybWlzc2lvbikgPT4gUGVybWlzc2lvbi5mcm9tKHBlcm1pc3Npb24pKVxuXG4gICAgICAgIFxuICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybXNcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLmFiaWxpdHkgPSBkZWZpbmVBYmlsaXR5KChjYW4pID0+IHtcbiAgICAgICAgICAgIHBlcm1zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBjYW4ocGVybWlzc2lvbi5hY3Rpb24sIHBlcm1pc3Npb24uc3ViamVjdCwgcGVybWlzc2lvbi5wYXJzZWRDb25kaXRpb25zKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnLCB7XG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbnM6IHRoaXMucGVybWlzc2lvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbihhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2FuKGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2Fubm90KGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFiaWxpdHkuY2Fubm90KGFjdGlvbiwgc3ViamVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YmplY3RXaXRoT2JqZWN0ID0gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0V2l0aE9iamVjdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3ViamVjdChzdWJqZWN0OiBzdHJpbmcsIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdChzdWJqZWN0LCBvYmplY3QpXG4gICAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDb29raWVNYXBFbnRpdHlPcHRpb25zIHtcbiAgICBjb29raWVzPzogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHByZWZpeD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0Nvb2tpZU1hcEVudGl0eSdcblxuICAgIHB1YmxpYyBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIHByZWZpeDogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogQ29va2llTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvb2tpZXMgPSBkYXRhPy5jb29raWVzIHx8IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgICAgICAgdGhpcy5wcmVmaXggPSBkYXRhPy5wcmVmaXggfHwgJydcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZChjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgTWFwPHN0cmluZywgc3RyaW5nPikge1xuICAgICAgICBpZiAoY29va2llcyBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgY29va2llcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvb2tpZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGNvb2tpZXNba2V5XSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5wcmVmaXggKyBuYW1lXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQoZnVsbE5hbWUpIHx8IGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSB3YW50IHRvIGFsbG93IGFueSBvcHRpb25zIHRvIGJlIHBhc3NlZCBoZXJlLCBhcyB0aGV5IG1heSBiZSB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGNvb2tpZVxuICAgIC8vICBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICB0aGlzLmNvb2tpZXMuc2V0KGZ1bGxOYW1lLCB2YWx1ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMucHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRLZXkgPSBrZXkuc2xpY2UodGhpcy5wcmVmaXgubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0W3VucHJlZml4ZWRLZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgVFlQRVMgPSAoKSA9PiBbXG4gICAge1xuICAgICAgICBpZDogJ2ZzJyxcbiAgICAgICAgbGFiZWw6ICR0KCdGaWxlIFN5c3RlbScpLFxuICAgICAgICBkZXNjcmlwdGlvbjogJHQoJ1N0b3JlIGZpbGVzIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4nKSxcbiAgICAgICAgY29uZmlnX2ZpZWxkczoge1xuICAgICAgICAgICAgZGlyZWN0b3J5OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdEaXJlY3RvcnknKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJHQoJ1RoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSBmaWxlcyB3aWxsIGJlIHN0b3JlZC4nKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnUmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uIHJvb3Qgb3IgYWJzb2x1dGUgcGF0aCwgZS5nLiwgOjAgIG9yIDoxJywgWycvdmFyL3plbml0aC91cGxvYWRzJywgJ3N0b3JhZ2UvdXBsb2FkcyddKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogJ3MzJyxcbiAgICAgICAgbGFiZWw6ICdTMycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnU3RvcmUgZmlsZXMgb24gYW4gUzMtY29tcGF0aWJsZSBzZXJ2aWNlIGxpa2UgQVdTIFMzLCBEaWdpdGFsT2NlYW4gU3BhY2VzLCBldGMuJyksXG4gICAgICAgIGNvbmZpZ19maWVsZHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc0tleUlkOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdBY2Nlc3MgS2V5IElEJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1lvdXIgQVdTIGFjY2VzcyBrZXkgSUQuJyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ1NlY3JldCBBY2Nlc3MgS2V5JyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1lvdXIgQVdTIHNlY3JldCBhY2Nlc3Mga2V5LicpLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYnVja2V0OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdCdWNrZXQgTmFtZScpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdUaGUgbmFtZSBvZiB0aGUgUzMgYnVja2V0IHRvIHN0b3JlIGZpbGVzIGluLicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZ2lvbjoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnUmVnaW9uJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1RoZSBBV1MgcmVnaW9uIHdoZXJlIHlvdXIgYnVja2V0IGlzIGxvY2F0ZWQuJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJlZml4OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdQcmVmaXgnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnQW4gb3B0aW9uYWwgcHJlZml4IChmb2xkZXIgcGF0aCkgdG8gc3RvcmUgZmlsZXMgdW5kZXIgaW4gdGhlIGJ1Y2tldC4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnRW5kcG9pbnQgVVJMJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ09wdGlvbmFsIGN1c3RvbSBlbmRwb2ludCBVUkwgZm9yIFMzLWNvbXBhdGlibGUgc2VydmljZXMuJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgfVxuXVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVDb25maWcge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFRZUEVTKCkge1xuICAgICAgICByZXR1cm4gVFlQRVMoKVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nXG4gICAgcHVibGljIGlzX2RlZmF1bHQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBEcml2ZUNvbmZpZyl7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbmZpZ19maWVsZHMoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IERyaXZlQ29uZmlnLlRZUEVTLmZpbmQob3B0ID0+IG9wdC5pZCA9PT0gdGhpcy50eXBlKVxuXG4gICAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24uY29uZmlnX2ZpZWxkcyA6IHt9XG4gICAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlRW50cnkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nXG4gICAgcHVibGljIHR5cGU6ICdmaWxlJyB8ICdkaXJlY3RvcnknXG4gICAgcHVibGljIG1ldGFzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IERyaXZlRW50cnkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5TWl4aW4sIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGRyaXZlOiBzdHJpbmdcbiAgICBwdWJsaWMgbWltZXR5cGU6IHN0cmluZ1xuICAgIHB1YmxpYyBwdXJwb3NlOiBzdHJpbmdcbiAgICBwdWJsaWMgY2xpZW50X25hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBmaWxlbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHB1YmxpYzogYm9vbGVhblxuXG4gICAgLy8gZHluYW1pY1xuICAgIHB1YmxpYyB1cmw/OiBzdHJpbmdcbiAgICBwdWJsaWMgbWV0YXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICBwdWJsaWMgaXNJbWFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWltZXR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJylcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHlNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZU1ldGEgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZmlsZV9pZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nIHwgbnVsbFxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZFNlc3Npb24gZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1lX3R5cGVzOiBzdHJpbmdcbiAgICBwdWJsaWMgbWF4X3NpemU6IG51bWJlclxuXG4gICAgLy8gZHluYW1pYyBcbiAgICBwdWJsaWMgdXBsb2FkX3VybD86IHN0cmluZ1xuICAgIHB1YmxpYyBjcmVhdGVfZmlsZV91cmw/OiBzdHJpbmdcblxuICAgIHB1YmxpYyBnZXRQYXJzZWRNaW1lVHlwZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1lX3R5cGVzLnNwbGl0KCcsJykubWFwKHR5cGUgPT4gdHlwZS50cmltKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZE1pbWVUeXBlKG1pbWVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gdGhpcy5nZXRQYXJzZWRNaW1lVHlwZXMoKVxuICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKG1pbWVUeXBlKSB8fCBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoJyovKicpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZFNpemUoc2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzaXplIDw9IHRoaXMubWF4X3NpemVcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHaXRCcmFuY2hFbnRpdHkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcmVtb3RlOiBzdHJpbmcgfCBudWxsXG4gICAgcHVibGljIGlzX2N1cnJlbnQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgaXNfcmVtb3RlOiBib29sZWFuXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBHaXRCcmFuY2hFbnRpdHkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEdpdENvbW1pdEVudGl0eSB7XG4gICAgcHVibGljIGhhc2g6IHN0cmluZ1xuICAgIHB1YmxpYyBzaG9ydF9oYXNoOiBzdHJpbmdcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nXG4gICAgcHVibGljIGJvZHk6IHN0cmluZ1xuICAgIHB1YmxpYyBhdXRob3JfbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGF1dGhvcl9lbWFpbDogc3RyaW5nXG4gICAgcHVibGljIGRhdGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogR2l0Q29tbWl0RW50aXR5KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tIFwiI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlck1hcEVudGl0eU9wdGlvbnMge1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgc2V0SGVhZGVyPzogKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWFkZXJNYXBFbnRpdHkge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0hlYWRlck1hcEVudGl0eSdcbiAgICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgc3RyaW5nPlxuICAgIHB1YmxpYyBzZXRIZWFkZXI/OiAobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSGVhZGVyTWFwRW50aXR5T3B0aW9ucykge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gICAgICAgIHRoaXMuc2V0SGVhZGVyID0gZGF0YT8uc2V0SGVhZGVyXG5cbiAgICAgICAgaWYgKGRhdGE/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZyb21SZWNvcmQoZGF0YS5oZWFkZXJzKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQobmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNldEhlYWRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ3NldEhlYWRlciBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZCcpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KG5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMuZW50cmllcygpKVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSBNb2R1bGVNYW5pZmVzdCBmcm9tICcuL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzJ1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSwgbWl4aW4gfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmludGVyZmFjZSBNb2R1bGVVcGdyYWRlSW5mbyB7XG4gICAgc291cmNlOiAnZ2l0JyB8ICd6aXAnXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgbWl4aW4oTGlmZWN5Y2xlSG9vaykpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgcHVibGljIGJ1aWxkOiBNb2R1bGVNYW5pZmVzdFsnYnVpbGQnXSA9IHt9XG4gICAgcHVibGljIGRpcmVjdG9yeTogc3RyaW5nXG5cbiAgICBwdWJsaWMgdXBncmFkZV9pbmZvPzogTW9kdWxlVXBncmFkZUluZm9cblxuICAgIHB1YmxpYyBzZXREYXRhKGRhdGE6IFBhcnRpYWw8TW9kdWxlIHwgTW9kdWxlTWFuaWZlc3Q+KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICApXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBmaWx0ZXJlZClcblxuICAgICAgICB0aGlzLmhvb2tfaWQgPSBgbW9kdWxlOiR7dGhpcy5pZH1gXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0IHtcbiAgICBmcm9tOiBzdHJpbmdcbiAgICB0bz86IHN0cmluZ1xuICAgIHR5cGU6ICdnbG9iYWxfaW1wb3J0J1xufVxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkIHtcbiAgICBpbXBvcnRzPzogTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZU1hbmlmZXN0IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgcHVibGljIGF1dGhvcj86IHN0cmluZ1xuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIGJ1aWxkPzogTW9kdWxlTWFuaWZlc3RCdWlsZFxuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnaW5hdGlvbkVudGl0eTxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBpdGVtczogVFtdXG4gICAgcHVibGljIHRvdGFsOiBudW1iZXJcbiAgICBwdWJsaWMgcGFnZTogbnVtYmVyXG4gICAgcHVibGljIHBlcl9wYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgdG90YWxfcGFnZXM6IG51bWJlclxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxQYWdpbmF0aW9uRW50aXR5Pikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tPFQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID4ocGF5bG9hZDogUGFydGlhbDxQYWdpbmF0aW9uRW50aXR5PFQ+Pik6IFBhZ2luYXRpb25FbnRpdHk8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2luYXRpb25FbnRpdHkocGF5bG9hZCBhcyBhbnkpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgcHVibGljIGFsaWFzZXM6IHN0cmluZ1tdXG4gICAgcHVibGljIHZlcnNpb25fY2hhbm5lbDogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb25fYXZhaWxhYmxlX2NoYW5uZWxzOiBzdHJpbmdbXVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG4iLCJpbXBvcnQgdHlwZSBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCB0eXBlIFJvbGUgZnJvbSAnLi9Sb2xlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBlbWFpbDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB1c2VybmFtZTogc3RyaW5nXG4gICAgcHVibGljIHBhc3N3b3JkPzogc3RyaW5nXG4gICAgcHVibGljIHZlcmlmaWVkX2F0PzogRGF0ZSB8IHN0cmluZyB8IG51bGxcblxuICAgIHB1YmxpYyBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyByb2xlcz86IFJvbGVbXVxuXG4gICAgcHVibGljIGdldCBpbml0aWFscygpe1xuICAgICAgICBjb25zdCBbZmlyc3ROYW1lLCBzZWNvbmROYW1lXSA9IHRoaXMubmFtZS5zcGxpdCgnICcpXG5cbiAgICAgICAgaWYgKCFzZWNvbmROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGEgPSBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICBjb25zdCBiID0gc2Vjb25kTmFtZVsw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
|